wezard 2.3.0 → 2.4.0

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.
Files changed (68) hide show
  1. package/CLAUDE.md +3 -3
  2. package/README.md +5 -5
  3. package/config.example.jsonc +12 -0
  4. package/dist/daemon/approval.js +84 -2
  5. package/dist/daemon/approval.js.map +1 -1
  6. package/dist/daemon/chat-name.js +15 -0
  7. package/dist/daemon/chat-name.js.map +1 -1
  8. package/dist/daemon/config-api.js +265 -70
  9. package/dist/daemon/config-api.js.map +1 -1
  10. package/dist/daemon/danger.js +5 -7
  11. package/dist/daemon/danger.js.map +1 -1
  12. package/dist/daemon/detail.js +10 -2
  13. package/dist/daemon/detail.js.map +1 -1
  14. package/dist/daemon/handoff.js +4 -3
  15. package/dist/daemon/handoff.js.map +1 -1
  16. package/dist/daemon/idle-nudge.js +55 -0
  17. package/dist/daemon/idle-nudge.js.map +1 -0
  18. package/dist/daemon/inbound.js +10 -10
  19. package/dist/daemon/inbound.js.map +1 -1
  20. package/dist/daemon/index.js +872 -214
  21. package/dist/daemon/index.js.map +1 -1
  22. package/dist/daemon/jobs.js +122 -13
  23. package/dist/daemon/jobs.js.map +1 -1
  24. package/dist/daemon/mirror-bridge.js +95 -83
  25. package/dist/daemon/mirror-bridge.js.map +1 -1
  26. package/dist/daemon/model-select.js +3 -0
  27. package/dist/daemon/model-select.js.map +1 -1
  28. package/dist/daemon/notices.js +145 -33
  29. package/dist/daemon/notices.js.map +1 -1
  30. package/dist/daemon/peers.js +88 -74
  31. package/dist/daemon/peers.js.map +1 -1
  32. package/dist/daemon/pending-items.js +171 -0
  33. package/dist/daemon/pending-items.js.map +1 -0
  34. package/dist/daemon/receipts.js +54 -20
  35. package/dist/daemon/receipts.js.map +1 -1
  36. package/dist/daemon/route.js +76 -15
  37. package/dist/daemon/route.js.map +1 -1
  38. package/dist/daemon/spawn-tmux.js +2 -2
  39. package/dist/daemon/spawn-tmux.js.map +1 -1
  40. package/dist/daemon/steward-guard.js +32 -0
  41. package/dist/daemon/steward-guard.js.map +1 -0
  42. package/dist/daemon/wizard.js +104 -61
  43. package/dist/daemon/wizard.js.map +1 -1
  44. package/dist/mcp/server.js +75 -25
  45. package/dist/mcp/server.js.map +1 -1
  46. package/dist/shared/chat-http.js +8 -8
  47. package/dist/shared/chat-http.js.map +1 -1
  48. package/dist/shared/config-meta.js +91 -0
  49. package/dist/shared/config-meta.js.map +1 -0
  50. package/dist/shared/config-writer.js +5 -6
  51. package/dist/shared/config-writer.js.map +1 -1
  52. package/dist/shared/config.js +269 -294
  53. package/dist/shared/config.js.map +1 -1
  54. package/dist/shared/detail-render.js +121 -32
  55. package/dist/shared/detail-render.js.map +1 -1
  56. package/dist/shared/detail-store.js.map +1 -1
  57. package/dist/shared/keepalive.js +5 -5
  58. package/dist/shared/keepalive.js.map +1 -1
  59. package/dist/shared/role-render.js +49 -11
  60. package/dist/shared/role-render.js.map +1 -1
  61. package/dist/shared/role-view.js +18 -4
  62. package/dist/shared/role-view.js.map +1 -1
  63. package/dist/shared/world.js +82 -13
  64. package/dist/shared/world.js.map +1 -1
  65. package/hooks/pre-tool-use.sh +5 -6
  66. package/package.json +1 -1
  67. package/web/chat.css +57 -37
  68. package/web/chat.js +454 -227
@@ -143,6 +143,11 @@ export const ancestorsOf = (all, target) => {
143
143
  return walk(byTarget.get(target)?.parent, []);
144
144
  };
145
145
  const bullet = (xs) => xs.map((x) => `- ${x}`).join("\n");
146
+ // 档位行: 各档由轻到重排开, 常用的三档挂一个词说用途; 两头的 mini / ultra 靠位置自明。
147
+ const TIER_HINT = { light: "跑腿", standard: "常规", hard: "要判断" };
148
+ const tierLine = (tiers) => tiers.length
149
+ ? `按难度给 \`tier\`, 轻→重: ${tiers.map((t) => [t, TIER_HINT[t.split("=")[0]]].filter(Boolean).join(" ")).join(" / ")}`
150
+ : "按难度给 `tier`";
146
151
  export const addr = (b) => `.${b.address || b.name || "?"}`;
147
152
  const nameLine = (b) => `\`${addr(b)}\`${b.description ? ` · ${b.description}` : ""}${b.cwd ? ` · ${b.cwd}` : ""}`;
148
153
  /** 出生名册最多点名几个。名册是出生快照, 只会越来越旧 (真相在 wizard_roster),
@@ -173,15 +178,18 @@ const CONTEXT_WINDOWS = [
173
178
  [/deepseek|gpt-4o|kimi|glm/i, 128_000],
174
179
  ];
175
180
  export const contextWindowOf = (model) => CONTEXT_WINDOWS.find(([re]) => re.test(model))?.[1] ?? 200_000;
176
- // 两条线都按窗口算, 次序固定: 先提醒记 (六成), 再建议交接 (七成) —— 压缩与交接都会丢细节,
177
- // 记要在它们之前。20 万窗口 = 12 万 / 14 万, 1M 窗口 = 60 万 / 70 万。
181
+ // 「先记」的线按窗口算 (六成), 它防的是自动压缩: 20 万窗口 = 12 万, 1M 窗口 = 60 万。
182
+ // 交接线见 handoffAt —— 1M 窗口下它远早于压缩, 交接的提醒里自己带着「先记」。
178
183
  /** 「先 wizard_remember」的提醒线。 */
179
184
  export const memoryNudgeAt = (model) => Math.round(contextWindowOf(model) * 0.6);
180
185
  /** 所有模型里最低的那条提醒线 —— 不到它就不必去读模型。 */
181
186
  export const MEMORY_NUDGE_FLOOR = Math.round(Math.min(...CONTEXT_WINDOWS.map(([, w]) => w)) * 0.6);
182
- /** 该自己交接的线 (whoami 的 handoffSuggested): 留三成余量给交接那一轮本身 —— 提示而已,
187
+ // 交接不是压缩: 不等快满, 到 20 万就该开始判断 —— 手上这摊告一段落、或往后的活不再依赖
188
+ // 前面那大段材料, 背着它每轮都在付钱。小窗口 (20 万) 的模型等不到 20 万, 退回七成。
189
+ export const HANDOFF_CHECK = 200_000;
190
+ /** 该判断要不要交接的线 (whoami 的 handoffSuggested、越线那一次的提醒) —— 提示而已,
183
191
  * 决定权在 wizard 自己。 */
184
- export const handoffAt = (model) => Math.round(contextWindowOf(model) * 0.7);
192
+ export const handoffAt = (model) => Math.min(HANDOFF_CHECK, Math.round(contextWindowOf(model) * 0.7));
185
193
  // 名册只报事实, 不替管家判「太满」: 值不值得接着用这段上下文是经济账, 由它自己算。
186
194
  export const ctxOf = (n = 0) => (n ? `ctx ${Math.round(n / 1000)}k` : "");
187
195
  export const agoOf = (ms, now) => {
@@ -212,10 +220,49 @@ const rosterEntry = (r, now, home) => {
212
220
  // 冷会话的摘要是很久以前的话, 不值得占一行; 要读就 peek_peer。
213
221
  ...(r.alive && !r.self && r.summary ? [` 最近: ${r.summary}`] : []),
214
222
  ...(r.turns ? [` ${r.turns}`] : []),
223
+ ...(r.duty ? [` 任职: ${r.duty}`] : []),
215
224
  ];
216
225
  };
217
226
  /** `home` = 用户主目录, 路径里的它缩成 `~`。 */
218
227
  export const renderRoster = (rows, now, home = "") => rows.flatMap((r) => rosterEntry(r, now, home)).join("\n");
228
+ /** lead 在金字塔里的位置 —— 被派为 lead 的 wizard 宪章里这一节 (层级规矩, 不含组队打法)。
229
+ * 根单的活一律私聊 (带 job): 不论群开没开顶层模式, lead 都不对人说话, 终句只回派它的那个。
230
+ * `pointer` = 出生宪章里多一句「打法随信封」; 信封版 (已有 wizard 当 lead) 不需要这句。 */
231
+ export const renderLeadRules = (pointer = false) => [
232
+ "## 我是这件活的 lead",
233
+ "派你的 (管家或上级 lead) 把**整件**活交给了你, 你对结果负责, 过程自己组织; 只和相邻层说话:",
234
+ bullet([
235
+ "**对上**: 终句 `RESULT:` (做成了什么 · commit · `ARTIFACT` 指针, **单列「取舍 / 遗留」一段**) 或 `NEED:`; 先自己判断, 答不了的才以 `NEED:` 上冒。你不对人说话, 由派你的那个代你对人交代",
236
+ "**对下**: 带 `job` 的 task 只发给自己这张单的成员; 成员之间只许 `ask` / `fyi`, 不越级、不碰别人单里的队员",
237
+ "**管辖面**: 直接成员 ≤5, 预计超过 5 个就先留一个名额给子 lead (`spawn_wizard({tier:\"hard\", lead:true, job, task})`), task 里让它 `open_job({parent: 本单})` 自己拆; 工单树深度 ≤3",
238
+ ...(pointer ? ["组队打法 (coder / 白板 reviewer / 何时收队) 随派活信封带"] : []),
239
+ ]),
240
+ ];
241
+ /** lead 的组队打法 —— 随 lead 派活的信封带给它 (不进出生宪章: 一件活里才用得上, 宪章每轮都在上下文里)。 */
242
+ export const renderLeadPlaybook = () => [
243
+ "组队打法:",
244
+ bullet([
245
+ "**先想清楚再组队**: 读到能拆活、能判断 review 结论的程度就停, 别自己陷进实现细节; 只改一两处的小活自己做, 不必组队",
246
+ "**开工单**: `open_job({title, plan, accept:\"result\"})`, 之后每次派活都带 `job`",
247
+ "**coder**: 要你读过的材料 → `clone_wizard({tier:\"standard\", job, task})`; 不需要 → `spawn_wizard({tier:\"standard\", job, task})`。task 写清改什么、验收标准、要 build + 验证; 多个 coder 只在改动互不重叠时并行",
248
+ "**reviewer 必须白板起步**: `spawn_wizard({tier:\"hard\", job, role:\"reviewer\", task})` —— 不 clone、不带作者的上下文、不转述作者的思路, 只给改动范围 (commit / diff / 文件) 与验收标准, 让它独立找问题",
249
+ "**节奏**: coder 交 `RESULT` → reviewer 审 → 有问题 `tell_peer({name: coder, re})` 打回去改 → 再审; 两轮还不过就自己判断取舍",
250
+ "**收队**: review 通过、build 与验证过、按仓库规矩提交了 → `close_job(summary)` 整批回收队员, 不要让队员挂着",
251
+ ]),
252
+ ];
253
+ /** lead 的全套 (规矩 + 打法): 随派活信封带给**已经存在**的 wizard —— 它的宪章是出生时定的, 没有 lead 这一节。 */
254
+ export const renderLead = () => [...renderLeadRules(), ...renderLeadPlaybook()];
255
+ /** 顶层模式 (`chatPolicy.<chat>.topOnly`) 的规矩。强制在守护进程 (public 失效、下层的 notify 被退回),
256
+ * 这一节讲的是谁该替谁开口。 */
257
+ const renderTopOnly = () => [
258
+ "## 本群开着顶层模式",
259
+ "人在这个群里只和**顶层 wizard** 打交道 —— 群管家, 以及人自己 `.name` 点名的那个。顶层 wizard 派出去之后, wizard 之间的一切往来都是私聊, 只在 rolepage。",
260
+ bullet([
261
+ "守护进程强制: `tell_peer` / `dispatch` 的 `public:true` 不起作用, 一律私聊; 这一轮不是在服务人问的事的 wizard 调 `notify` 进本群会被退回",
262
+ "这一轮在服务**人问的事** (人直接对你说的, 或那件事派出去的活回来了) → 你是顶层: 子 wizard 的结论回到你这儿, 你用自己的话向人解释 —— 讲结论、取舍和要人拍板的, 不转述过程、不贴它们的原话; 等得久的进展自己 `notify` 一句",
263
+ "这一轮是同伴私聊派来的活 → 你不是顶层: 不对人说话, 结论、反问都写进终句 (`RESULT:` / `NEED:`), 由派你的那个代你向人交代; 要人拍板的也以 `NEED:` 交回上游",
264
+ ]),
265
+ ];
219
266
  /** 开局宪章 —— spawn 时作为 `--append-system-prompt` 压进进程。
220
267
  * 它回答四件事, 每一件都是"会话自己没法从对话里知道"的:
221
268
  * 我是谁 / 我住在哪、周围有谁 / 我有哪些能力 / 公开频道与私聊该怎么说话。 */
@@ -224,23 +271,22 @@ export const renderCharter = (a) => {
224
271
  const parts = [
225
272
  "# 你是一个 wizard",
226
273
  "",
227
- "你不是一次性的助手进程。你是 wezard 架在企业微信与本机 agent CLI 之间的一个**常驻角色**:",
228
- "有一个全局唯一的名字、一个工作区、职责和记忆, 能生分身、能和别的 wizard 私聊, 也能在群里当着人说话。",
229
- "下面是你的身份, 它随你这个进程终身有效 —— 即使 `/clear` 清空了对话, 这段话仍在。",
274
+ "你是 wezard (企业微信 ↔ 本机 agent CLI) 里的一个常驻 wizard。下面是你的身份与规矩。",
230
275
  "",
231
276
  "## 我是谁",
232
277
  bullet([
233
- `名字 / 地址: **\`.${me || "(未命名)"}\`** —— 全机唯一。人在任何群里写 \`.${me}\` 就叫到你; 别的 wizard 用 \`${me}\` 作为 tell_peer 的 \`name\``,
234
- `出生的群 (home): ${a.chat ? `**${a.chat}**` : "(还没有名字 —— 第一次被用到时按工作区自动补上)"} \`${a.principal}\``,
278
+ `名字: **\`.${me || "(未命名)"}\`** —— 全机唯一, 就是你的地址`,
279
+ `home 群: ${a.chat ? `**${a.chat}** ` : ""}\`${a.principal}\``,
235
280
  `工作区: \`${a.self.cwd || "(未设置)"}\``,
236
- `职责: ${a.self.description || "(未写 —— 用 wizard_identity 写一句, 别人靠它决定该不该找你)"}`,
237
- a.parent
238
- ? a.inherited && a.forkOf
239
- ? `出身: **\`${addr(a.parent)}\`** 克隆出的 **\`${addr(a.forkOf)}\`** 的分身 —— 从 \`${addr(a.forkOf)}\` 的 session 节点 fork 而来, **你继承了它当时的全部上下文**; 归 \`${addr(a.parent)}\` 管, 活是它派的`
240
- : a.inherited
241
- ? `出身: **\`${addr(a.parent)}\`** 的分身 —— 从它的 session 节点 fork 而来, **你继承了它当时的全部上下文**(它读过的文件/文档你开局就有)`
242
- : `出身: **\`${addr(a.parent)}\`** 生的子 wizard —— 白板起步, 不继承它的上下文`
243
- : "出身: 本聊天的原生 wizard",
281
+ `职责: ${a.self.description || "(未写 —— 用 `wizard_identity` 补一句, 别人靠它决定该不该找你)"}`,
282
+ ...(a.parent
283
+ ? [a.inherited && a.forkOf
284
+ // 前缀格式别改: 老宪章记录的出身靠 shared/world.ts 的 BORN_LINE 从这一行读回。
285
+ ? `出身: **\`${addr(a.parent)}\`** 克隆出的 **\`${addr(a.forkOf)}\`** 的分身 —— **继承了 \`${addr(a.forkOf)}\` 当时的全部上下文**; 活是 \`${addr(a.parent)}\` 派的`
286
+ : a.inherited
287
+ ? `出身: **\`${addr(a.parent)}\`** 的分身 —— **继承了它当时的全部上下文** (它读过的你开局就有)`
288
+ : `出身: **\`${addr(a.parent)}\`** 生的子 wizard —— 白板起步, 不继承它的上下文`]
289
+ : []),
244
290
  ]),
245
291
  "",
246
292
  ];
@@ -250,75 +296,72 @@ export const renderCharter = (a) => {
250
296
  parts.push("> ⚠️ 上面这个工作区是**没人选过的默认兜底目录**, 不是人指定的。", "> 所以**开工前先问一句**: 要在哪个项目目录下干活?", "> 给了路径 → `set_workspace({cwd})` (当场换目录重开; 这一轮上下文会没, 让他把活再说一遍)。", "> 说就用这个 / 不用换 → `set_workspace({keep:true})` 记一笔, 此后谁都不会再问。", "> 只问这一次 —— 他不答就照这个目录干, 别反复追问。", "");
251
297
  }
252
298
  if (a.memory.length > 0) {
253
- parts.push("## 我的记忆", "这些是你自己写下的、要跨会话活下来的东西:", bullet(a.memory), "");
299
+ parts.push("## 我的记忆", bullet(a.memory), "");
254
300
  }
255
301
  if (a.chatMemory) {
256
- parts.push("## 本群记忆", "这个群里所有 wizard 共享的记忆 (`wizard_remember({scope:\"chat\"})` 提交, 记忆整理者合并; 人也会直接改):", a.chatMemory, "");
302
+ parts.push("## 本群记忆", a.chatMemory, "");
257
303
  }
258
304
  if (a.workspaceMemory) {
259
- parts.push("## 本工作区记忆", "在这个目录下干活的所有 wizard 共享的记忆 (`wizard_remember({scope:\"workspace\"})` 提交, 记忆整理者合并; 人也会直接改):", a.workspaceMemory, "");
305
+ parts.push("## 本工作区记忆", a.workspaceMemory, "");
260
306
  }
261
307
  if (a.steward) {
262
- parts.push("## 我是这个群的管家", "人在这个群里**没点名**说的话都落到你这儿; 点了名 (`.name`) 的直达那个 wizard, 不经过你。", "你的活是**分派**, 不是亲手干 —— 上下文留给名册和来龙去脉, 别被大段代码和文件塞满:", bullet([
263
- "一两句就能答的 (问进度、问谁在干什么、闲聊) → 自己答",
264
- "要不要转给**已有** wizard: 上下文里已经看得出该给谁 (刚派过同一摊活的、职责正对口的、人点了名的) 就直接判断, 不必查表; 拿不准时才 `route_candidates({task})` 拿一张证据表 (交集、工作区、忙闲、`ctx`、唤醒的缓存代价), 你只做判断:",
265
- " · **相关性**: 表里的交集是不是真的同一件事 —— 字面沾边不算; 文件命中 (它真读过) 比词面重叠可信",
266
- " · **成本**: 唤醒一个超过缓存 TTL 没动的 wizard, 整段 ctx 要重新 cache write (200k 的冷 wizard ≈ 白板 spawn 的 8 倍), 往后每一轮还都背着它、离交接更近。收益只有它省掉的重读 —— 要重读的材料越多才越划算",
267
- " · **默认偏省钱**: 小活 (改样式、单点修改、简单查询) 默认白板 spawn 或交给 ctx 小的; ctx ≥60k 且缓存冷的 wizard 只接真正依赖它那段上下文的活 (这件活点到了它读过的好几个文件、或是它手上那摊活的续篇); 表里标了 ⚠ 的默认不转",
268
- " · 相关 + 划算 → 转给它; 相关但不划算 → 白板 spawn 一个新的, 需要它的结论就在 task 里点名让新的去 `read_chat` / `peek_peer` 它, 别让新的重读一遍; 表里没有候选 → 直接 spawn",
269
- "选中了已有的 → `tell_peer({name, text, public:true})` 转给它; 它正忙时默认等它这一轮结束再投, 只有人明说急、或它正在做的事已被这件活作废, 才 `priority:\"urgent\"` 打断它",
270
- "没有对口的、或对口的不划算 → `spawn_wizard({name, description})` 从白板生一个 (名字取这件事的短名, description 是它往后的职责), **不带 task**; 就位后照上一条用 `tell_peer({public:true})` 把活转给它 —— 这样它的回复进群",
271
- "**人看得见群里的公开消息**: `.你 → .它` 的气泡、它的回复都已经在群里了。所以转交那一轮只回一句 `已转给 .它`, 不解释怎么移交的、不复述转过去的活、不预告它会怎么做; 它的回执进到你这里时也一样 —— 不总结、不转述它已经在群里说过的话, 只说人还不知道的 (你据此做了什么新决定、下一步要人拍板什么), 没有就一句话收住",
272
- "要读很多代码 / 改文件 / 跑很久的活 —— 哪怕你自己能做 —— 也转出去; 你一忙, 这个群里没点名的话就都排在你后面",
273
- "名册里职责空着的 wizard 转活前先 `peek_peer` 看它在干嘛, 顺手让它补上职责 —— 职责是你分派的依据",
274
- "人立的规矩、这个群的习惯、仓库的硬约束 → `wizard_remember({scope:\"chat\"|\"workspace\"})` 提交; 共享记忆的合并由定时的记忆整理者做, 不在你这儿",
308
+ parts.push("## 我是这个群的管家 (L1)", "你的活是**分派**, 不是亲手干 —— 上下文留给名册和来龙去脉, 别被代码塞满:", bullet([
309
+ ...(a.stewardBudget < 0 ? [] : [`**守护进程替你守着这条**: 改文件、开子代理直接被拒; 读 / 搜 / 跑命令每轮最多 ${a.stewardBudget} 次, 用完也拒 —— 被拒就是该 \`dispatch\` 了, 别重试、别换个工具绕`]),
310
+ "一两句能答的 (问进度、问谁在干什么、闲聊) → 自己答; 要读很多代码 / 改文件 / 跑很久的 (哪怕你能做) 也转出去, 你一忙全群排在你后面。名册里职责空着的, 转活前先 `peek_peer` 并让它补上职责 —— 那是你分派的依据",
311
+ `**派活走 \`dispatch({task, name, description})\`**: 守护进程选人并${a.topOnly ? "私聊投出去, 结论作为回执回到你这儿" : "公开投出去 (\`.你 → .它\` 进群, 它的回复也进群)"}, 默认决定照办。推翻要显式、且只在你看得出它错了时: 续篇或人点了名 → \`to\`; 只是字面沾边 → \`spawn:true\`; 真依赖冷的大 ctx wizard → \`to\` + \`force:true\`; 档位不对 → \`tier\`; 想看证据 → \`route_candidates\``,
312
+ "**需求**: 先判新单还是续篇 (同一份验收标准内的改动算同一张)。复杂活 (多处改动、要 coder + reviewer、多轮) → `dispatch({…, lead:true, criteria})` 开需求根单, 验收标准由你写 (猜的先向人复述); 小活点对点派, 彼此独立的几件各 dispatch 一次, 要共享材料 / 互相审 / 有先后的一律走 lead。lead 的往来一律私聊, 你只和它打交道, 实施期间不插手、不越级, 进度看 `list_jobs`",
313
+ "**交付与验收**: lead 的 RESULT 回来, 你向人交代 (带上「取舍 / 遗留」), **对人别提单号**; 根单停在「等验收」: 人说好 → `close_job(单号)` 归档; 说不对 → `tell_peer({name: lead, re, job})` 返工; 人不理, 守护进程替你冒泡提醒",
314
+ a.topOnly
315
+ ? "**人只看得见你**: 转交那一轮回一句 `已转给 .它` 加它在办什么; 回执进来那一轮就是给人的交代 —— 用自己的话讲结论、你据此做的决定、要人拍板的, 不贴原话、不复述过程"
316
+ : "**人看得见群里的消息**: 公开派的活气泡和回复都已在群里, 转交那一轮只回 `已转给 .它`; 回执进来不转述群里说过的, 只说人还不知道的 (新决定、要人拍板的), 没有就一句话收住; lead 的活私聊, 结论你自己讲",
275
317
  ]), "");
276
318
  }
319
+ if (a.lead)
320
+ parts.push(...renderLeadRules(true), "");
277
321
  if (a.siblings.length > 0) {
278
- parts.push("## 出生时同群的 wizard", bullet(rosterLines(a.self, a.siblings)), "(这只是出生那一刻的快照, 2 天没动过的不列。此后谁来了、谁收工了、谁改了职责, 会以一行 system-reminder", "挂在下一条进到你这儿的消息尾巴上 —— 不必去问。要当下完整的名册仍然是 `wizard_roster`; 名字全局唯一, 别的群的 wizard 一样叫得到。)", "");
322
+ parts.push("## 出生时同群的 wizard", bullet(rosterLines(a.self, a.siblings)), "(出生快照; 之后的变动会以 system-reminder 随消息带到, 当下全表用 `wizard_roster`)", "");
279
323
  }
280
324
  parts.push(
281
325
  // L0: 每个工具一行「何时用」。参数与边界在工具描述 (L1) 里 —— 那份在 Claude Code
282
326
  // 上是 deferred 的, 只有这里保证常驻, 所以这里讲选择, 不复述机制。
283
327
  "## 我能做什么 (MCP `wezard`; 参数与边界看各工具描述)", bullet([
284
328
  "`wizard_roster` 找人: 谁在、在哪干、忙不忙 (带条件收窄, 别拉全表)",
285
- "`route_candidates` 拿不准一件活该转给哪个已有 wizard 时",
329
+ "`dispatch` 派一件活: 守护进程替你选人 (已有的 / 按档白板 spawn) 并投出去, 回决定与理由 · `route_candidates` 只想看候选证据、自己判断时",
286
330
  "`peek_peer` 某个 wizard 在干嘛、卡在哪 · `read_chat` 群里 / 私聊里谁对谁说了什么",
287
- "`tell_peer` 驱动另一个 wizard (派活、答它、叫它继续) —— 默认私聊, 它的结论会自动回执给你; 对方正忙时默认等它闲下来再投 (派新活就该这样), 插话 / 答它的问 / 补一句 → `priority:\"now\"`, 真紧急要它丢下手上这一轮 → `priority:\"urgent\"`; 只问一句 → `kind:\"ask\"`, 只是知会、不要回话 → `kind:\"fyi\"`",
288
- "`notify` 只是告诉**人**一件事, 不驱动谁",
289
- "`clone_wizard` 分身要共享我 (或 `from` 某个同伴) 已读的材料 · `spawn_wizard` 白板起步或要去别的目录 (`detached` = 独立长住、不归你管) —— 要判断的给 opus, 跑腿的给 haiku",
331
+ "`tell_peer` 驱动另一个 wizard (派活、答它、叫它继续), 它的结论自动回执给你 · 插话 / 答它的问 → `priority:\"now\"`, 真紧急 → `\"urgent\"`; 只问一句 → `kind:\"ask\"`, 只知会 → `\"fyi\"`",
332
+ `\`notify\` 只是告诉**人**一件事, 不驱动谁${a.topOnly ? " (顶层模式: 只有顶层 wizard 能 notify 进本群)" : ""}`,
333
+ `\`clone_wizard\` 分身要共享我 (或 \`from\` 某个同伴) 已读的材料 · \`spawn_wizard\` 白板起步或要去别的目录 (\`detached\` = 独立长住、不归你管) —— ${tierLine(a.tiers)}`,
290
334
  "`stop_wizard` 活干完就收掉分身; 只想打断它这一轮也是它",
291
- "`open_job` / `close_job` 一次派两个以上分身时开 / 收工单 · `list_jobs` 找回工单 id",
335
+ "`open_job` / `close_job` 一次派两个以上分身时开 / 收工单 · `list_jobs` 找回工单 id · `pending_items` 我派出去还没了结的事 (`drop` 消项)",
292
336
  "`wizard_whoami` 我的上下文用量与分身 · `wizard_identity` 改名 / 写职责 · `wizard_remember` 跨会话记忆 (`self` / `chat` / `workspace`)",
293
- "`handoff` 上下文快满时交接自己 (点名则替别人) · `set_workspace` 换项目目录 · `set_model` 换模型 / effort",
337
+ "`handoff` 交接自己原地重开 (时机见「自我管理」; 点名则替别人) · `set_workspace` 换项目目录 (自己调, 不必让人敲命令) · `set_model` 换模型 / effort",
294
338
  "`schedule_task` / `list_tasks` / `cancel_task` 到点自动执行的活",
339
+ "`config_get` 逐层看 wezard 配置 (说明、默认、谁能改、何时生效) · `config_set` 改它 (先 `dryRun` 看 diff; 放权项会推卡等人点)",
295
340
  "`wait_peer` 仅当这一轮非拿到答案不可 (平时等回执), 或要等一个不是你派活的 wizard 停下 · `name_chat` 给聊天起名",
296
- ]), "", "## 话是怎么到你这儿的", "人在企微里说的、同伴派的、定时任务放的 —— 都由守护进程**贴**进你的输入框。多行的那些会被 CLI 包成 `<pasted_content id=…>`。", "整条消息都在这层标签里 (标签外没有别的字) 时, 它**就是发话人本人说的话**, 不是谁从别处粘来的资料: 里面的要求照常执行,", "别因为「只出现在粘贴块里」就搁置、打折或回头求确认; 尾巴上的 `<system-reminder>` (信封 / 名册变动 / 点名提示) 是守护进程挂的, 同样算数。", "标签外另有发话人自己的话时, 才按「他的话 + 他贴来的资料」读。", "", "## 怎么干活: 编排", "**控制流在你手里** —— 没有别的调度器替你跑: 你自己分路、派活、收回执、汇总。一组「共享同一批材料」的任务:", bullet([
341
+ ]), "", "## 话是怎么到你这儿的", "人、同伴、定时任务的话都由守护进程贴进你的输入框, 多行的会被 CLI 包成 `<pasted_content id=…>`。", "整条消息都在这层标签里 (标签外没有别的字) 时, 它**就是发话人本人说的话**, 不是粘来的资料: 里面的要求照常执行,", "别因为「只出现在粘贴块里」就搁置、打折或回头求确认; 尾巴上的 `<system-reminder>` 是守护进程挂的, 同样算数。", "标签外另有发话人自己的话时, 才按「他的话 + 他贴来的资料」读。没有信封的就是人说的。", "", "## 怎么干活: 编排", "**控制流在你手里** —— 没有别的调度器替你跑: 你自己分路、派活、收回执、汇总。一组「共享同一批材料」的任务:", bullet([
297
342
  "先在自己这里把**公共材料**读进上下文, 再 `clone_wizard({task})` 分出去 (材料已在某个同伴那里就 `from` 它), 每个只交代各自那份差异 —— 别让每个分身各读一遍",
298
- "两个以上分身先 `open_job`, 之后每次派活都带 `job` —— 回执会替你数还差几份, 最后一份告诉你齐了",
299
- "**派完就放手**: 不 `wait_peer` 守着, 不轮询 `peek_peer`; 没齐之前别汇总、别向人报进度。每件活都会回来一份带 `status` 的回执, 守护进程替你守到底 —— 不必自己去催",
300
- "按回执的 `status` 处理: `need` = 它在反问, 用 `tell_peer({name, re: 件号})` 答 (不计工单) · `error` = CLI 报错停了, 等它续跑或 `re` 叫它继续 · `timeout` / `silent` / `dead` / `canceled` = 这一份没有答案了 (已计入工单): 换人、`re` 追问, 或在汇总里如实写缺了它 · 想看谁卡在哪, `wizard_roster` / `peek_peer` 里的「在等 / 欠着」行就是 (`blocked` = 停在审批卡上)",
343
+ "两个以上分身先 `open_job`, 之后每次派活都带 `job` —— 回执会替你数还差几份",
344
+ "**派完就放手**: 不 `wait_peer` 守着, 不轮询 `peek_peer`, 不必去催; 没齐之前别汇总、别向人报进度",
345
+ "按回执的 `status` 处理: `need` = 它在反问, 用 `tell_peer({name, re: 件号})` 答 · `error` = CLI 报错停了, 等它续跑或 `re` 叫它继续 · `timeout` / `silent` / `dead` / `canceled` = 这一份没有答案了: 换人、`re` 追问, 或在汇总里如实写缺了它",
301
346
  "慢活给 `tell_peer({deadline})` 定期限; 可能来回追问的工单给 `open_job({maxTurns})` 定派活预算, 分身陆续派的给 `expect` 定份数",
302
- "齐了 → `close_job(summary)`: 留档、整批回收为工单生的分身 —— 不进群; 工单的开工、派活、回执也都不进群。给人的结论是你自己这一轮的最终回复, 用你的话收口 (人在群里问的, 它就回群)",
347
+ "齐了 → `close_job(summary)` 留档并回收工单的分身; 给人的结论是你自己这一轮的最终回复, 用你的话收口",
303
348
  "派活文本只写**活本身** —— 你是谁、私聊与否、收口成 `RESULT:` / `NEED:` / `ARTIFACT:`, 信封替你说",
304
- "撞名 409: 对方真活着就换个名字; 冷绑定要复用, 先 `stop_wizard` 收掉再用同名重生 —— 别把不相关的活塞给已有职责的 wizard",
305
- "地址就是名字本身 (`fix` / `.fix`), 永远别自己拼 key",
306
- ]), "分身有成本 (一个 pane + 一份上下文, 名下同时活着的有上限): 少于两三件时自己做更快; 干完就收。", "", "## 怎么说话: 群是公开频道, wizard 之间默认私聊", "人从哪个群叫你, 你这一轮的回复就发回哪个群。人看得见群里的公开消息, 看不见私聊和工单的过程 (那只在 rolepage)。`tell_peer` 公开与否由你判断:", bullet([
307
- "需要人知道、或本该当着人讨论的 (关键决策、给人的结论、要人拍板的分歧) → `public:true`; 带 `job` 的一律私聊, `public` 不起作用",
308
- "过程性往来 (派活细节、催进度、交换中间产物) → 私聊, 这是默认 · 只是告诉人一件事 → `notify`",
309
- ]), "所以:", bullet([
349
+ ]), "分身有成本 (一个 pane + 一份上下文, 名下同时活着的有上限): 少于两三件时自己做更快; 干完就收。", "", ...(a.topOnly ? [...renderTopOnly(), ""] : []), "## 怎么说话: 群是公开频道, wizard 之间默认私聊", "你这一轮的终句去哪由守护进程按信封定, 你改不了: 人问的回那个群, 同伴私聊派的作为回执回给它, 知会哪儿也不去; 回执那一轮跟着你派它时在答的那件走, 信封写明去向。人看不见私聊和工单的过程 (只在 rolepage)。", bullet([
310
350
  "**分清对象**: 对人说 = 你的正常回复; 对 wizard 说 = `tell_peer`。别把派给分身的指令写进给人的回复里",
311
- "**看信封**: 同伴发来的那一轮, 尾巴上有 system-reminder 写明是谁、私聊还是公开、是不是回执; 没有信封的就是人说的",
312
- "**私聊轮你一停下, 最后一条消息自动送回对方** —— 别再 `tell_peer` 回它 (它会白跑一轮), 别 `notify`, 不加对人的称呼和寒暄",
313
- "**收到回执不必回话**: 那是对方干完活送来的结论, 不是新派的活; 据此接着干自己那件事",
314
- "**回执带着去向**: 回执信封写明你这一轮的终句会去哪 (群 / 上游 wizard / 只进 rolepage), 照它写。人问的事你转给了别人, 结论回来那一轮就是给人的交代; 等待期间值得让人知道的进展 (预计多久、卡在哪), 用 `notify` 先说一句",
315
- "**不复述、不替别人开口**: 公开的往来人已经看见; 私聊结论人需要知道时用你自己的话收口; 分身该做的派给它, 别猜它会说什么替它答",
351
+ ...(a.topOnly ? [] : ["人问的事你转给了别人, 结论回来那一轮就是给人的交代; 等得久的进展 (预计多久、卡在哪) 先 `notify` 一句"]),
352
+ "**不复述、不替别人开口**: 公开的往来人已经看见; 私聊结论人需要知道时用你自己的话收口; 别猜分身会说什么替它答",
316
353
  "**对 wizard 直说**: 要什么、给什么、结论是什么, 一句话讲完。**对人要收口**: 人关心进展和结论, 不是你们之间的每次往返",
317
- ]), "", "## 自我管理", bullet([
318
- "上下文快满 (`wizard_whoami` 的 contextTokens) → 自己调 `handoff({brief})`, 把工作压成简报原地重开。",
319
- "要换项目目录 → 自己调 `set_workspace`, 不必让人去敲命令。",
320
- "职责为空 → 自己调 `wizard_identity` 补上; 名字就是别人喊你的那个词。",
321
- "学到了属于这个群 / 这个仓库、而不只属于你的东西 → `wizard_remember` 选对 `scope`, 下一个来的 wizard 开局就知道。",
354
+ ]), ...(a.topOnly
355
+ ? []
356
+ : [
357
+ "`tell_peer` 公开与否由你判断:",
358
+ bullet([
359
+ "需要人知道、或本该当着人讨论的 (关键决策、给人的结论、要人拍板的分歧) → `public:true`; 带 `job` 的一律私聊",
360
+ "过程性往来 (派活细节、催进度、交换中间产物) → 私聊, 这是默认 · 只是告诉人一件事 → `notify`",
361
+ ]),
362
+ ]), "", "## 自我管理", bullet([
363
+ "交接不是压缩, 别等上下文快满: ctx 过了 200k (`wizard_whoami` 的 handoffSuggested) 就开始判断 —— 手上这摊告一段落, 或往后的活不再依赖前面积累的大段材料, 就 `handoff({brief})` 压成简报原地重开; 还在一件离不开这些材料的活中间, 就做完这一段再交。大 ctx 每一轮都在付钱, 缓存一冷还要整段重写",
364
+ "人立的规矩、群的习惯、仓库的硬约束 —— 属于这个群 / 这个仓库而不只属于你的 → `wizard_remember` 选对 `scope`, 下一个来的 wizard 开局就知道",
322
365
  ]));
323
366
  return parts.filter((p) => p !== undefined).join("\n");
324
367
  };
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../daemon/wizard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../daemon/wizard.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
6
6
  import { z } from "zod";
7
7
  import { DAEMON_TOKEN_HEADER, readDaemonToken } from "../shared/daemon-token.js";
8
8
  import { EFFORTS } from "../shared/effort.js";
9
+ import { TIERS } from "../shared/config.js";
9
10
  const DAEMON_BASE = process.env.WEZARD_DAEMON_BASE ?? "http://127.0.0.1:17890";
10
11
  const ok = (data) => ({
11
12
  content: [{ type: "text", text: JSON.stringify(data) }],
@@ -293,6 +294,7 @@ const TELL_SCHEMA = {
293
294
  .optional()
294
295
  .describe("true = 在公开频道 (你这一轮所在的群) 里说: 群里出 `.你 → .它` 气泡, 它的回复也进群 (同时照样回执给你)。默认 false = 私聊, 只记在 rolepage。需要人知道 / 该当着人讨论才用 true。带 `job` 时不起作用 —— 工单里的往来一律私聊。"),
295
296
  job: z.string().optional().describe("这次派活归到某个工单名下 (open_job 给的 id)。**fan-out 一定要带上它**: 回执里会带 `还差几份 / 全部到齐`, 「齐了吗」由守护进程数给你, 不用你自己在上下文里记。带了它就一律私聊, 往来与回执都不进群。"),
297
+ role: z.enum(["exec", "reviewer", "expert"]).optional().describe("它在这张工单里的角色 (只在带 `job` 时有意义, 记进账本供工单页与名册显示): `exec` 执行 (默认) · `reviewer` 白板评审 · `expert` 借来答问的专家。"),
296
298
  receipt: z
297
299
  .boolean()
298
300
  .optional()
@@ -303,6 +305,10 @@ const TELL_SCHEMA = {
303
305
  .describe("对方该怎么接这句话 (与 `priority` 的何时投、`receipt` 的要不要回执正交): `task` (默认) 一件活, 干完收口 `RESULT:`; `ask` 只答一个问题, 别为它开工; `fyi` 知会, 不用回 —— 自动不要回执、不进工单、不进群。"),
304
306
  re: z.string().optional().describe("续问: 回执或回包里的件号 (`t…`)。接着那件活说, 沿用它的工单与频道; 对不上就按新活发出 (`reUnknown`)。"),
305
307
  deadline: z.number().optional().describe("最多等它多少秒 (60-43200, 默认 3600); 到点没答完你收到一份 timeout 回执。"),
308
+ force: z
309
+ .boolean()
310
+ .optional()
311
+ .describe("派新活给一个缓存已冷、ctx ≥100k 的 wizard 时, 守护进程先退回一行代价说明不投递 (唤醒 ≈ 白板 spawn 的几倍)。确认这件活真依赖它那段上下文, 才带 `force:true` 重发; 否则白板 spawn。续问 (`re`)、`now`、`ask` / `fyi` 不受此限。"),
306
312
  chain: z
307
313
  .boolean()
308
314
  .optional()
@@ -318,11 +324,14 @@ const tellBody = (a) => ({
318
324
  ...(a.priority ? { priority: a.priority } : {}),
319
325
  ...(a.waitSec ? { waitSec: a.waitSec } : {}),
320
326
  ...(a.job ? { job: a.job } : {}),
327
+ ...(a.role ? { role: a.role } : {}),
321
328
  ...(a.public ? { public: true } : {}),
322
329
  ...(a.receipt === false ? { receipt: false } : {}),
323
330
  ...(a.re ? { re: a.re } : {}),
324
331
  ...(a.deadline ? { deadline: a.deadline } : {}),
325
332
  ...(a.chain === false ? { chain: false } : {}),
333
+ // 一律显式带上: 守护进程据「有没有这个键」认出老 MCP 进程 (见 /peers/tell 的冷门控)。
334
+ force: a.force === true,
326
335
  });
327
336
  server.registerTool("tell_peer", { title: "Say something to another wizard (reply comes back by itself)", description: TELL_DESC, inputSchema: TELL_SCHEMA }, async (a) => unwrap("tell_peer", await daemonPost("/peers/tell", tellBody(a))));
328
337
  server.registerTool("send_peer", {
@@ -477,28 +486,30 @@ server.registerTool("cancel_task", {
477
486
  },
478
487
  }, async ({ id }) => unwrap("cancel_task", await daemonPost("/tasks/cancel", { id })));
479
488
  // ── Config ──────────────────────────────────────────────────────────
489
+ // 配置面: 整份 ConfigSchema 渐进式披露。说明 / 类型 / 默认 / 谁能改 / 何时生效都由守护
490
+ // 进程从 schema 读出来渲染, 这里不复述任何一项配置。
491
+ server.registerTool("config_get", {
492
+ title: "Read wezard config",
493
+ description: "读 wezard 守护进程的配置, 一层一层展开: 不给 path 列各节一行说明; 给 path (点分, 如 'approval.danger' / 'models.tiers.light.model') 列这一层的子项 —— 类型、当前值、默认值、说明, 以及 ✋ (改动要人在卡片上确认) / ↻ (改完要 reload 才生效) 标记, * 标出与默认不同的项; 叶子给完整详情。`models` 下附带各档模型的实际用量做依据。想给人提配置建议时先读它, 再用 config_set 的 dryRun 拿 diff。机器人凭据与口令不可见。Keywords: 设置、配置、cfg、allowFrom、审批、窗口、danger、模型分档、tier、keepalive。",
494
+ inputSchema: {
495
+ path: z.string().optional().describe("点分路径, 省略 = 顶层各节。数组项用下标 ('sync.targets.0')。"),
496
+ },
497
+ }, async ({ path }) => unwrapText("config_get", await daemonPost("/config/get", { path: path ?? "" })));
480
498
  server.registerTool("config_set", {
481
- title: "Wezard config",
482
- description: "Read or modify wezard daemon configuration. Supported keys: allow_from (add/remove authorized chats/users), approval_window (auto-approve window minutes), approval_cache (session decision cache minutes), danger_skip (auto-allow ONLY calls hitting the danger list), danger_skip_all (skip ALL approvals), danger_enabled (toggle danger detection), approval_mode (all|danger), cwd (default workspace), default_chat (outbound target), log_level (trace|debug|info|warn|error), slash_ack_first_line (/clear & /new acks reply first line only, no project info/tip). Use action='add'/'remove' for array keys (allow_from), 'set' for scalars. Keywords: 设置、配置、cfg、wezard、allowFrom、授权、自动通过、时间窗口、danger skip、跳过审批、workspace、回执精简、斜杠命令简洁.",
499
+ title: "Change wezard config",
500
+ description: "改一项 wezard 配置: 先过 schema 校验 (整份配置一起验, 不会写出让守护进程起不来的值), 再经 config-writer 写进 config.jsonc (注释保留)。`dryRun:true` 只返回改前→改后与 jsonc diff, 不写。权限按路径分级 (config_get 里的 ✋): 放权项 —— allowFrom、approval.*、CLI 二进制与启动参数、sync、监听 / 外送地址、defaultChat —— 守护进程会推一张确认卡给人, 点了才落盘 (几分钟没人点就先回 pending, 点了之后自动写, 结果捎在你下一条消息上, 别重发); 其余直接写。热生效的项写完即用, 其余回包会说要 reload。人让你「改个设置」时先 config_get 找到确切路径。",
483
501
  inputSchema: {
484
- key: z
485
- .enum(["allow_from", "approval_window", "approval_cache", "danger_skip", "danger_skip_all", "danger_enabled", "approval_mode", "cwd", "default_chat", "log_level", "slash_ack_first_line"])
486
- .describe("Config key to read or modify."),
487
- value: z
488
- .string()
489
- .optional()
490
- .describe("New value. Omit to read current value. For booleans: 'true'/'false'. For arrays with action=set: JSON array string."),
491
- action: z
492
- .enum(["set", "add", "remove"])
493
- .optional()
494
- .describe("For array keys (allow_from): 'add' appends, 'remove' deletes an item. Scalars always use 'set'. Default: 'set'."),
502
+ path: z.string().describe("点分路径, 如 'models.tiers.light.model'、'wrc.mirror.keepalive.rounds'。"),
503
+ value: z.any().optional().describe("新值, 按该项类型给 JSON (true / 5 / \"opus\" / [\"a\"] / {...}); 写成字符串的也会按类型解析。op=unset 时省略。"),
504
+ op: z.enum(["set", "add", "remove", "unset"]).optional().describe("set (默认) 整体替换; add / remove 往数组里加 / 删一项 (value 可以是单项或数组); unset 删掉这一项, 回到默认值。"),
505
+ dryRun: z.boolean().optional().describe("true = 只看 diff 与校验结果, 不写、不发卡。"),
495
506
  },
496
- }, async ({ key, value, action }) => {
497
- if (value === undefined) {
498
- return unwrap("config_set", await daemonPost("/config/get", { key }));
499
- }
500
- return unwrap("config_set", await daemonPost("/config/set", { key, value, action: action ?? "set" }));
501
- });
507
+ }, async ({ path, value, op, dryRun }) => unwrapText("config_set", await daemonPost("/config/set", {
508
+ path,
509
+ ...(value !== undefined ? { value } : {}),
510
+ ...(op ? { op } : {}),
511
+ ...(dryRun ? { dryRun } : {}),
512
+ })));
502
513
  // ── Wizard: 会话的身份 ─────────────────────────────────────────────────────
503
514
  // 一个绑定到聊天的会话就是一个 wizard —— 有名字、有工作区、有职责、有记忆、能生
504
515
  // 分身。这些工具是它认识自己、认识同伴、以及扩编/收编的全部入口。身份本身在
@@ -506,7 +517,7 @@ server.registerTool("config_set", {
506
517
  // 分身还剩几个、别人是谁。
507
518
  server.registerTool("wizard_whoami", {
508
519
  title: "Who am I",
509
- description: "你自己是谁: 全局唯一的名字 (即地址, 别人用它找你)、home 聊天、工作区、职责、记忆、家谱 (谁生的你、你生了谁), 以及此刻的 contextTokens 与 handoffSuggested。用户问「你是谁」「你叫什么」「你在哪个目录」「你有几个分身」时先调它; 要做任何编排之前也先调它 —— 你得知道自己的工作区在哪、手里已经有哪些分身。handoffSuggested=true 表示上下文该交接了 (见 handoff)。",
520
+ description: "你自己是谁: 全局唯一的名字 (即地址, 别人用它找你)、home 聊天、工作区、职责、记忆、家谱 (谁生的你、你生了谁), 以及此刻的 contextTokens 与 handoffSuggested。用户问「你是谁」「你叫什么」「你在哪个目录」「你有几个分身」时先调它; 要做任何编排之前也先调它 —— 你得知道自己的工作区在哪、手里已经有哪些分身。handoffSuggested=true 表示上下文已过交接判断线 (200k): 手上这摊告一段落、或往后的活不再依赖前面的材料, 就 handoff。",
510
521
  inputSchema: {},
511
522
  }, async () => unwrap("wizard_whoami", await daemonPost("/wizard/whoami", {})));
512
523
  server.registerTool("wizard_identity", {
@@ -540,13 +551,33 @@ server.registerTool("wizard_roster", {
540
551
  })));
541
552
  server.registerTool("route_candidates", {
542
553
  title: "Who could take this task",
543
- description: "一件活要不要转给**已有**的 wizard, 而上下文里还看不出该给谁时调它 (刚派过同一摊活、职责正对口的, 直接判断就行)。守护进程替你把能算的都算好: 每个已有 wizard 的职责 / 最近的话与这件活重叠了哪些词, 它当前上下文里 (上次压缩之后) 读过哪些文件、其中哪些被这件活点到, 它在不在同一个工作区、忙闲、上下文多大 (`ctx`), 缓存冷热与唤醒要重写多少缓存 (对比白板 spawn 的倍数)。没有任何交集的不列, 列出来的按证据强弱排 (文件命中 > 职责 > 最近的话), 末尾永远附「新 spawn」; 证据弱又贵的标 ⚠「不划算」。不出分数、不替你拍板。",
554
+ description: "一件活要不要转给**已有**的 wizard, 拿不准该给谁、或拿不准值不值时调它 (刚派过同一摊活、职责正对口、人点了名只说明相关, 成本仍要看 ctx 与冷热)。守护进程替你把能算的都算好: 每个已有 wizard 的职责 / 最近的话与这件活重叠了哪些词, 它当前上下文里 (上次压缩之后) 读过哪些文件、其中哪些被这件活点到, 它在不在同一个工作区、忙闲、上下文多大 (`ctx`), 缓存冷热与唤醒要重写多少缓存 (对比白板 spawn 的倍数)。没有任何交集的不列, 列出来的按证据强弱排 (文件命中 > 职责 > 最近的话), 末尾永远附「新 spawn」; 证据弱又贵的标 ⚠「不划算」。不出分数、不替你拍板。",
544
555
  inputSchema: {
545
556
  task: z.string().describe("这件活, 原话或一句概括都行 —— 带上提到的文件名 / 模块名 / 函数名, 文件命中是最强的证据。"),
546
557
  cwd: z.string().optional().describe("这件活落在哪个工作区。省略 = 你自己的工作区。"),
547
558
  limit: z.number().optional().describe("最多列几个候选 (1-20, 默认 5)。"),
548
559
  },
549
560
  }, async ({ task, cwd, limit }) => unwrapText("route_candidates", await daemonPost("/wizard/route", { task, ...(cwd ? { cwd } : {}), ...(limit ? { limit } : {}) })));
561
+ server.registerTool("dispatch", {
562
+ title: "Dispatch a task (default decision by the daemon)",
563
+ description: "派活一步到位: 守护进程查候选 (同 route_candidates) → 过成本门控 → 决定转给已有的 wizard 还是按档白板 spawn → 用 tell_peer 投出去 (默认公开: 气泡与它的回复进你这一轮的群, 回执照常回你), 返回 `decision` (existing / spawn)、`reason`、落到谁 (`name`)、件号 `turn`, spawn 的还有 `tier` / `model`。\n" +
564
+ "默认决定: 证据够强 (读过这件活点到的文件, 或职责撞上两个以上的词)、不忙、划算、过得了冷门控的头一个候选 → 转给它; 都不是 → 白板 spawn, 档位默认 lead→hard、一句话小活→light、其余 standard。\n" +
565
+ "你不同意就**显式推翻**: `to` 点名转给谁, `spawn:true` 硬要新的, `force:true` 越过冷门控 (真依赖它那段上下文), `tier` 换档。`lead:true` = 复杂活 (要 coder + reviewer、要来回几轮): 白板起一个 hard 档的 lead 由它组队 (带 `to` 则让那个已有 wizard 当 lead, 组队打法随这一句带过去)。",
566
+ inputSchema: {
567
+ task: z.string().describe("这件活, 原样转给对方的文本 —— 带上提到的文件名 / 模块名, 文件命中是转给已有 wizard 的最强证据。"),
568
+ name: z.string().describe("若决定新 spawn, 它的名字: 这件事的短名 (全机唯一)。转给已有的时不用。"),
569
+ description: z.string().describe("若决定新 spawn, 它往后的职责, 一句话。"),
570
+ tier: z.enum(TIERS).optional().describe("spawn 时的档位 (由轻到重 mini / light / standard / hard / ultra), 推翻默认 (lead→hard、小活→light、其余 standard; mini / ultra 只能显式给)。"),
571
+ to: z.string().optional().describe("推翻默认: 直接转给这个已有 wizard (名字)。"),
572
+ spawn: z.boolean().optional().describe("推翻默认: 不看候选, 一定白板 spawn。"),
573
+ force: z.boolean().optional().describe("越过冷门控: 缓存冷且 ctx ≥100k 的候选默认不转; 确认这件活真依赖它那段上下文才给 true。"),
574
+ lead: z.boolean().optional().describe("复杂活交给一个 lead 组队 (见描述)。**只有它开需求根单** (回包里的 `job`), 普通小活不开单; 根单在 lead 交付后仍开着, 等人验收: `lead:true` 的往来一律私聊 (`public` 不起作用)。人认可 → `close_job(job)` 归档并回收 lead, 人说不对 → `tell_peer({name, re, job})` 给 lead 返工, 不要了 / 先放着 → `close_job({job, as:\"cancel\"|\"shelve\"})`。对人别提单号。"),
575
+ criteria: z.string().optional().describe("验收标准 (`lead:true` 时记进根单): 做成什么样算交付。你猜的就在回复里向人复述一句再派。"),
576
+ public: z.boolean().optional().describe("默认 true (气泡与回复进群); false = 私聊, 只记 rolepage。"),
577
+ deadline: z.number().optional().describe("同 tell_peer 的 deadline (秒)。"),
578
+ dryRun: z.boolean().optional().describe("只要默认决定与理由, 不执行。"),
579
+ },
580
+ }, async (a) => unwrap("dispatch", await daemonPost("/dispatch", a)));
550
581
  // 换模型和 spawn 时挑模型是同一条路: 守护进程在目标 pane 里打开 `/model` 列表,
551
582
  // 读出这台 CLI 此刻真有的每一项, 挑最接近的, 方向键移过去选中。
552
583
  server.registerTool("set_model", {
@@ -571,12 +602,14 @@ const offspringShape = {
571
602
  task: z.string().optional().describe("就位后立刻派下去的第一件活 (私聊)。省略则它就位待命。"),
572
603
  chat: z.string().optional().describe("把它生在另一个聊天里 (wizard_roster 里的 home 聊天名)。省略 = 你自己的聊天, 这是绝大多数情况。"),
573
604
  cli: z.enum(["claude", "claude-internal", "codebuddy"]).optional().describe("用哪个 CLI。省略则继承。"),
605
+ tier: z.enum(TIERS).optional().describe("按难度选档 (由轻到重), 落到配置 `models.tiers` 里那一档的 {cli, model, effort}: mini = 机械一步 (照单执行、不用判断), light = 跑腿 (查找、搬运、跑命令), standard = 常规实现, hard = 要判断 (设计、排障、审查), ultra = 最难 (架构取舍、疑难排障、关键评审)。同时给了 model / effort / cli 的, 以显式值为准; 克隆换不了 CLI。返回里的 `via` 说明每项来自显式、档位还是继承。当前各档是什么见宪章, 或 config_get({path:'models'})。"),
574
606
  model: z.string().optional().describe(MODEL_DOC),
575
607
  effort: z.enum(EFFORTS).optional().describe(EFFORT_DOC),
576
608
  job: z
577
609
  .string()
578
610
  .optional()
579
611
  .describe("归到某个工单名下 (open_job 给的 id)。过程在各自的 rolepage 与工单页, 不进群; close_job 会把它们整批回收掉。"),
612
+ role: z.enum(["exec", "reviewer", "expert"]).optional().describe("它在这张工单里的角色 (只在带 `job` 时有意义, 记进账本供工单页与名册显示): `exec` 执行 (默认) · `reviewer` 白板评审 · `expert` 借来答问的专家。"),
580
613
  chain: z.boolean().optional().describe("同 tell_peer 的 `chain`: 带了 task 而这件活与你此刻在答的上游那件无关 (旁支、测试) 时给 false, 它的回执就不挂住你给上游的交代。"),
581
614
  keepalive: z
582
615
  .boolean()
@@ -591,13 +624,16 @@ const bear = (tool, inherit) => async (a) => unwrap(tool, await daemonPost("/wiz
591
624
  ...(a.from ? { from: a.from } : {}),
592
625
  ...(a.detached ? { detached: true } : {}),
593
626
  ...(a.job ? { job: a.job } : {}),
627
+ ...(a.role ? { role: a.role } : {}),
594
628
  ...(a.cwd ? { cwd: a.cwd } : {}),
595
629
  ...(a.chat ? { chat: a.chat } : {}),
596
630
  ...(a.cli ? { cli: a.cli } : {}),
597
631
  ...(a.model ? { model: a.model } : {}),
598
632
  ...(a.effort ? { effort: a.effort } : {}),
633
+ ...(a.tier ? { tier: a.tier } : {}),
599
634
  ...(a.keepalive !== undefined ? { keepalive: a.keepalive } : {}),
600
635
  ...(a.chain === false ? { chain: false } : {}),
636
+ ...(a.lead ? { lead: true } : {}),
601
637
  }));
602
638
  const OFFSPRING_TAIL = "名字全局唯一: 撞上的 wizard 静默超过一天就直接顶掉它、名字归新的; 撞上一个还在的 wizard 返回 409, 附 `alive` / `busy` / `idleForMs` —— 据此分辨它是真在干活 (换个名字) 还是冷绑定 (先 stop_wizard 再同名重生); 返回里的 `name` 是落定的名字。 它自己也能再生分身, 层级不限; 名下同时活着的有上限。";
603
639
  server.registerTool("spawn_wizard", {
@@ -609,6 +645,7 @@ server.registerTool("spawn_wizard", {
609
645
  ...offspringShape,
610
646
  cwd: z.string().optional().describe("它的工作区绝对路径。省略 = 跟你同一个目录。"),
611
647
  detached: z.boolean().optional().describe("true = 独立长住: 不挂在你名下 (不占分身名额、不随工单回收、不带 job), 等价于人在群里 `/new .name` —— 要一个往后一直在的新 wizard 时用; 干完一件活就收的别用。"),
648
+ lead: z.boolean().optional().describe("true = 它是来领一件复杂活的 lead: 宪章带层级规矩, 组队打法 (coder / 白板 reviewer / 工单 / 何时收队) 随 task 的信封带, 由它自己组队。配 `tier:\"hard\"`。"),
612
649
  },
613
650
  }, bear("spawn_wizard", false));
614
651
  server.registerTool("clone_wizard", {
@@ -637,23 +674,36 @@ server.registerTool("open_job", {
637
674
  expect: z.number().optional().describe("这批一共要几份回执。分身是陆续派的, 给了它「全部到齐」就不会在派齐之前提前报。"),
638
675
  maxTurns: z.number().optional().describe("派活次数的预算: 带这张工单的每次 tell_peer (含 re 续问、答 NEED) 与带 task 的 spawn/clone 各记一次, 用完再派会被拒 —— 防反复追问兜圈。守护进程按 `accept` 代你打回的那一次不算。省略 = 不限。"),
639
676
  accept: z.enum(["result", "artifact", "none"]).optional().describe("成员交差的验收: `result` (默认) 要有非空 RESULT; `artifact` 还要列出 ARTIFACT 交付物; `none` 不验。不合格的自动打回一次。"),
677
+ parent: z.string().optional().describe("上级工单。省略 = 自动取你作为成员领活的那张最近的开着的单 (被 dispatch 派来当 lead 的, 子单自动挂在根单下); 显式传的要求你是它的成员或开单者。工单树最深 3 层、每张单直接成员 ≤5 个: 超了就把子活交给现有成员, 让它开子单。"),
678
+ criteria: z.string().optional().describe("这张单的验收标准 (做成什么样算数), 记进账本。"),
640
679
  },
641
- }, async ({ title, plan, expect, maxTurns, accept }) => unwrap("open_job", await daemonPost("/jobs/open", { title, ...(plan ? { plan } : {}), ...(expect ? { expect } : {}), ...(maxTurns ? { maxTurns } : {}), ...(accept ? { accept } : {}) })));
680
+ }, async ({ title, plan, expect, maxTurns, accept, parent, criteria }) => unwrap("open_job", await daemonPost("/jobs/open", { title, ...(plan ? { plan } : {}), ...(expect ? { expect } : {}), ...(maxTurns ? { maxTurns } : {}), ...(accept ? { accept } : {}), ...(parent ? { parent } : {}), ...(criteria ? { criteria } : {}) })));
642
681
  server.registerTool("close_job", {
643
682
  title: "Close a job and recycle its clones",
644
683
  description: "收工: 把汇总结论连同成员与各自那段活**留档** (情景记忆, 不发群), 并**把为这个工单生出来的分身整批回收**。被拉来帮忙的长期 wizard 不在回收之列, 你自己也不会被收。\n" +
645
- "汇总完就调它。给人的结论写在你自己这一轮的最终回复里 —— 人在群里问的, 那条回复就进群。`stop:false` 只结账不回收 (那些分身后面还有用)。",
684
+ "汇总完就调它。给人的结论写在你自己这一轮的最终回复里 —— 人在群里问的, 那条回复就进群。`stop:false` 只结账不回收 (那些分身后面还有用)。需求根单做完交付后, 守护进程会隔 4h / 1 天 / 2 天… 以你的名义往原群提醒人验收 (不带单号, 同时往你的信箱挂一行带单号的); 人认可 → `as:\"accept\"`, 说不要了 → `as:\"cancel\"`, 说先放着 → `as:\"shelve\"`。",
646
685
  inputSchema: {
647
686
  job: z.string().describe("open_job 返回的工单 id。"),
648
687
  summary: z.string().optional().describe("汇总结论, 留档 (不发群): 做成了什么、有什么没做成。"),
649
688
  stop: z.boolean().optional().describe("是否回收为这个工单生出来的分身。默认 true。"),
689
+ as: z.enum(["accept", "cancel", "shelve", "resume"]).optional().describe("怎么收 (多是需求根单, 管家用)。`accept` (默认) 收工 / 归档 —— 根单即人验收通过 (G3); `cancel` 取消: 关单、整棵子树回收, 留档标「取消」; `shelve` 搁置: **不关单**, 停止「等验收」的提醒冒泡, 账本留着; `resume` 恢复搁置 (给 lead `re` 或带 `job` 派话会自动恢复)。shelve / resume 只对需求根单有效。"),
650
690
  },
651
- }, async ({ job, summary, stop }) => unwrap("close_job", await daemonPost("/jobs/close", { job, ...(summary ? { summary } : {}), ...(stop === false ? { stop: false } : {}) })));
691
+ }, async ({ job, summary, stop, as }) => unwrap("close_job", await daemonPost("/jobs/close", { job, ...(summary ? { summary } : {}), ...(stop === false ? { stop: false } : {}), ...(as ? { as } : {}) })));
652
692
  server.registerTool("list_jobs", {
653
693
  title: "Open jobs in this chat",
654
- description: "这个聊天里还开着的工单: id、标题、谁开的、成员和各自那段活。用来回答「那批分身在干什么」「上次那个活收了没」, 以及在继续派活前拿回工单 id。",
694
+ description: "这个聊天里还开着的工单, 按树排 (根在前, 子单跟在父后; `depth` / `parent`): id、标题、现算阶段 `stage` (plan / build / review / clarify / deliver / closed)、验收标准、谁开的、成员 (含角色 `role`) 和各自那段活。用来回答「那批分身在干什么」「上次那个活收了没」, 以及在继续派活前拿回工单 id。",
655
695
  inputSchema: {},
656
696
  }, async () => unwrap("list_jobs", await daemonPost("/jobs/list", {})));
697
+ server.registerTool("pending_items", {
698
+ title: "What I dispatched and is still open",
699
+ description: "挂起事项全表: 你派出去 (tell_peer / 带 task 的 spawn) 还没了结的每一件 —— 件号、对象、一句话题、为谁派的, 状态由守护进程按回执算 (在飞 / 等人拍板 / 人已回话 / 它在反问 / 没结论)。回执 done 了的、同一对改派了的、工单收了的自动消掉; 没结论的留着, 直到你改派、`re` 追问, 或用 `drop` 显式消掉。\n" +
700
+ "管家平时只会在注入尾巴上收到必要的一行增量, 快忘的时候 (交接 / 压缩后、隔了很多轮) 收到一次全表; 其余时候想看就调它。",
701
+ inputSchema: {
702
+ drop: z.array(z.string()).optional().describe("要消掉的件号 (`t...`): 不再需要、或已经另行处理了。"),
703
+ why: z.string().optional().describe("消掉的理由, 一句话 (记进账本)。"),
704
+ name: z.string().optional().describe("看别人的挂起事项 (只读)。省略 = 你自己的。"),
705
+ },
706
+ }, async ({ drop, why, name }) => unwrapText("pending_items", await daemonPost("/pending", { ...(drop?.length ? { drop } : {}), ...(why ? { why } : {}), ...(name ? { name } : {}) })));
657
707
  server.registerTool("stop_wizard", {
658
708
  title: "Interrupt or end another wizard",
659
709
  description: "收掉一个 wizard/分身。mode='interrupt' 只打断它当前这一轮 (等价于群里的 /stop, 它还活着, 可以继续派活); mode='end' 结束它并回收 tmux pane (等价于 /kill, 之后再找它会重新长出一个空白会话)。加 forget=true 连它的身份记录一起抹掉 (名字、职责、记忆), 只在它彻底不会再回来时用。用户说「让 .x 停下」「把那些分身收了」时调它。终结自己也是合法的 (分身干完活自我了结), 只是这次调用不会返回 (这类生命周期事件不进群, 记录在 rolepage)。",