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
@@ -8,16 +8,22 @@
8
8
  // 所以这里不做第二个编排器。**控制流始终留在发起那个 wizard 的上下文里** (它自己
9
9
  // spawn、自己 wait、自己汇总), 守护进程只持有一本账:
10
10
  //
11
- // 谁属于这个工单 · 谁是为它临时生出来的 · 收工时该收掉谁 · 群里该看见哪两条
11
+ // 谁属于这个工单 · 谁是为它临时生出来的 · 收工时该收掉谁 · 各自落成了什么
12
12
  //
13
13
  // 这个取舍是有来由的: graph.ts 把控制流搬进了守护进程, 代价是 run 只能活在内存里,
14
14
  // reload 即丢。账本没有这个问题 —— 它是死的数据, 落盘即可; 而控制流留在 wizard
15
15
  // 那边, 重启之后它重试一次就接上了, 比恢复一个状态机简单一个数量级。
16
16
  //
17
- // 群里只出两条气泡 (开工 / 收工), 中间的每一次派活与回话照旧落在各自 wizard 的
18
- // rolepage —— 五个分身同时干活时, 十条交叉气泡里读不出结构, 两条能。
17
+ // 工单整个是私下的: 开工、派活、回执、收工都不进群 —— 人看不懂这些过程, 结构留给
18
+ // rolepage 的工单页读。群里只有发起者自己那一轮的最终回复, 用它自己的话收口。
19
19
  import { randomUUID } from "node:crypto";
20
20
  import { loadJsonMap } from "../shared/json-map-store.js";
21
+ export const ACCEPTS = ["result", "artifact", "none"];
22
+ /** 这份答复不合格的理由; 合格 = undefined。 */
23
+ export const rejectReason = (accept, c) => accept === "none" ? undefined
24
+ : c.kind !== "result" || !c.text.trim() ? "没有 `RESULT:` 收口 (或 RESULT 后面是空的)"
25
+ : accept === "artifact" && !c.artifacts.length ? "没有列出 `ARTIFACT:` 交付物"
26
+ : undefined;
21
27
  /** 一个工单最多带这么多成员 —— 不是能力上限, 是"忘了收"的刹车: 每个成员都是一个
22
28
  * tmux pane 加一份上下文, 而 fd 是有限的 (见 launchd plist 的 NumberOfFiles)。 */
23
29
  export const JOB_MEMBER_MAX = 12;
@@ -32,9 +38,17 @@ const dropStale = (map) => {
32
38
  export const loadJobStore = (filePath) => {
33
39
  const db = loadJsonMap(filePath, dropStale);
34
40
  return {
35
- open: (base, owner, title) => {
41
+ open: (base, owner, title, { plan, expect, maxTurns, accept } = {}) => {
36
42
  const id = newId();
37
- return db.set(id, { id, base, owner, title, members: [], status: "open", openedAt: Date.now() });
43
+ return db.set(id, { id, base, owner, title, ...(plan ? { plan } : {}), ...(accept && accept !== "result" ? { accept } : {}), ...(expect ? { expect } : {}), ...(maxTurns ? { maxTurns, turns: 0 } : {}), members: [], status: "open", openedAt: Date.now() });
44
+ },
45
+ spend: (id) => {
46
+ const j = db.get(id);
47
+ if (!j)
48
+ return undefined;
49
+ const turns = (j.turns ?? 0) + 1;
50
+ db.set(id, { ...j, turns });
51
+ return { turns, ...(j.maxTurns ? { maxTurns: j.maxTurns } : {}) };
38
52
  },
39
53
  get: db.get,
40
54
  attach: (id, member) => {
@@ -43,31 +57,56 @@ export const loadJobStore = (filePath) => {
43
57
  return undefined;
44
58
  const rest = j.members.filter((x) => x.target !== member.target);
45
59
  const prev = j.members.find((x) => x.target === member.target);
46
- return db.set(id, { ...j, members: [...rest, { ...member, spawned: member.spawned || !!prev?.spawned, at: Date.now() }] });
60
+ // 再派一段 (含 re 续问) = 它又在干了: 旧的定论作废, 不然「全部到齐」会提前报、
61
+ // close_job 会把还在干活的它收掉。
62
+ return db.set(id, { ...j, members: [...rest, { ...member, task: member.task || prev?.task || "", spawned: member.spawned || !!prev?.spawned, at: Date.now() }] });
63
+ },
64
+ settle: (id, target, outcome, artifacts) => {
65
+ const j = db.get(id);
66
+ if (!j || j.status !== "open" || !j.members.some((x) => x.target === target && !x.outcome))
67
+ return undefined;
68
+ return db.set(id, {
69
+ ...j,
70
+ members: j.members.map((x) => (x.target === target ? { ...x, outcome, ...(artifacts?.length ? { artifacts } : {}) } : x)),
71
+ });
72
+ },
73
+ tally: (id) => {
74
+ const j = db.get(id);
75
+ return j && { done: j.members.filter((x) => x.outcome).length, total: Math.max(j.members.length, j.expect ?? 0) };
47
76
  },
48
77
  close: (id, summary) => {
49
78
  const j = db.get(id);
50
79
  return j ? db.set(id, { ...j, status: "closed", closedAt: Date.now(), summary }) : undefined;
51
80
  },
81
+ detach: (target) => Object.values(db.all())
82
+ .filter((j) => j.status === "open" && j.members.some((x) => x.target === target && !x.outcome))
83
+ .map((j) => db.set(j.id, {
84
+ ...j,
85
+ members: j.members.map((x) => (x.target === target && !x.outcome ? { ...x, outcome: "canceled" } : x)),
86
+ }).id),
52
87
  openOf: (base) => Object.values(db.all()).filter((j) => j.base === base && j.status === "open").sort((a, b) => b.openedAt - a.openedAt),
53
88
  all: () => Object.values(db.all()),
54
89
  };
55
90
  };
56
- // ── 纯渲染 ────────────────────────────────────────────────────────────
57
- const firstLine = (s, max = 90) => {
58
- const t = (s.split("\n")[0] ?? "").trim();
59
- return t.length > max ? `${t.slice(0, max)}…` : t;
60
- };
61
- /** 开工气泡 —— 工单存在这件事本身。成员此刻还没有, 所以这一条只说要干什么。 */
62
- export const renderJobOpen = (job, plan) => [`📋 \`${job.id}\` 开工 · **${job.title}**`, plan.trim() ? firstLine(plan, 300) : ""].filter(Boolean).join("\n");
63
- /** 收工气泡 —— 谁干了什么、结论是什么。成员名字挂各自的 rolepage, 人想看某一路
64
- * 的来龙去脉就点进去, 不必在群里翻交叉的气泡。 */
65
- export const renderJobClose = (job, label, recycled) => [
66
- `📋 \`${job.id}\` 收工 · **${job.title}**`,
67
- ...job.members.map((mm) => `- ${label(mm.target)}${mm.task ? ` · ${firstLine(mm.task)}` : ""}`),
68
- job.summary?.trim() ? `\n${job.summary.trim()}` : "",
69
- recycled > 0 ? `(已回收 ${recycled} 个临时分身)` : "",
70
- ]
71
- .filter(Boolean)
72
- .join("\n");
91
+ /** 收工的工单 → 一条情景记忆 (见 wizard-memory.ts)。名字、sessionId、聊天名由调用方给:
92
+ * 这里不碰注册表。sid 要在回收分身**之前**取 —— 收掉之后绑定就没了, transcript 是唯一的现场。 */
93
+ export const jobEpisode = (job, o) => ({
94
+ at: job.closedAt ?? Date.now(),
95
+ kind: "job",
96
+ name: o.nameOf(job.owner),
97
+ sid: o.sidOf(job.owner),
98
+ chat: o.chat,
99
+ job: job.id,
100
+ title: job.title,
101
+ openedAt: job.openedAt,
102
+ text: job.summary ?? "",
103
+ members: job.members.map((mm) => ({
104
+ name: o.nameOf(mm.target),
105
+ sid: o.sidOf(mm.target),
106
+ spawned: mm.spawned,
107
+ task: mm.task,
108
+ ...(mm.outcome ? { outcome: mm.outcome } : {}),
109
+ ...(mm.artifacts?.length ? { artifacts: mm.artifacts } : {}),
110
+ })),
111
+ });
73
112
  //# sourceMappingURL=jobs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../daemon/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../daemon/jobs.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,11 @@ const bareFromFrame = (frame) => {
21
21
  return "";
22
22
  };
23
23
  const lastByBareId = new Map();
24
+ // SDK 的回执失败 reject 的是回执帧 ({errcode, errmsg}) 而不是 Error —— 只读 .message 会把拒收原因记成 undefined。
25
+ export const errText = (e) => {
26
+ const f = e;
27
+ return f?.message ?? (f?.errcode !== undefined ? `errcode=${f.errcode} ${f.errmsg ?? ""}`.trim() : String(e));
28
+ };
24
29
  export const getLastResponse = (target) => lastByBareId.get(principalToBare(target));
25
30
  const record = (bareId, content) => {
26
31
  if (!bareId || !content)
@@ -70,7 +75,17 @@ export const installResponseTracker = (client, log) => {
70
75
  record(bareFromFrame(frame), content);
71
76
  return r;
72
77
  };
78
+ // reload 窗口: 新进程恢复 mirror 后立刻有终句要推, 而 WS 还没鉴权完 —— SDK 直接抛
79
+ // "WebSocket not connected", 那条消息就永久丢了 (近两天十几条都是这么没的)。主动推送
80
+ // 不赶这几秒: 先等连上再发, 等不到再照常失败。
81
+ const CONNECT_WAIT_MS = 30_000;
82
+ const untilConnected = async () => {
83
+ for (const t0 = Date.now(); !client.isConnected && Date.now() - t0 < CONNECT_WAIT_MS;) {
84
+ await new Promise((r) => setTimeout(r, 500));
85
+ }
86
+ };
73
87
  client.sendMessage = async (chatid, body) => {
88
+ await untilConnected();
74
89
  // Only markdown pushes carry quotable text (and are the empty-message
75
90
  // risk class); template_card / media bubbles pass through untouched.
76
91
  if (body.msgtype === "markdown") {
@@ -1 +1 @@
1
- {"version":3,"file":"last-response.js","sourceRoot":"","sources":["../../daemon/last-response.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"last-response.js","sourceRoot":"","sources":["../../daemon/last-response.ts"],"names":[],"mappings":"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"}
@@ -1,82 +1,138 @@
1
1
  // 共享记忆的整理者 —— 群 / 工作区记忆唯一的写入者 (人除外)。
2
2
  //
3
- // 它不是一个常驻 wizard, 而是一条定时任务: gate 在 daemon 侧看收件箱有没有提议,
4
- // 有才新起一个白板 wizard 去合并, 合并完即收。整理不放进管家 (default wizard) 的
5
- // 上下文 —— 管家的上下文只留给名册和分派; 这是 Letta 的 sleep-time agent 与主
6
- // agent 分开的同一个理由: 在线的那个不该被后台活拖慢。
3
+ // 它不是一个常驻 wizard, 也不是一条定时任务: daemon 开机就挂一个内部定时器, 每轮
4
+ // 看收件箱有没有提议, 有才起一个白板 wizard 去合并, 合并完即收。整理不放进管家
5
+ // (default wizard) 的上下文 —— 管家的上下文只留给名册和分派; 这是 Letta 的 sleep-time
6
+ // agent 与主 agent 分开的同一个理由: 在线的那个不该被后台活拖慢。
7
7
  //
8
- // 任务文件只在缺失时写一次: 它是源码, 人和 wizard 会直接改 (换频率、改合并规则),
9
- // daemon 不能每次开机都覆盖回去。
10
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
8
+ // 不走 tasks.ts 是因为它不是谁排的日程: 任务会出现在 list_tasks / 日程里, 放枪要发
9
+ // ⏰ 气泡, 执行体落在某个群里 —— 而整理是 daemon 自己的家务, 不该惊动任何群。所以
10
+ // 执行体住在一个不属于任何聊天的内部 key 上 (`INTERNAL_BASE`), 私聊信封、零气泡,
11
+ // 结果只留在它的 rolepage 和 `memory/log/` 的审计日志里。
12
+ import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync } from "node:fs";
13
+ import { dirname, join, relative } from "node:path";
11
14
  import { expandHome } from "../shared/paths.js";
15
+ import { envelopeAttrs, renderReminder } from "../shared/reminder.js";
16
+ import { INTERNAL_BASE, keyOf } from "../shared/session-label.js";
12
17
  import { TASKS_DIR, fileOfTaskId } from "../shared/task-file.js";
13
- export const STEWARD_TASK_ID = "memory-steward";
18
+ export const STEWARD_ID = "memory-steward";
19
+ /** 执行体的 key: 内部 base, 不进任何群的名册。每轮复用同一个 —— 同时只跑一轮。 */
20
+ export const STEWARD_TARGET = keyOf(INTERNAL_BASE, "steward");
21
+ export const STEWARD_EVERY_MS = 30 * 60_000;
22
+ /** 执行体一轮的上限; 超了照样收掉, 认领留着等孤儿回收。 */
23
+ export const STEWARD_RUN_MS = 30 * 60_000;
14
24
  // 认领 = 改名 (`x.jsonl` → `x.claimed-<ms>.jsonl`): 认领之后新来的提议落进一个新的
15
25
  // `x.jsonl`, 等下一轮, 不会和正在合并的那批搅在一起。整理者中途死掉留下的认领
16
26
  // 超过一小时再认一次 —— 按文件名里的时刻判, 不按 mtime (改名不动 mtime)。
17
- const source = (root) => `// wezard 定时任务 · ${STEWARD_TASK_ID}
18
- // 共享记忆 (群 / 工作区) 的整理者: wizard_remember({scope:"chat"|"workspace"}) 不直写记忆,
19
- // 只往 ${root}/inbox/ 投提议; 这条任务有提议才新起一个白板 wizard 合并进 md。
20
- // 这份文件就是配置, 直接改, 存盘即生效。删掉它 daemon 下次开机会按默认重建;
21
- // 想停用改 enabled: false。
22
- import { existsSync, readdirSync, renameSync } from "node:fs";
23
- import { join } from "node:path";
24
-
25
- const ROOT = ${JSON.stringify(root)};
26
- const INBOX = join(ROOT, "inbox");
27
- const RECLAIM_MS = 60 * 60 * 1000;
28
- const CLAIMED = /\\.claimed-(\\d+)\\.jsonl$/;
29
-
30
- const inboxes = () => ["chats", "workspaces"].flatMap((d) => {
31
- const dir = join(INBOX, d);
32
- return existsSync(dir) ? readdirSync(dir).filter((f) => f.endsWith(".jsonl")).map((f) => join(dir, f)) : [];
27
+ const RECLAIM_MS = 60 * 60_000;
28
+ const CLAIMED = /\.claimed-(\d+)\.jsonl$/;
29
+ // ── 纯函数 ─────────────────────────────────────────────────────────
30
+ const claimedAt = (f) => Number(f.match(CLAIMED)?.[1] ?? NaN);
31
+ /** 这一轮该认领哪些: 没认领过的, 以及认领超过 `reclaimMs` 还没归档的孤儿。 */
32
+ export const planRound = (files, now, reclaimMs = RECLAIM_MS) => ({
33
+ fresh: files.filter((f) => !CLAIMED.test(f)),
34
+ orphaned: files.filter((f) => CLAIMED.test(f) && now - claimedAt(f) > reclaimMs),
33
35
  });
34
-
35
- export default {
36
- note: "有新的群/工作区记忆提议就合并进共享记忆",
37
- fresh: true,
38
- enabled: true,
39
- when: ({ every }) => every(30),
40
-
41
- gate: async ({ now, log }) => {
42
- const t = now.getTime();
43
- const all = inboxes();
44
- // 重新认领的孤儿也换上这一刻的时间戳, 否则它下一轮还算孤儿, 会被再派一遍。
45
- const claim = (f) => {
46
- const c = f.replace(CLAIMED, ".jsonl").replace(/\\.jsonl$/, ".claimed-" + t + ".jsonl");
47
- renameSync(f, c);
48
- return c;
49
- };
50
- const fresh = all.filter((f) => !CLAIMED.test(f));
51
- const orphaned = all.filter((f) => t - Number(f.match(CLAIMED)?.[1] ?? t) > RECLAIM_MS);
52
- const files = [...fresh, ...orphaned].map(claim);
53
- log("claimed=" + fresh.length + " orphaned=" + orphaned.length);
54
- if (!files.length) return false;
55
- return { vars: { files: files.map((f) => "- " + f).join("\\n") } };
56
- },
57
-
58
- prompt: [
59
- "整理 wezard 的共享记忆。下面每个文件是一个收件箱, 一行一条别的 wizard 提交的提议 (json: at 时刻, by 提议者, note 要记住的一句, forget 要删掉的那条里的一个子串):",
60
- "{{files}}",
36
+ /** 认领后的文件名。孤儿也换上这一刻的时间戳, 否则它下一轮还算孤儿, 会被再派一遍。 */
37
+ export const claimedName = (f, t) => f.replace(CLAIMED, ".jsonl").replace(/\.jsonl$/, `.claimed-${t}.jsonl`);
38
+ /** 收件箱 → 它要并进的那份 md: 去掉 `/inbox/`, `.claimed-<ms>.jsonl` → `.md`。 */
39
+ export const mdOfInbox = (root, f) => join(root, relative(join(root, "inbox"), f)).replace(CLAIMED, ".md").replace(/\.jsonl$/, ".md");
40
+ /** 收件箱 → 审计日志: `log/<chats|workspaces>/<同名>.jsonl`。 */
41
+ export const logOfInbox = (root, f) => join(root, "log", relative(join(root, "inbox"), f)).replace(CLAIMED, ".jsonl");
42
+ const pairLines = (root, refsOf) => (f) => {
43
+ const md = mdOfInbox(root, f);
44
+ const refs = refsOf?.(md) ?? [];
45
+ return [`- ${f} → ${md}`, ...(refs.length ? [` 只读参考: ${refs.join(" , ")}`] : [])];
46
+ };
47
+ export const stewardPrompt = (root, files, refsOf) => [
48
+ "整理 wezard 的共享记忆。下面每一行是一对 收件箱 → 记忆 md; 收件箱一行一条别的 wizard 提交的提议 (json: at 时刻, by 提议者, note 要记住的一句, forget 要删掉的那条里的一个子串):",
49
+ ...files.flatMap(pairLines(root, refsOf)),
61
50
  "",
62
- "每个收件箱对应一份记忆 md: 路径去掉 /inbox/, 再把 .claimed-<数字>.jsonl 换成 .md (例: " + ROOT + "/inbox/chats/x.claimed-1.jsonl → " + ROOT + "/chats/x.md; 不存在就新建)。对每一份:",
63
- "1. 读 md 全文和收件箱的全部提议。",
64
- "2. 逐条决定: 新增 / 改写已有的那条 (新的更准, 或推翻了旧的) / 删除 (forget 命中, 或已被推翻、过时) / 不动 (重复, 或只是某次任务的临时状态, 不值得跨会话记住)。",
65
- "3. 重写 md: 每条一行 \\"- 一句话\\", 相近的合并, 同主题的放一起, 全文控制在 3000 字以内。人手写的内容与格式保留, 除非提议明确推翻它。",
66
- "4. 写完把收件箱归档进审计日志再删掉: cat <收件箱> >> " + ROOT + "/log/<chats 或 workspaces>/<同名>.jsonl && rm <收件箱> (log 目录不存在就先建)。",
51
+ "md 不存在就新建。对每一对:",
52
+ "1. 读 md 全文和收件箱的全部提议; 带「只读参考」的, 把参考文件也读了 (不存在就跳过) —— 那是已经生效的规矩, 你不改它。",
53
+ "2. 逐条决定: 新增 / 改写已有的那条 (新的更准, 或推翻了旧的) / 删除 (forget 命中, 或已被推翻、过时) / 不动 (重复, 或只是某次任务的临时状态, 不值得跨会话记住, 或参考文件里已经写了)。跟参考文件矛盾的提议不收进 md (参考文件是人写的, 优先), 记作冲突。",
54
+ "3. 重写 md: 每条一行 \"- 一句话\", 相近的合并, 同主题的放一起, 全文控制在 3000 字以内。人手写的内容与格式保留, 除非提议明确推翻它。",
67
55
  "",
68
- "只动上面列出的收件箱和它们对应的 md / log, 别的一概不碰。全部处理完用一行 RESULT: 汇报每份记忆 新增/改写/删除 各几条。",
69
- ].join("\\n"),
56
+ "只动上面列出的 md, 收件箱和参考文件只读不改 (归档由守护进程在你收工后做), 别的一概不碰。全部处理完用一行 RESULT: 汇报每份记忆 新增/改写/删除 各几条; 有冲突的, 在 RESULT 之前每条一行 `冲突: <md> · <提议原文> ↔ <参考文件>`。",
57
+ ].join("\n");
58
+ /** 私聊信封: 这一轮不属于任何群, 回复哪儿也不发。 */
59
+ export const stewardEnvelope = () => renderReminder({ ...envelopeAttrs.task(STEWARD_ID), scope: "private" }, [
60
+ "这一轮是守护进程内建的共享记忆整理放进来的, 不属于任何群、没有人在等 —— 照常执行, 回复只留在 rolepage, 不要 notify / tell_peer 任何人。",
61
+ ]);
62
+ // ── 边界 IO ────────────────────────────────────────────────────────
63
+ const inboxes = (root) => ["chats", "workspaces"].flatMap((d) => {
64
+ const dir = join(root, "inbox", d);
65
+ return existsSync(dir) ? readdirSync(dir).filter((f) => f.endsWith(".jsonl")).map((f) => join(dir, f)) : [];
66
+ });
67
+ const claim = (t) => (f) => {
68
+ const c = claimedName(f, t);
69
+ renameSync(f, c);
70
+ return c;
70
71
  };
71
- `;
72
- /** 缺了就写一份默认的整理任务; 已有就不碰 (那是别人可能改过的源码)。 */
73
- export const ensureStewardTask = (memoryRoot, tasksDir = TASKS_DIR) => {
74
- const dir = expandHome(tasksDir);
75
- const file = fileOfTaskId(dir, STEWARD_TASK_ID);
76
- if (existsSync(file))
77
- return file;
78
- mkdirSync(dir, { recursive: true });
79
- writeFileSync(file, source(memoryRoot));
80
- return file;
72
+ const contentOf = (f) => (existsSync(f) ? readFileSync(f, "utf8") : "");
73
+ const archive = (root) => (f) => {
74
+ if (!existsSync(f))
75
+ return;
76
+ const dest = logOfInbox(root, f);
77
+ mkdirSync(dirname(dest), { recursive: true });
78
+ appendFileSync(dest, readFileSync(f));
79
+ unlinkSync(f);
80
+ };
81
+ /** 老版本把整理者写成了一条定时任务。改名停用而不是删 —— 那份文件人可能改过;
82
+ * 留着它就是两路并跑。返回停用后的路径, 没有就 undefined。 */
83
+ export const retireStewardTask = (tasksDir = TASKS_DIR) => {
84
+ const file = fileOfTaskId(expandHome(tasksDir), STEWARD_ID);
85
+ if (!existsSync(file))
86
+ return undefined;
87
+ const to = `${file}.retired`;
88
+ renameSync(file, to);
89
+ return to;
90
+ };
91
+ export const startSteward = ({ root, log, run, everyMs = STEWARD_EVERY_MS, refsOf, onMerged }) => {
92
+ let running = false;
93
+ const round = async () => {
94
+ if (running)
95
+ return;
96
+ running = true;
97
+ try {
98
+ const t = Date.now();
99
+ const { fresh, orphaned } = planRound(inboxes(root), t);
100
+ if (!fresh.length && !orphaned.length)
101
+ return;
102
+ const files = [...fresh, ...orphaned].map(claim(t));
103
+ log.info({ fresh: fresh.length, orphaned: orphaned.length }, "memory steward: claimed");
104
+ // 同一份 md 可能对着两个收件箱 (新提议 + 孤儿), 去重后再拍快照。
105
+ const mds = [...new Set(files.map((f) => mdOfInbox(root, f)))];
106
+ const before = new Map(mds.map((md) => [md, contentOf(md)]));
107
+ const r = await run(stewardPrompt(root, files, refsOf));
108
+ if (!r.ok) {
109
+ log.warn({ reason: r.reason, files }, "memory steward: run did not finish, claims left for reclaim");
110
+ return;
111
+ }
112
+ files.forEach(archive(root));
113
+ const changed = mds.filter((md) => contentOf(md) !== before.get(md));
114
+ log.info({ archived: files.length, changed }, "memory steward: merged");
115
+ if (changed.length) {
116
+ try {
117
+ onMerged?.(changed);
118
+ }
119
+ catch (e) {
120
+ log.warn({ err: e.message }, "memory steward: onMerged threw");
121
+ }
122
+ }
123
+ }
124
+ catch (e) {
125
+ log.warn({ err: e.message }, "memory steward: round failed");
126
+ }
127
+ finally {
128
+ running = false;
129
+ }
130
+ };
131
+ // 开机后先跑一轮: 定时器随每次 reload 重新计时, 频繁 reload 时只靠间隔会一直轮不到。
132
+ const first = setTimeout(() => { void round(); }, 60_000);
133
+ const timer = setInterval(() => { void round(); }, everyMs);
134
+ first.unref();
135
+ timer.unref();
136
+ return { stop: () => { clearTimeout(first); clearInterval(timer); } };
81
137
  };
82
138
  //# sourceMappingURL=memory-steward.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-steward.js","sourceRoot":"","sources":["../../daemon/memory-steward.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,sDAAsD;AACtD,wDAAwD;AACxD,wDAAwD;AACxD,iCAAiC;AACjC,EAAE;AACF,kDAAkD;AAClD,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEhD,gEAAgE;AAChE,+CAA+C;AAC/C,iDAAiD;AACjD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,oBAAoB,eAAe;;QAEpE,IAAI;;;;;;eAMG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8ClC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAE,WAAmB,SAAS,EAAU,EAAE;IAC5F,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"memory-steward.js","sourceRoot":"","sources":["../../daemon/memory-steward.ts"],"names":[],"mappings":"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"}