wezard 0.3.3

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 (117) hide show
  1. package/.claude-plugin/marketplace.json +14 -0
  2. package/.claude-plugin/plugin.json +14 -0
  3. package/CLAUDE.md +83 -0
  4. package/LICENSE +21 -0
  5. package/README.md +410 -0
  6. package/cli/weclaude.sh +236 -0
  7. package/commands/audit.md +7 -0
  8. package/commands/wrc.md +7 -0
  9. package/config.example.jsonc +102 -0
  10. package/dist/cli/audit.js +156 -0
  11. package/dist/cli/audit.js.map +1 -0
  12. package/dist/cli/init.js +311 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/cli/sync.js +175 -0
  15. package/dist/cli/sync.js.map +1 -0
  16. package/dist/daemon/approval.js +1301 -0
  17. package/dist/daemon/approval.js.map +1 -0
  18. package/dist/daemon/ask.js +101 -0
  19. package/dist/daemon/ask.js.map +1 -0
  20. package/dist/daemon/audit.js +168 -0
  21. package/dist/daemon/audit.js.map +1 -0
  22. package/dist/daemon/cc-bridge.js +204 -0
  23. package/dist/daemon/cc-bridge.js.map +1 -0
  24. package/dist/daemon/cfg-sync.js +240 -0
  25. package/dist/daemon/cfg-sync.js.map +1 -0
  26. package/dist/daemon/claim.js +95 -0
  27. package/dist/daemon/claim.js.map +1 -0
  28. package/dist/daemon/detail.js +153 -0
  29. package/dist/daemon/detail.js.map +1 -0
  30. package/dist/daemon/graph.js +176 -0
  31. package/dist/daemon/graph.js.map +1 -0
  32. package/dist/daemon/http.js +83 -0
  33. package/dist/daemon/http.js.map +1 -0
  34. package/dist/daemon/inbound.js +919 -0
  35. package/dist/daemon/inbound.js.map +1 -0
  36. package/dist/daemon/index.js +569 -0
  37. package/dist/daemon/index.js.map +1 -0
  38. package/dist/daemon/last-response.js +59 -0
  39. package/dist/daemon/last-response.js.map +1 -0
  40. package/dist/daemon/mirror-bridge.js +3512 -0
  41. package/dist/daemon/mirror-bridge.js.map +1 -0
  42. package/dist/daemon/mirror-store.js +39 -0
  43. package/dist/daemon/mirror-store.js.map +1 -0
  44. package/dist/daemon/outbound.js +42 -0
  45. package/dist/daemon/outbound.js.map +1 -0
  46. package/dist/daemon/peers.js +146 -0
  47. package/dist/daemon/peers.js.map +1 -0
  48. package/dist/daemon/pending.js +90 -0
  49. package/dist/daemon/pending.js.map +1 -0
  50. package/dist/daemon/quota.js +164 -0
  51. package/dist/daemon/quota.js.map +1 -0
  52. package/dist/daemon/redact.js +27 -0
  53. package/dist/daemon/redact.js.map +1 -0
  54. package/dist/daemon/session-cache.js +149 -0
  55. package/dist/daemon/session-cache.js.map +1 -0
  56. package/dist/daemon/session-scan.js +273 -0
  57. package/dist/daemon/session-scan.js.map +1 -0
  58. package/dist/daemon/sessions.js +35 -0
  59. package/dist/daemon/sessions.js.map +1 -0
  60. package/dist/daemon/spawn-tmux.js +213 -0
  61. package/dist/daemon/spawn-tmux.js.map +1 -0
  62. package/dist/daemon/tips.js +25 -0
  63. package/dist/daemon/tips.js.map +1 -0
  64. package/dist/daemon/topics.js +197 -0
  65. package/dist/daemon/topics.js.map +1 -0
  66. package/dist/daemon/usage.js +358 -0
  67. package/dist/daemon/usage.js.map +1 -0
  68. package/dist/daemon/wedoc.js +210 -0
  69. package/dist/daemon/wedoc.js.map +1 -0
  70. package/dist/daemon/ws.js +67 -0
  71. package/dist/daemon/ws.js.map +1 -0
  72. package/dist/mcp/server.js +385 -0
  73. package/dist/mcp/server.js.map +1 -0
  74. package/dist/shared/ansi.js +134 -0
  75. package/dist/shared/ansi.js.map +1 -0
  76. package/dist/shared/chat-http.js +195 -0
  77. package/dist/shared/chat-http.js.map +1 -0
  78. package/dist/shared/chat-render.js +53 -0
  79. package/dist/shared/chat-render.js.map +1 -0
  80. package/dist/shared/chat-view.js +116 -0
  81. package/dist/shared/chat-view.js.map +1 -0
  82. package/dist/shared/cli-backends.js +304 -0
  83. package/dist/shared/cli-backends.js.map +1 -0
  84. package/dist/shared/config-writer.js +39 -0
  85. package/dist/shared/config-writer.js.map +1 -0
  86. package/dist/shared/config.js +278 -0
  87. package/dist/shared/config.js.map +1 -0
  88. package/dist/shared/detail-render.js +836 -0
  89. package/dist/shared/detail-render.js.map +1 -0
  90. package/dist/shared/detail-store.js +205 -0
  91. package/dist/shared/detail-store.js.map +1 -0
  92. package/dist/shared/highlight.js +154 -0
  93. package/dist/shared/highlight.js.map +1 -0
  94. package/dist/shared/lan-ip.js +35 -0
  95. package/dist/shared/lan-ip.js.map +1 -0
  96. package/dist/shared/log.js +18 -0
  97. package/dist/shared/log.js.map +1 -0
  98. package/dist/shared/md-chunk.js +99 -0
  99. package/dist/shared/md-chunk.js.map +1 -0
  100. package/dist/shared/paths.js +12 -0
  101. package/dist/shared/paths.js.map +1 -0
  102. package/dist/shared/session-label.js +67 -0
  103. package/dist/shared/session-label.js.map +1 -0
  104. package/dist/shared/web-assets.js +51 -0
  105. package/dist/shared/web-assets.js.map +1 -0
  106. package/dist/svr/index.js +246 -0
  107. package/dist/svr/index.js.map +1 -0
  108. package/hooks/hooks.json +16 -0
  109. package/hooks/pre-tool-use.sh +167 -0
  110. package/launchd/com.weclaude.daemon.plist.template +45 -0
  111. package/package.json +97 -0
  112. package/scripts/install.sh +73 -0
  113. package/scripts/postinstall.sh +12 -0
  114. package/scripts/uninstall.sh +44 -0
  115. package/systemd/weclaude.service.template +17 -0
  116. package/web/chat.css +171 -0
  117. package/web/chat.js +367 -0
@@ -0,0 +1,240 @@
1
+ // Project-level config sync across CLI backends.
2
+ //
3
+ // A project that is worked on by both Claude Code and CodeBuddy carries two
4
+ // parallel config trees (`CLAUDE.md` + `.claude/{skills,commands,agents}` vs
5
+ // `CODEBUDDY.md` + `.codebuddy/...`). They drift because an edit made through
6
+ // one CLI is invisible to the other. This module folds them back together.
7
+ //
8
+ // Merge is a real 3-way merge, not a copy: `git merge-file` against a base
9
+ // snapshot of the last synced content (`~/.weclaude/cfgsync/<project>/base/`).
10
+ // Both sides' independent edits survive; only genuinely overlapping edits
11
+ // conflict, and those files are reported and left untouched.
12
+ //
13
+ // GLOBAL config (~/.claude, ~/.codebuddy) is deliberately out of scope — those
14
+ // homes carry CLI-specific hooks / plugin roots / MCP wiring that must NOT be
15
+ // cross-written.
16
+ import { execFile } from "node:child_process";
17
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
18
+ import { dirname, join } from "node:path";
19
+ import { expandHome } from "../shared/paths.js";
20
+ import { activeBackends } from "../shared/cli-backends.js";
21
+ // Subdirectories synced under each backend's project config dir. settings.json
22
+ // is excluded on purpose: hook paths, plugin roots and MCP entries are per-CLI,
23
+ // and weclaude's own `cli/sync.ts` owns the hook block inside them.
24
+ const SUBDIRS = ["skills", "commands", "agents"];
25
+ // Logical key for the per-CLI memory file. `CLAUDE.md` and `CODEBUDDY.md` are
26
+ // the same asset under two names, so they collapse to one key and each side
27
+ // materializes it under its own filename.
28
+ const MEMORY_KEY = "MEMORY.md";
29
+ const MAX_BYTES = 512 * 1024;
30
+ const CFGSYNC_ROOT = "~/.weclaude/cfgsync";
31
+ // ── pure path algebra ───────────────────────────────────────────────────
32
+ const isCodebuddy = (name) => name === "codebuddy";
33
+ const projectRootOf = (b, cwd) => ({
34
+ name: b.name,
35
+ dir: join(cwd, isCodebuddy(b.name) ? ".codebuddy" : ".claude"),
36
+ memory: join(cwd, isCodebuddy(b.name) ? "CODEBUDDY.md" : "CLAUDE.md"),
37
+ });
38
+ const pathOf = (root, key) => key === MEMORY_KEY ? root.memory : join(root.dir, key);
39
+ /** Path-safe slug for a project cwd, mirroring the CLI transcript encoding. */
40
+ const slugOfCwd = (cwd) => cwd.replace(/^[/]+/, "").replace(/[/.]/g, "-");
41
+ const baseDirOf = (cwd) => join(expandHome(CFGSYNC_ROOT), slugOfCwd(cwd), "base");
42
+ // A backend participates only if it is actually in use here: its global home
43
+ // exists (installed) or the project already carries its config tree. Without
44
+ // this every sync would conjure a `.codebuddy/` into projects of users who have
45
+ // never run CodeBuddy.
46
+ const participates = (b, root) => existsSync(expandHome(b.homeDir)) || existsSync(root.dir) || existsSync(root.memory);
47
+ // claude and claude-internal share `.claude` — same tree, keep one.
48
+ const rootsFor = (cwd) => activeBackends()
49
+ .map((b) => ({ b, root: projectRootOf(b, cwd) }))
50
+ .filter(({ b, root }) => participates(b, root))
51
+ .reduce((acc, { root }) => (acc.some((r) => r.dir === root.dir) ? acc : [...acc, root]), []);
52
+ // ── file IO helpers (side effects live here) ────────────────────────────
53
+ const walk = (dir, prefix) => {
54
+ if (!existsSync(dir))
55
+ return [];
56
+ return readdirSync(dir, { withFileTypes: true }).flatMap((e) => {
57
+ if (e.name.startsWith("."))
58
+ return [];
59
+ const rel = prefix ? `${prefix}/${e.name}` : e.name;
60
+ if (e.isDirectory())
61
+ return walk(join(dir, e.name), rel);
62
+ return e.isFile() ? [rel] : [];
63
+ });
64
+ };
65
+ const keysOf = (root) => [
66
+ ...(existsSync(root.memory) ? [MEMORY_KEY] : []),
67
+ ...SUBDIRS.flatMap((sub) => walk(join(root.dir, sub), sub)),
68
+ ];
69
+ const readMaybe = (p) => {
70
+ try {
71
+ return statSync(p).size > MAX_BYTES ? undefined : readFileSync(p);
72
+ }
73
+ catch {
74
+ return undefined;
75
+ }
76
+ };
77
+ const isText = (b) => !b.includes(0);
78
+ const writeFile = (p, data) => {
79
+ mkdirSync(dirname(p), { recursive: true });
80
+ writeFileSync(p, data);
81
+ };
82
+ // PATH is stripped under launchd/systemd — git may live in a homebrew prefix.
83
+ const augmentedPath = (orig) => {
84
+ const extra = ["/opt/homebrew/bin", "/usr/local/bin", "/usr/bin", "/bin"];
85
+ const seen = new Set((orig ?? "").split(":").filter(Boolean));
86
+ return [...seen, ...extra.filter((d) => !seen.has(d))].join(":");
87
+ };
88
+ /**
89
+ * 3-way text merge via `git merge-file`. Exit code ≥ 0 is the conflict count;
90
+ * < 0 means git itself failed. Stdout is always the merged text (with conflict
91
+ * markers when count > 0) — callers decide whether to keep it.
92
+ */
93
+ const merge3 = (tmpDir, base, ours, theirs) => new Promise((resolve, reject) => {
94
+ mkdirSync(tmpDir, { recursive: true });
95
+ const files = { ours: join(tmpDir, "ours"), base: join(tmpDir, "base"), theirs: join(tmpDir, "theirs") };
96
+ writeFileSync(files.ours, ours, "utf8");
97
+ writeFileSync(files.base, base, "utf8");
98
+ writeFileSync(files.theirs, theirs, "utf8");
99
+ execFile("git", ["merge-file", "-p", "-L", "current", "-L", "base", "-L", "incoming", files.ours, files.base, files.theirs], { encoding: "utf8", maxBuffer: 4 * MAX_BYTES, env: { ...process.env, PATH: augmentedPath(process.env.PATH) } }, (err, stdout) => {
100
+ const code = err?.code ?? 0;
101
+ if (code < 0 || (err && typeof code !== "number"))
102
+ return reject(err);
103
+ resolve({ text: stdout, conflicts: code });
104
+ });
105
+ });
106
+ /**
107
+ * Fold every side's version into one. Order is roots order (primary first);
108
+ * a side equal to the base loses to a side that changed, and two divergent
109
+ * changes go through git's 3-way merge.
110
+ */
111
+ const resolveKey = async (key, roots, base, tmpDir) => {
112
+ const sides = roots.map((r) => ({ root: r, buf: readMaybe(pathOf(r, key)) }));
113
+ const present = sides.filter((s) => s.buf !== undefined);
114
+ if (present.length === 0)
115
+ return { status: "skip", targets: [], note: "unreadable / too large" };
116
+ const missing = sides.filter((s) => s.buf === undefined);
117
+ // Deletion propagates only when every surviving copy is untouched since the
118
+ // last sync — otherwise the delete loses to a real edit.
119
+ if (base !== undefined && missing.length > 0 && present.every((s) => s.buf.equals(base))) {
120
+ return { status: "delete", targets: present.map((s) => s.root.name) };
121
+ }
122
+ // Binaries (skill assets, images) have no textual merge — propagate only
123
+ // when every present copy is byte-identical.
124
+ if (present.some((s) => !isText(s.buf))) {
125
+ const first = present[0].buf;
126
+ if (!present.every((s) => s.buf.equals(first)))
127
+ return { status: "conflict", targets: [], note: "binary differs" };
128
+ return {
129
+ status: missing.length === 0 ? "same" : "copy",
130
+ targets: missing.map((s) => s.root.name),
131
+ content: first,
132
+ note: "binary",
133
+ };
134
+ }
135
+ const baseText = base !== undefined && isText(base) ? base.toString("utf8") : "";
136
+ let acc = present[0].buf.toString("utf8");
137
+ let conflicted = false;
138
+ for (const s of present.slice(1)) {
139
+ const theirs = s.buf.toString("utf8");
140
+ if (theirs === acc)
141
+ continue;
142
+ if (acc === baseText) {
143
+ acc = theirs;
144
+ continue;
145
+ }
146
+ if (theirs === baseText)
147
+ continue;
148
+ const m = await merge3(tmpDir, baseText, acc, theirs);
149
+ if (m.conflicts > 0) {
150
+ conflicted = true;
151
+ break;
152
+ }
153
+ acc = m.text;
154
+ }
155
+ if (conflicted) {
156
+ return { status: "conflict", targets: [], note: base === undefined ? "无 base 快照,首次同步需人工对齐" : "重叠修改" };
157
+ }
158
+ const stale = sides.filter((s) => s.buf === undefined || s.buf.toString("utf8") !== acc);
159
+ return {
160
+ status: stale.length === 0 ? "same" : present.length === 1 ? "copy" : "merge",
161
+ targets: stale.map((s) => s.root.name),
162
+ content: Buffer.from(acc, "utf8"),
163
+ };
164
+ };
165
+ // ── driver ──────────────────────────────────────────────────────────────
166
+ const ts = () => new Date().toISOString().replace(/[-:]/g, "").replace(/\..+/, "");
167
+ /**
168
+ * Compute (and optionally apply) the sync plan for one project cwd.
169
+ * `apply=false` touches nothing on disk except the scratch merge dir.
170
+ */
171
+ export const syncProjectConfig = async (cwd, apply) => {
172
+ const roots = rootsFor(cwd);
173
+ if (roots.length < 2) {
174
+ return { cwd, roots: roots.map((r) => r.name), applied: false, items: [] };
175
+ }
176
+ const baseDir = baseDirOf(cwd);
177
+ const tmpDir = join(expandHome(CFGSYNC_ROOT), ".tmp");
178
+ const backupDir = join(expandHome(CFGSYNC_ROOT), slugOfCwd(cwd), "backup", ts());
179
+ const byName = new Map(roots.map((r) => [r.name, r]));
180
+ const keys = [...new Set(roots.flatMap(keysOf))].sort();
181
+ const items = [];
182
+ let backedUp = false;
183
+ for (const key of keys) {
184
+ const basePath = join(baseDir, key);
185
+ const res = await resolveKey(key, roots, readMaybe(basePath), tmpDir);
186
+ items.push({ key, status: res.status, targets: res.targets, note: res.note });
187
+ if (!apply)
188
+ continue;
189
+ res.targets.forEach((name) => {
190
+ const root = byName.get(name);
191
+ if (!root)
192
+ return;
193
+ const dest = pathOf(root, key);
194
+ const old = readMaybe(dest);
195
+ if (old !== undefined) {
196
+ writeFile(join(backupDir, name, key), old);
197
+ backedUp = true;
198
+ }
199
+ if (res.status === "delete")
200
+ rmSync(dest, { force: true });
201
+ else if (res.content)
202
+ writeFile(dest, res.content);
203
+ });
204
+ // The base snapshot advances only for keys that actually settled — a
205
+ // conflicting file keeps its old base so it can be re-merged after a fix.
206
+ // It also advances for identical-everywhere files, which is what gives the
207
+ // NEXT divergence a real 3-way base instead of an empty one.
208
+ if (res.status === "delete")
209
+ rmSync(basePath, { force: true });
210
+ else if (res.content)
211
+ writeFile(basePath, res.content);
212
+ }
213
+ return { cwd, roots: roots.map((r) => r.name), applied: apply, items, backupDir: backedUp ? backupDir : undefined };
214
+ };
215
+ // ── rendering ───────────────────────────────────────────────────────────
216
+ const ICON = {
217
+ same: "=",
218
+ copy: "+",
219
+ merge: "⇄",
220
+ conflict: "✗",
221
+ delete: "-",
222
+ skip: "·",
223
+ };
224
+ export const renderSyncReport = (r) => {
225
+ if (r.roots.length < 2) {
226
+ return `[weclaude] /cfgsync: 本项目只发现 ${r.roots.length} 个 CLI 配置树 (${r.roots.join(", ") || "无"}),无需同步。`;
227
+ }
228
+ const changed = r.items.filter((i) => i.status !== "same" && i.status !== "skip");
229
+ const head = `📐 项目配置同步 \`${r.cwd}\`\nCLI: ${r.roots.join(" ⇄ ")}`;
230
+ if (changed.length === 0)
231
+ return `${head}\n\n✅ 全部一致 (${r.items.length} 个文件)`;
232
+ const lines = changed.map((i) => `${ICON[i.status]} \`${i.key}\`${i.targets.length ? ` → ${i.targets.join(",")}` : ""}${i.note ? ` (${i.note})` : ""}`);
233
+ const conflicts = changed.filter((i) => i.status === "conflict").length;
234
+ const tail = r.applied
235
+ ? [`\n✅ 已写入 ${changed.length - conflicts} 项${conflicts ? `,${conflicts} 项冲突已跳过` : ""}`,
236
+ ...(r.backupDir ? [`备份: \`${r.backupDir}\``] : [])]
237
+ : ["\n预演模式,未写入。执行同步: `/cfgsync apply`"];
238
+ return [head, "", ...lines, ...tail].join("\n");
239
+ };
240
+ //# sourceMappingURL=cfg-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cfg-sync.js","sourceRoot":"","sources":["../../daemon/cfg-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { patchJsonc, appendUnique } from "../shared/config-writer.js";
2
+ import { json, readBody } from "./http.js";
3
+ let state;
4
+ const now = () => Date.now();
5
+ const isActive = () => !!state && !state.claimed && state.expiresAt > now();
6
+ /** Returns true iff this message consumed the claim. Caller must skip allowFrom check. */
7
+ export const tryConsumeClaim = (text, principal) => {
8
+ if (!isActive())
9
+ return false;
10
+ if (text.trim() !== state.phrase)
11
+ return false;
12
+ state.claimed = { principal, at: now() };
13
+ return true;
14
+ };
15
+ /** Persist principal as defaultChat + add to allowFrom. Mutates `cfg` in place too. */
16
+ export const persistClaim = (cfg, sourcePath, principal) => {
17
+ cfg.defaultChat = principal;
18
+ if (!cfg.wrc.allowFrom.includes(principal))
19
+ cfg.wrc.allowFrom.push(principal);
20
+ patchJsonc(sourcePath, [{ path: ["defaultChat"], value: principal }]);
21
+ appendUnique(sourcePath, ["wrc", "allowFrom"], principal);
22
+ };
23
+ const principalChatId = (p) => {
24
+ const i = p.indexOf(":");
25
+ return i >= 0 ? p.slice(i + 1) : p;
26
+ };
27
+ export const makeClaimStartHandler = ({ log }) => {
28
+ return async (req, res) => {
29
+ const body = (await readBody(req));
30
+ const phrase = (body.phrase ?? "").trim();
31
+ const ttlSec = Math.max(30, Math.min(body.ttlSec ?? 600, 1800));
32
+ if (!phrase) {
33
+ json(res, 400, { ok: false, error: "phrase required" });
34
+ return;
35
+ }
36
+ state = { phrase, expiresAt: now() + ttlSec * 1000 };
37
+ log.info({ phrase, ttlSec }, "claim mode armed");
38
+ json(res, 200, { ok: true, expiresAt: state.expiresAt });
39
+ };
40
+ };
41
+ export const makeClaimStatusHandler = () => {
42
+ return (_req, res) => {
43
+ if (!state) {
44
+ json(res, 200, { armed: false });
45
+ return;
46
+ }
47
+ json(res, 200, {
48
+ armed: !state.claimed && state.expiresAt > now(),
49
+ expired: !state.claimed && state.expiresAt <= now(),
50
+ claimed: state.claimed ?? null,
51
+ phrase: state.phrase,
52
+ });
53
+ };
54
+ };
55
+ export const makeClaimResetHandler = () => {
56
+ return (_req, res) => {
57
+ state = undefined;
58
+ json(res, 200, { ok: true });
59
+ };
60
+ };
61
+ /** Send a markdown ack to the user that just completed the claim. */
62
+ export const ackClaim = async (client, principal, log) => {
63
+ try {
64
+ await client.sendMessage(principalChatId(principal), {
65
+ msgtype: "markdown",
66
+ markdown: {
67
+ content: "✅ **已设为默认会话**\n\n" +
68
+ "你已被加入 `allowFrom`。接下来 `weclaude init` 会触发一个真实授权演示——留意按钮卡片。",
69
+ },
70
+ });
71
+ }
72
+ catch (e) {
73
+ log.warn({ err: e.message }, "claim ack failed");
74
+ }
75
+ };
76
+ /** Auto-claim: in a fresh install (empty allowFrom) the first DM sender is
77
+ * promoted to super admin without any magic phrase. Group chats are excluded —
78
+ * a randomly-added bot in a group should never auto-promote. */
79
+ export const shouldAutoClaim = (cfg, isDm) => isDm && cfg.wrc.allowFrom.length === 0;
80
+ export const ackAutoClaim = async (client, principal, log) => {
81
+ try {
82
+ await client.sendMessage(principalChatId(principal), {
83
+ msgtype: "markdown",
84
+ markdown: {
85
+ content: "🛡️ **已自动设为超级管理员**\n\n" +
86
+ `首位单聊用户 \`${principal}\` 被写入 \`defaultChat\` 与 \`wrc.allowFrom\`,` +
87
+ "后续无需再手动授权。如要再添加成员,请编辑 `~/.weclaude/config.jsonc`。",
88
+ },
89
+ });
90
+ }
91
+ catch (e) {
92
+ log.warn({ err: e.message }, "auto-claim ack failed");
93
+ }
94
+ };
95
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../daemon/claim.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAgB,MAAM,WAAW,CAAC;AAQzD,IAAI,KAA6B,CAAC;AAElC,MAAM,GAAG,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACrC,MAAM,QAAQ,GAAG,GAAY,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;AAErF,0FAA0F;AAC1F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,SAAiB,EAAW,EAAE;IAC1E,IAAI,CAAC,QAAQ,EAAE;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,KAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChD,KAAM,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,uFAAuF;AACvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,UAAkB,EAAE,SAAiB,EAAQ,EAAE;IACvF,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9E,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACtE,YAAY,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,CAAS,EAAU,EAAE;IAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAE,GAAG,EAAqB,EAAW,EAAE;IAC3E,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAgD,CAAC;QAClF,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAY,EAAE;IAClD,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACnB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACb,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE;YAChD,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE;YACnD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAY,EAAE;IACjD,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACnB,KAAK,GAAG,SAAS,CAAC;QAClB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,MAAgB,EAChB,SAAiB,EACjB,GAAW,EACI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;YACnD,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE;gBACR,OAAO,EACL,mBAAmB;oBACnB,4DAA4D;aAC/D;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAG,CAAW,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC;AAEF;;gEAEgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,IAAa,EAAW,EAAE,CACrE,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,MAAgB,EAChB,SAAiB,EACjB,GAAW,EACI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;YACnD,OAAO,EAAE,UAAU;YACnB,QAAQ,EAAE;gBACR,OAAO,EACL,wBAAwB;oBACxB,YAAY,SAAS,6CAA6C;oBAClE,mDAAmD;aACtD;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAG,CAAW,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACnE,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,153 @@
1
+ import { resolvePublicHost } from "../shared/lan-ip.js";
2
+ import { createDetailStore, } from "../shared/detail-store.js";
3
+ import { renderDetailPage, renderNotFound } from "../shared/detail-render.js";
4
+ import { createChatRoutes, chatRouteTable, CHAT_ROUTE_KEYS } from "../shared/chat-http.js";
5
+ let store = null;
6
+ let remoteBase = "";
7
+ let remoteToken = "";
8
+ // 转发失败静默 — 远端 svr 挂了不该拖垮本地工具调用。
9
+ const forwardToRemote = (rec) => {
10
+ if (!remoteBase)
11
+ return;
12
+ const url = `${remoteBase.replace(/\/+$/, "")}/d`;
13
+ const body = JSON.stringify(rec);
14
+ const headers = { "content-type": "application/json" };
15
+ if (remoteToken)
16
+ headers.authorization = `Bearer ${remoteToken}`;
17
+ fetch(url, { method: "POST", headers, body }).catch(() => { });
18
+ };
19
+ export const initDetailPersistence = (stateDir, log) => {
20
+ store = createDetailStore({ stateDir, log });
21
+ };
22
+ export const configureRemoteForward = (base, token) => {
23
+ remoteBase = base.trim();
24
+ remoteToken = token.trim();
25
+ };
26
+ // Decision (pending.ts) 是 4 项;detail 层扩了 timeout/swept 两个终态。
27
+ const toApprovalDecision = (d) => d;
28
+ export const recordTool = (rec) => {
29
+ if (!store)
30
+ return;
31
+ store.recordTool(rec);
32
+ const full = store.get(rec.id);
33
+ if (full)
34
+ forwardToRemote(full);
35
+ };
36
+ export const recordToolResult = (toolUseId, full) => {
37
+ if (!store)
38
+ return;
39
+ store.recordToolResult(toolUseId, full);
40
+ const rec = store.get(toolUseId);
41
+ if (rec)
42
+ forwardToRemote(rec);
43
+ };
44
+ export const recordApproval = (rec) => {
45
+ if (!store)
46
+ return;
47
+ store.recordApproval(rec);
48
+ const full = store.get(rec.id);
49
+ if (full)
50
+ forwardToRemote(full);
51
+ };
52
+ export const recordApprovalDecision = (reqId, decision, decidedBy) => {
53
+ if (!store)
54
+ return;
55
+ store.recordApprovalDecision(reqId, toApprovalDecision(decision), decidedBy);
56
+ const rec = store.get(reqId);
57
+ if (rec)
58
+ forwardToRemote(rec);
59
+ };
60
+ // Brief 模式聚合详情: 一个 turn 的时间线。startTurn 建空壳,item 增量 append,close 收尾。
61
+ // 每次变更都完整重推整条 record 给 remote svr — svr 侧存的是 last-write-wins 快照。
62
+ export const recordTurnStart = (rec) => {
63
+ if (!store)
64
+ return;
65
+ store.startTurn(rec);
66
+ const full = store.get(rec.id);
67
+ if (full)
68
+ forwardToRemote(full);
69
+ };
70
+ export const recordTurnItem = (id, item) => {
71
+ if (!store)
72
+ return;
73
+ store.appendTurnItem(id, item);
74
+ const full = store.get(id);
75
+ if (full)
76
+ forwardToRemote(full);
77
+ };
78
+ export const recordTurnUsage = (id, delta) => {
79
+ if (!store)
80
+ return;
81
+ store.addTurnUsage(id, delta);
82
+ const full = store.get(id);
83
+ if (full)
84
+ forwardToRemote(full);
85
+ };
86
+ export const recordTurnClose = (id) => {
87
+ if (!store)
88
+ return;
89
+ store.closeTurn(id);
90
+ const full = store.get(id);
91
+ if (full)
92
+ forwardToRemote(full);
93
+ };
94
+ // 收尾此前遗留未关闭的 turn (按 target + sessionId 限定, 排除仍在收尾的当前 turn)。
95
+ export const recordCloseOpenTurns = (scope) => {
96
+ if (!store)
97
+ return;
98
+ for (const id of store.closeOpenTurns(scope)) {
99
+ const full = store.get(id);
100
+ if (full)
101
+ forwardToRemote(full);
102
+ }
103
+ };
104
+ export const getDetail = (id) => store?.get(id);
105
+ // URL 优先级: publicBase (反代/自定义 host) > remoteBase (chat 端直连 svr)
106
+ // > fallback host+port (回环 → LAN IP 替换)。
107
+ // forceInnerBrowser=1 / ww_vw / ww_vh: WeCom 桌面端识别参数, 让链接在内置浏览器打开。
108
+ const detailRoot = (publicBase, fallbackHost, fallbackPort) => publicBase && publicBase.length > 0
109
+ ? publicBase.replace(/\/+$/, "")
110
+ : remoteBase && remoteBase.length > 0
111
+ ? remoteBase.replace(/\/+$/, "")
112
+ : `http://${resolvePublicHost(fallbackHost)}:${fallbackPort}`;
113
+ const detailParams = (id) => new URLSearchParams({ id, forceInnerBrowser: "1", ww_vw: "1000", ww_vh: "800" }).toString();
114
+ export const buildDetailUrl = (publicBase, fallbackHost, fallbackPort, id) => `${detailRoot(publicBase, fallbackHost, fallbackPort)}/detail?${detailParams(id)}`;
115
+ // Chat 视图入口。id 仍是那条 turn 记录 —— 它既是凭据, 也决定默认选中哪个 #tag。
116
+ export const buildChatUrl = (publicBase, fallbackHost, fallbackPort, id) => `${detailRoot(publicBase, fallbackHost, fallbackPort)}/chat?${detailParams(id)}`;
117
+ // Chat 视图路由 (页面 + JSON API + SSE)。store 未初始化时全部 503 —— 只可能发生在
118
+ // initDetailPersistence 之前, 正常启动路径不会命中。
119
+ export const chatHandlers = () => {
120
+ const routes = store ? chatRouteTable(createChatRoutes(store)) : {};
121
+ const unavailable = (_req, res) => {
122
+ res.statusCode = 503;
123
+ res.end("detail store not ready");
124
+ };
125
+ return Object.fromEntries(CHAT_ROUTE_KEYS.map((key) => {
126
+ const h = routes[key];
127
+ return [key, h ? ((req, res, url) => h(req, res, url)) : unavailable];
128
+ }));
129
+ };
130
+ export const makeDetailHandler = (log) => {
131
+ return (_req, res, url) => {
132
+ const id = url.searchParams.get("id") ?? "";
133
+ if (!id) {
134
+ res.statusCode = 400;
135
+ res.setHeader("content-type", "text/plain; charset=utf-8");
136
+ res.end("missing ?id=");
137
+ return;
138
+ }
139
+ const rec = getDetail(id);
140
+ if (!rec) {
141
+ res.statusCode = 404;
142
+ res.setHeader("content-type", "text/html; charset=utf-8");
143
+ res.end(renderNotFound(id));
144
+ log.info({ id }, "detail not found");
145
+ return;
146
+ }
147
+ res.statusCode = 200;
148
+ res.setHeader("content-type", "text/html; charset=utf-8");
149
+ res.setHeader("cache-control", "no-store");
150
+ res.end(renderDetailPage(rec));
151
+ };
152
+ };
153
+ //# sourceMappingURL=detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail.js","sourceRoot":"","sources":["../../daemon/detail.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,iBAAiB,GASlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI3F,IAAI,KAAK,GAAuB,IAAI,CAAC;AACrC,IAAI,UAAU,GAAG,EAAE,CAAC;AACpB,IAAI,WAAW,GAAG,EAAE,CAAC;AAErB,gCAAgC;AAChC,MAAM,eAAe,GAAG,CAAC,GAAiB,EAAQ,EAAE;IAClD,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,WAAW;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,WAAW,EAAE,CAAC;IACjE,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAgB,CAAC,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAE,GAAY,EAAQ,EAAE;IAC5E,KAAK,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAQ,EAAE;IAC1E,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,kBAAkB,GAAG,CAAC,CAAiC,EAAoB,EAAE,CAAC,CAAC,CAAC;AAEtF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAA0E,EAAQ,EAAE;IAC7G,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,IAAY,EAAQ,EAAE;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,GAAG;QAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,GAAuH,EACjH,EAAE;IACR,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAAa,EACb,QAAwC,EACxC,SAAkB,EACZ,EAAE;IACR,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,GAAG;QAAE,eAAe,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,oEAAoE;AACpE,iEAAiE;AACjE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,GAA6G,EACvG,EAAE;IACR,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAU,EAAE,IAAc,EAAQ,EAAE;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAE,KAA+D,EAAQ,EAAE;IACnH,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAQ,EAAE;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,eAAe,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAA6E,EAAQ,EAAE;IAC1H,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,IAAI;YAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAA4B,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAElF,gEAAgE;AAChE,yCAAyC;AACzC,mEAAmE;AACnE,MAAM,UAAU,GAAG,CAAC,UAAkB,EAAE,YAAoB,EAAE,YAAoB,EAAU,EAAE,CAC5F,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;IACjC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAChC,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QACnC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAChC,CAAC,CAAC,UAAU,iBAAiB,CAAC,YAAY,CAAC,IAAI,YAAY,EAAE,CAAC;AAEpE,MAAM,YAAY,GAAG,CAAC,EAAU,EAAU,EAAE,CAC1C,IAAI,eAAe,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE9F,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,UAAkB,EAClB,YAAoB,EACpB,YAAoB,EACpB,EAAU,EACF,EAAE,CAAC,GAAG,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,WAAW,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;AAEhG,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,UAAkB,EAClB,YAAoB,EACpB,YAAoB,EACpB,EAAU,EACF,EAAE,CAAC,GAAG,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,SAAS,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;AAE9F,8DAA8D;AAC9D,wCAAwC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,GAA4B,EAAE;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,WAAW,GAAY,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,OAAO,MAAM,CAAC,WAAW,CACvB,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACnF,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAW,EAAE;IACxD,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAC1D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAC1D,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC,CAAC"}