@acpus/runtime 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/artifacts.d.ts +30 -0
  4. package/dist/artifacts.d.ts.map +1 -0
  5. package/dist/artifacts.js +97 -0
  6. package/dist/artifacts.js.map +1 -0
  7. package/dist/client.d.ts +54 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +159 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/evaluator.d.ts +37 -0
  12. package/dist/evaluator.d.ts.map +1 -0
  13. package/dist/evaluator.js +101 -0
  14. package/dist/evaluator.js.map +1 -0
  15. package/dist/executors/agent.d.ts +74 -0
  16. package/dist/executors/agent.d.ts.map +1 -0
  17. package/dist/executors/agent.js +401 -0
  18. package/dist/executors/agent.js.map +1 -0
  19. package/dist/executors/mock-program.d.ts +24 -0
  20. package/dist/executors/mock-program.d.ts.map +1 -0
  21. package/dist/executors/mock-program.js +79 -0
  22. package/dist/executors/mock-program.js.map +1 -0
  23. package/dist/executors/program.d.ts +21 -0
  24. package/dist/executors/program.d.ts.map +1 -0
  25. package/dist/executors/program.js +178 -0
  26. package/dist/executors/program.js.map +1 -0
  27. package/dist/executors/types.d.ts +26 -0
  28. package/dist/executors/types.d.ts.map +1 -0
  29. package/dist/executors/types.js +2 -0
  30. package/dist/executors/types.js.map +1 -0
  31. package/dist/index.d.ts +18 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +25 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/interpreter.d.ts +186 -0
  36. package/dist/interpreter.d.ts.map +1 -0
  37. package/dist/interpreter.js +1500 -0
  38. package/dist/interpreter.js.map +1 -0
  39. package/dist/keys.d.ts +36 -0
  40. package/dist/keys.d.ts.map +1 -0
  41. package/dist/keys.js +59 -0
  42. package/dist/keys.js.map +1 -0
  43. package/dist/state-machine.d.ts +27 -0
  44. package/dist/state-machine.d.ts.map +1 -0
  45. package/dist/state-machine.js +87 -0
  46. package/dist/state-machine.js.map +1 -0
  47. package/dist/store.d.ts +46 -0
  48. package/dist/store.d.ts.map +1 -0
  49. package/dist/store.js +260 -0
  50. package/dist/store.js.map +1 -0
  51. package/dist/supervisor-app.d.ts +27 -0
  52. package/dist/supervisor-app.d.ts.map +1 -0
  53. package/dist/supervisor-app.js +548 -0
  54. package/dist/supervisor-app.js.map +1 -0
  55. package/dist/supervisor-discovery.d.ts +17 -0
  56. package/dist/supervisor-discovery.d.ts.map +1 -0
  57. package/dist/supervisor-discovery.js +186 -0
  58. package/dist/supervisor-discovery.js.map +1 -0
  59. package/dist/supervisor-entry.d.ts +11 -0
  60. package/dist/supervisor-entry.d.ts.map +1 -0
  61. package/dist/supervisor-entry.js +50 -0
  62. package/dist/supervisor-entry.js.map +1 -0
  63. package/dist/supervisor-lock.d.ts +26 -0
  64. package/dist/supervisor-lock.d.ts.map +1 -0
  65. package/dist/supervisor-lock.js +49 -0
  66. package/dist/supervisor-lock.js.map +1 -0
  67. package/dist/supervisor-runner.d.ts +11 -0
  68. package/dist/supervisor-runner.d.ts.map +1 -0
  69. package/dist/supervisor-runner.js +128 -0
  70. package/dist/supervisor-runner.js.map +1 -0
  71. package/dist/types.d.ts +230 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/validate-input.d.ts +27 -0
  76. package/dist/validate-input.d.ts.map +1 -0
  77. package/dist/validate-input.js +56 -0
  78. package/dist/validate-input.js.map +1 -0
  79. package/package.json +66 -0
@@ -0,0 +1,548 @@
1
+ import { Hono } from "hono";
2
+ import { WorkflowInterpreter } from "./interpreter.js";
3
+ import { InputValidationFailure } from "./validate-input.js";
4
+ import { compileWorkflow } from "@acpus/core";
5
+ import { readFileSync } from "node:fs";
6
+ import { homedir } from "node:os";
7
+ import { dirname, join, resolve } from "node:path";
8
+ /** Pattern that matches unsafe runId characters (path traversal, separators, null). */
9
+ const UNSAFE_RUN_ID = /(^|\/)\.\.?(\/|$)|[\\:\0]/;
10
+ /**
11
+ * Creates a Hono HTTP app for the acpus Run Supervisor.
12
+ *
13
+ * Note: Node keys contain "/" characters (e.g. "workflow/step-a"), which are
14
+ * incompatible with URL path segments. Node-addressed routes accept the nodeKey
15
+ * as a query parameter instead.
16
+ *
17
+ * Returns the Hono app plus control handles for the runner to query
18
+ * idle-shutdown state and inject health-overrides after listen.
19
+ */
20
+ export function createSupervisorApp(config, store, agentExecutor, programExecutor) {
21
+ const app = new Hono();
22
+ // Active interpreter instances
23
+ const interpreters = new Map();
24
+ // In-flight runToCompletion promises, keyed by runId, to prevent concurrent
25
+ // execution races during Run-level resume or retry.
26
+ const inFlightRuns = new Map();
27
+ // Mutex guard: runIds currently being resumed or retried. Prevents concurrent
28
+ // resume or retry requests from starting duplicate runToCompletion executions.
29
+ const resumingRunIds = new Set();
30
+ // Lease tracking for idle shutdown
31
+ const clientLeases = new Map();
32
+ let lastActiveAt = Date.now();
33
+ // Health overrides set by the runner after the server binds to a port
34
+ let healthStartedAt = "";
35
+ let healthEndpoint = "";
36
+ const workspaceRoot = resolve(config.workspace ?? process.cwd());
37
+ const globalWorkflowRoot = resolve(join(homedir(), ".acpus", "workflows"));
38
+ const allowedSourceRoots = [workspaceRoot, globalWorkflowRoot];
39
+ /** Refresh lease on every request with client headers. */
40
+ function refreshLease(clientId, clientKind) {
41
+ if (!clientId || !clientKind)
42
+ return;
43
+ clientLeases.set(clientId, { kind: clientKind, lastSeen: Date.now() });
44
+ lastActiveAt = Date.now();
45
+ }
46
+ /** Expire stale leases (TTL 2s). */
47
+ function expireLeases() {
48
+ const now = Date.now();
49
+ for (const [id, lease] of clientLeases) {
50
+ if (now - lease.lastSeen > 2000) {
51
+ clientLeases.delete(id);
52
+ }
53
+ }
54
+ }
55
+ /** Count of non-expired leases. */
56
+ function activeClientCount() {
57
+ expireLeases();
58
+ return clientLeases.size;
59
+ }
60
+ /** Count of Runs with status === "running". */
61
+ function runningCount() {
62
+ let count = 0;
63
+ for (const runId of store.listRunIds()) {
64
+ const meta = store.readRunMeta(runId);
65
+ if (meta?.status === "running")
66
+ count++;
67
+ }
68
+ return count;
69
+ }
70
+ /** Get the most recent active timestamp (for idle shutdown). */
71
+ function getLastActiveAt() {
72
+ expireLeases();
73
+ let maxLease = 0;
74
+ for (const lease of clientLeases.values()) {
75
+ if (lease.lastSeen > maxLease)
76
+ maxLease = lease.lastSeen;
77
+ }
78
+ return Math.max(lastActiveAt, maxLease);
79
+ }
80
+ /** Create an interpreter bound to this supervisor's store + executors. */
81
+ function newInterpreter() {
82
+ return new WorkflowInterpreter(store, agentExecutor, programExecutor, { allowedSourceRoots });
83
+ }
84
+ /**
85
+ * Interpreter for a forward-progress control action (resume or retry). When the
86
+ * supervisor has restarted (in-memory map empty) but the Run persists, lazily
87
+ * recover one and reset stale `running` nodes so the action can proceed.
88
+ * Returns `undefined` only when the Run does not exist on disk.
89
+ */
90
+ function getOrRecoverInterpreter(runId) {
91
+ const live = interpreters.get(runId);
92
+ if (live)
93
+ return live;
94
+ if (!store.hasRun(runId))
95
+ return undefined;
96
+ const recovered = newInterpreter();
97
+ recovered.recoverStaleNodes(runId);
98
+ interpreters.set(runId, recovered);
99
+ return recovered;
100
+ }
101
+ /**
102
+ * Read-only interpreter used by replay. Lazily creates one for cross-process
103
+ * access but NEVER mutates persisted state (no crash recovery). Returns
104
+ * `undefined` only when the Run does not exist on disk.
105
+ */
106
+ function getReadOnlyInterpreter(runId) {
107
+ const live = interpreters.get(runId);
108
+ if (live)
109
+ return live;
110
+ if (!store.hasRun(runId))
111
+ return undefined;
112
+ return newInterpreter();
113
+ }
114
+ /** Prune interpreters for terminal Runs from the in-memory map. */
115
+ function pruneTerminalInterpreters() {
116
+ for (const [runId] of interpreters) {
117
+ const meta = store.readRunMeta(runId);
118
+ if (meta?.status === "completed" || meta?.status === "failed" || meta?.status === "cancelled") {
119
+ interpreters.delete(runId);
120
+ }
121
+ }
122
+ }
123
+ // ─── Lease refresh middleware (runs before route handlers) ────────
124
+ app.use("*", async (c, next) => {
125
+ const clientId = c.req.header("x-acpus-client-id");
126
+ const clientKind = c.req.header("x-acpus-client-kind");
127
+ refreshLease(clientId, clientKind);
128
+ await next();
129
+ });
130
+ // ─── runId path-traversal guard ──────────────────────────────────
131
+ app.use("/runs/:runId/*", async (c, next) => {
132
+ const runId = c.req.param("runId");
133
+ if (!runId || UNSAFE_RUN_ID.test(runId)) {
134
+ return c.json({ error: "Invalid runId format" }, 400);
135
+ }
136
+ await next();
137
+ });
138
+ /** Fire-and-forget runToCompletion with proper tracking and cleanup. */
139
+ function startRunExecution(interpreter, ir, input, runId) {
140
+ const promise = interpreter.runToCompletion(ir, { input }, runId)
141
+ .catch(() => {
142
+ // runToCompletion always resolves with the RunState (never rejects
143
+ // with undefined), but the catch silences any unexpected throw.
144
+ const meta = store.readRunMeta(runId);
145
+ return meta ?? {
146
+ runId,
147
+ workflowName: "",
148
+ status: "failed",
149
+ irDigest: "",
150
+ inputDigest: "",
151
+ createdAt: "",
152
+ updatedAt: "",
153
+ runAttempt: 1
154
+ };
155
+ })
156
+ .finally(() => {
157
+ inFlightRuns.delete(runId);
158
+ pruneTerminalInterpreters();
159
+ if (runningCount() === 0)
160
+ lastActiveAt = Date.now();
161
+ });
162
+ inFlightRuns.set(runId, promise);
163
+ }
164
+ function startPersistedRunExecution(interpreter, runId) {
165
+ const ir = store.readIr(runId);
166
+ const input = store.readInput(runId);
167
+ if (ir && input) {
168
+ startRunExecution(interpreter, ir, input, runId);
169
+ }
170
+ }
171
+ /**
172
+ * Node-level retry may run for a long time. Wait one event-loop turn so
173
+ * synchronous validation errors surface as 409s, then detach once execution
174
+ * has started so interactive clients are not kept alive by the request.
175
+ */
176
+ function settleImmediate(promise) {
177
+ return Promise.race([
178
+ promise.then((value) => ({ kind: "settled", value })).catch((error) => ({ kind: "rejected", error })),
179
+ new Promise((resolve) => setImmediate(() => resolve({ kind: "pending" })))
180
+ ]);
181
+ }
182
+ function consumeDetachedControl(promise) {
183
+ void promise.catch(() => undefined);
184
+ }
185
+ // ─── Health ──────────────────────────────────────────────────────
186
+ app.get("/health", (c) => {
187
+ const health = {
188
+ ok: true,
189
+ schemaVersion: 1,
190
+ workspace: workspaceRoot,
191
+ pid: process.pid,
192
+ endpoint: healthEndpoint,
193
+ startedAt: healthStartedAt,
194
+ version: "0.1.0",
195
+ runningCount: runningCount(),
196
+ activeClients: activeClientCount()
197
+ };
198
+ return c.json(health);
199
+ });
200
+ // ─── Runs ────────────────────────────────────────────────────────
201
+ app.post("/runs", async (c) => {
202
+ const body = await c.req.json();
203
+ if (!body.spec) {
204
+ return c.json({ error: "spec is required" }, 400);
205
+ }
206
+ // Validate sourcePath is within the workspace or the global Workflow Catalog.
207
+ let sourcePath;
208
+ if (body.sourcePath) {
209
+ const resolved = resolve(body.sourcePath);
210
+ if (!isInsideAnyRoot(resolved, allowedSourceRoots)) {
211
+ return c.json({ error: "sourcePath must be within the workspace or global Workflow Catalog" }, 400);
212
+ }
213
+ sourcePath = resolved;
214
+ }
215
+ // Include resolver: resolve relative to the including file and restrict reads
216
+ // to the workspace or global Workflow Catalog roots.
217
+ const includeResolver = (includePath, fromPath) => {
218
+ const baseDir = fromPath ? dirname(resolve(fromPath)) : (sourcePath ? dirname(sourcePath) : workspaceRoot);
219
+ const resolvedInclude = resolve(baseDir, includePath);
220
+ if (!isInsideAnyRoot(resolvedInclude, allowedSourceRoots)) {
221
+ throw new Error(`Include path '${includePath}' resolves outside allowed Workflow Spec roots`);
222
+ }
223
+ return readFileSync(resolvedInclude, "utf8");
224
+ };
225
+ const result = compileWorkflow(body.spec, {
226
+ sourcePath,
227
+ includeResolver
228
+ });
229
+ if (!result.ok || !result.ir) {
230
+ return c.json({ error: "Compilation failed", diagnostics: result.diagnostics }, 400);
231
+ }
232
+ const interpreter = new WorkflowInterpreter(store, agentExecutor, programExecutor, { allowedSourceRoots });
233
+ let runState;
234
+ try {
235
+ runState = interpreter.initRun(result.ir, {
236
+ input: body.input ?? {},
237
+ workflowRef: body.workflowRef,
238
+ workflowSourcePath: sourcePath
239
+ });
240
+ }
241
+ catch (error) {
242
+ if (error instanceof InputValidationFailure) {
243
+ return c.json({ error: "Input validation failed", validationErrors: error.errors }, 400);
244
+ }
245
+ throw error;
246
+ }
247
+ interpreters.set(runState.runId, interpreter);
248
+ lastActiveAt = Date.now();
249
+ // initRun has already validated and filled defaults; read the validated
250
+ // input from the store rather than re-using the raw body.input.
251
+ const validatedInput = store.readInput(runState.runId) ?? body.input ?? {};
252
+ startRunExecution(interpreter, result.ir, validatedInput, runState.runId);
253
+ return c.json(runState, 201);
254
+ });
255
+ app.get("/runs", (c) => {
256
+ const runIds = store.listRunIds();
257
+ const summaries = [];
258
+ for (const id of runIds) {
259
+ const meta = store.readRunMeta(id);
260
+ if (meta) {
261
+ summaries.push({
262
+ runId: meta.runId,
263
+ workflowName: meta.workflowName,
264
+ workflowRef: meta.workflowRef,
265
+ workflowSourcePath: meta.workflowSourcePath,
266
+ status: meta.status,
267
+ createdAt: meta.createdAt,
268
+ updatedAt: meta.updatedAt
269
+ });
270
+ }
271
+ // Skip corrupt Run metadata deterministically (don't crash)
272
+ }
273
+ // Sort by updatedAt descending, limit to most recent 50
274
+ summaries.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
275
+ return c.json(summaries.slice(0, 50));
276
+ });
277
+ app.get("/runs/:runId", (c) => {
278
+ const runId = c.req.param("runId");
279
+ const meta = store.readRunMeta(runId);
280
+ if (!meta) {
281
+ return c.json({ error: "Run not found" }, 404);
282
+ }
283
+ const nodes = store.listNodeStates(runId);
284
+ return c.json({ ...meta, nodes });
285
+ });
286
+ app.post("/runs/clean", async (c) => {
287
+ pruneTerminalInterpreters();
288
+ const body = await c.req.json().catch(() => ({}));
289
+ const result = store.cleanTerminalRuns({ dryRun: Boolean(body.dryRun) });
290
+ if (!body.dryRun) {
291
+ for (const item of result.deleted) {
292
+ interpreters.delete(item.runId);
293
+ }
294
+ }
295
+ lastActiveAt = Date.now();
296
+ return c.json(result);
297
+ });
298
+ // ─── Nodes ───────────────────────────────────────────────────────
299
+ app.get("/runs/:runId/nodes", (c) => {
300
+ const runId = c.req.param("runId");
301
+ if (!store.hasRun(runId)) {
302
+ return c.json({ error: "Run not found" }, 404);
303
+ }
304
+ return c.json(store.listNodeStates(runId));
305
+ });
306
+ app.get("/runs/:runId/ir", (c) => {
307
+ const runId = c.req.param("runId");
308
+ if (!store.hasRun(runId)) {
309
+ return c.json({ error: "Run not found" }, 404);
310
+ }
311
+ const ir = store.readIr(runId);
312
+ if (!ir) {
313
+ return c.json({ error: "IR not found" }, 404);
314
+ }
315
+ return c.json(ir);
316
+ });
317
+ app.get("/runs/:runId/node", (c) => {
318
+ const runId = c.req.param("runId");
319
+ const nodeKey = c.req.query("key");
320
+ if (!nodeKey) {
321
+ return c.json({ error: "key query parameter is required" }, 400);
322
+ }
323
+ const state = store.readNodeState(runId, nodeKey);
324
+ if (!state) {
325
+ return c.json({ error: "Node not found" }, 404);
326
+ }
327
+ return c.json(state);
328
+ });
329
+ app.get("/runs/:runId/artifact-path", (c) => {
330
+ const runId = c.req.param("runId");
331
+ const uri = c.req.query("uri");
332
+ if (!uri) {
333
+ return c.json({ error: "uri query parameter is required" }, 400);
334
+ }
335
+ if (!store.hasRun(runId)) {
336
+ return c.json({ error: "Run not found" }, 404);
337
+ }
338
+ const absPath = store.resolveArtifactPath(uri);
339
+ if (!absPath) {
340
+ return c.json({ error: "Invalid artifact uri" }, 400);
341
+ }
342
+ return c.json({ absPath });
343
+ });
344
+ // ─── Control ────────────────────────────────────────────────────
345
+ app.post("/runs/:runId/pause", async (c) => {
346
+ const runId = c.req.param("runId");
347
+ // Run-level pause
348
+ const meta = store.readRunMeta(runId);
349
+ if (!meta)
350
+ return c.json({ error: "Run not found" }, 404);
351
+ if (meta.status !== "running")
352
+ return c.json({ error: `Cannot pause a run in state '${meta.status}'` }, 409);
353
+ const interpreter = interpreters.get(runId);
354
+ if (!interpreter)
355
+ return c.json({ error: "Run is not actively executing; pause requires an in-flight run" }, 409);
356
+ interpreter.pauseRun(runId);
357
+ const updated = store.readRunMeta(runId);
358
+ return c.json(updated);
359
+ });
360
+ app.post("/runs/:runId/resume", async (c) => {
361
+ const runId = c.req.param("runId");
362
+ // Run-level resume
363
+ if (resumingRunIds.has(runId)) {
364
+ return c.json({ error: "Run is already being resumed or retried" }, 409);
365
+ }
366
+ const meta = store.readRunMeta(runId);
367
+ if (!meta)
368
+ return c.json({ error: "Run not found" }, 404);
369
+ if (meta.status !== "paused")
370
+ return c.json({ error: `Cannot resume a run in state '${meta.status}'` }, 409);
371
+ // Wait for any in-flight runToCompletion to settle before resuming,
372
+ // preventing concurrent execution race on the same interpreter.
373
+ const inFlight = inFlightRuns.get(runId);
374
+ if (inFlight)
375
+ await inFlight;
376
+ resumingRunIds.add(runId);
377
+ try {
378
+ const interpreter = getOrRecoverInterpreter(runId);
379
+ if (!interpreter)
380
+ return c.json({ error: "Run not found" }, 404);
381
+ await interpreter.resumeRun(runId);
382
+ interpreters.set(runId, interpreter);
383
+ lastActiveAt = Date.now();
384
+ startPersistedRunExecution(interpreter, runId);
385
+ const updated = store.readRunMeta(runId);
386
+ return c.json(updated);
387
+ }
388
+ finally {
389
+ resumingRunIds.delete(runId);
390
+ }
391
+ });
392
+ app.post("/runs/:runId/cancel", async (c) => {
393
+ const runId = c.req.param("runId");
394
+ // Run-level cancel
395
+ const meta = store.readRunMeta(runId);
396
+ if (!meta)
397
+ return c.json({ error: "Run not found" }, 404);
398
+ if (meta.status !== "running" && meta.status !== "paused") {
399
+ return c.json({ error: `Cannot cancel a run in state '${meta.status}'` }, 409);
400
+ }
401
+ const interpreter = interpreters.get(runId) ?? getOrRecoverInterpreter(runId);
402
+ if (!interpreter)
403
+ return c.json({ error: "Run not found" }, 404);
404
+ interpreter.cancelRun(runId);
405
+ // Wait for in-flight runToCompletion to settle after cancel, so its catch
406
+ // block sees the "cancelled" abort intent and writes "cancelled" status
407
+ // instead of overwriting with "paused" from a prior pauseRun.
408
+ const inFlight = inFlightRuns.get(runId);
409
+ if (inFlight)
410
+ await inFlight;
411
+ pruneTerminalInterpreters();
412
+ const updated = store.readRunMeta(runId);
413
+ return c.json(updated);
414
+ });
415
+ app.post("/runs/:runId/retry", async (c) => {
416
+ const runId = c.req.param("runId");
417
+ const nodeKey = c.req.query("key");
418
+ if (nodeKey) {
419
+ const interpreter = getOrRecoverInterpreter(runId);
420
+ if (!interpreter)
421
+ return c.json({ error: "Run not found" }, 404);
422
+ const retry = interpreter.retryNode(runId, nodeKey);
423
+ const immediate = await settleImmediate(retry);
424
+ if (immediate.kind === "rejected") {
425
+ const err = immediate.error;
426
+ return c.json({ error: err instanceof Error ? err.message : String(err) }, 409);
427
+ }
428
+ if (immediate.kind === "pending")
429
+ consumeDetachedControl(retry);
430
+ lastActiveAt = Date.now();
431
+ const state = store.readNodeState(runId, nodeKey);
432
+ return c.json(state);
433
+ }
434
+ // Run-level retry
435
+ if (resumingRunIds.has(runId)) {
436
+ return c.json({ error: "Run is already being resumed or retried" }, 409);
437
+ }
438
+ const meta = store.readRunMeta(runId);
439
+ if (!meta)
440
+ return c.json({ error: "Run not found" }, 404);
441
+ if (meta.status !== "failed") {
442
+ return c.json({ error: `Cannot retry a run in state '${meta.status}'` }, 409);
443
+ }
444
+ const inFlight = inFlightRuns.get(runId);
445
+ if (inFlight)
446
+ await inFlight;
447
+ resumingRunIds.add(runId);
448
+ try {
449
+ const interpreter = getOrRecoverInterpreter(runId);
450
+ if (!interpreter)
451
+ return c.json({ error: "Run not found" }, 404);
452
+ interpreter.retryRun(runId);
453
+ interpreters.set(runId, interpreter);
454
+ lastActiveAt = Date.now();
455
+ startPersistedRunExecution(interpreter, runId);
456
+ const updated = store.readRunMeta(runId);
457
+ return c.json(updated);
458
+ }
459
+ finally {
460
+ resumingRunIds.delete(runId);
461
+ }
462
+ });
463
+ // ─── Replay ──────────────────────────────────────────────────────
464
+ app.post("/runs/:runId/replay", (c) => {
465
+ const runId = c.req.param("runId");
466
+ const interpreter = getReadOnlyInterpreter(runId);
467
+ if (!interpreter)
468
+ return c.json({ error: "Run not found" }, 404);
469
+ const result = interpreter.replay(runId);
470
+ return c.json(result);
471
+ });
472
+ // ─── Approval signal ─────────────────────────────────────────────
473
+ //
474
+ // Deliver a human-in-the-loop decision to an Approval Gate that is currently
475
+ // `awaiting`. Node-addressed only (`?key=` required). The resolver lives in
476
+ // the in-memory interpreter, so a live in-flight run is required (409
477
+ // otherwise).
478
+ app.post("/runs/:runId/signal", async (c) => {
479
+ const runId = c.req.param("runId");
480
+ const nodeKey = c.req.query("key");
481
+ if (!nodeKey) {
482
+ return c.json({ error: "key query parameter is required (approval signals are node-level)" }, 400);
483
+ }
484
+ const body = await c.req
485
+ .json()
486
+ .catch(() => ({}));
487
+ if (body.kind !== "approval") {
488
+ return c.json({ error: `Unsupported signal kind '${body.kind ?? ""}'; only 'approval' is supported` }, 400);
489
+ }
490
+ if (typeof body.approved !== "boolean") {
491
+ return c.json({ error: "approved (boolean) is required" }, 400);
492
+ }
493
+ const interpreter = interpreters.get(runId);
494
+ if (!interpreter) {
495
+ return store.hasRun(runId)
496
+ ? c.json({ error: "Run is not actively executing; signal requires an in-flight run" }, 409)
497
+ : c.json({ error: "Run not found" }, 404);
498
+ }
499
+ try {
500
+ interpreter.submitApproval(runId, nodeKey, body.approved);
501
+ }
502
+ catch (err) {
503
+ return c.json({ error: err instanceof Error ? err.message : String(err) }, 409);
504
+ }
505
+ // submitApproval resolves the in-memory promise; the awaiting → completed
506
+ // write happens in the executeNode continuation on a later microtask. Wait
507
+ // briefly for the node to leave `awaiting` so we return the settled state.
508
+ let state = store.readNodeState(runId, nodeKey);
509
+ for (let i = 0; i < 100 && state?.state === "awaiting"; i++) {
510
+ await new Promise((r) => setTimeout(r, 5));
511
+ state = store.readNodeState(runId, nodeKey);
512
+ }
513
+ return c.json(state);
514
+ });
515
+ // ─── Output & Artifacts ──────────────────────────────────────────
516
+ app.get("/runs/:runId/output", (c) => {
517
+ const runId = c.req.param("runId");
518
+ const meta = store.readRunMeta(runId);
519
+ if (!meta)
520
+ return c.json({ error: "Run not found" }, 404);
521
+ const nodes = store.listNodeStates(runId);
522
+ const output = {};
523
+ for (const node of nodes) {
524
+ if (node.state === "completed" && node.output !== undefined) {
525
+ output[node.nodeId] = node.output;
526
+ }
527
+ }
528
+ return c.json({ status: meta.status, output });
529
+ });
530
+ return {
531
+ app,
532
+ /** Expose for the runner to read idle-shutdown state. */
533
+ getLastActiveAt: () => getLastActiveAt(),
534
+ /** Expose for the runner to check how many Runs are still active. */
535
+ runningCount: () => runningCount(),
536
+ /** Expose for the runner to write the startedAt and endpoint after listen. */
537
+ setHealthOverrides: (overrides) => {
538
+ if (overrides.startedAt)
539
+ healthStartedAt = overrides.startedAt;
540
+ if (overrides.endpoint)
541
+ healthEndpoint = overrides.endpoint;
542
+ }
543
+ };
544
+ }
545
+ function isInsideAnyRoot(path, roots) {
546
+ return roots.some((root) => path === root || path.startsWith(root + "/"));
547
+ }
548
+ //# sourceMappingURL=supervisor-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor-app.js","sourceRoot":"","sources":["../src/supervisor-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,uFAAuF;AACvF,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAwB,EACxB,KAAe,EACf,aAA8B,EAC9B,eAAgC;IAEhC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,+BAA+B;IAC/B,MAAM,YAAY,GAAG,IAAI,GAAG,EAA+B,CAAC;IAE5D,4EAA4E;IAC5E,oDAAoD;IACpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkD,CAAC;IAE/E,8EAA8E;IAC9E,+EAA+E;IAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,mCAAmC;IACnC,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8C,CAAC;IAC3E,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE9B,sEAAsE;IACtE,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3E,MAAM,kBAAkB,GAAG,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;IAE/D,0DAA0D;IAC1D,SAAS,YAAY,CAAC,QAA4B,EAAE,UAA8B;QAChF,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU;YAAE,OAAO;QACrC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvE,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,oCAAoC;IACpC,SAAS,YAAY;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;gBAChC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,SAAS,iBAAiB;QACxB,YAAY,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,+CAA+C;IAC/C,SAAS,YAAY;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;gBAAE,KAAK,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gEAAgE;IAChE,SAAS,eAAe;QACtB,YAAY,EAAE,CAAC;QACf,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,QAAQ,GAAG,QAAQ;gBAAE,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,0EAA0E;IAC1E,SAAS,cAAc;QACrB,OAAO,IAAI,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAChG,CAAC;IAED;;;;;OAKG;IACH,SAAS,uBAAuB,CAAC,KAAa;QAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;QACnC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACnC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,SAAS,sBAAsB,CAAC,KAAa;QAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,mEAAmE;IACnE,SAAS,yBAAyB;QAChC,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,MAAM,KAAK,WAAW,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC9F,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,qEAAqE;IAErE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACvD,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACnC,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,SAAS,iBAAiB,CACxB,WAAgC,EAChC,EAAiC,EACjC,KAA8B,EAC9B,KAAa;QAEb,MAAM,OAAO,GAAG,WAAW,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC;aAC9D,KAAK,CAAC,GAAkC,EAAE;YACzC,mEAAmE;YACnE,gEAAgE;YAChE,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,OAAO,IAAI,IAAI;gBACb,KAAK;gBACL,YAAY,EAAE,EAAE;gBAChB,MAAM,EAAE,QAAiB;gBACzB,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,EAAE;gBACb,UAAU,EAAE,CAAC;aACd,CAAC;QACJ,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,yBAAyB,EAAE,CAAC;YAC5B,IAAI,YAAY,EAAE,KAAK,CAAC;gBAAE,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QACL,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,0BAA0B,CAAC,WAAgC,EAAE,KAAa;QACjF,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;YAChB,iBAAiB,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAOD;;;;OAIG;IACH,SAAS,eAAe,CAAI,OAAmB;QAC7C,OAAO,OAAO,CAAC,IAAI,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;YACvH,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;SAChG,CAAC,CAAC;IACL,CAAC;IAED,SAAS,sBAAsB,CAAC,OAAyB;QACvD,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,oEAAoE;IAEpE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,MAAM,GAAqB;YAC/B,EAAE,EAAE,IAAI;YACR,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,aAAa;YACxB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,YAAY,EAAE;YAC5B,aAAa,EAAE,iBAAiB,EAAE;SACnC,CAAC;QACF,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAiG,CAAC;QAC/H,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QAED,8EAA8E;QAC9E,IAAI,UAA8B,CAAC;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oEAAoE,EAAE,EAAE,GAAG,CAAC,CAAC;YACtG,CAAC;YACD,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;QAED,8EAA8E;QAC9E,qDAAqD;QACrD,MAAM,eAAe,GAAG,CAAC,WAAmB,EAAE,QAAiB,EAAU,EAAE;YACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAC3G,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACtD,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,iBAAiB,WAAW,gDAAgD,CAAC,CAAC;YAChG,CAAC;YACD,OAAO,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;YACxC,UAAU;YACV,eAAe;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3G,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE;gBACxC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,kBAAkB,EAAE,UAAU;aAC/B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YAC3F,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9C,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,wEAAwE;QACxE,gEAAgE;QAChE,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3E,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE1E,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,IAAI,EAAE,CAAC;gBACT,SAAS,CAAC,IAAI,CAAC;oBACb,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;oBAC3C,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,4DAA4D;QAC9D,CAAC;QACD,wDAAwD;QACxD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClC,yBAAyB,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAwB,CAAC,KAAK,CAAC,GAAyB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,mEAAmE;IAEnE,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,kBAAkB;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7G,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gEAAgE,EAAE,EAAE,GAAG,CAAC,CAAC;QAClH,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,mBAAmB;QACnB,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7G,oEAAoE;QACpE,gEAAgE;QAChE,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;YACjE,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACrC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,0BAA0B,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,mBAAmB;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7B,0EAA0E;QAC1E,wEAAwE;QACxE,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC;QAC7B,yBAAyB,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC;gBAC5B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;gBAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAChE,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,kBAAkB;QAClB,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;YACjE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC5B,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACrC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,0BAA0B,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,oEAAoE;IACpE,EAAE;IACF,6EAA6E;IAC7E,4EAA4E;IAC5E,sEAAsE;IACtE,cAAc;IAEd,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mEAAmE,EAAE,EAAE,GAAG,CAAC,CAAC;QACrG,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG;aACrB,IAAI,EAAyC;aAC7C,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAA0C,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,IAAI,CAAC,IAAI,IAAI,EAAE,iCAAiC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;gBACxB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iEAAiE,EAAE,EAAE,GAAG,CAAC;gBAC3F,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC;YACH,WAAW,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC;QACD,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,IAAI,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,KAAK,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG;QACH,yDAAyD;QACzD,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE;QACxC,qEAAqE;QACrE,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;QAClC,8EAA8E;QAC9E,kBAAkB,EAAE,CAAC,SAAoD,EAAE,EAAE;YAC3E,IAAI,SAAS,CAAC,SAAS;gBAAE,eAAe,GAAG,SAAS,CAAC,SAAS,CAAC;YAC/D,IAAI,SAAS,CAAC,QAAQ;gBAAE,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC9D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAAe;IACpD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Supervisor discovery and lazy ensure.
3
+ *
4
+ * `ensureWorkspaceSupervisor()` is the single entry point for CLI commands
5
+ * that need a running supervisor. It reads metadata, health-checks an existing
6
+ * supervisor, and spawns a new one if none is alive — with a lock to
7
+ * serialize concurrent ensure calls.
8
+ */
9
+ import type { SupervisorMetadata } from "./types.js";
10
+ /**
11
+ * Ensure a Run Supervisor is running for the given workspace.
12
+ * Returns its metadata on success, throws on failure.
13
+ */
14
+ export declare function ensureWorkspaceSupervisor(workspace: string, options?: {
15
+ idleTimeoutMs?: number;
16
+ }): Promise<SupervisorMetadata>;
17
+ //# sourceMappingURL=supervisor-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor-discovery.d.ts","sourceRoot":"","sources":["../src/supervisor-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAgBrD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC,OAAO,CAAC,kBAAkB,CAAC,CAmC7B"}