@y9931666/dsh-plugin-roundtable 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/cordis.patch.yml +22 -0
- package/lib/client.js +4276 -0
- package/lib/edge-helper-iqXOG5o_.js +12 -0
- package/lib/index.js +4535 -0
- package/lib/state-BzBQig2q.js +479 -0
- package/lib/state-pJShWoUr.js +3 -0
- package/lib/types/aggregator.d.ts +15 -0
- package/lib/types/budget.d.ts +46 -0
- package/lib/types/charter.d.ts +13 -0
- package/lib/types/client/RoundTableSettings.d.ts +14 -0
- package/lib/types/client/RoundTableView.d.ts +27 -0
- package/lib/types/client/brand-logos.generated.d.ts +5 -0
- package/lib/types/client/index.d.ts +23 -0
- package/lib/types/client/locales.d.ts +14 -0
- package/lib/types/client/slot-boundary.d.ts +49 -0
- package/lib/types/client/tool-views-model.d.ts +65 -0
- package/lib/types/client/tool-views.d.ts +31 -0
- package/lib/types/client/wire.d.ts +238 -0
- package/lib/types/edge-helper.d.ts +7 -0
- package/lib/types/harness-compat.d.ts +204 -0
- package/lib/types/index.d.ts +53 -0
- package/lib/types/kb-digest.d.ts +47 -0
- package/lib/types/members.d.ts +83 -0
- package/lib/types/node-events.d.ts +90 -0
- package/lib/types/plan.d.ts +86 -0
- package/lib/types/preferences.d.ts +143 -0
- package/lib/types/prompt.d.ts +52 -0
- package/lib/types/proxy-thinking.d.ts +12 -0
- package/lib/types/review-split.d.ts +61 -0
- package/lib/types/rpc.d.ts +89 -0
- package/lib/types/skills.d.ts +61 -0
- package/lib/types/snapshot.d.ts +96 -0
- package/lib/types/state.d.ts +142 -0
- package/lib/types/token-usage.d.ts +71 -0
- package/lib/types/tools.d.ts +59 -0
- package/lib/types/types.d.ts +330 -0
- package/lib/types/version.d.ts +21 -0
- package/lib/types/web-guard.d.ts +37 -0
- package/lib/types/workspace-candidates.d.ts +17 -0
- package/lib/workspace-candidates-B7isleLt.js +3 -0
- package/lib/workspace-candidates-DNmGPpSc.js +20 -0
- package/package.json +161 -0
- package/release-notes/v0.2.0.md +39 -0
- package/release-notes/v0.2.1.md +39 -0
- package/release-notes/v0.2.2.md +54 -0
- package/release-notes/v0.2.21.md +42 -0
- package/release-notes/v0.2.31.md +70 -0
- package/release-notes/v0.2.32.md +52 -0
- package/release-notes/v0.2.35.md +116 -0
- package/release-notes/v0.2.36.md +84 -0
- package/release-notes/v1.0.0-rc.1.md +165 -0
- package/release-notes/v1.0.0-rc.2.md +180 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# RoundTable v0.2.1
|
|
2
|
+
|
|
3
|
+
适配 **DeepSeek Harness 0.1.2-rc.1**(Cordis 4.0.2 / dsh 客户端架构重构)的兼容性版本。
|
|
4
|
+
|
|
5
|
+
## 为什么需要本版
|
|
6
|
+
|
|
7
|
+
宿主从 `0.1.1-rc.2` 升到 `0.1.2-rc.1` 后发生破坏性变更,旧版 RoundTable 无法在新宿主上正确加载:
|
|
8
|
+
|
|
9
|
+
- 客户端运行时三个包被合并/移除:`dsh-client-runtime`、`dsh-client-ui-slots`、`dsh-client-ui-primitives` 不再发布,客户端 `Context` 类型统一改由 `@deepseek-ai/cordis` 提供,插槽注册面并入 `dsh-client-ui-renderer`。
|
|
10
|
+
- 宿主 `dsh-settings` 的 `settingsNamespace()` 运行时函数被移除,命名空间改为纯类型(`SettingsNamespace`)。
|
|
11
|
+
- 宿主 `ctx.subagents` 的 `followup()` 更名为 `sendMessage()`(签名基本不变)。
|
|
12
|
+
- 各官方包版本号整体升至 `0.1.2-rc.1` / `cordis 4.0.2` / `schemastery 3.18.2`。
|
|
13
|
+
|
|
14
|
+
## 变更
|
|
15
|
+
|
|
16
|
+
- **适配 API**:`settingsNamespace('roundtable')` → 命名空间字面量;`subagents.followup(...)` → `subagents.sendMessage(...)`;客户端 `ClientContext` → cordis `Context`。
|
|
17
|
+
- **类型锚 shim**(`src/client/ui-slots-anchor.d.ts`):0.1.2-rc.1 发布物中 `@deepseek-ai/dsh-client-ui-slots` 仍是各 client 包 module-augmentation 的类型锚,但包体已并入 `dsh-client-ui-renderer` 不再发布——新增本地声明使类型合并重新生效,并补齐缺失的 `ctx.effect`/`ctx.slots` 类型。
|
|
18
|
+
- **依赖清单**:peer/devDependencies 升到 `0.1.2-rc.1` 系;移除已不存在的 `dsh-client-runtime`、`dsh-client-ui-slots`、`dsh-client-ui-primitives`;`dsh.client.inject` 换成现有包(含 `dsh-client-ui-renderer`);client bundle externals 同步清理。
|
|
19
|
+
- 包版本号 `0.2.0` → `0.2.1`。
|
|
20
|
+
|
|
21
|
+
## 验证
|
|
22
|
+
|
|
23
|
+
- `tsc` host + client 双端类型检查通过;`tsdown` 双产物构建通过(host 98 kB / client 472 kB)。
|
|
24
|
+
- 在 0.1.2-rc.1 宿主机内冒烟:`lib/index.js` 正常加载导出;host 侧 `tools / subagents / agents / systemPrompt / userQuestions / settings / webServer / connection.rpc.handle` 全部可用,插件的注入与 `/roundtable` 通道注册机制有效。
|
|
25
|
+
|
|
26
|
+
## 安装
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
dsh plugin --profile web add @huanlin/dsh-plugin-roundtable
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
或从源码:`git clone https://github.com/9931666/dsh-plugin-roundtable && cd dsh-plugin-roundtable && pnpm install && pnpm build && dsh plugin --profile web add .`
|
|
33
|
+
|
|
34
|
+
安装后**重启 DSH**、刷新 Web UI。
|
|
35
|
+
|
|
36
|
+
## 已知限制
|
|
37
|
+
|
|
38
|
+
- 仅适配 0.1.2-rc.1;回到 0.1.1-rc.2 宿主需用 v0.2.0。
|
|
39
|
+
- 其余已知限制与 v0.2.0 相同(第三方模型需显式指定 provider/model;多进程并发写同一会议不保证一致)。
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# RoundTable v0.2.2
|
|
2
|
+
|
|
3
|
+
「A+C+E」方向更新版(v0.2.2,兼容基线 0.1.2-rc.1 不变)。本版由一场针锋相对红队评审驱动:对 v0.2.2「A+C+E」更新计划做了两轮红队攻击(red-zai-a / red-zai-b,均 zai/glm-5.2),用户逐条支持/驳回后按认定的缺陷修订落地。
|
|
4
|
+
|
|
5
|
+
## 为什么需要本版
|
|
6
|
+
|
|
7
|
+
v0.2.1 是纯兼容性版本(适配 DSH 0.1.2-rc.1 的 API 变更),功能零新增;同时插件未发布到 npm、无 GitHub Release、市场未上架——几乎没有"正式分发 + 用户反馈"通道。本版打通分发、立住评审口碑、收回真实反馈。
|
|
8
|
+
|
|
9
|
+
## 变更
|
|
10
|
+
|
|
11
|
+
### A 分发与可安装性
|
|
12
|
+
- **A1 版本号统一为 0.2.2**:`package.json` 0.2.1 → 0.2.2(红队认定的版本号自相矛盾缺陷已修复:v0.2.1 仅为已适配未发布的历史号,本版发布物统一 0.2.2)。
|
|
13
|
+
- **A2** GitHub Release v0.2.2 tag(正文抄本文件)。
|
|
14
|
+
- **A3** awesome-dsh-plugin 市场上架收尾:英文 README、主图截图、`screenshots.json`、合并 PR(工作区 `awesome-dsh-plugin-fix`)。
|
|
15
|
+
- **A4** README 顶部「一分钟安装」+ 自 0.1.1 升级说明(见 `README.md`)。
|
|
16
|
+
|
|
17
|
+
### C 评审可信度与闭环
|
|
18
|
+
- **C1 观点证据分级**:观点拆分 schema 新增 `evidence { kind: 'repro' | 'argument'; text }`——代码/bug 类缺陷要求可复现步骤,设计类缺陷允许论证链(禁止编造伪复现);前端观点卡按类型展示证据徽标。
|
|
19
|
+
- **C2 驳回必填理由**:`ReviewViewpoint` 新增 `rejectReason`;RPC `roundtable/review.setStatus` 在 `status='rejected'` 且理由为空时拒绝;前端驳回先弹理由输入框;user-action 回写附带理由(供主持人修订时对照)。
|
|
20
|
+
- **C3 闭环复审终止条件**:`ReviewRecord` 新增 `reviewPass` / `maxReviewPass`(首轮 + 最多复审 2 次 = 3)与 `history[]`(每轮快照);新工具 `roundtable_finish_review` 落 done 并记录修订说明;复审超上限须用户显式批准(`user_approved_extra_pass`),杜绝无限循环。
|
|
21
|
+
- **C4 影响概览**:评审弹窗顶部显示已认定/已驳回/未表态计数;认定数 ≥ 3 时提示"建议重新协商方案"。
|
|
22
|
+
- **C5 评审记录导出**:新工具 `roundtable_export_review` 把全部轮次/观点/表态/驳回理由/修订对照渲染为一份 Markdown 交付物。
|
|
23
|
+
|
|
24
|
+
### E 反馈回路(匿名)
|
|
25
|
+
- **E1 轻量反馈弹窗**:会议结束后(status ended)询问一次 1 键有用度(有帮助/一般/没帮助)+ 可选一句"最卡的点";每会议只问一次(localStorage 记忆),可在设置关闭。
|
|
26
|
+
- **E2 「导出为 GitHub issue」**:`roundtable_export_review` 产出的 Markdown 可直接贴入 issue(预填信息见导出物头部)。
|
|
27
|
+
- **E3 工作区级 `feedback.jsonl` 匿名聚合**(红队认定的隐私边界缺陷已修复):只记协作模式/专家 provider/模型/轮数/Token 用量/时间戳 + 用户主动填写的说明;**绝不记录对话内容**;同一会议只保留最新一条;`feedback.list` / `feedback.clear` RPC;首次使用与设置页均明示"收集哪些字段、存于何处、可清空"。
|
|
28
|
+
- **E4 设置页「用户反馈」区**:开关(`feedbackEnabled`,默认开)+ 隐私边界说明 + 已收集条目列表 + 一键清空。
|
|
29
|
+
|
|
30
|
+
### 新工具
|
|
31
|
+
| 工具 | 作用 |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| `roundtable_finish_review` | 结束当前评审轮(→ done),附修订说明,支持闭环进入下一轮 |
|
|
34
|
+
| `roundtable_export_review` | 导出完整评审记录为 Markdown 交付物 |
|
|
35
|
+
|
|
36
|
+
## 验证
|
|
37
|
+
|
|
38
|
+
- `tsc` host + client 双端类型检查通过。
|
|
39
|
+
- 兼容基线不变:需宿主 0.1.2-rc.1+;其余已知限制与 v0.2.1 相同。
|
|
40
|
+
|
|
41
|
+
## 安装
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
dsh plugin --profile web add @huanlin/dsh-plugin-roundtable
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
或从源码:`git clone https://github.com/9931666/dsh-plugin-roundtable && cd dsh-plugin-roundtable && pnpm install && pnpm build && dsh plugin --profile web add .`
|
|
48
|
+
|
|
49
|
+
安装后**重启 DSH**、刷新 Web UI。
|
|
50
|
+
|
|
51
|
+
## 已知限制
|
|
52
|
+
|
|
53
|
+
- 仅适配 0.1.2-rc.1。
|
|
54
|
+
- 其余已知限制与 v0.2.1 相同(第三方模型需显式指定 provider/model;多进程并发写同一会议不保证一致;跨 Session 越权沿用降级校验)。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# RoundTable v0.2.21
|
|
2
|
+
|
|
3
|
+
**宿主兼容性复核版**:把 v0.2.2 的兼容基线从 DSH 0.1.2-rc.1 推进到 **0.1.5-rc.1**,并修掉两处"能跑但不真实"的隐性契约问题。
|
|
4
|
+
|
|
5
|
+
## 为什么需要本版
|
|
6
|
+
|
|
7
|
+
v0.2.1/v0.2.2 的 `peerDependencies` 全部停在 `^0.1.2-rc.1`。插件在本机之所以仍然工作,只是因为 profile 里装的是 `link:` 本地目录 + `node_modules/@deepseek-ai/*` 直指 0.1.5-rc.2 的 junction——**这条路径绕过了 peer 依赖解析**。真实用户在 0.1.5 宿主上全新安装时,npm 7+ 会因 peer 范围冲突直接报错。换言之:本机"能跑"掩盖了分发路径的断裂。
|
|
8
|
+
|
|
9
|
+
## 变更
|
|
10
|
+
|
|
11
|
+
### A 兼容基线推进到 0.1.5-rc.1
|
|
12
|
+
- **A1 版本号 0.2.2 → 0.2.21**(`package.json`)。
|
|
13
|
+
- **A2 `peerDependencies` 全部 `^0.1.2-rc.1` → `^0.1.5-rc.1`**;`devDependencies` 升到实测的 `0.1.5-rc.2`(宿主本体 `dsh` 为 0.1.5-rc.1,`@deepseek-ai/*` 各包为 0.1.5-rc.2)。
|
|
14
|
+
- **A3** README(安装要求 / 升级说明 / 版本徽章)与 `roundtable_*` 的 usage 文案同步改为 0.1.5-rc.1。
|
|
15
|
+
|
|
16
|
+
### B 0.1.2-rc.1 → 0.1.5 契约复核结论
|
|
17
|
+
逐项核对后**未发现破坏性 API 变更**,以下均已按 0.1.5-rc.2 实体类型验证:
|
|
18
|
+
- 16 个 `peerDependencies` 包**全部存在**,无被删除/合并/改名者;`ui-slots` 之外无新缺包。
|
|
19
|
+
- `ctx.subagents` 四个 API 签名一致:`getProvider` / `list` / `startContinuable` / `sendMessage(sender, targetId, content, { signal })` / `interrupt(id, { kind, agent })`。
|
|
20
|
+
- `ctx.tools.register`、`ctx.systemPrompt.section`、`ctx.settings.register`、`ctx.llm.*`、`ctx.webServer.register`、`ctx.userQuestions.ask`、`ctx.workspaceRegistry` 均未变。
|
|
21
|
+
- 客户端 slot 键 `conversation.view`、`settings.section` **都还在**;0.1.5 官方示例的注册写法与插件一致(`ctx.slots.inject(key, () => ctx.slots.register({ name, id, order, label }, Component))`)。
|
|
22
|
+
- 插件清单契约未变:`dsh.client.platform` + `exports["./client"]` 仍需,插件已满足;`cordis.patch.yml` 仍是顶层数组 `{ insert: [...] }`。
|
|
23
|
+
|
|
24
|
+
### C 修掉两处隐性契约问题
|
|
25
|
+
- **C1 `connection.rpc.handle` 过时第三参**(`src/rpc.ts`):0.1.1 时代的 `handle(channel, handler, { authority: 'trusted-host' })` 实际调用早已是两参,却留着旧签名 shim 与"必须传 authority 否则通道挂不上"的注释。0.1.5 真实签名为 `handle(channel, handler) => disposer`,多余实参被运行时静默忽略——正因如此它一直没被发现。现已删掉 shim 选项与该实参,并把历史故障模式改记为注释(不再误导后人)。
|
|
26
|
+
- **C2 类型锚文件不再遮蔽宿主真实服务面**(`src/client/ui-slots-anchor.d.ts`):
|
|
27
|
+
- v0.2.2 手写的两成员 `RoundTableSlotsService` **在接口合并中胜出**,遮蔽了宿主真实的 `SlotRegistry`,导致 `ctx.slots.entries / getVersion / subscribe / spec / snapshot / onEntryError` 全部不可见(实测:`ctx.slots` 解析结果就是本地那个手写类型)。
|
|
28
|
+
- v0.2.21 改为**成员级精确镜像**宿主 `SlotRegistry`(0.1.5-rc.2),遮蔽消除,服务面恢复完整。
|
|
29
|
+
- **关键约束(已写入文件头注释)**:该文件必须保持"全局脚本"(零顶层 `import`/`export`)。一旦加入 `import`,其中的 `declare module '@deepseek-ai/dsh-client-ui-slots'` 会从「环境模块声明」退化为「模块增强」,立即报 `TS2664`——并且会连带打断 `locales.ts` 的 `LocaleNamespaceMap` 合并(实测复现)。这是**无法改为 `import type { SlotRegistry }`** 的原因。
|
|
30
|
+
|
|
31
|
+
## 验证
|
|
32
|
+
|
|
33
|
+
- `tsc` host + client **双端全绿**。
|
|
34
|
+
- `tsdown` 构建通过,产出 `lib/index.js` + `lib/client.js` + 完整 `lib/types/**`;产物内已确认为 v0.2.21 文案、`authority` 字符串与旧版本字符串均已消失。
|
|
35
|
+
- 全量扫描 223 个宿主包:`roundtable_*` 工具名**无一命中**,确认工具集由本插件提供、插件在 0.1.5 宿主内正常加载。
|
|
36
|
+
- 客户端 bundle 的运行时 `require` 仅依赖 `react` / `react/jsx-runtime`(宿主模块由 `dsh.client.inject` 静态种子提供),无悬空引用。
|
|
37
|
+
|
|
38
|
+
## 已知限制
|
|
39
|
+
|
|
40
|
+
- **`SlotRegistry['register']` 在所有消费者侧都是 `any`**:宿主将其声明为 `SlotCore['register']`,而 `SlotCore` 所在的 `@deepseek-ai/dsh-client-ui-slots` 从未发布(node_modules、`.pnpm`、package-lock 中均不存在,仅作为 `dsh-client-ui-renderer` 的 devDependency 类型锚与 web shell 种子词存在)。这是宿主侧缺口,插件无法从自身闭合;锚文件中保留的是**按宿主运行时 `_register(options, component)` 实测**得到的精确签名。
|
|
41
|
+
- 历史会议记录(`.roundtable/`)跨大版本兼容性不保证,重要会议请先导出。
|
|
42
|
+
- 与 v0.2.1 相同的其余限制不变。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# RoundTable v0.2.31
|
|
2
|
+
|
|
3
|
+
**设置卡片 + DSH 原生 skill 接入**:把"模型自行拍会议参数"这一步换成**用户先确认草案**,并把宿主已有的 skill 能力接进会议(会议可选 skill、可在设置里切换传递方式)。
|
|
4
|
+
|
|
5
|
+
## 为什么需要本版
|
|
6
|
+
|
|
7
|
+
在此之前,说一句"开个圆桌会议讨论 X",主持人就直接调 `roundtable_create` 建会,专家名单、模式、预算全由模型自己拍。用户只能在**会后**通过 UI 改专家,参数甚至无从修改。本版把确认环节前置:**先出草案卡片 → 用户确认或初次修改 → 按确认结果建会**。
|
|
8
|
+
|
|
9
|
+
同时,DSH 宿主本身已有完整的 skill 体系(`ctx.skills` + 模型工具 `skill`,目录发现由 `dsh-skill-filesystem` 负责)。本版把它接进会议,但**不自己造导入机制**:按官方目录放文件即被识别。
|
|
10
|
+
|
|
11
|
+
## R1 会议设置确认卡片
|
|
12
|
+
|
|
13
|
+
- **新增 `roundtable_plan_meeting`(不创建会议)**:接收议题、专家名单与各项参数,推导出一份草案,渲染为可读 Markdown,通过原生 `userQuestions.ask()` 以 `intent.kind='plan-review'` 弹出并**阻塞等待**用户答复。
|
|
14
|
+
- 返回 `decision="approved"`:主持人按这些值调 `roundtable_create` 创建。
|
|
15
|
+
- 返回 `decision="revise"` + 用户原话:主持人更新草案(未改动的项保持不变)后**再次**调用本工具,卡片以 `revised=true` 标注"已按你的意见更新"。
|
|
16
|
+
- 返回 `decision="unavailable"`(服务缺失/被中止):主持人改为**文字**陈述草案取得同意,仍不放行"自行拍参数"。
|
|
17
|
+
- **卡片内容**:会议名称、协作模式、轮数上限、Token 预算、知识库路径、选中 skill、skill 传递方式、逐个专家(`key` — 角色 — 路由)、当前可选 skill 清单、议题目标。
|
|
18
|
+
- **"可改全部"的实现口径**:原生 `ask` **没有表单能力**(只有选项列表 + 一个自由文本 `custom`),因此"可改全部"是**自由文本 + 回流重建**,而非富表单;卡片里不塞任何伪交互说明。点选式编辑面板仍属后续版本。
|
|
19
|
+
- **默认值优先级**(与既有设置页保持一致):会议参数显式传入 > 插件 `PreferenceSchema`(设置页)> 插件 `Config` 默认值。`getPlannedDefaults` 注入设置页那一层,**实时读取**。
|
|
20
|
+
- **`roundtable_create` 扩展**:新增 `kb_path` / `skills` / `skill_delivery` 三个参数,创建时一并落库;输出回显全部生效值,便于事后核对。
|
|
21
|
+
- **`roundtable_status` 扩展**:新增 `skills` 与 `skill_delivery` 字段。
|
|
22
|
+
|
|
23
|
+
## R2 DSH 原生 skill 接入
|
|
24
|
+
|
|
25
|
+
- **新增 `src/skills.ts`**:只通过 `ctx.get('skills')` **可选**读取清单与正文(`list({cwd})` / `get(name, {cwd})`)。服务缺失、发现失败、工作区不可读一律降级为空清单——**绝不因为 skill 服务缺席而让插件加载失败**。
|
|
26
|
+
- **会议选中 skill**:`Meeting` 新增可选字段 `skills?: string[]` 与 `skillDelivery?: SkillDelivery`,由卡片确认结果写入;`snapshot.ts` / `rpc.ts` / `client/wire.ts` 三处同步透传,前端右栏新增「已选 skill」面板(含传递方式标注)。
|
|
27
|
+
- **传递方式 = 设置项(D5)**:`PreferenceSchema` 新增 `skillDelivery: 'relay' | 'direct'`(默认 `relay`),设置页给出两选一 + 各一句话说明:
|
|
28
|
+
- **主持人中转**:主持人读取 skill 正文后按需转交专家 —— 省 token、行为可预测。
|
|
29
|
+
- **专家直接调用**:专家自己用原生 `skill` 工具加载 —— 更自主,但每个专家都会各自读取一遍。
|
|
30
|
+
- 选择在建会时**固化到会议**,`add_node` 时以会议值为准(会议未记录时回退到设置页默认值)。
|
|
31
|
+
- **两种模式的实现要点**:
|
|
32
|
+
- `relay`:不改 `toolFilter`,与既有知识库中转同构。
|
|
33
|
+
- `direct`:`nodeToolRestriction('direct')` 返回 `{ allow: 专家白名单, deny: 主持人专属工具 }`,从而放行宿主的 `skill` 工具。`allow` 的语义是 **keep-only**,因此白名单必须列全专家真正需要的工具(文件/搜索/shell/会话管理/协作通道/`skill`);一旦宿主改名,失败方向是"专家失去该能力",**不会**顺带放开权限。`deny` 保留作双重保险。
|
|
34
|
+
- `nodePersona()` 注入 skill 段落:列出选中的 skill 名称与使用方式;`direct` 模式下还必须告知清单(`skill` 工具本身不带白名单参数),并**依据宿主是否真的注册了 `skill` 工具**(`ctx.tools.get('skill', captain)`)决定是否让专家去调用它。
|
|
35
|
+
- **依赖**:`package.json` 新增 `@deepseek-ai/dsh-skill`(peer + dev,均 optional);插件 `inject` 增补 `skills`,并加 `import type {} from '@deepseek-ai/dsh-skill'` 以取得 `ctx.skills` 的类型可见性。
|
|
36
|
+
|
|
37
|
+
## 变更清单
|
|
38
|
+
|
|
39
|
+
| 文件 | 改动 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| `src/plan.ts` | **新增**:草案类型、卡片 Markdown 渲染、答案解析(`approved` / `revise` / `unavailable`) |
|
|
42
|
+
| `src/skills.ts` | **新增**:`ctx.skills` 可选读取(清单 / 正文 / 服务探测) |
|
|
43
|
+
| `src/tools.ts` | 新增 `roundtable_plan_meeting`;`roundtable_create` 支持 `kb_path`/`skills`/`skill_delivery`;`add_node` 注入 skill 上下文;`status` 增 `skills`/`skill_delivery` |
|
|
44
|
+
| `src/types.ts` | `SkillDelivery` 类型;`Meeting` 增 `skills` / `skillDelivery` |
|
|
45
|
+
| `src/members.ts` | `nodeToolRestriction(delivery)`(direct 白名单);`nodePersona` 注入 skill 段落 |
|
|
46
|
+
| `src/index.ts` | `PreferenceSchema` 增 `skillDelivery`;注入 `getSkillDelivery` / `getPlannedDefaults`;usage 文案更新(新流程 + skill 规则) |
|
|
47
|
+
| `src/rpc.ts` | `RoundTablePreferences` 增 `skillDelivery`(读/写/降级三处) |
|
|
48
|
+
| `src/snapshot.ts` / `src/client/wire.ts` | 透传 `skills` / `skillDelivery` |
|
|
49
|
+
| `src/client/RoundTableSettings.tsx` | skill 传递方式选项 + 一句话说明 |
|
|
50
|
+
| `src/client/RoundTableView.tsx` (+ `.module.css`) | 「已选 skill」面板 + 传递方式标注样式 |
|
|
51
|
+
| `src/client/locales.ts` | 中英双语文案(新增 10 个 key) |
|
|
52
|
+
| `package.json` | 版本 0.2.21 → **0.2.31**;新增 `@deepseek-ai/dsh-skill` 依赖 |
|
|
53
|
+
|
|
54
|
+
## 验证
|
|
55
|
+
|
|
56
|
+
- `tsc -p tsconfig.json --noEmit` 与 `tsc -p tsconfig.client.json --noEmit` **双端全绿**。
|
|
57
|
+
- `tsdown -c tsdown.config.ts` 构建通过,产出 `lib/index.js` + `lib/client.js`;随后 `tsc --emitDeclarationOnly`(host + client)重建完整 `lib/types/**`(含新增 `plan.d.ts` / `skills.d.ts`)。
|
|
58
|
+
- skill 服务可用性已核实:`@deepseek-ai/dsh-skill`、`dsh-skill-filesystem`、`dsh-tool-skill` 均在宿主 `dsh-base` 的依赖里,`ctx.skills` 与 `skill` 工具在标准 web profile 可用。
|
|
59
|
+
- `ToolRestriction.allow` 的 keep-only 语义、`intent.approve` 必须命中本题某个选项(否则 `ask()` 拒绝)两点,均已按宿主 0.1.5-rc.2 实体类型与运行时实现核对。
|
|
60
|
+
|
|
61
|
+
## 已知限制
|
|
62
|
+
|
|
63
|
+
- **卡片是选项列表 + 自由文本框,不是富表单**:原生 `userQuestions` 的结构决定了这一点(见 R1)。想点选增删专家,需要后续版本的 UI 编辑面板。
|
|
64
|
+
- **`direct` 模式下无法硬限制**:原生 `skill` 工具不带白名单参数,专家技术上可以加载未被会议选中的 skill;本版的做法是**只告知选中清单、不做硬限制**(persona 中亦如实说明)。
|
|
65
|
+
- **会议中途不能改 skill 清单**:清单在创建时固化;新增资料请走 `relay` 路径。
|
|
66
|
+
- **卡片渲染取决于 Web UI 是否识别 `plan-review` intent**:不识别时退回普通选项列表,**功能不受影响**,答复编码(`selected` 含 `批准` 标签即视为批准)完全一致。
|
|
67
|
+
|
|
68
|
+
## 升级提示
|
|
69
|
+
|
|
70
|
+
改的是 **host 侧**:装好/构建后需要**重启 DSH**(客户端改动刷新页面即可)。历史会议记录(`.roundtable/`)为向后兼容的可选字段扩展,旧会议无 `skills` 字段时按"未选 + `relay`"处理。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# RoundTable v0.2.32
|
|
2
|
+
|
|
3
|
+
**修掉"设置页读取设置失败" + 右栏面板可点圆圈显示/隐藏 + 拓扑不再留大片空白。**
|
|
4
|
+
|
|
5
|
+
## 为什么需要本版
|
|
6
|
+
|
|
7
|
+
v0.2.31 把 skill 能力接进会议后暴露了三个问题:设置页报「读取设置失败」、右栏面板堆得太多、拓扑图下方留出大片空白。本版逐个修掉。
|
|
8
|
+
|
|
9
|
+
## 1. 修复:设置页「读取设置失败」
|
|
10
|
+
|
|
11
|
+
**根因**:浏览器 RPC 走的是宿主 `connection` 服务的专用 channel(`/roundtable`),而该 channel 依赖宿主 `connection` 服务可用。实测该前缀路由在运行时**没有挂载**(`POST /roundtable/prefs.get` 落到静态资源兜底,返回 `405 Method Not Allowed`),因此**所有** `roundtable/*` 端点(读取设置、保存设置、连线编辑、评审表态、知识库路径…)全部不可达。
|
|
12
|
+
|
|
13
|
+
**修法**:让 RPC 走**和快照路由同一条已验证可用的通道**。
|
|
14
|
+
|
|
15
|
+
- host(`src/rpc.ts`):把原先内联在 `connection.rpc.handle` 回调里的巨大 `switch` 提取为**唯一**的 `dispatch(endpoint, payload)`,并 `export`。它永不抛错——内部异常一律收敛成失败信封,避免 webServer 以 400 收场、客户端只看到 fetch 失败而非真正的错误信息。
|
|
16
|
+
- host(`src/index.ts`):把同一个 dispatch 挂到插件**自己的** POST 路由 `RPC_ROUTE = /plugins/dsh-plugin-roundtable/rpc`(与 `/plugins/dsh-plugin-roundtable/state` 快照路由同样的 `webServer.register`),并且**只需 webServer** 即可挂载(不再要求 workspaceRegistry 同时就绪)。旧 `connection` channel 保留为兼容路径。
|
|
17
|
+
- client(`src/client/wire.ts` + `index.ts`):新增 `callRpc()` —— 直接 `fetch` 上面那条 POST 路由,非 JSON / 不可达一律返回**失败信封**而不是 reject;`connection.rpc.call('/roundtable', …)` 作为**兜底**保留,因此老 profile 或非 web 组合仍可降级工作。
|
|
18
|
+
|
|
19
|
+
> 影响面:设置页、连线编辑、评审「支持/驳回」、知识库路径、专家增删队列、反馈提交——这一批原本都会随 `/roundtable` 一起失效,现在一并恢复。
|
|
20
|
+
|
|
21
|
+
## 2. 新增:右栏面板「点圆圈决定显示」(R3)
|
|
22
|
+
|
|
23
|
+
- 新增偏好 `hiddenPanels: string[]`(host `PreferenceSchema` + RPC 读写 + 客户端 wire 类型三处同步)。服务端用 `ROUNDTABLE_PANELS` 白名单做**净化**:未知 id 丢弃、重复去重,坏数据不会把 UI 搞乱。
|
|
24
|
+
- 设置页(设置 → 圆桌会议 → **右栏面板显示**)给出 7 个圆形开关:**点亮的圆圈 = 显示,暗掉的 = 隐藏**,一键切换、点「保存」生效:专家 / 分工 / 知识库 / 已选 skill / 发言记录 / 分针记录 / 产出文件。
|
|
25
|
+
- 拓扑页右栏顶部加了一条简短提示(面板显示 · 可在设置里调整)。
|
|
26
|
+
- 效果:关掉不常看的面板后右栏显著变短,拓扑区自然获得更多空间。
|
|
27
|
+
|
|
28
|
+
## 3. 优化:拓扑不再留大片空白
|
|
29
|
+
|
|
30
|
+
环形布局原先把半径限制为 `min(w*0.20, h*0.36)`——高度只吃到 72%,高画布时上下各空掉一大块。现改为 `min(w*0.20, h*0.5 - 节点半径 - 18)`:**按可用高度铺开**,只留一个节点半径加一圈呼吸空间,宽度仍是硬约束。
|
|
31
|
+
|
|
32
|
+
- 初始草案曾在拓扑页右栏顶部放过一条「面板显示 · 可在设置里调整」的提示框;按用户要求**已删除**(连带其文案与 CSS)——开关本身在设置页,右栏不再占位。同一轮里一并撤掉了一个多余的 `hideEndedMeetings` 偏好草案,未进入本版。
|
|
33
|
+
|
|
34
|
+
## 4. 修复:`roundtable_create` 缺省值与设置页不一致
|
|
35
|
+
|
|
36
|
+
`max_rounds` / `max_tokens` / `skill_delivery` 原先在主持人跳过设置卡片直接建会时回退到**硬编码**默认值,与设置页无关。现统一走 `plannedDefaults`(显式传入 > 设置页偏好 > Config 默认值),满足设置卡片需求 R1 第 3 条。
|
|
37
|
+
|
|
38
|
+
## 验证
|
|
39
|
+
|
|
40
|
+
- `tsc -p tsconfig.json --noEmit` 与 `tsc -p tsconfig.client.json --noEmit` **双端全绿**。
|
|
41
|
+
- `tsdown` 构建通过 + `tsc --emitDeclarationOnly`(host/client)重建 `lib/types/**`。
|
|
42
|
+
- 产物断言:插件自有 RPC 路由、快照路由、`connection` 兼容路径、`hiddenPanels`、面板 id 白名单、POST-only 守卫、客户端 fetch + 兜底、面板开关样式类与新文案 —— 全部命中。
|
|
43
|
+
- 诊断证据:`POST /roundtable/prefs.get` → `405`(静态兜底)、`POST /api/probe` → `401`(`/api` 路由确实挂载),据此判定问题出在插件专用 channel 而非认证或插件加载。
|
|
44
|
+
|
|
45
|
+
## 已知限制
|
|
46
|
+
|
|
47
|
+
- 本版的判定依据是**外部 HTTP 探测**(405/404/401 三条对照),未能直接读取运行中 DSH 的 host 日志(本机没有落盘日志目录)。若重启后设置页仍有异常,请把浏览器 Network 面板里该请求的状态码与响应体发我。
|
|
48
|
+
- `hiddenPanels` 为新增可选字段,旧会议记录与旧设置文件不需要迁移(缺省 = 全部显示)。
|
|
49
|
+
|
|
50
|
+
## 升级提示
|
|
51
|
+
|
|
52
|
+
host 侧改动,**需要重启 DSH**;客户端刷新页面即可(如浏览器缓存了旧 client bundle,强刷一次)。
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# RoundTable v0.2.35
|
|
2
|
+
|
|
3
|
+
**账目干净、边界可守、常用动作顺滑:清掉一处真实的数据一致性隐患与三处"设计承诺 vs 代码现实"的不一致,补上最小质量门禁,并做掉两个高频缺口——用户自建角色预设与整场会议导出。**
|
|
4
|
+
|
|
5
|
+
> 版本号说明:本轮任务书原命名为 `v0.3.0`,最终按用户决定定版为 **v0.2.35**(改动性质是"收账 + 两个补齐",不是架构级跃迁)。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 修复:`user-actions` 清空的非原子性(A2,真实数据一致性隐患)
|
|
10
|
+
|
|
11
|
+
**问题链**:`clearUserActions()` 原先是「先读计数 → 直接 `writeFile(file, '')` 截断」,非原子。UI 的追加(`roundtable/user-actions.append`)与主持人的清空(`roundtable_actions_clear`)是两条独立路径:清空瞬间恰逢 UI 正在追加、或进程写一半崩溃,就可能留下**半行 JSON**;而读取侧对坏行是**静默跳过**——那条用户操作永久消失,且没人知道。
|
|
12
|
+
|
|
13
|
+
**修法**:
|
|
14
|
+
|
|
15
|
+
- `src/state.ts` 新增通用 **`writeTextAtomic(file, text)`**(同目录 tmp + rename;rename 失败时把 tmp 改名为 `.stale-<uuid>` 而不是留脏文件),`writeJsonAtomic` 改为复用它。
|
|
16
|
+
- 新增 `readUserActionsReport()`:区分「可用 action 列表」与「`malformed` 坏行数」。
|
|
17
|
+
- `appendUserAction()` 与 `clearUserActions()` 共用一把串行锁(`user-actions:<stateRoot>:<meetingId>`),**追加与清空不再可能交错**。
|
|
18
|
+
- `clearUserActions()` 返回 `{ cleared, malformed }`,`roundtable_actions_clear` 的输出 schema、描述与渲染文案同步升级:`malformed > 0` 时明确提示主持人**必须向用户说明这些操作已丢失**。
|
|
19
|
+
- 顺手把同构的 `clearFeedback()` / `clearFeedbackForMeeting()` 也切到原子写(同一类隐患,同一处修法)。
|
|
20
|
+
|
|
21
|
+
## 2. 清账:三处"定义了却没人用"的不一致(A5)
|
|
22
|
+
|
|
23
|
+
| 项 | 原状 | 处理 |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| `MeetingNode.reasoningEffort` | 只有 `types.ts` 里一个定义 + 一句注释,**全仓库零读写** | **补齐**(不是删除):`roundtable_add_node` 新增可选参数 `reasoning_effort` → 写入节点 → `spawnNode` 透传到 `agentOptions.reasoningEffort`;`roundtable_status` 与整场导出都会显示它。已核实宿主 `AgentOptions` 确实支持该字段(`@deepseek-ai/dsh-subagent` 的 `resolveChildAgentOptions` 会继承/覆盖它)。 |
|
|
26
|
+
| `MeetingStatus` 的 `'archived'` | 有定义,但全仓库**没有任何写入路径** | 本轮不实现归档(B4 已排除)。在 `types.ts` 注释里显式标注为**预留状态**,并说明 `budget.ts` / `tools.ts` 里读它的分支是**刻意保留的防御性代码**,将来实现归档时不会漏判。 |
|
|
27
|
+
| `/roundtable` 斜杠命令 | V1 规格书写过 `command.ts`,`src/**` 搜 `commands` **零命中** | 本轮只清账不补功能:README 中原先"`/roundtable 议题…` 或自然语言触发"的承诺**已删除**,改为明确写"本插件不提供 `/roundtable` 命令,从未实现,本版明确不做"。 |
|
|
28
|
+
|
|
29
|
+
## 3. 新增:用户自建角色预设(B3)
|
|
30
|
+
|
|
31
|
+
- **偏好字段** `rolePresets: RolePreset[]`(`id / name / role / provider? / model?`,默认 `[]`)。**不预置任何内置角色**,列表空着等用户自己建。
|
|
32
|
+
- **校验手写在 RPC 侧**(`sanitizeRolePresets`):因为实测 schemastery 的 `z.object` 在 resolve 阶段**不校验缺失的 required 字段**(`s({ rolePresets: [{ id: 'a' }] })` 直接通过),所以 schema 拦不住脏数据。规则:`name` + `role` 非空是硬要求;`id` 缺失或重复时**重新分配**(保数据,不静默丢条目);`provider`/`model` 必须成对,半对视为"继承主持人";单字段超长截断、总数超 50 截断。
|
|
33
|
+
- **设置页**(设置 → 圆桌会议 → 「角色预设」):列表(名称/角色说明/模型)+ **新建 / 编辑 / 删除**,模型下拉复用既有 `roundtable/models.list`。预设的增删改**立即落库**(提交完整偏好对象,与底部「保存」语义一致),不用等按保存。
|
|
34
|
+
- **专家管理面板**:表单顶部新增「角色预设」下拉,选中即填充 `role` / `provider` / `model`(专家 key 仍由用户填)。仍走既有链路——写 `user-actions.jsonl` 的 `add-node` → 主持人下一轮 `roundtable_add_node`,**不新增任何链路**。预设为空时给出"去设置页新建"的指引。
|
|
35
|
+
- 三处类型同步:`src/types.ts`(`RolePreset`)、`src/rpc.ts`(`RoundTablePreferences`)、`src/client/wire.ts`(`RoundTablePrefs.rolePresets`)。
|
|
36
|
+
|
|
37
|
+
## 4. 新增:整场会议导出为 Markdown(B6)
|
|
38
|
+
|
|
39
|
+
新增主持人专属工具 **`roundtable_export_meeting`**(同时加入 `members.ts` 的 `NODE_DENIED_TOOLS`,专家不可调用):
|
|
40
|
+
|
|
41
|
+
- 头部:插件版本、会议 id/名称、协作模式、状态、创建时间、结束时间、预算用量、知识库、选中 skill;
|
|
42
|
+
- 议题 / 目标;专家名单(key / 角色 / provider / model / reasoning effort / 状态);决策记录(问题 / 选项 / 用户选择 / 自定义答案 / 状态 / 时间);
|
|
43
|
+
- 发言记录:**按轮次分组**,标注 `发言者 → 受众` 与时间戳,非 speech 类型标注 kind,单条超 4000 字符截断并标注原长;
|
|
44
|
+
- 评审结论(存在 `review.json` 时内联完整的针锋相对记录);
|
|
45
|
+
- 用户调整记录(`user-actions.jsonl`),并注明"只包含尚未被清空的记录"。
|
|
46
|
+
- **不新增状态**:全部读自既有文件。会议进行中也能导出,头部标注**「进行中快照」**。
|
|
47
|
+
- 除返回 Markdown 外,**同时写入 `<meetingDir>/export.md`**(`save: false` 可只取文本),便于用户直接打开文件。
|
|
48
|
+
|
|
49
|
+
顺带重构:把评审导出拆成 `renderReviewMarkdown`(头部)+ `renderReviewBody`(主体),整场导出复用主体,避免两份重复的 issue 头部。
|
|
50
|
+
|
|
51
|
+
## 5. 新增:知识库摘要缓存(C2,省 token)
|
|
52
|
+
|
|
53
|
+
- 会议级缓存文件 `<meetingDir>/kb-digest.json`:条目 `{ path, size, mtimeMs, digest, ts }`。
|
|
54
|
+
- **失效键 = `path + size + mtimeMs`**:宿主 `listKbDirectory()` 本来就在 `stat` 每个条目,比对不产生额外 IO。
|
|
55
|
+
- 新增主持人工具 **`roundtable_kb_digest`**(相对路径按会议 `kb_path` 解析;插件自己 `stat` 出 `size`/`mtimeMs`,主持人不必也不该手填这两个数);同 `path` 覆盖,超 50 条按最旧淘汰,单条摘要超 2000 字符截断。
|
|
56
|
+
- `roundtable_status` 新增 **KB digest cache** 段:把每条缓存用磁盘现状标注为 **`[HIT]`**(键未变,直接用摘要)或 **`[STALE]`**(文件变了,必须重读),并给出条目数与有效数。缓存**不参与预算计数**——它不消耗模型 token。
|
|
57
|
+
- `usageSectionText` 第 10 条改写为完整协议:**读文件前先看缓存;HIT 就直接复用、不要再读**("主持人读一遍 + 专家读一遍"正是双倍 cost 的来源);未命中才读,读后用 `roundtable_kb_digest` 写回。
|
|
58
|
+
|
|
59
|
+
> 与任务书的一处偏离:R6.2 原本要求"新增 RPC 端点(读写)"。本轮**没有加这两个 RPC 端点**——当前 UI 没有任何消费者,加了就是新的"定义了却没人用"的代码,正是 A5 刚清掉的那种账。主持人侧的可达路径由 `roundtable_status`(读)+ `roundtable_kb_digest`(写)承担,两者都是真实调用点。
|
|
60
|
+
|
|
61
|
+
## 6. 质量门禁:零依赖测试(A6)
|
|
62
|
+
|
|
63
|
+
- 新增 `test/` + `node --test`(**零新依赖**,用 `node:assert/strict`)。本机 Node 24 原生剥离类型,测试**直接 `import` `src/*.ts`**,不需要 vitest/jest/ts-node。
|
|
64
|
+
- 7 个测试文件、**56 个用例**,覆盖:
|
|
65
|
+
- `plan.ts`:卡片渲染包含议题/模式/预算/知识库/skill/专家逐个/空态指引;`resolvePlanConfirmation` 三态 + "批准优先于 custom";
|
|
66
|
+
- `rpc.ts`:`sanitizeHiddenPanels`(未知 id 丢弃 / 去重 / 非数组返回 `[]`)、`sanitizeRolePresets`(缺字段丢弃 / 路由成对 / id 重分配 / 超长超量截断);
|
|
67
|
+
- `budget.ts`:`estimateTokens` 单调性与空白不计;熔断**边界**(恰好等于上限即算超限);`ensureActive` 的 muted 置位与 ended/archived 拒绝;
|
|
68
|
+
- `review-split.ts`:本地兜底按「观点 N」切分、**不丢正文**、尾部 `[核心产出]/[下一步建议]` 不混进观点、无标记返回 `null`;
|
|
69
|
+
- `kb-digest.ts`:失效判定边界、同 path 覆盖、按 `ts` 淘汰最旧、超长截断且不改入参;
|
|
70
|
+
- `export.test.mjs`:整场导出结构齐全、版本号真实、**断言不出现 `undefined` / `[object Object]`**、长发言截断、进行中快照标注;
|
|
71
|
+
- `version.test.mjs`:`src/version.ts` 与 `package.json` 版本一致性。
|
|
72
|
+
- `package.json` 新增 `test` 与 `test:inline` 两个脚本(不改变既有 `typecheck` / `build` 语义)。
|
|
73
|
+
|
|
74
|
+
## 7. 顺带修掉一个此前无人体检到的缺陷:导出头部版本号说谎
|
|
75
|
+
|
|
76
|
+
`renderReviewMarkdown` 的导出头部**硬编码** `@huanlin/dsh-plugin-roundtable v0.2.21`,而 `package.json` 已经走到 0.2.32——**导出物里的版本号是错的,且没有任何测试会发现**。
|
|
77
|
+
|
|
78
|
+
- 新增 `src/version.ts` 作为源码侧单一来源:`PLUGIN_VERSION = '0.2.35'`、`PLUGIN_ID`、`HARNESS_RANGE`。
|
|
79
|
+
- 评审导出与整场导出的头部统一改读 `PLUGIN_ID`。
|
|
80
|
+
- `test/version.test.mjs` 立了闸门:两者不一致时测试直接失败,这个坑不会再犯。
|
|
81
|
+
|
|
82
|
+
## 8. 收尾追加:两处无争议加固(针锋相对评审搁置后)
|
|
83
|
+
|
|
84
|
+
原计划对 v0.2.36 范围方案做一轮「针锋相对」红队评审,因模型额度耗尽,在第一位专家完成发言后搁置(其观点已留档于会议目录的 `transcript.jsonl`)。搁置前只落地了两项**明确无争议**的小改动:
|
|
85
|
+
|
|
86
|
+
- **A3 收敛:`appendUtterance` 加串行锁**。`transcript.jsonl` 的追加原先无锁——`O_APPEND` 对单行小写入本身是原子的,但长行或生命周期事件竞态下仍有交错窗口。现在一次发言与追加共用一把会议级锁(`transcript:<stateRoot>:<meetingId>`),两条发言不可能写进彼此中间。
|
|
87
|
+
- **预算口径诚实化(P1 的保守处理)**。`usedTokens` 只累加**发言文本**的粗估(≈0.6 token/字),不含 system prompt、专家 persona、历史上下文与工具调用开销——它**不是真实账单**。此前 UI 与 `roundtable_status` 都把它直接标成 "token",等于让用户误以为那是花费。现在:
|
|
88
|
+
- `roundtable_status` 的预算行明确标注 `(spoken-text estimate only — NOT the real LLM spend)`;
|
|
89
|
+
- usage 第 8 条加入 HONESTY RULE,要求主持人在向用户报告时说明这一口径;
|
|
90
|
+
- README「预算熔断」条目同样标注。
|
|
91
|
+
|
|
92
|
+
> **未决(留给下一轮,需要先讨论再动)**:预算口径的**根本修法**(接宿主真实 usage 回调,还是改 UI 语义)、N3(预设承载 per-expert 预算 + persona 补充指令——红队已指出属职责越界)、N4(会议归档,红队指出 `archived` 与 `ended` 尚无行为差异定义)、N5(离线 smoke + 产物级断言)。
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 明确不做(范围红线)
|
|
97
|
+
|
|
98
|
+
向量化 RAG;外部 API 干活模型接入(Seedance 等);拓扑拖拽/缩放(B2);会议归档 / 只读模式(B4);跨会话越权改造(A1,见下);`/roundtable` 命令入口(只清账不补功能);npm 发布 / GitHub Release 闭环。
|
|
99
|
+
|
|
100
|
+
## 验证
|
|
101
|
+
|
|
102
|
+
- `tsc -p tsconfig.json --noEmit` 与 `tsc -p tsconfig.client.json --noEmit` **双端全绿**。
|
|
103
|
+
- `tsdown -c tsdown.config.ts` 构建通过(`lib/index.js` 161 kB / `lib/client.js` 528 kB)+ 双端 `--emitDeclarationOnly`,`lib/types/**` 完整(含新增 `kb-digest.d.ts`、`version.d.ts`)。
|
|
104
|
+
- `node --test` **56/56 全绿**。
|
|
105
|
+
- A2:坏行场景下清空返回 `{ cleared, malformed }`,文件内容为空、无残留 tmp。
|
|
106
|
+
- A5:`src` 内不再存在"定义了却无人使用"的字段/状态(`reasoningEffort` 已有读写路径;`archived` 已标注为预留;命令承诺已删除)。
|
|
107
|
+
|
|
108
|
+
## 已知限制
|
|
109
|
+
|
|
110
|
+
- **跨 Session 越权(A1)未收紧**:RPC 通道不暴露调用者 session 身份,同进程内其他会话只要知道会议 id,理论上可调用该会议的读写端点。现有防线是「会议归属 + 状态机」校验,不是身份校验。单人 / 单工作区无实际影响;多人共用同一 DSH 实例时请把它当作同一信任域。已在 README「已知限制」里明确标注。
|
|
111
|
+
- Host 侧并发写竞态(插件 stop/dispose 与文件写并发)仍暂缓;单进程内会议级写已由 `withMeetingLock` 串行化。
|
|
112
|
+
- `pnpm test` 使用 Node 标准测试运行器(每文件一个子进程)。在禁止子进程管道的环境(如 DSH 自带沙箱)会以 `spawn EPERM` 失败——那是环境限制而非测试失败,改用 `pnpm test:inline`(需 Node ≥ 22.8)。
|
|
113
|
+
|
|
114
|
+
## 升级提示
|
|
115
|
+
|
|
116
|
+
host 侧与 client 侧均有改动:**重启 DSH**,并刷新页面(如浏览器缓存了旧 client bundle,强刷一次)。偏好新增 `rolePresets` 字段,旧设置文件无需迁移(缺省 = 空列表);会议记录新增可选的 `kb-digest.json`,旧会议无此文件即为空缓存。
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# RoundTable v0.2.36
|
|
2
|
+
|
|
3
|
+
**对齐宿主 0.1.5-rc.2,并修掉"界面整个不出现"这一类故障:把两个可选能力从 load-gating 的 `inject` 里摘出来,给两个界面入口包上渲染错误边界,并把这条不变量钉成产物级测试。**
|
|
4
|
+
|
|
5
|
+
> 起点:用户反馈「Bug 有点多,目前无法调用界面」。本版先做**宿主版本体检**,再按可复现证据修,不做无证据的重写。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 0. 宿主版本体检(先回答"DSH 更到哪了")
|
|
10
|
+
|
|
11
|
+
实测(`registry.npmjs.org` 的 dist-tags + 本机实际运行的安装):
|
|
12
|
+
|
|
13
|
+
| 项 | 值 |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| `@deepseek-ai/dsh` `latest` / `next` | **0.1.5-rc.2** |
|
|
16
|
+
| `@deepseek-ai/dsh` `alpha` | 0.1.6-alpha.2(预发布线,未采用) |
|
|
17
|
+
| 本机运行的 DSH | 0.1.5-rc.2(`npm-cache\_npx\1e7f6d9597241db0`,`dsh --version` 同源) |
|
|
18
|
+
| 插件 devDependencies | 全部 0.1.5-rc.2(与运行时同源,无版本漂移) |
|
|
19
|
+
|
|
20
|
+
**结论:插件并没有落后于宿主。** 当前宿主正式线就是 0.1.5-rc.2,插件的 peer/dev 依赖已经指在 rc.2 上;`tsc`(宿主侧 + 浏览器侧)双绿、56 项单测全绿。所以本轮的"适配"不是追版本号,而是**修掉宿主 API 契约里被误用的两处 load-gating**——它们正是"界面调不出来"的成因。`0.1.6-alpha.2` 属于 alpha 线,本版不追;如需提前适配,另开一轮。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 1. 修复:`inject` 把可选能力当必需,缺一个就整个插件不加载("无法调用界面"的根因)
|
|
25
|
+
|
|
26
|
+
**机制**(cordis 4.0.2 实测):`inject` 的类型是 `string[] | 拦截配置对象`——**没有"可选注入"这种形式**,对象形式只是 per-service 拦截配置。因此 `inject` 里列出的每个服务都是**加载门禁**:只要有一个缺失,整个插件 fiber 停在 `PENDING`,于是 `roundtable_*` 工具、`/plugins/dsh-plugin-roundtable/*` 路由、Web GUI 的「圆桌会议」页签与设置页**一起消失**,而且**没有任何报错**——用户看到的就是"界面调不出来"。
|
|
27
|
+
|
|
28
|
+
**两处误用**:
|
|
29
|
+
|
|
30
|
+
| 位置 | 原值 | 问题 |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| 宿主 `src/index.ts` | `['tools','subagents','agents','systemPrompt','userQuestions','skills']` | `skills` / `userQuestions` 都是**可选能力**,插件本来就用 `ctx.get(...)` 可选读取。`skills.ts` 的模块注释把这点写成硬约束 #1:*"插件可以在没有挂载 skill 服务的 profile 里加载……绝不让插件加载失败"*——`inject` 却让它必然加载失败。 |
|
|
33
|
+
| 浏览器 `src/client/index.ts` | `['slots','locale','connection']` | `connection` 只是 RPC 的**兜底传输**(注释自己写着"OPTIONAL fallback")。列进 `inject` 后,缺少该服务的组合里页签与设置页**一个都不注册**。 |
|
|
34
|
+
|
|
35
|
+
**修法**:
|
|
36
|
+
|
|
37
|
+
- 宿主 `inject` 收敛为真正离开它就工作不了的四个:`['tools','subagents','agents','systemPrompt']`;可选能力继续走 `ctx.get(...)`(`skillRegistryOf()`、`userQuestions === undefined` 兜底分支原样保留,终于可达)。
|
|
38
|
+
- 浏览器 `inject` 收敛为 `['slots','locale']`;`connection` 改为运行时可选读取。注意 cordis 的 Context 代理在**没有 inject 时直接抛错**(`cannot get property "connection" without inject`),所以不能用属性访问——已改用 `ctx.get('connection')`(非严格,缺失返回 `undefined`)。
|
|
39
|
+
|
|
40
|
+
## 2. 修复:渲染崩溃被宿主静默摘掉,故障无迹可查
|
|
41
|
+
|
|
42
|
+
DSH 对渲染抛错的 slot 条目会做隔离(`onEntryError` + 条目退役)——隔离本身是对的,但对用户来说「圆桌会议」页签**就那么不见了**,没有任何提示。这正是"界面调不出来"这类反馈无法定位的原因。
|
|
43
|
+
|
|
44
|
+
**修法**:新增 `src/client/slot-boundary.tsx`,把两个入口(`conversation.view` 与 `settings.section`)都包进一个类组件错误边界:
|
|
45
|
+
|
|
46
|
+
- 崩溃时渲染一块**可读报错面板**(错误名 + 消息 + 反馈指引),不再无声消失;
|
|
47
|
+
- 同时 `console.error` 打出完整组件栈,方便直接贴 issue;
|
|
48
|
+
- 边界自身不渲染任何数据,不会成为第二个故障源;正常路径完全透明(原组件照旧收到 owner props + 标准席位 + inject face)。
|
|
49
|
+
|
|
50
|
+
## 3. 质量门禁:把这条不变量钉成产物级测试
|
|
51
|
+
|
|
52
|
+
新增 `test/inject.test.mjs`(零依赖,3 例),断言的是**构建产物 `lib/`**而不是源码——理由同 `version.test.mjs`:profile 是 `link:` 挂载,真正被加载的是 `lib/`,源绿而产物说谎的坑本项目已经踩过一次。
|
|
53
|
+
|
|
54
|
+
1. 宿主 `lib/index.js` 的 `inject` 不含 `skills` / `userQuestions`,且含四个必需服务;
|
|
55
|
+
2. 浏览器 `lib/client.js` 的 `inject` 不含 `connection`,并且**在一个没有 connection 服务的宿主形状 ctx 上**调用 `apply()` 时,仍必须注册两个界面入口(标签可解析、inject face 带 `rpc`/`t`);
|
|
56
|
+
3. 两个入口的组件都必须被错误边界包裹(`displayName` 以 `RoundTableBoundary(` 开头)。
|
|
57
|
+
|
|
58
|
+
> 这三条断言在旧产物上**必然失败**(旧 `lib/client.js` 导出的 `inject` 实测是 `["slots","locale","connection"]`),因此它们是真正防回归的闸门,不是同义反复。
|
|
59
|
+
|
|
60
|
+
## 4. 其它
|
|
61
|
+
|
|
62
|
+
- `HARNESS_RANGE` 由 `0.1.5-rc.1+` 更正为 `0.1.5-rc.2+`(导出物头部展示用,此前落后一个 rc)。
|
|
63
|
+
- 版本号推进到 0.2.36(`package.json` 与 `src/version.ts` 双处同步,由既有测试把关)。
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 验证记录
|
|
68
|
+
|
|
69
|
+
| 项 | 结果 |
|
|
70
|
+
| --- | --- |
|
|
71
|
+
| `tsc -p tsconfig.json --noEmit`(宿主) | 通过 |
|
|
72
|
+
| `tsc -p tsconfig.client.json --noEmit`(浏览器) | 通过 |
|
|
73
|
+
| `tsdown -c tsdown.config.ts` + 两条 `--emitDeclarationOnly` | 通过(`lib/index.js` 162.62 kB / `lib/client.js` 530.86 kB) |
|
|
74
|
+
| `node --test --test-isolation=none "test/*.test.mjs"` | **59/59 通过**(原 56 + 新增 3) |
|
|
75
|
+
| 浏览器产物隔离冒烟(模拟 `__ModuleLoader__` 执行 `lib/client.js`) | 两个入口均注册,`inject` 实测 `["slots","locale"]`,组件已被边界包裹 |
|
|
76
|
+
| 宿主产物导入冒烟 | `inject` 实测 `["tools","subagents","agents","systemPrompt"]` |
|
|
77
|
+
| 活宿主端到端(运行中的 `http://127.0.0.1:3080`) | `/plugins/dsh-plugin-roundtable/state` 200;RPC `roundtable/prefs.get`、`models.list`、`kb.list`、`feedback.list`、`user-actions.list`、`edge.add`/`edge.remove`、`prefs.set`(含 `rolePresets` 往返)全部 `ok:true` |
|
|
78
|
+
|
|
79
|
+
> 本版**未改**任何会议数据语义:诊断期间对 `cog-transparency-debate` 临时添加的一条连线已即时删除并复核列表还原,`roundtable` 偏好也已恢复基线。
|
|
80
|
+
|
|
81
|
+
## 生效方式(重要)
|
|
82
|
+
|
|
83
|
+
- **浏览器半体**:重建后刷新页面即可(DSH 对客户端 bundle 做版本化重哈希)。
|
|
84
|
+
- **宿主半体**(`inject` 收敛):需要**重启 DSH** 生效。
|