@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,289 @@
1
+ /**
2
+ * Crash GC: a daemon crash leaves three kinds of debris behind —
3
+ * workspace envelopes (worktree + scoped home WITH SEEDED CREDENTIALS),
4
+ * per-attempt `claudexor/<task>/<attempt>` branches, and `claudexor-ro-*`
5
+ * read-only tmp homes. The sweep runs at daemon startup BEFORE any new work
6
+ * is accepted, when nothing can own an envelope (running jobs were flipped
7
+ * to interrupted, queued jobs have not materialized task ids), so every
8
+ * found envelope under a daemon-known project root is an orphan.
9
+ *
10
+ * Reach is honest: only roots recorded in jobs.json (plus their thread
11
+ * trees) are sweepable — a project never run through this daemon is not.
12
+ *
13
+ * LIVE-OWNER GUARD: envelopes carry owner.json (pid + kernel start time);
14
+ * a live owner's envelopes survive the sweep. When start-time recycling
15
+ * proof is unavailable on either side (ps-less/sandboxed env, legacy
16
+ * marker), a live pid keeps the envelope only while its working dirs are
17
+ * FRESH (24h window over the newest of base/tree/home/owner.json mtimes) —
18
+ * a declared tradeoff: brief proof-less windows never kill in-flight work,
19
+ * while a recycled pid cannot pin a seeded-credential home forever.
20
+ */
21
+ import { existsSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
22
+ import { tmpdir } from "node:os";
23
+ import { join } from "node:path";
24
+ import { WorkspaceManager, git, processStartTime } from "@claudexor/workspace";
25
+ const RO_HOME_MAX_AGE_MS = 24 * 60 * 60 * 1000;
26
+ export async function sweepOrphanWorkspaces(input) {
27
+ const actions = [];
28
+ const roots = knownProjectRoots(input.jobsPath);
29
+ const liveThreadIds = knownThreadIds(input.threadsPath);
30
+ for (const root of roots) {
31
+ const trees = [root, ...threadTreesUnder(root)];
32
+ for (const tree of trees) {
33
+ actions.push(...(await sweepEnvelopesUnder(tree)));
34
+ actions.push(...(await sweepAttemptBranches(tree, liveThreadIds)));
35
+ }
36
+ }
37
+ actions.push(...sweepReadOnlyHomes());
38
+ return actions;
39
+ }
40
+ /** Project roots this daemon has ever run against (jobs.json scope roots). */
41
+ function knownProjectRoots(jobsPath) {
42
+ const roots = new Set();
43
+ try {
44
+ const records = JSON.parse(readFileSync(jobsPath, "utf8"));
45
+ if (!Array.isArray(records))
46
+ return [];
47
+ for (const rec of records) {
48
+ const scope = rec?.params
49
+ ?.scope;
50
+ if (scope &&
51
+ scope.kind === "project" &&
52
+ typeof scope.root === "string" &&
53
+ existsSync(scope.root)) {
54
+ roots.add(scope.root);
55
+ }
56
+ }
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ return [...roots];
62
+ }
63
+ function knownThreadIds(threadsPath) {
64
+ try {
65
+ const raw = JSON.parse(readFileSync(threadsPath, "utf8"));
66
+ return new Set((raw.threads ?? []).map((t) => t?.id).filter((id) => typeof id === "string"));
67
+ }
68
+ catch {
69
+ return new Set();
70
+ }
71
+ }
72
+ /** Isolated-thread worktrees nest their own envelopes: <root>/.claudexor/threads/<tid>/tree. */
73
+ function threadTreesUnder(root) {
74
+ const threadsDir = join(root, ".claudexor", "threads");
75
+ if (!existsSync(threadsDir))
76
+ return [];
77
+ try {
78
+ return readdirSync(threadsDir)
79
+ .map((tid) => join(threadsDir, tid, "tree"))
80
+ .filter((tree) => existsSync(tree));
81
+ }
82
+ catch {
83
+ return [];
84
+ }
85
+ }
86
+ async function sweepEnvelopesUnder(execRoot) {
87
+ const actions = [];
88
+ const workspacesDir = join(execRoot, ".claudexor", "workspaces");
89
+ if (!existsSync(workspacesDir))
90
+ return actions;
91
+ const wsm = new WorkspaceManager(execRoot);
92
+ for (const taskId of safeReaddir(workspacesDir)) {
93
+ const taskDir = join(workspacesDir, taskId);
94
+ for (const attemptId of safeReaddir(taskDir)) {
95
+ // LIVE-OWNER GUARD: an envelope created by a still-running process
96
+ // (in-process CLI run, MCP/ACP serve, another daemon) is NOT an orphan.
97
+ // The startup premise "nothing can own an envelope" only covers
98
+ // daemon-tracked jobs; owner.json (pid + command, recycling-guarded)
99
+ // covers everyone else. Fail-safe: a live-looking owner means KEEP.
100
+ const owner = envelopeOwner(join(taskDir, attemptId));
101
+ if (owner) {
102
+ actions.push(`kept envelope ${taskId}/${attemptId} under ${execRoot}: live owner pid ${owner}`);
103
+ continue;
104
+ }
105
+ try {
106
+ await wsm.disposeOrphan(taskId, attemptId);
107
+ actions.push(`disposed orphan envelope ${taskId}/${attemptId} under ${execRoot}`);
108
+ }
109
+ catch (err) {
110
+ actions.push(`FAILED to dispose orphan envelope ${taskId}/${attemptId} under ${execRoot}: ${err instanceof Error ? err.message : String(err)}`);
111
+ }
112
+ }
113
+ }
114
+ return actions;
115
+ }
116
+ /** How long an envelope may be KEPT on live-pid evidence alone when
117
+ * start-time recycling proof is unavailable on either side. Bounds credential
118
+ * retention: a recycled pid cannot pin a seeded-credential home forever. */
119
+ const OWNERLESS_PROOF_KEEP_MAX_AGE_MS = 24 * 60 * 60 * 1000;
120
+ /** The live owner pid recorded in the envelope's owner.json, or null when the
121
+ * marker is missing, the pid is dead, or the pid was RECYCLED (the live
122
+ * process's kernel start time no longer matches the recorded one — command
123
+ * names/titles mutate, start times never do). FAIL-SAFE, bounded: when
124
+ * start-time evidence is unavailable on either side (`ps` missing/sandboxed,
125
+ * legacy marker), a LIVE pid keeps the envelope only while it is FRESH —
126
+ * in-flight work survives, but a recycled pid cannot retain credential-bearing
127
+ * homes indefinitely. A pid alive under another uid (EPERM) counts as alive. */
128
+ function envelopeOwner(envelopeBase) {
129
+ try {
130
+ const raw = JSON.parse(readFileSync(join(envelopeBase, "owner.json"), "utf8"));
131
+ if (typeof raw.pid !== "number" || !Number.isInteger(raw.pid) || raw.pid <= 0)
132
+ return null;
133
+ let alive = false;
134
+ try {
135
+ process.kill(raw.pid, 0);
136
+ alive = true;
137
+ }
138
+ catch (err) {
139
+ // EPERM = the pid EXISTS but belongs to another security boundary —
140
+ // that is a live process, not a dead one.
141
+ alive = err?.code === "EPERM";
142
+ }
143
+ if (!alive)
144
+ return null;
145
+ const recorded = typeof raw.started === "string" ? raw.started : null;
146
+ const live = processStartTime(raw.pid);
147
+ // Recycling proof requires BOTH sides; with both present they must match.
148
+ if (recorded !== null && live !== null)
149
+ return live === recorded ? raw.pid : null;
150
+ // No recycling proof available: bounded keep on freshness. Freshness is
151
+ // the NEWEST mtime across the envelope base, owner.json, and a BOUNDED
152
+ // recursive walk of the working dirs — editing an EXISTING file bumps
153
+ // only the file's mtime, not its parent directory's, so directory stats
154
+ // alone would sweep a live owner that edits in place. A live long-running
155
+ // owner keeps extending its own window; a recycled pid cannot pin a
156
+ // seeded-credential home forever.
157
+ const newestMtime = Math.max(safeMtime(envelopeBase), safeMtime(join(envelopeBase, "owner.json")), newestMtimeUnder(join(envelopeBase, "tree")), newestMtimeUnder(join(envelopeBase, "home")));
158
+ return Date.now() - newestMtime < OWNERLESS_PROOF_KEEP_MAX_AGE_MS ? raw.pid : null;
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ /**
165
+ * Per-attempt branches whose envelope is gone are debris (disposeOrphan
166
+ * removes its own branch; this catches branches whose envelope dir was
167
+ * deleted out-of-band). Thread branches (`claudexor/thread-<tid>`) are
168
+ * PERSISTENT for live threads and only deleted when the thread is gone from
169
+ * the store.
170
+ */
171
+ async function sweepAttemptBranches(execRoot, liveThreadIds) {
172
+ const actions = [];
173
+ const branches = await git(execRoot, [
174
+ "branch",
175
+ "--list",
176
+ "claudexor/*",
177
+ "--format=%(refname:short)",
178
+ ]);
179
+ if (branches.code !== 0)
180
+ return actions;
181
+ for (const branch of branches.stdout
182
+ .split("\n")
183
+ .map((b) => b.trim())
184
+ .filter(Boolean)) {
185
+ const rest = branch.slice("claudexor/".length);
186
+ if (rest.startsWith("verify-")) {
187
+ // FinalVerifier branches leak only when a crash hit mid-verify (the
188
+ // verifier deletes them in its finally). git refuses to delete a branch
189
+ // a live verify worktree still has checked out, so this is safe.
190
+ const del = await git(execRoot, ["branch", "-D", branch]);
191
+ if (del.code === 0)
192
+ actions.push(`deleted leaked verify branch ${branch} under ${execRoot}`);
193
+ continue;
194
+ }
195
+ if (rest.startsWith("thread-")) {
196
+ const tid = rest.slice("thread-".length);
197
+ if (liveThreadIds.has(tid))
198
+ continue;
199
+ // Dead thread branch: its worktree dir decides — an existing tree means
200
+ // the thread store lost the record but the work is still there; keep it
201
+ // (evidence beats cleanup) and only note it.
202
+ const threadTree = join(execRoot, ".claudexor", "threads", tid, "tree");
203
+ if (existsSync(threadTree)) {
204
+ actions.push(`kept branch ${branch}: thread tree still on disk (store record missing)`);
205
+ continue;
206
+ }
207
+ const del = await git(execRoot, ["branch", "-D", branch]);
208
+ if (del.code === 0)
209
+ actions.push(`deleted dead thread branch ${branch} under ${execRoot}`);
210
+ continue;
211
+ }
212
+ const [taskId, attemptId] = rest.split("/");
213
+ if (!taskId || !attemptId)
214
+ continue;
215
+ const envelopeBase = join(execRoot, ".claudexor", "workspaces", taskId, attemptId);
216
+ if (existsSync(envelopeBase))
217
+ continue; // still owned (sweep order: envelopes first)
218
+ const del = await git(execRoot, ["branch", "-D", branch]);
219
+ if (del.code === 0)
220
+ actions.push(`deleted orphan attempt branch ${branch} under ${execRoot}`);
221
+ }
222
+ return actions;
223
+ }
224
+ /** Read-only scoped homes and verify worktree dirs leak on crash; ro homes can hold seeded credentials. */
225
+ function sweepReadOnlyHomes() {
226
+ const actions = [];
227
+ const tmp = tmpdir();
228
+ for (const entry of safeReaddir(tmp)) {
229
+ if (!entry.startsWith("claudexor-ro-") && !entry.startsWith("claudexor-verify-"))
230
+ continue;
231
+ const full = join(tmp, entry);
232
+ try {
233
+ if (Date.now() - statSync(full).mtimeMs < RO_HOME_MAX_AGE_MS)
234
+ continue;
235
+ rmSync(full, { recursive: true, force: true });
236
+ actions.push(`deleted stale tmp dir ${entry}`);
237
+ }
238
+ catch {
239
+ /* best-effort */
240
+ }
241
+ }
242
+ return actions;
243
+ }
244
+ function safeMtime(path) {
245
+ try {
246
+ return statSync(path).mtimeMs;
247
+ }
248
+ catch {
249
+ return 0;
250
+ }
251
+ }
252
+ /** Newest mtime under a dir via a BOUNDED walk (freshness evidence, not an
253
+ * exhaustive index): caps visited entries so a huge worktree cannot stall the
254
+ * startup sweep; the newest-first ordering is not needed — any fresh entry
255
+ * proves liveness. */
256
+ function newestMtimeUnder(root, maxEntries = 512) {
257
+ let newest = safeMtime(root);
258
+ let visited = 0;
259
+ const stack = [root];
260
+ while (stack.length > 0 && visited < maxEntries) {
261
+ const dir = stack.pop();
262
+ for (const entry of safeReaddir(dir)) {
263
+ if (visited >= maxEntries)
264
+ break;
265
+ visited += 1;
266
+ const full = join(dir, entry);
267
+ try {
268
+ const st = statSync(full);
269
+ if (st.mtimeMs > newest)
270
+ newest = st.mtimeMs;
271
+ if (st.isDirectory())
272
+ stack.push(full);
273
+ }
274
+ catch {
275
+ /* raced deletion — skip */
276
+ }
277
+ }
278
+ }
279
+ return newest;
280
+ }
281
+ function safeReaddir(dir) {
282
+ try {
283
+ return readdirSync(dir);
284
+ }
285
+ catch {
286
+ return [];
287
+ }
288
+ }
289
+ //# sourceMappingURL=orphan-sweeper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-sweeper.js","sourceRoot":"","sources":["../src/orphan-sweeper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export type PluginHost = "cursor" | "claude" | "codex" | "opencode";
2
+ export type PluginTarget = PluginHost | "all";
3
+ export type PluginVerb = "install" | "status" | "doctor" | "repair" | "uninstall";
4
+ export type PluginInstallState = "missing" | "installed" | "registered" | "drifted" | "partial" | "blocked";
5
+ export declare const PLUGIN_HOSTS: PluginHost[];
6
+ export declare const PLUGIN_TARGETS: PluginTarget[];
7
+ export declare const PLUGIN_VERBS: PluginVerb[];
8
+ export interface PluginHostResult {
9
+ host: PluginHost;
10
+ state: PluginInstallState;
11
+ ok: boolean;
12
+ changed: boolean;
13
+ path: string;
14
+ actions: string[];
15
+ notes: string[];
16
+ warnings: string[];
17
+ errors: string[];
18
+ }
19
+ export interface PluginCommandResult {
20
+ verb: PluginVerb;
21
+ target: PluginTarget;
22
+ dryRun: boolean;
23
+ results: PluginHostResult[];
24
+ ok: boolean;
25
+ exitCode: number;
26
+ }
27
+ export interface PluginCommandErrorResult {
28
+ verb: string | null;
29
+ target: string | null;
30
+ dryRun: boolean;
31
+ results: [];
32
+ ok: false;
33
+ exitCode: number;
34
+ error: string;
35
+ }
36
+ export interface PluginCommandOptions {
37
+ dryRun?: boolean;
38
+ force?: boolean;
39
+ json?: boolean;
40
+ }
41
+ export declare function runPluginCommand(verb: PluginVerb, target: PluginTarget, options?: PluginCommandOptions): Promise<PluginCommandResult>;
42
+ export declare function formatPluginResult(result: PluginCommandResult): string;
43
+ export declare function pluginCommandErrorResult(verb: string | undefined, target: string | undefined, dryRun: boolean, exitCode: number, error: string): PluginCommandErrorResult;
44
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AACpE,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAC9C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAClF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5G,eAAO,MAAM,YAAY,EAAE,UAAU,EAA8C,CAAC;AACpF,eAAO,MAAM,cAAc,EAAE,YAAY,EAA6B,CAAC;AACvE,eAAO,MAAM,YAAY,EAAE,UAAU,EAA2D,CAAC;AAkEjG,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,EAAE,CAAC;IACZ,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAyyCD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoB/I;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAWtE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,wBAAwB,CAUzK"}