wezard 2.6.3 → 2.7.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.
- package/.claude-plugin/plugin.json +1 -1
- package/CLAUDE.md +6 -6
- package/README.md +1 -15
- package/dist/cli/codex-hook.js +5 -1
- package/dist/cli/codex-hook.js.map +1 -1
- package/dist/cli/sync.js +5 -4
- package/dist/cli/sync.js.map +1 -1
- package/dist/daemon/approval.js +12 -5
- package/dist/daemon/approval.js.map +1 -1
- package/dist/daemon/bot-mux.js +4 -0
- package/dist/daemon/bot-mux.js.map +1 -1
- package/dist/daemon/chat-log.js +5 -5
- package/dist/daemon/chat-log.js.map +1 -1
- package/dist/daemon/chat-name.js +5 -2
- package/dist/daemon/chat-name.js.map +1 -1
- package/dist/daemon/detail.js +28 -5
- package/dist/daemon/detail.js.map +1 -1
- package/dist/daemon/direction.js +3 -2
- package/dist/daemon/direction.js.map +1 -1
- package/dist/daemon/dispatch.js +6 -0
- package/dist/daemon/dispatch.js.map +1 -0
- package/dist/daemon/handoff.js +66 -15
- package/dist/daemon/handoff.js.map +1 -1
- package/dist/daemon/image-input.js +25 -5
- package/dist/daemon/image-input.js.map +1 -1
- package/dist/daemon/inbound.js +5 -6
- package/dist/daemon/inbound.js.map +1 -1
- package/dist/daemon/index.js +1232 -671
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/jobs.js +13 -3
- package/dist/daemon/jobs.js.map +1 -1
- package/dist/daemon/last-response.js +29 -4
- package/dist/daemon/last-response.js.map +1 -1
- package/dist/daemon/message-events.js +534 -0
- package/dist/daemon/message-events.js.map +1 -0
- package/dist/daemon/mirror-bridge.js +702 -790
- package/dist/daemon/mirror-bridge.js.map +1 -1
- package/dist/daemon/mirror-store.js.map +1 -1
- package/dist/daemon/notices.js +9 -2
- package/dist/daemon/notices.js.map +1 -1
- package/dist/daemon/peers.js +124 -145
- package/dist/daemon/peers.js.map +1 -1
- package/dist/daemon/pending-items.js +33 -34
- package/dist/daemon/pending-items.js.map +1 -1
- package/dist/daemon/route.js +5 -2
- package/dist/daemon/route.js.map +1 -1
- package/dist/daemon/router.js +643 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/session-name.js +1 -1
- package/dist/daemon/session-name.js.map +1 -1
- package/dist/daemon/spawn-tmux.js +32 -13
- package/dist/daemon/spawn-tmux.js.map +1 -1
- package/dist/daemon/subagent-tail.js +3 -3
- package/dist/daemon/subagent-tail.js.map +1 -1
- package/dist/daemon/weixin.js +111 -7
- package/dist/daemon/weixin.js.map +1 -1
- package/dist/daemon/{cc-session.js → wezard-session.js} +32 -2
- package/dist/daemon/wezard-session.js.map +1 -0
- package/dist/daemon/wizard.js +5 -5
- package/dist/daemon/wizard.js.map +1 -1
- package/dist/daemon/workflow-nodes.js +3 -3
- package/dist/daemon/workflow-nodes.js.map +1 -1
- package/dist/daemon/workflow-plans.js +9 -6
- package/dist/daemon/workflow-plans.js.map +1 -1
- package/dist/mcp/server.js +38 -47
- package/dist/mcp/server.js.map +1 -1
- package/dist/shared/chat-http.js +2 -2
- package/dist/shared/chat-http.js.map +1 -1
- package/dist/shared/chat-view.js +0 -4
- package/dist/shared/chat-view.js.map +1 -1
- package/dist/shared/cli-backends.js +11 -1
- package/dist/shared/cli-backends.js.map +1 -1
- package/dist/shared/codex.js +1 -1
- package/dist/shared/codex.js.map +1 -1
- package/dist/shared/config.js +3 -44
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/detail-render.js +36 -11
- package/dist/shared/detail-render.js.map +1 -1
- package/dist/shared/detail-store.js.map +1 -1
- package/dist/shared/message-footer.js +8 -8
- package/dist/shared/message-footer.js.map +1 -1
- package/dist/shared/reminder.js +109 -37
- package/dist/shared/reminder.js.map +1 -1
- package/dist/shared/role-render.js +28 -20
- package/dist/shared/role-render.js.map +1 -1
- package/dist/shared/role-search.js +3 -3
- package/dist/shared/role-search.js.map +1 -1
- package/dist/shared/role-view.js +50 -30
- package/dist/shared/role-view.js.map +1 -1
- package/dist/shared/session-label.js +25 -6
- package/dist/shared/session-label.js.map +1 -1
- package/dist/shared/turn-state.js +7 -7
- package/dist/shared/turn-state.js.map +1 -1
- package/dist/shared/world.js +1 -3
- package/dist/shared/world.js.map +1 -1
- package/hooks/pre-tool-use.sh +5 -25
- package/package.json +1 -1
- package/web/chat.css +3 -33
- package/web/chat.js +11 -62
- package/dist/daemon/answer-transfer.js +0 -56
- package/dist/daemon/answer-transfer.js.map +0 -1
- package/dist/daemon/cc-session.js.map +0 -1
- package/dist/daemon/receipts.js +0 -906
- package/dist/daemon/receipts.js.map +0 -1
- package/dist/shared/keepalive.js +0 -46
- package/dist/shared/keepalive.js.map +0 -1
|
@@ -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;
|
|
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;AAiCxE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAe,EAAE,CAAC,WAAW,CAAmB,QAAQ,CAAC,CAAC"}
|
package/dist/daemon/notices.js
CHANGED
|
@@ -120,6 +120,13 @@ export const renderSnapshot = (rows) => [
|
|
|
120
120
|
...rows.slice(0, SNAP_MAX).map(snapRow),
|
|
121
121
|
...(rows.length > SNAP_MAX ? [`…(+${rows.length - SNAP_MAX}) wizard_roster`] : []),
|
|
122
122
|
];
|
|
123
|
+
/** reminder 名册的活跃阈值: 超过 2 天没活动的冷绑定不进表 (full / delta 同一口径)。
|
|
124
|
+
* wizard_roster 的全表语义不变 —— 只滤这份推送。 */
|
|
125
|
+
export const ROSTER_ACTIVE_MS = 2 * 24 * 3600_000;
|
|
126
|
+
/** 只留活口: 在忙 / 挂在审批上的、刚 spawn 还没写过的 (touch=0)、阈值内有活动的。 */
|
|
127
|
+
export const activeRows = (rows, now = Date.now()) => rows
|
|
128
|
+
.filter((r) => r.state === "busy" || r.state === "parked" || !r.touch || now - r.touch <= ROSTER_ACTIVE_MS)
|
|
129
|
+
.map(({ touch: _, ...r }) => r);
|
|
123
130
|
/** 一行快照「变没变」的口径: ctx 按 CTX_STEP 分档 —— 每轮涨几 k 不值得再说一遍, 跨档 (含 COLD_GATE 100k) 才说。 */
|
|
124
131
|
export const CTX_STEP = 50_000;
|
|
125
132
|
const sigOf = (r) => [r.state, r.ctx === undefined ? "" : Math.floor(r.ctx / CTX_STEP), cacheOf(r.cold), r.job].join("|");
|
|
@@ -145,7 +152,7 @@ export const rosterPart = (ns, cwd, snap) => (seen) => {
|
|
|
145
152
|
if (table?.length) {
|
|
146
153
|
const notes = fresh.filter(([, n]) => !subsumed(n));
|
|
147
154
|
return {
|
|
148
|
-
text: renderReminder({ wezard: "roster"
|
|
155
|
+
text: renderReminder({ wezard: "roster" }, [
|
|
149
156
|
"Wizards in this chat now (as of this message; truth: wizard_roster). FYI only — don't reply.",
|
|
150
157
|
// 列义只随整表给 (每个窗口一次), 变动行不重复。dispatch 不点名时自己算冷热, 这几列只在点名 `to` / tell_peer 时要看。
|
|
151
158
|
"state: busy=mid-turn (a new task queues behind it) · parked=waiting on an approval click · idle=free · -=no live session (waking respawns it). cache cold = waking it rewrites its whole ctx (≈ctx/25k × a fresh spawn); only weigh this when you name `to` — dispatch already does.",
|
|
@@ -160,7 +167,7 @@ export const rosterPart = (ns, cwd, snap) => (seen) => {
|
|
|
160
167
|
const rows = groupRows(fresh.map(([, n]) => n), cwd);
|
|
161
168
|
const rule = !seen("rule:roster");
|
|
162
169
|
return {
|
|
163
|
-
text: renderReminder({ wezard: "roster"
|
|
170
|
+
text: renderReminder({ wezard: "roster" }, [
|
|
164
171
|
...(rule ? ["Roster changes since your charter snapshot (truth: wizard_roster). FYI only — don't reply or relay; skip if irrelevant."] : []),
|
|
165
172
|
...(moved.length ? ["Rows changed since the last table (name,state,ctx,cache,job; as of this message):", ...moved.map(snapRow)] : []),
|
|
166
173
|
...rows.map((r) => `- ${r}`),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notices.js","sourceRoot":"","sources":["../../daemon/notices.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"notices.js","sourceRoot":"","sources":["../../daemon/notices.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/peers.js
CHANGED
|
@@ -10,10 +10,9 @@
|
|
|
10
10
|
// no tmux, no WeCom, no daemon state. The mirror bridge (which owns the live
|
|
11
11
|
// attachments) and the graph runner (which drives them) both compose on top.
|
|
12
12
|
import { existsSync, openSync, readSync, closeSync, statSync } from "node:fs";
|
|
13
|
-
import { backendForPath } from "../shared/cli-backends.js";
|
|
13
|
+
import { backendForPath, TURN_METRICS } from "../shared/cli-backends.js";
|
|
14
14
|
import { clipLine, truncate, truncateWithCount } from "../shared/std.js";
|
|
15
15
|
import { tildePath } from "./notices.js";
|
|
16
|
-
import { isKeepalivePingText, withoutKeepalive } from "../shared/keepalive.js";
|
|
17
16
|
import { envelopeAttrs, parseEnvelope, renderReminder } from "../shared/reminder.js";
|
|
18
17
|
/** Strip ANSI SGR/CSI + OSC so captured pane text is safe to embed / match on. */
|
|
19
18
|
export const stripAnsi = (s) => s.replace(/\x1B\[[0-9;?]*[a-zA-Z]/g, "").replace(/\x1B\][^\x07]*\x07/g, "");
|
|
@@ -25,7 +24,7 @@ const TAIL_BYTES = 64 * 1024;
|
|
|
25
24
|
// …除非单行本身就比窗口大。Claude Code 每轮往 transcript 里写若干 `attachment`
|
|
26
25
|
// 行, 其中 `prompt_snapshot` 带完整系统提示 + skill 清单 —— 实测一行 157KB。一条
|
|
27
26
|
// 这样的行就能把 64K 的窗口整个吃掉, 于是尾部根本够不到真正的对话行: lastText 空、
|
|
28
|
-
// summarizeTail
|
|
27
|
+
// summarizeTail 空。窗口因此按需长大: 常见
|
|
29
28
|
// 情况仍然只读 64K, 读不到要的东西才翻四倍, 到这个上限为止 (再大就不是"尾巴"了)。
|
|
30
29
|
const TAIL_BYTES_MAX = 2 * 1024 * 1024;
|
|
31
30
|
const fileSize = (jsonlPath) => {
|
|
@@ -99,6 +98,26 @@ const readTailUntil = (jsonlPath, parse, enough, max = TAIL_BYTES_MAX) => {
|
|
|
99
98
|
};
|
|
100
99
|
return walk(Math.min(TAIL_BYTES, ceiling));
|
|
101
100
|
};
|
|
101
|
+
/** Native Codex lifecycle survives tool waits and dimmed/hidden spinner footers. */
|
|
102
|
+
export const codexTurnBusy = (jsonlPath, since = 0) => readTailUntil(jsonlPath, (raw) => raw.split("\n").reverse().reduce((busy, line) => {
|
|
103
|
+
if (busy !== undefined || !line.includes('"event_msg"'))
|
|
104
|
+
return busy;
|
|
105
|
+
try {
|
|
106
|
+
const r = JSON.parse(line);
|
|
107
|
+
if (r.type !== "event_msg")
|
|
108
|
+
return undefined;
|
|
109
|
+
// A resumed CLI cannot still be running a turn from its previous process.
|
|
110
|
+
if (Date.parse(r.timestamp) < since)
|
|
111
|
+
return undefined;
|
|
112
|
+
const type = r.payload?.type;
|
|
113
|
+
return type === "task_started" ? true
|
|
114
|
+
: ["task_complete", "task_completed", "turn_complete", "turn_aborted"].includes(type) ? false
|
|
115
|
+
: undefined;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}, undefined), (busy) => busy !== undefined, Infinity);
|
|
102
121
|
// Meta wrappers Claude Code injects around slash commands / hook output. They
|
|
103
122
|
// are machinery, not conversation — drop them before any summary or handoff.
|
|
104
123
|
const META_RE = /<(system-reminder|command-[^>\s]*|local-command-[^>\s]*|task-notification)(?:\s[^>]*)?>[\s\S]*?<\/\1>/g;
|
|
@@ -126,34 +145,28 @@ export const tailTurns = (jsonlPath, n = 3, keepLines = false) => readTailUntil(
|
|
|
126
145
|
/** 最后一句进到模型的话 (带信封), 往回读到有为止 —— 中间隔着多少轮工具都不怕。 */
|
|
127
146
|
export const lastUserTurn = (jsonlPath) => readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, true), (ts) => ts.some((t) => t.role === "user"))
|
|
128
147
|
.filter((t) => t.role === "user").at(-1);
|
|
129
|
-
/**
|
|
130
|
-
|
|
131
|
-
* 「最近 6 轮」一句真话都没有, 「最后一条回复」是一个 pong。 */
|
|
132
|
-
export const talkTurns = (jsonlPath, n, pingSigs = [], keepLines = false, marks = false) => {
|
|
133
|
-
const clean = (ts) => withoutKeepalive(ts, pingSigs);
|
|
134
|
-
return clean(readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, keepLines, marks), (ts) => clean(ts).length >= n)).slice(-n);
|
|
135
|
-
};
|
|
148
|
+
/** 最后 `n` 轮对话 —— 凡是交给另一个 wizard (或人)**读**的都走这里。 */
|
|
149
|
+
export const talkTurns = (jsonlPath, n, keepLines = false, marks = false) => readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, keepLines, marks), (ts) => ts.length >= n).slice(-n);
|
|
136
150
|
/** 从 `sinceMs` 起的全部来回 (带标记): 往回读到越过它的第一行为止, **不受 TAIL_BYTES_MAX
|
|
137
151
|
* 限制**。按条数读尾巴的 talkTurns 管不了一轮很长的情形: 一轮里的大段工具输出 (读文件、
|
|
138
152
|
* 跑命令) 能把开这一轮的那句推到 2MB 之外 —— 回执就再也定位不到问话, 对方答完了也只能
|
|
139
153
|
* 报 silent。问话一定晚于发话时刻, 所以读到发话时刻之前就够了, 再大的文件也只读这一段。 */
|
|
140
|
-
export const turnsSince = (jsonlPath, sinceMs
|
|
154
|
+
export const turnsSince = (jsonlPath, sinceMs) => readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, true, true), (ts) => ts.some((t) => !!t.ms && t.ms < sinceMs), Infinity);
|
|
141
155
|
/** 一个会话的来回, 每个来回 = 一句问话 + 它之后的全部回答 (途中的话在前, 终句在
|
|
142
156
|
* 最后), 旧的在前。读多深由时间窗定, 调用方再按时刻与条数裁:
|
|
143
157
|
* 给了 `since` → 一直读到比它更早的那一句 (窗口内的一句不漏);
|
|
144
158
|
* 没给 → 读到 `until` 之前攒够 `rounds` 个来回为止。
|
|
145
159
|
* 多读一个问话才停, 所以留下的最早一组是完整的; 开头那组若没有问话 (问话落在
|
|
146
160
|
* 读到的范围之外) 就丢掉 —— 一句不知道在答谁的话没法归到任何频道。 */
|
|
147
|
-
export const talkRounds = (jsonlPath, rounds,
|
|
161
|
+
export const talkRounds = (jsonlPath, rounds, win = {}) => {
|
|
148
162
|
const { since, until = Infinity } = win;
|
|
149
|
-
const clean = (ts) => withoutKeepalive(ts, pingSigs);
|
|
150
163
|
const enough = (ts) => {
|
|
151
|
-
const seen =
|
|
164
|
+
const seen = ts.filter((t) => (t.ms ?? 0) < until);
|
|
152
165
|
return since !== undefined
|
|
153
166
|
? seen.length > 0 && (seen[0].ms ?? 0) < since
|
|
154
167
|
: seen.filter((t) => t.role === "user").length > rounds;
|
|
155
168
|
};
|
|
156
|
-
return
|
|
169
|
+
return readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, true), enough)
|
|
157
170
|
.reduce((acc, t) => {
|
|
158
171
|
if (t.role === "user" || acc.length === 0)
|
|
159
172
|
acc.push([t]);
|
|
@@ -166,7 +179,9 @@ export const talkRounds = (jsonlPath, rounds, pingSigs = [], win = {}) => {
|
|
|
166
179
|
/** 纯解析: 一段 transcript 原文 → 里面的对话轮次。`keepLines` 保留换行 —— 摘要与
|
|
167
180
|
* 预览要压成一行, 但交给另一个 wizard 读的回复不能: 表格 / 列表 / 代码块压成一行
|
|
168
181
|
* 之后对模型就是一团字。`marks` 把 CLI 自插的 user 行留成空的 `notice` 轮 (见 Turn)。 */
|
|
169
|
-
const parseTurns = (jsonlPath, raw, keepLines = false, marks = false) =>
|
|
182
|
+
const parseTurns = (jsonlPath, raw, keepLines = false, marks = false) => foldMarks(lineItems(jsonlPath, raw, keepLines, marks));
|
|
183
|
+
const isTurnEnd = (row) => row.type === "system" && (row.subtype === "turn_duration" || row.subtype === TURN_METRICS);
|
|
184
|
+
const lineItems = (jsonlPath, raw, keepLines, marks) => {
|
|
170
185
|
if (!raw)
|
|
171
186
|
return [];
|
|
172
187
|
const normalize = backendForPath(jsonlPath).normalizeTranscriptLine;
|
|
@@ -198,9 +213,11 @@ const parseTurns = (jsonlPath, raw, keepLines = false, marks = false) => {
|
|
|
198
213
|
}
|
|
199
214
|
if (!row || row.isMeta || row.isSidechain)
|
|
200
215
|
return [];
|
|
216
|
+
if (isTurnEnd(row))
|
|
217
|
+
return ["end"];
|
|
201
218
|
const role = row.message?.role;
|
|
202
219
|
if (role !== "user" && role !== "assistant")
|
|
203
|
-
return [];
|
|
220
|
+
return ["gap"];
|
|
204
221
|
const raw = blockText(row.message?.content);
|
|
205
222
|
// 剥 meta 只对 user 行: 信封 / slash 包装只会被注入进 user 行。assistant 是模型自己
|
|
206
223
|
// 的话, 它引用一段 `<system-reminder …>` 原文 (行内代码里写开头、代码块里写结尾)
|
|
@@ -210,18 +227,43 @@ const parseTurns = (jsonlPath, raw, keepLines = false, marks = false) => {
|
|
|
210
227
|
const text = (keepLines ? bare : bare.replace(/\s+/g, " ")).trim();
|
|
211
228
|
// Claude writes ISO timestamp strings; CodeBuddy writes epoch-ms NUMBERS.
|
|
212
229
|
// Date.parse(number) coerces to a bare digit-string and returns NaN —
|
|
213
|
-
// which silently stamped every CodeBuddy turn ms=0
|
|
214
|
-
// keepaliveStamps to mtime fallback, and let the keepalive's own ping
|
|
215
|
-
// writes (plus snapshot/summary churn) read as REAL activity that reset
|
|
216
|
-
// the round budget without bound.
|
|
230
|
+
// which silently stamped every CodeBuddy turn ms=0.
|
|
217
231
|
const ms = stampMs(parsed.timestamp);
|
|
218
|
-
const mid = role === "assistant" && row.message?.stop_reason === "tool_use";
|
|
232
|
+
const mid = role === "assistant" && (row.mid === true || row.message?.stop_reason === "tool_use");
|
|
233
|
+
const soft = role === "assistant" && row.awaitTurnEnd === true && row.message?.stop_reason !== "end_turn";
|
|
234
|
+
const tool = role === "assistant" && Array.isArray(row.message?.content) && row.message.content.some((b) => b?.type === "tool_use");
|
|
219
235
|
if (!text && marks && role === "user" && raw.includes("<task-notification"))
|
|
220
236
|
return [{ role, text: "", ms, notice: true }];
|
|
221
237
|
const apiError = role === "assistant" && parsed.isApiErrorMessage === true;
|
|
222
|
-
|
|
238
|
+
const turn = text ? [{ role, text, ms, ...(env ? { env } : {}), ...(mid ? { mid: true } : {}), ...(soft ? { soft: true } : {}), ...(apiError ? { apiError: true } : {}) }] : [];
|
|
239
|
+
return tool ? [...turn, "tool"] : turn.length ? turn : ["gap"];
|
|
223
240
|
});
|
|
224
241
|
};
|
|
242
|
+
/** 标记折回前一句 assistant: 后面跟着工具调用 → 中途句 (`mid`); **紧跟**着轮终记录 → 终句
|
|
243
|
+
* (`end`)。中间隔了别的行 (function_call / result) 的轮终记录不算 —— codebuddy 在长工具
|
|
244
|
+
* 调用 (TaskOutput 阻塞等后台) 中途也写 turn-metrics。 */
|
|
245
|
+
const foldMarks = (items) => items.reduce((acc, it, i) => {
|
|
246
|
+
if (typeof it !== "string") {
|
|
247
|
+
acc.push(it);
|
|
248
|
+
return acc;
|
|
249
|
+
}
|
|
250
|
+
const last = acc.at(-1);
|
|
251
|
+
if (last?.role !== "assistant")
|
|
252
|
+
return acc;
|
|
253
|
+
if (it === "tool")
|
|
254
|
+
acc[acc.length - 1] = { ...last, mid: true };
|
|
255
|
+
else if (it === "end" && items[i - 1] === last)
|
|
256
|
+
acc[acc.length - 1] = { ...last, end: true };
|
|
257
|
+
return acc;
|
|
258
|
+
}, []);
|
|
259
|
+
/** 这一轮已经说完、CLI 闲着: 转录最后一行是轮终记录, 且紧跟在一句 assistant 正文 (非中途句)
|
|
260
|
+
* 后面。说不准 (没有轮终记录、之后又起了动静、读不到) 一律 false —— 调用方退回 pane 裁决,
|
|
261
|
+
* 这里只给得出「确定闲了」。 */
|
|
262
|
+
export const turnClosed = (jsonlPath) => {
|
|
263
|
+
const items = readTailUntil(jsonlPath, (raw) => lineItems(jsonlPath, raw, false, true), (xs) => xs.length >= 2);
|
|
264
|
+
const [prev, last] = items.slice(-2);
|
|
265
|
+
return last === "end" && typeof prev === "object" && prev.role === "assistant" && !prev.mid;
|
|
266
|
+
};
|
|
225
267
|
// Flatten a message's content for QUOTE DEDUP only — unlike `blockText` this
|
|
226
268
|
// also lifts `tool_use` (name + stringified input) and `tool_result` text.
|
|
227
269
|
// Outbound tool bubbles render as `🔧 <Name> <input>` / `↳ <result>`, so a
|
|
@@ -250,17 +292,6 @@ const blockTextWithTools = (content) => {
|
|
|
250
292
|
.filter(Boolean)
|
|
251
293
|
.join(" ");
|
|
252
294
|
};
|
|
253
|
-
/** The keepalive ping this session's newest words answer: the text of the LAST
|
|
254
|
-
* user turn when that turn is a ping, else undefined. Read from the transcript
|
|
255
|
-
* on purpose — "was a keepalive sent" must survive whatever forgot the
|
|
256
|
-
* in-memory swallow (a daemon reload lands between the ping and its pong, and
|
|
257
|
-
* the restored tail starts past the ping line). tool_result-only user lines
|
|
258
|
-
* carry no text and are not turns, so a ping answered through a tool call
|
|
259
|
-
* still reads as open. */
|
|
260
|
-
export const openKeepalivePing = (jsonlPath, pingSigs) => {
|
|
261
|
-
const last = tailTurns(jsonlPath, 8).filter((t) => t.role === "user").at(-1);
|
|
262
|
-
return last && isKeepalivePingText(last.text, pingSigs) ? last.text : undefined;
|
|
263
|
-
};
|
|
264
295
|
/** 纯解析: transcript 原文 → 条目 (文本含 tool_use/tool_result)。 */
|
|
265
296
|
const parseToolEntries = (jsonlPath, raw) => {
|
|
266
297
|
if (!raw)
|
|
@@ -303,8 +334,8 @@ const cutForTurns = (entries, n) => {
|
|
|
303
334
|
}
|
|
304
335
|
return 0;
|
|
305
336
|
};
|
|
306
|
-
export const tailTurnsWithTools = (jsonlPath, n = 3
|
|
307
|
-
const entries =
|
|
337
|
+
export const tailTurnsWithTools = (jsonlPath, n = 3) => {
|
|
338
|
+
const entries = readTailUntil(jsonlPath, (raw) => parseToolEntries(jsonlPath, raw), (es) => countTurns(es) >= n);
|
|
308
339
|
return entries.slice(cutForTurns(entries, n)).map((e) => e.text).join("\n");
|
|
309
340
|
};
|
|
310
341
|
// Transcript prose is arbitrary text: backticks / asterisks / pipes lifted out of
|
|
@@ -312,10 +343,10 @@ export const tailTurnsWithTools = (jsonlPath, n = 3, pingSigs = []) => {
|
|
|
312
343
|
// layout. A preview is plain text — flatten every markdown-active char.
|
|
313
344
|
const stripMd = (s) => s.replace(/[`*_~|]/g, "").replace(/\s+/g, " ").trim();
|
|
314
345
|
/** One-line "what is this session doing" preview, for list rendering. */
|
|
315
|
-
export const summarizeTail = (jsonlPath, n = 3, per = 80
|
|
346
|
+
export const summarizeTail = (jsonlPath, n = 3, per = 80) => {
|
|
316
347
|
if (!existsSync(jsonlPath))
|
|
317
348
|
return "(新会话 · 暂无对话)";
|
|
318
|
-
const turns = talkTurns(jsonlPath, n
|
|
349
|
+
const turns = talkTurns(jsonlPath, n);
|
|
319
350
|
if (turns.length === 0)
|
|
320
351
|
return "(暂无对话)";
|
|
321
352
|
// 截了就得看得出截了: 裸 slice 出来的半句话, 读的人会当成它就说了这么多。
|
|
@@ -324,8 +355,8 @@ export const summarizeTail = (jsonlPath, n = 3, per = 80, pingSigs = []) => {
|
|
|
324
355
|
/** 最近一个来回, 压成一行: `▸ 问话 ◂ 它最新的一句`。名册用它 —— 读名册的是另一个
|
|
325
356
|
* wizard, summarizeTail 的「你:」在它眼里指的是它自己; 这里用 peek_peer 同款的
|
|
326
357
|
* 箭头, 不指代任何人。没有对话 = ""。 */
|
|
327
|
-
export const lastExchange = (jsonlPath, per = 80
|
|
328
|
-
const round = talkRounds(jsonlPath, 1
|
|
358
|
+
export const lastExchange = (jsonlPath, per = 80) => {
|
|
359
|
+
const round = talkRounds(jsonlPath, 1).at(-1);
|
|
329
360
|
if (!round)
|
|
330
361
|
return "";
|
|
331
362
|
const line = (t) => truncate(stripMd(t.text), per);
|
|
@@ -428,9 +459,17 @@ export const parseClosing = (text, max = 800) => {
|
|
|
428
459
|
}).filter((c) => c.kind === "result" || (c.text && !/^(?:无|没有|none|n\/a|-+)[。.]?$/i.test(c.text))).at(-1);
|
|
429
460
|
return closing ? { ...closing, text: clipMiddle(closing.text, max), artifacts } : { kind: "none", text: "", artifacts };
|
|
430
461
|
};
|
|
462
|
+
// 行首收口标记只起定位/判定作用: 剥只发生在投递出口 (群气泡 / wizard 收件箱),
|
|
463
|
+
// 判定 (parseClosing / finalKind / finalReleased) 一律读原文。NEED 的语义由路由行
|
|
464
|
+
// 状态与信封 status 携带, 正文里再带一个 `NEED:` 前缀只会让人疑惑。
|
|
465
|
+
const LEADING_MARK_RE = /^[ \t]*(?:RESULT|Result|result|结论|NEED)[ \t]*[::][ \t]*/;
|
|
466
|
+
/** 剥掉正文行首的 `RESULT:` / `NEED:` 收口标记 (含全角冒号)。 */
|
|
467
|
+
export const stripClosingMark = (text) => text.replace(LEADING_MARK_RE, "");
|
|
468
|
+
/** 群气泡版: 再剥掉 ARTIFACT 交付行 —— 本机路径对群里的读者没有用途 (要文件走 send_file)。 */
|
|
469
|
+
export const stripForChat = (text) => stripClosingMark(text).replace(new RegExp(ARTIFACT_RE.source, "gm"), "").replace(/\n{3,}/g, "\n\n").trim();
|
|
431
470
|
/** The peer's most recent assistant message — the handoff payload when one
|
|
432
471
|
* agent drives another ("take #fix's conclusion and review it"). */
|
|
433
|
-
export const lastAssistantText = (jsonlPath, max = 4000
|
|
472
|
+
export const lastAssistantText = (jsonlPath, max = 4000) => clipMiddle(talkTurns(jsonlPath, 40).filter((t) => t.role === "assistant").at(-1)?.text ?? "", max);
|
|
434
473
|
/** 掐中间: 来龙去脉在头、结论在尾, 超长时丢的该是中段。(从尾巴截会把收口那一行
|
|
435
474
|
* 截掉 —— 而那恰恰是对方最想读的。) */
|
|
436
475
|
export const clipMiddle = (s, max = 4000, head = Math.floor(max / 4)) => {
|
|
@@ -449,9 +488,8 @@ const inFence = (s) => (s.match(/^[ \t]*(?:```|~~~)/gm)?.length ?? 0) % 2 === 1;
|
|
|
449
488
|
* 「最后一条 assistant 文本」本身不带归属: 那句话没被接住、或者它停在一个等人点
|
|
450
489
|
* 的弹窗上时, 最后一条是**上一件事**的答案, 原样交回去就是拿旧结论冒充新结论。
|
|
451
490
|
* 发话时刻是最便宜的关联 id (A2A 的 taskId 在这里的等价物): 早于它的一律不算。
|
|
452
|
-
* 没有时间戳的行 (ms=0) 无从判断, 放行 —— 退化成旧行为, 而不是把回复吞掉。
|
|
453
|
-
|
|
454
|
-
export const lastReply = (jsonlPath, sinceMs = 0, pingSigs = []) => talkTurns(jsonlPath, 40, pingSigs, true, true)
|
|
491
|
+
* 没有时间戳的行 (ms=0) 无从判断, 放行 —— 退化成旧行为, 而不是把回复吞掉。 */
|
|
492
|
+
export const lastReply = (jsonlPath, sinceMs = 0) => talkTurns(jsonlPath, 40, true, true)
|
|
455
493
|
.filter((t) => t.role === "assistant" && (!t.ms || t.ms >= sinceMs))
|
|
456
494
|
.at(-1)?.text ?? "";
|
|
457
495
|
/** 报错之后叫它接着干的那一句 (`continue` / `继续` …)。 */
|
|
@@ -468,9 +506,9 @@ const ASK_SLACK_MS = 60_000;
|
|
|
468
506
|
* 接着等, 绝不能退回按时刻取把上一件事的结论当成这一次的回执 (receipts 只用前者分辨
|
|
469
507
|
* 「它在忙前面的轮」与「读进了却没答」)。 */
|
|
470
508
|
/** 找问话的那一段: 有发话时刻就读到它之前 (问话可以离尾巴很远), 没有 (老调用) 退回最近 80 条。 */
|
|
471
|
-
const askWindow = (jsonlPath, sinceMs
|
|
472
|
-
export const replyToPeer = (jsonlPath, fromName, sinceMs = 0,
|
|
473
|
-
const r = answerOf(askWindow(jsonlPath, sinceMs
|
|
509
|
+
const askWindow = (jsonlPath, sinceMs) => sinceMs > 0 ? turnsSince(jsonlPath, sinceMs - ASK_SLACK_MS) : talkTurns(jsonlPath, 80, true, true);
|
|
510
|
+
export const replyToPeer = (jsonlPath, fromName, sinceMs = 0, turn) => {
|
|
511
|
+
const r = answerOf(askWindow(jsonlPath, sinceMs), fromName, sinceMs, turn);
|
|
474
512
|
return r && { text: r.text, ...(r.error ? { error: true } : {}) };
|
|
475
513
|
};
|
|
476
514
|
/** 交接那一刻, `from` 那一句在旧会话里**收口**了没有 —— 比 replyToPeer 再严一档。
|
|
@@ -478,8 +516,8 @@ export const replyToPeer = (jsonlPath, fromName, sinceMs = 0, pingSigs = [], tur
|
|
|
478
516
|
* 自我交接是在某一轮**中途**调的: 那一轮最后一条 assistant 是"已交接"之类的收尾,
|
|
479
517
|
* 不是答案。所以只认在 `untilMs` 之前就被下一句 user 行关上的那一轮: 问话那一轮
|
|
480
518
|
* 还开着 (就是交接这一轮) → "", 这份回执的义务跟着简报转进新会话。三态同 replyToPeer。 */
|
|
481
|
-
export const replyClosedBefore = (jsonlPath, fromName, sinceMs, untilMs,
|
|
482
|
-
const r = answerOf(askWindow(jsonlPath, sinceMs
|
|
519
|
+
export const replyClosedBefore = (jsonlPath, fromName, sinceMs, untilMs, turn) => {
|
|
520
|
+
const r = answerOf(askWindow(jsonlPath, sinceMs), fromName, sinceMs, turn);
|
|
483
521
|
return r && (r.closedAt !== undefined && r.closedAt < untilMs && !r.error ? r.text : "");
|
|
484
522
|
};
|
|
485
523
|
/** 这一行是在续上一轮 (报错之后没有信封的 `continue` / 「继续」), 不起新的一轮。 */
|
|
@@ -489,19 +527,18 @@ const resumesAt = (ts, i) => !!ts[i - 1]?.apiError && !ts[i].env && !ts[i].notic
|
|
|
489
527
|
export const openingOf = (ts) => ts.filter((t, i) => t.role === "user" && !t.queued && !t.notice && !resumesAt(ts, i)).at(-1);
|
|
490
528
|
/** 开最近这一轮的那句 user 行, 往回读到有为止 (不受 TAIL_BYTES_MAX 限制) —— 一轮再长,
|
|
491
529
|
* 「这一轮是谁发起的」也要认得出 (父 k、链头、打断会不会误伤别人的活都靠它)。 */
|
|
492
|
-
export const openingTurn = (jsonlPath
|
|
530
|
+
export const openingTurn = (jsonlPath) => openingOf(readTailUntil(jsonlPath, (raw) => parseTurns(jsonlPath, raw, false, true), (ts) => !!openingOf(ts), Infinity));
|
|
493
531
|
const answerOf = (ts, fromName, sinceMs, turn) => {
|
|
494
532
|
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);
|
|
495
|
-
const byTurn = turn ? lastAsk((e) => !e.receipt && !e.quiet && e.
|
|
496
|
-
//
|
|
497
|
-
const direct = byTurn >= 0 ? byTurn : lastAsk((e) => !e.receipt && !e.quiet && e.kind === "peer" && e.from === fromName && !(turn && e.
|
|
498
|
-
const asked =
|
|
499
|
-
&& (!turn || (e.k?.startsWith(`peer:${turn}:`) === true && e.k.length > `peer:${turn}:`.length))));
|
|
533
|
+
const byTurn = turn ? lastAsk((e) => !e.receipt && !e.quiet && e.event === turn) : -1;
|
|
534
|
+
// 退回按人找时只认没有 event 的老信封: 带 event 的那些是别的件, 不是这一件。
|
|
535
|
+
const direct = byTurn >= 0 ? byTurn : lastAsk((e) => !e.receipt && !e.quiet && e.kind === "peer" && e.from === fromName && !(turn && e.event));
|
|
536
|
+
const asked = direct;
|
|
500
537
|
if (asked < 0)
|
|
501
538
|
return undefined;
|
|
502
539
|
const next = ts.findIndex((t, i) => i > asked && t.role === "user" && !t.queued && !resumesAt(ts, i));
|
|
503
540
|
const last = ts.slice(asked + 1, next < 0 ? undefined : next).filter((t) => t.role === "assistant").at(-1);
|
|
504
|
-
const text = last && !
|
|
541
|
+
const text = last && !last.mid ? last.text : "";
|
|
505
542
|
return { text, ...(next < 0 ? {} : { closedAt: ts[next].ms ?? 0 }), ...(text && last?.apiError ? { error: true } : {}) };
|
|
506
543
|
};
|
|
507
544
|
// ── wizard → wizard 的信封 ────────────────────────────────────────────
|
|
@@ -524,18 +561,18 @@ export { parseEnvelope };
|
|
|
524
561
|
export const renderHumanEnvelope = (user, chat, chatKey) => renderReminder(envelopeAttrs.human(user, chat, chatKey), []);
|
|
525
562
|
/** 人对管家说的那一轮挂一行「自己答还是派出去」: 宪章里的检查项离这句话太远, sonnet 档的管家一接到活
|
|
526
563
|
* 就忘。只挂人的话 —— 回执、同伴、定时那几轮不是新来的活; 一行就够, 细则在宪章。 */
|
|
527
|
-
export const renderStewardHint = () => renderReminder({ wezard: "hint"
|
|
564
|
+
export const renderStewardHint = () => renderReminder({ wezard: "hint" }, [
|
|
528
565
|
"管家自查: 进度 / 闲聊 / 你已知道的 → 自己答; 要看代码才答得了的 (机制、原理、「现在还会不会…」、方案、排查、改动), 哪怕看一眼就像能答 → 先 `dispatch` 派出去, 别自己读 (守护进程拦着); 多处改动或要 coder + reviewer 的带 `lead:true` 开需求单。",
|
|
529
566
|
]);
|
|
530
567
|
/** 定时任务放的那一轮: 不标的话, 记录里它就成了「人说的」。 */
|
|
531
|
-
export const renderTaskEnvelope = (taskId, quiet) => renderReminder(envelopeAttrs.task(taskId, quiet?.
|
|
568
|
+
export const renderTaskEnvelope = (taskId, quiet) => renderReminder(envelopeAttrs.task(taskId, quiet?.event), quiet
|
|
532
569
|
? ["定时任务到点放进来的, 不是人此刻说的, 而且**有事才说**: 这一轮私下跑, 没人在看。",
|
|
533
570
|
"照常执行。看完**没有值得人知道的**, 最后一条消息就只写一行 `QUIET`, 什么也不会发出去; 有, 就把最后一条消息写给人看 —— 守护进程原样转进群。",
|
|
534
571
|
"要派活给别的 wizard, 就在这一轮里用 `wait_peer` 把结果拿回来再收口 —— 回执要等这一轮结束才到, 那时已经没人替你转发。"]
|
|
535
572
|
: ["定时任务到点放进来的, 不是人此刻说的 —— 照常执行, 回复照常发进群。"]);
|
|
536
573
|
/** `from` = 发话方的称呼 (`.name`); `chat` 给了 = 公开轮 (那个群的名字, 可以是 ""),
|
|
537
574
|
* 不给 = 私聊。 */
|
|
538
|
-
export const renderPeerEnvelope = (from, chat, t) => renderReminder(envelopeAttrs.peer(from, chat, t), [
|
|
575
|
+
export const renderPeerEnvelope = (from, chat, t) => renderReminder(envelopeAttrs.peer(from, chat, t?.asker), [
|
|
539
576
|
...(chat === undefined
|
|
540
577
|
? [
|
|
541
578
|
"这是 wizard 私聊, 不是人说的。",
|
|
@@ -568,39 +605,46 @@ export const renderReceiptEnvelope = (from, chat, job, status = "done", turn, ro
|
|
|
568
605
|
...(status === "done"
|
|
569
606
|
? ["这是**回执**: 它那一轮干完了, 下面是它的结论 —— 不是人说的, 也不是新派给你的活。"]
|
|
570
607
|
: status === "need"
|
|
571
|
-
? [`这是**反问**: 它缺信息干不下去, 下面 \`NEED:\` 后面就是它要的 ——
|
|
608
|
+
? [`这是**反问**: 它缺信息干不下去, 下面 \`NEED:\` 后面就是它要的 —— 直接 tell_peer 它答 (这一轮里对它说话默认就是续这一笔); 这一份**不计入工单**, 它拿到答复干完会再送一份回执。`]
|
|
572
609
|
: status === "error"
|
|
573
610
|
? [`这是**失败回执**: 它那一轮以 CLI 报错收尾, 下面是报错原文, 不是它的结论, **不计入工单**。它若被续跑、之后答出来, 结论会照常再送来一份; 等不及就 peek_peer 看它, 或者再 tell_peer 它一次。`]
|
|
574
611
|
: [`这是**失败回执**: ${FAILED[status]}, 这一份不会再有答案了 (工单里按已落定计)。自己判断: 换人、再 tell_peer 追问, 或者在汇总里如实写缺了这一份。下面是守护进程的说明和它最后说的一句。`]),
|
|
575
|
-
|
|
576
|
-
...(route?.
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
?
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
612
|
+
...(route?.via ? [`这份结论是**沿链升级**投给你的: ${route.via} 已经不在了, 原来该由它收口的那一笔落到你头上, 由你接着交代。要续问 / 答它的 NEED 就 \`tell_peer({name: 回执的发话方, re: true})\`, 守护进程按路由表投给此刻的 owner。`] : []),
|
|
613
|
+
...(route?.retold ? ["这是它对这件活的**追述**: 之前已经交过一份 (定论或失败回执), 这一份是之后补的, 以这一份为准。"] : []),
|
|
614
|
+
// 去向由路由行的 receiver 边算好 (§9.5): up = 终句落到上游那一笔上; chat 给了 = 落回那个群;
|
|
615
|
+
// late = 它服务的那一笔已收口 (孤儿) —— 压过前两种: 只有带 `RESULT:` 的终句作为追述沿原路再投。
|
|
616
|
+
...(route?.late
|
|
617
|
+
? [route.retellTo
|
|
618
|
+
? chat !== undefined
|
|
619
|
+
? `这一笔的上一环已经收口, 结论**迟到了**: 终句带 \`RESULT:\` 才作为追述进群 ${route.retellTo} (用你自己的话交代); 不带就只进 rolepage。`
|
|
620
|
+
: `这一笔的上一环已经收口, 结论**迟到了**: 终句带 \`RESULT:\` 才作为追述沿原路投给 ${route.retellTo}; 不带就只进 rolepage。`
|
|
621
|
+
: "这一笔的上一环已经收口 (被收掉或已回收), 结论**迟到了**: 你这一轮的终句只进 rolepage, 要人知道就明说。"]
|
|
622
|
+
: route?.up
|
|
623
|
+
? ["面向上游 wizard, 据此在终句交代结论 (`RESULT:` 可选)。"]
|
|
624
|
+
: chat !== undefined
|
|
625
|
+
? [`面向群里的${route?.audience ? " `audience`" : "人"}: 做成了什么、没做成什么, 不复述它的原话。`]
|
|
626
|
+
: route?.pending && !(job && job.job)
|
|
627
|
+
? [`还有 ${route.pending} 份没回: 先记下这一份, 等最后一份到了再汇总。`]
|
|
628
|
+
: ["人看不见这段私聊。"]),
|
|
585
629
|
...(status === "done"
|
|
586
630
|
? [
|
|
587
|
-
...(route?.
|
|
631
|
+
...(route?.up || chat !== undefined ? [] : ["下面就是它的原话。据此接着干你自己手上那件事; **不要为收到回执而回话** —— 不要 send_peer 回它 (除非你确实有新的东西要问它), 也不要把这段原话复述给人, 只说你据此做了什么、结论是什么。"]),
|
|
588
632
|
"它可能还没干完全部 —— 读 `RESULT:` 那一行 (如果有) 作为它的收口结论; 要更多细节用 peek_peer 读它的对话, 不要猜。",
|
|
589
633
|
]
|
|
590
634
|
: []),
|
|
591
|
-
...(turn ? [`要就这件活追问、补充, 用 \`tell_peer({name: "${from}", re:
|
|
635
|
+
...(turn ? [`要就这件活追问、补充, 用 \`tell_peer({name: "${from}", re: true})\` —— 沿用同一个频道, 工单还开着就沿用工单。`] : []),
|
|
592
636
|
// 「齐了吗」是守护进程数的, 不让模型在上下文里自己数 —— 异步回执是 N 个独立
|
|
593
637
|
// 的轮次陆续进来的, 数错一个就会提前收口或者永远等。
|
|
594
638
|
...(job && job.job && status !== "need" && !(job.req && status === "error")
|
|
595
639
|
? job.closed
|
|
596
|
-
? [`工单已经收工 (close_job 过了), 这一份是收工之后才到的: 不必再 close_job, 也不计入那次汇总${status === "done" && !route?.
|
|
640
|
+
? [`工单已经收工 (close_job 过了), 这一份是收工之后才到的: 不必再 close_job, 也不计入那次汇总${status === "done" && !route?.up ? " —— 这段结论还有用, 就自己补一句交代 (notify 给人 / 回给上游)" : ""}。`]
|
|
597
641
|
: job.req
|
|
598
642
|
// 需求根单: 不走「汇总 → close_job」—— 关单 = 归档, 要等人验收。
|
|
599
643
|
? [status === "done"
|
|
600
|
-
? `这是需求根单 \`${job.job}\` 的交付: lead 交差了。向人交代结果后**别 close_job**, 等人验收 —— 认可 → \`close_job({job: "${job.job}"})\` 归档; 说不对 → \`tell_peer({name: "${from}", re:
|
|
601
|
-
: `这是需求根单 \`${job.job}\`, 但 lead 没交差 (${status}): 向人说明卡在哪。lead 还在 → \`tell_peer({name: "${from}", re:
|
|
644
|
+
? `这是需求根单 \`${job.job}\` 的交付: lead 交差了。向人交代结果后**别 close_job**, 等人验收 —— 认可 → \`close_job({job: "${job.job}"})\` 归档; 说不对 → \`tell_peer({name: "${from}", re: true, job: "${job.job}"})\` 返工 (同一张单)。对人别提单号。`
|
|
645
|
+
: `这是需求根单 \`${job.job}\`, 但 lead 没交差 (${status}): 向人说明卡在哪。lead 还在 → \`tell_peer({name: "${from}", re: true, job: "${job.job}"})\` 叫它续; 否则 \`close_job({job: "${job.job}"})\` 关掉, 需要的话重新 \`dispatch({lead:true})\` 开新单。对人别提单号。`]
|
|
602
646
|
: job.done >= job.total
|
|
603
|
-
? [`这是工单的**最后一份** (全部到齐): 现在可以汇总收口了 —— close_job(summary) 留档 (不发群); 给人的结论就是你这一轮的最后一条消息, 用你自己的话写${
|
|
647
|
+
? [`这是工单的**最后一份** (全部到齐): 现在可以汇总收口了 —— close_job(summary) 留档 (不发群); 给人的结论就是你这一轮的最后一条消息, 用你自己的话写${chat !== undefined ? " —— 它会进群" : ""}。`]
|
|
604
648
|
: [`工单**还差 ${job.total - job.done} 份**: 先把这一份记住 (或落到文件里), 不要现在汇总、也不要向人汇报进度; 等最后一份到了会明确告诉你「全部到齐」。`]
|
|
605
649
|
: []),
|
|
606
650
|
]);
|
|
@@ -613,8 +657,8 @@ const FAILED = {
|
|
|
613
657
|
/** Prompt-token size of the session's most recent turn: input + both cache
|
|
614
658
|
* tiers = how full the context window is, i.e. exactly what a cold cache would
|
|
615
659
|
* have to re-write at 1.25x. Read from the last assistant usage snapshot in
|
|
616
|
-
* the tail; 0 when no usage is on record yet. Drives the
|
|
617
|
-
* and
|
|
660
|
+
* the tail; 0 when no usage is on record yet. Drives the "session size" note
|
|
661
|
+
* and route-candidate wake-cost estimates. */
|
|
618
662
|
export const lastContextTokens = (jsonlPath) => readTailUntil(jsonlPath, (raw) => pickContextTokens(jsonlPath, raw), (v) => v > 0);
|
|
619
663
|
const pickContextTokens = (jsonlPath, raw) => {
|
|
620
664
|
if (!raw)
|
|
@@ -747,71 +791,6 @@ const toolPaths = (input) => {
|
|
|
747
791
|
const shell = typeof o.command === "string" ? o.command.match(SHELL_FILE_RE) ?? [] : [];
|
|
748
792
|
return [...named, ...shell.filter((w) => !/^\d/.test(w)).filter((w) => w.includes("/") || /\.(?:ts|tsx|js|mjs|json|jsonc|md|css|html|py|go|rs|sh)$/.test(w))];
|
|
749
793
|
};
|
|
750
|
-
/** The two clocks keepalive actually needs, read from MESSAGE-turn timestamps —
|
|
751
|
-
* never from file mtime. Claude Code appends `file-history-snapshot` / `ai-title`
|
|
752
|
-
* / `mode` / `permission-mode` lines that carry no `timestamp` yet bump the file
|
|
753
|
-
* mtime; keying the schedule off mtime lets that non-conversational churn fake
|
|
754
|
-
* "activity", resetting the idle clocks and pinning a long-dead session in an
|
|
755
|
-
* endless keepalive loop. Deriving from turns kills that at the source.
|
|
756
|
-
* `lastMs` newest user/assistant turn (real OR our own ping) — the prompt-cache
|
|
757
|
-
* warmth clock; only a real model request actually re-warms the cache.
|
|
758
|
-
* `lastRealMs` newest GENUINE turn (non-keepalive) — the real-idle cutoff; 0
|
|
759
|
-
* when none sits in the read window ⇒ real work predates the tail.
|
|
760
|
-
* `streak` pings already sent since that last genuine turn — the round
|
|
761
|
-
* counter's seed. The budget is "N pings after real work", a fact
|
|
762
|
-
* of the transcript: a counter that lives only in memory restarts
|
|
763
|
-
* at 0 on every daemon reload and hands the session a fresh N.
|
|
764
|
-
* `stamped` false when no turn carried a timestamp (backend without them), so
|
|
765
|
-
* the caller can fall back to mtime instead of judging all idle. */
|
|
766
|
-
export const keepaliveStamps = (jsonlPath, pingSigs) => {
|
|
767
|
-
const turns = tailTurns(jsonlPath, 24);
|
|
768
|
-
// Every warmer ping now carries the full instruction; a stall-recovery ping
|
|
769
|
-
// carries a different one. Match every injected form (`pingSigs` = normalized
|
|
770
|
-
// prefixes of each) plus the bare "ping" that streak pings used to shrink to
|
|
771
|
-
// (transcripts written before that changed still hold them) — otherwise a
|
|
772
|
-
// keepalive user line reads as REAL activity and re-anchors lastRealMs /
|
|
773
|
-
// resets the round counter before the model has even replied. What counts as
|
|
774
|
-
// keepalive (the ping AND every record of its reply) is `withoutKeepalive`'s
|
|
775
|
-
// rule — one definition for the clocks, the quote dedup and the peer readers.
|
|
776
|
-
const newest = (ts) => ts.reduce((m, t) => Math.max(m, t.ms ?? 0), 0);
|
|
777
|
-
const real = withoutKeepalive(turns, pingSigs);
|
|
778
|
-
// Everything past the last genuine turn is keepalive; its user turns are the pings.
|
|
779
|
-
const sinceReal = real.length ? turns.slice(turns.lastIndexOf(real[real.length - 1]) + 1) : turns;
|
|
780
|
-
// Turns are text-only, so a long tool chain after the last prose line would
|
|
781
|
-
// read as idle — the tool rows are real work and each one touched the cache.
|
|
782
|
-
// A ping's reply is a bare "pong", never a tool call, so they can't be warmer traffic.
|
|
783
|
-
const work = lastToolMs(jsonlPath);
|
|
784
|
-
const pingsAfterWork = work > newest(sinceReal) ? [] : sinceReal;
|
|
785
|
-
return {
|
|
786
|
-
lastMs: Math.max(newest(turns), work),
|
|
787
|
-
lastRealMs: Math.max(newest(real), work),
|
|
788
|
-
streak: pingsAfterWork.filter((t) => t.role === "user").length,
|
|
789
|
-
stamped: turns.some((t) => (t.ms ?? 0) > 0),
|
|
790
|
-
};
|
|
791
|
-
};
|
|
792
|
-
/** Timestamp of the newest main-thread tool_use / tool_result row in the tail (0 = none). */
|
|
793
|
-
const lastToolMs = (jsonlPath) => {
|
|
794
|
-
const normalize = backendForPath(jsonlPath).normalizeTranscriptLine;
|
|
795
|
-
return readTailBytes(jsonlPath, TAIL_BYTES)
|
|
796
|
-
.split("\n")
|
|
797
|
-
.reduce((m, line) => {
|
|
798
|
-
if (!line.includes("tool_"))
|
|
799
|
-
return m; // cheap prefilter
|
|
800
|
-
try {
|
|
801
|
-
const parsed = JSON.parse(line);
|
|
802
|
-
const row = normalize(parsed);
|
|
803
|
-
if (!row || row.isMeta || row.isSidechain)
|
|
804
|
-
return m;
|
|
805
|
-
const content = row.message?.content;
|
|
806
|
-
const tooly = Array.isArray(content) && content.some((b) => /^tool_(use|result)$/.test(b?.type ?? ""));
|
|
807
|
-
const ms = stampMs(parsed.timestamp);
|
|
808
|
-
return tooly && ms ? Math.max(m, ms) : m;
|
|
809
|
-
}
|
|
810
|
-
catch {
|
|
811
|
-
return m;
|
|
812
|
-
}
|
|
813
|
-
}, 0);
|
|
814
|
-
};
|
|
815
794
|
// ── Pane liveness ─────────────────────────────────────────────────────
|
|
816
795
|
// "Is this agent still working?" answered from outside the process. The pane is
|
|
817
796
|
// the only honest source: transcript mtime goes quiet during long tool calls,
|
|
@@ -829,7 +808,7 @@ const lastToolMs = (jsonlPath) => {
|
|
|
829
808
|
const SPINNER_RE = /\S*…\s*\((?:\d+h\s*)?(?:\d+m\s*)?\d+(?:\.\d+)?s\b/;
|
|
830
809
|
// The CLI's own auto-retry footer (`✻ API error · Retrying in 0s · attempt 2/10`)
|
|
831
810
|
// has neither an ellipsis nor a timer parenthetical, yet the turn is still in
|
|
832
|
-
// flight — read as idle it
|
|
811
|
+
// flight — read as idle it trips paneIsStalled's
|
|
833
812
|
// /API Error/, so a healthy session gets a stray "continue" queued behind the retry.
|
|
834
813
|
const RETRY_RE = /Retrying in \d+(?:\.\d+)?s\b.*attempt \d+\/\d+/i;
|
|
835
814
|
const BUSY_MARKERS = [SPINNER_RE, RETRY_RE, /esc to interrupt/i, /按\s*esc[^\n]*中断/, /esc\s*中断/i];
|
|
@@ -855,7 +834,7 @@ export const peerMentionPart = (mentions, cwd = "") => (seen) => {
|
|
|
855
834
|
const rule = !seen("rule:mention");
|
|
856
835
|
const row = (m) => `- .${m.tag}${m.job ? ` job="${clipLine(m.job, 80).replace(/"/g, "'")}"` : ""}${m.foreign ? ` chat=${m.chat || "(other)"}` : ""}${m.cwd && m.cwd !== cwd ? ` cwd=${tildePath(m.cwd)}` : ""}`;
|
|
857
836
|
return {
|
|
858
|
-
text: renderReminder({ wezard: "mention"
|
|
837
|
+
text: renderReminder({ wezard: "mention" }, [
|
|
859
838
|
...(rule
|
|
860
839
|
? ["`.name` tokens above are live wizards, not literal text. To involve / check / relay to one: tell_peer · peek_peer · wait_peer(name) — never answer for it; wizard_roster for all. A passing mention needs no tool."]
|
|
861
840
|
: []),
|