@claudexor/cli 1.0.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp-surface-runner.d.ts +17 -0
- package/dist/acp-surface-runner.d.ts.map +1 -0
- package/dist/acp-surface-runner.js +187 -0
- package/dist/acp-surface-runner.js.map +1 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js.map +1 -1
- package/dist/bridge-serve.d.ts +3 -0
- package/dist/bridge-serve.d.ts.map +1 -0
- package/dist/bridge-serve.js +39 -0
- package/dist/bridge-serve.js.map +1 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +12 -3
- package/dist/capabilities.js.map +1 -1
- package/dist/claude-oauth-usage.d.ts +33 -0
- package/dist/claude-oauth-usage.d.ts.map +1 -0
- package/dist/claude-oauth-usage.js +190 -0
- package/dist/claude-oauth-usage.js.map +1 -0
- package/dist/claude-statusline.d.ts +25 -0
- package/dist/claude-statusline.d.ts.map +1 -0
- package/dist/claude-statusline.js +259 -0
- package/dist/claude-statusline.js.map +1 -0
- package/dist/claudexord.js +346 -543
- package/dist/claudexord.js.map +1 -1
- package/dist/cli-io.d.ts +8 -9
- package/dist/cli-io.d.ts.map +1 -1
- package/dist/cli-io.js +11 -7
- package/dist/cli-io.js.map +1 -1
- package/dist/cli.js +475 -516
- package/dist/cli.js.map +1 -1
- package/dist/codex-quota-source.d.ts +11 -0
- package/dist/codex-quota-source.d.ts.map +1 -0
- package/dist/codex-quota-source.js +181 -0
- package/dist/codex-quota-source.js.map +1 -0
- package/dist/command-flags.d.ts +18 -0
- package/dist/command-flags.d.ts.map +1 -0
- package/dist/command-flags.js +124 -0
- package/dist/command-flags.js.map +1 -0
- package/dist/command-registry.d.ts +2 -40
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +74 -164
- package/dist/command-registry.js.map +1 -1
- package/dist/control-services.d.ts +2483 -0
- package/dist/control-services.d.ts.map +1 -0
- package/dist/control-services.js +437 -0
- package/dist/control-services.js.map +1 -0
- package/dist/credential-commands.d.ts +9 -0
- package/dist/credential-commands.d.ts.map +1 -0
- package/dist/credential-commands.js +224 -0
- package/dist/credential-commands.js.map +1 -0
- package/dist/daemon-lifecycle.d.ts +7 -3
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +40 -12
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/daemon-run.d.ts +2 -0
- package/dist/daemon-run.d.ts.map +1 -1
- package/dist/daemon-run.js +62 -14
- package/dist/daemon-run.js.map +1 -1
- package/dist/daemon-runtime-shutdown.d.ts +58 -0
- package/dist/daemon-runtime-shutdown.d.ts.map +1 -0
- package/dist/daemon-runtime-shutdown.js +142 -0
- package/dist/daemon-runtime-shutdown.js.map +1 -0
- package/dist/decision.d.ts.map +1 -1
- package/dist/decision.js +12 -3
- package/dist/decision.js.map +1 -1
- package/dist/live.d.ts +29 -0
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +117 -6
- package/dist/live.js.map +1 -1
- package/dist/local-attachment.d.ts +14 -0
- package/dist/local-attachment.d.ts.map +1 -0
- package/dist/local-attachment.js +67 -0
- package/dist/local-attachment.js.map +1 -0
- package/dist/mcp-runner.d.ts +4 -15
- package/dist/mcp-runner.d.ts.map +1 -1
- package/dist/mcp-runner.js +273 -145
- package/dist/mcp-runner.js.map +1 -1
- package/dist/native-login.d.ts +21 -0
- package/dist/native-login.d.ts.map +1 -0
- package/dist/native-login.js +111 -0
- package/dist/native-login.js.map +1 -0
- package/dist/ops-commands.d.ts +8 -6
- package/dist/ops-commands.d.ts.map +1 -1
- package/dist/ops-commands.js +250 -168
- package/dist/ops-commands.js.map +1 -1
- package/dist/orchestrate-options.d.ts.map +1 -1
- package/dist/orchestrate-options.js +1 -1
- package/dist/orchestrate-options.js.map +1 -1
- package/dist/orphan-reaper.d.ts +4 -5
- package/dist/orphan-reaper.d.ts.map +1 -1
- package/dist/orphan-reaper.js +29 -56
- package/dist/orphan-reaper.js.map +1 -1
- package/dist/orphan-sweeper.d.ts +1 -2
- package/dist/orphan-sweeper.d.ts.map +1 -1
- package/dist/orphan-sweeper.js +29 -48
- package/dist/orphan-sweeper.js.map +1 -1
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +196 -64
- package/dist/plugins.js.map +1 -1
- package/dist/primary-output.d.ts.map +1 -1
- package/dist/primary-output.js.map +1 -1
- package/dist/profile-registration.d.ts +15 -0
- package/dist/profile-registration.d.ts.map +1 -0
- package/dist/profile-registration.js +68 -0
- package/dist/profile-registration.js.map +1 -0
- package/dist/project-command.d.ts +3 -0
- package/dist/project-command.d.ts.map +1 -0
- package/dist/project-command.js +87 -0
- package/dist/project-command.js.map +1 -0
- package/dist/quota-command.d.ts +3 -0
- package/dist/quota-command.d.ts.map +1 -0
- package/dist/quota-command.js +59 -0
- package/dist/quota-command.js.map +1 -0
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +16 -4
- package/dist/registry.js.map +1 -1
- package/dist/release.d.ts.map +1 -1
- package/dist/release.js +15 -3
- package/dist/release.js.map +1 -1
- package/dist/repl.d.ts +3 -8
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +23 -122
- package/dist/repl.js.map +1 -1
- package/dist/request-preflight.d.ts +13 -0
- package/dist/request-preflight.d.ts.map +1 -0
- package/dist/request-preflight.js +81 -0
- package/dist/request-preflight.js.map +1 -0
- package/dist/retention-service.d.ts +24 -0
- package/dist/retention-service.d.ts.map +1 -0
- package/dist/retention-service.js +100 -0
- package/dist/retention-service.js.map +1 -0
- package/dist/retry-command-specs.d.ts +3 -0
- package/dist/retry-command-specs.d.ts.map +1 -0
- package/dist/retry-command-specs.js +21 -0
- package/dist/retry-command-specs.js.map +1 -0
- package/dist/retry-command.d.ts +4 -0
- package/dist/retry-command.d.ts.map +1 -0
- package/dist/retry-command.js +57 -0
- package/dist/retry-command.js.map +1 -0
- package/dist/review-command.d.ts.map +1 -1
- package/dist/review-command.js +47 -12
- package/dist/review-command.js.map +1 -1
- package/dist/run-options.d.ts +2 -2
- package/dist/run-options.d.ts.map +1 -1
- package/dist/run-options.js +27 -5
- package/dist/run-options.js.map +1 -1
- package/dist/settings-command.d.ts.map +1 -1
- package/dist/settings-command.js +143 -188
- package/dist/settings-command.js.map +1 -1
- package/dist/settings-service.d.ts +50 -0
- package/dist/settings-service.d.ts.map +1 -1
- package/dist/settings-service.js +67 -1
- package/dist/settings-service.js.map +1 -1
- package/dist/setup-job-reducer.d.ts +9 -0
- package/dist/setup-job-reducer.d.ts.map +1 -0
- package/dist/setup-job-reducer.js +290 -0
- package/dist/setup-job-reducer.js.map +1 -0
- package/dist/setup-job-store.d.ts +250 -0
- package/dist/setup-job-store.d.ts.map +1 -0
- package/dist/setup-job-store.js +359 -0
- package/dist/setup-job-store.js.map +1 -0
- package/dist/setup-job-support.d.ts +27 -0
- package/dist/setup-job-support.d.ts.map +1 -0
- package/dist/setup-job-support.js +141 -0
- package/dist/setup-job-support.js.map +1 -0
- package/dist/setup-jobs.d.ts +437 -22
- package/dist/setup-jobs.d.ts.map +1 -1
- package/dist/setup-jobs.js +813 -423
- package/dist/setup-jobs.js.map +1 -1
- package/dist/setup-lifecycle-binding.d.ts +40 -0
- package/dist/setup-lifecycle-binding.d.ts.map +1 -0
- package/dist/setup-lifecycle-binding.js +159 -0
- package/dist/setup-lifecycle-binding.js.map +1 -0
- package/dist/setup-login-protocol.d.ts +13 -0
- package/dist/setup-login-protocol.d.ts.map +1 -0
- package/dist/setup-login-protocol.js +179 -0
- package/dist/setup-login-protocol.js.map +1 -0
- package/dist/setup-login-runner.d.ts +20 -0
- package/dist/setup-login-runner.d.ts.map +1 -0
- package/dist/setup-login-runner.js +225 -0
- package/dist/setup-login-runner.js.map +1 -0
- package/dist/setup-supervisor.d.ts +53 -0
- package/dist/setup-supervisor.d.ts.map +1 -0
- package/dist/setup-supervisor.js +177 -0
- package/dist/setup-supervisor.js.map +1 -0
- package/dist/spec.d.ts +9 -20
- package/dist/spec.d.ts.map +1 -1
- package/dist/spec.js +49 -21
- package/dist/spec.js.map +1 -1
- package/dist/thread-delivery.d.ts +18 -0
- package/dist/thread-delivery.d.ts.map +1 -0
- package/dist/thread-delivery.js +67 -0
- package/dist/thread-delivery.js.map +1 -0
- package/dist/thread-select.d.ts +9 -0
- package/dist/thread-select.d.ts.map +1 -0
- package/dist/thread-select.js +12 -0
- package/dist/thread-select.js.map +1 -0
- package/dist/trust-command.d.ts.map +1 -1
- package/dist/trust-command.js +69 -61
- package/dist/trust-command.js.map +1 -1
- package/dist/trust-services.d.ts +5 -6
- package/dist/trust-services.d.ts.map +1 -1
- package/dist/trust-services.js +42 -13
- package/dist/trust-services.js.map +1 -1
- package/package.json +24 -22
- package/dist/attachment-resolver.d.ts +0 -11
- package/dist/attachment-resolver.d.ts.map +0 -1
- package/dist/attachment-resolver.js +0 -61
- package/dist/attachment-resolver.js.map +0 -1
- package/dist/settings-display.d.ts +0 -3
- package/dist/settings-display.d.ts.map +0 -1
- package/dist/settings-display.js +0 -33
- package/dist/settings-display.js.map +0 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { realpathSync } from "node:fs";
|
|
4
|
+
import { dirname, resolve, sep } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { defaultProcessGroupService, } from "@claudexor/core";
|
|
7
|
+
import { nativeLoginEnv } from "./native-login.js";
|
|
8
|
+
import { SETUP_LOGIN_PROTOCOL_VERSION, atomicPrivateJson, readLoginManifest, readRunnerPermit, verifyExecutableEvidence, } from "./setup-login-protocol.js";
|
|
9
|
+
const PERMIT_POLL_MS = 50;
|
|
10
|
+
/**
|
|
11
|
+
* Terminal-visible bootstrap. It creates a detached worker process group and
|
|
12
|
+
* waits for that worker, but the worker cannot start the vendor command until
|
|
13
|
+
* claudexord has durably recorded its exact group handle and issued a permit.
|
|
14
|
+
*/
|
|
15
|
+
export async function runSetupLogin(manifestPath, options = {}) {
|
|
16
|
+
const manifest = validateManifest(manifestPath);
|
|
17
|
+
const spawnProcess = options.spawnProcess ?? spawn;
|
|
18
|
+
const runnerPath = options.runnerPath ?? fileURLToPath(import.meta.url);
|
|
19
|
+
const worker = spawnProcess(process.execPath, [runnerPath, "--worker", resolve(manifestPath)], {
|
|
20
|
+
cwd: manifest.cwd,
|
|
21
|
+
env: runnerBootstrapEnv(),
|
|
22
|
+
detached: true,
|
|
23
|
+
stdio: "inherit",
|
|
24
|
+
});
|
|
25
|
+
const result = await waitForExit(worker);
|
|
26
|
+
return result.code === 0 && result.signal === null ? 0 : 1;
|
|
27
|
+
}
|
|
28
|
+
/** Worker entrypoint. Exported so the permit ordering can be fault-injected. */
|
|
29
|
+
export async function runSetupLoginWorker(manifestPath, options = {}) {
|
|
30
|
+
const manifest = validateManifest(manifestPath);
|
|
31
|
+
const now = options.now ?? (() => new Date());
|
|
32
|
+
const sleep = options.sleep ?? ((ms) => new Promise((done) => setTimeout(done, ms)));
|
|
33
|
+
const spawnProcess = options.spawnProcess ?? spawn;
|
|
34
|
+
const processGroups = options.processGroupService ?? defaultProcessGroupService;
|
|
35
|
+
const captured = processGroups.captureLeader(options.selfPid ?? process.pid);
|
|
36
|
+
if (captured.status !== "known") {
|
|
37
|
+
throw new Error(describeCaptureFailure(captured));
|
|
38
|
+
}
|
|
39
|
+
const observedAt = now().toISOString();
|
|
40
|
+
const awaitingPermit = {
|
|
41
|
+
version: SETUP_LOGIN_PROTOCOL_VERSION,
|
|
42
|
+
jobId: manifest.jobId,
|
|
43
|
+
executionId: manifest.executionId,
|
|
44
|
+
processGroup: captured.handle,
|
|
45
|
+
stage: "awaiting_permit",
|
|
46
|
+
observedAt,
|
|
47
|
+
commandDigest: manifest.commandDigest,
|
|
48
|
+
manifestDigest: manifest.manifestDigest,
|
|
49
|
+
};
|
|
50
|
+
atomicPrivateJson(manifest.statePath, awaitingPermit);
|
|
51
|
+
const permit = await waitForPermit(manifest, now, sleep);
|
|
52
|
+
if (!permit) {
|
|
53
|
+
persistResult(manifest, {
|
|
54
|
+
permitIssuedAt: null,
|
|
55
|
+
commandStarted: false,
|
|
56
|
+
errorCode: "permit_timeout",
|
|
57
|
+
exitCode: null,
|
|
58
|
+
signal: null,
|
|
59
|
+
finishedAt: now().toISOString(),
|
|
60
|
+
});
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
if (!verifyExecutableEvidence(manifest.executable)) {
|
|
64
|
+
persistResult(manifest, {
|
|
65
|
+
permitIssuedAt: permit.issuedAt,
|
|
66
|
+
commandStarted: false,
|
|
67
|
+
errorCode: "spawn_failed",
|
|
68
|
+
exitCode: null,
|
|
69
|
+
signal: null,
|
|
70
|
+
finishedAt: now().toISOString(),
|
|
71
|
+
});
|
|
72
|
+
return 1;
|
|
73
|
+
}
|
|
74
|
+
atomicPrivateJson(manifest.statePath, { ...awaitingPermit, stage: "running" });
|
|
75
|
+
// Keep the group leader alive through TERM so the daemon can still prove
|
|
76
|
+
// identity and escalate a stubborn descendant with KILL after the grace
|
|
77
|
+
// period. The vendor child receives the same group signal directly.
|
|
78
|
+
const holdLeaderForEscalation = () => undefined;
|
|
79
|
+
process.on("SIGTERM", holdLeaderForEscalation);
|
|
80
|
+
process.on("SIGINT", holdLeaderForEscalation);
|
|
81
|
+
let child;
|
|
82
|
+
try {
|
|
83
|
+
const spawnOptions = {
|
|
84
|
+
cwd: manifest.cwd,
|
|
85
|
+
// A sealed profileConfigDir (INV-135) scopes the vendor login to the
|
|
86
|
+
// profile's own store; absent = the default vendor store as before.
|
|
87
|
+
env: nativeLoginEnv(manifest.harness, process.env, manifest.profileConfigDir),
|
|
88
|
+
detached: false,
|
|
89
|
+
stdio: "inherit",
|
|
90
|
+
};
|
|
91
|
+
child = spawnProcess(manifest.binary, manifest.args, spawnOptions);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
persistResult(manifest, {
|
|
95
|
+
permitIssuedAt: permit.issuedAt,
|
|
96
|
+
commandStarted: false,
|
|
97
|
+
errorCode: "spawn_failed",
|
|
98
|
+
exitCode: null,
|
|
99
|
+
signal: null,
|
|
100
|
+
finishedAt: now().toISOString(),
|
|
101
|
+
});
|
|
102
|
+
process.off("SIGTERM", holdLeaderForEscalation);
|
|
103
|
+
process.off("SIGINT", holdLeaderForEscalation);
|
|
104
|
+
return 1;
|
|
105
|
+
}
|
|
106
|
+
let result;
|
|
107
|
+
try {
|
|
108
|
+
result = await waitForExit(child);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
persistResult(manifest, {
|
|
112
|
+
permitIssuedAt: permit.issuedAt,
|
|
113
|
+
commandStarted: false,
|
|
114
|
+
errorCode: "spawn_failed",
|
|
115
|
+
exitCode: null,
|
|
116
|
+
signal: null,
|
|
117
|
+
finishedAt: now().toISOString(),
|
|
118
|
+
});
|
|
119
|
+
process.off("SIGTERM", holdLeaderForEscalation);
|
|
120
|
+
process.off("SIGINT", holdLeaderForEscalation);
|
|
121
|
+
return 1;
|
|
122
|
+
}
|
|
123
|
+
process.off("SIGTERM", holdLeaderForEscalation);
|
|
124
|
+
process.off("SIGINT", holdLeaderForEscalation);
|
|
125
|
+
persistResult(manifest, {
|
|
126
|
+
permitIssuedAt: permit.issuedAt,
|
|
127
|
+
commandStarted: true,
|
|
128
|
+
exitCode: result.code,
|
|
129
|
+
signal: result.signal,
|
|
130
|
+
finishedAt: now().toISOString(),
|
|
131
|
+
});
|
|
132
|
+
return result.code === 0 && result.signal === null ? 0 : 1;
|
|
133
|
+
}
|
|
134
|
+
function validateManifest(manifestPath) {
|
|
135
|
+
const manifest = readLoginManifest(manifestPath);
|
|
136
|
+
const base = resolve(dirname(manifestPath));
|
|
137
|
+
for (const output of [manifest.statePath, manifest.resultPath, manifest.permitPath]) {
|
|
138
|
+
const absolute = resolve(output);
|
|
139
|
+
if (!absolute.startsWith(base + sep))
|
|
140
|
+
throw new Error("setup-login sidecar escapes its job directory");
|
|
141
|
+
}
|
|
142
|
+
return manifest;
|
|
143
|
+
}
|
|
144
|
+
async function waitForPermit(manifest, now, sleep) {
|
|
145
|
+
const deadline = Date.parse(manifest.permitDeadlineAt);
|
|
146
|
+
while (now().getTime() <= deadline) {
|
|
147
|
+
const permit = readRunnerPermit(manifest.permitPath);
|
|
148
|
+
if (permit &&
|
|
149
|
+
permit.jobId === manifest.jobId &&
|
|
150
|
+
permit.executionId === manifest.executionId &&
|
|
151
|
+
permit.commandDigest === manifest.commandDigest &&
|
|
152
|
+
permit.manifestDigest === manifest.manifestDigest)
|
|
153
|
+
return permit;
|
|
154
|
+
await sleep(Math.min(PERMIT_POLL_MS, Math.max(1, deadline - now().getTime())));
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
function persistResult(manifest, result) {
|
|
159
|
+
atomicPrivateJson(manifest.resultPath, {
|
|
160
|
+
version: SETUP_LOGIN_PROTOCOL_VERSION,
|
|
161
|
+
jobId: manifest.jobId,
|
|
162
|
+
executionId: manifest.executionId,
|
|
163
|
+
commandDigest: manifest.commandDigest,
|
|
164
|
+
manifestDigest: manifest.manifestDigest,
|
|
165
|
+
...result,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function waitForExit(child) {
|
|
169
|
+
return new Promise((resolveExit, reject) => {
|
|
170
|
+
child.once("error", reject);
|
|
171
|
+
child.once("exit", (code, signal) => resolveExit({ code, signal }));
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function describeCaptureFailure(captured) {
|
|
175
|
+
return captured.status === "missing"
|
|
176
|
+
? "setup-login worker disappeared before its process group could be captured"
|
|
177
|
+
: `setup-login worker process-group identity is unprovable: ${captured.reason}`;
|
|
178
|
+
}
|
|
179
|
+
/** The bootstrap itself never needs model/provider credentials. */
|
|
180
|
+
function runnerBootstrapEnv(source = process.env) {
|
|
181
|
+
const env = {};
|
|
182
|
+
for (const key of [
|
|
183
|
+
"PATH",
|
|
184
|
+
"HOME",
|
|
185
|
+
"TMPDIR",
|
|
186
|
+
"LANG",
|
|
187
|
+
"LC_ALL",
|
|
188
|
+
"USER",
|
|
189
|
+
"LOGNAME",
|
|
190
|
+
"CLAUDEXOR_CODEX_NATIVE_HOME",
|
|
191
|
+
"CLAUDEXOR_CLAUDE_NATIVE_DIR",
|
|
192
|
+
]) {
|
|
193
|
+
if (source[key] !== undefined)
|
|
194
|
+
env[key] = source[key];
|
|
195
|
+
}
|
|
196
|
+
return env;
|
|
197
|
+
}
|
|
198
|
+
function isDirectEntrypoint() {
|
|
199
|
+
if (!process.argv[1])
|
|
200
|
+
return false;
|
|
201
|
+
try {
|
|
202
|
+
return (realpathSync(resolve(process.argv[1])) ===
|
|
203
|
+
realpathSync(resolve(fileURLToPath(import.meta.url))));
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (isDirectEntrypoint()) {
|
|
210
|
+
const workerMode = process.argv[2] === "--worker";
|
|
211
|
+
const manifestPath = process.argv[workerMode ? 3 : 2];
|
|
212
|
+
if (!manifestPath) {
|
|
213
|
+
process.stderr.write("usage: setup-login-runner [--worker] <manifest.json>\n");
|
|
214
|
+
process.exitCode = 2;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
(workerMode ? runSetupLoginWorker(manifestPath) : runSetupLogin(manifestPath)).then((code) => {
|
|
218
|
+
process.exitCode = code;
|
|
219
|
+
}, (error) => {
|
|
220
|
+
process.stderr.write(`setup-login-runner: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
221
|
+
process.exitCode = 1;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=setup-login-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-login-runner.js","sourceRoot":"","sources":["../src/setup-login-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export type SetupSupervisorState = "idle" | "starting" | "healthy" | "failed" | "recovery_required" | "draining" | "stopped";
|
|
2
|
+
export interface SetupSupervisorHealth {
|
|
3
|
+
state: SetupSupervisorState;
|
|
4
|
+
failure: Error | null;
|
|
5
|
+
activeTasks: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SetupSupervisorOptions {
|
|
8
|
+
pollMs: number;
|
|
9
|
+
recoveryRequired: () => boolean;
|
|
10
|
+
reconcile: () => Promise<void>;
|
|
11
|
+
tick: () => Promise<void>;
|
|
12
|
+
abortInFlight: (reason: Error) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface SetupSupervisorTrackOptions {
|
|
15
|
+
/** Safety work may be registered while an already-started drain is fencing
|
|
16
|
+
* ordinary admission (for example, process-group termination). */
|
|
17
|
+
safety?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Owns setup background-work liveness. Domain transitions remain in the setup
|
|
21
|
+
* lifecycle service; this class only controls admission, monitor scheduling,
|
|
22
|
+
* exact task tracking, abort fan-out, and idempotent drain.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SetupSupervisor {
|
|
25
|
+
private readonly options;
|
|
26
|
+
private stateValue;
|
|
27
|
+
private timer;
|
|
28
|
+
private readonly tasks;
|
|
29
|
+
private failureValue;
|
|
30
|
+
private startPromise;
|
|
31
|
+
private shutdownPromise;
|
|
32
|
+
private abortIssued;
|
|
33
|
+
constructor(options: SetupSupervisorOptions);
|
|
34
|
+
health(): SetupSupervisorHealth;
|
|
35
|
+
start(): Promise<void>;
|
|
36
|
+
private startOnce;
|
|
37
|
+
/** Synchronous admission/abort fence used before any shutdown await. */
|
|
38
|
+
beginDrain(): void;
|
|
39
|
+
assertCreateAllowed(): void;
|
|
40
|
+
reportFailure(error: unknown, label?: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Tracks an operation so shutdown cannot outlive it. Rejections are observed
|
|
43
|
+
* exactly once and fail-close future setup admission.
|
|
44
|
+
*/
|
|
45
|
+
track<T>(label: string, operation: () => Promise<T>, options?: SetupSupervisorTrackOptions): Promise<T>;
|
|
46
|
+
shutdown(): Promise<void>;
|
|
47
|
+
private shutdownOnce;
|
|
48
|
+
private schedule;
|
|
49
|
+
private clearTimer;
|
|
50
|
+
private rememberFailure;
|
|
51
|
+
private unavailableError;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=setup-supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-supervisor.d.ts","sourceRoot":"","sources":["../src/setup-supervisor.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAC9B,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,mBAAmB,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5F,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,2BAA2B;IAC1C;sEACkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,qBAAa,eAAe;IASd,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,WAAW,CAAS;gBAEC,OAAO,EAAE,sBAAsB;IAM5D,MAAM,IAAI,qBAAqB;IAQ/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBR,SAAS;IAqBvB,wEAAwE;IACxE,UAAU,IAAI,IAAI;IAgBlB,mBAAmB,IAAI,IAAI;IAS3B,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAqB,GAAG,IAAI;IAY/D;;;OAGG;IACH,KAAK,CAAC,CAAC,EACL,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,CAAC,CAAC;IA4Bb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAMX,YAAY;IAW1B,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,gBAAgB;CAWzB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns setup background-work liveness. Domain transitions remain in the setup
|
|
3
|
+
* lifecycle service; this class only controls admission, monitor scheduling,
|
|
4
|
+
* exact task tracking, abort fan-out, and idempotent drain.
|
|
5
|
+
*/
|
|
6
|
+
export class SetupSupervisor {
|
|
7
|
+
options;
|
|
8
|
+
stateValue = "idle";
|
|
9
|
+
timer = null;
|
|
10
|
+
tasks = new Set();
|
|
11
|
+
failureValue = null;
|
|
12
|
+
startPromise = null;
|
|
13
|
+
shutdownPromise = null;
|
|
14
|
+
abortIssued = false;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
if (!Number.isFinite(options.pollMs) || options.pollMs < 0) {
|
|
18
|
+
throw new Error("setup supervisor poll interval must be a non-negative finite number");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
health() {
|
|
22
|
+
return {
|
|
23
|
+
state: this.stateValue,
|
|
24
|
+
failure: this.failureValue,
|
|
25
|
+
activeTasks: this.tasks.size,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
start() {
|
|
29
|
+
if (this.stateValue === "healthy")
|
|
30
|
+
return Promise.resolve();
|
|
31
|
+
if (this.startPromise)
|
|
32
|
+
return this.startPromise;
|
|
33
|
+
if (this.stateValue === "draining" || this.stateValue === "stopped") {
|
|
34
|
+
return Promise.reject(this.unavailableError("setup supervisor is already draining or stopped"));
|
|
35
|
+
}
|
|
36
|
+
if (this.stateValue === "failed" || this.stateValue === "recovery_required") {
|
|
37
|
+
return Promise.reject(this.unavailableError());
|
|
38
|
+
}
|
|
39
|
+
// Fence create/confirm/extend synchronously; startOnce runs in the tracked
|
|
40
|
+
// microtask and must not leave a one-turn admission window.
|
|
41
|
+
this.stateValue = "starting";
|
|
42
|
+
this.startPromise = this.track("reconcile", () => this.startOnce());
|
|
43
|
+
return this.startPromise;
|
|
44
|
+
}
|
|
45
|
+
async startOnce() {
|
|
46
|
+
if (this.stateValue !== "starting")
|
|
47
|
+
throw this.unavailableError();
|
|
48
|
+
if (this.options.recoveryRequired()) {
|
|
49
|
+
this.stateValue = "recovery_required";
|
|
50
|
+
throw this.unavailableError("setup journal requires recovery before setup can start");
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
await this.options.reconcile();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
this.reportFailure(error, "reconcile");
|
|
57
|
+
throw this.unavailableError();
|
|
58
|
+
}
|
|
59
|
+
if (this.options.recoveryRequired()) {
|
|
60
|
+
this.stateValue = "recovery_required";
|
|
61
|
+
throw this.unavailableError("setup journal requires recovery after reconciliation");
|
|
62
|
+
}
|
|
63
|
+
if (this.stateValue !== "starting")
|
|
64
|
+
throw this.unavailableError();
|
|
65
|
+
this.stateValue = "healthy";
|
|
66
|
+
this.schedule();
|
|
67
|
+
}
|
|
68
|
+
/** Synchronous admission/abort fence used before any shutdown await. */
|
|
69
|
+
beginDrain() {
|
|
70
|
+
if (this.stateValue === "stopped")
|
|
71
|
+
return;
|
|
72
|
+
if (this.stateValue !== "draining") {
|
|
73
|
+
this.clearTimer();
|
|
74
|
+
this.stateValue = "draining";
|
|
75
|
+
}
|
|
76
|
+
if (!this.abortIssued) {
|
|
77
|
+
this.abortIssued = true;
|
|
78
|
+
try {
|
|
79
|
+
this.options.abortInFlight(new Error("setup supervisor is draining"));
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
this.rememberFailure(error, "abort-in-flight");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
assertCreateAllowed() {
|
|
87
|
+
// The production composition root awaits start() before exposing setup.
|
|
88
|
+
// Allowing idle keeps isolated lifecycle stores usable in focused tests;
|
|
89
|
+
// every failed/recovery/draining state remains a synchronous hard fence.
|
|
90
|
+
if (this.stateValue !== "idle" && this.stateValue !== "healthy") {
|
|
91
|
+
throw this.unavailableError();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
reportFailure(error, label = "setup-supervisor") {
|
|
95
|
+
this.rememberFailure(error, label);
|
|
96
|
+
this.clearTimer();
|
|
97
|
+
if (this.stateValue !== "recovery_required" &&
|
|
98
|
+
this.stateValue !== "draining" &&
|
|
99
|
+
this.stateValue !== "stopped") {
|
|
100
|
+
this.stateValue = "failed";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Tracks an operation so shutdown cannot outlive it. Rejections are observed
|
|
105
|
+
* exactly once and fail-close future setup admission.
|
|
106
|
+
*/
|
|
107
|
+
track(label, operation, options = {}) {
|
|
108
|
+
if (!label.trim())
|
|
109
|
+
throw new Error("setup supervisor task label must not be empty");
|
|
110
|
+
if ((this.stateValue === "draining" || this.stateValue === "stopped") && !options.safety) {
|
|
111
|
+
return Promise.reject(this.unavailableError("setup supervisor will not start ordinary work while draining"));
|
|
112
|
+
}
|
|
113
|
+
if (this.stateValue === "stopped") {
|
|
114
|
+
return Promise.reject(this.unavailableError("setup supervisor is stopped"));
|
|
115
|
+
}
|
|
116
|
+
const raw = Promise.resolve().then(operation);
|
|
117
|
+
let tracked;
|
|
118
|
+
tracked = raw
|
|
119
|
+
.then((value) => value, (error) => {
|
|
120
|
+
this.reportFailure(error, label);
|
|
121
|
+
throw error;
|
|
122
|
+
})
|
|
123
|
+
.finally(() => {
|
|
124
|
+
this.tasks.delete(tracked);
|
|
125
|
+
});
|
|
126
|
+
this.tasks.add(tracked);
|
|
127
|
+
return tracked;
|
|
128
|
+
}
|
|
129
|
+
shutdown() {
|
|
130
|
+
this.beginDrain();
|
|
131
|
+
this.shutdownPromise ??= this.shutdownOnce();
|
|
132
|
+
return this.shutdownPromise;
|
|
133
|
+
}
|
|
134
|
+
async shutdownOnce() {
|
|
135
|
+
// Drain to a fixed point: an operation that was already running may
|
|
136
|
+
// register bounded safety termination while handling its abort.
|
|
137
|
+
for (;;) {
|
|
138
|
+
const pending = [...this.tasks];
|
|
139
|
+
if (pending.length === 0)
|
|
140
|
+
break;
|
|
141
|
+
await Promise.allSettled(pending);
|
|
142
|
+
}
|
|
143
|
+
this.stateValue = "stopped";
|
|
144
|
+
}
|
|
145
|
+
schedule() {
|
|
146
|
+
if (this.stateValue !== "healthy")
|
|
147
|
+
return;
|
|
148
|
+
this.timer = setTimeout(() => {
|
|
149
|
+
this.timer = null;
|
|
150
|
+
const task = this.track("monitor", this.options.tick);
|
|
151
|
+
void task.then(() => this.schedule(), () => undefined);
|
|
152
|
+
}, this.options.pollMs);
|
|
153
|
+
this.timer.unref();
|
|
154
|
+
}
|
|
155
|
+
clearTimer() {
|
|
156
|
+
if (this.timer)
|
|
157
|
+
clearTimeout(this.timer);
|
|
158
|
+
this.timer = null;
|
|
159
|
+
}
|
|
160
|
+
rememberFailure(error, label) {
|
|
161
|
+
if (this.failureValue)
|
|
162
|
+
return;
|
|
163
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
164
|
+
this.failureValue = new Error(`${label}: ${cause.message}`, { cause });
|
|
165
|
+
}
|
|
166
|
+
unavailableError(message) {
|
|
167
|
+
const detail = message ??
|
|
168
|
+
(this.failureValue
|
|
169
|
+
? `setup supervisor is unavailable: ${this.failureValue.message}`
|
|
170
|
+
: `setup supervisor is unavailable (${this.stateValue})`);
|
|
171
|
+
return Object.assign(new Error(detail), {
|
|
172
|
+
status: 503,
|
|
173
|
+
code: "setup_supervisor_unavailable",
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=setup-supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-supervisor.js","sourceRoot":"","sources":["../src/setup-supervisor.ts"],"names":[],"mappings":"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"}
|
package/dist/spec.d.ts
CHANGED
|
@@ -1,29 +1,17 @@
|
|
|
1
1
|
import { type SpecDraft, type SpecFieldChange } from "@claudexor/interview";
|
|
2
|
-
import { type InterviewAnswer, type InterviewQuestion, type SpecPack } from "@claudexor/schema";
|
|
2
|
+
import { type InterviewAnswer, type InterviewQuestion, type SpecPack, type TestCommandInvocation } from "@claudexor/schema";
|
|
3
3
|
export interface SpecAnswersFile {
|
|
4
|
+
/** Durable daemon session that owns the questions and grounding plan. */
|
|
5
|
+
sessionId?: string;
|
|
4
6
|
answers: InterviewAnswer[];
|
|
5
|
-
/** Present in the draft questions file so freezing can reuse the exact grounding plan. */
|
|
6
|
-
planRunId?: string;
|
|
7
|
-
planDir?: string;
|
|
8
7
|
questions?: InterviewQuestion[];
|
|
8
|
+
priorDecisions?: PriorDecision[];
|
|
9
9
|
summary?: string;
|
|
10
10
|
success_criteria?: string[];
|
|
11
11
|
non_goals?: string[];
|
|
12
12
|
forbidden_approaches?: string[];
|
|
13
13
|
decided_tradeoffs?: string[];
|
|
14
|
-
tests?:
|
|
15
|
-
}
|
|
16
|
-
export interface SpecCommandResult {
|
|
17
|
-
status: "questions" | "frozen";
|
|
18
|
-
planRunId: string;
|
|
19
|
-
planDir: string;
|
|
20
|
-
questionsPath?: string;
|
|
21
|
-
specId?: string;
|
|
22
|
-
specDir?: string;
|
|
23
|
-
specHash?: string;
|
|
24
|
-
runHint?: string;
|
|
25
|
-
questions: InterviewQuestion[];
|
|
26
|
-
changes?: SpecFieldChange[];
|
|
14
|
+
tests?: TestCommandInvocation[];
|
|
27
15
|
}
|
|
28
16
|
export interface LoadedFrozenSpec {
|
|
29
17
|
spec: SpecPack;
|
|
@@ -31,7 +19,7 @@ export interface LoadedFrozenSpec {
|
|
|
31
19
|
specHash: string;
|
|
32
20
|
}
|
|
33
21
|
export declare function loadFrozenSpec(path: string): LoadedFrozenSpec;
|
|
34
|
-
export declare function resolveRunTestCommands(cliTests:
|
|
22
|
+
export declare function resolveRunTestCommands(cliTests: TestCommandInvocation[] | undefined, spec: SpecPack | null): TestCommandInvocation[] | undefined;
|
|
35
23
|
/**
|
|
36
24
|
* The grounding-plan instruction that DRIVES extractQuestionsFromPlan: it tells the
|
|
37
25
|
* harness to end its read-only plan with a structured `## Open Questions` block in
|
|
@@ -75,10 +63,11 @@ export declare function draftFromPlanAndAnswers(prompt: string, plan: string, qu
|
|
|
75
63
|
*/
|
|
76
64
|
export declare function validateAnswers(questions: InterviewQuestion[], answers: InterviewAnswer[]): void;
|
|
77
65
|
export declare function freezeSpecFromGrounding(prompt: string, plan: string, answers: SpecAnswersFile): Promise<SpecPack>;
|
|
78
|
-
export declare function persistSpec(repoRoot: string, spec: SpecPack, plan: string, previous?: SpecPack | null):
|
|
66
|
+
export declare function persistSpec(repoRoot: string, spec: SpecPack, plan: string, previous?: SpecPack | null): ReturnType<typeof persistSpecAt>;
|
|
67
|
+
/** Persist a runnable immutable projection outside the user repository. */
|
|
68
|
+
export declare function persistSpecAt(specsRoot: string, spec: SpecPack, plan: string, previous?: SpecPack | null): {
|
|
79
69
|
specDir: string;
|
|
80
70
|
specHash: string;
|
|
81
71
|
changes: SpecFieldChange[];
|
|
82
72
|
};
|
|
83
|
-
export declare function loadPreviousSpec(path?: string): SpecPack | null;
|
|
84
73
|
//# sourceMappingURL=spec.d.ts.map
|
package/dist/spec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,qBAAqB,EAE3B,MAAM,mBAAmB,CAAC;AAW3B,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAqC7D;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,SAAS,EAC7C,IAAI,EAAE,QAAQ,GAAG,IAAI,GACpB,qBAAqB,EAAE,GAAG,SAAS,CAUrC;AAED;;;;;;GAMG;AACH;wCACwC;AACxC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,GAAE,aAAa,EAAO,GAAG,MAAM,CAmCjG;AAqCD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA0D1E;AAoED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAQzD;AAmBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,iBAAiB,EAAE,EAC9B,IAAI,EAAE,eAAe,GACpB,SAAS,CA0DX;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAwBhG;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,QAAQ,CAAC,CAenB;AAyCD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GACzB,UAAU,CAAC,OAAO,aAAa,CAAC,CAElC;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GACzB;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAwBA"}
|