Skip to content

Commit 1d8bf38

Browse files
alephpiecePleasurecruise
authored andcommitted
feat: code tools, editor, executor (#4632)
* feat: code tools, editor, executor CodeEditor & Preview - CodeEditor: CodeMirror 6 - Switch to CodeEditor in the settings - Support edit&save with a accurate diff&lookup strategy - Use CodeEditor for editing MCP json configuration - CodePreview: Original Shiki syntax highlighting - Implemented using a custom Shiki stream tokenizer - Remov code caching as it is incompatible with the current streaming code highlighting - Add a webworker for shiki - Other preview components - Merge MermaidPopup and Mermaid to MermaidPreview, use local mermaidjs - Show mermaid syntax error message on demand - Rename PlantUML to PlantUmlPreview - Rename SyntaxHighlighterProvider to CodeStyleProvider for clarity - Both light and dark themes are preserved for convenience CodeToolbar - Top sticky toolbar provides quick tools (left) and core tools (right) - Quick tools are hidden under the `More` button to avoid clutter, while core tools are always visible - View&edit mode - Allow switching between preview and edit modes - Add a split view Code execution - Pyodide for executing Python scripts - Add a webworker for Pyodide * fix: migrate version and lint error * refactor: use constants for defining tool specs * refactor: add user-select, fix tool specs * refactor: simplify some state changing * fix: make sure editor tools registered after the editor is ready --------- Co-authored-by: 自由的世界人 <3196812536@qq.com>
1 parent da98f07 commit 1d8bf38

61 files changed

Lines changed: 7554 additions & 2083 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

electron.vite.config.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,26 @@ export default defineConfig({
7373
}
7474
},
7575
optimizeDeps: {
76-
exclude: []
76+
exclude: ['pyodide']
77+
},
78+
worker: {
79+
format: 'es'
7780
},
7881
build: {
7982
rollupOptions: {
8083
input: {
8184
index: resolve(__dirname, 'src/renderer/index.html'),
8285
miniWindow: resolve(__dirname, 'src/renderer/miniWindow.html')
86+
},
87+
output: {
88+
manualChunks: (id) => {
89+
// 检测所有 worker 文件,提取 worker 名称作为 chunk 名
90+
if (id.includes('.worker') && id.endsWith('?worker')) {
91+
const workerName = id.split('/').pop()?.split('.')[0] || 'worker'
92+
return `workers/${workerName}`
93+
}
94+
return undefined
95+
}
8396
}
8497
}
8598
}

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@
7474
"@strongtz/win32-arm64-msvc": "^0.4.7",
7575
"@tanstack/react-query": "^5.27.0",
7676
"@types/react-infinite-scroll-component": "^5.0.0",
77+
"@uiw/codemirror-extensions-langs": "^4.23.12",
78+
"@uiw/codemirror-themes-all": "^4.23.12",
79+
"@uiw/react-codemirror": "^4.23.12",
7780
"archiver": "^7.0.1",
7881
"async-mutex": "^0.5.0",
7982
"color": "^5.0.0",
@@ -84,12 +87,14 @@
8487
"electron-updater": "6.6.4",
8588
"electron-window-state": "^5.0.3",
8689
"epub": "patch:epub@npm%3A1.3.0#~/.yarn/patches/epub-npm-1.3.0-8325494ffe.patch",
90+
"fast-diff": "^1.3.0",
8791
"fast-xml-parser": "^5.2.0",
8892
"fetch-socks": "^1.3.2",
8993
"fs-extra": "^11.2.0",
9094
"got-scraping": "^4.1.1",
9195
"jsdom": "^26.0.0",
9296
"markdown-it": "^14.1.0",
97+
"mermaid": "^11.6.0",
9398
"node-stream-zip": "^1.15.0",
9499
"officeparser": "^4.1.1",
95100
"os-proxy-config": "^1.1.2",
@@ -145,6 +150,7 @@
145150
"@vitejs/plugin-react-swc": "^3.9.0",
146151
"@vitest/coverage-v8": "^3.1.1",
147152
"@vitest/ui": "^3.1.1",
153+
"@vitest/web-worker": "^3.1.3",
148154
"@xyflow/react": "^12.4.4",
149155
"antd": "^5.22.5",
150156
"applescript": "^1.0.0",

src/renderer/src/App.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { PersistGate } from 'redux-persist/integration/react'
88
import Sidebar from './components/app/Sidebar'
99
import TopViewContainer from './components/TopView'
1010
import AntdProvider from './context/AntdProvider'
11+
import { CodeStyleProvider } from './context/CodeStyleProvider'
1112
import StyleSheetManager from './context/StyleSheetManager'
12-
import { SyntaxHighlighterProvider } from './context/SyntaxHighlighterProvider'
1313
import { ThemeProvider } from './context/ThemeProvider'
1414
import NavigationHandler from './handler/NavigationHandler'
1515
import AgentsPage from './pages/agents/AgentsPage'
@@ -27,7 +27,7 @@ function App(): React.ReactElement {
2727
<StyleSheetManager>
2828
<ThemeProvider>
2929
<AntdProvider>
30-
<SyntaxHighlighterProvider>
30+
<CodeStyleProvider>
3131
<PersistGate loading={null} persistor={persistor}>
3232
<TopViewContainer>
3333
<HashRouter>
@@ -46,7 +46,7 @@ function App(): React.ReactElement {
4646
</HashRouter>
4747
</TopViewContainer>
4848
</PersistGate>
49-
</SyntaxHighlighterProvider>
49+
</CodeStyleProvider>
5050
</AntdProvider>
5151
</ThemeProvider>
5252
</StyleSheetManager>

src/renderer/src/assets/styles/markdown.scss

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,9 @@
125125
overflow-x: auto;
126126
font-family: 'Fira Code', 'Courier New', Courier, monospace;
127127
background-color: var(--color-background-mute);
128-
&:has(> .mermaid) {
128+
&:has(.mermaid),
129+
&:has(.plantuml-preview),
130+
&:has(.svg-preview) {
129131
background-color: transparent;
130132
}
131133
&:not(pre pre) {
@@ -304,3 +306,26 @@ emoji-picker {
304306
mjx-container {
305307
overflow-x: auto;
306308
}
309+
310+
/* CodeMirror 相关样式 */
311+
.cm-editor {
312+
.cm-scroller {
313+
font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
314+
padding: 1px;
315+
border-radius: 5px;
316+
317+
.cm-gutters {
318+
line-height: 1.6;
319+
}
320+
321+
.cm-content {
322+
line-height: 1.6;
323+
padding-left: 0.25em;
324+
}
325+
326+
.cm-lineWrapping * {
327+
word-wrap: break-word;
328+
white-space: pre-wrap;
329+
}
330+
}
331+
}

0 commit comments

Comments
 (0)