@claudexor/cli 1.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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/args.d.ts +12 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +88 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/attachment-resolver.d.ts +11 -0
  8. package/dist/attachment-resolver.d.ts.map +1 -0
  9. package/dist/attachment-resolver.js +61 -0
  10. package/dist/attachment-resolver.js.map +1 -0
  11. package/dist/capabilities.d.ts +13 -0
  12. package/dist/capabilities.d.ts.map +1 -0
  13. package/dist/capabilities.js +90 -0
  14. package/dist/capabilities.js.map +1 -0
  15. package/dist/claudexord.d.ts +3 -0
  16. package/dist/claudexord.d.ts.map +1 -0
  17. package/dist/claudexord.js +564 -0
  18. package/dist/claudexord.js.map +1 -0
  19. package/dist/cli-io.d.ts +28 -0
  20. package/dist/cli-io.d.ts.map +1 -0
  21. package/dist/cli-io.js +37 -0
  22. package/dist/cli-io.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +1459 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/command-registry.d.ts +105 -0
  28. package/dist/command-registry.d.ts.map +1 -0
  29. package/dist/command-registry.js +516 -0
  30. package/dist/command-registry.js.map +1 -0
  31. package/dist/daemon-lifecycle.d.ts +18 -0
  32. package/dist/daemon-lifecycle.d.ts.map +1 -0
  33. package/dist/daemon-lifecycle.js +62 -0
  34. package/dist/daemon-lifecycle.js.map +1 -0
  35. package/dist/daemon-run.d.ts +86 -0
  36. package/dist/daemon-run.d.ts.map +1 -0
  37. package/dist/daemon-run.js +269 -0
  38. package/dist/daemon-run.js.map +1 -0
  39. package/dist/decision.d.ts +18 -0
  40. package/dist/decision.d.ts.map +1 -0
  41. package/dist/decision.js +46 -0
  42. package/dist/decision.js.map +1 -0
  43. package/dist/live.d.ts +26 -0
  44. package/dist/live.d.ts.map +1 -0
  45. package/dist/live.js +311 -0
  46. package/dist/live.js.map +1 -0
  47. package/dist/mcp-runner.d.ts +41 -0
  48. package/dist/mcp-runner.d.ts.map +1 -0
  49. package/dist/mcp-runner.js +306 -0
  50. package/dist/mcp-runner.js.map +1 -0
  51. package/dist/ops-commands.d.ts +11 -0
  52. package/dist/ops-commands.d.ts.map +1 -0
  53. package/dist/ops-commands.js +358 -0
  54. package/dist/ops-commands.js.map +1 -0
  55. package/dist/orchestrate-options.d.ts +9 -0
  56. package/dist/orchestrate-options.d.ts.map +1 -0
  57. package/dist/orchestrate-options.js +16 -0
  58. package/dist/orchestrate-options.js.map +1 -0
  59. package/dist/orphan-reaper.d.ts +9 -0
  60. package/dist/orphan-reaper.d.ts.map +1 -0
  61. package/dist/orphan-reaper.js +97 -0
  62. package/dist/orphan-reaper.js.map +1 -0
  63. package/dist/orphan-sweeper.d.ts +7 -0
  64. package/dist/orphan-sweeper.d.ts.map +1 -0
  65. package/dist/orphan-sweeper.js +289 -0
  66. package/dist/orphan-sweeper.js.map +1 -0
  67. package/dist/plugins.d.ts +44 -0
  68. package/dist/plugins.d.ts.map +1 -0
  69. package/dist/plugins.js +1383 -0
  70. package/dist/plugins.js.map +1 -0
  71. package/dist/primary-output.d.ts +14 -0
  72. package/dist/primary-output.d.ts.map +1 -0
  73. package/dist/primary-output.js +34 -0
  74. package/dist/primary-output.js.map +1 -0
  75. package/dist/registry.d.ts +26 -0
  76. package/dist/registry.d.ts.map +1 -0
  77. package/dist/registry.js +71 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/release.d.ts +14 -0
  80. package/dist/release.d.ts.map +1 -0
  81. package/dist/release.js +49 -0
  82. package/dist/release.js.map +1 -0
  83. package/dist/repl.d.ts +26 -0
  84. package/dist/repl.d.ts.map +1 -0
  85. package/dist/repl.js +277 -0
  86. package/dist/repl.js.map +1 -0
  87. package/dist/review-command.d.ts +3 -0
  88. package/dist/review-command.d.ts.map +1 -0
  89. package/dist/review-command.js +83 -0
  90. package/dist/review-command.js.map +1 -0
  91. package/dist/reviewer-options.d.ts +18 -0
  92. package/dist/reviewer-options.d.ts.map +1 -0
  93. package/dist/reviewer-options.js +110 -0
  94. package/dist/reviewer-options.js.map +1 -0
  95. package/dist/run-options.d.ts +8 -0
  96. package/dist/run-options.d.ts.map +1 -0
  97. package/dist/run-options.js +50 -0
  98. package/dist/run-options.js.map +1 -0
  99. package/dist/run-secret-scan.d.ts +2 -0
  100. package/dist/run-secret-scan.d.ts.map +1 -0
  101. package/dist/run-secret-scan.js +5 -0
  102. package/dist/run-secret-scan.js.map +1 -0
  103. package/dist/settings-command.d.ts +3 -0
  104. package/dist/settings-command.d.ts.map +1 -0
  105. package/dist/settings-command.js +202 -0
  106. package/dist/settings-command.js.map +1 -0
  107. package/dist/settings-display.d.ts +3 -0
  108. package/dist/settings-display.d.ts.map +1 -0
  109. package/dist/settings-display.js +33 -0
  110. package/dist/settings-display.js.map +1 -0
  111. package/dist/settings-service.d.ts +15 -0
  112. package/dist/settings-service.d.ts.map +1 -0
  113. package/dist/settings-service.js +91 -0
  114. package/dist/settings-service.js.map +1 -0
  115. package/dist/setup-jobs.d.ts +28 -0
  116. package/dist/setup-jobs.d.ts.map +1 -0
  117. package/dist/setup-jobs.js +477 -0
  118. package/dist/setup-jobs.js.map +1 -0
  119. package/dist/spec.d.ts +84 -0
  120. package/dist/spec.d.ts.map +1 -0
  121. package/dist/spec.js +438 -0
  122. package/dist/spec.js.map +1 -0
  123. package/dist/trust-command.d.ts +3 -0
  124. package/dist/trust-command.d.ts.map +1 -0
  125. package/dist/trust-command.js +80 -0
  126. package/dist/trust-command.js.map +1 -0
  127. package/dist/trust-services.d.ts +7 -0
  128. package/dist/trust-services.d.ts.map +1 -0
  129. package/dist/trust-services.js +35 -0
  130. package/dist/trust-services.js.map +1 -0
  131. package/package.json +59 -0
@@ -0,0 +1,358 @@
1
+ /**
2
+ * Operational commands: daemon lifecycle, auth status/login hints, and the
3
+ * managed secret store. Thin surfaces — every action delegates to the daemon
4
+ * client, gateway, or SecretStore; --json purity via cli-io.
5
+ */
6
+ import { spawn } from "node:child_process";
7
+ import { closeSync, mkdirSync, openSync, readFileSync } from "node:fs";
8
+ import { dirname } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ import { DaemonClient, defaultSocketPath, logPath, readToken, rotateToken } from "@claudexor/daemon";
11
+ import { harnessRuntimeEnv } from "@claudexor/core";
12
+ import { MANAGED_SECRET_NAMES, SecretStore, isManagedSecretName } from "@claudexor/secrets";
13
+ import { flagBool, flagStr } from "./args.js";
14
+ import { authSourceAvailability, checksSummary, print, printJson, printUsageError, statusGlyph } from "./cli-io.js";
15
+ import { buildGateway, buildRegistry, harnessModels } from "./registry.js";
16
+ import { nativeLoginCommand } from "./setup-jobs.js";
17
+ import { waitForDaemonReady } from "./daemon-run.js";
18
+ export async function daemonCommand(args, json) {
19
+ const sub = args._[1] ?? "status";
20
+ if (sub === "start") {
21
+ // Probe FIRST: with a live daemon the spawned child dies on the singleton
22
+ // guard while readiness connects to the OLD daemon — reporting the DEAD
23
+ // child's pid (the duplicate-start pid lie). "Already running" holds the
24
+ // SAME readiness bar as a fresh start (socket health AND control API),
25
+ // so a socket-alive daemon with a dead control API is not reported ready.
26
+ const existingToken = readToken();
27
+ if (existingToken) {
28
+ try {
29
+ await new DaemonClient(defaultSocketPath(), existingToken).health();
30
+ // Same bar as a fresh start; shorter window is fine — an ALREADY
31
+ // healthy daemon answers immediately (a fresh start waits out boot).
32
+ const existingReady = await waitForDaemonReady(5_000);
33
+ if (existingReady) {
34
+ if (json)
35
+ printJson({ pid: null, socket: defaultSocketPath(), ready: true, alreadyRunning: true });
36
+ else
37
+ print(`claudexord already running; socket ${defaultSocketPath()}`);
38
+ return 0;
39
+ }
40
+ // Socket answers but the control API never came up — fall through and
41
+ // report the honest failure the same way a fresh start would.
42
+ if (json)
43
+ printJson({ pid: null, socket: defaultSocketPath(), ready: false, alreadyRunning: true });
44
+ else
45
+ print("claudexord socket is alive but its control API is not ready; inspect `claudexor daemon logs`");
46
+ return 1;
47
+ }
48
+ catch {
49
+ /* not reachable — start a fresh daemon below */
50
+ }
51
+ }
52
+ const daemonScript = fileURLToPath(new URL("./claudexord.js", import.meta.url));
53
+ // Startup stderr goes to the daemon log (append), not the void — a crash
54
+ // before the daemon's own logging starts must leave evidence for
55
+ // `claudexor daemon logs`.
56
+ mkdirSync(dirname(logPath()), { recursive: true });
57
+ const stderrFd = openSync(logPath(), "a");
58
+ const child = spawn(process.execPath, [daemonScript], {
59
+ detached: true,
60
+ stdio: ["ignore", "ignore", stderrFd],
61
+ env: harnessRuntimeEnv(),
62
+ });
63
+ child.unref();
64
+ closeSync(stderrFd);
65
+ // Block until the daemon (socket + control API) is actually ready, so a
66
+ // follow-up `status`/run can't race the spawn. Fail loudly (exit 1) if it
67
+ // never comes up.
68
+ const ready = await waitForDaemonReady(15_000);
69
+ if (json) {
70
+ printJson({ pid: child.pid ?? null, socket: defaultSocketPath(), ready: ready !== null });
71
+ }
72
+ else if (ready) {
73
+ print(`claudexord ready (pid ${child.pid}); socket ${defaultSocketPath()}`);
74
+ }
75
+ else {
76
+ print(`claudexord started (pid ${child.pid}) but did not become ready within 15s; check \`claudexor daemon logs\``);
77
+ }
78
+ return ready ? 0 : 1;
79
+ }
80
+ const token = readToken();
81
+ if (!token) {
82
+ // --json purity: exactly one JSON object on stdout in json mode.
83
+ if (json)
84
+ printJson({ ok: false, error: "daemon not initialized — run: claudexor daemon start" });
85
+ else
86
+ print("daemon not initialized — run: claudexor daemon start");
87
+ return 1;
88
+ }
89
+ const client = new DaemonClient(defaultSocketPath(), token);
90
+ try {
91
+ if (sub === "status") {
92
+ const health = await client.health();
93
+ if (json)
94
+ printJson(health);
95
+ else
96
+ print(`claudexord: ${JSON.stringify(health)}`);
97
+ return 0;
98
+ }
99
+ if (sub === "stop") {
100
+ await client.shutdown();
101
+ if (json)
102
+ printJson({ ok: true, stopping: true });
103
+ else
104
+ print("claudexord shutting down");
105
+ return 0;
106
+ }
107
+ if (sub === "logs") {
108
+ // A missing/unreadable log FILE is not a daemon-reachability problem —
109
+ // report it as what it is instead of the catch-all "not reachable".
110
+ let tail;
111
+ try {
112
+ tail = readFileSync(logPath(), "utf8").split("\n").slice(-40).join("\n");
113
+ }
114
+ catch (err) {
115
+ const message = `no daemon log at ${logPath()} (${err instanceof Error ? err.message : String(err)}); the daemon may not have started on this machine yet`;
116
+ if (json)
117
+ printJson({ ok: false, error: message });
118
+ else
119
+ process.stderr.write(`${message}\n`);
120
+ return 1;
121
+ }
122
+ if (json)
123
+ printJson({ ok: true, log_tail: tail });
124
+ else
125
+ print(tail);
126
+ return 0;
127
+ }
128
+ if (sub === "rotate-token") {
129
+ // Rotating under a LIVE daemon would strand it: the daemon keeps the old
130
+ // in-memory token while stop/status would read the new one from disk.
131
+ try {
132
+ await client.health();
133
+ const err = "daemon is running; stop it first (claudexor daemon stop), then rotate";
134
+ if (json)
135
+ printJson({ ok: false, error: err });
136
+ else
137
+ process.stderr.write(`${err}\n`);
138
+ return 1;
139
+ }
140
+ catch {
141
+ /* not reachable — safe to rotate */
142
+ }
143
+ rotateToken();
144
+ const note = "token rotated; it takes effect on the next daemon start";
145
+ if (json)
146
+ printJson({ ok: true, rotated: true, note });
147
+ else
148
+ print(note);
149
+ return 0;
150
+ }
151
+ if (json)
152
+ printJson({ ok: false, exitCode: 2, error: "usage: claudexor daemon start|status|stop|logs|rotate-token" });
153
+ else
154
+ print("usage: claudexor daemon start|status|stop|logs|rotate-token");
155
+ return 2;
156
+ }
157
+ catch (err) {
158
+ const message = `claudexord not reachable (${err instanceof Error ? err.message : String(err)})`;
159
+ if (json)
160
+ printJson({ ok: false, error: message });
161
+ else
162
+ print(message);
163
+ return 1;
164
+ }
165
+ }
166
+ /**
167
+ * The real CONSUMER (ADP4) of the adapter models() producer: list a harness's
168
+ * enumerable models. With --harness it queries that one; otherwise it tries
169
+ * every non-unavailable harness and shows which can honestly enumerate.
170
+ */
171
+ export async function modelsCommand(args, json) {
172
+ // `--all` includes fakes (they honestly report source:"none"); honoring it here
173
+ // mirrors doctor/auth/harness-list instead of silently ignoring the flag (P15).
174
+ const includeFakes = flagBool(args, "all");
175
+ const only = flagStr(args, "harness");
176
+ let ids;
177
+ if (only) {
178
+ ids = only
179
+ .split(",")
180
+ .map((s) => s.trim())
181
+ .filter(Boolean);
182
+ // An explicit --harness typo fails loudly (consistent with doctor/auth), not a
183
+ // silent source:"none" exit 0.
184
+ const known = new Set(buildRegistry({ includeFakes: true }).keys());
185
+ const unknown = ids.filter((id) => !known.has(id));
186
+ if (unknown.length)
187
+ return printUsageError(json, `claudexor: unknown harness(es): ${unknown.join(", ")} (run \`claudexor harness list --all\`)`);
188
+ }
189
+ else {
190
+ // Default to harnesses that doctor considers usable (not unavailable);
191
+ // each harnessModels() reports source "none" when it cannot enumerate.
192
+ const statuses = await buildGateway({ includeFakes }).statusAll({ cwd: process.cwd() });
193
+ ids = statuses.filter((s) => s.status !== "unavailable").map((s) => s.id);
194
+ }
195
+ const results = await Promise.all(ids.map((id) => harnessModels(id, process.cwd(), includeFakes)));
196
+ if (json) {
197
+ printJson({ harnesses: results });
198
+ return 0;
199
+ }
200
+ for (const r of results) {
201
+ if (r.source === "none") {
202
+ print(`${r.harnessId}: no model enumeration (adapter cannot list models)`);
203
+ continue;
204
+ }
205
+ print(`${r.harnessId}: ${r.models.length} model(s) [source=${r.source}]`);
206
+ for (const m of r.models) {
207
+ const ctx = m.context_window ? ` (${m.context_window} ctx)` : "";
208
+ const label = m.label && m.label !== m.id ? ` — ${m.label}` : "";
209
+ print(` ${m.id}${label}${ctx}`);
210
+ }
211
+ }
212
+ return 0;
213
+ }
214
+ export async function authCommand(args, json) {
215
+ const sub = args._[1] ?? "status";
216
+ const harness = args._[2];
217
+ if (sub === "status") {
218
+ const gateway = buildGateway({ includeFakes: flagBool(args, "all") });
219
+ // Scope discovery to the requested harness (P14) instead of probe-all-then-filter.
220
+ const statuses = await gateway.statusAll({ cwd: process.cwd() }, harness ? [harness] : undefined);
221
+ // An explicit unknown harness must FAIL LOUDLY, not silently succeed over empty.
222
+ if (harness && !statuses.some((s) => s.id === harness)) {
223
+ return printUsageError(json, `claudexor: unknown harness '${harness}' (run \`claudexor harness list --all\`)`);
224
+ }
225
+ const filtered = statuses;
226
+ if (json) {
227
+ printJson({ harnesses: filtered });
228
+ return 0;
229
+ }
230
+ for (const s of filtered) {
231
+ print(`${statusGlyph(s.status)} ${s.id} ready=${s.status} sources=${authSourceAvailability(s)}`);
232
+ print(` checks: ${checksSummary(s)}`);
233
+ if (s.reasons.length)
234
+ print(` reasons: ${s.reasons.join(", ")}`);
235
+ }
236
+ return 0;
237
+ }
238
+ if (sub === "login") {
239
+ if (!harness) {
240
+ return printUsageError(json, "usage: claudexor auth login <codex|claude|cursor|opencode>");
241
+ }
242
+ // On a real terminal, RUN the native login flow instead of only hinting at
243
+ // it: inherited stdio hands the TTY to the vendor CLI (device-code /
244
+ // browser prompts work), and its exit code is the verb's exit code.
245
+ // Non-TTY and --json callers keep the hint (no interactive flow to run).
246
+ const native = nativeLoginCommand(harness);
247
+ if (!json && process.stdin.isTTY && native) {
248
+ print(`launching native login: ${native}`);
249
+ return await new Promise((resolve) => {
250
+ const child = spawn("sh", ["-c", native], { stdio: "inherit", env: harnessRuntimeEnv() });
251
+ child.on("error", (err) => {
252
+ print(`could not launch native login (${err.message}); run it yourself: ${native}`);
253
+ resolve(1);
254
+ });
255
+ child.on("exit", (code) => resolve(code ?? 1));
256
+ });
257
+ }
258
+ const hints = {
259
+ codex: "Run the native Codex login flow, or store an API key ref with: claudexor secrets set openai --from-env OPENAI_API_KEY",
260
+ claude: "Run the native Claude Code login flow, or store an API key ref with: claudexor secrets set anthropic --from-env ANTHROPIC_API_KEY",
261
+ cursor: "Sign in through Cursor, then let Claudexor mirror the native session.",
262
+ opencode: "Run the native OpenCode auth flow, or store the provider key as a secret ref.",
263
+ };
264
+ const hint = hints[harness] ?? `Run the native ${harness} auth flow, then retry: claudexor auth status ${harness}`;
265
+ if (json)
266
+ printJson({ ok: true, harness, hint });
267
+ else
268
+ print(hint);
269
+ return 0;
270
+ }
271
+ return printUsageError(json, "usage: claudexor auth status|login");
272
+ }
273
+ async function stdinText() {
274
+ const chunks = [];
275
+ for await (const chunk of process.stdin)
276
+ chunks.push(chunk);
277
+ return Buffer.concat(chunks).toString("utf8").trim();
278
+ }
279
+ export async function secretsCommand(args, json) {
280
+ const sub = args._[1] ?? "list";
281
+ // `--backend file` (or env CLAUDEXOR_SECRETS_BACKEND=file) keeps secret I/O in
282
+ // the 0600 file store — sandbox/CI safe (never touches the real login Keychain).
283
+ const backendFlag = flagStr(args, "backend");
284
+ if (backendFlag !== undefined &&
285
+ backendFlag !== "auto" &&
286
+ backendFlag !== "keychain" &&
287
+ backendFlag !== "file") {
288
+ return printUsageError(json, "--backend must be auto|keychain|file");
289
+ }
290
+ let store;
291
+ try {
292
+ store = new SecretStore(backendFlag ?? "auto");
293
+ // Surface an invalid CLAUDEXOR_SECRETS_BACKEND now, honoring --json, instead of
294
+ // letting the throw escape to the plain-text top-level catch.
295
+ store.resolvedBackend();
296
+ }
297
+ catch (err) {
298
+ const msg = `claudexor secrets: ${err instanceof Error ? err.message : String(err)}`;
299
+ if (json)
300
+ printJson({ error: msg });
301
+ else
302
+ process.stderr.write(`${msg}\n`);
303
+ return 1;
304
+ }
305
+ if (sub === "list") {
306
+ const secrets = store.list();
307
+ if (json)
308
+ printJson({ backend: store.resolvedBackend(), secrets });
309
+ else {
310
+ if (secrets.length === 0)
311
+ print(`no stored secrets (${store.resolvedBackend()})`);
312
+ for (const s of secrets)
313
+ print(`${s.name} [${s.backend}]`);
314
+ }
315
+ return 0;
316
+ }
317
+ if (sub === "set") {
318
+ const name = args._[2];
319
+ if (!name) {
320
+ return printUsageError(json, "usage: claudexor secrets set <name> --from-env <ENV_VAR> # or pipe value on stdin");
321
+ }
322
+ if (!isManagedSecretName(name)) {
323
+ return printUsageError(json, `secret name must be one of: ${MANAGED_SECRET_NAMES.join(", ")}`);
324
+ }
325
+ const envVar = flagStr(args, "from-env");
326
+ const value = envVar ? process.env[envVar] : process.stdin.isTTY ? "" : await stdinText();
327
+ if (!value) {
328
+ return printUsageError(json, "secret value required via --from-env or stdin; values are not accepted as positional args");
329
+ }
330
+ const backend = store.set(name, value);
331
+ const warning = store.lastFallbackReason;
332
+ if (json)
333
+ printJson({ name, backend, stored: true, ...(warning ? { warning } : {}) });
334
+ else {
335
+ print(`stored ${name} in ${backend}`);
336
+ if (warning)
337
+ print(`warning: ${warning}`);
338
+ }
339
+ return 0;
340
+ }
341
+ if (sub === "delete" || sub === "rm") {
342
+ const name = args._[2];
343
+ if (!name) {
344
+ return printUsageError(json, "usage: claudexor secrets delete <name>");
345
+ }
346
+ if (!isManagedSecretName(name)) {
347
+ return printUsageError(json, `secret name must be one of: ${MANAGED_SECRET_NAMES.join(", ")}`);
348
+ }
349
+ store.delete(name);
350
+ if (json)
351
+ printJson({ name, deleted: true });
352
+ else
353
+ print(`deleted ${name}`);
354
+ return 0;
355
+ }
356
+ return printUsageError(json, "usage: claudexor secrets list|set|delete");
357
+ }
358
+ //# sourceMappingURL=ops-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops-commands.js","sourceRoot":"","sources":["../src/ops-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAsB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAmB,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB,EAAE,IAAa;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAClC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,0EAA0E;QAC1E,wEAAwE;QACxE,yEAAyE;QACzE,uEAAuE;QACvE,0EAA0E;QAC1E,MAAM,aAAa,GAAG,SAAS,EAAE,CAAC;QAClC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC;gBACpE,iEAAiE;gBACjE,qEAAqE;gBACrE,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACtD,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,IAAI;wBAAE,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;;wBAC9F,KAAK,CAAC,sCAAsC,iBAAiB,EAAE,EAAE,CAAC,CAAC;oBACxE,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,sEAAsE;gBACtE,8DAA8D;gBAC9D,IAAI,IAAI;oBAAE,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;;oBAC/F,KAAK,CAAC,8FAA8F,CAAC,CAAC;gBAC3G,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;QACH,CAAC;QACD,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,yEAAyE;QACzE,iEAAiE;QACjE,2BAA2B;QAC3B,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE;YACpD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;YACrC,GAAG,EAAE,iBAAiB,EAAE;SACzB,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpB,wEAAwE;QACxE,0EAA0E;QAC1E,kBAAkB;QAClB,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YACjB,KAAK,CAAC,yBAAyB,KAAK,CAAC,GAAG,aAAa,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,KAAK,CACH,2BAA2B,KAAK,CAAC,GAAG,wEAAwE,CAC7G,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,iEAAiE;QACjE,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC,CAAC;;YAC7F,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACnE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,IAAI;gBAAE,SAAS,CAAC,MAAM,CAAC,CAAC;;gBACvB,KAAK,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;gBAC7C,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,uEAAuE;YACvE,oEAAoE;YACpE,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,oBAAoB,OAAO,EAAE,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,wDAAwD,CAAC;gBAC3J,IAAI,IAAI;oBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;;oBAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;gBAC1C,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;gBAC7C,KAAK,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,yEAAyE;YACzE,sEAAsE;YACtE,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,uEAAuE,CAAC;gBACpF,IAAI,IAAI;oBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;oBAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;gBACtC,OAAO,CAAC,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;YACD,WAAW,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,yDAAyD,CAAC;YACvE,IAAI,IAAI;gBAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;;gBAClD,KAAK,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC,CAAC;;YACjH,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC1E,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QACjG,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;;YAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAGD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB,EAAE,IAAa;IACjE,gFAAgF;IAChF,gFAAgF;IAChF,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtC,IAAI,GAAa,CAAC;IAClB,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,GAAG,IAAI;aACP,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,+EAA+E;QAC/E,+BAA+B;QAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,MAAM;YAChB,OAAO,eAAe,CACpB,IAAI,EACJ,mCAAmC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yCAAyC,CAC/F,CAAC;IACN,CAAC;SAAM,CAAC;QACN,uEAAuE;QACvE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxF,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC,CAChE,CAAC;IACF,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,qDAAqD,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB,EAAE,IAAa;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,mFAAmF;QACnF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CACtC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EACtB,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAChC,CAAC;QACF,iFAAiF;QACjF,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;YACvD,OAAO,eAAe,CACpB,IAAI,EACJ,+BAA+B,OAAO,0CAA0C,CACjF,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAC1B,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CACH,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,MAAM,YAAY,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAC1F,CAAC;YACF,KAAK,CAAC,eAAe,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM;gBAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,eAAe,CAAC,IAAI,EAAE,4DAA4D,CAAC,CAAC;QAC7F,CAAC;QACD,2EAA2E;QAC3E,qEAAqE;QACrE,oEAAoE;QACpE,yEAAyE;QACzE,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3C,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;YAC3C,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;gBAC1F,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACxB,KAAK,CAAC,kCAAkC,GAAG,CAAC,OAAO,uBAAuB,MAAM,EAAE,CAAC,CAAC;oBACpF,OAAO,CAAC,CAAC,CAAC,CAAC;gBACb,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAA2B;YACpC,KAAK,EACH,uHAAuH;YACzH,MAAM,EACJ,mIAAmI;YACrI,MAAM,EAAE,uEAAuE;YAC/E,QAAQ,EAAE,+EAA+E;SAC1F,CAAC;QACF,MAAM,IAAI,GACR,KAAK,CAAC,OAAO,CAAC,IAAI,kBAAkB,OAAO,iDAAiD,OAAO,EAAE,CAAC;QACxG,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;YAC5C,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,oCAAoC,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAa;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAChC,+EAA+E;IAC/E,iFAAiF;IACjF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7C,IACE,WAAW,KAAK,SAAS;QACzB,WAAW,KAAK,MAAM;QACtB,WAAW,KAAK,UAAU;QAC1B,WAAW,KAAK,MAAM,EACtB,CAAC;QACD,OAAO,eAAe,CAAC,IAAI,EAAE,sCAAsC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,KAAkB,CAAC;IACvB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,WAAW,CAAE,WAAyC,IAAI,MAAM,CAAC,CAAC;QAC9E,gFAAgF;QAChF,8DAA8D;QAC9D,KAAK,CAAC,eAAe,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACrF,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;aAC9D,CAAC;YACJ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,KAAK,CAAC,sBAAsB,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YAClF,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,eAAe,CAAC,IAAI,EAAE,oFAAoF,CAAC,CAAC;QACrH,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,eAAe,CAAC,IAAI,EAAE,+BAA+B,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC;QAC1F,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,eAAe,CACpB,IAAI,EACJ,2FAA2F,CAC5F,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC;QACzC,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACjF,CAAC;YACJ,KAAK,CAAC,UAAU,IAAI,OAAO,OAAO,EAAE,CAAC,CAAC;YACtC,IAAI,OAAO;gBAAE,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,eAAe,CAAC,IAAI,EAAE,wCAAwC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,eAAe,CAAC,IAAI,EAAE,+BAA+B,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;YACxC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,0CAA0C,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type OrchestrateAutonomy as OrchestrateAutonomyValue } from "@claudexor/schema";
2
+ /**
3
+ * Parse `--autonomy <suggest|auto_safe|auto_full>` into the typed
4
+ * OrchestrateAutonomy. An invalid value FAILS LOUDLY (a typo must never silently
5
+ * fall back to `suggest` and skip the execution the user asked for). Returns
6
+ * undefined when the flag is absent (the daemon/orchestrator default to suggest).
7
+ */
8
+ export declare function parseAutonomy(value: string | undefined): OrchestrateAutonomyValue | undefined;
9
+ //# sourceMappingURL=orchestrate-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrate-options.d.ts","sourceRoot":"","sources":["../src/orchestrate-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,mBAAmB,IAAI,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE9G;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,wBAAwB,GAAG,SAAS,CAK7F"}
@@ -0,0 +1,16 @@
1
+ import { OrchestrateAutonomy } from "@claudexor/schema";
2
+ /**
3
+ * Parse `--autonomy <suggest|auto_safe|auto_full>` into the typed
4
+ * OrchestrateAutonomy. An invalid value FAILS LOUDLY (a typo must never silently
5
+ * fall back to `suggest` and skip the execution the user asked for). Returns
6
+ * undefined when the flag is absent (the daemon/orchestrator default to suggest).
7
+ */
8
+ export function parseAutonomy(value) {
9
+ if (value === undefined)
10
+ return undefined;
11
+ const parsed = OrchestrateAutonomy.safeParse(value);
12
+ if (!parsed.success)
13
+ throw new Error(`invalid --autonomy '${value}' (expected suggest|auto_safe|auto_full)`);
14
+ return parsed.data;
15
+ }
16
+ //# sourceMappingURL=orchestrate-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrate-options.js","sourceRoot":"","sources":["../src/orchestrate-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAwD,MAAM,mBAAmB,CAAC;AAE9G;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,0CAA0C,CAAC,CAAC;IAC7G,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function writePidsSnapshot(path: string): void;
2
+ /**
3
+ * Kill process groups recorded by a PREVIOUS daemon life. Guards against pid
4
+ * recycling by requiring the live process's command name to still match the
5
+ * recorded command (typed equality on basename, no pattern matching). Returns
6
+ * a human-readable action log for the daemon log.
7
+ */
8
+ export declare function reapRecordedOrphans(path: string): string[];
9
+ //# sourceMappingURL=orphan-reaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-reaper.d.ts","sourceRoot":"","sources":["../src/orphan-reaper.ts"],"names":[],"mappings":"AAmBA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAapD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0C1D"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Orphaned-child bookkeeping for the daemon. Harness children run in
3
+ * their OWN process groups (deliberate: group kill), so they survive a daemon
4
+ * crash/SIGKILL and keep mutating trees with nobody watching. The daemon
5
+ * periodically snapshots the live child registry to a pids file; on the next
6
+ * start, any recorded pid that is still alive AND still runs the recorded
7
+ * command is an orphan from a previous daemon life — its process group is
8
+ * killed before new work is accepted.
9
+ */
10
+ import { execFileSync } from "node:child_process";
11
+ import { readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
12
+ import { basename } from "node:path";
13
+ import { liveChildProcesses } from "@claudexor/core";
14
+ export function writePidsSnapshot(path) {
15
+ try {
16
+ const pids = liveChildProcesses();
17
+ if (pids.length === 0) {
18
+ rmSync(path, { force: true });
19
+ return;
20
+ }
21
+ const tmp = `${path}.tmp`;
22
+ writeFileSync(tmp, JSON.stringify({ pids }, null, 2), { mode: 0o600 });
23
+ renameSync(tmp, path);
24
+ }
25
+ catch {
26
+ /* best-effort bookkeeping; never fail a run over it */
27
+ }
28
+ }
29
+ /**
30
+ * Kill process groups recorded by a PREVIOUS daemon life. Guards against pid
31
+ * recycling by requiring the live process's command name to still match the
32
+ * recorded command (typed equality on basename, no pattern matching). Returns
33
+ * a human-readable action log for the daemon log.
34
+ */
35
+ export function reapRecordedOrphans(path) {
36
+ let recorded = [];
37
+ try {
38
+ const raw = JSON.parse(readFileSync(path, "utf8"));
39
+ if (Array.isArray(raw.pids)) {
40
+ recorded = raw.pids.filter((p) => !!p && typeof p === "object" && typeof p.pid === "number" && typeof p.cmd === "string");
41
+ }
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ const actions = [];
47
+ for (const child of recorded) {
48
+ const liveCmd = processCommandName(child.pid);
49
+ if (liveCmd === null)
50
+ continue; // already gone
51
+ if (basename(liveCmd) !== basename(child.cmd)) {
52
+ actions.push(`skip pid ${child.pid}: command changed (${basename(liveCmd)} != ${basename(child.cmd)}) — likely recycled`);
53
+ continue;
54
+ }
55
+ try {
56
+ process.kill(-child.pid, "SIGTERM");
57
+ actions.push(`SIGTERM orphan process group ${child.pid} (${basename(child.cmd)})`);
58
+ setTimeout(() => {
59
+ try {
60
+ process.kill(-child.pid, "SIGKILL");
61
+ }
62
+ catch {
63
+ /* group exited after SIGTERM */
64
+ }
65
+ }, 3_000).unref?.();
66
+ }
67
+ catch {
68
+ try {
69
+ process.kill(child.pid, "SIGTERM");
70
+ actions.push(`SIGTERM orphan pid ${child.pid} (${basename(child.cmd)}; group already gone)`);
71
+ }
72
+ catch {
73
+ /* exited between the liveness check and the kill */
74
+ }
75
+ }
76
+ }
77
+ rmSync(path, { force: true });
78
+ return actions;
79
+ }
80
+ /** The live command name for a pid, or null when the process is gone. */
81
+ function processCommandName(pid) {
82
+ try {
83
+ process.kill(pid, 0);
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ try {
89
+ const out = execFileSync("ps", ["-p", String(pid), "-o", "comm="], { encoding: "utf8" });
90
+ const cmd = out.trim();
91
+ return cmd.length > 0 ? cmd : null;
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ //# sourceMappingURL=orphan-reaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-reaper.js","sourceRoot":"","sources":["../src/orphan-reaper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAOrD,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC;QAC1B,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,QAAQ,GAAoB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAuB,CAAC;QACzE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CACxB,CAAC,CAAC,EAAsB,EAAE,CACxB,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAQ,CAAmB,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAQ,CAAmB,CAAC,GAAG,KAAK,QAAQ,CAC/H,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,IAAI;YAAE,SAAS,CAAC,eAAe;QAC/C,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,GAAG,sBAAsB,QAAQ,CAAC,OAAO,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC1H,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnF,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,sBAAsB,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAC/F,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yEAAyE;AACzE,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface SweepInput {
2
+ jobsPath: string;
3
+ threadsPath: string;
4
+ }
5
+ export declare function sweepOrphanWorkspaces(input: SweepInput): Promise<string[]>;
6
+ export {};
7
+ //# sourceMappingURL=orphan-sweeper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-sweeper.d.ts","sourceRoot":"","sources":["../src/orphan-sweeper.ts"],"names":[],"mappings":"AA2BA,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAchF"}