# REFERENCE — 参考仓库索引 > dsh-hub 开发参考仓库清单(本地 clone 路径 + 调研描述)。 > 每条目的「描述」由并行调研子代理基于实际仓库内容校验后写成,供 agent 开发时快速定位参考源。 > 标签约定:`[desk-ui]` = 桌面壳/窗口层参考;`[dsh-plugin]` = dsh 插件层参考;`[plugin]` = 插件/agent 功能参考;`[ui]` = 前端 UI 参考;`[core]` = 框架核心源码。 ## 1. docs - **文件目录**:`E:\Workdata\Git_repositories\deepseek\docs` - **描述**:dsh-hub 从零到发布的完整开发档案(2026-08-13~16):技术栈调研 → WebView2 壳实现与发布(mg-dsh-desktop 0.1.6→0.1.8-rc.2)→ 更名 @marecgents/dsh-hub → Tauri 2.x 迁移决策。组织规律「每个功能一条带时间戳的任务日志,完成即归档 archieved/」。关键参考:① `dsh桌面端技术路线-2026-08-16.md`(Tauri 迁移路线与逐项映射表,最值得先看);② `deepseek-ai-dsh包调研报告-2026-08-15.md`(221 个官方 npm 包清单 + 30 个高价值 seam 包,插件开发依赖/官方接口索引);③ `archieved/` 踩坑史(托盘/右侧栏/多实例/窗口管理/junction 注册/npm 发布 registry 踩坑);④ `archieved/mg-dsh-desktop-项目交接文档-2026-08-14.md`(双 half 插件架构全貌,新 agent 第一入口)。⚠️ 旧文档为 mg-dsh-desktop 时代,包名/环境变量以技术路线最新命名为准(`@marecgents/dsh-hub` / `DSH_HUB_*`)。 - **关键目录要点**: - `archieved/`(50 篇)→ 历史任务日志(托盘/右侧栏/多实例/窗口分辨率/发布记录),开发同类功能先查 - `dsh桌面端技术路线-2026-08-16.md` → Tauri 2.x 迁移决策与 desktop.ts/托盘/通知/窗口状态/单实例逐项映射表 - `deepseek-ai-dsh包调研报告-2026-08-15.md` → 官方 dsh 包生态索引 - `会话损坏修复记录-2026-08-16-1023.md` → 多实例会话 seq 冲突修复(session.jsonl.zstd 格式细节) - **调研状态**:已完成 ## 2. deepseek-harness - **文件目录**:`E:\Workdata\Git_repositories\deepseek\deepseek-harness` - **描述**:DeepSeek AI 官方开源的 agent harness 单仓库(npm 根包 `@deepseek-ai/dsh-root`(2026-09-05 已 pull 到最新 master,HEAD d347e70390,**release dsh-v0.1.3-alpha.1**;较 0.1.2-rc.1 新增约 200 提交,含 Session v2 与图片→通用附件重命名等新破坏面——见 §2.3),MIT,developer preview,官方声明会有破坏性变更)。pnpm monorepo(60+ 包,ESM 全栈,Node ^22.19||>=24),核心是「万物皆插件」——基于 source-vendored 的 Cordis 框架(vendor/ 内 rescope 为 `@deepseek-ai/cordis`、`cordis-plugin-loader`、`-include`、`-group`、`-hmr`、`-timer` 等 9 包,README 含 manifest + 18 条本地修改日志),无特权核心、一切可替换。一个运行中的 dsh = 按层装配的插件树:profile(`$DSH_HOME/profiles/`)列出有序 bundles(`dsh.bundle.patch` 指向 patch 文件),`cordis.patch.yml` 按 entry id 打补丁(含 `!!js` 插值、`--dump-config`),Cordis Loader 挂载条目,`inject` 表达服务依赖,`ctx.effect()`/`ctx.on()` 注册可逆 effect(注册即 effect、卸载即回滚),类型化事件(declare merging + emit/waterfall/parallel/serial 四种 dispatch)是主要扩展点;会话侧是 append-only `SessionEvent` 日志(JSONL/SQLite)。⚠️ 官方源码中无「插件身份四重相等」术语,最接近的是 `vendor/loader/src/config/entry.ts` 的 entry diff 判定(name/inject/group 变化 → 整行 replace,仅 config 变化 → 热补丁,patch 按 entry id 定位)——dsh-hub 沿用该概念时需对照此文件。参考价值:①profile bundles 装配看 `packages/boot/app-boot/`(含 `$DSH_HOME/profiles/node_modules` 扁平 symlink 的 `healProfilesModuleFallback`,桌面壳 bundling 可直接复用);②HTTP 路由官方接口看 `packages/host/webserver/`(`ctx.webServer` register/registerUpgrade/registerFallback/tapIndex,**只绑 127.0.0.1/0.0.0.0**,注释言明 Electron 走 file://+IPC bridge——Tauri 迁移对照);③slot 系统看 `packages/client/ui-slots/`(SlotMap 声明合并 + 单一 register API + 四份 props share)+ `.agents/notes/implemented/architecture/2026-07-22-slot-type-chain-implementation.md`(定义性文档);④查任意 `ctx.*` 服务/事件/配置以 `docs/` 下源码生成的 catalogs 与 `subsystems/` 为准(CI 保鲜),每包 README 带 Model Experience + Known Limitations。 - **关键目录要点**: - `docs/` → 官方接口权威入口:architecture.md、cordis-primer.md、config/tool/event catalogs、subsystems/ - `vendor/` → vendored Cordis 全家桶(cordis/loader/include/group/hmr/timer/schemastery,rescope @deepseek-ai/*;entry.ts = 插件条目身份判定源码) - `packages/boot/app-boot/` → profile bundles 装配唯一官方实现(loadProfile/composeEntries/watchUserPatches/healProfilesModuleFallback) - `packages/host/webserver` + `packages/client/ui-slots` → webServer 路由与 slot 系统(桌面壳最相关) - `apps/cli` + `apps/web` → 入口与 web 前端壳 - **调研状态**:已完成 ### 2.2 2026-09-04 破坏性变更审计(alpha.1 → rc.1) - **必须修复 2 处**(升级到 rc.1 时): 1. **`@deepseek-ai/dsh-settings` 移除 `settingsNamespace()` 与 `installSettingsSection()`**(`packages/settings/settings/src/index.ts`,alpha.1=3 处引用、rc.1=0)——dsh-hub `src/index.ts:38` 直接 import 两者,升级后编译失败。替代:`SettingsProvider.installSection(owner, ns, schema, entry, hooks)` 实例方法;`register` 签名改为编译期小写 kebab-case 校验。 2. **`conversation.input.left` slot 的 owner 被移除**(`packages/client/ui-conversation/src/client/contract/slots.ts:133` 声明 `{ kind:'list'; scope:'session' }` 无 owner;`InputBar.tsx:461` 渲染 `renderSlot('conversation.input.left', {})`)——dsh-hub `PermissionPolicyChip` 读 `props.session?.id`,升级后恒为 `undefined`,芯片只在挂载时取一次策略、切换会话不再刷新(功能回归,不崩溃)。 ### 2.3 2026-09-05 破坏性变更审计(rc.1 → 0.1.3-alpha.1) - **上次 2 处破坏性变更仍存在**(未修复):`installSettingsSection`/`settingsNamespace` 仍缺失;`conversation.input.left` owner 仍为空。 - **本次新增破坏面**(dsh-hub 未使用,升级时需注意): - **Session v2**:`assistant/chunk` 事件从 known-event-types 移除,改为 `assistant/attempt` + 内嵌 `stream: AssistantStreamRecord[]`(`{ type:'chunk', chunk:{ type:'usage', usage } }` 承载用量);`assistant/message` 新增必填 `stream` 字段。**dsh-usage-stats 插件使用 `assistant/chunk`,升级后需迁移**。 - **图片→通用附件重命名**:`conversation.input.attachments` owner props 改名(`onAddImages`→`onAddFiles` 等);`SubmitImageAttachment`→`SubmitAttachment`;`InputState.imageIds`→`attachmentIds`。 - **`MessageText` 从 ui-primitives 删除**(ui-goal 改用 `projectUserText`)。 - **`ConnectionFetchHandler` 新增必填 `requestBodyMode()`**;`ConnectionFetchRoute` 新增必填 `requestBody`。 - **`ChatNodeOwnerProps`/`ToolCallOwnerProps` 新增必填 `loadImage`**;新增 `tool.call.images` slot。 - 新包 `@deepseek-ai/dsh-client-file-upload`(0.1.3-alpha.1)。 - **不受影响**:`ctx.webServer` 四方法、`slots.inject/register`、`settings.section`、`dsh.bundle.patch`/`dsh.profile.bundles`、Cordis 4.0.2、事件 `session/event`/`sandbox/mode`/`agent/*`。 - **⚠️ 关键结论(2026-09-05 实测)**:**npm registry 最新发布版是 0.1.2-rc.1**(0.1.3-alpha.1 尚未发布 npm);用户实际运行的 dsh 0.1.1-rc.2 中 `installSettingsSection`/`settingsNamespace` 仍存在、`conversation.input.left` 仍传 session owner、`assistant/chunk` 仍存在——**dsh-hub 当前与运行环境完全兼容,无需修复**。上述破坏性变更仅在升级到 0.1.2-rc.1+ 时触发。 - **必须升版本**:dsh-hub 全部 `@deepseek-ai/*` peer/devDependencies 为 `^0.1.0-rc.6`,按 semver `^0.1.0-rc.6` 不匹配 `0.1.2-rc.1`(prerelease 需同 [major,minor,patch] 元组),需统一升至 `^0.1.2-rc.1`。 - **不受影响**:`ctx.webServer` 四方法签名、`settings.section` slot(order-based)、`slots.inject/register`、事件系统(session/event、sandbox/mode、turn/end)、profile 装配(cordis.patch.yml/dsh.bundle.patch/dsh.profile.bundles)、Cordis 4.0.1→4.0.2(src 零 diff)、ui-primitives 全部在用 Icon/Menu/Toast 保留。 - **新增**:`keyedHooks` 注入面、`IconDatabaseOutline16`/`IconClockOutline16`/`IconAlarmClockOutline16`、`ConnectionIndicator`(替换 ConnectionBanner)、`diffTotals`。 ### 2.1 2026-08-27 实测补充(会话/左栏/locale/menu) - **会话改名链路**:client `sessions.binding(id).session.rename(title)` → `api.sessions.rename({sessionId,title})` RPC → host 持久化 → settle「title」事件 → byId 快照更新 → 左栏/标签/详情等所有消费 displayTitle 的 UI 自动联动(单一事实源)。 - **左栏树结构(ui-workspace)**:会话树容器 `role="tree"`、行 = `div[role="treeitem"]`(项目行带 aria-expanded、会话行 aria-selected、搜索行 `button[role=treeitem]`、空态 `.empty` div 在树容器内);slot 容器 `div[data-slot="sidebar.workspaces"]`;行尾 `span.rowActions` = 官方 ⋯ 菜单锚点(span→Menu(portal, closeOnPointerLeave)→anchor button,`POINTER_GRACE_MS=200`)。 - **官方重命名对话框**:行 ⋯ 菜单 → `onRename(id,title)` → `WorkspaceBrowser.onSessionRename` → React 内部 state(`setSessionRenameTarget/Draft`)——**无外部触发面**;⚠️ 实测该 ⋯ 弹层在本环境(WebView2/Tauri dev)合成事件与真实点击均无法打开(BUG_FIX_SOP/踩坑 #85)——此类官方弹层不可依赖。 - **ui-primitives Menu**:item = `