wezard 2.2.1 → 2.3.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 (95) hide show
  1. package/CLAUDE.md +7 -4
  2. package/README.md +1 -1
  3. package/dist/cli/init.js +2 -1
  4. package/dist/cli/init.js.map +1 -1
  5. package/dist/daemon/approval.js +6 -4
  6. package/dist/daemon/approval.js.map +1 -1
  7. package/dist/daemon/chat-log.js +6 -1
  8. package/dist/daemon/chat-log.js.map +1 -1
  9. package/dist/daemon/danger.js +17 -0
  10. package/dist/daemon/danger.js.map +1 -1
  11. package/dist/daemon/detail.js +41 -0
  12. package/dist/daemon/detail.js.map +1 -1
  13. package/dist/daemon/handoff.js +8 -2
  14. package/dist/daemon/handoff.js.map +1 -1
  15. package/dist/daemon/inbound.js +9 -4
  16. package/dist/daemon/inbound.js.map +1 -1
  17. package/dist/daemon/index.js +744 -152
  18. package/dist/daemon/index.js.map +1 -1
  19. package/dist/daemon/jobs.js +62 -23
  20. package/dist/daemon/jobs.js.map +1 -1
  21. package/dist/daemon/last-response.js +15 -0
  22. package/dist/daemon/last-response.js.map +1 -1
  23. package/dist/daemon/memory-steward.js +124 -68
  24. package/dist/daemon/memory-steward.js.map +1 -1
  25. package/dist/daemon/mirror-bridge.js +461 -91
  26. package/dist/daemon/mirror-bridge.js.map +1 -1
  27. package/dist/daemon/mirror-store.js.map +1 -1
  28. package/dist/daemon/model-select.js +99 -0
  29. package/dist/daemon/model-select.js.map +1 -1
  30. package/dist/daemon/notices.js +7 -5
  31. package/dist/daemon/notices.js.map +1 -1
  32. package/dist/daemon/peers.js +183 -60
  33. package/dist/daemon/peers.js.map +1 -1
  34. package/dist/daemon/receipts.js +391 -77
  35. package/dist/daemon/receipts.js.map +1 -1
  36. package/dist/daemon/route.js +63 -10
  37. package/dist/daemon/route.js.map +1 -1
  38. package/dist/daemon/spawn-tmux.js +24 -13
  39. package/dist/daemon/spawn-tmux.js.map +1 -1
  40. package/dist/daemon/task-registry.js +1 -1
  41. package/dist/daemon/task-registry.js.map +1 -1
  42. package/dist/daemon/tasks.js +12 -4
  43. package/dist/daemon/tasks.js.map +1 -1
  44. package/dist/daemon/usage.js +4 -11
  45. package/dist/daemon/usage.js.map +1 -1
  46. package/dist/daemon/wizard-memory.js +36 -4
  47. package/dist/daemon/wizard-memory.js.map +1 -1
  48. package/dist/daemon/wizard.js +102 -58
  49. package/dist/daemon/wizard.js.map +1 -1
  50. package/dist/mcp/server.js +138 -111
  51. package/dist/mcp/server.js.map +1 -1
  52. package/dist/shared/charter-view.js +35 -0
  53. package/dist/shared/charter-view.js.map +1 -0
  54. package/dist/shared/chat-http.js +133 -31
  55. package/dist/shared/chat-http.js.map +1 -1
  56. package/dist/shared/chat-render.js +6 -3
  57. package/dist/shared/chat-render.js.map +1 -1
  58. package/dist/shared/chat-view.js +17 -6
  59. package/dist/shared/chat-view.js.map +1 -1
  60. package/dist/shared/cli-backends.js +2 -0
  61. package/dist/shared/cli-backends.js.map +1 -1
  62. package/dist/shared/config.js +9 -5
  63. package/dist/shared/config.js.map +1 -1
  64. package/dist/shared/daemon-token.js +18 -0
  65. package/dist/shared/daemon-token.js.map +1 -0
  66. package/dist/shared/detail-render.js +140 -16
  67. package/dist/shared/detail-render.js.map +1 -1
  68. package/dist/shared/detail-store.js +33 -12
  69. package/dist/shared/detail-store.js.map +1 -1
  70. package/dist/shared/effort.js +11 -0
  71. package/dist/shared/effort.js.map +1 -0
  72. package/dist/shared/model-prices.js +258 -0
  73. package/dist/shared/model-prices.js.map +1 -0
  74. package/dist/shared/pricing.js +55 -0
  75. package/dist/shared/pricing.js.map +1 -0
  76. package/dist/shared/reminder.js +18 -4
  77. package/dist/shared/reminder.js.map +1 -1
  78. package/dist/shared/role-render.js +172 -8
  79. package/dist/shared/role-render.js.map +1 -1
  80. package/dist/shared/role-view.js +89 -25
  81. package/dist/shared/role-view.js.map +1 -1
  82. package/dist/shared/session-label.js +4 -0
  83. package/dist/shared/session-label.js.map +1 -1
  84. package/dist/shared/task-file.js +16 -1
  85. package/dist/shared/task-file.js.map +1 -1
  86. package/dist/shared/turn-state.js +24 -0
  87. package/dist/shared/turn-state.js.map +1 -0
  88. package/dist/shared/world.js +37 -3
  89. package/dist/shared/world.js.map +1 -1
  90. package/dist/svr/index.js +2 -1
  91. package/dist/svr/index.js.map +1 -1
  92. package/hooks/pre-tool-use.sh +16 -3
  93. package/package.json +1 -1
  94. package/web/chat.css +173 -41
  95. package/web/chat.js +724 -245
@@ -1 +1 @@
1
- {"version":3,"file":"mirror-store.js","sourceRoot":"","sources":["../../daemon/mirror-store.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,eAAe;AACf,OAAO,EAAE,WAAW,EAAgB,MAAM,6BAA6B,CAAC;AAyCxE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAe,EAAE,CAAC,WAAW,CAAmB,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"mirror-store.js","sourceRoot":"","sources":["../../daemon/mirror-store.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,eAAe;AACf,OAAO,EAAE,WAAW,EAAgB,MAAM,6BAA6B,CAAC;AA4CxE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAe,EAAE,CAAC,WAAW,CAAmB,QAAQ,CAAC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { isModalPane } from "../shared/modal-pane.js";
2
2
  import { sleep } from "../shared/std.js";
3
+ import { EFFORTS, parseEffort } from "../shared/effort.js";
3
4
  import { runTmux } from "./spawn-tmux.js";
4
5
  const POLL_MS = 200;
5
6
  const OPEN_TIMEOUT_MS = 6000;
@@ -183,4 +184,102 @@ export const selectModel = async (pane, wanted, log, scope = "session") => {
183
184
  log.warn({ pane, wanted: want, match: row.label, receipt, tail: (await screen(pane)).slice(-300) }, "model-select: selection did not land");
184
185
  return { ok: false, catalog, reason: receipt ? `选中 '${row.label}' 后没有切换: ${receipt}` : `选中 '${row.label}' 后没等到回执` };
185
186
  };
187
+ // ── Exact ids: when the picker round trip can be skipped ─────────────────────
188
+ // `--model <id>` at launch saves the whole picker dance, but the flag is not
189
+ // validated — so it only ever gets an id the API has already answered under:
190
+ // one read back from a transcript's `message.model`. Those sightings are also
191
+ // what pairs a picker label with its id ("Haiku 4.5" ↔ claude-haiku-4-5-…):
192
+ // no table to keep, the evidence is already on disk.
193
+ // A label naming exactly one model: "Opus 5.5" — not "Default (recommended)",
194
+ // and not "Opus 4.6 (1M context)", whose transcript id drops the context tier.
195
+ const PLAIN_LABEL_RE = /^([a-z]+)\s+(\d+(?:\.\d+)*)$/iu;
196
+ /** `id` is the model `label` names: same family word, same version. */
197
+ export const labelFitsId = (label, id) => {
198
+ const m = PLAIN_LABEL_RE.exec(label.trim());
199
+ return !!m && (id.toLowerCase().match(/[a-z]+/gu) ?? []).includes(m[1].toLowerCase()) && versionOf(id) === m[2];
200
+ };
201
+ /** The exact id to launch with, or undefined when `wanted` is colloquial
202
+ * ("opus", "最新的 opus") or names nothing ever seen. `seen` is consumed
203
+ * lazily, likeliest first — the first hit ends the scan. */
204
+ export const exactModelId = (wanted, seen) => {
205
+ const want = wanted.trim();
206
+ if (!want)
207
+ return undefined;
208
+ for (const id of seen)
209
+ if (id === want || labelFitsId(want, id))
210
+ return id;
211
+ return undefined;
212
+ };
213
+ // ── Effort: the `/effort` slider ─────────────────────────────────────────────
214
+ // `/effort <level>` is NOT session-scoped: it also rewrites the user's default
215
+ // for every new session (settings.json `modelSettings`). Only the slider's `s`
216
+ // key stays inside this session, so mid-session changes drive the slider —
217
+ // and a slider offering no `s` is backed out of, never confirmed with Enter.
218
+ const EFFORT_HEAD_RE = /^\s*Effort\s*$/u;
219
+ const EFFORT_SCALE_RE = new RegExp(EFFORTS.map((e) => `\\b${e}\\b`).join(".*"), "u");
220
+ const EFFORT_RECEIPT_RE = /Set effort level to (\w+)/u;
221
+ // Worded unlike the model picker's ("s to use this session only").
222
+ const EFFORT_SESSION_ONLY_RE = /\bs (?:for|to use) this session only/u;
223
+ /** The slider on screen, or undefined: header, a scale row naming every level,
224
+ * the ▲ marker right above it, and the footer hugging the bottom (same reason
225
+ * as `parseFrame`). The level under ▲ is the label whose centre is nearest. */
226
+ export const parseSlider = (screen) => {
227
+ const lines = linesOf(screen);
228
+ const head = lines.map((l) => EFFORT_HEAD_RE.test(l)).lastIndexOf(true);
229
+ const foot = lines.at(-1) ?? "";
230
+ const scale = lines.findIndex((l, i) => i > head && EFFORT_SCALE_RE.test(l));
231
+ const mark = scale > 0 ? lines[scale - 1].indexOf("▲") : -1;
232
+ if (head < 0 || !FOOTER_RE.test(foot) || mark < 0)
233
+ return undefined;
234
+ const row = lines[scale];
235
+ const dist = (e) => Math.abs(new RegExp(`\\b${e}\\b`, "u").exec(row).index + e.length / 2 - mark);
236
+ const at = EFFORTS.reduce((best, e) => (dist(e) < dist(best) ? e : best), EFFORTS[0]);
237
+ return { at, sessionOnly: EFFORT_SESSION_ONLY_RE.test(foot) };
238
+ };
239
+ const nudgeTo = async (pane, want, left = EFFORTS.length * 2) => {
240
+ const s = parseSlider(await screen(pane));
241
+ if (!s || s.at === want)
242
+ return s;
243
+ if (left <= 0)
244
+ return undefined;
245
+ await key(pane, EFFORTS.indexOf(want) < EFFORTS.indexOf(s.at) ? "Left" : "Right");
246
+ await sleep(ARROW_STEP_MS);
247
+ return nudgeTo(pane, want, left - 1);
248
+ };
249
+ /** Puts a live pane on `want` for this session only. Never throws, never
250
+ * touches the user's default; a failure leaves the pane's level as it was. */
251
+ export const selectEffort = async (pane, want, log) => {
252
+ const start = await screen(pane);
253
+ if (isModalPane(start).modal)
254
+ return { ok: false, reason: "pane 正停在一个确认框上, 这时敲 /effort 会按到它 —— 等它过去再切" };
255
+ await runTmux(["send-keys", "-t", pane, "-l", "/effort"]);
256
+ await sleep(150);
257
+ await key(pane, "Enter");
258
+ const opened = await until(async () => parseSlider(await screen(pane)), OPEN_TIMEOUT_MS);
259
+ const back = async (reason) => {
260
+ if (parseSlider(await screen(pane))) {
261
+ await key(pane, "Escape");
262
+ await until(async () => (parseSlider(await screen(pane)) ? undefined : true), CLOSE_TIMEOUT_MS);
263
+ }
264
+ log.warn({ pane, want, reason }, "effort-select: not applied");
265
+ return { ok: false, reason };
266
+ };
267
+ if (!opened)
268
+ return back("/effort 的档位条没有出现");
269
+ if (!opened.sessionOnly)
270
+ return back("档位条没有「只对本会话」这一键 —— 按 Enter 会改掉全机默认, 没按");
271
+ const at = await nudgeTo(pane, want);
272
+ if (at?.at !== want)
273
+ return back(`没能把档位挪到 ${want}`);
274
+ const before = (start.match(new RegExp(EFFORT_RECEIPT_RE, "gu")) ?? []).join("\n");
275
+ await key(pane, "s");
276
+ const receipt = await until(async () => {
277
+ const s = await screen(pane);
278
+ const got = s.match(new RegExp(EFFORT_RECEIPT_RE, "gu")) ?? [];
279
+ return !parseSlider(s) && got.join("\n") !== before ? got.at(-1) : undefined;
280
+ }, SETTLE_TIMEOUT_MS);
281
+ const applied = parseEffortReceipt(receipt);
282
+ return applied === want ? { ok: true, applied } : back(receipt ? `回执对不上: ${receipt}` : "选中后没等到回执");
283
+ };
284
+ const parseEffortReceipt = (receipt) => parseEffort(EFFORT_RECEIPT_RE.exec(receipt ?? "")?.[1]);
186
285
  //# sourceMappingURL=model-select.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-select.js","sourceRoot":"","sources":["../../daemon/model-select.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-select.js","sourceRoot":"","sources":["../../daemon/model-select.ts"],"names":[],"mappings":"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"}
@@ -18,8 +18,10 @@
18
18
  import { baseOfKey } from "../shared/session-label.js";
19
19
  import { renderReminder } from "../shared/reminder.js";
20
20
  /** 每个信箱最多攒 `max` 行 —— 一个挂了很久的 wizard 不该在醒来时读一部编年史,
21
- * 溢出时留最新的那些 (旧的那些多半已经被后面的变动覆盖了)。 */
22
- export const createNoticeBox = (max = 12) => {
21
+ * 溢出时留最新的那些 (旧的那些多半已经被后面的变动覆盖了)。
22
+ * `probe` 是投递那一刻现算的行 (不是谁投进来的, 而是「此刻它的状态值得提一句」,
23
+ * 如上下文快满); 排在信箱里的那些前面。 */
24
+ export const createNoticeBox = (max = 12, probe = () => []) => {
23
25
  const boxes = new Map();
24
26
  return {
25
27
  post: (audience, line) => {
@@ -30,7 +32,7 @@ export const createNoticeBox = (max = 12) => {
30
32
  }
31
33
  },
32
34
  drain: (target) => {
33
- const lines = boxes.get(target) ?? [];
35
+ const lines = [...probe(target), ...(boxes.get(target) ?? [])];
34
36
  boxes.delete(target);
35
37
  return lines;
36
38
  },
@@ -47,9 +49,9 @@ export const renderNotices = (lines) => {
47
49
  if (lines.length === 0)
48
50
  return "";
49
51
  return renderReminder({ wezard: "roster" }, [
50
- "你出生时拿到的那份名册已经变了 —— 这段时间里:",
52
+ "你出生时拿到的宪章 (名册、记忆) 是快照, 这段时间里变了:",
51
53
  ...lines.map((l) => `- ${l}`),
52
- "要当下真实的状态 (谁在忙、谁在哪个工作区) 就调 wizard_roster。与手头的活无关就略过,",
54
+ "名册的真相是 wizard_roster, 记忆的真相是那份文件。与手头的活无关就略过,",
53
55
  "**不要为此回话, 也不要向用户复述这几行** —— 群里该看见的气泡已经发过了。",
54
56
  ]);
55
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"notices.js","sourceRoot":"","sources":["../../daemon/notices.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,EAAE;AACF,wDAAwD;AACxD,+CAA+C;AAC/C,qCAAqC;AACrC,EAAE;AACF,8CAA8C;AAC9C,4CAA4C;AAC5C,oDAAoD;AACpD,kEAAkE;AAClE,UAAU;AACV,EAAE;AACF,4CAA4C;AAC5C,EAAE;AACF,uCAAuC;AACvC,sDAAsD;AACtD,8CAA8C;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AASvD;qCACqC;AACrC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,GAAG,EAAE,EAAa,EAAE;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,OAAO;QACL,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO;YACzB,KAAK,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;YAChB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACtC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,wDAAwD;AACxD,4CAA4C;AAC5C,8CAA8C;AAC9C,IAAI,KAA4B,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAc,EAAa,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,SAAS,GAAG,GAA0B,EAAE,CAAC,KAAK,CAAC;AAE5D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAwB,EAAU,EAAE;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC1C,2BAA2B;QAC3B,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,qDAAqD;QACrD,2CAA2C;KAC5C,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;gBAEgB;AAChB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,IAAY,EAAU,EAAE;IACtE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACxD,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF;oDACoD;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,WAA8B,EAC9B,IAAY,EACZ,MAAyB,EACf,EAAE,CACZ,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"notices.js","sourceRoot":"","sources":["../../daemon/notices.ts"],"names":[],"mappings":"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"}
@@ -59,6 +59,33 @@ const readTailBytes = (jsonlPath, want) => {
59
59
  }
60
60
  }
61
61
  };
62
+ const HEAD_BYTES = 256 * 1024;
63
+ /** transcript 第一条带时间戳的记录的时刻 (ms) —— 会话真正开始的那一刻。只读文件头;
64
+ * 正文里的 `timestamp` 是转义过的 (`\"timestamp\"`), 正则不会误中。读不到 → undefined。 */
65
+ export const firstStamp = (jsonlPath) => {
66
+ if (!jsonlPath || !existsSync(jsonlPath))
67
+ return undefined;
68
+ let fd;
69
+ try {
70
+ const buf = Buffer.allocUnsafe(HEAD_BYTES);
71
+ fd = openSync(jsonlPath, "r");
72
+ const read = readSync(fd, buf, 0, HEAD_BYTES, 0);
73
+ const iso = /"timestamp":"([^"]+)"/.exec(buf.subarray(0, read).toString("utf8"))?.[1];
74
+ const t = iso ? Date.parse(iso) : NaN;
75
+ return Number.isFinite(t) ? t : undefined;
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ finally {
81
+ if (fd !== undefined) {
82
+ try {
83
+ closeSync(fd);
84
+ }
85
+ catch { /* ignore */ }
86
+ }
87
+ }
88
+ };
62
89
  /** 从文件尾读一段并解析; `enough` 说不够就翻四倍重读, 直到够了、读完整个文件、
63
90
  * 或者撞上上限。窗口是手段不是目的 —— 调用方只说"我要几轮", 不该关心一条
64
91
  * attachment 有多大。 */
@@ -95,13 +122,16 @@ const blockText = (content) => {
95
122
  /** Last `n` user/assistant turns of a transcript, oldest first. Backend-agnostic:
96
123
  * the line shape is normalized through the owning CLI's dialect adapter. */
97
124
  export const tailTurns = (jsonlPath, n = 3, keepLines = false) => readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, keepLines), (ts) => ts.length >= n).slice(-n);
125
+ /** 最后一句进到模型的话 (带信封), 往回读到有为止 —— 中间隔着多少轮工具都不怕。 */
126
+ export const lastUserTurn = (jsonlPath) => readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, true), (ts) => ts.some((t) => t.role === "user"))
127
+ .filter((t) => t.role === "user").at(-1);
98
128
  /** `tailTurns` 去掉保温 ping/pong 之后的最后 `n` 轮 —— 凡是交给另一个 wizard (或人)
99
129
  * **读**的都走这里: 挂机一晚的会话尾巴上全是 ping/pong, 照 tailTurns 数出来的
100
130
  * 「最近 6 轮」一句真话都没有, 「最后一条回复」是一个 pong。`pingSigs` 只给保温
101
131
  * 那一种 —— resumePing ("continue") 之后模型是真的在干活, 那一轮不能丢。 */
102
- export const talkTurns = (jsonlPath, n, pingSigs = [], keepLines = false) => {
132
+ export const talkTurns = (jsonlPath, n, pingSigs = [], keepLines = false, marks = false) => {
103
133
  const clean = (ts) => withoutKeepalive(ts, pingSigs);
104
- return clean(readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, keepLines), (ts) => clean(ts).length >= n)).slice(-n);
134
+ return clean(readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, keepLines, marks), (ts) => clean(ts).length >= n)).slice(-n);
105
135
  };
106
136
  /** 一个会话的来回, 每个来回 = 一句问话 + 它之后的全部回答 (途中的话在前, 终句在
107
137
  * 最后), 旧的在前。读多深由时间窗定, 调用方再按时刻与条数裁:
@@ -130,8 +160,8 @@ export const talkRounds = (jsonlPath, rounds, pingSigs = [], win = {}) => {
130
160
  };
131
161
  /** 纯解析: 一段 transcript 原文 → 里面的对话轮次。`keepLines` 保留换行 —— 摘要与
132
162
  * 预览要压成一行, 但交给另一个 wizard 读的回复不能: 表格 / 列表 / 代码块压成一行
133
- * 之后对模型就是一团字。 */
134
- const parseTurns = (jsonlPath, raw, keepLines = false) => {
163
+ * 之后对模型就是一团字。`marks` 把 CLI 自插的 user 行留成空的 `notice` 轮 (见 Turn)。 */
164
+ const parseTurns = (jsonlPath, raw, keepLines = false, marks = false) => {
135
165
  if (!raw)
136
166
  return [];
137
167
  const normalize = backendForPath(jsonlPath).normalizeTranscriptLine;
@@ -148,6 +178,12 @@ const parseTurns = (jsonlPath, raw, keepLines = false) => {
148
178
  }
149
179
  // The first line of a truncated tail is usually a fragment — normalize
150
180
  // returning null (or a throw) is the expected outcome, not an error.
181
+ const att = parsed.attachment;
182
+ if (marks && att?.type === "queued_command" && typeof att.prompt === "string" && !parsed.isSidechain) {
183
+ const env = parseEnvelope(att.prompt);
184
+ const ms = Date.parse(String(parsed.timestamp ?? ""));
185
+ return env ? [{ role: "user", text: "", ms: Number.isNaN(ms) ? 0 : ms, env, queued: true }] : [];
186
+ }
151
187
  let row;
152
188
  try {
153
189
  row = normalize(parsed);
@@ -173,7 +209,10 @@ const parseTurns = (jsonlPath, raw, keepLines = false) => {
173
209
  const rawTs = parsed.timestamp;
174
210
  const ms = typeof rawTs === "number" ? rawTs : Date.parse(String(rawTs ?? ""));
175
211
  const mid = role === "assistant" && row.message?.stop_reason === "tool_use";
176
- return text ? [{ role, text, ms: Number.isNaN(ms) ? 0 : ms, ...(env ? { env } : {}), ...(mid ? { mid: true } : {}) }] : [];
212
+ if (!text && marks && role === "user" && raw.includes("<task-notification"))
213
+ return [{ role, text: "", ms: Number.isNaN(ms) ? 0 : ms, notice: true }];
214
+ const apiError = role === "assistant" && parsed.isApiErrorMessage === true;
215
+ return text ? [{ role, text, ms: Number.isNaN(ms) ? 0 : ms, ...(env ? { env } : {}), ...(mid ? { mid: true } : {}), ...(apiError ? { apiError: true } : {}) }] : [];
177
216
  });
178
217
  };
179
218
  // Flatten a message's content for QUOTE DEDUP only — unlike `blockText` this
@@ -360,12 +399,29 @@ const parseOpenTools = (jsonlPath, raw) => {
360
399
  * `RESULT: …`, 这里把它捞出来。取**最后一个**匹配 —— 中间复述过这个格式的那些
361
400
  * 不算数。捞不到返回 "", 调用方退回整段 lastText, 所以不遵守约定也只是退化。 */
362
401
  export const extractResult = (text, max = 800) => {
402
+ const c = parseClosing(text, max);
403
+ return c.kind === "result" ? c.text : "";
404
+ };
405
+ // NEED 只认全大写: "what I need: …" / 「需要: …」在普通答话里太常见, 误认一次就是
406
+ // 一份不计数的回执。
407
+ const CLOSING_RE = /(?:^|[\s>*|-])(RESULT|Result|result|结论|NEED)\s*[::]\s*/gm;
408
+ const ARTIFACT_RE = /^[ \t>*|-]*ARTIFACT[ \t]*[::][ \t]*(\S+)(?:[ \t]+(?:—|--|-|:)[ \t]*(.*))?$/gm;
409
+ export const parseClosing = (text, max = 800) => {
410
+ const artifacts = [...text.matchAll(ARTIFACT_RE)]
411
+ .map((m) => ({ path: m[1].replace(/^`|`$/g, ""), note: (m[2] ?? "").trim() }))
412
+ .filter((a) => !/^<.*>$/.test(a.path)); // 复述格式时的 `<路径>` 占位
363
413
  // 标记之后的**全部**内容, 而不是"那一行" —— 结论常常不止一行 (路径一行、说明
364
414
  // 一行)。约定是收口在最后, 所以标记之后剩下的就是结论。取最后一个匹配: 模型常
365
- // 先复述一遍格式要求再给答案。
366
- const hits = [...text.matchAll(/(?:^|[\s>*|-])(?:RESULT|结论)\s*[::]\s*/gim)];
367
- const last = hits[hits.length - 1];
368
- return last ? text.slice((last.index ?? 0) + last[0].length).trim().slice(0, max) : "";
415
+ // 先复述一遍格式要求再给答案。ARTIFACT 行不算结论正文。
416
+ const after = (m) => text.slice((m.index ?? 0) + m[0].length).replace(ARTIFACT_RE, "").trim().slice(0, max);
417
+ const marks = [...text.matchAll(CLOSING_RE)];
418
+ // 交差优先: 写了 RESULT 就是交差, 哪怕后面跟一句 `NEED: 无` —— 当成反问, 工单就卡到超时。
419
+ const result = marks.filter((m) => m[1] !== "NEED").at(-1);
420
+ if (result)
421
+ return { kind: "result", text: after(result), artifacts };
422
+ const need = marks.at(-1);
423
+ const q = need ? after(need) : "";
424
+ return q && !/^(?:无|没有|none|n\/a|-+)[。.]?$/i.test(q) ? { kind: "need", text: q, artifacts } : { kind: "none", text: "", artifacts };
369
425
  };
370
426
  /** The peer's most recent assistant message — the handoff payload when one
371
427
  * agent drives another ("take #fix's conclusion and review it"). */
@@ -380,9 +436,11 @@ export const clipMiddle = (s, max = 4000, head = Math.floor(max / 4)) => s.lengt
380
436
  * 发话时刻是最便宜的关联 id (A2A 的 taskId 在这里的等价物): 早于它的一律不算。
381
437
  * 没有时间戳的行 (ms=0) 无从判断, 放行 —— 退化成旧行为, 而不是把回复吞掉。
382
438
  * 保温的 pong 不算回复: 它比真正的答案晚, 不剔掉的话等的人拿到的就是一个 "pong"。 */
383
- export const lastReply = (jsonlPath, sinceMs = 0, pingSigs = []) => talkTurns(jsonlPath, 40, pingSigs, true)
439
+ export const lastReply = (jsonlPath, sinceMs = 0, pingSigs = []) => talkTurns(jsonlPath, 40, pingSigs, true, true)
384
440
  .filter((t) => t.role === "assistant" && (!t.ms || t.ms >= sinceMs))
385
441
  .at(-1)?.text ?? "";
442
+ /** 报错之后叫它接着干的那一句 (keepalive 的 resumePing 默认就是 `continue`)。 */
443
+ const RESUME_RE = /^(?:continue|go on|resume|继续|接着(?:干|做)?)[\s.!。!]*$/i;
386
444
  /** paste 到那一行落盘之间的抖动 —— 问话的时间戳可能比我们记的发话时刻早一点。 */
387
445
  const ASK_SLACK_MS = 60_000;
388
446
  /** 「`from` 那一句的回答」—— 比 lastReply 严一档, 自动回执靠它定位。
@@ -390,44 +448,40 @@ const ASK_SLACK_MS = 60_000;
390
448
  * 发话时刻 (lastReply 的 sinceMs) 分不开两件事: 目标正忙时我们这一句是排队的,
391
449
  * 它先吐出来的是**上一件事**的结论, 而那条回复同样晚于我们 paste 的时刻 —— 按时刻
392
450
  * 取就会拿旧结论当新回执。信封是更硬的锚: 我们注入的那一句在它的 transcript 里挂着
393
- * `kind=peer from=.我`, 从那一句往后数, 答的就一定是我们问的。找不到那一句 (老 wizard 的 MCP
394
- * 还不挂信封 / 后端不写时间戳) 返回 `undefined`, 调用方退回 lastReply —— 退化而不是
395
- * 吞掉; 找到了问话但它后面还没有回答 (我们那一句还排在队里) 返回 "" —— 调用方必须
396
- * 接着等, 绝不能退回去把上一件事的结论当成这一次的回执。 */
397
- export const replyToPeer = (jsonlPath, fromName, sinceMs = 0, pingSigs = []) => {
398
- const r = answerOf(talkTurns(jsonlPath, 80, pingSigs, true), fromName, sinceMs);
399
- // 两种"没有"必须分开: 找不到那一句问话 (老 wizard 不挂信封) → undefined, 调用方
400
- // 退回按时刻取; 找到了问话但它后面还没有回答 (我们这一句还排在队里) → "",
401
- // 调用方必须继续等, 绝不能退回去把**上一件事**的结论当成这一次的回执。
402
- return r && r.text;
451
+ * `kind=peer from=.我`, 从那一句往后数, 答的就一定是我们问的。找不到那一句 (还排在
452
+ * 输入框里没读进) 返回 `undefined`; 找到了问话但它后面还没有回答返回 "" —— 两种都要
453
+ * 接着等, 绝不能退回按时刻取把上一件事的结论当成这一次的回执 (receipts 只用前者分辨
454
+ * 「它在忙前面的轮」与「读进了却没答」)。 */
455
+ export const replyToPeer = (jsonlPath, fromName, sinceMs = 0, pingSigs = [], turn) => {
456
+ const r = answerOf(talkTurns(jsonlPath, 80, pingSigs, true, true), fromName, sinceMs, turn);
457
+ return r && { text: r.text, ...(r.error ? { error: true } : {}) };
403
458
  };
404
459
  /** 交接那一刻, `from` 那一句在旧会话里**收口**了没有 —— 比 replyToPeer 再严一档。
405
460
  *
406
461
  * 自我交接是在某一轮**中途**调的: 那一轮最后一条 assistant 是"已交接"之类的收尾,
407
462
  * 不是答案。所以只认在 `untilMs` 之前就被下一句 user 行关上的那一轮: 问话那一轮
408
463
  * 还开着 (就是交接这一轮) → "", 这份回执的义务跟着简报转进新会话。三态同 replyToPeer。 */
409
- export const replyClosedBefore = (jsonlPath, fromName, sinceMs, untilMs, pingSigs = []) => {
410
- const r = answerOf(talkTurns(jsonlPath, 80, pingSigs, true), fromName, sinceMs);
411
- return r && (r.closedAt !== undefined && r.closedAt < untilMs ? r.text : "");
412
- };
413
- /** `from` 那一句 (发话时刻之后最新的那次) 所在那一轮的终句。答案止于**下一句 user 行**:
414
- * 这一轮还开着、最后一句又是中途句 (`mid`, 后面跟着工具调用) → 还没答完, 回 "" 让调用方
415
- * 接着等 —— 忙闲判定会在长工具调用 / 生成的间隙误报一次「闲了」, 那时取到的是
416
- * 「开始读文件」这种开场白, 不是结论。被下一句 user 行关上的就照取最后一句 (中途被打断)。
417
- * 那是另一轮的开始 (同伴的新话、回执、人) —— 不截的话, 答方刚说完紧接着收到一份回执、
418
- * 回了句「收到」, 发话方拿到的就是这句。CLI 在一轮中途吃进的排队消息记成
419
- * `attachment`, 不是 user 行, 截不断一轮。`closedAt` = 关上这一轮的那一行的时刻
420
- * (还开着 = undefined)。 */
421
- const answerOf = (ts, fromName, sinceMs) => {
422
- const asked = ts.reduce((hit, t, i) => t.role === "user" && t.env?.kind === "peer" && t.env.from === fromName && (!t.ms || t.ms >= sinceMs - ASK_SLACK_MS)
423
- ? i
424
- : hit, -1);
464
+ export const replyClosedBefore = (jsonlPath, fromName, sinceMs, untilMs, pingSigs = [], turn) => {
465
+ const r = answerOf(talkTurns(jsonlPath, 80, pingSigs, true, true), fromName, sinceMs, turn);
466
+ return r && (r.closedAt !== undefined && r.closedAt < untilMs && !r.error ? r.text : "");
467
+ };
468
+ /** 这一行是在续上一轮 (报错之后没有信封的 `continue` / 「继续」), 不起新的一轮。 */
469
+ const resumesAt = (ts, i) => !!ts[i - 1]?.apiError && !ts[i].env && !ts[i].notice && RESUME_RE.test(ts[i].text.trim());
470
+ /** 开最近这一轮的那句 user 行 (`marks` 读出来的 turns): 排队吃进的、后台通知、报错后的
471
+ * 续跑都不算 —— 它们不起新的一轮, 这一轮是谁发起的要看再往前那一句。 */
472
+ export const openingOf = (ts) => ts.filter((t, i) => t.role === "user" && !t.queued && !t.notice && !resumesAt(ts, i)).at(-1);
473
+ const answerOf = (ts, fromName, sinceMs, turn) => {
474
+ const lastAsk = (hit) => ts.reduce((at, t, i) => (t.role === "user" && t.env && hit(t.env) && (!t.ms || t.ms >= sinceMs - ASK_SLACK_MS) ? i : at), -1);
475
+ const byTurn = turn ? lastAsk((e) => !e.receipt && e.turn === turn) : -1;
476
+ // 退回按人找时只认没有件号的老信封: 带件号的那些是别的件, 不是这一件。
477
+ const direct = byTurn >= 0 ? byTurn : lastAsk((e) => !e.receipt && e.kind === "peer" && e.from === fromName && !(turn && e.turn));
478
+ const asked = Math.max(direct, lastAsk((e) => !!e.receipt && e.replyTo === fromName));
425
479
  if (asked < 0)
426
480
  return undefined;
427
- const next = ts.findIndex((t, i) => i > asked && t.role === "user");
481
+ const next = ts.findIndex((t, i) => i > asked && t.role === "user" && !t.queued && !resumesAt(ts, i));
428
482
  const last = ts.slice(asked + 1, next < 0 ? undefined : next).filter((t) => t.role === "assistant").at(-1);
429
483
  const text = last && !(last.mid && next < 0) ? last.text : "";
430
- return { text, ...(next < 0 ? {} : { closedAt: ts[next].ms ?? 0 }) };
484
+ return { text, ...(next < 0 ? {} : { closedAt: ts[next].ms ?? 0 }), ...(text && last?.apiError ? { error: true } : {}) };
431
485
  };
432
486
  // ── wizard → wizard 的信封 ────────────────────────────────────────────
433
487
  // 同伴的话是原样落进输入框的, 而落进输入框的东西在模型眼里都是「用户说的」。没有
@@ -448,40 +502,84 @@ export { parseEnvelope };
448
502
  * 谁、在哪说的; 住在与一个人的单聊里的, 默认值就是对的, 不为它每轮多付一段。 */
449
503
  export const renderHumanEnvelope = (user, chat) => renderReminder(envelopeAttrs.human(user, chat), [`这一轮是 \`${user}\` 在群 **${chat}** 里说的, 你的回复发回那个群。`]);
450
504
  /** 定时任务放的那一轮: 不标的话, 记录里它就成了「人说的」。 */
451
- export const renderTaskEnvelope = (taskId) => renderReminder(envelopeAttrs.task(taskId), [`这一轮是定时任务 \`${taskId}\` 到点放进来的, 不是人此刻说的 —— 照常执行, 回复照常发进群。`]);
505
+ export const renderTaskEnvelope = (taskId, quiet) => renderReminder(envelopeAttrs.task(taskId, quiet?.turn), quiet
506
+ ? [`这一轮是定时任务 \`${taskId}\` 到点放进来的, 不是人此刻说的, 而且是**有事才说**的那种: 这一轮私下跑, 没人在看。`,
507
+ "照常执行。看完**没有值得人知道的**, 最后一条消息就只写一行 `QUIET`, 什么也不会发出去; 有, 就把最后一条消息写给人看 —— 守护进程原样转进群。",
508
+ "要派活给别的 wizard, 就在这一轮里用 `wait_peer` 把结果拿回来再收口 —— 回执要等这一轮结束才到, 那时已经没人替你转发。"]
509
+ : [`这一轮是定时任务 \`${taskId}\` 到点放进来的, 不是人此刻说的 —— 照常执行, 回复照常发进群。`]);
452
510
  /** `from` = 发话方的称呼 (`.name`); `chat` 给了 = 公开轮 (那个群的名字, 可以是 ""),
453
511
  * 不给 = 私聊。 */
454
- export const renderPeerEnvelope = (from, chat) => renderReminder(envelopeAttrs.peer(from, chat), chat === undefined
455
- ? [
456
- `这一轮是 wizard \`${from}\` 发来的**私聊**, 不是人说的: 人看不见这一轮, 读你回复的是 \`${from}\`。`,
457
- `你这一轮的**最后一条消息**就是给它的回执 —— 你一停下, 守护进程自动把它送进 \`${from}\` 的输入框, **你不需要再调任何工具**: 不要 send_peer 回它 (那会让它多跑一轮), 也不要为这一轮 notify。`,
458
- "对 wizard 直说: 不寒暄、不加对人的称呼、不复述它的话; 结论收口成末尾的 `RESULT: …` (交付物写进文件就回传路径), 要它补信息也写在那里。",
459
- ]
460
- : [
461
- `这一轮是 wizard \`${from}\` 在群${chat ? ` **${chat}** ` : ""}里**公开**对你说的: 你的回复会直接发进那个群, 人和 \`${from}\` 都看得到。`,
462
- `照对人说话的方式答; 不要再 send_peer 把同一段话回给 \`${from}\` —— 你停下之后守护进程会自动把这段结论送回它那里。`,
463
- ]);
512
+ export const renderPeerEnvelope = (from, chat, t) => renderReminder(envelopeAttrs.peer(from, chat, t), [
513
+ ...(chat === undefined
514
+ ? [
515
+ `这一轮是 wizard \`${from}\` 发来的**私聊**, 不是人说的: 人看不见这一轮, 读你回复的是 \`${from}\`。`,
516
+ ...(t?.quiet
517
+ ? [`\`${from}\` **不收回执**: 你这一轮的终句不会送到任何地方 —— 别 tell_peer 回它, 也别为这一轮 notify。`]
518
+ : [
519
+ `你这一轮的**最后一条消息**就是给它的回执 —— 你一停下, 守护进程自动把它送进 \`${from}\` 的输入框, **你不需要再调任何工具**: 不要 send_peer 回它 (那会让它多跑一轮), 也不要为这一轮 notify。`,
520
+ "对 wizard 直说: 不寒暄、不加对人的称呼、不复述它的话; 结论收口成末尾的 `RESULT: …` (交付物写进文件就回传路径); 要它补信息才能干下去, 就收口成 `NEED: <问题>` (这一份不算交差); 交付了文件, 每个加一行 `ARTIFACT: <路径> — 一句话`。",
521
+ ]),
522
+ ]
523
+ : [
524
+ `这一轮是 wizard \`${from}\` 在群${chat ? ` **${chat}** ` : ""}里**公开**对你说的: 你的回复会直接发进那个群, 人和 \`${from}\` 都看得到。`,
525
+ `照对人说话的方式答; 不要再 send_peer 把同一段话回给 \`${from}\` —— 你停下之后守护进程会自动把这段结论送回它那里。`,
526
+ ]),
527
+ ...(t?.re ? [`这是对件 \`${t.turn}\` 的**续问**: 接着那件活说, 不是一件新活。`] : []),
528
+ // 这句话要怎么接 —— 只有发话方知道, 不写出来对方一律当成一件活去干。
529
+ ...(t?.act === "ask" ? [`这是一个**提问**: 只答这一问, 几句话${t.quiet ? "" : "收口 (`RESULT: <答案>`)"}, 别为它开新活; 你手上原来的活答完接着干。`] : []),
530
+ ...(t?.act === "fyi" ? ["这是一条**知会**: 不用回复、不用收口, 也别为它开新活 —— 与手头的活相关就顺手吸收, 无关就略过; 一句话收住这一轮即可。"] : []),
531
+ // 来回多了就收口: 不在守护进程里拒绝 —— 拒了模型会换条通路接着乒乓。
532
+ ...((t?.legs ?? 0) > 3 ? [`这件活已经来回 ${t.legs - 1} 次: 这一次请直接给 \`RESULT:\`, 拿不准的写清你的假设。`] : []),
533
+ ...(t?.deadline ? [`期限 ${hhmm(t.deadline)}: 到点还没答完, \`${from}\` 收到的是一份超时回执。`] : []),
534
+ ]);
535
+ const hhmm = (ms) => new Date(ms).toTimeString().slice(0, 5);
464
536
  /** 回执的信封 —— 这一轮是对方干完活、守护进程自动送回来的结论, 不是新派的活。
465
537
  *
466
538
  * 为什么必须有它: 回执是原样 paste 进输入框的, 而落进输入框的东西在模型眼里都是
467
539
  * 「有人在对我说话」。没有这一段, 它会把一份结论当成一件新活去做, 或者客气地回它
468
540
  * 一句 —— 而回那一句又会被对方当成新的一轮。所以这里写死三件事: 这是回执、原话在
469
541
  * 下面、读完接着干你自己的, 别回话。 */
470
- export const renderReceiptEnvelope = (from, chat, job) => renderReminder(envelopeAttrs.receipt(from, chat, job), [
471
- `这是 wizard \`${from}\` 对你某一次 send_peer 的**回执**: 它那一轮干完了, 守护进程把它的结论自动送到你这里 —— 不是人说的, 也不是新派给你的活。`,
472
- ...(chat === undefined
473
- ? [`这段对话是私聊, 人看不见。`]
474
- : [`这一轮的对话在群${chat ? ` **${chat}** ` : ""}里, 人看得见你们俩。`]),
475
- "下面就是它的原话。据此接着干你自己手上那件事; **不要为收到回执而回话** —— 不要 send_peer 回它 (除非你确实有新的东西要问它), 也不要把这段原话复述给人, 只说你据此做了什么、结论是什么。",
476
- "它可能还没干完全部 —— 读 `RESULT:` 那一行 (如果有) 作为它的收口结论; 要更多细节用 peek_peer 读它的对话, 不要猜。",
542
+ export const renderReceiptEnvelope = (from, chat, job, status = "done", turn, route) => renderReminder(envelopeAttrs.receipt(from, chat, job, status, turn, route), [
543
+ ...(status === "done"
544
+ ? [`这是 wizard \`${from}\` 对你某一次 send_peer 的**回执**: 它那一轮干完了, 守护进程把它的结论自动送到你这里 —— 不是人说的, 也不是新派给你的活。`]
545
+ : status === "need"
546
+ ? [`这是 wizard \`${from}\` 对你某一次 send_peer 的**反问**: 它缺信息干不下去, 下面 \`NEED:\` 后面就是它要的 —— 按下面的件号续问答它; 这一份**不计入工单**, 它拿到答复干完会再送一份回执。`]
547
+ : status === "error"
548
+ ? [`这是 wizard \`${from}\` 对你某一次 send_peer 的**失败回执**: 它那一轮以 CLI 报错收尾, 下面是报错原文, 不是它的结论, **不计入工单**。它若被续跑、之后答出来, 结论会照常再送来一份; 等不及就 peek_peer 看它, 或者再 tell_peer 它一次。`]
549
+ : [`这是 wizard \`${from}\` 对你某一次 send_peer 的**失败回执**: ${FAILED[status]}, 这一份不会再有答案了 (工单里按已落定计)。自己判断: 换人、再 tell_peer 追问, 或者在汇总里如实写缺了这一份。下面是守护进程的说明和它最后说的一句。`]),
550
+ // 去向由守护进程按派活链算好 (receipts.routeOf), 这里只告诉模型终句会落到哪。
551
+ ...(route?.replyTo?.startsWith(".")
552
+ ? [`你这一轮的**最后一条消息会作为回执送回 \`${route.replyTo}\`** (它当初把这件活派给你, 你转给了 \`${from}\`) —— 据此收口, 末尾写 \`RESULT: …\`。`]
553
+ : route?.replyTo
554
+ ? [`你这一轮的**最后一条消息会发进群「${route.replyTo}」**, ${route.audience ? `\`${route.audience}\` ` : "人"}在等这件事的结论 —— 写给人看: 做成了什么、没做成什么, 不复述 \`${from}\` 的原话。`]
555
+ : route?.pending && !(job && job.job)
556
+ ? [`还有 ${route.pending} 份没回: 这一轮的回复只记在 rolepage, 不外发 —— 先记下这一份, 等最后一份到了再收口。`]
557
+ : chat === undefined
558
+ ? [`这段对话是私聊, 人看不见。`]
559
+ : [`这一轮的对话在群${chat ? ` **${chat}** ` : ""}里, 人看得见你们俩。`]),
560
+ ...(status === "done"
561
+ ? [
562
+ ...(route?.replyTo ? [] : ["下面就是它的原话。据此接着干你自己手上那件事; **不要为收到回执而回话** —— 不要 send_peer 回它 (除非你确实有新的东西要问它), 也不要把这段原话复述给人, 只说你据此做了什么、结论是什么。"]),
563
+ "它可能还没干完全部 —— 读 `RESULT:` 那一行 (如果有) 作为它的收口结论; 要更多细节用 peek_peer 读它的对话, 不要猜。",
564
+ ]
565
+ : []),
566
+ ...(turn ? [`这件活是 \`${turn}\`: 要就它追问、补充, 用 \`tell_peer({name: "${from}", re: "${turn}"})\` —— 沿用同一个频道, 工单还开着就沿用工单。`] : []),
477
567
  // 「齐了吗」是守护进程数的, 不让模型在上下文里自己数 —— 异步回执是 N 个独立
478
568
  // 的轮次陆续进来的, 数错一个就会提前收口或者永远等。
479
- ...(job && job.job
480
- ? job.done >= job.total
481
- ? [`这是工单 \`${job.job}\` 的**最后一份** (${job.done}/${job.total}, 全部到齐): 现在可以汇总收口了 —— close_job(summary) 发结论并回收临时分身。`]
482
- : [`这是工单 \`${job.job}\` 的第 ${job.done}/${job.total} 份, **还差 ${job.total - job.done} 份**: 先把这一份记住 (或落到文件里), 不要现在汇总、也不要向人汇报进度; 等最后一份到了会明确告诉你「全部到齐」。`]
569
+ ...(job && job.job && status !== "need"
570
+ ? job.closed
571
+ ? [`工单 \`${job.job}\` 已经收工 (close_job 过了), 这一份是收工之后才到的: 不必再 close_job, 也不计入那次汇总${status === "done" && !route?.replyTo ? " —— 这段结论还有用, 就自己补一句交代 (notify 给人 / 回给上游)" : ""}。`]
572
+ : job.done >= job.total
573
+ ? [`这是工单 \`${job.job}\` 的**最后一份** (${job.done}/${job.total}, 全部到齐): 现在可以汇总收口了 —— close_job(summary) 留档并回收临时分身 (不发群); 给人的结论就是你这一轮的最后一条消息, 用你自己的话写${route?.replyTo && !route.replyTo.startsWith(".") ? " —— 它会进群" : ""}。`]
574
+ : [`这是工单 \`${job.job}\` 的第 ${job.done}/${job.total} 份, **还差 ${job.total - job.done} 份**: 先把这一份记住 (或落到文件里), 不要现在汇总、也不要向人汇报进度; 等最后一份到了会明确告诉你「全部到齐」。`]
483
575
  : []),
484
576
  ]);
577
+ const FAILED = {
578
+ timeout: "等到期限它还没答完",
579
+ silent: "它停下了几次, 都没有答这一句",
580
+ dead: "它的 pane 没了 (被收掉或崩了)",
581
+ canceled: "它这件活被人收掉 / 打断了",
582
+ };
485
583
  /** Prompt-token size of the session's most recent turn: input + both cache
486
584
  * tiers = how full the context window is, i.e. exactly what a cold cache would
487
585
  * have to re-write at 1.25x. Read from the last assistant usage snapshot in
@@ -517,6 +615,31 @@ const pickContextTokens = (jsonlPath, raw) => {
517
615
  }
518
616
  return 0;
519
617
  };
618
+ /** Prompt-cache TTL (s) this session actually writes with, read off the last
619
+ * usage's per-tier split (`cache_creation.ephemeral_{1h,5m}_input_tokens`):
620
+ * Claude Code on a subscription writes 1h entries, the bare API default is 5min.
621
+ * 0 = no tiered write on record (backend without the split, or no turn yet) —
622
+ * the caller falls back to config. */
623
+ export const cacheTtlSec = (jsonlPath) => readTailUntil(jsonlPath, (raw) => pickCacheTtl(jsonlPath, raw), (v) => v > 0);
624
+ const pickCacheTtl = (jsonlPath, raw) => {
625
+ const normalize = backendForPath(jsonlPath).normalizeTranscriptLine;
626
+ const lines = raw.split("\n").filter((l) => l.includes("ephemeral_"));
627
+ for (let i = lines.length - 1; i >= 0; i--) {
628
+ let row;
629
+ try {
630
+ row = normalize(JSON.parse(lines[i]));
631
+ }
632
+ catch {
633
+ continue;
634
+ }
635
+ const cc = row?.message?.usage?.cache_creation;
636
+ if ((cc?.ephemeral_1h_input_tokens ?? 0) > 0)
637
+ return 3600;
638
+ if ((cc?.ephemeral_5m_input_tokens ?? 0) > 0)
639
+ return 300;
640
+ }
641
+ return 0;
642
+ };
520
643
  /** 这段上下文里读过 / 改过的文件 (旧的在前、去重, 同一文件按最后一次碰它的位置排)。
521
644
  *
522
645
  * 「它的上下文里装着什么」是可以算出来的事实: 从文件尾往回, 撞上 compact 边界就停