真源:src/forge-host/boot.ts(Host 树 §1+§4 insert)与 src/forge-host/boot-graph.ts(Client 图谱 desktopDecls + CLIENT_EXCLUDE_IDS)。本文为派生视图,架构变更时同步更新。
命名规范(D-19):桌面插件统一 @lansi-ai/dsh-*(蓝思 scope + dsh 生态前缀)。
状态更新至:0.1.5-rc.2 基线(2026-09-11 C-7 人工适配 · 对齐 upstream-migrations)· M6-P6 首件「模型」section 自有化代码完成(2026-09-15,待实机点验)· 插件列表管理面(本地安装/卸载/检查更新)代码完成(2026-09-17,待实机点验)。
HTML 可视化版:docs/architecture-plugins.html(已过时,停留在 0.1.2 之前的插件树快照,勿作现状依据;以本文为准)。
图例:✅ 已装载 · ⛔ 已禁用 · 🚫 被排除(不入图谱)· 🟠 预载注册(不激活)· 🔁 已自有化(官方件被桌面件替换)
设置 → 插件 → 「插件列表」Tab(@lansi-ai/dsh-forge-plugin-inventory)从只读清单扩展出管理面:
- 本地安装:Tab 顶部「安装本地插件…」→ native 目录选择器 → host
pluginInventory.installLocal(forge-host/plugin-install.ts 的 installExternalPlugin,本地目录旁加载)→ 成功提示「重启后生效」。
- 卸载:仅用户安装的外部插件行(快照行带
external 元信息 = 补丁层发现 + profiles/node_modules 落点在盘)显示;两步确认后 host pluginInventory.uninstall 删补丁行 + 包目录 + 安装来源登记。官方/自研/预设组成行没有该字段,天然不可卸。
- 检查更新 / 更新:GitHub 来源行(安装来源登记
installed-sources.json 的 github: spec,或已装 package.json repository 回溯)对照仓库默认分支的 package.json 版本(compareVersions 轻量比较);有新版 → 「更新到 vX」= 按来源重装默认分支。本地安装行无更新来源。
- 数据面:
cordis-inventory.ts 只读快照 pluginInventory/list 之外,新增四个 unary 方法 pluginInventory.installLocal / .uninstall / .checkUpdate / .applyUpdate(与 list 同一 bridge methodTable,UI 经 window.desktopBridge.pluginInventory.* 走 desktop:invoke 通道调用,不给官方 typed remote 域加方法——那需要 client 侧 typert 描述符)。
- 生效语义:外部插件只在进程启动时发现,安装/卸载/更新都只改磁盘;UI 一律提示「重启后生效」,不做热装载。
路线(ADR-006 · D-20):逐槽位替换官方 ui-* 直至全部自有,数据面零新增;每阶段可用可验证。
自有化铁律:绝不改官方代码——要么整体排除替换(互斥槽位),要么 host 半保留复用(双装配线,见下);自有插件只在「槽位契约 + 服务面」咬官方,逐条登记 upstream-contracts.md §7。
进度总览
| 阶段 | 范围 | 状态 |
|---|
| P1 布局骨架 | root 槽位(三列布局 + titlebar 行) | ✅ 完成(= M3-c,2026-09-01 实机验证通过) |
| P2 外壳小件 | Session 导出(首件 ✅)→ brand 洞 → 会话 header 重排 | 🔄 1/3 |
| P3 侧栏自研 | 侧栏壳(✅ 实机通过)+ 会话浏览区(ui-workspace 替换,W1-W5) | 🔄 壳 ✅;W1 五接管面 + picker 承重件 ✅;W2 tree 派生层 ✅;W3 Rows 行组件 + 视图选项 ✅;W4 Browser 内容搜索 ✅(2026-09-08,派生/行/搜索纯函数单测 16 项全过,待实机点验)→ W5 实机对照点验收口 |
| P4 对话主区 | ui-conversation + ui-renderer + input/attachment/reference | ⬜ 未开始(最大单件) |
| P5 过程可视化 | tool/subagent/plan/goal/jobs/skill/workflow-run/trajectory | ⬜ 未开始 |
| P6 设置与底座 | settings 6 section + theme/locale/model-selection/permission-presets | 🔄 首件「模型」section ✅(2026-09-15,含两步 onboarding;待实机点验);插件列表 ✅(2026-09-11 实机通过);余下 section 与底座未开始 |
已自有化明细
| 官方包 | 桌面自有件 | 接管面 | host 半 | 状态 |
|---|
dsh-client-ui-layout | @lansi-ai/dsh-forge-layout | root 槽位(三列 grid + ctx.layout 服务)+ ThemePresenter 等价(坑 26) | — | ✅ 实机通过 |
| (无官方对应,宿主化骨架 D-21) | forge-appearance.ts + LAYOUT_SKELETON_CSS | --dsd-* 外观变量 + 首帧骨架(防裸窗口期) | 宿主模块 | ✅ |
| (无官方对应,M3-c4) | @lansi-ai/dsh-forge-titlebar | 布局 root 槽位 titlebar 行(拖拽区 + 窗控三钮 + 品牌区) | — | ✅ 实机通过 |
dsh-client-ui-sidebar | @lansi-ai/dsh-forge-sidebar | sidebar 槽位(fold 状态机 + 新会话 + 5 子槽位声明);ui-workspace/ui-settings 经子槽位无改动继续工作 | — | ✅ 实机通过(2026-09-01) |
dsh-session-log-export(client 半) | @lansi-ai/dsh-forge-session-export | conversation.session.header.utilities 槽位(导出胶囊 + 结果弹层,文案修正桌面语义) | 保留复用(boot.ts session-log-download 行:/export 命令 + /api/session.export ZIP 流式路由) | ✅ 实机通过(2026-09-02,M6-P2 首件) |
dsh-client-ui-settings-models | @lansi-ai/dsh-forge-settings-models | 接管面:① settings.section id=models order=10(官方信息架构 1:1:provider 目录行 + 单卡编辑器 + 添加提供方 + 自定义路由 + 删除确认 + 模型探测选择器 + 只读/冲突态);② 两个子槽位声明与 dispatch(settings.models.provider-card keyed=settingsNs / settings.models.footer list);③ 两步 settings.onboarding(welcome-notice -100 / deepseek-official 0,含 ui-onboarding 声明确认);④ 字典 NS 沿用官方 settings.models(官方 87 键逐字对齐 + 自研增补请求头/opencode 相关键)。官网缺口补齐:⑤ 编辑器加「请求头」区(官方页不暴露 profile 的 headers 字典)——写 providers.<route>.headers,并对 opencode 网关给 x-opencode-session 一键生成(官方 UI 无法配置该头 → opencode Go 恒 400 MissingSessionID,见坑 74)。数据面零新增(五 Remote 调用 + settingsScope/settingsSchema 领域服务) | —(host 半空 apply,无连坐) | 🔄 代码完成(2026-09-15):typecheck/lint 全绿 + settings-models.test.cjs 18 项 + 既有 50 项全过 + dist 图谱实测(entries=64,官方包确认排除、两个子槽位与两步引导在册);待实机点验 |
| (无官方对应,独立插件包 · 坑 74) | dsh-llm-opencode-session(已发布:github.com/lansi-ai/dsh-llm-opencode-session @ v0.1.1(tag)/ a9778a4(2026-09-16;v0.1.0 = e54cbbd root commit);工作区 E:\Projects\DSH\plugins\dsh-llm-opencode-session\,与 dsh-llm-app-credentials 同级) | opencode 逐会话头插件:apply 经 ctx.effect 包装 globalThis.fetch,只对 opencode.ai 域注入 x-opencode-session(= 人可读短标签 dsh-<中文2字><字母2>,如 dsh-青竹aB,由 sha1(model+首条用户消息) 确定性派生 → 同对话稳定、不同对话不同,且能在 opencode 控制台「会话」列认出是哪段;可配 labelStyle: ascii → dsh-Kx7Q);非 ASCII 标签经 toHeaderValue() 按 UTF-8 → latin-1 逐字节映射(undici Headers.set 只收 ByteString,见坑 76;线上字节仍是 UTF-8);已带该头即不覆盖(上游修好自动 no-op);只克隆读请求体、失败原样放行;卸载即还原。零运行时依赖、零 peer(只用 node:crypto),产物 lib/ 入库(--install-plugin 不跑构建) | 插件本体(宿主侧,随包分发;主包不再内置副本) | ✅ 已发布并本机已安装(2026-09-16,v0.1.1 覆盖 v0.1.0):--install-plugin github:lansi-ai/dsh-llm-opencode-session@v0.1.1 落 $DSH_HOME/profiles/node_modules + 装载行 id: llm-opencode-session;入口契约实测 name/inject/apply 齐备;包内测试 12 项全绿;socket 级字节复核(头值 hex = UTF-8)通过;待实机点验(发一条消息看是否还有 400,并看「会话」列显示的标签) |
dsh-client-ui-workspace(client 半) | @lansi-ai/dsh-forge-workspaces | 五项接管面(详见 upstream-contracts.md §7.1 末行):① provide uiWorkspace 服务(六方法,排除即连坐——侧栏壳/ui-conversation/native picker/agent-preset 四者硬 inject);② provideRoot(hooks.workspaces);③ locale.register('workspace') 63 键;④ 双注册 sidebar.workspaces + conversation.hero.workspace(各带 directoryFlow 子洞);⑤ 十三项动作注入面 | — (该包 host 半 lib/index.js 本就是空 apply,boot.ts 未插该行,host 侧无连坐) | 🔄 W1 + picker 承重件 ✅;W2 tree 派生层 ✅(2026-09-08):五接管面全通;选/加工作区路径已实现(原「空壳」写法曾锁死全应用,见坑 35);tree 派生纯函数(deriveGroups/deriveFlat/deriveSearchResults + indexSubagentDescendants 血缘)已内联进 bundle 并经 node:test 单测守护(8 项断言全过);行组件仍后置(W3);静态门禁 + 图谱实测 + bundle 冒烟 40 项 + pickflow 行为断言 21 项 + 字典逐字 diff 均通过,待实机点验 |
双装配线先例(session-log-export,自有化方法论第 18 条的实践):官方双面包的 client 半被排除替换时,host 半经 boot.ts 照常装载提供数据面——自有件零重复实现。
模型设置(dsh-client-ui-settings-models → @lansi-ai/dsh-forge-settings-models,2026-09-15 P6 首件):该包 host 半是空 apply(lib/index.js),boot.ts 未插该行,host 侧无连坐;数据面五调用全复用(llm/listProviders ∪ llm/listConfigurableProviders、settings 共享镜像、credentials/describe|set|unset、llm/discoverModels、settings/mutate),零新增。接管面 = settings.section(id=models, order=10)+ 两步 settings.onboarding(welcome-notice / deepseek-official)+ 两个子槽位声明(settings.models.provider-card keyed / settings.models.footer list,第三方 provider 扩展位零改动)。同时补齐外壳的 onboarding 投影(官方派发者原在被排除的 ui-settings-general 内,见坑 73)。
| 被排除包 | 原因 |
|---|
dsh-client-ui-layout | root 槽位互斥(桌面布局插件接管,D-18) |
dsh-client-ui-sidebar | sidebar 槽位互斥(M6-P3 壳接管,D-20) |
dsh-client-ui-directory-picker-browse | 与 native 形态 single slot 冲突(桌面走 Electron chooser) |
dsh-session-log-export | 导出 UI 自有化(client 半;host 半保留,见上) |
dsh-client-hmr | dev SSE /plugins/events 桌面不存在,轮询必 404(终端静音) |
dsh-client-ui-settings-general | 设置外壳自研(@lansi-ai/dsh-forge-settings-shell 接管 sidebar.settings / settings.trigger 等,双激活抛 "already has a registration")。2026-09-07 补登记:boot-graph 早已排除但本清单漏记 |
dsh-client-ui-workspace | M6-P3 工作区浏览区自研(@lansi-ai/dsh-forge-workspaces 顶替,2026-09-07 W1)。⚠ 非纯 UI 排除:该包还对外提供 uiWorkspace ctx 服务 + useWorkspaces 全局贡献 + workspace 字典,排除前必须逐项接管(见 §〇 已自有化明细与 upstream-contracts.md §2/§7.1) |
dsh-client-ui-settings-models | M6-P6 模型设置自研(@lansi-ai/dsh-forge-settings-models 顶替,2026-09-15)。纯 UI 排除:host 半为空 apply;无对外 ctx 服务;两个子槽位与 locale NS settings.models 在自有件内原样重声明(settings.models.* 全仓库零外部注册者,已核)。⚠ 其 onboarding 两步随包消失 → 必须由自有件重新注册,且外壳必须真的派发(坑 73) |
2026-09-10 起 dsh-cordis-client-runner + dsh-client-ui-cordis 不再排除(创造模式 · dogfood #23):宿主半 cordis-host-runner 已 insert(dynamicCordisRunner/cordisInspect),客户端两半同批回填装载,面板入口注册进自绘侧栏新声明的 sidebar.footer.action 槽位(list/root,对齐官方 ui-sidebar)。
自有化待办(按阶段)
- P2:
dsh-forge-brand(sidebar.brand.mark/name 洞)、会话 header 重排评估(TRAE 式会话名 + 按钮组)
- P3:
dsh-forge-workspaces(全量复刻 ui-workspace)——W1 五接管面 ✅ + picker 承重件 ✅(2026-09-08;坑 35:原「空壳」锁死全应用,已把选/加工作区提前到首批)→ W2 tree 派生层 ✅(deriveGroups/deriveFlat/deriveSearchResults + indexSubagentDescendants 血缘,内联进 bundle,export.derive 钩子 + node:test 单测 8 项,2026-09-08)→ W3 Rows 行组件 + 视图选项 ✅(组行/会话行 + 状态点优先级 琥珀>蓝>绿 + Manual 拖拽持久排序 + flat 单列表 + 分组/排序下拉,单测 8 项追加,2026-09-08)→ W4 Browser 增强 ✅(内容搜索:wide 内联搜索槽 + narrow 搜索入口展开侧栏 + Host session.search 防抖 250ms + sanitizeSearchQuery 线缆护栏 + 本地/内容命中合并派生,单测追加 sanitizeSearchQuery,全局计 16 项通过,2026-09-08;目录流收养已随 W1 通;分组折叠/视图选项已随 W3)→ W5 实机对照点验收口
- P6 设置与底座:
- ✅ 插件列表(
settings.plugins.tab,2026-09-11 实机通过)
- 🔄 模型 section 自有化(
@lansi-ai/dsh-forge-settings-models,2026-09-15 代码完成)——官方 dsh-client-ui-settings-models 整体排除;剩余对照点(待实机点验):① provider 行/密钥点/编辑删除;② 编辑器(deepseek 目录 vs pi-ai 列表、keyEnvLocked、只读/冲突态);③ 自定义路由创建 + 模型探测选择器;④ 首次引导两步(内测声明 → DeepSeek 密钥,ui-onboarding 落盘);⑤ 模型页导航图标随主题切换(settings-nav-models.svg 已存在)
- ⬜ 余下 section 与底座:
ui-settings 其余 section + ui-theme/ui-locale/ui-model-selection/ui-permission-presets
- P4-P5:见上表(启动前需逐件摸底登记)
装载链:bootDesktopHost() → 官方 boot('dsh-forge', cordis.yml, patches, prepare),所有条目无改动装载。
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-llm | LLM 服务注册与路由(ctx.llm) | ✅ |
@deepseek-ai/dsh-llm-deepseek | DeepSeek 官方模型 provider | ✅ |
@deepseek-ai/dsh-llm-pi-ai | Pi AI provider(备用通道) | ✅ |
@deepseek-ai/dsh-llm-retry | LLM 调用重试策略 | ✅ |
@deepseek-ai/dsh-agent-default-model | 默认模型绑定(deepseek-official / v4-flash) | ✅ |
@deepseek-ai/dsh-credentials-local | 凭据本地持久化(API Key 经环境注入) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-session | 会话生命周期(ctx.sessions,create/resume/prompt) | ✅ |
@deepseek-ai/dsh-session-persistence-jsonl | 会话 JSONL 持久化(RUNTIME_ROOT/user-data/sessions) | ✅ |
@deepseek-ai/dsh-session-projection | 会话投影(列表态摘要 summarizeCold) | ✅ |
@deepseek-ai/dsh-session-query-sqlite | 会话查询索引(:memory:,按需打开) | ✅ |
@deepseek-ai/dsh-session-title | 会话标题服务 | ✅ |
@deepseek-ai/dsh-session-title-first-prompt-llm | 首条 prompt 生成标题 | ✅ |
@deepseek-ai/dsh-session-checkpoint-policy | 会话检查点策略 | ✅ |
@deepseek-ai/dsh-session-telemetry-otel | 遥测上报(默认 DISABLED) | ✅ |
@deepseek-ai/dsh-attachment-local | 附件本地存储 | ✅ |
@deepseek-ai/dsh-workspace | 工作区注册表 | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-agent | Agent 核心(ctx.agents,per-session live agent) | ✅ |
@deepseek-ai/dsh-agent-loop | Agent 对话循环驱动 | ✅ |
@deepseek-ai/dsh-agent-instructions | 指令/系统提示组装(64KB 上限) | ✅ |
@deepseek-ai/dsh-system-prompt | 系统 persona(§2 覆盖为桌面版) | ✅ |
@deepseek-ai/dsh-plan-mode | 计划模式 | ✅ |
@deepseek-ai/dsh-commands | 斜杠命令注册表(commands/list) | ✅ |
@deepseek-ai/dsh-command-feedback | 命令反馈通道 | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-compaction-basic | 上下文压缩基础实现 | ✅ |
@deepseek-ai/dsh-command-compact | /compact 命令 | ✅ |
@deepseek-ai/dsh-compaction-tool-result-pruner | 工具结果裁剪(8192 阈值头尾截留) | ✅ |
@deepseek-ai/dsh-token-meter | Token 计量 | ✅ |
@deepseek-ai/dsh-spill-local | 大结果外溢本地存储 | ✅ |
@deepseek-ai/dsh-spill-policy | 外溢策略(50KB 内联上限) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-sandbox-local | 本地沙箱执行环境 | ✅ |
@deepseek-ai/dsh-sandbox-policy | 沙箱策略(默认 workspace-write) | ✅ |
@deepseek-ai/dsh-bash-sandbox | bash 沙箱(非 Windows) | ✅ |
@deepseek-ai/dsh-pwsh-sandbox | PowerShell 沙箱(Windows) | ✅ |
@deepseek-ai/dsh-subprocess-local | 子进程管理 | ✅ |
@deepseek-ai/dsh-shell-env | Shell 环境探测 | ✅ |
@deepseek-ai/dsh-jobs-local | 后台任务管理 | ✅ |
@deepseek-ai/dsh-fs-sandbox | 文件系统沙箱边界 | ✅ |
@deepseek-ai/dsh-fs-observation-policy | 文件观察策略 | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-tools | 工具注册表(ctx.tools) | ✅ |
@deepseek-ai/dsh-tool-bash | bash 工具(非 Windows) | ✅ |
@deepseek-ai/dsh-tool-pwsh | PowerShell 工具(Windows) | ✅ |
@deepseek-ai/dsh-tool-fs | 文件读写/移动/删除 | ✅ |
@deepseek-ai/dsh-tool-fs-search | 文件搜索(glob/正则) | ✅ |
@deepseek-ai/dsh-tool-str-replace-editor | 字符串替换编辑器 | ✅ |
@deepseek-ai/dsh-tool-web | 网页抓取/搜索工具 | ✅ |
@deepseek-ai/dsh-tool-todo | 待办清单工具 | ✅ |
@deepseek-ai/dsh-tool-goal | 目标管理工具 | ✅ |
@deepseek-ai/dsh-tool-jobs | 后台任务工具 | ✅ |
@deepseek-ai/dsh-tool-skill | 技能调用工具 | ✅ |
@deepseek-ai/dsh-tool-ralph | 循环驱动工具(spawn 子代理) | ✅ |
@deepseek-ai/dsh-tool-workflow | 工作流编排工具(JS 脚本 over ctx.workflowEngine) | ✅ |
@deepseek-ai/dsh-tool-subagent-control | 子代理控制 | ✅ |
@deepseek-ai/dsh-tool-subagent-list-agents | 子代理列表 | ✅ |
@deepseek-ai/dsh-tool-subagent(×2 配置实例) | 子代理 spawn/fork 双形态 | ✅ |
dsh-tool-subagent-report 已移除(0.1.2-alpha.4):send_message 取代单向 report(并入 dsh-tool-subagent 本体),独立包官方未再发布 alpha.4,roster 残留条目致 loader import 失败(M4-d4 收口)。
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-subagent | 子代理服务(ctx.subagents) | ✅ |
@deepseek-ai/dsh-subagent-spawn-in-process | 进程内 spawn provider | ✅ |
@deepseek-ai/dsh-subagent-fork-in-process | 进程内 fork provider | ✅ |
@deepseek-ai/dsh-workflow-worker-thread | 工作流 worker 线程 | ✅ |
dsh-goal + dsh-goal-round-driver + dsh-command-goal | 目标域三件套 | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-skill | 技能服务(skill.list 等) | ✅ |
@deepseek-ai/dsh-skill-filesystem | 文件系统技能源 | ✅ |
@deepseek-ai/dsh-skill-badge | 技能徽章 | ⛔ 已禁用 |
@deepseek-ai/dsh-user-questions | 用户提问(question/requested 帧) | ✅ |
@deepseek-ai/dsh-repeat-tool-reminder | 重复工具调用提醒(3/5/8 阈值) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-connection(host 半) | HostConnectionHandle:createSharedFetchHandler('/api')(unary 背板) | ✅ |
@deepseek-ai/dsh-api-gateway | typertGateway(逻辑流 wireStream.open 背板,坑 12) | ✅ |
@deepseek-ai/dsh-typert-registry | Typert 注册表 | ✅ |
@deepseek-ai/dsh-typert-loader | Typert 加载器 | ✅ |
@deepseek-ai/dsh-api-remotes | $events forwarded 事件源(0.1.2 必备) | ✅ |
dsh-api-session-controller / settings-controller / workspace-controller | 三 controller(0.1.2 必备,缺则 unary 404/流 "no active Remote method") | ✅ |
@deepseek-ai/dsh-message-feedback | 消息反馈 Remote(messageFeedback/list|put|delete) | ✅ |
@deepseek-ai/dsh-host-apiproxy 已删除(0.1.2):AbstractApiClient/apiProxy 整体不存在,RPC 通道由 connection unary + typertGateway 逻辑流两通道取代(M4-d3 迁移,详见 upstream-contracts.md §1/§2)。
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-settings-file | settings 持久化(desktop/ui-theme 等 namespace) | ✅ |
@deepseek-ai/dsh-storage | 存储服务(ctx.storage) | ✅ |
@deepseek-ai/dsh-storage-json | JSON 后端(RUNTIME_ROOT/user-data/storages) | ✅ |
@deepseek-ai/dsh-storage-domain | 存储域(ctx.storageDomain) | ✅ |
@deepseek-ai/dsh-agent-presets | Agent 预设(坑 16:必经 §4 insert 装载) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-user-approval | 审批服务(approval/requested 帧;剪贴板写经此) | ✅ |
@deepseek-ai/dsh-permission-presets | 权限预设(read-only / workspace-write / danger) | ✅ |
@deepseek-ai/dsh-tool-call-timeout-policy | 工具调用超时策略 | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-web | Web 服务聚合(searchProvider: deepseek-official) | ✅ |
@deepseek-ai/dsh-web-search-deepseek | DeepSeek 搜索 provider(DEEPSEEK_API_KEY) | ✅ |
@deepseek-ai/dsh-client-ui-settings-general(host 半) | ui-onboarding settings namespace(进入官方 UI 必需,坑 7) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-session-log-export(host 半) | /export 命令 + /api/session.export ZIP 流式路由(session-log-download 行;client 半已自有化替换) | ✅ |
@deepseek-ai/dsh-tool-subagent/model-selection-settings | 子代理模型选择设置(缺则 preset mount 报错) | ✅ |
@deepseek-ai/dsh-client-ui-theme 等 4 个双面包 host 半 | ui-theme/locale/ui-chat/ui-conversation 的 settings namespace 注册(坑 26) | ✅ |
@deepseek-ai/dsh-host-plugin-inventory | 官方插件清单(pluginInventory/list,设置页「插件列表」Tab) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/cordis-plugin-timer | 定时器服务 | ✅ |
@deepseek-ai/cordis-plugin-hmr | 热重载(桌面不需要) | ⛔ 已禁用 |
@lnyanhongyan/dsh-opencode-usage | 第三方用量统计 | ⛔ 暂移除(0.1.2 不兼容,待其升版重装) |
| webserver / web-runtime / web-startup / client-hmr | 官方 Web 传输层与 dev 热重载(禁用 = 零端口红线;client-hmr 为纯 dev 工具) | ⛔ 已禁用 |
| 服务 | 作用 | 状态 |
|---|
cmdlineArgs | provideCmdline 命令行参数服务 | ✅ 已注入 |
desktopStartup | 运行模式元信息(portless/serve + port) | ✅ 已注入 |
directoryPicker | ElectronDirectoryPicker(原生对话框替代 koffi FFI) | ✅ 已注入 |
desktop(ctx.desktop) | 桌面聚合服务(审计总线 + 配置 + 下行事件) | ✅ 已注入 |
webServer(等价面) | 内存路由注册表(compat,第三方插件 HTTP 原义) | ✅ 已注入 |
装载链:scanClientPackages() 扫描 node_modules/@deepseek-ai 下全部 dsh.client.platform==='web' → __DSH_BOOT__ 图谱({rev, entries, batches})注入 index.html → 官方 BootRunner 全量激活(CLIENT_EXCLUDE_IDS 除外)→ 各插件经官方 Slots 组合出 UI。
本节为功能域摘要(非逐包全量;0.1.2 图谱共 54 条目,全量清单经设置页「插件列表」Tab 读 pluginInventory/list 查看)。store/ui-slots 由官方 dist 内核 PLATFORM_MODULES seed,不入图。
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-modules | 客户端模块系统 bootstrap(0.1.2 PARSER_PRELOAD_IDS 仅含它) | ✅ |
@deepseek-ai/dsh-client-connection | 官方传输连接(0.1.2:读页面全局 __DSH_TRANSPORT__ 自行 provide ctx.connection,桌面 HTML boot 脚本注入 IPC 传输) | ✅ |
@deepseek-ai/dsh-client-locale | 国际化 | ✅ |
dsh-client-runtime 已删除(0.1.2):runtime 重组拆包,store 迁 dsh-client-store(由官方 dist 内核 seed)。
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-ui-layout | 官方整体布局骨架 | 🔁 已自有化(桌面布局插件接管 root 槽位,D-18) |
@deepseek-ai/dsh-client-ui-sidebar | 侧边栏壳:fold 折叠状态机 / 新会话按钮 / 5 子槽位声明 | 🔁 已自有化(M6-P3 桌面侧栏壳接管;ui-workspace/ui-settings 经子槽位无改动继续工作) |
@deepseek-ai/dsh-client-ui-workspace | 工作区切换与目录流(P3 待自有化) | ✅ |
@deepseek-ai/dsh-client-ui-brand-official | 官方品牌标识(P2 待自有化 brand 洞) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-ui-conversation | 对话主界面(消息流渲染;声明 conversation.session.header.utilities 槽位) | ✅ |
@deepseek-ai/dsh-client-ui-renderer | 消息渲染器(markdown/代码块) | ✅ |
@deepseek-ai/dsh-client-ui-input-trigger | 输入框触发器 | ✅ |
@deepseek-ai/dsh-client-ui-attachment | 附件上传 UI | ✅ |
@deepseek-ai/dsh-client-ui-reference | 文件引用 UI | ✅ |
@deepseek-ai/dsh-client-ui-tool | 工具调用展示(bash/fs/编辑器结果卡片) | ✅ |
@deepseek-ai/dsh-client-ui-user-questions | 用户提问应答 UI | ✅ |
@deepseek-ai/dsh-client-ui-deliverables | 产物文件尾注 + 可点击引用 | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-ui-subagent | 子代理过程展示 | ✅ |
@deepseek-ai/dsh-client-ui-plan | 计划模式 UI | ✅ |
@deepseek-ai/dsh-client-ui-goal | 目标管理 UI | ✅ |
@deepseek-ai/dsh-client-ui-jobs | 后台任务 UI | ✅ |
@deepseek-ai/dsh-client-ui-skill | 技能展示 | ✅ |
@deepseek-ai/dsh-client-ui-workflow-run | 工作流运行节点 UI(durable workflow-run) | ✅ |
@deepseek-ai/dsh-client-ui-trajectory | 轨迹/历史视图 | ✅ |
@deepseek-ai/dsh-client-ui-commands | 斜杠命令 UI | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-ui-settings | 设置页框架(settings.section 槽宿主) | ✅ |
@deepseek-ai/dsh-client-ui-settings-general | 通用设置 section(General) | ✅ |
@deepseek-ai/dsh-client-ui-settings-models | 模型设置 section | ✅ |
@deepseek-ai/dsh-client-ui-agent-preset | Agent 预设选择器(数据源 = host agentPresets) | ✅ |
@deepseek-ai/dsh-client-ui-settings-plugins | 插件面板 | ✅ |
@deepseek-ai/dsh-client-ui-settings-plugin-inventory | 插件清单 Tab(读 pluginInventory/list 等价面) | ✅ |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-ui-theme | 主题(ui-theme namespace;client 半发 theme/change,DOM 应用由桌面 ThemePresenter 承担——坑 26) | ✅ |
@deepseek-ai/dsh-client-ui-slots | 插槽系统(所有 UI 插件的组合底座,官方内核 seed) | ✅ |
@deepseek-ai/dsh-client-ui-model-selection | 模型选择器 | ✅ |
@deepseek-ai/dsh-client-ui-permission-presets | 权限预设 UI | ✅ |
@deepseek-ai/dsh-client-ui-message-feedback | 消息反馈(点赞/点踩) | ✅ |
@deepseek-ai/dsh-session-log-export(client 半) | Session 日志导出 UI(header 导出胶囊 + 结果弹层) | 🔁 已自有化(M6-P2 首件) |
| 插件 | 作用 | 状态 |
|---|
@deepseek-ai/dsh-client-ui-directory-picker-native | 目录选择 native 形态(与 prepare 注入的 Electron 版匹配) | ✅ |
@deepseek-ai/dsh-client-ui-directory-picker-browse | 目录选择浏览器形态(single slot 冲突) | 🚫 被排除 |
其余排除项(ui-layout / ui-sidebar / session-log-export / hmr / cordis-client-runner / ui-cordis)见 §〇「互斥排除清单」。
| 插件 | 文件 | 作用 | 状态 |
|---|
@lansi-ai/dsh-ipc-connection | ipc-connection.js | 零端口 IPC 载波占位(0.1.2:传输经 HTML boot 脚本注入 __DSH_TRANSPORT__,官方 client-connection 自行 provide connection;本条目为图谱激活占位) | ✅ |
@lansi-ai/dsh-forge-layout | forge-layout-client.js | 三列 grid 布局(sidebar|center|details)+ ctx.layout 服务 + rAF 拖拽 + 窄屏折叠 + ThemePresenter 等价 + 官方主题 token(接管 root 槽位,D-18;inject: slots+theme) | ✅(2026-09-01 实机验证通过) |
@lansi-ai/dsh-forge-titlebar | forge-titlebar-client.js | titlebar 行:品牌区(v7:全局 brand-mark-{light,dark}.png 透明底金标,缺失回退官方 FishLogo/占位)+ 折叠钮 + 中部拖拽区 + 窗控三钮;v5:logo + 窗控四枚 + 折叠两枚全部支持主题槽位 icons/titlebar-*.svg(状态对成对提供才启用,缺失回退内置,peekSvg 防首帧空窗)(inject: slots+layout+themeIcon) | ✅(2026-09-04 v5 / 2026-09-10 v7,待实机点验) |
@lansi-ai/dsh-forge-sidebar | forge-sidebar-client.js | 侧栏壳(M6-P3):fold 状态机 + 新会话(经 ctx.get('uiWorkspace').startSession,坑 32 修复件——非 domain 服务)+ 4 子槽位声明(brand.mark/name、workspaces、settings),子槽位注册者无改动继续工作。2026-09-07 注:sidebar.workspaces 现由自研 dsh-forge-workspaces 顶替(原为官方 ui-workspace);sidebar.settings 仍为官方注册者 | ✅(2026-09-01 实机验证通过) |
@lansi-ai/dsh-forge-session-export | forge-session-export-client.js | Session 日志导出 UI(M6-P2 首件):header 导出胶囊 + 结果弹层 + 下载 controller,文案修正桌面语义;host 半官方保留 | ✅(2026-09-02 实机验证通过) |
@lansi-ai/dsh-forge-workspaces | forge-workspaces-client.js | 工作区浏览区(M6-P3 W1 骨架):顶替官方 ui-workspace,承接五项接管面——uiWorkspace 服务(六方法)+ provideRoot(hooks.workspaces) + workspace 字典 63 键 + 双注册(sidebar.workspaces / conversation.hero.workspace 各带 directoryFlow 子洞)+ 十三项动作注入面(薄转发官方 domain,数据面零新增)。store persist key 沿用 dsh.workspace.view.v5。选/加工作区已可用(官方 WorkspacePickFlow 等价内核:有工作区列菜单+底部固定「添加」,无工作区 open 即直抬系统目录选择器,收养失败落弹层可重试;侧栏 addOnly + 收养后 startSession);tree 派生层已完成(W2)(deriveGroups/deriveFlat/deriveSearchResults + indexSubagentDescendants 血缘等纯函数内联进 bundle,exports.derive 钩子供 W3/W4 复用 + node:test 单测守护);Rows 行组件 + 视图选项已完成(W3)(组行/会话行 + 状态点 琥珀>蓝>绿 + Manual 拖拽持久排序 + flat 单列表 + 分组/排序下拉,纯函数 8 项单测追加);内容搜索已完成(W4)(wide 内联搜索槽 + narrow 搜索入口 + Host session.search 防抖 + sanitizeSearchQuery 线缆护栏 + 本地/内容命中合并派生,单测追加 sanitizeSearchQuery);批量选择/删除已完成(侧栏 header「多选」进入选择模式:行级勾选 + 工作区组整组勾选(半选态)+ 全选/清除 + 一键批量归档(归档语义,日志与文件保留,Promise.allSettled 部分失败可重试);纯前端,位于本 bundle,listedSessionIds 派生钩子 + 单测追加 1 项) | 🔄 W1+picker+W2 派生层 + W3 Rows/视图选项 + W4 内容搜索(2026-09-08,图谱实测 + 冒烟 40 项 + pickflow 行为 21 项 + 字典 diff + 派生/行/搜索单测 16 项 全通过,待实机点验)· 批量选择/删除代码完成(2026-09-16,待实机点验) |
@lansi-ai/dsh-forge-settings | forge-settings-client.js | 设置页「桌面」section(tray/通知/快捷键/自启 Toggle) | ✅ |
@lansi-ai/dsh-forge-theme | forge-theme-client.js | 设置页「外观」section,由上至下四项一级设置项:① 应用图标 ② 托盘图标 ③ 品牌 logo(三项 global,存 userData/icons/ 全局单份、不随包切换)④ 图标包(卡片网格 + 新建包,其下二级=界面图标需求清单:默认折叠、按消费方插件分组卡、行内上传·替换);槽位真源 = host ICON_SLOTS(D-23;坑 27/28/29/30) | ✅(2026-09-04 重构,待实机点验) |
@lansi-ai/dsh-forge-audit-viewer | forge-audit-viewer-client.js | 会话审计查看器 Tab | ✅ |
@lansi-ai/dsh-forge-conversation-visuals | forge-conversation-visuals-client.js | 对话区视觉层(data-phase 圆角/裁剪样式,不接管 conversation 槽位) | ✅ |
@lansi-ai/dsh-forge-cmdpalette | forge-cmdpalette-client.js | 命令面板(2026-08-27 禁用壳,仅留 quick-ask 聚焦) | ⛔ 已禁用 |
@lansi-ai/dsh-forge-panel 已下线(feat(plugins)! dabdae0,随侧栏触发按钮一并撤下)。
另:HTML 注入预置 LAYOUT_SKELETON_CSS(boot-graph 常量)——首帧布局骨架,防裸窗口期;内容归布局插件,与插件 CSS 同源两处同步。
| 模块 | 作用 | 状态 |
|---|
forge-api.ts | ctx.desktop 聚合服务(审计 JSONL / 配置 / 下行事件) | ✅ |
forge-tray.ts | 托盘 + 关窗驻留 + 快速问答 | ✅ |
forge-notify.ts | 系统通知(审批/错误/进展三类,0.1.2 host 事件直订阅) | ✅ |
forge-shortcuts.ts | 全局快捷键(Alt+Shift+Q / Space) | ✅ |
forge-clipboard.ts | 剪贴板(写走 approval) | ✅ |
forge-cmdpalette.ts | 命令面板 host 半(Ctrl+Shift+P) | ✅ |
forge-audit-viewer.ts | 审计查询服务(过滤+分页) | ✅ |
forge-autostart.ts | 开机自启(OS 登录项唯一真源) | ✅ |
forge-appearance.ts | --dsd-* 外观变量注入(D-21 骨架宿主化外观契约) | ✅ |
theme-sync.ts | 主题同步(0.1.2 host 事件双路直订阅,坑 22/26) | ✅ |
connection-fetch-bridge.ts | connection fetch 桥(非 POST /api/ 同源请求 → host connection 共享处理器,导出链路) | ✅ |
window-manager.ts | 多窗口 WindowManager(会话独立窗口 + 广播) | ✅ |
dsh-protocol.ts | dsh:// 系统协议路由 | ✅ |
session-rewarm.ts | 冷会话启动预热(坑 11;0.1.2 wire 契约对齐坑 24) | ✅ |
cordis-inventory.ts | 插件清单兼容面(pluginInventory/list 等价服务) | ✅ |
compat-webserver.ts | webServer 等价面(内存路由) | ✅ |
Host 半插件包化(cordis.patch.yml + dsh.client 声明)排期 M5。
四、维护约定
- 架构变更(增删插件/改排除表)时更新本文;
architecture-plugins.html 已过时(0.1.2 前快照,勿作现状依据),以本文为准。
CLIENT_EXCLUDE_IDS 追加排除项时,同步更新 §〇「互斥排除清单」与 §二 对应行(🔁 标记)。
- 每完成一件自有化(新
@lansi-ai/dsh-* 替换官方件):更新 §〇「进度总览 + 已自有化明细」+ §二/§三 对应行,并在 upstream-contracts.md §7 登记契约矩阵行。
- 上游升级时:先对照
upstream-contracts.md §7 逐条核对自有插件契约,再复核本文 Host/Client 两侧清单(ui-* 包可能有增删,如 alpha.4 的 tool-subagent-report 废除先例)。