wezard 2.2.2 → 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.
- package/CLAUDE.md +7 -4
- package/dist/cli/init.js +2 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/daemon/approval.js +6 -4
- package/dist/daemon/approval.js.map +1 -1
- package/dist/daemon/chat-log.js +6 -1
- package/dist/daemon/chat-log.js.map +1 -1
- package/dist/daemon/danger.js +17 -0
- package/dist/daemon/danger.js.map +1 -1
- package/dist/daemon/detail.js +41 -0
- package/dist/daemon/detail.js.map +1 -1
- package/dist/daemon/handoff.js +8 -2
- package/dist/daemon/handoff.js.map +1 -1
- package/dist/daemon/inbound.js +9 -4
- package/dist/daemon/inbound.js.map +1 -1
- package/dist/daemon/index.js +744 -152
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/jobs.js +62 -23
- package/dist/daemon/jobs.js.map +1 -1
- package/dist/daemon/last-response.js +15 -0
- package/dist/daemon/last-response.js.map +1 -1
- package/dist/daemon/memory-steward.js +124 -68
- package/dist/daemon/memory-steward.js.map +1 -1
- package/dist/daemon/mirror-bridge.js +461 -91
- package/dist/daemon/mirror-bridge.js.map +1 -1
- package/dist/daemon/mirror-store.js.map +1 -1
- package/dist/daemon/model-select.js +99 -0
- package/dist/daemon/model-select.js.map +1 -1
- package/dist/daemon/notices.js +7 -5
- package/dist/daemon/notices.js.map +1 -1
- package/dist/daemon/peers.js +183 -60
- package/dist/daemon/peers.js.map +1 -1
- package/dist/daemon/receipts.js +391 -77
- package/dist/daemon/receipts.js.map +1 -1
- package/dist/daemon/route.js +63 -10
- package/dist/daemon/route.js.map +1 -1
- package/dist/daemon/spawn-tmux.js +24 -13
- package/dist/daemon/spawn-tmux.js.map +1 -1
- package/dist/daemon/task-registry.js +1 -1
- package/dist/daemon/task-registry.js.map +1 -1
- package/dist/daemon/tasks.js +12 -4
- package/dist/daemon/tasks.js.map +1 -1
- package/dist/daemon/usage.js +4 -11
- package/dist/daemon/usage.js.map +1 -1
- package/dist/daemon/wizard-memory.js +36 -4
- package/dist/daemon/wizard-memory.js.map +1 -1
- package/dist/daemon/wizard.js +102 -58
- package/dist/daemon/wizard.js.map +1 -1
- package/dist/mcp/server.js +138 -111
- package/dist/mcp/server.js.map +1 -1
- package/dist/shared/charter-view.js +35 -0
- package/dist/shared/charter-view.js.map +1 -0
- package/dist/shared/chat-http.js +133 -31
- package/dist/shared/chat-http.js.map +1 -1
- package/dist/shared/chat-render.js +6 -3
- package/dist/shared/chat-render.js.map +1 -1
- package/dist/shared/chat-view.js +17 -6
- package/dist/shared/chat-view.js.map +1 -1
- package/dist/shared/cli-backends.js +2 -0
- package/dist/shared/cli-backends.js.map +1 -1
- package/dist/shared/config.js +9 -5
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/daemon-token.js +18 -0
- package/dist/shared/daemon-token.js.map +1 -0
- package/dist/shared/detail-render.js +140 -16
- package/dist/shared/detail-render.js.map +1 -1
- package/dist/shared/detail-store.js +33 -12
- package/dist/shared/detail-store.js.map +1 -1
- package/dist/shared/effort.js +11 -0
- package/dist/shared/effort.js.map +1 -0
- package/dist/shared/model-prices.js +258 -0
- package/dist/shared/model-prices.js.map +1 -0
- package/dist/shared/pricing.js +55 -0
- package/dist/shared/pricing.js.map +1 -0
- package/dist/shared/reminder.js +18 -4
- package/dist/shared/reminder.js.map +1 -1
- package/dist/shared/role-render.js +172 -8
- package/dist/shared/role-render.js.map +1 -1
- package/dist/shared/role-view.js +89 -25
- package/dist/shared/role-view.js.map +1 -1
- package/dist/shared/session-label.js +4 -0
- package/dist/shared/session-label.js.map +1 -1
- package/dist/shared/task-file.js +16 -1
- package/dist/shared/task-file.js.map +1 -1
- package/dist/shared/turn-state.js +24 -0
- package/dist/shared/turn-state.js.map +1 -0
- package/dist/shared/world.js +37 -3
- package/dist/shared/world.js.map +1 -1
- package/dist/svr/index.js +2 -1
- package/dist/svr/index.js.map +1 -1
- package/hooks/pre-tool-use.sh +16 -3
- package/package.json +1 -1
- package/web/chat.css +172 -40
- package/web/chat.js +725 -247
package/dist/daemon/jobs.js
CHANGED
|
@@ -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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
package/dist/daemon/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../daemon/jobs.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,EAAE;AACF,wDAAwD;AACxD,8CAA8C;AAC9C,kDAAkD;AAClD,cAAc;AACd,EAAE;AACF,iDAAiD;AACjD,mCAAmC;AACnC,EAAE;AACF,
|
|
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,
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// agent 分开的同一个理由: 在线的那个不该被后台活拖慢。
|
|
3
|
+
// 它不是一个常驻 wizard, 也不是一条定时任务: daemon 开机就挂一个内部定时器, 每轮
|
|
4
|
+
// 看收件箱有没有提议, 有才起一个白板 wizard 去合并, 合并完即收。整理不放进管家
|
|
5
|
+
// (default wizard) 的上下文 —— 管家的上下文只留给名册和分派; 这是 Letta 的 sleep-time
|
|
6
|
+
// agent 与主 agent 分开的同一个理由: 在线的那个不该被后台活拖慢。
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
// daemon
|
|
10
|
-
|
|
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
|
|
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
|
|
18
|
-
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
"
|
|
63
|
-
"1. 读 md
|
|
64
|
-
"2. 逐条决定: 新增 / 改写已有的那条 (新的更准, 或推翻了旧的) / 删除 (forget 命中, 或已被推翻、过时) / 不动 (重复, 或只是某次任务的临时状态,
|
|
65
|
-
"3. 重写 md: 每条一行
|
|
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
|
-
"
|
|
69
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"memory-steward.js","sourceRoot":"","sources":["../../daemon/memory-steward.ts"],"names":[],"mappings":"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"}
|