wezard 1.3.23 → 1.4.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 +4 -2
- package/README.md +43 -37
- package/dist/daemon/chat-name.js +65 -2
- package/dist/daemon/chat-name.js.map +1 -1
- package/dist/daemon/detail.js +7 -0
- package/dist/daemon/detail.js.map +1 -1
- package/dist/daemon/graph.js +25 -3
- package/dist/daemon/graph.js.map +1 -1
- package/dist/daemon/inbound.js +114 -58
- package/dist/daemon/inbound.js.map +1 -1
- package/dist/daemon/index.js +773 -125
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/jobs.js +91 -0
- package/dist/daemon/jobs.js.map +1 -0
- package/dist/daemon/mirror-bridge.js +194 -14
- package/dist/daemon/mirror-bridge.js.map +1 -1
- package/dist/daemon/mirror-store.js.map +1 -1
- package/dist/daemon/notices.js +70 -0
- package/dist/daemon/notices.js.map +1 -0
- package/dist/daemon/peers.js +93 -61
- package/dist/daemon/peers.js.map +1 -1
- package/dist/daemon/spawn-tmux.js +46 -4
- package/dist/daemon/spawn-tmux.js.map +1 -1
- package/dist/daemon/tasks.js +90 -0
- package/dist/daemon/tasks.js.map +1 -0
- package/dist/daemon/wizard.js +151 -0
- package/dist/daemon/wizard.js.map +1 -0
- package/dist/mcp/server.js +236 -102
- package/dist/mcp/server.js.map +1 -1
- package/dist/shared/cli-backends.js +10 -0
- package/dist/shared/cli-backends.js.map +1 -1
- package/dist/shared/config.js +50 -14
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/detail-render.js +3 -2
- package/dist/shared/detail-render.js.map +1 -1
- package/dist/shared/detail-store.js.map +1 -1
- package/dist/shared/schedule-spec.js +240 -0
- package/dist/shared/schedule-spec.js.map +1 -0
- package/dist/shared/session-label.js +8 -4
- package/dist/shared/session-label.js.map +1 -1
- package/package.json +1 -1
- package/dist/daemon/topics.js +0 -106
- package/dist/daemon/topics.js.map +0 -1
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// 定时规格 —— 把一句人话里的「什么时候」解析成三种形状之一, 外加到点判定与
|
|
2
|
+
// 下次触发时刻。整模块是纯函数: 时钟由调用方传进来 (now), 这里只做匹配与算术。
|
|
3
|
+
//
|
|
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;
|
|
14
|
+
// ── 汉字数字 ────────────────────────────────────────────────────────
|
|
15
|
+
const CN_DIGIT = {
|
|
16
|
+
零: 0, 〇: 0, 一: 1, 二: 2, 两: 2, 三: 3, 四: 4, 五: 5,
|
|
17
|
+
六: 6, 七: 7, 八: 8, 九: 9, 十: 10,
|
|
18
|
+
};
|
|
19
|
+
/** 「二十一」→ 21, 「十」→ 10, 「9」→ 9。认不出返回 undefined。 */
|
|
20
|
+
export const cnToNum = (raw) => {
|
|
21
|
+
const s = raw.trim();
|
|
22
|
+
if (!s)
|
|
23
|
+
return undefined;
|
|
24
|
+
if (/^\d+$/.test(s))
|
|
25
|
+
return Number(s);
|
|
26
|
+
if ([...s].some((c) => !(c in CN_DIGIT)))
|
|
27
|
+
return undefined;
|
|
28
|
+
const i = s.indexOf("十");
|
|
29
|
+
if (i < 0)
|
|
30
|
+
return [...s].reduce((n, c) => n * 10 + CN_DIGIT[c], 0);
|
|
31
|
+
const tens = i === 0 ? 1 : CN_DIGIT[s[i - 1]];
|
|
32
|
+
const ones = i === s.length - 1 ? 0 : CN_DIGIT[s[s.length - 1]];
|
|
33
|
+
return tens * 10 + ones;
|
|
34
|
+
};
|
|
35
|
+
const NUM = "[0-9零〇一二三四五六七八九十两]";
|
|
36
|
+
// ── 星期 ────────────────────────────────────────────────────────────
|
|
37
|
+
const CN_WEEKDAY = {
|
|
38
|
+
日: 0, 天: 0, 一: 1, 二: 2, 三: 3, 四: 4, 五: 5, 六: 6,
|
|
39
|
+
};
|
|
40
|
+
const EN_WEEKDAY = {
|
|
41
|
+
sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6,
|
|
42
|
+
};
|
|
43
|
+
const uniqSorted = (xs) => [...new Set(xs)].sort((a, b) => a - b);
|
|
44
|
+
/** 文本里说的是哪几天。`[]` = 每天; undefined = 没提。 */
|
|
45
|
+
export const parseDays = (t) => {
|
|
46
|
+
if (/工作日|上班日|周一到周五|周一至周五|週一到週五|weekdays?|workdays?/i.test(t))
|
|
47
|
+
return [1, 2, 3, 4, 5];
|
|
48
|
+
if (/周末|週末|双休|週休|weekends?/i.test(t))
|
|
49
|
+
return [0, 6];
|
|
50
|
+
const cn = [...t.matchAll(/(?:每)?(?:周|週|星期|礼拜|禮拜)\s*([日一二三四五六天]+)/g)]
|
|
51
|
+
.flatMap((m) => [...m[1]].map((c) => CN_WEEKDAY[c]));
|
|
52
|
+
if (cn.length)
|
|
53
|
+
return uniqSorted(cn);
|
|
54
|
+
const en = [...t.matchAll(/\b(sun|mon|tue|wed|thu|fri|sat)[a-z]*\b/gi)].map((m) => EN_WEEKDAY[m[1].toLowerCase()]);
|
|
55
|
+
if (en.length)
|
|
56
|
+
return uniqSorted(en);
|
|
57
|
+
if (/每天|每日|天天|每晚|每早|每个早上|daily|every\s*day/i.test(t))
|
|
58
|
+
return [];
|
|
59
|
+
return undefined;
|
|
60
|
+
};
|
|
61
|
+
// ── 时刻 ────────────────────────────────────────────────────────────
|
|
62
|
+
// 时段词只在 12 小时制下有意义: 「晚上 21:30」里的 21 已经说清楚了, 再 +12 就废了。
|
|
63
|
+
const shiftMeridiem = (h, t) => {
|
|
64
|
+
if (h > 12)
|
|
65
|
+
return h;
|
|
66
|
+
if (/下午|傍晚|晚上|夜里|夜間|今晚|每晚|晚|(?<![a-z])pm\b/i.test(t))
|
|
67
|
+
return h === 12 ? 12 : h + 12;
|
|
68
|
+
if (/中午|正午|noon/.test(t))
|
|
69
|
+
return h === 12 ? 12 : h + 12;
|
|
70
|
+
if (/凌晨|半夜|midnight/.test(t))
|
|
71
|
+
return h === 12 ? 0 : h;
|
|
72
|
+
if (/早上|早晨|清晨|上午|每早|明早|(?<![a-z])am\b/i.test(t))
|
|
73
|
+
return h === 12 ? 0 : h;
|
|
74
|
+
return h;
|
|
75
|
+
};
|
|
76
|
+
const QUARTER = { 半: 30, 一刻: 15, 三刻: 45 };
|
|
77
|
+
/** 「晚上九点半」「21:30」「9:30pm」→ {hour, minute}。没提时刻返回 undefined。 */
|
|
78
|
+
export const parseTimeOfDay = (t) => {
|
|
79
|
+
const digital = t.match(/(\d{1,2})\s*[::]\s*(\d{1,2})/);
|
|
80
|
+
if (digital) {
|
|
81
|
+
const h = shiftMeridiem(Number(digital[1]), t);
|
|
82
|
+
return { hour: h % 24, minute: Number(digital[2]) % 60 };
|
|
83
|
+
}
|
|
84
|
+
const spoken = t.match(new RegExp(`(${NUM}{1,3})\\s*(?:点|時|时|时钟|o'?clock)\\s*(半|一刻|三刻)?\\s*(?:(${NUM}{1,3})\\s*分)?`));
|
|
85
|
+
if (spoken) {
|
|
86
|
+
const h0 = cnToNum(spoken[1]);
|
|
87
|
+
if (h0 === undefined || h0 > 24)
|
|
88
|
+
return undefined;
|
|
89
|
+
const m = spoken[2] ? QUARTER[spoken[2]] : spoken[3] ? (cnToNum(spoken[3]) ?? 0) : 0;
|
|
90
|
+
return { hour: shiftMeridiem(h0, t) % 24, minute: m % 60 };
|
|
91
|
+
}
|
|
92
|
+
const bare = t.match(/(\d{1,2})\s*(am|pm)\b/i);
|
|
93
|
+
if (bare)
|
|
94
|
+
return { hour: shiftMeridiem(Number(bare[1]), bare[2]) % 24, minute: 0 };
|
|
95
|
+
return undefined;
|
|
96
|
+
};
|
|
97
|
+
// ── 间隔 ────────────────────────────────────────────────────────────
|
|
98
|
+
const UNIT_MIN = {
|
|
99
|
+
分: 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,
|
|
101
|
+
天: 1440, 日: 1440, day: 1440, days: 1440, d: 1440,
|
|
102
|
+
};
|
|
103
|
+
/** 「每隔两小时」「每 30 分钟」「每半小时」「every 15m」→ 分钟数。 */
|
|
104
|
+
export const parseInterval = (t) => {
|
|
105
|
+
const half = t.match(/每\s*隔?\s*半\s*(小时|小時|钟头|鐘頭|天|日|hour)/);
|
|
106
|
+
if (half)
|
|
107
|
+
return (UNIT_MIN[half[1]] ?? 60) / 2;
|
|
108
|
+
const cn = t.match(new RegExp(`每\\s*隔?\\s*(${NUM}{1,3})\\s*(分钟|分鐘|分|小时|小時|钟头|鐘頭|天|日)`));
|
|
109
|
+
if (cn) {
|
|
110
|
+
const n = cnToNum(cn[1]);
|
|
111
|
+
return n && n > 0 ? n * (UNIT_MIN[cn[2]] ?? 1) : undefined;
|
|
112
|
+
}
|
|
113
|
+
const en = t.match(/every\s*(\d{1,4})?\s*(minutes?|mins?|hours?|hrs?|days?|[mhd])\b/i);
|
|
114
|
+
if (en) {
|
|
115
|
+
const n = en[1] ? Number(en[1]) : 1;
|
|
116
|
+
return n > 0 ? n * (UNIT_MIN[en[2].toLowerCase()] ?? 1) : undefined;
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
};
|
|
120
|
+
// ── 一次性 ──────────────────────────────────────────────────────────
|
|
121
|
+
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*(?:之)?后`))
|
|
124
|
+
?? t.match(/\bin\s*(\d{1,4})\s*(minutes?|mins?|hours?|hrs?|days?|[mhd])\b/i);
|
|
125
|
+
if (rel) {
|
|
126
|
+
const unit = UNIT_MIN[rel[2].toLowerCase()] ?? 1;
|
|
127
|
+
const n = rel[1] === "半" ? 0.5 : (cnToNum(rel[1]) ?? Number(rel[1]));
|
|
128
|
+
if (n > 0)
|
|
129
|
+
return { kind: "once", at: now.getTime() + Math.round(n * unit) * 60_000 };
|
|
130
|
+
}
|
|
131
|
+
const dayWord = t.match(/(今天|今晚|今夜|明天|明早|明晚|后天|後天|tomorrow|tonight)/i);
|
|
132
|
+
if (!dayWord)
|
|
133
|
+
return undefined;
|
|
134
|
+
const addDays = /后天|後天/.test(dayWord[1]) ? 2 : /今天|今晚|今夜|tonight/i.test(dayWord[1]) ? 0 : 1;
|
|
135
|
+
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();
|
|
207
|
+
};
|
|
208
|
+
// ── 回显 ────────────────────────────────────────────────────────────
|
|
209
|
+
const hhmm = (h, m) => `${String(h).padStart(2, "0")}:${String(m).padStart(2, "0")}`;
|
|
210
|
+
const CN_DAY_NAME = ["日", "一", "二", "三", "四", "五", "六"];
|
|
211
|
+
const daysLabel = (days) => {
|
|
212
|
+
if (!days.length)
|
|
213
|
+
return "每天";
|
|
214
|
+
const k = days.join(",");
|
|
215
|
+
if (k === "1,2,3,4,5")
|
|
216
|
+
return "每个工作日";
|
|
217
|
+
if (k === "0,6")
|
|
218
|
+
return "每逢周末";
|
|
219
|
+
return `每周${days.map((d) => CN_DAY_NAME[d]).join("、")}`;
|
|
220
|
+
};
|
|
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
|
+
}
|
|
239
|
+
};
|
|
240
|
+
//# sourceMappingURL=schedule-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-spec.js","sourceRoot":"","sources":["../../shared/schedule-spec.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,8CAA8C;AAC9C,EAAE;AACF,8BAA8B;AAC9B,uDAAuD;AACvD,mDAAmD;AACnD,kEAAkE;AAClE,EAAE;AACF,mDAAmD;AACnD,mDAAmD;AAOnD,kDAAkD;AAClD,uBAAuB;AACvB,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC;AAE9B,mEAAmE;AACnE,MAAM,QAAQ,GAAqC;IACjD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;CAC9B,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAsB,EAAE;IACzD,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAE,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAE,CAAE,CAAC;IAClE,OAAO,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,GAAG,GAAG,oBAAoB,CAAC;AAEjC,qEAAqE;AACrE,MAAM,UAAU,GAAqC;IACnD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;CAC/C,CAAC;AACF,MAAM,UAAU,GAAqC;IACnD,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;CACvD,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,EAAY,EAAY,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAwB,EAAE;IAC3D,IAAI,gDAAgD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;SAClE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,MAAM;QAAE,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAE,CAAC,CAAC;IACrH,IAAI,EAAE,CAAC,MAAM;QAAE,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,IAAI,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAChE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,qEAAqE;AACrE,uDAAuD;AACvD,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;IACrD,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACpF,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,OAAO,GAAqC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAE5E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAS,EAAgD,EAAE;IACxF,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,wDAAwD,GAAG,eAAe,CAAC,CAAC,CAAC;IACtH,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;IAC7D,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC/C,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACpF,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,QAAQ,GAAqC;IACjD,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAChE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;IACzE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI;CACjD,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAS,EAAsB,EAAE;IAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC5D,IAAI,IAAI;QAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,eAAe,GAAG,qCAAqC,CAAC,CAAC,CAAC;IACxF,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACvF,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,oEAAoE;AACpE,MAAM,IAAI,GAAG,CAAC,GAAS,EAAE,OAAe,EAAE,IAAY,EAAE,MAAc,EAAU,EAAE,CAChF,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAErG,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,GAAS,EAAoB,EAAE;IAC3D,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,8CAA8C,CAAC,CAAC;WACnF,CAAC,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC/E,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACvE,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxG,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;AACxE,CAAC,CAAC;AAEF,qEAAqE;AACrE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,MAAY,IAAI,IAAI,EAAE,EAAoB,EAAE;IAClF,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC9B,0CAA0C;IAC1C,uBAAuB;IACvB,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC7F,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACxF,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,uBAAuB;IACrF,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACrF,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,YAAY,GAAG,CAAC,CAAmC,EAAE,GAAS,EAAsB,EAAE;IAC1F,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AACrB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAU,EAAE,GAAS,EAAE,KAAa,EAAW,EAAE;IACrE,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IACxB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;QACzC,KAAK,OAAO;YACV,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QAC5C,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,UAAU,IAAI,KAAK,GAAG,IAAI,CAAC;QAClF,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAU,EAAE,KAAa,EAAE,MAAY,IAAI,IAAI,EAAE,EAAU,EAAE;IACpF,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/G,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC7G,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAExD,MAAM,SAAS,GAAG,CAAC,IAAc,EAAU,EAAE;IAC3C,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IACtC,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3D,CAAC,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAU,EAAU,EAAE;IACjD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;YAC7C,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC;YAC1C,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QACzE,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;QAC9J,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -132,6 +132,13 @@ export const tagBadge = (target) => {
|
|
|
132
132
|
const tag = tagOfKey(target);
|
|
133
133
|
return tag ? `${labelFor(tag)} ` : "🧙 ";
|
|
134
134
|
};
|
|
135
|
+
/** 头与正文之间该留多少空白。默认同行一个空格 —— 头只是一句话的前缀,省一行。
|
|
136
|
+
* 块级语法认行首,两种例外:
|
|
137
|
+
* • ``` 栅栏必须顶行首才被 WeCom 认作代码块,同行拼头会把它挤成字面文本;
|
|
138
|
+
* • 表格更严 —— 它**不能打断一个段落**,只隔一个换行,首行表头会被当成头那一
|
|
139
|
+
* 段的续行,整张表塌成一行带竖线的文字。所以表格必须空行隔开。
|
|
140
|
+
* HEADER_RE 尾部的 \s* 吃得掉这些换行,parseTagHeader 剥头不受影响。 */
|
|
141
|
+
export const headSep = (content) => content.startsWith("```") ? "\n" : content.startsWith("|") ? "\n\n" : " ";
|
|
135
142
|
/** Prefix markdown content with the `emoji \`#tag\`` header; identity when untagged.
|
|
136
143
|
* `seq` ("2/5") marks one piece of a split push — it rides in the same header
|
|
137
144
|
* line so every chunk of a long reply is attributable on its own, and shows
|
|
@@ -139,9 +146,6 @@ export const tagBadge = (target) => {
|
|
|
139
146
|
export const withTagHeader = (target, content, seq) => {
|
|
140
147
|
const tag = tagOfKey(target);
|
|
141
148
|
const head = [tag ? `${labelFor(tag)} #${tag}` : "🧙", seq ?? ""].filter(Boolean).join(" ");
|
|
142
|
-
|
|
143
|
-
// HEADER_RE 尾部的 \s* 吃得掉换行,parseTagHeader 剥头不受影响。
|
|
144
|
-
const sep = content.startsWith("```") ? "\n" : " ";
|
|
145
|
-
return `${head}${sep}${content}`;
|
|
149
|
+
return `${head}${headSep(content)}${content}`;
|
|
146
150
|
};
|
|
147
151
|
//# 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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"}
|
package/package.json
CHANGED
package/dist/daemon/topics.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { patchJsonc } from "../shared/config-writer.js";
|
|
2
|
-
import { withTagHeader } from "../shared/session-label.js";
|
|
3
|
-
const stripPrefix = (s) => {
|
|
4
|
-
const i = s.indexOf(":");
|
|
5
|
-
return i >= 0 ? s.slice(i + 1) : s;
|
|
6
|
-
};
|
|
7
|
-
// Topic name 允许中文/字母数字/`-`/`_`/`.`,不允许空白。剥离外层引号(中英文单双)。
|
|
8
|
-
const stripQuotes = (s) => s.trim().replace(/^[\s'"‘’“”`]+|[\s'"‘’“”`]+$/gu, "");
|
|
9
|
-
const normTopic = (raw) => stripQuotes(raw);
|
|
10
|
-
// ── 订阅表 ────────────────────────────────────────────────────────
|
|
11
|
-
export const subscribe = (cfg, sourcePath, topic, target) => {
|
|
12
|
-
const t = normTopic(topic);
|
|
13
|
-
if (!t)
|
|
14
|
-
return { added: false };
|
|
15
|
-
const arr = cfg.topics.subs[t] ? cfg.topics.subs[t].slice() : [];
|
|
16
|
-
if (arr.includes(target))
|
|
17
|
-
return { added: false };
|
|
18
|
-
arr.push(target);
|
|
19
|
-
cfg.topics.subs[t] = arr;
|
|
20
|
-
patchJsonc(sourcePath, [{ path: ["topics", "subs", t], value: arr }]);
|
|
21
|
-
return { added: true };
|
|
22
|
-
};
|
|
23
|
-
export const unsubscribe = (cfg, sourcePath, topic, target) => {
|
|
24
|
-
const t = normTopic(topic);
|
|
25
|
-
const arr = cfg.topics.subs[t] ?? [];
|
|
26
|
-
const next = arr.filter((x) => x !== target);
|
|
27
|
-
if (next.length === arr.length)
|
|
28
|
-
return { removed: false };
|
|
29
|
-
cfg.topics.subs[t] = next;
|
|
30
|
-
patchJsonc(sourcePath, [{ path: ["topics", "subs", t], value: next }]);
|
|
31
|
-
return { removed: true };
|
|
32
|
-
};
|
|
33
|
-
export const listSubs = (cfg, target) => {
|
|
34
|
-
const entries = Object.entries(cfg.topics.subs);
|
|
35
|
-
const filtered = target ? entries.filter(([, subs]) => subs.includes(target)) : entries;
|
|
36
|
-
return filtered.map(([topic, targets]) => ({ topic, targets: targets.slice() }));
|
|
37
|
-
};
|
|
38
|
-
const persistSchedules = (cfg, sourcePath) => {
|
|
39
|
-
patchJsonc(sourcePath, [{ path: ["topics", "schedules"], value: cfg.topics.schedules }]);
|
|
40
|
-
};
|
|
41
|
-
export const addSchedule = (cfg, sourcePath, s) => {
|
|
42
|
-
cfg.topics.schedules.push(s);
|
|
43
|
-
persistSchedules(cfg, sourcePath);
|
|
44
|
-
};
|
|
45
|
-
export const removeSchedulesByTopic = (cfg, sourcePath, topic) => {
|
|
46
|
-
const t = normTopic(topic);
|
|
47
|
-
const before = cfg.topics.schedules.length;
|
|
48
|
-
cfg.topics.schedules = cfg.topics.schedules.filter((s) => s.topic !== t);
|
|
49
|
-
const removed = before - cfg.topics.schedules.length;
|
|
50
|
-
if (removed > 0)
|
|
51
|
-
persistSchedules(cfg, sourcePath);
|
|
52
|
-
return removed;
|
|
53
|
-
};
|
|
54
|
-
export const listSchedules = (cfg, topic) => {
|
|
55
|
-
const t = topic ? normTopic(topic) : undefined;
|
|
56
|
-
return t ? cfg.topics.schedules.filter((s) => s.topic === t) : cfg.topics.schedules.slice();
|
|
57
|
-
};
|
|
58
|
-
export const publish = async (client, cfg, log, topic, content) => {
|
|
59
|
-
const t = normTopic(topic);
|
|
60
|
-
const subs = (cfg.topics.subs[t] ?? []).slice();
|
|
61
|
-
let sent = 0;
|
|
62
|
-
let failed = 0;
|
|
63
|
-
for (const s of subs) {
|
|
64
|
-
try {
|
|
65
|
-
// 订阅者 key 可能带 `#tag` (订阅是按会话 key 记的) —— 广播落到该会话的
|
|
66
|
-
// 视觉通道里, 与该会话的其它气泡一致。
|
|
67
|
-
await client.sendMessage(stripPrefix(s), {
|
|
68
|
-
msgtype: "markdown",
|
|
69
|
-
markdown: { content: withTagHeader(s, content) },
|
|
70
|
-
});
|
|
71
|
-
sent++;
|
|
72
|
-
}
|
|
73
|
-
catch (e) {
|
|
74
|
-
failed++;
|
|
75
|
-
log.warn({ topic: t, target: s, err: e.message }, "publish target failed");
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
log.info({ topic: t, subs: subs.length, sent, failed }, "publish");
|
|
79
|
-
return { topic: t, sent, failed, subs };
|
|
80
|
-
};
|
|
81
|
-
export const startScheduler = ({ client, cfg, log }) => {
|
|
82
|
-
let lastKey = "";
|
|
83
|
-
const tick = async () => {
|
|
84
|
-
if (!client.isConnected)
|
|
85
|
-
return;
|
|
86
|
-
const now = new Date();
|
|
87
|
-
const key = `${now.getFullYear()}-${now.getMonth()}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}`;
|
|
88
|
-
if (key === lastKey)
|
|
89
|
-
return;
|
|
90
|
-
lastKey = key;
|
|
91
|
-
const h = now.getHours();
|
|
92
|
-
const m = now.getMinutes();
|
|
93
|
-
const due = cfg.topics.schedules.filter((s) => s.hour === h && s.minute === m);
|
|
94
|
-
for (const s of due) {
|
|
95
|
-
try {
|
|
96
|
-
await publish(client, cfg, log, s.topic, s.content);
|
|
97
|
-
}
|
|
98
|
-
catch (e) {
|
|
99
|
-
log.error({ topic: s.topic, err: e.message }, "scheduled publish failed");
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
const timer = setInterval(() => { void tick(); }, 20_000);
|
|
104
|
-
return { stop: () => clearInterval(timer) };
|
|
105
|
-
};
|
|
106
|
-
//# sourceMappingURL=topics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"topics.js","sourceRoot":"","sources":["../../daemon/topics.ts"],"names":[],"mappings":"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"}
|