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.
Files changed (89) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CLAUDE.md +17 -13
  4. package/README.md +130 -77
  5. package/cli/wezard.sh +0 -62
  6. package/config.example.jsonc +3 -9
  7. package/dist/cli/init.js +12 -21
  8. package/dist/cli/init.js.map +1 -1
  9. package/dist/daemon/approval.js +11 -7
  10. package/dist/daemon/approval.js.map +1 -1
  11. package/dist/daemon/cc-session.js +136 -0
  12. package/dist/daemon/cc-session.js.map +1 -0
  13. package/dist/daemon/chat-name.js +8 -18
  14. package/dist/daemon/chat-name.js.map +1 -1
  15. package/dist/daemon/detail.js +54 -13
  16. package/dist/daemon/detail.js.map +1 -1
  17. package/dist/daemon/graph.js +5 -7
  18. package/dist/daemon/graph.js.map +1 -1
  19. package/dist/daemon/inbound.js +188 -254
  20. package/dist/daemon/inbound.js.map +1 -1
  21. package/dist/daemon/index.js +459 -258
  22. package/dist/daemon/index.js.map +1 -1
  23. package/dist/daemon/jobs.js +2 -2
  24. package/dist/daemon/memory-steward.js +82 -0
  25. package/dist/daemon/memory-steward.js.map +1 -0
  26. package/dist/daemon/mirror-bridge.js +370 -170
  27. package/dist/daemon/mirror-bridge.js.map +1 -1
  28. package/dist/daemon/mirror-store.js.map +1 -1
  29. package/dist/daemon/model-select.js +74 -0
  30. package/dist/daemon/model-select.js.map +1 -0
  31. package/dist/daemon/peers.js +10 -16
  32. package/dist/daemon/peers.js.map +1 -1
  33. package/dist/daemon/session-name.js +4 -27
  34. package/dist/daemon/session-name.js.map +1 -1
  35. package/dist/daemon/spawn-tmux.js +61 -16
  36. package/dist/daemon/spawn-tmux.js.map +1 -1
  37. package/dist/daemon/task-gate.js +97 -0
  38. package/dist/daemon/task-gate.js.map +1 -0
  39. package/dist/daemon/task-registry.js +132 -0
  40. package/dist/daemon/task-registry.js.map +1 -0
  41. package/dist/daemon/tasks.js +126 -54
  42. package/dist/daemon/tasks.js.map +1 -1
  43. package/dist/daemon/wizard-memory.js +52 -0
  44. package/dist/daemon/wizard-memory.js.map +1 -0
  45. package/dist/daemon/wizard.js +107 -41
  46. package/dist/daemon/wizard.js.map +1 -1
  47. package/dist/mcp/server.js +181 -209
  48. package/dist/mcp/server.js.map +1 -1
  49. package/dist/shared/chat-http.js +187 -108
  50. package/dist/shared/chat-http.js.map +1 -1
  51. package/dist/shared/chat-render.js +25 -34
  52. package/dist/shared/chat-render.js.map +1 -1
  53. package/dist/shared/chat-view.js +14 -2
  54. package/dist/shared/chat-view.js.map +1 -1
  55. package/dist/shared/cli-backends.js +2 -7
  56. package/dist/shared/cli-backends.js.map +1 -1
  57. package/dist/shared/config.js +26 -9
  58. package/dist/shared/config.js.map +1 -1
  59. package/dist/shared/detail-render.js +12 -6
  60. package/dist/shared/detail-render.js.map +1 -1
  61. package/dist/shared/detail-store.js +1 -1
  62. package/dist/shared/detail-store.js.map +1 -1
  63. package/dist/shared/role-render.js +55 -0
  64. package/dist/shared/role-render.js.map +1 -0
  65. package/dist/shared/role-view.js +228 -0
  66. package/dist/shared/role-view.js.map +1 -0
  67. package/dist/shared/schedule-spec.js +92 -116
  68. package/dist/shared/schedule-spec.js.map +1 -1
  69. package/dist/shared/session-label.js +103 -72
  70. package/dist/shared/session-label.js.map +1 -1
  71. package/dist/shared/std.js +3 -0
  72. package/dist/shared/std.js.map +1 -1
  73. package/dist/shared/task-file.js +120 -0
  74. package/dist/shared/task-file.js.map +1 -0
  75. package/dist/shared/trigger.js +232 -0
  76. package/dist/shared/trigger.js.map +1 -0
  77. package/dist/shared/world.js +17 -5
  78. package/dist/shared/world.js.map +1 -1
  79. package/dist/svr/index.js +67 -2
  80. package/dist/svr/index.js.map +1 -1
  81. package/hooks/pre-tool-use.sh +4 -4
  82. package/package.json +1 -2
  83. package/web/chat.css +424 -212
  84. package/web/chat.js +953 -323
  85. package/commands/wrc.md +0 -7
  86. package/dist/daemon/cc-bridge.js +0 -183
  87. package/dist/daemon/cc-bridge.js.map +0 -1
  88. package/dist/daemon/sessions.js +0 -4
  89. package/dist/daemon/sessions.js.map +0 -1
@@ -1,16 +1,10 @@
1
- // 定时规格 —— 把一句人话里的「什么时候」解析成三种形状之一, 外加到点判定与
2
- // 下次触发时刻。整模块是纯函数: 时钟由调用方传进来 (now), 这里只做匹配与算术。
1
+ // 「什么时候」的**词法层**: 把一句人话拆成零件 —— 星期、时刻、间隔、时间窗口。
2
+ // 纯函数, 且刻意不持有任何判定逻辑: 零件拼成规约 (Trigger)、到点判定与下次触发
3
+ // 全在 shared/trigger.ts。分这一刀是因为两边的变化方向不同 —— 这里跟着"人怎么
4
+ // 说"长, 那里跟着"怎么算"长。
3
5
  //
4
- // 三种形状覆盖了「比 /loop 更长」的全部实际需求:
5
- // daily 某几天的 HH:MM (days 为空 = 每天) —— 「每个工作日晚上 9:30」
6
- // every 每隔 N 分钟 —— 「每两小时」
7
- // once 一个绝对时刻 —— 「明早 9 点」「20 分钟后」, 触发后自删
8
- //
9
- // 刻意不做 cron 表达式: 人在群里说的是「每个工作日晚上九点半」, 让 wizard 把这句
10
- // 原样递进来比让它翻译成 `30 21 * * 1-5` 更不容易错 —— 翻译错了没人看得出来。
11
- // 守护进程重启/维护会吃掉整分钟的 tick。错过的那一下在 5 分钟内补跑, 超出就放弃 ——
12
- // 早上 9 点的任务在中午补跑比不跑更糟。
13
- const CATCHUP_MS = 5 * 60_000;
6
+ // 刻意不做 cron 表达式: 人在群里说的是「白天每隔一个小时」, 让 wizard 把这句原样
7
+ // 递进来, 比让它翻译成 `0 8-20/1 * * *` 更不容易错 —— 翻译错了没人看得出来。
14
8
  // ── 汉字数字 ────────────────────────────────────────────────────────
15
9
  const CN_DIGIT = {
16
10
  零: 0, 〇: 0, 一: 1, 二: 2, 两: 2, 三: 3, 四: 4, 五: 5,
@@ -33,6 +27,8 @@ export const cnToNum = (raw) => {
33
27
  return tens * 10 + ones;
34
28
  };
35
29
  const NUM = "[0-9零〇一二三四五六七八九十两]";
30
+ /** 量词。「每隔一**个**小时」「每**个**小时」—— 漏掉它整句就解析不出来。 */
31
+ const CLASSIFIER = "(?:个|個)?";
36
32
  // ── 星期 ────────────────────────────────────────────────────────────
37
33
  const CN_WEEKDAY = {
38
34
  日: 0, 天: 0, 一: 1, 二: 2, 三: 3, 四: 4, 五: 5, 六: 6,
@@ -58,8 +54,11 @@ export const parseDays = (t) => {
58
54
  return [];
59
55
  return undefined;
60
56
  };
57
+ /** 星期的人话写法, 供 Trigger 的 onDays 直接收人话。`[]` = 每天。 */
58
+ export const daysOf = (spec) => Array.isArray(spec) ? uniqSorted([...spec]) : (parseDays(String(spec)) ?? []);
61
59
  // ── 时刻 ────────────────────────────────────────────────────────────
62
60
  // 时段词只在 12 小时制下有意义: 「晚上 21:30」里的 21 已经说清楚了, 再 +12 就废了。
61
+ const MERIDIEM = /下午|傍晚|晚上|夜里|夜間|今晚|每晚|晚|中午|正午|凌晨|半夜|早上|早晨|清晨|上午|每早|明早|noon|midnight|(?<![a-z])[ap]m\b/i;
63
62
  const shiftMeridiem = (h, t) => {
64
63
  if (h > 12)
65
64
  return h;
@@ -74,11 +73,16 @@ const shiftMeridiem = (h, t) => {
74
73
  return h;
75
74
  };
76
75
  const QUARTER = { 半: 30, 一刻: 15, 三刻: 45 };
77
- /** 「晚上九点半」「21:30」「9:30pm」→ {hour, minute}。没提时刻返回 undefined。 */
78
- export const parseTimeOfDay = (t) => {
76
+ /**
77
+ * 「晚上九点半」「21:30」「9:30pm」→ {hour, minute}。没提时刻返回 undefined。
78
+ * `ctx` 是这句话的其余部分: 「晚上8点到10点」里的「10点」自己不带时段词, 得回
79
+ * 整句去借 —— 否则后半段会掉到上午。段内自带时段词时以段内为准。
80
+ */
81
+ export const parseTimeOfDay = (t, ctx = t) => {
82
+ const mer = MERIDIEM.test(t) ? t : ctx;
79
83
  const digital = t.match(/(\d{1,2})\s*[::]\s*(\d{1,2})/);
80
84
  if (digital) {
81
- const h = shiftMeridiem(Number(digital[1]), t);
85
+ const h = shiftMeridiem(Number(digital[1]), mer);
82
86
  return { hour: h % 24, minute: Number(digital[2]) % 60 };
83
87
  }
84
88
  const spoken = t.match(new RegExp(`(${NUM}{1,3})\\s*(?:点|時|时|时钟|o'?clock)\\s*(半|一刻|三刻)?\\s*(?:(${NUM}{1,3})\\s*分)?`));
@@ -87,7 +91,7 @@ export const parseTimeOfDay = (t) => {
87
91
  if (h0 === undefined || h0 > 24)
88
92
  return undefined;
89
93
  const m = spoken[2] ? QUARTER[spoken[2]] : spoken[3] ? (cnToNum(spoken[3]) ?? 0) : 0;
90
- return { hour: shiftMeridiem(h0, t) % 24, minute: m % 60 };
94
+ return { hour: shiftMeridiem(h0, mer) % 24, minute: m % 60 };
91
95
  }
92
96
  const bare = t.match(/(\d{1,2})\s*(am|pm)\b/i);
93
97
  if (bare)
@@ -97,19 +101,45 @@ export const parseTimeOfDay = (t) => {
97
101
  // ── 间隔 ────────────────────────────────────────────────────────────
98
102
  const UNIT_MIN = {
99
103
  分: 1, 分钟: 1, 分鐘: 1, min: 1, mins: 1, minute: 1, minutes: 1, m: 1,
100
- 小时: 60, 小時: 60, 钟头: 60, 鐘頭: 60, 时: 60, hour: 60, hours: 60, hr: 60, h: 60,
104
+ 小时: 60, 小時: 60, 钟头: 60, 鐘頭: 60, 时: 60, hour: 60, hours: 60, hr: 60, hrs: 60, h: 60,
101
105
  天: 1440, 日: 1440, day: 1440, days: 1440, d: 1440,
102
106
  };
103
- /** 「每隔两小时」「每 30 分钟」「每半小时」「every 15m」→ 分钟数。 */
107
+ const CN_UNIT = "分钟|分鐘|分|小时|小時|钟头|鐘頭|天|日";
108
+ /** 省掉数字时只认「小时」类: 「每天」是日程不是间隔, 咬住它会把每天 9 点变成每 24 小时。 */
109
+ const CN_HOUR_UNIT = "小时|小時|钟头|鐘頭";
110
+ /** 「两小时」「30 分钟」「1h」「90m」→ 分钟数。纯时长, 不含「每」。 */
111
+ export const parseDuration = (raw) => {
112
+ if (typeof raw === "number")
113
+ return raw > 0 ? raw : undefined;
114
+ const t = raw.trim();
115
+ const half = t.match(new RegExp(`^半\\s*${CLASSIFIER}\\s*(${CN_UNIT})$`));
116
+ if (half)
117
+ return (UNIT_MIN[half[1]] ?? 60) / 2;
118
+ const cn = t.match(new RegExp(`^(${NUM}{1,4})\\s*${CLASSIFIER}\\s*(${CN_UNIT})$`));
119
+ if (cn) {
120
+ const n = cnToNum(cn[1]);
121
+ return n && n > 0 ? n * (UNIT_MIN[cn[2]] ?? 1) : undefined;
122
+ }
123
+ const en = t.match(/^(\d{1,5})?\s*(minutes?|mins?|hours?|hrs?|days?|[mhd])$/i);
124
+ if (en) {
125
+ const n = en[1] ? Number(en[1]) : 1;
126
+ return n > 0 ? n * (UNIT_MIN[en[2].toLowerCase()] ?? 1) : undefined;
127
+ }
128
+ return undefined;
129
+ };
130
+ /** 「每隔两个小时」「每 30 分钟」「每半小时」「每小时」「every 15m」→ 分钟数。 */
104
131
  export const parseInterval = (t) => {
105
- const half = t.match(/每\s*隔?\s*半\s*(小时|小時|钟头|鐘頭|天|日|hour)/);
132
+ const half = t.match(new RegExp(`每\\s*隔?\\s*半\\s*${CLASSIFIER}\\s*(${CN_UNIT}|hour)`));
106
133
  if (half)
107
134
  return (UNIT_MIN[half[1]] ?? 60) / 2;
108
- const cn = t.match(new RegExp(`每\\s*隔?\\s*(${NUM}{1,3})\\s*(分钟|分鐘|分|小时|小時|钟头|鐘頭|天|日)`));
135
+ const cn = t.match(new RegExp(`每\\s*隔?\\s*(${NUM}{1,3})\\s*${CLASSIFIER}\\s*(${CN_UNIT})`));
109
136
  if (cn) {
110
137
  const n = cnToNum(cn[1]);
111
138
  return n && n > 0 ? n * (UNIT_MIN[cn[2]] ?? 1) : undefined;
112
139
  }
140
+ const bare = t.match(new RegExp(`每\\s*隔?\\s*${CLASSIFIER}\\s*(${CN_HOUR_UNIT})`));
141
+ if (bare)
142
+ return UNIT_MIN[bare[1]] ?? 60;
113
143
  const en = t.match(/every\s*(\d{1,4})?\s*(minutes?|mins?|hours?|hrs?|days?|[mhd])\b/i);
114
144
  if (en) {
115
145
  const n = en[1] ? Number(en[1]) : 1;
@@ -117,124 +147,70 @@ export const parseInterval = (t) => {
117
147
  }
118
148
  return undefined;
119
149
  };
150
+ // ── 时间窗口 ────────────────────────────────────────────────────────
151
+ // 「白天每小时」里的「白天」不是触发时刻, 是**筛子** —— 它自己产生不了任何一枪,
152
+ // 只否决落在窗外的那些。所以它在这里是独立零件, 在 Trigger 里是 guard。
153
+ // `soft` = 这个词同时也是时段词:「晚上9:30」里的「晚上」说的是 21 点这一刻, 不是
154
+ // 一段窗口。软窗口只在整句没给出具体时刻时才作数 (见 parseTrigger)。
155
+ const NAMED_WINDOW = [
156
+ { re: /白天|日间|日間|daytime/i, from: "08:00", to: "20:00", soft: false },
157
+ { re: /工作时间|上班时间|工作時間|上班時間|office\s*hours|business\s*hours/i, from: "09:00", to: "18:00", soft: false },
158
+ { re: /夜里|夜间|夜間|晚上|深夜|overnight|at\s*night/i, from: "20:00", to: "08:00", soft: true },
159
+ ];
160
+ const SEG = "[^,,。;;\\s]{1,12}";
161
+ /** 显式区间的连接部分 —— parseTrigger 要把它从句子里剔掉再找日程时刻。 */
162
+ export const RANGE_RE = new RegExp(`(${SEG})\\s*(?:到|至|~|~|-|–|—|until|to)\\s*(${SEG})`, "i");
163
+ /** 「白天」「8点到20点」「09:00-18:00」→ 一天里的一段。没提返回 undefined。 */
164
+ export const parseWindow = (t) => {
165
+ const range = t.match(RANGE_RE);
166
+ if (range) {
167
+ const from = parseTimeOfDay(range[1], t);
168
+ const to = parseTimeOfDay(range[2], t);
169
+ if (from && to)
170
+ return { from, to, soft: false, explicit: true };
171
+ }
172
+ const named = NAMED_WINDOW.find((w) => w.re.test(t));
173
+ return named
174
+ ? { from: parseTimeOfDay(named.from), to: parseTimeOfDay(named.to), soft: named.soft, explicit: false }
175
+ : undefined;
176
+ };
120
177
  // ── 一次性 ──────────────────────────────────────────────────────────
121
178
  const atOn = (now, addDays, hour, minute) => new Date(now.getFullYear(), now.getMonth(), now.getDate() + addDays, hour, minute, 0, 0).getTime();
122
- const parseOnce = (t, now) => {
123
- const rel = t.match(new RegExp(`(半|${NUM}{1,4})\\s*(分钟|分鐘|分|小时|小時|钟头|鐘頭|天)\\s*(?:之)?后`))
179
+ /** 「20 分钟后」「明早 9 点」「今晚」→ 绝对时刻 (epoch ms)。不是一次性的返回 undefined。 */
180
+ export const parseOnceAt = (t, now) => {
181
+ const rel = t.match(new RegExp(`(半|${NUM}{1,4})\\s*${CLASSIFIER}\\s*(${CN_UNIT})\\s*(?:之)?后`))
124
182
  ?? t.match(/\bin\s*(\d{1,4})\s*(minutes?|mins?|hours?|hrs?|days?|[mhd])\b/i);
125
183
  if (rel) {
126
184
  const unit = UNIT_MIN[rel[2].toLowerCase()] ?? 1;
127
185
  const n = rel[1] === "半" ? 0.5 : (cnToNum(rel[1]) ?? Number(rel[1]));
128
186
  if (n > 0)
129
- return { kind: "once", at: now.getTime() + Math.round(n * unit) * 60_000 };
187
+ return now.getTime() + Math.round(n * unit) * 60_000;
130
188
  }
131
189
  const dayWord = t.match(/(今天|今晚|今夜|明天|明早|明晚|后天|後天|tomorrow|tonight)/i);
132
190
  if (!dayWord)
133
191
  return undefined;
134
192
  const addDays = /后天|後天/.test(dayWord[1]) ? 2 : /今天|今晚|今夜|tonight/i.test(dayWord[1]) ? 0 : 1;
135
193
  const tod = parseTimeOfDay(t) ?? (/晚|tonight/i.test(dayWord[1]) ? { hour: 21, minute: 0 } : undefined);
136
- if (!tod)
137
- return undefined;
138
- return { kind: "once", at: atOn(now, addDays, tod.hour, tod.minute) };
139
- };
140
- // ── 入口 ────────────────────────────────────────────────────────────
141
- /**
142
- * 整句话进, 规格出。认不出返回 undefined —— 调用方要把原句回给用户让他重说,
143
- * 绝不能猜一个时间安静地存下去。
144
- *
145
- * 顺序有意为之: 一次性(带「今天/明天/N 分钟后」的措辞) 最具体, 其次是间隔,
146
- * 最后才是周期日程 —— 「每天」这种词在前两者里都不会出现。
147
- */
148
- export const parseWhen = (text, now = new Date()) => {
149
- const t = text.trim();
150
- if (!t)
151
- return undefined;
152
- const once = parseOnce(t, now);
153
- if (once)
154
- return once;
155
- const tod = parseTimeOfDay(t);
156
- // 「每 2 天早上 9 点」这种既给间隔又给时刻的说法, 按日程理解更接近本意;
157
- // 纯间隔 (不带时刻) 才走 every。
158
- const iv = parseInterval(t);
159
- if (iv !== undefined && !tod)
160
- return { kind: "every", minutes: Math.max(1, Math.round(iv)) };
161
- const days = parseDays(t);
162
- if (tod)
163
- return { kind: "daily", days: days ?? [], hour: tod.hour, minute: tod.minute };
164
- if (days)
165
- return { kind: "daily", days, hour: 9, minute: 0 }; // 只说了「每个工作日」: 默认早上 9 点
166
- if (iv !== undefined)
167
- return { kind: "every", minutes: Math.max(1, Math.round(iv)) };
168
- return undefined;
169
- };
170
- // ── 判定 ────────────────────────────────────────────────────────────
171
- const instantToday = (w, now) => {
172
- if (w.days.length && !w.days.includes(now.getDay()))
173
- return undefined;
174
- const d = new Date(now);
175
- d.setHours(w.hour, w.minute, 0, 0);
176
- return d.getTime();
177
- };
178
- /**
179
- * 到点了吗。`since` = 上次触发时刻, 从没触发过就传创建时刻 —— 它同时承担三件事:
180
- * 同一分钟内多次 tick 的去重、重启后不重复触发、以及「刚创建就到点」不立即打一枪。
181
- */
182
- export const isDue = (when, now, since) => {
183
- const t = now.getTime();
184
- switch (when.kind) {
185
- case "once":
186
- return t >= when.at && since < when.at;
187
- case "every":
188
- return t - since >= when.minutes * 60_000;
189
- case "daily": {
190
- const inst = instantToday(when, now);
191
- return inst !== undefined && t >= inst && t - inst < CATCHUP_MS && since < inst;
192
- }
193
- }
194
- };
195
- /** 下一次该在什么时候响。`since` 同 isDue。 */
196
- export const nextFire = (when, since, now = new Date()) => {
197
- if (when.kind === "once")
198
- return when.at;
199
- if (when.kind === "every")
200
- return Math.max(since + when.minutes * 60_000, now.getTime());
201
- for (let i = 0; i < 8; i++) {
202
- const c = new Date(now.getFullYear(), now.getMonth(), now.getDate() + i, when.hour, when.minute, 0, 0);
203
- if (c.getTime() > now.getTime() && (!when.days.length || when.days.includes(c.getDay())))
204
- return c.getTime();
205
- }
206
- return now.getTime();
194
+ return tod ? atOn(now, addDays, tod.hour, tod.minute) : undefined;
207
195
  };
208
- // ── 回显 ────────────────────────────────────────────────────────────
209
- const hhmm = (h, m) => `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")}`;
196
+ // ── 回显零件 ────────────────────────────────────────────────────────
197
+ export const hhmm = (t) => `${String(t.hour).padStart(2, "0")}:${String(t.minute).padStart(2, "0")}`;
210
198
  const CN_DAY_NAME = ["日", "一", "二", "三", "四", "五", "六"];
211
- const daysLabel = (days) => {
199
+ export const daysLabel = (days) => {
212
200
  if (!days.length)
213
201
  return "每天";
214
- const k = days.join(",");
202
+ const k = [...days].join(",");
215
203
  if (k === "1,2,3,4,5")
216
204
  return "每个工作日";
217
205
  if (k === "0,6")
218
206
  return "每逢周末";
219
207
  return `每周${days.map((d) => CN_DAY_NAME[d]).join("、")}`;
220
208
  };
221
- /** 人能一眼确认的回显 —— 存下去之前必须把它回给用户。 */
222
- export const describeWhen = (when) => {
223
- switch (when.kind) {
224
- case "daily":
225
- return `${daysLabel(when.days)} ${hhmm(when.hour, when.minute)}`;
226
- case "every": {
227
- const { minutes: n } = when;
228
- if (n % 1440 === 0)
229
- return `每 ${n / 1440} 天`;
230
- if (n % 60 === 0)
231
- return `每 ${n / 60} 小时`;
232
- return n > 60 ? `每 ${Math.floor(n / 60)} 小时 ${n % 60} 分` : `每 ${n} 分钟`;
233
- }
234
- case "once": {
235
- const d = new Date(when.at);
236
- return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")} ${hhmm(d.getHours(), d.getMinutes())}(仅一次)`;
237
- }
238
- }
209
+ export const durationLabel = (n) => {
210
+ if (n % 1440 === 0)
211
+ return `${n / 1440} 天`;
212
+ if (n % 60 === 0)
213
+ return `${n / 60} 小时`;
214
+ return n > 60 ? `${Math.floor(n / 60)} 小时 ${n % 60} 分` : `${n} 分钟`;
239
215
  };
240
216
  //# sourceMappingURL=schedule-spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schedule-spec.js","sourceRoot":"","sources":["../../shared/schedule-spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schedule-spec.js","sourceRoot":"","sources":["../../shared/schedule-spec.ts"],"names":[],"mappings":"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"}
@@ -25,49 +25,32 @@ export const labelFor = (sessionId) => {
25
25
  return "❔";
26
26
  return ANIMALS[hash(sessionId) % ANIMALS.length] ?? "❔";
27
27
  };
28
- // ── `#tag` lexicon ──────────────────────────────────────────────────────
29
- // One rule for what counts as a tag token, shared by everything that reads
30
- // them out of user prose: the inbound router (FIRST match = which session gets
31
- // the message) and peer-mention annotation (the REST = references to sibling
32
- // sessions). Two readers of the same text must not disagree on where the tokens
33
- // are, or a mention the router left in the body could go unannotated.
34
- // Must be space-delimited or edge-of-string so genuine URLs / paths like
35
- // "#L45-foo/bar" survive. 右边界除空白/行尾外,零宽与 word-joiner 等不可见格式
36
- // 字符也算分隔 —— 输入法/复制常在 tag 后夹一个 U+2060 之类。
37
- const TAG_TOKEN = "(^|\\s)#([\\p{L}\\p{N}_-]{1,32})(?=[\\s\\u200B-\\u200D\\u2060\\uFEFF]|$)";
38
- /** Fresh non-global matcher — capture 2 is the tag. Own instance per caller so
28
+ // ── `.name` lexicon ─────────────────────────────────────────────────────
29
+ // A wizard is addressed by its GLOBAL name, written `.name` — in a chat, in a
30
+ // peer message, in a bubble header. One rule for what counts as a name token,
31
+ // shared by everything that reads them out of prose: the inbound router (FIRST
32
+ // match = who gets the message) and mention annotation (the REST). Two readers
33
+ // of the same text must not disagree on where the tokens are.
34
+ // Must be space-delimited or edge-of-string so paths / extensions like
35
+ // `a.ts` / `./foo` survive. 右边界除空白/行尾外,零宽与 word-joiner 等不可见格式
36
+ // 字符也算分隔 —— 输入法/复制常在名字后夹一个 U+2060 之类。
37
+ const NAME_CHARS = "[\\p{L}\\p{N}_-]";
38
+ const NAME_TOKEN = `(^|\\s)\\.(${NAME_CHARS}{1,32})(?=[\\s\\u200B-\\u200D\\u2060\\uFEFF]|$)`;
39
+ /** Fresh non-global matcher — capture 2 is the name. Own instance per caller so
39
40
  * nobody inherits another's `lastIndex`. */
40
- export const tagTokenRe = () => new RegExp(TAG_TOKEN, "u");
41
- /** Every distinct `#tag` in `text`, in first-appearance order. */
42
- export const allTags = (text) => [
43
- ...new Set([...text.matchAll(new RegExp(TAG_TOKEN, "gu"))].map((m) => m[2] ?? "").filter(Boolean)),
41
+ export const nameTokenRe = () => new RegExp(NAME_TOKEN, "u");
42
+ /** Every distinct `.name` in `text`, in first-appearance order. */
43
+ export const allNames = (text) => [
44
+ ...new Set([...text.matchAll(new RegExp(NAME_TOKEN, "gu"))].map((m) => m[2] ?? "").filter(Boolean)),
44
45
  ];
45
- // Compound address: `chatName#tag` (no space before `#`). Captures word-boundary
46
- // delimited `name#tag` tokens that TAG_TOKEN misses because the `#` isn't preceded
47
- // by whitespace. The left part MIGHT be a chat name — caller must validate.
48
- const COMPOUND_ADDR = "(?:^|(?<=\\s))([\\p{L}\\p{N}_-]{1,32})#([\\p{L}\\p{N}_-]{1,32})(?=[\\s\\u200B-\\u200D\\u2060\\uFEFF]|$)";
49
- /** Every distinct `name#tag` compound address in `text`. */
50
- export const allCompoundAddresses = (text) => {
51
- const seen = new Set();
52
- const results = [];
53
- for (const m of text.matchAll(new RegExp(COMPOUND_ADDR, "gu"))) {
54
- const raw = m[0].trim();
55
- if (seen.has(raw))
56
- continue;
57
- seen.add(raw);
58
- results.push({ raw, chat: m[1], tag: m[2] });
59
- }
60
- return results;
61
- };
62
- // ── Target-key tagging ──────────────────────────────────────────────────
63
- // Daemon-internal target keys are `user:xxx[#tag]` / `chat:xxx[#tag]`. Every
64
- // user-visible artifact bound to a TAGGED session must carry the same visual
65
- // so a chat hosting parallel sessions stays disambiguated:
66
- // • markdown bubbles → `emoji \`#tag\`` header line (withTagHeader)
67
- // • card titles → `emoji ` badge (tagBadge)
68
- // Untagged (default session) passes through unchanged — single-session users
69
- // see no extra glyphs. Emoji is keyed on the TAG STRING, not the sessionId,
70
- // so it survives `/clear` rotations.
46
+ /** `.fix` / `fix` / `#fix` (旧写法) → `fix`; 其余原样 trim。 */
47
+ export const stripSigil = (raw) => (raw ?? "").trim().replace(/^[.#@]+/, "");
48
+ // ── Target keys ─────────────────────────────────────────────────────────
49
+ // Daemon-internal target keys are `user:xxx[#k]` / `chat:xxx[#k]`: the chat a
50
+ // wizard was BORN in (its home) plus an internal slot id. The slot id is NOT
51
+ // the wizard's name — the name is global, lives in the wizard registry, and
52
+ // is what every human/wizard-facing surface shows (`.name`). A rename never
53
+ // rekeys a session. Every bubble carries `emoji .name`; emoji keyed on the name.
71
54
  /** `#tag` suffix of a target key, "" when untagged. */
72
55
  export const tagOfKey = (target) => {
73
56
  if (!target)
@@ -84,53 +67,50 @@ export const baseOfKey = (target) => {
84
67
  };
85
68
  /** Compose a session key from a base principal and a tag ("" → default session). */
86
69
  export const keyOf = (base, tag) => (tag ? `${base}#${tag}` : base);
87
- /** Coerce an arbitrary string into the tag charset `TAG_TOKEN` accepts — an
88
- * agent-supplied tag that the header parser can't round-trip would make its
89
- * own bubbles unaddressable. "" when nothing usable survives. */
90
- export const normalizeTag = (raw) => (raw ?? "")
91
- .trim()
92
- .replace(/^#+/, "")
70
+ /** Coerce an arbitrary string into the name charset `NAME_TOKEN` accepts — a
71
+ * name the header parser can't round-trip would make its own bubbles
72
+ * unaddressable. "" when nothing usable survives. Also the slot-id charset. */
73
+ export const normalizeTag = (raw) => stripSigil(raw)
93
74
  .replace(/[^\p{L}\p{N}_-]+/gu, "-")
94
75
  .replace(/^-+|-+$/g, "")
95
76
  .slice(0, 32);
96
77
  /** Default tag for a session spawned in `cwd` — the project's own name is what
97
78
  * a human would have typed. */
98
79
  export const tagFromCwd = (cwd) => normalizeTag(cwd.split("/").filter(Boolean).pop());
99
- /** `want`, or the first `want-N` its chat isn't already using. */
80
+ /** `want`, or the first `want-N` not already in `taken`. */
100
81
  export const uniqueTag = (want, taken, n = 1) => {
101
82
  const candidate = n < 2 ? want : `${want.slice(0, 29)}-${n}`;
102
83
  return taken.has(candidate) ? uniqueTag(want, taken, n + 1) : candidate;
103
84
  };
104
- // 出站气泡的头 (`🦊 #fix …` / 未打 tag 的 `🧙 …`) 是可被「引用」的路由信息:
105
- // 群里要跟某个 `#tag` 会话说话,引用它的气泡比手打 tag 快得多。这里做反向解析。
106
- // 头部 emoji 取自固定表 —— 用户消息以这些 emoji 开头且后接 `#tag` 的概率可忽略。
107
- // 分片序号 (`2/5`) 也属于头,一并吃掉 —— 留在 body 里会污染"引用内容是否已在
108
- // 目标 context 里"的比对。
109
- // 头有两种形态,都要认:裸 `🦊 #fix …`,以及 mirror 的 chat-detail 链接形态
110
- // `[🦊 #fix](https://…) …`(无 tag 时是 `[🧙](url)`)。链接里的 URL 若留在 body
111
- // 里,既污染比对又会被当成用户内容贴进 prompt。
85
+ // 出站气泡的头 (`🦊 .fix …`) 是可被「引用」的路由信息: 群里要跟某个 wizard 说话,
86
+ // 引用它的气泡比手打名字快得多。这里做反向解析。头部 emoji 取自固定表 —— 用户
87
+ // 消息以这些 emoji 开头且后接 `.name` 的概率可忽略。
88
+ // 头有两种形态,都要认:裸 `🦊 .fix …`,以及 rolepage 链接形态 `[🦊 .fix](https://…) …`。
89
+ // 链接里的 URL 若留在 body 里,既污染比对又会被当成用户内容贴进 prompt。
90
+ // 旧气泡的 `#tag` 头 (改名前发出去的) 仍被认 —— 迁移时名字取自 tag, 所以它照旧指得对人。
91
+ // 公开频道里 wizard 之间说话的头是 `🦊 .a → .b`, 路由信息取发话方 (引用它 = 跟 a 说)。
112
92
  // 分片序号 (`2/5`) 与折叠气泡的 `← View chat details` 提示同理,一并算作头。
113
93
  const HEAD_EMOJI = [...ANIMALS, "🧙", "❔"];
114
94
  const EMO = `(?:${HEAD_EMOJI.join("|")})`;
115
- const TAG_PART = `(?:\\s+#([\\p{L}\\p{N}_-]{1,32}))?`;
116
- const HEADER_RE = new RegExp(`^(?:\\[${EMO}${TAG_PART}\\]\\([^)]*\\)|${EMO}${TAG_PART})` +
95
+ const NAME_PART = `(?:\\s+[.#](${NAME_CHARS}{1,32}))?(?:\\s*→\\s*[.#]${NAME_CHARS}{1,32})?`;
96
+ const HEADER_RE = new RegExp(`^(?:\\[${EMO}${NAME_PART}\\]\\([^)]*\\)|${EMO}${NAME_PART})` +
117
97
  `(?:\\s+\\d+/\\d+)?(?:\\s*←\\s*View chat details)?(?![\\p{L}\\p{N}_-])\\s*`, "u");
118
- /** 反解一条出站气泡的 `emoji #tag` 头,返回 tag 与剥头后的正文。
98
+ /** 反解一条出站气泡的 `emoji .name` 头,返回名字与剥头后的正文。
119
99
  * `fromBot=false` 表示这不是 wezard 发的,body 原样返回。
120
- * 只切掉头那一段,body 原样保留 —— last-response 里存的是剥头后的同一整串,
121
- * `canonContains` 子串比对才能命中。 */
100
+ * 只切掉头那一段; 正文里 linkNames 挂上的 `[.fix](url)` 还原成裸 `.fix` —— 引用
101
+ * 内容要跟 transcript 尾部比对, 也可能被贴进 prompt, URL 两头都是噪声。 */
122
102
  export const parseTagHeader = (text) => {
123
103
  const t = text.trim();
124
104
  const m = HEADER_RE.exec(t);
125
105
  if (!m)
126
106
  return { fromBot: false, tag: "", body: t };
127
107
  const tag = m[1] ?? m[2] ?? "";
128
- return { fromBot: true, tag, body: t.slice(m[0].length).trim() };
108
+ return { fromBot: true, tag, body: unlinkTags(t.slice(m[0].length).trim()) };
129
109
  };
130
- /** Trailing-space emoji badge for card titles; "" for untagged targets. */
110
+ /** Trailing-space emoji badge for card titles. */
131
111
  export const tagBadge = (target) => {
132
- const tag = tagOfKey(target);
133
- return tag ? `${labelFor(tag)} ` : "🧙 ";
112
+ const name = target ? linker?.nameOf(target) || tagOfKey(target) : "";
113
+ return name ? `${labelFor(name)} ` : "🧙 ";
134
114
  };
135
115
  /** 头与正文之间该留多少空白。默认同行一个空格 —— 头只是一句话的前缀,省一行。
136
116
  * 块级语法认行首,两种例外:
@@ -139,13 +119,64 @@ export const tagBadge = (target) => {
139
119
  * 段的续行,整张表塌成一行带竖线的文字。所以表格必须空行隔开。
140
120
  * HEADER_RE 尾部的 \s* 吃得掉这些换行,parseTagHeader 剥头不受影响。 */
141
121
  export const headSep = (content) => content.startsWith("```") ? "\n" : content.startsWith("|") ? "\n\n" : " ";
142
- /** Prefix markdown content with the `emoji \`#tag\`` header; identity when untagged.
122
+ let linker;
123
+ export const bindTagLinker = (l) => { linker = l; };
124
+ /** target 的对外名字: 名册里的全局名, 名册没绑定时退回 slot id。 */
125
+ export const displayName = (target) => target ? linker?.nameOf(target) || tagOfKey(target) : "";
126
+ // 正文里最多挂几个链接: 一条 URL 两百来字节, 分片预算 (mirror 的 TAG_HEADER_BUDGET)
127
+ // 按「头 + 这么多个」留的余量。同一个名字只挂第一次出现。
128
+ export const MAX_BODY_LINKS = 2;
129
+ // 右边界比路由用的 NAME_TOKEN 宽: 正文里 `.fix。` `.fix,` 也是提及; 后接 `]` 说明它已在
130
+ // 某个链接文本里, 不再套一层。左边界必须是空白/行首 —— `a.ts` 不是提及。
131
+ const MENTION_RE = /(^|\s)(\.([\p{L}\p{N}_-]{1,32}))(?![\p{L}\p{N}_\].-])/gu;
132
+ // 代码里的 `.x` 是字面量, 不是提及: 栅栏块与行内代码原样放过 (split 的捕获组落在奇数位)。
133
+ const CODE_RE = /(```[\s\S]*?(?:```|$)|`[^`\n]*`)/;
134
+ const LINKED_RE = /\[([.#][\p{L}\p{N}_-]{1,32})\]\([^)\s]*\)/gu;
135
+ /** `text` 挂上 `target` 的 rolepage; 拿不到票据原样返回。 */
136
+ export const tagLink = (target, text) => {
137
+ const url = linker?.urlOf(target);
138
+ return url ? `[${text}](${url})` : text;
139
+ };
140
+ /** 正文里指向已知 wizard 的 `.name` 挂上它的 rolepage。 */
141
+ export const linkTags = (target, text) => {
142
+ const l = linker;
143
+ if (!l || !target)
144
+ return text;
145
+ const seen = new Set();
146
+ const link = (whole, lead, token, name) => {
147
+ if (seen.size >= MAX_BODY_LINKS || seen.has(token))
148
+ return whole;
149
+ const t = l.resolve(name);
150
+ const linked = t ? tagLink(t, token) : token;
151
+ if (linked === token)
152
+ return whole;
153
+ seen.add(token);
154
+ return `${lead}${linked}`;
155
+ };
156
+ return text
157
+ .split(CODE_RE)
158
+ .map((seg, i) => (i % 2 ? seg : seg.replace(MENTION_RE, link)))
159
+ .join("");
160
+ };
161
+ /** linkTags 的逆: `[.fix](url)` → `.fix`。 */
162
+ export const unlinkTags = (text) => text.replace(LINKED_RE, "$1");
163
+ /** 头的裸形态 `emoji .name`; 名字都拿不到时是 `🧙`。 */
164
+ export const tagHead = (target) => {
165
+ const name = displayName(target);
166
+ return name ? `${labelFor(name)} .${name}` : "🧙";
167
+ };
168
+ /** 头的链接形态 `[emoji .name](url)` —— 点它就进那个 wizard 的 rolepage。
169
+ * HEADER_RE 认得这一形态, parseTagHeader 照样剥得掉。 */
170
+ export const linkedTagHead = (target, url) => `[${tagHead(target)}](${url})`;
171
+ /** 头挂上指定的 rolepage 链接 (mirror 用本轮 turn 的票据), 正文里的名字一并挂链。
172
+ * url 为空时退回裸头 —— 头那一段是路由信息, 少了链接只是少一层可点, 不能因此不写。
143
173
  * `seq` ("2/5") marks one piece of a split push — it rides in the same header
144
- * line so every chunk of a long reply is attributable on its own, and shows
145
- * alone when the session is untagged. */
146
- export const withTagHeader = (target, content, seq) => {
147
- const tag = tagOfKey(target);
148
- const head = [tag ? `${labelFor(tag)} #${tag}` : "🧙", seq ?? ""].filter(Boolean).join(" ");
149
- return `${head}${headSep(content)}${content}`;
174
+ * line so every chunk of a long reply is attributable on its own. */
175
+ export const withLinkedTagHeader = (target, content, url, seq) => {
176
+ const head = [url ? linkedTagHead(target, url) : tagHead(target), seq ?? ""].filter(Boolean).join(" ");
177
+ const body = linkTags(target, content);
178
+ return `${head}${headSep(body)}${body}`;
150
179
  };
180
+ /** 给气泡加 `emoji .name` 头, 链接取该 wizard 自己的 rolepage (bindTagLinker)。 */
181
+ export const withTagHeader = (target, content, seq) => withLinkedTagHeader(target, content, target ? linker?.urlOf(target) : undefined, seq);
151
182
  //# sourceMappingURL=session-label.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-label.js","sourceRoot":"","sources":["../../shared/session-label.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-label.js","sourceRoot":"","sources":["../../shared/session-label.ts"],"names":[],"mappings":"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"}
@@ -23,4 +23,7 @@ export const mapLimit = async (xs, limit, f) => {
23
23
  await Promise.all(Array.from({ length: Math.max(1, Math.min(limit, xs.length)) }, worker));
24
24
  return out;
25
25
  };
26
+ /** Substitute `{{…}}` refs from a context map. Unknown keys are left verbatim —
27
+ * a prompt legitimately containing `{{foo}}` shouldn't be silently emptied. */
28
+ export const interpolate = (template, ctx) => template.replace(/\{\{\s*#?([\p{L}\p{N}_-]+)\s*\}\}/gu, (whole, key) => key in ctx ? ctx[key] : whole);
26
29
  //# sourceMappingURL=std.js.map