在聊天栏下方分屏运行终端与 TUI 应用
28.3/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add qichuang321/dsh-web-terminal该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/9/26) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查要求 Node:^22.19.0 || >=24.0.0(dsh 本身要求 Node ≥ 22.19)本插件尚未跑静态安装检查,以上为仓库状态警告。
^22.19.0 || >=24.0.0(dsh 本身要求 Node ≥ 22.19)最后检查 2026/10/31 16:29:24
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 16 处,展示前 16 条)
- 读取本地文件lib/index.js:23
if (existsSync(pwsh)) return { - 读取本地文件lib/index.js:28
if (existsSync(windowsPowerShell)) return { - 启用终端会话(PTY)lib/index.js:56
if (options.command !== void 0 && !options.shell) return pty.spawn(options.command, options.args ?? [], { - 启用终端会话(PTY)lib/index.js:67
return pty.spawn(shell.file, [ - 启用终端会话(PTY)lib/index.js:81
return pty.spawn(shell.file, shell.args, { - 写入本地文件lib/index.js:146
mkdirSync(dir, { recursive: true }); - 写入本地文件lib/index.js:147
appendFileSync(join(dir, "dsh-web-terminal-diag.log"), `${( new Date()).toISOString()} ${line}\n`); - 发起网络请求lib/client.js:13102
fetch(WT_API.diag, { - 发起网络请求lib/client.js:13111
const response = await fetch(WT_API.views); - 发起网络请求src/client/api.ts:22
void fetch(WT_API.diag, { - 发起网络请求src/client/api.ts:34
const response = await fetch(WT_API.views) - 读取本地文件src/pty.ts:29
if (existsSync(pwsh)) return { file: pwsh, args: ['-NoLogo', '-NoExit'] } - 读取本地文件src/pty.ts:31
if (existsSync(windowsPowerShell)) return { file: windowsPowerShell, args: ['-NoLogo', '-NoExit'] } - 启用终端会话(PTY)src/pty.ts:82
return pty.spawn(options.command, options.args ?? [], { - 写入本地文件src/routes.ts:33
mkdirSync(dir, { recursive: true }) - 写入本地文件src/routes.ts:34
appendFileSync(join(dir, 'dsh-web-terminal-diag.log'), `${new Date().toISOString()} ${line}\n`)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-settings给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 聊天栏下方分屏
- 运行终端与TUI应用
README
由 DeepSeek 最新模型翻译生成dsh-web-terminal
一个终端停靠面板,并入 DSH Web GUI:可隐藏、与聊天分屏(它占据 shell 真正的底部区域,所以各列会收缩,而不是被盖住)、可集成专为终端设计的 TUI 插件。
┌─────────────────────────────┐
│ session header [终端] │ ← toggle (conversation.session.header.utilities) ├─────────────────────────────┤ │ conversation (chat) │ ← keeps its own scrollport, stays mounted ├─────────────────────────────┤ ← shell.bottom slot
│ [Shell] [Panel] × │ ← dock tab bar
│ xterm.js terminal / TUI │ ← full-emulation ConPTY
└─────────────────────────────┘
- 隐藏 / 显示:点标题栏按钮,或按 Ctrl+\。隐藏后底部区域高度收为 0;xterm 实例和 PTY 会话都保留(VS Code 风格)。
展开完整文档(README 剩余 1 节)
dsh-web-terminal
一个终端停靠面板,并入 DSH Web GUI:可隐藏、与聊天分屏(它占据 shell 真正的底部区域,所以各列会收缩,而不是被盖住)、可集成专为终端设计的 TUI 插件。
┌─────────────────────────────┐
│ session header [终端] │ ← toggle (conversation.session.header.utilities) ├─────────────────────────────┤ │ conversation (chat) │ ← keeps its own scrollport, stays mounted ├─────────────────────────────┤ ← shell.bottom slot
│ [Shell] [Panel] × │ ← dock tab bar
│ xterm.js terminal / TUI │ ← full-emulation ConPTY
└─────────────────────────────┘
- 隐藏 / 显示:点标题栏按钮,或按 Ctrl+\。隐藏后底部区域高度收为 0;xterm 实例和 PTY 会话都保留(VS Code 风格)。
- 分屏:停靠面板占据 shell.bottom,这是内置插槽,渲染高度会从三列中扣除。不注入 DOM,不用 padding 取巧。高度可拖动(120–900 px),并持久化到 localStorage(dsh.webTerminal.v1)。
- TUI 集成:任何为终端设计的 TUI 都能在 PTY 里原样运行(vim、htop、tian-shu-tui……),另外提供 registerView API,插件可以添加自己的视图。
安装
dsh plugin --profile desktop add link:D:\Deepseek Harness\dsh-web-terminal
restart the GUI, then use the header toggle or Ctrl+
bundle 补丁会插入宿主部分(lib/index.js:node-pty PTY + WebSocket 桥接 + webTerminal 注册表)和客户端部分(lib/client.js:停靠面板组件)。
架构(0.2)
| 模块 | 文件 | 说明 |
| 插件入口(宿主) | src/index.ts | 注入 webServer,在 ctx.effect 下挂路由和 webTerminal 服务,Config schema 驱动设置页 |
| 路由 + WS 终端 | src/routes.ts | 回环地址限制,WebSocketServer({noServer:true}),1MB/512KB 背压 |
| PTY 层 | src/pty.ts | 直接使用 node-pty(^1.1.0,预编译 win32-x64 ConPTY),设置 TERM/COLORTERM 环境变量,默认 powershell.exe |
| 共享协议 | src/protocol.ts | 帧类型 + WT_API 路径 + 取值范围限制 |
| TUI 注册表 | src/tui-registry.ts | webTerminal.registerView(def) 扩展点 |
| 客户端入口 | src/client/index.ts | 注册到 shell.bottom + conversation.session.header.utilities,绑定 Ctrl+\ |
| 停靠面板 UI | src/client/dock.tsx | xterm + FitAddon、标签页、拖动调整大小、TUI 通道 |
| TUI 通道 | src/client/tui-channel.ts | window CustomEvent 通道 |
| 示例适配器 | src/examples/ | 一个 dom 视图(demo:panel,验证 CustomEvent 通道) |
客户端 bundle 规则
- 浏览器产物以包名注册一个懒加载工厂:
window.__ModuleLoader__.load({ id: 'dsh-web-terminal', factory(require) { … } })。
- React、react-dom 和 react/jsx-runtime 通过 require() 从加载器的模块表获取——绝不内联第二份副本(两个 React 实例会破坏钩子和 shell 的渲染器)。@xterm/ 不在那张表里,保持打包状态。
- apply(ctx) 只注册插槽和副作用;工厂函数里不要放副作用。
通信协议(/api/dsh-web-terminal/*,仅限回环地址)
server→client: {type:'ready',view,cols,rows} | {type:'output',data}
| {type:'title',title?} | {type:'exit',code,error?}
client→server: {type:'input',data} | {type:'resize',cols,rows}
TUI 插件集成 API
宿主侧 —— 任何 DSH 插件都在自己的 ctx.effect 里注册视图:
const webTerminal = ctx.get('webTerminal')
ctx.effect(() => webTerminal?.registerView({
id: 'my-plugin:my-tui', // namespaced 'pluginId:viewId'
label: 'My TUI',
order: 10,
spawn: ({ cols, rows, env }) => ({
command: 'npx',
args: ['--yes', 'my-tui'],
shell: true, // run through the default Windows shell
env: { ...env, MY_FLAG: '1' },
}),
}), 'my-plugin: tui view')
客户端侧 —— 同一个插件的浏览器部分:
import { dispatchRegister, dispatchUnregister, onTuiEvent, TUI_EVENTS } from 'dsh-web-terminal/client'
ctx.effect(() => {
dispatchRegister({ id: 'my-plugin:my-tui', label: 'My TUI', kind: 'pty' })
return () => dispatchUnregister('my-plugin:my-tui')
}, 'my-plugin: tui client')
事件:适配器→dock 方向有 register / unregister;dock→适配器方向有 ready(重新注册,自愈)、activate({id,container} —— dom 视图在这里渲染)、deactivate、view-state({id,state:'running'|'exit'|'error',code?,error?})。
安全
- 每条路由和 WS 升级都带仅限回环地址的围栏(remoteAddress ∈ {127.0.0.1, ::1, ::ffff:127.0.0.1},Host 为 localhost,检查 sec-fetch-site 和 Origin)—— 暴露到局域网的 dsh web 部署绝不能提供这些接口。
- 客户端帧严格校验;只接受 input/resize,cols/rows 做钳制。
- socket 关闭/出错、标签页关闭、dock 卸载、插件销毁(ctx.effect 的清理函数)时都会杀掉 PTY;浏览器端不访问文件系统。
Windows 注意事项
- 在 Windows 上,node-pty 从不根据 name 选项设置 TERM —— 插件在 env 里显式设置 TERM=xterm-256color/COLORTERM=truecolor。
- kill(signal) 在 Windows 上会抛错 —— 只用不带参数的 kill();Ctrl+C 是 \u0003。
- 默认 shell:powershell.exe(装了 pwsh 就用 pwsh,最后才用 cmd.exe)。cmd.exe 可能需要 chcp 65001 才能正确输出 UTF-8 TUI。
- ConPTY 原生输出 CRLF —— 桥接层从不转换换行符(convertEol:false)。
构建
pnpm install # node-pty ^1.1.0 prebuilt win32-x64 — no compiler needed
pnpm build # tsc typecheck + tsdown → lib/index.js + lib/client.js
兼容性
- 目标:DSH 0.2.x(shell.bottom 插槽时代)。0.1 系列用 DOM 注入把 dock 挂进对话栏,那条路已经没了。
- 已在 0.2.1-rc.3 上验证(Windows,ConPTY)。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
qichuang321/dsh-web-terminal
在聊天栏下方分屏运行终端与 TUI 应用
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,288已汉化MCP
71.7
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9
原生编程智能体paean-ai/deeptide
由 DeepSeek 打造,为 DeepSeek 而生。
★ 1,107已汉化DSH
67.7
多引擎接力台emo-xiaoyu/harness-mix
macOS/Linux 已加入源码构建与启动适配;目标系统的完整桌面验收仍需在对应机器执行。安装方式、Linux…
★ 419已汉化DSH
66.8
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。