dsh-agent-board 1.5.1 → 1.6.1
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/README.md +47 -4
- package/index.mjs +57 -1441
- package/lib/client/board-list.js +204 -0
- package/lib/client/dashboard.js +420 -0
- package/lib/client/kernel.js +479 -0
- package/lib/client/task-detail.js +200 -0
- package/lib/client.js +602 -493
- package/lib/core.mjs +81 -2
- package/lib/dispatch.mjs +585 -0
- package/lib/health.mjs +130 -0
- package/lib/notify.mjs +157 -0
- package/lib/policy.mjs +49 -0
- package/lib/rpc.mjs +541 -0
- package/lib/session.mjs +60 -0
- package/lib/store.mjs +187 -0
- package/lib/usage.mjs +134 -0
- package/package.json +7 -5
- package/test/core.test.mjs +146 -5
- package/test/health.test.mjs +144 -0
package/README.md
CHANGED
|
@@ -83,6 +83,7 @@ dsh plugin --profile web remove dsh-agent-board
|
|
|
83
83
|
>
|
|
84
84
|
> - **归属**:看板文件按**会话**分文件,同时在文件里记 `ownerCwd`(创建该看板的会话工作区路径,取不到则省略该字段)——`~/.dsh/tasks-*.json` 每个文件是一块看板,`list-boards` 全局视图可看到本机所有板。
|
|
85
85
|
> - **重启继承**:DSH 重启后同一会话的根 id 可能漂移,此时新 id 没有对应文件——若同工作区(`ownerCwd` 严格相等)存在**唯一**「原主已不在 `agents.roots()`」的看板,则自动继承:文件重命名为新 id、文件内 `ownerSession` 改写为新 id、`console.error` 留一行 `[task-board] 继承看板 <旧sid> → <新sid>`;**多个候选一律不自动接管**(记一行日志后按空板处理,防误合并,旧板仍可在 `list-boards` 全局视图里看到)。
|
|
86
|
+
> - **写盘保护**:落盘走 临时文件+rename 原子写(EPERM/EBUSY 退避重试);瞬时读失败/坏文件隔离后返回的空板**禁止回写**(防一个"读不到"的瞬间把看板覆成空板),坏文件隔离为 `.corrupt-<时间戳>` 留档不丢数据。
|
|
86
87
|
|
|
87
88
|
## 功能总览
|
|
88
89
|
|
|
@@ -100,6 +101,7 @@ dsh plugin --profile web remove dsh-agent-board
|
|
|
100
101
|
|
|
101
102
|
- 仪表盘视图新增「Token 消耗」区:本看板累计总量 + 输入 / 输出 / 缓存读(缓存写非零时一并展示)拆分、按模型分布条形图、任务消耗 **Top 8**(标题可点击直达该任务详情);进行中的卡片右上角显示本任务已累计消耗(`⛁ 数字`)
|
|
102
103
|
- 数据来源:每次 Worker/Verifier run 结算时读该 run 的 v4 会话日志(`~/.dsh/sessions/*/<runId>/session.v4.jsonl.zstd`),把 `assistant/message` 事件的 `usage`(`inputTokens` / `outputTokens` / `cacheReadTokens` / `cacheWriteTokens` / `totalTokens`,字段形状以真实日志为准)按 zstd 帧逐帧累加到任务 `usage`(含按模型小计与 `runs` 计数,多轮重跑/驳回重做自动累加),`get-tasks` 再现算 board 级 `usageSummary`(总量 / 按模型 / Top8,不落盘额外表)——**只做展示、不做计费断言**,日志读不到或没有 usage 时一律显示「暂无数据」
|
|
104
|
+
- 「架构健康」区(架构自省 L1):`get-tasks` 顺带对**近 50 张卡**现算四信号(纯函数零存储:touches 声明热度 ≥8 次且占比 ≥40% / 带 touches 任务滞留中位数 >2 倍 / 任务时长 p90 >45min / 同路径驳回 ≥2 次),命中才在仪表盘渲染提示条(⚠️/ℹ️ 两级,最多 3 条)——让运行数据主动提示"该优化架构了"(如某文件反复成为锁热点=该拆),信号只建议不裁判
|
|
103
105
|
|
|
104
106
|
### 学习反馈(候选教训信号 → 主窗口沉淀)
|
|
105
107
|
|
|
@@ -133,6 +135,9 @@ draft → pending → in-progress → verifying → resolved → archived
|
|
|
133
135
|
### 一次性派发(v74 去池化)
|
|
134
136
|
|
|
135
137
|
- 每个任务 spawn 一个**一次性子代理**(Worker/Verifier),上下文全量注入 prompt,做完即销毁——无常驻池、无池化状态残留
|
|
138
|
+
- **预研上下文注入(contextFiles/contextNotes)**:主窗口调研时读过的文件与笔记,由 host 在派发时读盘取最新内容,经「上下文注入」区块提供给 Worker/Verifier(不混进 user prompt);预算口径单文件 8KB、总包 40KB
|
|
139
|
+
- **锚点行段**:`contextFiles` 支持 `path:L2350-L2420` / `path:L2350` 行段语法(只认尾部 `:L<行号>`,兼容 Windows 盘符),只注入该段(段长上限 400 行,超出截断并标注);锚点无效(越界/写法错)自动回退头部注入并标注「锚点无效,已回退头部」
|
|
140
|
+
- **截断结构索引**:头部注入被预算截断时,标注升级为「截断:共 N 行,已注入 1–M 行」,并附结构索引块(JS/TS 顶层函数/类/箭头赋值、Markdown 标题及行号,上限 40 条)——Worker 照索引用锚点语法补读目标段即可,不用全文盘点
|
|
136
141
|
- **Worker/Verifier 均可配置异构模型**(⚙️ 弹出层下拉选择,空 = 继承父级),避免同源盲点;模型故障自动熔断回退父级模型
|
|
137
142
|
- 孤儿回收:子代理 run 结束/丢失超 2 分钟 → 任务自动回待办重派
|
|
138
143
|
- 看门狗:运行超时且事件流停滞 → 标记"疑似卡死"(不自动杀,裁决权交主窗口/用户)
|
|
@@ -180,11 +185,14 @@ Team 托管档独有(调度员体验):
|
|
|
180
185
|
## 仓库结构
|
|
181
186
|
|
|
182
187
|
```
|
|
183
|
-
└── packages/dsh-agent-board/ #
|
|
184
|
-
│ ├── index.mjs # host
|
|
188
|
+
└── packages/dsh-agent-board/ # 插件全部源码
|
|
189
|
+
│ ├── index.mjs # host 端薄壳(~70 行):cordis 契约 + 共享 state 构建 + 模块接线
|
|
185
190
|
│ ├── lib/core.mjs # 纯逻辑核心:状态机/依赖/分类/prompt/解析(无 IO,可单测)
|
|
186
|
-
│ ├── lib
|
|
187
|
-
│ ├──
|
|
191
|
+
│ ├── lib/*.mjs # host 端领域模块(按任务边界拆分,见下节)
|
|
192
|
+
│ ├── lib/client/ # client 端模块源(按用户感知域拆分,见下节)
|
|
193
|
+
│ ├── lib/client.js # client 端产物(⚠️ GENERATED:scripts/build-client.cjs 拼装,勿直接编辑)
|
|
194
|
+
│ ├── scripts/build-client.cjs # 零依赖组装器(模块源 → 产物;--check 校验产物新鲜度)
|
|
195
|
+
│ ├── test/core.test.mjs # 单元测试(node --test,84 例)
|
|
188
196
|
│ ├── package.json # dsh.bundle.patch + dsh.client 元数据
|
|
189
197
|
│ └── cordis.patch.yml # bundle 挂载行
|
|
190
198
|
└── docs/
|
|
@@ -194,6 +202,41 @@ Team 托管档独有(调度员体验):
|
|
|
194
202
|
└── REGRESSION-v59.md # 端到端回归测试记录
|
|
195
203
|
```
|
|
196
204
|
|
|
205
|
+
### host 模块边界(lib/*.mjs)
|
|
206
|
+
|
|
207
|
+
v1.6.0 起 host 端从单体 index.mjs(1487 行)拆为薄壳 + 7 个领域模块,
|
|
208
|
+
共享闭包状态收进显式 `state` 对象逐模块注入——模块边界即任务边界,并行任务不再全员互锁:
|
|
209
|
+
|
|
210
|
+
| 模块 | 域 | 内容 |
|
|
211
|
+
|---|---|---|
|
|
212
|
+
| `policy.mjs` | 策略层 | 粒度治理软闸门 + 学习飞轮候选教训(纯函数零状态) |
|
|
213
|
+
| `usage.mjs` | 统计 | v4 会话日志定位 / zstd 分帧 / token usage 聚合(纯函数) |
|
|
214
|
+
| `session.mjs` | 会话 | root 解析缓存 / 会话 id 归一 / workMode 派生 / runsFor |
|
|
215
|
+
| `store.mjs` | 持久化 | boardPath / rt / wt 原子落盘 / 跨重启继承 / fileLocks 串行化 / mutateLocked |
|
|
216
|
+
| `notify.mjs` | 通知 | makeMsg / 歧义 25s 去抖 / 回执聚合 + 空闲门控 / 投递前过滤 |
|
|
217
|
+
| `dispatch.mjs` | 派发引擎 | poolCycle / spawnOneShot / settleRun / 两级超时 / 孤儿回收 |
|
|
218
|
+
| `rpc.mjs` | 接口层 | RPC 路由 + 13 个 Agent 工具注册 |
|
|
219
|
+
|
|
220
|
+
(store→dispatch 的循环依赖由 `deps.poolCycle` 晚绑定解开;index.mjs 对外 re-export 契约不变。)
|
|
221
|
+
|
|
222
|
+
### 前端模块边界(lib/client/)
|
|
223
|
+
|
|
224
|
+
dsh web 的 client 运行时不具备模块解析能力(entry 被整体读成字符串经 `new Function` 求值,
|
|
225
|
+
相对 import 是语法错误),所以前端模块化走**构建时拼装**:模块源在 `lib/client/`,
|
|
226
|
+
`npm run build-client`(pretest/prepublishOnly 已挂链)拼装成单文件产物 `lib/client.js`。
|
|
227
|
+
四个模块按**用户感知域**划分——边界即未来任务边界,新功能先想清楚落在哪个域:
|
|
228
|
+
|
|
229
|
+
| 模块 | 域 | 内容 |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| `kernel.js` | 底座(用户不可感知) | 渲染原语(ic/icText/ActorLink)、RPC 封装与轮询族、共享状态(state/listeners/notify)、图标(ICONS)、共享任务工具,以及面板骨架入口(BoardButton/ViewTab/TopPanel/slots.inject) |
|
|
232
|
+
| `board-list.js` | 看板列表 | 看板列与卡片(Card)、筛选条、多选批量操作条、建卡表单、归档列表 |
|
|
233
|
+
| `task-detail.js` | 任务详情 | 详情抽屉(编辑/流转/冻结/touches/历史会话/高优介入)、歧义裁决对话与候选教训沉淀、依赖区块 |
|
|
234
|
+
| `dashboard.js` | 仪表盘与设置 | 统计图表、Token 消耗、全局总览、报告生成、团队池视图、池/模型/超时设置与工作模式开关 |
|
|
235
|
+
|
|
236
|
+
四个模块拼进同一个 `apply(ctx)` 函数作用域(`var`/`function` 声明提升使跨模块引用与拼接顺序无关;
|
|
237
|
+
所有同步执行代码——DOM 监听、轮询注册、布局同步、slots.inject——都在 kernel 域内保持原相对顺序)。
|
|
238
|
+
改模块源后必须重新组装(`npm run build-client`)产物才更新;直接编辑 `lib/client.js` 会在下次拼装时被覆盖。
|
|
239
|
+
|
|
197
240
|
> v68 起拆除了"动态源码 → 静态包"的转换层(build-pkg.cjs):插件已稳定,
|
|
198
241
|
> 双形态维护的复杂度大于收益,包内文件即唯一源码,改完重启 dsh 即生效。
|
|
199
242
|
>
|