wezard 1.4.2 → 2.0.1
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/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CLAUDE.md +17 -13
- package/README.md +130 -77
- package/cli/wezard.sh +0 -62
- package/config.example.jsonc +3 -9
- package/dist/cli/init.js +12 -21
- package/dist/cli/init.js.map +1 -1
- package/dist/daemon/approval.js +11 -7
- package/dist/daemon/approval.js.map +1 -1
- package/dist/daemon/cc-session.js +136 -0
- package/dist/daemon/cc-session.js.map +1 -0
- package/dist/daemon/chat-name.js +8 -18
- package/dist/daemon/chat-name.js.map +1 -1
- package/dist/daemon/detail.js +54 -13
- package/dist/daemon/detail.js.map +1 -1
- package/dist/daemon/graph.js +5 -7
- package/dist/daemon/graph.js.map +1 -1
- package/dist/daemon/inbound.js +188 -254
- package/dist/daemon/inbound.js.map +1 -1
- package/dist/daemon/index.js +459 -258
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/jobs.js +2 -2
- package/dist/daemon/memory-steward.js +82 -0
- package/dist/daemon/memory-steward.js.map +1 -0
- package/dist/daemon/mirror-bridge.js +370 -170
- package/dist/daemon/mirror-bridge.js.map +1 -1
- package/dist/daemon/mirror-store.js.map +1 -1
- package/dist/daemon/model-select.js +74 -0
- package/dist/daemon/model-select.js.map +1 -0
- package/dist/daemon/peers.js +10 -16
- package/dist/daemon/peers.js.map +1 -1
- package/dist/daemon/session-name.js +4 -27
- package/dist/daemon/session-name.js.map +1 -1
- package/dist/daemon/spawn-tmux.js +61 -16
- package/dist/daemon/spawn-tmux.js.map +1 -1
- package/dist/daemon/task-gate.js +97 -0
- package/dist/daemon/task-gate.js.map +1 -0
- package/dist/daemon/task-registry.js +132 -0
- package/dist/daemon/task-registry.js.map +1 -0
- package/dist/daemon/tasks.js +126 -54
- package/dist/daemon/tasks.js.map +1 -1
- package/dist/daemon/wizard-memory.js +52 -0
- package/dist/daemon/wizard-memory.js.map +1 -0
- package/dist/daemon/wizard.js +107 -41
- package/dist/daemon/wizard.js.map +1 -1
- package/dist/mcp/server.js +181 -209
- package/dist/mcp/server.js.map +1 -1
- package/dist/shared/chat-http.js +187 -108
- package/dist/shared/chat-http.js.map +1 -1
- package/dist/shared/chat-render.js +25 -34
- package/dist/shared/chat-render.js.map +1 -1
- package/dist/shared/chat-view.js +14 -2
- package/dist/shared/chat-view.js.map +1 -1
- package/dist/shared/cli-backends.js +2 -7
- package/dist/shared/cli-backends.js.map +1 -1
- package/dist/shared/config.js +26 -9
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/detail-render.js +12 -6
- package/dist/shared/detail-render.js.map +1 -1
- package/dist/shared/detail-store.js +1 -1
- package/dist/shared/detail-store.js.map +1 -1
- package/dist/shared/role-render.js +55 -0
- package/dist/shared/role-render.js.map +1 -0
- package/dist/shared/role-view.js +228 -0
- package/dist/shared/role-view.js.map +1 -0
- package/dist/shared/schedule-spec.js +92 -116
- package/dist/shared/schedule-spec.js.map +1 -1
- package/dist/shared/session-label.js +103 -72
- package/dist/shared/session-label.js.map +1 -1
- package/dist/shared/std.js +3 -0
- package/dist/shared/std.js.map +1 -1
- package/dist/shared/task-file.js +120 -0
- package/dist/shared/task-file.js.map +1 -0
- package/dist/shared/trigger.js +232 -0
- package/dist/shared/trigger.js.map +1 -0
- package/dist/shared/world.js +17 -5
- package/dist/shared/world.js.map +1 -1
- package/dist/svr/index.js +67 -2
- package/dist/svr/index.js.map +1 -1
- package/hooks/pre-tool-use.sh +4 -4
- package/package.json +1 -2
- package/web/chat.css +424 -212
- package/web/chat.js +953 -323
- package/commands/wrc.md +0 -7
- package/dist/daemon/cc-bridge.js +0 -183
- package/dist/daemon/cc-bridge.js.map +0 -1
- package/dist/daemon/sessions.js +0 -4
- package/dist/daemon/sessions.js.map +0 -1
package/dist/daemon/wizard.js
CHANGED
|
@@ -13,42 +13,77 @@
|
|
|
13
13
|
// 本模块只有两类东西: 一个写盘的注册表 (唯一副作用), 和一堆把记录渲染成文字的
|
|
14
14
|
// 纯函数。真正的动作 (spawn / inject / kill) 全在 mirror-bridge, 这里一个都不做。
|
|
15
15
|
import { loadJsonMap } from "../shared/json-map-store.js";
|
|
16
|
-
import { tagOfKey } from "../shared/session-label.js";
|
|
16
|
+
import { normalizeTag, stripSigil, tagOfKey, uniqueTag } from "../shared/session-label.js";
|
|
17
17
|
const MEMORY_MAX = 60;
|
|
18
18
|
const NOTE_MAX = 600;
|
|
19
19
|
const blank = (target) => ({ target, name: "", description: "", bornAt: Date.now(), memory: [] });
|
|
20
|
+
const foldName = (n) => stripSigil(n).toLowerCase();
|
|
21
|
+
/** `want` 规整成合法名字, 再避开 `others` 已占的 (大小写不敏感)。空 → "wizard"。 */
|
|
22
|
+
export const pickName = (want, others) => {
|
|
23
|
+
const taken = new Set(others.map(foldName).filter(Boolean));
|
|
24
|
+
const base = normalizeTag(want) || "wizard";
|
|
25
|
+
const n = uniqueTag(base.toLowerCase(), taken);
|
|
26
|
+
// uniqueTag 在折叠后的空间里找空位; 结果按原大小写回填前缀, 只追加 `-N`。
|
|
27
|
+
return n === base.toLowerCase() ? base : `${base.slice(0, 29)}${n.slice(Math.min(base.length, 29))}`;
|
|
28
|
+
};
|
|
20
29
|
/** 写穿式单文件存储, 与 mirror-store 同款 —— 这是运行时状态, 不是用户手写配置,
|
|
21
30
|
* 所以躺在 stateDir 而不是 config.jsonc。 */
|
|
22
31
|
export const loadWizardStore = (filePath) => {
|
|
23
32
|
const db = loadJsonMap(filePath);
|
|
33
|
+
const all = () => Object.values(db.all());
|
|
34
|
+
const upsert = (t, patch) => {
|
|
35
|
+
const next = { ...(db.get(t) ?? blank(t)), ...patch, target: t };
|
|
36
|
+
return db.set(t, { ...next, memory: next.memory.slice(-MEMORY_MAX).map((m) => m.slice(0, NOTE_MAX)) });
|
|
37
|
+
};
|
|
38
|
+
const namesExcept = (t) => all().filter((w) => w.target !== t).map((w) => w.name);
|
|
39
|
+
const rename = (t, want) => upsert(t, { name: pickName(want, namesExcept(t)) }).name;
|
|
24
40
|
return {
|
|
25
41
|
get: db.get,
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
return
|
|
42
|
+
byName: (n) => {
|
|
43
|
+
const k = foldName(n);
|
|
44
|
+
return k ? all().find((w) => foldName(w.name) === k) : undefined;
|
|
29
45
|
},
|
|
46
|
+
claim: (t, want) => db.get(t)?.name || rename(t, want),
|
|
47
|
+
rename,
|
|
48
|
+
upsert,
|
|
30
49
|
drop: db.drop,
|
|
31
|
-
all
|
|
50
|
+
all,
|
|
32
51
|
};
|
|
33
52
|
};
|
|
34
53
|
// 进程内唯一的注册表。daemon 启动时绑一次, 之后任何模块都读得到 —— IM 侧的
|
|
35
54
|
// `/peers` 要把名字和职责印在每一行上, 为此给 installInboundRouter 再加一个参数
|
|
36
|
-
// 不值当 (同 bindCliBackends 的取舍)
|
|
55
|
+
// 不值当 (同 bindCliBackends 的取舍)。绑定之前读到 undefined 即退化。
|
|
37
56
|
let bound;
|
|
38
57
|
export const bindWizardStore = (store) => (bound = store);
|
|
39
58
|
export const wizardStore = () => bound;
|
|
40
59
|
// ── 纯推导 ────────────────────────────────────────────────────────────
|
|
41
|
-
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
export const wizardName = (rec, chatName, target) =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
return
|
|
51
|
-
|
|
60
|
+
/** 一个 target 的默认名: 默认会话取聊天名, 分身取 slot id。去重交给 claim。 */
|
|
61
|
+
export const defaultNameOf = (chatName, target) => tagOfKey(target) || chatName;
|
|
62
|
+
/** 名字: 名册里落定的 > 默认名。只读推导, 不写盘 —— 需要落定用 store.claim。 */
|
|
63
|
+
export const wizardName = (rec, chatName, target) => (rec?.name ?? "").trim() || defaultNameOf(chatName, target);
|
|
64
|
+
/** 名字落定: 名册有就用; 没有且推得出默认名就 claim (写盘去重); 都没有退回 slot id。
|
|
65
|
+
* 推不出 (默认会话所在的聊天还没名字) 时不 claim —— 否则它会永久落成 `wizard-N`。 */
|
|
66
|
+
export const settleName = (store, chatName, target) => {
|
|
67
|
+
const have = store?.get(target)?.name;
|
|
68
|
+
if (have)
|
|
69
|
+
return have;
|
|
70
|
+
const want = defaultNameOf(chatName, target);
|
|
71
|
+
return store && want ? store.claim(target, want) : want;
|
|
72
|
+
};
|
|
73
|
+
/** 默认会话重开 (`/new`) 时名字回到聊天名: 旧名是上一段会话的, 新会话按聊天重新出生。
|
|
74
|
+
* slot 或聊天无名时不动; 撞名照旧挂 `-N`。返回落定的名字。 */
|
|
75
|
+
export const reclaimChatName = (store, chatName, target) => {
|
|
76
|
+
const have = settleName(store, chatName, target);
|
|
77
|
+
return store && chatName && !tagOfKey(target) && have.toLowerCase() !== chatName.toLowerCase()
|
|
78
|
+
? store.rename(target, chatName)
|
|
79
|
+
: have;
|
|
80
|
+
};
|
|
81
|
+
/** 一次性迁移/补名: 默认会话先挑 (聊天名归它), 其余按出生先后。 */
|
|
82
|
+
export const settleAll = (store, targets, chatNameOf) => {
|
|
83
|
+
const born = (t) => store.get(t)?.bornAt ?? Number.MAX_SAFE_INTEGER;
|
|
84
|
+
[...new Set(targets)]
|
|
85
|
+
.sort((a, b) => Number(!!tagOfKey(a)) - Number(!!tagOfKey(b)) || born(a) - born(b))
|
|
86
|
+
.forEach((t) => settleName(store, chatNameOf(t), t));
|
|
52
87
|
};
|
|
53
88
|
/** 直系分身。 */
|
|
54
89
|
export const childrenOf = (all, target) => all.filter((w) => w.parent === target);
|
|
@@ -59,71 +94,102 @@ export const ancestorsOf = (all, target) => {
|
|
|
59
94
|
return walk(byTarget.get(target)?.parent, []);
|
|
60
95
|
};
|
|
61
96
|
const bullet = (xs) => xs.map((x) => `- ${x}`).join("\n");
|
|
62
|
-
const
|
|
97
|
+
const addr = (b) => `.${b.address || b.name || "?"}`;
|
|
98
|
+
const nameLine = (b) => `\`${addr(b)}\`${b.description ? ` · ${b.description}` : ""}${b.cwd ? ` · ${b.cwd}` : ""}`;
|
|
63
99
|
/** 开局宪章 —— spawn 时作为 `--append-system-prompt` 压进进程。
|
|
64
100
|
* 它回答四件事, 每一件都是"会话自己没法从对话里知道"的:
|
|
65
|
-
* 我是谁 /
|
|
101
|
+
* 我是谁 / 我住在哪、周围有谁 / 我有哪些能力 / 公开频道与私聊该怎么说话。 */
|
|
66
102
|
export const renderCharter = (a) => {
|
|
103
|
+
const me = a.self.address || a.self.name;
|
|
67
104
|
const parts = [
|
|
68
105
|
"# 你是一个 wizard",
|
|
69
106
|
"",
|
|
70
107
|
"你不是一次性的助手进程。你是 wezard 架在企业微信与本机 agent CLI 之间的一个**常驻角色**:",
|
|
71
|
-
"
|
|
108
|
+
"有一个全局唯一的名字、一个工作区、职责和记忆, 能生分身、能和别的 wizard 私聊, 也能在群里当着人说话。",
|
|
72
109
|
"下面是你的身份, 它随你这个进程终身有效 —— 即使 `/clear` 清空了对话, 这段话仍在。",
|
|
73
110
|
"",
|
|
74
111
|
"## 我是谁",
|
|
75
112
|
bullet([
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
`所在聊天: ${a.chat ? `**${a.chat}**` : "(还没有名字 —— 它会在第一次被用到时按工作区自动补上; 想要个更好的名字就 name_chat)"} \`${a.principal}\``,
|
|
113
|
+
`名字 / 地址: **\`.${me || "(未命名)"}\`** —— 全机唯一。人在任何群里写 \`.${me}\` 就叫到你; 别的 wizard 用 \`${me}\` 作为 send_peer 的 \`name\``,
|
|
114
|
+
`出生的群 (home): ${a.chat ? `**${a.chat}**` : "(还没有名字 —— 第一次被用到时按工作区自动补上)"} \`${a.principal}\``,
|
|
79
115
|
`工作区: \`${a.self.cwd || "(未设置)"}\``,
|
|
80
116
|
`职责: ${a.self.description || "(未写 —— 用 wizard_identity 写一句, 别人靠它决定该不该找你)"}`,
|
|
81
117
|
a.parent
|
|
82
|
-
?
|
|
118
|
+
? a.inherited && a.forkOf
|
|
119
|
+
? `出身: **\`${addr(a.parent)}\`** 克隆出的 **\`${addr(a.forkOf)}\`** 的分身 —— 从 \`${addr(a.forkOf)}\` 的 session 节点 fork 而来, **你继承了它当时的全部上下文**; 归 \`${addr(a.parent)}\` 管, 活是它派的`
|
|
120
|
+
: a.inherited
|
|
121
|
+
? `出身: **\`${addr(a.parent)}\`** 的分身 —— 从它的 session 节点 fork 而来, **你继承了它当时的全部上下文**(它读过的文件/文档你开局就有)`
|
|
122
|
+
: `出身: **\`${addr(a.parent)}\`** 生的子 wizard —— 白板起步, 不继承它的上下文`
|
|
83
123
|
: "出身: 本聊天的原生 wizard",
|
|
84
124
|
]),
|
|
85
125
|
"",
|
|
86
126
|
];
|
|
127
|
+
// 新聊天的第一个 wizard 落在默认兜底目录里 —— 那不是人选的, 只是还没人说过。与其
|
|
128
|
+
// 让它在错的目录里把活干完, 不如开工前先问一句: 一句话的代价, 换掉一次重来。
|
|
129
|
+
if (a.cwdUnconfirmed) {
|
|
130
|
+
parts.push("> ⚠️ 上面这个工作区是**没人选过的默认兜底目录**, 不是人指定的。", "> 所以**开工前先问一句**: 要在哪个项目目录下干活?", "> 给了路径 → `set_workspace({cwd})` (当场换目录重开; 这一轮上下文会没, 让他把活再说一遍)。", "> 说就用这个 / 不用换 → `set_workspace({keep:true})` 记一笔, 此后谁都不会再问。", "> 只问这一次 —— 他不答就照这个目录干, 别反复追问。", "");
|
|
131
|
+
}
|
|
87
132
|
if (a.memory.length > 0) {
|
|
88
133
|
parts.push("## 我的记忆", "这些是你自己写下的、要跨会话活下来的东西:", bullet(a.memory), "");
|
|
89
134
|
}
|
|
135
|
+
if (a.chatMemory) {
|
|
136
|
+
parts.push("## 本群记忆", "这个群里所有 wizard 共享的记忆 (`wizard_remember({scope:\"chat\"})` 提交, 记忆整理者合并; 人也会直接改):", a.chatMemory, "");
|
|
137
|
+
}
|
|
138
|
+
if (a.workspaceMemory) {
|
|
139
|
+
parts.push("## 本工作区记忆", "在这个目录下干活的所有 wizard 共享的记忆 (`wizard_remember({scope:\"workspace\"})` 提交, 记忆整理者合并; 人也会直接改):", a.workspaceMemory, "");
|
|
140
|
+
}
|
|
141
|
+
if (a.steward) {
|
|
142
|
+
parts.push("## 我是这个群的管家", "人在这个群里**没点名**说的话都落到你这儿; 点了名 (`.name`) 的直达那个 wizard, 不经过你。", "你的活是**分派**, 不是亲手干 —— 上下文留给名册和来龙去脉, 别被大段代码和文件塞满:", bullet([
|
|
143
|
+
"一两句就能答的 (问进度、问谁在干什么、闲聊) → 自己答",
|
|
144
|
+
"对口某个已有 wizard 的职责 (`wizard_roster` 看职责与忙闲) → `send_peer({name, text, public:true})` 转给它: 它的回复直接进群, 你**不必等、不必转述**, 转完这一轮就结束; 它正忙就加 `when:\"idle\"`",
|
|
145
|
+
"没有对口的 → `spawn_wizard({name, description})` 从白板生一个 (名字取这件事的短名, description 是它往后的职责), **不带 task**; 就位后照上一条用 `send_peer({public:true})` 把活转给它 —— 这样它的回复进群",
|
|
146
|
+
"要读很多代码 / 改文件 / 跑很久的活 —— 哪怕你自己能做 —— 也转出去; 你一忙, 这个群里没点名的话就都排在你后面",
|
|
147
|
+
"名册里职责空着的 wizard 转活前先 `peek_peer` 看它在干嘛, 顺手让它补上职责 —— 职责是你分派的依据",
|
|
148
|
+
"人立的规矩、这个群的习惯、仓库的硬约束 → `wizard_remember({scope:\"chat\"|\"workspace\"})` 提交; 共享记忆的合并由定时的记忆整理者做, 不在你这儿",
|
|
149
|
+
]), "");
|
|
150
|
+
}
|
|
90
151
|
if (a.siblings.length > 0) {
|
|
91
|
-
parts.push("##
|
|
152
|
+
parts.push("## 出生时同群的 wizard", bullet(a.siblings.map(nameLine)), "(这只是出生那一刻的快照。此后谁来了、谁收工了、谁改了职责, 会以一行 system-reminder", "挂在下一条进到你这儿的消息尾巴上 —— 不必去问。要当下完整的名册仍然是 `wizard_roster`; 名字全局唯一, 别的群的 wizard 一样叫得到。)", "");
|
|
92
153
|
}
|
|
93
154
|
parts.push("## 我能做什么 (MCP `wezard`)", bullet([
|
|
94
155
|
"`wizard_whoami` 我是谁、上下文用了多少、我的分身有哪些",
|
|
95
|
-
"`wizard_identity`
|
|
96
|
-
"`wizard_roster` 全部 wizard 与 clone:
|
|
97
|
-
"`
|
|
156
|
+
"`wizard_identity` 改名字 / 写职责 (名字全局唯一, 撞名会自动加 `-N` 后缀并告诉你最终名字)",
|
|
157
|
+
"`wizard_roster` 全部 wizard 与 clone: 名字、home 群、工作区、职责、模型、忙闲、家谱",
|
|
158
|
+
"`clone_wizard` 克隆出一个分身 —— fork 我 (或 `from` 点名的某个 wizard) 此刻的上下文, 开局就带着读过的一切, 留在被克隆者的工作区 · `spawn_wizard` 从白板生一个子 wizard —— 不带上下文, 可以去别的目录; 两者都归我管, `name` 起名 (全局唯一), `model` 挑模型 (跑腿的活给 haiku, 要判断的给 opus), 它们还能再生",
|
|
98
159
|
"`stop_wizard` 打断或终结一个分身/wizard (活干完了就收掉它)",
|
|
99
160
|
"`open_job` / `close_job` / `list_jobs` 一次要派出两个以上分身时的**工单**: 群里只出开工/收工两条气泡, 收工时整批回收临时分身",
|
|
100
|
-
"`wizard_remember` 写一条跨会话的记忆",
|
|
161
|
+
"`wizard_remember` 写一条跨会话的记忆 —— `scope` 选 `self` (我自己的, 当场生效) / `chat` (本群共享) / `workspace` (本工作区共享); 后两者是**提议**, 由定时的记忆整理者去重、改写、合并后才生效",
|
|
101
162
|
"`wizard_handoff_self` 上下文快满时自己原地交接重开",
|
|
102
|
-
"`send_peer` 跟别的 wizard
|
|
103
|
-
"`wait_peer` 等它干完 —— 派了一**批**活就用 `
|
|
104
|
-
"`notify`
|
|
105
|
-
"`schedule_task`
|
|
163
|
+
"`send_peer` 跟别的 wizard 说话, **默认私聊**; `public:true` 则在群里公开说 (见下) · 派活给一个正在忙的同伴用 `when:\"idle\"` · `peek_peer` 看它在干嘛 · `list_peers` 看同群有谁",
|
|
164
|
+
"`wait_peer` 等它干完 —— 派了一**批**活就用 `names` 一次等一组 (`need` 决定满几个就返回), 别一个一个等",
|
|
165
|
+
"`notify` 把一段话贴进某个群给**人**看 (省略 `to` 就是你这一轮所在的群) —— 和 send_peer 相反, 它不驱动任何 agent",
|
|
166
|
+
"`schedule_task` 排一个到点自动执行的活 (「每个工作日晚上9:30 …」) —— 日程归在你名下; 默认到点**新起一个白板 wizard** 去干, 干完自动收掉; 只有明说「在 .foo 里继续」才用 `name` 点名已有的那个 · `list_tasks` / `cancel_task`",
|
|
106
167
|
"`set_workspace` 换工作区 · `name_chat` 给聊天起名 · `list_chats` 看别的聊天",
|
|
107
168
|
"`run_agent_graph` 把多个 wizard 串成一条会循环的流水线",
|
|
108
169
|
]), "", "## 怎么干活: 编排", "遇到一组「共享同一批上下文」的任务, 不要自己一件件做完, 也不要让每个分身各读一遍材料。", "**控制流在你手里** —— 没有别的调度器替你跑这件事: 你自己分路、自己派、自己等、自己汇总。", bullet([
|
|
109
170
|
"先在自己这里把**公共材料**读进上下文 (规范、目录结构、关键文件)",
|
|
110
|
-
"要派出两个以上的分身就先 `open_job(标题, 计划)` 拿一个工单 id —— 之后每个 `
|
|
111
|
-
"`
|
|
112
|
-
"撞名 (`
|
|
113
|
-
"
|
|
171
|
+
"要派出两个以上的分身就先 `open_job(标题, 计划)` 拿一个工单 id —— 之后每个 `clone_wizard` / `spawn_wizard` / `send_peer` 都带上 `job`",
|
|
172
|
+
"`clone_wizard({task})` 出需要的分身: 它们开局就带着这些材料, 只需告诉它各自那一份差异; 活写进 `task` 省一次往返。材料已经在某个同伴的上下文里, 就 `clone_wizard({from, task})` 从它分, 不必自己再读一遍",
|
|
173
|
+
"撞名 (`clone_wizard` / `spawn_wizard` 409) 别顺手 `send_peer` 糊弄过去: 响应里的 `alive`/`busy`/`idleForMs` 已经说清那是真在干活还是冷绑定。真活着就换个名字重新生, 别把不相关的活塞给一个已经有职责的 wizard; 冷绑定才值得复用, 但复用前先 `stop_wizard({mode:\"end\"})` 把它收掉腾出名字, 再用同一个名字重新 spawn —— 拿到干净的上下文",
|
|
174
|
+
"地址永远是名字本身 (`fix` 或 `.fix`), 全局唯一, 不分群; 永远别自己拼 key —— roster / 409 里的 `address` 原样传回来",
|
|
114
175
|
"派活时要求它**把结论收口成一行** `RESULT: …` (交付物写进文件就回传路径) —— `wait_peer` 会把这一行单独摘进 `result`, 免得你从八百字散文里找结论",
|
|
115
|
-
"一次 `wait_peer({
|
|
176
|
+
"一次 `wait_peer({names:[…]})` 把它们**一起**等回来。它们本来就在并行干活: 一个一个等, 墙钟是所有人之和; 一起等只花最慢那一个的时间 (`need` 可以让你先处理最先完事的那几个)",
|
|
116
177
|
"汇总完 `close_job(summary)` —— 结论发进群, 为这个工单生出来的分身整批回收。要反复迭代到收敛则用 `run_agent_graph`",
|
|
117
|
-
]), "分身是有成本的 (一个 tmux pane + 一份上下文), 而且名下同时活着的分身有上限 ——", "任务少于两三件时自己做完更快; 干完了就收, 别让上一批堵住下一批。", "", "## 怎么说话:
|
|
178
|
+
]), "分身是有成本的 (一个 tmux pane + 一份上下文), 而且名下同时活着的分身有上限 ——", "任务少于两三件时自己做完更快; 干完了就收, 别让上一批堵住下一批。", "", "## 怎么说话: 群是公开频道, wizard 之间默认私聊", "有人在的群 (以及人与你的单聊) 是**公开频道**: 人从哪个群叫你, 你这一轮的回复就发回哪个群。", "wizard 之间的 `send_peer` **默认是私聊** —— 不出任何群气泡, 只记在双方的 rolepage (每个角色视角的聊天记录页) 里;", "对方私聊轮的回复也不进群, 你用 `wait_peer` 取。要不要公开**由你判断**:", bullet([
|
|
179
|
+
"**需要人知道的, 或本就该当着人讨论的** (关键决策、给人的结论、需要人拍板的分歧、人点名要看的协作) → `send_peer({public:true})`: 群里出 `.你 → .它` 的气泡, 它那一轮的回复也发进这个群",
|
|
180
|
+
"**过程性的往来** (派活细节、催进度、交换中间产物、对齐接口) → 私聊, 这是默认",
|
|
181
|
+
"**只是告诉人一件事**, 不需要驱动谁 → `notify`",
|
|
182
|
+
]), "人看得见群里的公开消息和工单的开工/收工, 看不见私聊 (要看得去 rolepage)。所以:", bullet([
|
|
118
183
|
"**分清对象**: 对人说话 = 你的正常回复; 对 wizard 说话 = `send_peer`。别把派给分身的指令写进给人的回复里。",
|
|
119
|
-
"**不要复述**:
|
|
184
|
+
"**不要复述**: 公开的往来人已经看见了; 私聊的结论人需要知道时, 用你自己的话收口给人, 别把对方原话再念一遍。收到消息不必回「收到」。",
|
|
120
185
|
"**对 wizard 直说**: 不用寒暄、不用引用原文、不用客套。要什么、给什么、结论是什么, 一句话讲完。",
|
|
121
186
|
"**不要替别人开口**: 分身该做的事派给它、等它, 不要自己猜它会说什么然后替它答。",
|
|
122
187
|
"**对人要收口**: 人关心的是进展和结论, 不是你们之间的每一次往返。",
|
|
123
188
|
]), "", "## 自我管理", bullet([
|
|
124
189
|
"上下文快满 (`wizard_whoami` 的 contextTokens) → 自己调 `wizard_handoff_self`, 把工作压成简报原地重开。",
|
|
125
190
|
"要换项目目录 → 自己调 `set_workspace`, 不必让人去敲命令。",
|
|
126
|
-
"
|
|
191
|
+
"职责为空 → 自己调 `wizard_identity` 补上; 名字就是别人喊你的那个词。",
|
|
192
|
+
"学到了属于这个群 / 这个仓库、而不只属于你的东西 → `wizard_remember` 选对 `scope`, 下一个来的 wizard 开局就知道。",
|
|
127
193
|
]));
|
|
128
194
|
return parts.filter((p) => p !== undefined).join("\n");
|
|
129
195
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../daemon/wizard.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,EAAE;AACF,sDAAsD;AACtD,0CAA0C;AAC1C,8DAA8D;AAC9D,+CAA+C;AAC/C,qBAAqB;AACrB,EAAE;AACF,sDAAsD;AACtD,4DAA4D;AAC5D,2DAA2D;AAC3D,EAAE;AACF,4CAA4C;AAC5C,+DAA+D;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../daemon/wizard.ts"],"names":[],"mappings":"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"}
|