From 2e54f2c34373644b44134b120549c85423b31bd8 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Fri, 12 Jun 2026 00:18:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(terminal):=20=E5=AE=9E=E6=97=B6=E7=BB=88?= =?UTF-8?q?=E7=AB=AF=E6=94=B9=E9=80=A0=E4=B8=BA=E4=BE=A7=E8=BE=B9=E6=A0=8F?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=EF=BC=8C=E6=94=AF=E6=8C=81=E6=8B=96=E6=8B=BD?= =?UTF-8?q?=E5=88=86=E5=89=B2=E4=B8=8E=E8=87=AA=E5=8A=A8=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将实时终端从独立页面改造为 Vue3 侧边栏面板,与 Git 面板上下排列 - 使用 xterm.js + Grid 布局,支持三主题配色适配 - 上下拖拽分割条,动态调整终端/Git 面板比例 - 输入栏上方新增终端数量按钮,点击快捷打开 - 个人空间新增「自动打开终端面板」开关(外观与显示分类) - REST API /api/terminals 获取终端列表,多时机自动刷新 - 有终端自动打开面板,无终端自动关闭 --- package-lock.json | 24 +- package.json | 5 +- static/src/App.vue | 50 +- static/src/app/components.ts | 2 + static/src/app/computed.ts | 16 + static/src/app/lifecycle.ts | 3 + static/src/app/methods/conversation.ts | 1 + static/src/app/methods/taskPolling.ts | 1 + static/src/app/methods/ui.ts | 111 +++- static/src/app/state.ts | 10 + static/src/components/input/InputComposer.vue | 30 + .../src/components/panels/TerminalPanel.vue | 581 ++++++++++++++++++ .../personalization/PersonalizationDrawer.vue | 22 + static/src/composables/useLegacySocket.ts | 116 ++++ static/src/stores/personalization.ts | 3 + static/src/stores/ui.ts | 5 + .../components/panels/_right-panel.scss | 75 ++- 17 files changed, 1022 insertions(+), 33 deletions(-) create mode 100644 static/src/components/panels/TerminalPanel.vue diff --git a/package-lock.json b/package-lock.json index fdeb960..447f4ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,8 @@ "@tiptap/suggestion": "^3.23.6", "@tiptap/vue-3": "^3.23.6", "@types/html2canvas": "^0.5.35", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-web-links": "^0.12.0", "diff": "^8.0.3", "dompurify": "^3.2.7", "enquirer": "^2.4.1", @@ -33,7 +35,8 @@ "socket.io-client": "^4.7.5", "unified": "^11.0.5", "vue": "^3.4.15", - "vue-stick-to-bottom": "^1.0.0" + "vue-stick-to-bottom": "^1.0.0", + "xterm": "^5.3.0" }, "devDependencies": { "@types/node": "^20.10.5", @@ -2609,6 +2612,18 @@ "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", "license": "MIT" }, + "node_modules/@xterm/addon-fit": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", + "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", + "license": "MIT" + }, + "node_modules/@xterm/addon-web-links": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-web-links/-/addon-web-links-0.12.0.tgz", + "integrity": "sha512-4Smom3RPyVp7ZMYOYDoC/9eGJJJqYhnPLGGqJ6wOBfB8VxPViJNSKdgRYb8NpaM6YSelEKbA2SStD7lGyqaobw==", + "license": "MIT" + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -7367,6 +7382,13 @@ "node": ">=0.4.0" } }, + "node_modules/xterm": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "deprecated": "This package is now deprecated. Move to @xterm/xterm instead.", + "license": "MIT" + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index fec8e1b..71b703f 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "@tiptap/suggestion": "^3.23.6", "@tiptap/vue-3": "^3.23.6", "@types/html2canvas": "^0.5.35", + "@xterm/addon-fit": "^0.11.0", + "@xterm/addon-web-links": "^0.12.0", "diff": "^8.0.3", "dompurify": "^3.2.7", "enquirer": "^2.4.1", @@ -40,7 +42,8 @@ "socket.io-client": "^4.7.5", "unified": "^11.0.5", "vue": "^3.4.15", - "vue-stick-to-bottom": "^1.0.0" + "vue-stick-to-bottom": "^1.0.0", + "xterm": "^5.3.0" }, "devDependencies": { "@types/node": "^20.10.5", diff --git a/static/src/App.vue b/static/src/App.vue index 5734137..1a23c75 100644 --- a/static/src/App.vue +++ b/static/src/App.vue @@ -292,6 +292,7 @@ :block-upload="policyUiBlocks.block_upload" :block-tool-toggle="policyUiBlocks.block_tool_toggle" :block-realtime-terminal="policyUiBlocks.block_realtime_terminal" + :terminal-count="terminalSessions ? Object.keys(terminalSessions).length : 0" :block-focus-panel="policyUiBlocks.block_focus_panel" :block-token-panel="policyUiBlocks.block_token_panel" :block-compress-conversation="policyUiBlocks.block_compress_conversation" @@ -354,23 +355,42 @@
-