@codetreker/daynight 0.25.2 → 0.26.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 (181) hide show
  1. package/README.md +116 -8
  2. package/config.example.yml +3 -0
  3. package/dist/api/client.js +2 -2
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/parse.js +14 -2
  6. package/dist/api/parse.js.map +1 -1
  7. package/dist/api/types.d.ts +4 -1
  8. package/dist/api/worker-mode.d.ts +6 -0
  9. package/dist/api/worker-mode.js +14 -0
  10. package/dist/api/worker-mode.js.map +1 -0
  11. package/dist/cli/commands.js +2 -0
  12. package/dist/cli/commands.js.map +1 -1
  13. package/dist/commands/controller/command-controls.d.ts +4 -0
  14. package/dist/commands/controller/command-controls.js +33 -0
  15. package/dist/commands/controller/command-controls.js.map +1 -0
  16. package/dist/commands/controller/definition.d.ts +3 -0
  17. package/dist/commands/controller/definition.js +22 -0
  18. package/dist/commands/controller/definition.js.map +1 -0
  19. package/dist/commands/controller/independent.d.ts +3 -0
  20. package/dist/commands/controller/independent.js +344 -0
  21. package/dist/commands/controller/independent.js.map +1 -0
  22. package/dist/commands/controller/index.d.ts +12 -0
  23. package/dist/commands/controller/index.js +73 -0
  24. package/dist/commands/controller/index.js.map +1 -0
  25. package/dist/commands/controller/launch-ticket.d.ts +49 -0
  26. package/dist/commands/controller/launch-ticket.js +99 -0
  27. package/dist/commands/controller/launch-ticket.js.map +1 -0
  28. package/dist/commands/controller/lifecycle-store.d.ts +84 -0
  29. package/dist/commands/controller/lifecycle-store.js +278 -0
  30. package/dist/commands/controller/lifecycle-store.js.map +1 -0
  31. package/dist/commands/controller/local-client.d.ts +44 -0
  32. package/dist/commands/controller/local-client.js +75 -0
  33. package/dist/commands/controller/local-client.js.map +1 -0
  34. package/dist/commands/controller/local-content.d.ts +23 -0
  35. package/dist/commands/controller/local-content.js +103 -0
  36. package/dist/commands/controller/local-content.js.map +1 -0
  37. package/dist/commands/controller/process-proof.d.ts +13 -0
  38. package/dist/commands/controller/process-proof.js +121 -0
  39. package/dist/commands/controller/process-proof.js.map +1 -0
  40. package/dist/commands/controller/providers/claude.d.ts +2 -0
  41. package/dist/commands/controller/providers/claude.js +470 -0
  42. package/dist/commands/controller/providers/claude.js.map +1 -0
  43. package/dist/commands/controller/providers/codex.d.ts +2 -0
  44. package/dist/commands/controller/providers/codex.js +254 -0
  45. package/dist/commands/controller/providers/codex.js.map +1 -0
  46. package/dist/commands/controller/providers/controls-claude.d.ts +26 -0
  47. package/dist/commands/controller/providers/controls-claude.js +138 -0
  48. package/dist/commands/controller/providers/controls-claude.js.map +1 -0
  49. package/dist/commands/controller/providers/controls-codex.d.ts +38 -0
  50. package/dist/commands/controller/providers/controls-codex.js +199 -0
  51. package/dist/commands/controller/providers/controls-codex.js.map +1 -0
  52. package/dist/commands/controller/providers/controls-copilot.d.ts +20 -0
  53. package/dist/commands/controller/providers/controls-copilot.js +143 -0
  54. package/dist/commands/controller/providers/controls-copilot.js.map +1 -0
  55. package/dist/commands/controller/providers/controls.d.ts +21 -0
  56. package/dist/commands/controller/providers/controls.js +53 -0
  57. package/dist/commands/controller/providers/controls.js.map +1 -0
  58. package/dist/commands/controller/providers/copilot-interactions.d.ts +47 -0
  59. package/dist/commands/controller/providers/copilot-interactions.js +295 -0
  60. package/dist/commands/controller/providers/copilot-interactions.js.map +1 -0
  61. package/dist/commands/controller/providers/copilot-projection.d.ts +11 -0
  62. package/dist/commands/controller/providers/copilot-projection.js +93 -0
  63. package/dist/commands/controller/providers/copilot-projection.js.map +1 -0
  64. package/dist/commands/controller/providers/copilot-runtime.d.ts +9 -0
  65. package/dist/commands/controller/providers/copilot-runtime.js +127 -0
  66. package/dist/commands/controller/providers/copilot-runtime.js.map +1 -0
  67. package/dist/commands/controller/providers/copilot.d.ts +2 -0
  68. package/dist/commands/controller/providers/copilot.js +309 -0
  69. package/dist/commands/controller/providers/copilot.js.map +1 -0
  70. package/dist/commands/controller/providers/interactions.d.ts +3 -0
  71. package/dist/commands/controller/providers/interactions.js +79 -0
  72. package/dist/commands/controller/providers/interactions.js.map +1 -0
  73. package/dist/commands/controller/providers/native-rpc.d.ts +28 -0
  74. package/dist/commands/controller/providers/native-rpc.js +85 -0
  75. package/dist/commands/controller/providers/native-rpc.js.map +1 -0
  76. package/dist/commands/controller/providers/projection.d.ts +23 -0
  77. package/dist/commands/controller/providers/projection.js +99 -0
  78. package/dist/commands/controller/providers/projection.js.map +1 -0
  79. package/dist/commands/controller/providers/turns.d.ts +7 -0
  80. package/dist/commands/controller/providers/turns.js +21 -0
  81. package/dist/commands/controller/providers/turns.js.map +1 -0
  82. package/dist/commands/controller/providers/types.d.ts +44 -0
  83. package/dist/commands/controller/providers/types.js +2 -0
  84. package/dist/commands/controller/providers/types.js.map +1 -0
  85. package/dist/commands/controller/recovery.d.ts +6 -0
  86. package/dist/commands/controller/recovery.js +22 -0
  87. package/dist/commands/controller/recovery.js.map +1 -0
  88. package/dist/commands/controller/relay.d.ts +18 -0
  89. package/dist/commands/controller/relay.js +299 -0
  90. package/dist/commands/controller/relay.js.map +1 -0
  91. package/dist/commands/controller/resume.d.ts +18 -0
  92. package/dist/commands/controller/resume.js +193 -0
  93. package/dist/commands/controller/resume.js.map +1 -0
  94. package/dist/commands/controller/runtime.d.ts +5 -0
  95. package/dist/commands/controller/runtime.js +455 -0
  96. package/dist/commands/controller/runtime.js.map +1 -0
  97. package/dist/commands/controller/windows-job.d.ts +3 -0
  98. package/dist/commands/controller/windows-job.js +59 -0
  99. package/dist/commands/controller/windows-job.js.map +1 -0
  100. package/dist/commands/controller/wire-display.d.ts +5 -0
  101. package/dist/commands/controller/wire-display.js +11 -0
  102. package/dist/commands/controller/wire-display.js.map +1 -0
  103. package/dist/commands/skill/skills/using-daynight/SKILL.md +24 -20
  104. package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +16 -10
  105. package/dist/commands/skill/skills/using-daynight/references/create-task.md +40 -39
  106. package/dist/commands/skill/skills/using-daynight/references/goal.md +40 -29
  107. package/dist/commands/skill/skills/using-daynight/references/handbook.md +4 -3
  108. package/dist/commands/skill/skills/using-daynight/references/handoff.md +3 -0
  109. package/dist/commands/skill/skills/using-daynight/references/run-task.md +3 -3
  110. package/dist/commands/skill/skills/using-daynight/references/task-content.md +96 -51
  111. package/dist/commands/skill/skills/using-daynight/references/task-execution.md +28 -22
  112. package/dist/commands/worker/backend.d.ts +7 -0
  113. package/dist/commands/worker/backend.js +7 -0
  114. package/dist/commands/worker/backend.js.map +1 -0
  115. package/dist/commands/worker/backends/grant-renewal.d.ts +13 -0
  116. package/dist/commands/worker/backends/grant-renewal.js +42 -0
  117. package/dist/commands/worker/backends/grant-renewal.js.map +1 -0
  118. package/dist/commands/worker/backends/session-api.d.ts +66 -0
  119. package/dist/commands/worker/backends/session-api.js +84 -0
  120. package/dist/commands/worker/backends/session-api.js.map +1 -0
  121. package/dist/commands/worker/backends/web-process.d.ts +79 -0
  122. package/dist/commands/worker/backends/web-process.js +156 -0
  123. package/dist/commands/worker/backends/web-process.js.map +1 -0
  124. package/dist/commands/worker/backends/web-store.d.ts +49 -0
  125. package/dist/commands/worker/backends/web-store.js +323 -0
  126. package/dist/commands/worker/backends/web-store.js.map +1 -0
  127. package/dist/commands/worker/backends/web-types.d.ts +83 -0
  128. package/dist/commands/worker/backends/web-types.js +3 -0
  129. package/dist/commands/worker/backends/web-types.js.map +1 -0
  130. package/dist/commands/worker/backends/web.d.ts +26 -0
  131. package/dist/commands/worker/backends/web.js +178 -0
  132. package/dist/commands/worker/backends/web.js.map +1 -0
  133. package/dist/commands/worker/config.js +12 -5
  134. package/dist/commands/worker/config.js.map +1 -1
  135. package/dist/commands/worker/control.d.ts +2 -0
  136. package/dist/commands/worker/control.js +11 -4
  137. package/dist/commands/worker/control.js.map +1 -1
  138. package/dist/commands/worker/coordinator.d.ts +7 -0
  139. package/dist/commands/worker/coordinator.js +138 -19
  140. package/dist/commands/worker/coordinator.js.map +1 -1
  141. package/dist/commands/worker/herdr/agents.js +11 -8
  142. package/dist/commands/worker/herdr/agents.js.map +1 -1
  143. package/dist/commands/worker/herdr/arguments.js +10 -5
  144. package/dist/commands/worker/herdr/arguments.js.map +1 -1
  145. package/dist/commands/worker/herdr/claude-input.d.ts +2 -0
  146. package/dist/commands/worker/herdr/claude-input.js +20 -0
  147. package/dist/commands/worker/herdr/claude-input.js.map +1 -0
  148. package/dist/commands/worker/herdr/instance.js +1 -1
  149. package/dist/commands/worker/herdr/instance.js.map +1 -1
  150. package/dist/commands/worker/herdr/preflight.d.ts +1 -1
  151. package/dist/commands/worker/herdr/preflight.js +31 -10
  152. package/dist/commands/worker/herdr/preflight.js.map +1 -1
  153. package/dist/commands/worker/herdr.js +5 -1
  154. package/dist/commands/worker/herdr.js.map +1 -1
  155. package/dist/commands/worker/prompts.js +5 -1
  156. package/dist/commands/worker/prompts.js.map +1 -1
  157. package/dist/commands/worker/repositories.js +2 -2
  158. package/dist/commands/worker/repositories.js.map +1 -1
  159. package/dist/commands/worker/runtime.js +62 -10
  160. package/dist/commands/worker/runtime.js.map +1 -1
  161. package/dist/commands/worker/setup-environment.d.ts +2 -1
  162. package/dist/commands/worker/setup-environment.js +10 -4
  163. package/dist/commands/worker/setup-environment.js.map +1 -1
  164. package/dist/commands/worker/setup.js +5 -5
  165. package/dist/commands/worker/setup.js.map +1 -1
  166. package/dist/commands/worker/store.d.ts +2 -1
  167. package/dist/commands/worker/store.js +19 -9
  168. package/dist/commands/worker/store.js.map +1 -1
  169. package/dist/commands/worker/types.d.ts +4 -1
  170. package/dist/commands/worker/worktrees.js +9 -6
  171. package/dist/commands/worker/worktrees.js.map +1 -1
  172. package/dist/session/controller-protocol.d.ts +245 -0
  173. package/dist/session/controller-protocol.js +218 -0
  174. package/dist/session/controller-protocol.js.map +1 -0
  175. package/dist/session/controls.d.ts +28 -0
  176. package/dist/session/controls.js +37 -0
  177. package/dist/session/controls.js.map +1 -0
  178. package/dist/session/protocol.d.ts +290 -0
  179. package/dist/session/protocol.js +307 -0
  180. package/dist/session/protocol.js.map +1 -0
  181. package/package.json +7 -2
@@ -0,0 +1,99 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { chmod, mkdir, open, readFile, lstat, link, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { canonicalId } from "../../api/parse.js";
5
+ import { normalizeServerUrl } from "../../config/server.js";
6
+ import { sessionBinding } from "../../session/protocol.js";
7
+ const uuid = (value) => { if (typeof value !== "string" || canonicalId(value) !== value)
8
+ throw new Error("Controller identity must be a canonical UUID."); return value; };
9
+ export const controllerExecutionDirectory = (home, executionId) => path.join(home, ".daynight", "controller", "executions", uuid(executionId));
10
+ export const controllerTicketPath = (home, launchId) => path.join(home, ".daynight", "controller", "launches", `${uuid(launchId)}.json`);
11
+ const canonicalPayload = (value) => {
12
+ if (Array.isArray(value))
13
+ return value.map(canonicalPayload);
14
+ if (value !== null && typeof value === "object")
15
+ return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([key, item]) => [key, canonicalPayload(item)]));
16
+ return value;
17
+ };
18
+ export const controllerPayloadHash = (value) => createHash("sha256").update(JSON.stringify(canonicalPayload(value))).digest("hex");
19
+ export const parseLaunchTicket = (value) => {
20
+ if (typeof value !== "object" || value === null || Array.isArray(value))
21
+ throw new Error("Controller ticket must be an object.");
22
+ const data = value;
23
+ const binding = sessionBinding(data);
24
+ const test = binding.testExecutionId !== undefined;
25
+ const ids = ["launchId", "executionId", "controllerId", "controllerInstanceId", "sessionId", ...(test ? ["testExecutionId", "ownerUserId"] : ["projectId", "taskId", "claimId", "workerId", "worktreeId", "userId"]), "initialOperationId"];
26
+ const keys = ["schemaVersion", ...ids, ...(test ? ["initialInput"] : []), "executionGeneration", "serverOrigin", "provider", "cwd", "nativeHome", "configuration", "initialPrompt", "resumeNativeSessionId", "credentialFile", "ipcEndpoint", "ipcSecret", "createdAt"];
27
+ if (Object.keys(data).length !== keys.length || keys.some((key) => !Object.hasOwn(data, key)))
28
+ throw new Error("Controller ticket has invalid fields.");
29
+ for (const key of ids)
30
+ uuid(data[key]);
31
+ if (data.schemaVersion !== 1 || typeof data.executionGeneration !== "string" || !/^[1-9][0-9]{0,18}$/.test(data.executionGeneration) || BigInt(data.executionGeneration) > 9223372036854775807n)
32
+ throw new Error("Controller ticket version or execution generation is invalid.");
33
+ if (typeof data.serverOrigin !== "string" || normalizeServerUrl(data.serverOrigin) !== data.serverOrigin)
34
+ throw new Error("Controller ticket server origin is invalid.");
35
+ if (data.provider !== "codex" && data.provider !== "claude" && data.provider !== "copilot")
36
+ throw new Error("Controller ticket provider is invalid.");
37
+ for (const key of ["cwd", "nativeHome", "credentialFile"])
38
+ if (typeof data[key] !== "string" || !path.isAbsolute(data[key]) || /[\0\r\n]/.test(data[key]))
39
+ throw new Error(`Controller ticket ${key} must be absolute.`);
40
+ if (typeof data.ipcEndpoint !== "string" || /[\0\r\n]/.test(data.ipcEndpoint) || !(path.isAbsolute(data.ipcEndpoint) || data.ipcEndpoint.startsWith("\\\\.\\pipe\\")))
41
+ throw new Error("Controller IPC endpoint is invalid.");
42
+ if (typeof data.ipcSecret !== "string" || !/^[a-f0-9]{64}$/.test(data.ipcSecret))
43
+ throw new Error("Controller IPC authentication is invalid.");
44
+ if (typeof data.initialPrompt !== "string" || (!(test && data.initialInput === "none") && data.initialPrompt.trim() === "") || !data.initialPrompt.isWellFormed() || Buffer.byteLength(data.initialPrompt) > 4 * 1024 * 1024)
45
+ throw new Error("Controller initial prompt is invalid or too large.");
46
+ if (test && (data.initialInput !== "none" && data.initialInput !== "prompt" || data.initialInput === "none" && data.initialPrompt !== "" || data.resumeNativeSessionId !== null && data.initialInput !== "none"))
47
+ throw new Error("Test controller initial input or resume binding is invalid.");
48
+ if (data.resumeNativeSessionId !== null)
49
+ uuid(data.resumeNativeSessionId);
50
+ if (typeof data.createdAt !== "string" || !Number.isFinite(Date.parse(data.createdAt)))
51
+ throw new Error("Controller creation time is invalid.");
52
+ const config = data.configuration;
53
+ if (typeof config !== "object" || config === null || Array.isArray(config))
54
+ throw new Error("Controller frozen configuration is missing.");
55
+ const fields = config;
56
+ if (Object.keys(fields).sort().join() !== ["agent", "agentControlMode", "args", "model", "recoveryLimit"].sort().join() || fields.agent !== data.provider || fields.agentControlMode !== "web" || !Array.isArray(fields.args) || fields.args.some((arg) => typeof arg !== "string" || /[\0\r\n]/.test(arg)) || !(fields.model === null || typeof fields.model === "string" && fields.model.trim() !== "") || !Number.isSafeInteger(fields.recoveryLimit) || fields.recoveryLimit < 0)
57
+ throw new Error("Controller frozen configuration is invalid.");
58
+ return value;
59
+ };
60
+ export const readLaunchTicket = async (home, launchId) => {
61
+ const file = controllerTicketPath(home, launchId);
62
+ const metadata = await lstat(file);
63
+ if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > 5 * 1024 * 1024 || (process.platform !== "win32" && (metadata.mode & 0o077) !== 0))
64
+ throw new Error("Controller ticket must be a private regular file.");
65
+ const ticket = parseLaunchTicket(JSON.parse(await readFile(file, "utf8")));
66
+ if (ticket.launchId !== launchId)
67
+ throw new Error("Controller launch ticket identity mismatch.");
68
+ return ticket;
69
+ };
70
+ export const writeLaunchTicket = async (home, ticket) => {
71
+ parseLaunchTicket(ticket);
72
+ const filename = controllerTicketPath(home, ticket.launchId);
73
+ const directory = path.dirname(filename);
74
+ await mkdir(directory, { recursive: true, mode: 0o700 });
75
+ await chmod(directory, 0o700);
76
+ const temporary = `${filename}.${randomUUID()}.tmp`;
77
+ const file = await open(temporary, "wx", 0o600);
78
+ try {
79
+ await file.writeFile(`${JSON.stringify(ticket)}\n`);
80
+ await file.sync();
81
+ }
82
+ finally {
83
+ await file.close();
84
+ }
85
+ try {
86
+ await link(temporary, filename);
87
+ }
88
+ catch (error) {
89
+ if (!(error instanceof Error && "code" in error && error.code === "EEXIST"))
90
+ throw error;
91
+ if (JSON.stringify(await readLaunchTicket(home, ticket.launchId)) !== JSON.stringify(ticket))
92
+ throw new Error("The launch identity is already bound to a different ticket.");
93
+ }
94
+ finally {
95
+ await unlink(temporary);
96
+ }
97
+ return filename;
98
+ };
99
+ //# sourceMappingURL=launch-ticket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-ticket.js","sourceRoot":"","sources":["../../../src/commands/controller/launch-ticket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { SessionControls } from "../../session/controls.js";
2
+ import { type SessionBinding, type InitialInputState, type OperationState, type SessionCapabilities } from "../../session/protocol.js";
3
+ import { type ControllerLaunchTicket } from "./launch-ticket.js";
4
+ import { type SourceTimelineEntry } from "../../session/controller-protocol.js";
5
+ import { type ProcessProof } from "./process-proof.js";
6
+ export type ControllerSnapshot = SessionBinding & {
7
+ executionId: string;
8
+ sessionId: string;
9
+ executionGeneration: string;
10
+ controllerInstanceId: string;
11
+ lifecycle: "starting" | "ready" | "working" | "stopping" | "stopped" | "paused" | "failed";
12
+ nativeSessionId: string | null;
13
+ initialInputState: InitialInputState;
14
+ activity: "initializing" | "idle" | "working" | "waiting_input" | "stopped" | "unknown";
15
+ currentTurnId: string | null;
16
+ capabilities: SessionCapabilities;
17
+ controls?: SessionControls;
18
+ controlsRevisionFloor?: string;
19
+ turnStartedAt?: string | null;
20
+ controllerProcess: ProcessProof | null;
21
+ nativeProcesses: readonly ProcessProof[];
22
+ nativeStopped: boolean;
23
+ stoppedAt: string | null;
24
+ error: string | null;
25
+ };
26
+ export type ControllerOperation = {
27
+ executionGeneration?: string;
28
+ operationId: string;
29
+ kind: "initial" | "cleanup" | "send_message" | "cancel" | "interaction_response" | "update_setting" | "execute_command" | "refresh_controls";
30
+ payload: unknown;
31
+ payloadHash: string;
32
+ state: OperationState;
33
+ result: unknown;
34
+ error: string | null;
35
+ createdAt: number;
36
+ updatedAt: number;
37
+ };
38
+ export type ControllerOutboxEvent = {
39
+ sequence: string;
40
+ payload: unknown;
41
+ };
42
+ export declare const openControllerLifecycleStore: (file: string, ticket: ControllerLaunchTicket, options?: {
43
+ maxOutboxBytes?: number;
44
+ contentOwnedLocally?: boolean;
45
+ }) => {
46
+ readTimeline(query: import("./local-content.js").LocalTimelineQuery): Omit<import("../../session/controller-protocol.js").TimelinePage, "sessionId" | "lastEventSeq"> & {
47
+ kind: "timeline";
48
+ };
49
+ pendingInteractions(): import("../../session/protocol.js").TimelineEntry[];
50
+ saveResource(resource: import("../../session/protocol.js").SessionResource, content?: Uint8Array): void;
51
+ readResource(resourceId: string, offset: string, limit: number): {
52
+ kind: "resource";
53
+ resource: import("../../session/protocol.js").SessionResource;
54
+ offset: string;
55
+ data: string;
56
+ eof: boolean;
57
+ };
58
+ getSnapshot: () => ControllerSnapshot;
59
+ patchSnapshot: (patch: Partial<Omit<ControllerSnapshot, "executionId" | "claimId" | "testExecutionId" | "sessionId" | "executionGeneration" | "controllerInstanceId">>) => ControllerSnapshot;
60
+ getOperation: (operationId: string) => ControllerOperation | null;
61
+ assertInputCapacity: () => void;
62
+ getSourceFloor: () => string;
63
+ getLastSourceSequence: () => string;
64
+ markProjectionGap: (reason: string) => void;
65
+ drainProjectionGap: () => ControllerOutboxEvent | null;
66
+ listOperations: () => ControllerOperation[];
67
+ listUnacknowledgedOperations: (limit?: number, afterOperationId?: string) => ControllerOperation[];
68
+ markOperationAcknowledged: (id: string) => void;
69
+ getLastAcknowledgedSequence: () => string;
70
+ projectTimeline: (entry: SourceTimelineEntry) => ControllerOutboxEvent | null;
71
+ prepareOperation: (input: Pick<ControllerOperation, "operationId" | "kind" | "payload">) => ControllerOperation;
72
+ markDispatching: (operationId: string) => ControllerOperation;
73
+ recordOperation: (operationId: string, state: OperationState, result?: unknown, error?: string | null) => ControllerOperation;
74
+ appendEvent: (payload: unknown) => ControllerOutboxEvent;
75
+ pendingEvents: (limit?: number) => ControllerOutboxEvent[];
76
+ acknowledgeEvents: (sequence: string) => void;
77
+ close: () => void;
78
+ };
79
+ export type ControllerLifecycleStore = ReturnType<typeof openControllerLifecycleStore>;
80
+ /** Read-only recovery never acquires the native writer lease. */
81
+ export declare const readControllerSnapshot: (file: string) => ControllerSnapshot | null;
82
+ /** Only an independent worker may commit complete process-tree stop after the writer exits. */
83
+ export declare const recordStoppedControllerGeneration: (file: string, ticket: ControllerLaunchTicket) => Promise<ControllerSnapshot>;
84
+ export declare const readControllerOperation: (file: string, operationId: string) => ControllerOperation | null;
@@ -0,0 +1,278 @@
1
+ import { sessionDisplayEntry } from "./wire-display.js";
2
+ import Database from "better-sqlite3";
3
+ import { createLocalSessionContent } from "./local-content.js";
4
+ import { chmodSync } from "node:fs";
5
+ import { sessionBinding } from "../../session/protocol.js";
6
+ import { controllerPayloadHash, parseLaunchTicket } from "./launch-ticket.js";
7
+ import { parseSourceEvent } from "../../session/controller-protocol.js";
8
+ import { confirmControllerProcessesStopped } from "./process-proof.js";
9
+ const json = (value) => JSON.parse(String(value));
10
+ const validSequence = (value) => { if (!/^(0|[1-9][0-9]{0,18})$/.test(value) || BigInt(value) > 9223372036854775807n)
11
+ throw new Error("Invalid controller outbox sequence."); return BigInt(value); };
12
+ export const openControllerLifecycleStore = (file, ticket, options = {}) => {
13
+ const maxOutboxBytes = options.maxOutboxBytes ?? 64 * 1024 * 1024;
14
+ if (!Number.isSafeInteger(maxOutboxBytes) || maxOutboxBytes < 256)
15
+ throw new Error("Invalid controller outbox capacity.");
16
+ parseLaunchTicket(ticket);
17
+ const db = new Database(file);
18
+ chmodSync(file, 0o600);
19
+ db.pragma("journal_mode = WAL");
20
+ db.pragma("synchronous = FULL");
21
+ const initial = { executionId: ticket.executionId, ...sessionBinding(ticket), sessionId: ticket.sessionId, executionGeneration: ticket.executionGeneration, controllerInstanceId: ticket.controllerInstanceId, lifecycle: "starting", nativeSessionId: ticket.resumeNativeSessionId, initialInputState: ticket.initialInput === "none" ? "not_required" : "not_submitted", activity: "initializing", currentTurnId: null, capabilities: { send: false, steer: false, cancel: false, respond: false }, controllerProcess: null, nativeProcesses: [], nativeStopped: false, stoppedAt: null, error: null };
22
+ const atomic = (action) => db.transaction(action).immediate();
23
+ try {
24
+ atomic(() => {
25
+ const version = db.pragma("user_version", { simple: true });
26
+ if (version !== 0 && version !== 1 && version !== 2 && version !== 3 && version !== 4 && version !== 5)
27
+ throw new Error("Unsupported controller journal version.");
28
+ if (version === 0)
29
+ db.exec("CREATE TABLE execution (id INTEGER PRIMARY KEY CHECK(id=1), ticket_hash TEXT NOT NULL, owner_pid INTEGER, snapshot TEXT NOT NULL, last_sequence INTEGER NOT NULL DEFAULT 0); CREATE TABLE operations (id TEXT PRIMARY KEY, value TEXT NOT NULL); CREATE TABLE outbox (sequence INTEGER PRIMARY KEY, value TEXT NOT NULL); PRAGMA user_version=1;");
30
+ if (version < 2)
31
+ db.exec("ALTER TABLE execution ADD COLUMN last_acknowledged INTEGER NOT NULL DEFAULT 0; CREATE TABLE projection (id TEXT PRIMARY KEY, content_hash TEXT NOT NULL, revision INTEGER NOT NULL, value TEXT NOT NULL); PRAGMA user_version=2;");
32
+ if (version < 3)
33
+ db.exec("ALTER TABLE operations ADD COLUMN acknowledged INTEGER NOT NULL DEFAULT 0; PRAGMA user_version=3;");
34
+ if (version < 4)
35
+ db.exec("ALTER TABLE execution ADD COLUMN projection_gap TEXT; PRAGMA user_version=4;");
36
+ if (version < 5)
37
+ db.exec("ALTER TABLE execution ADD COLUMN source_floor INTEGER NOT NULL DEFAULT 0; CREATE TABLE resources (id TEXT PRIMARY KEY, descriptor TEXT NOT NULL, content BLOB); PRAGMA user_version=5;");
38
+ const existing = db.prepare("SELECT ticket_hash, owner_pid, snapshot FROM execution WHERE id=1").get();
39
+ if (existing === undefined)
40
+ db.prepare("INSERT INTO execution(id,ticket_hash,owner_pid,snapshot) VALUES(1,?,?,?)").run(controllerPayloadHash(ticket), process.pid, JSON.stringify(initial));
41
+ else {
42
+ if (existing.owner_pid !== null) {
43
+ try {
44
+ process.kill(existing.owner_pid, 0);
45
+ throw new Error("The original controller journal writer is still running.");
46
+ }
47
+ catch (error) {
48
+ if (!(error instanceof Error && "code" in error && error.code === "ESRCH"))
49
+ throw error;
50
+ }
51
+ }
52
+ const previous = json(existing.snapshot);
53
+ if (previous.executionId !== ticket.executionId || previous.claimId !== ticket.claimId || previous.testExecutionId !== ticket.testExecutionId || previous.sessionId !== ticket.sessionId)
54
+ throw new Error("Controller journal belongs to another execution.");
55
+ if (existing.ticket_hash === controllerPayloadHash(ticket) && previous.controllerProcess !== null)
56
+ throw new Error("A native controller generation cannot be relaunched without a new stopped-generation ticket.");
57
+ if (existing.ticket_hash !== controllerPayloadHash(ticket)) {
58
+ if (BigInt(ticket.executionGeneration) !== BigInt(previous.executionGeneration) + 1n || !previous.nativeStopped || previous.lifecycle !== "stopped" || previous.nativeSessionId === null || previous.nativeSessionId !== ticket.resumeNativeSessionId)
59
+ throw new Error("Controller recovery requires a stopped original generation and exact native identity.");
60
+ db.prepare("UPDATE execution SET ticket_hash=?,snapshot=? WHERE id=1").run(controllerPayloadHash(ticket), JSON.stringify({ ...initial, initialInputState: previous.initialInputState, controlsRevisionFloor: (() => {
61
+ let floor = BigInt(previous.controls?.revision ?? previous.controlsRevisionFloor ?? "0");
62
+ // Old source events are replayed before new provider state. Keep their
63
+ // highest revision across execution reset without dropping the outbox.
64
+ for (const row of db.prepare("SELECT json_extract(value, '$.payload.controls.revision') AS revision FROM outbox WHERE json_extract(value, '$.kind')='state'").iterate()) {
65
+ if (row.revision !== null && /^[1-9][0-9]{0,18}$/.test(row.revision) && BigInt(row.revision) > floor)
66
+ floor = BigInt(row.revision);
67
+ }
68
+ return String(floor);
69
+ })() }));
70
+ }
71
+ db.prepare("UPDATE execution SET owner_pid=? WHERE id=1").run(process.pid);
72
+ }
73
+ });
74
+ }
75
+ catch (error) {
76
+ db.close();
77
+ throw error;
78
+ }
79
+ const getSnapshot = () => json(db.prepare("SELECT snapshot FROM execution WHERE id=1").get().snapshot);
80
+ const getOperation = (operationId) => { const row = db.prepare("SELECT value FROM operations WHERE id=?").get(operationId); return row === undefined ? null : json(row.value); };
81
+ const writeOperation = (operation) => { db.prepare("INSERT INTO operations(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value,acknowledged=0").run(operation.operationId, JSON.stringify(operation)); return operation; };
82
+ const patchSnapshot = (patch) => atomic(() => {
83
+ const current = getSnapshot();
84
+ if (Object.keys(patch).some((key) => ["executionId", "claimId", "testExecutionId", "sessionId", "executionGeneration", "controllerInstanceId"].includes(key)))
85
+ throw new Error("Controller identity cannot change within a generation.");
86
+ if (current.nativeSessionId !== null && patch.nativeSessionId !== undefined && patch.nativeSessionId !== current.nativeSessionId)
87
+ throw new Error("The original native session cannot be replaced.");
88
+ const value = { ...current, ...patch };
89
+ db.prepare("UPDATE execution SET snapshot=? WHERE id=1").run(JSON.stringify(value));
90
+ return value;
91
+ });
92
+ const outboxBytes = () => db.prepare("SELECT COALESCE(SUM(length(CAST(value AS BLOB))),0) AS bytes FROM outbox").get().bytes;
93
+ const assertInputCapacity = () => { if (!options.contentOwnedLocally && outboxBytes() >= maxOutboxBytes * 0.8)
94
+ throw new Error("Controller outbox capacity reached; native input is paused until durable events are acknowledged."); };
95
+ const localContent = createLocalSessionContent(db, ticket.sessionId);
96
+ const appendEvent = (payload) => atomic(() => {
97
+ if (options.contentOwnedLocally && payload && typeof payload === "object" && "kind" in payload && payload.kind === "resource" && "payload" in payload) {
98
+ const event = parseSourceEvent({ sourceSeq: "1", ...payload });
99
+ if (event.kind === "resource")
100
+ localContent.saveResource(event.payload);
101
+ }
102
+ const encoded = JSON.stringify(payload);
103
+ if (encoded === undefined)
104
+ throw new Error("Controller event must be serializable.");
105
+ if (outboxBytes() + Buffer.byteLength(encoded) > maxOutboxBytes) {
106
+ if (!options.contentOwnedLocally)
107
+ throw new Error("Controller outbox capacity exceeded; event was not discarded.");
108
+ // Content is already committed in the local projection. Only transport
109
+ // replay is discarded; the next connection must hydrate from local data.
110
+ db.prepare("DELETE FROM outbox").run();
111
+ db.prepare("UPDATE execution SET source_floor=last_sequence WHERE id=1").run();
112
+ }
113
+ const row = db.prepare("UPDATE execution SET last_sequence=last_sequence+1 WHERE id=1 RETURNING CAST(last_sequence AS TEXT) AS sequence").get();
114
+ if (options.contentOwnedLocally && Buffer.byteLength(encoded) > maxOutboxBytes)
115
+ db.prepare("UPDATE execution SET source_floor=last_sequence WHERE id=1").run();
116
+ else
117
+ db.prepare("INSERT INTO outbox(sequence,value) VALUES(?,?)").run(BigInt(row.sequence), encoded);
118
+ return { sequence: row.sequence, payload };
119
+ });
120
+ let closed = false;
121
+ return {
122
+ getSnapshot, patchSnapshot, getOperation, assertInputCapacity,
123
+ ...localContent,
124
+ getSourceFloor: () => db.prepare("SELECT CAST(source_floor AS TEXT) AS sequence FROM execution WHERE id=1").get().sequence,
125
+ getLastSourceSequence: () => db.prepare("SELECT CAST(last_sequence AS TEXT) AS sequence FROM execution WHERE id=1").get().sequence,
126
+ markProjectionGap: (reason) => {
127
+ if (typeof reason !== "string" || reason.trim() === "")
128
+ throw new Error("Projection gap requires a reason.");
129
+ // A single bounded marker survives outbox exhaustion and controller generations.
130
+ let safeReason = "";
131
+ for (const character of reason) {
132
+ if (Buffer.byteLength(JSON.stringify({ kind: "gap", payload: { reason: safeReason + character } })) > 256)
133
+ break;
134
+ safeReason += character;
135
+ }
136
+ db.prepare("UPDATE execution SET projection_gap=COALESCE(projection_gap,?) WHERE id=1").run(safeReason);
137
+ },
138
+ drainProjectionGap: () => atomic(() => {
139
+ const row = db.prepare("SELECT projection_gap AS reason FROM execution WHERE id=1").get();
140
+ if (row.reason === null)
141
+ return null;
142
+ const payload = { kind: "gap", payload: { reason: row.reason } };
143
+ if (outboxBytes() + Buffer.byteLength(JSON.stringify(payload)) > maxOutboxBytes)
144
+ return null;
145
+ parseSourceEvent({ sourceSeq: "1", ...payload });
146
+ const event = appendEvent(payload);
147
+ db.prepare("UPDATE execution SET projection_gap=NULL WHERE id=1").run();
148
+ return event;
149
+ }),
150
+ listOperations: () => db.prepare("SELECT value FROM operations ORDER BY rowid").all().map(row => json(row.value)),
151
+ listUnacknowledgedOperations: (limit = 100, afterOperationId) => {
152
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100)
153
+ throw new Error("Invalid operation reconciliation page size.");
154
+ return db.prepare("SELECT value FROM operations WHERE acknowledged=0 AND rowid > COALESCE((SELECT rowid FROM operations WHERE id=?),0) ORDER BY rowid LIMIT ?").all(afterOperationId ?? null, limit).map(row => json(row.value));
155
+ },
156
+ markOperationAcknowledged: (id) => { const operation = getOperation(id); if (operation === null)
157
+ throw new Error("Cannot acknowledge an unknown operation."); if (["confirmed", "failed", "rejected", "expired"].includes(operation.state))
158
+ db.prepare("UPDATE operations SET acknowledged=1 WHERE id=?").run(id); },
159
+ getLastAcknowledgedSequence: () => db.prepare("SELECT CAST(last_acknowledged AS TEXT) AS sequence FROM execution WHERE id=1").get().sequence,
160
+ projectTimeline: (entry) => atomic(() => {
161
+ const { revision: ignored, entrySeq: ignoredSequence, ...content } = entry;
162
+ void ignored;
163
+ void ignoredSequence;
164
+ const contentHash = controllerPayloadHash(content);
165
+ const previous = db.prepare("SELECT content_hash, CAST(revision AS TEXT) AS revision, CAST(rowid AS TEXT) AS entrySeq FROM projection WHERE id=?").get(entry.entryId);
166
+ if (previous?.content_hash === contentHash)
167
+ return null;
168
+ const revision = String(previous === undefined ? 1n : BigInt(previous.revision) + 1n);
169
+ const entrySeq = previous?.entrySeq ?? db.prepare("SELECT CAST(COALESCE(MAX(rowid),0)+1 AS TEXT) AS value FROM projection").get().value;
170
+ const payload = { ...content, revision, ...(options.contentOwnedLocally ? { entrySeq } : {}) };
171
+ parseSourceEvent({ sourceSeq: "1", kind: "timeline_upsert", payload });
172
+ db.prepare("INSERT INTO projection(id,content_hash,revision,value) VALUES(?,?,?,?) ON CONFLICT(id) DO UPDATE SET content_hash=excluded.content_hash,revision=excluded.revision,value=excluded.value").run(entry.entryId, contentHash, BigInt(revision), JSON.stringify(payload));
173
+ return appendEvent({ kind: "timeline_upsert", payload: options.contentOwnedLocally ? sessionDisplayEntry(payload) : payload });
174
+ }),
175
+ prepareOperation: (input) => atomic(() => {
176
+ if (!/^[a-f0-9-]{36}$/.test(input.operationId))
177
+ throw new Error("Controller operation ID must be a UUID.");
178
+ const hash = controllerPayloadHash({ kind: input.kind, payload: input.payload });
179
+ const existing = getOperation(input.operationId);
180
+ if (existing !== null) {
181
+ if (existing.payloadHash !== hash)
182
+ throw new Error("The operation ID has different content.");
183
+ return existing;
184
+ }
185
+ if (input.kind === "initial" || input.kind === "send_message" || input.kind === "interaction_response" || input.kind === "execute_command" || input.kind === "update_setting")
186
+ assertInputCapacity();
187
+ return writeOperation({ ...input, executionGeneration: ticket.executionGeneration, payloadHash: hash, state: "accepted", result: null, error: null, createdAt: Date.now(), updatedAt: Date.now() });
188
+ }),
189
+ markDispatching: (operationId) => atomic(() => {
190
+ const operation = getOperation(operationId);
191
+ if (operation === null || operation.state !== "accepted")
192
+ throw new Error("Controller operation cannot replay a possible native dispatch.");
193
+ if (operation.kind === "initial")
194
+ patchSnapshot({ initialInputState: "dispatching" });
195
+ return writeOperation({ ...operation, state: "dispatching", updatedAt: Date.now() });
196
+ }),
197
+ recordOperation: (operationId, state, result = null, error = null) => atomic(() => {
198
+ const operation = getOperation(operationId);
199
+ if (operation === null)
200
+ throw new Error("Controller operation is not registered.");
201
+ if (["confirmed", "failed", "rejected", "expired"].includes(operation.state) && state !== operation.state)
202
+ throw new Error("A terminal controller operation cannot be replaced.");
203
+ if (state === "accepted" || state === "offered" || state === "dispatching")
204
+ throw new Error("Use the durable dispatch boundary before native effects.");
205
+ if (operation.kind === "initial")
206
+ patchSnapshot({ initialInputState: state === "rejected" || state === "expired" ? "failed" : state });
207
+ return writeOperation({ ...operation, state, result, error, updatedAt: Date.now() });
208
+ }),
209
+ appendEvent,
210
+ pendingEvents: (limit = 100) => {
211
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000)
212
+ throw new Error("Invalid controller outbox page size.");
213
+ return db.prepare("SELECT CAST(sequence AS TEXT) AS sequence,value FROM outbox ORDER BY outbox.sequence LIMIT ?").all(limit).map((row) => ({ sequence: row.sequence, payload: json(row.value) }));
214
+ },
215
+ acknowledgeEvents: (sequence) => atomic(() => {
216
+ const value = validSequence(sequence);
217
+ const row = db.prepare("SELECT CAST(last_sequence AS TEXT) AS sequence FROM execution WHERE id=1").get();
218
+ if (value > BigInt(row.sequence))
219
+ throw new Error("Controller ACK exceeds its durable event watermark.");
220
+ db.prepare("DELETE FROM outbox WHERE sequence<=?").run(value);
221
+ db.prepare("UPDATE execution SET last_acknowledged=MAX(last_acknowledged,?) WHERE id=1").run(value);
222
+ }),
223
+ close: () => { if (closed)
224
+ return; db.prepare("UPDATE execution SET owner_pid=NULL WHERE id=1 AND owner_pid=?").run(process.pid); db.close(); closed = true; },
225
+ };
226
+ };
227
+ /** Read-only recovery never acquires the native writer lease. */
228
+ export const readControllerSnapshot = (file) => {
229
+ let db;
230
+ try {
231
+ db = new Database(file, { readonly: true, fileMustExist: true });
232
+ }
233
+ catch (error) {
234
+ if (error instanceof Error && "code" in error && error.code === "SQLITE_CANTOPEN")
235
+ return null;
236
+ throw error;
237
+ }
238
+ try {
239
+ const row = db.prepare("SELECT snapshot FROM execution WHERE id=1").get();
240
+ return row === undefined ? null : json(row.snapshot);
241
+ }
242
+ finally {
243
+ db.close();
244
+ }
245
+ };
246
+ /** Only an independent worker may commit complete process-tree stop after the writer exits. */
247
+ export const recordStoppedControllerGeneration = async (file, ticket) => {
248
+ const observed = readControllerSnapshot(file);
249
+ if (observed === null || observed.controllerProcess === null || observed.executionId !== ticket.executionId || observed.claimId !== ticket.claimId || observed.testExecutionId !== ticket.testExecutionId || observed.executionGeneration !== ticket.executionGeneration || observed.controllerInstanceId !== ticket.controllerInstanceId)
250
+ throw new Error("Original controller stop evidence is unavailable.");
251
+ if (!await confirmControllerProcessesStopped(observed.controllerProcess, observed.nativeProcesses))
252
+ throw new Error("The original controller or its descendants are still running.");
253
+ const db = new Database(file);
254
+ try {
255
+ return db.transaction(() => {
256
+ const row = db.prepare("SELECT snapshot FROM execution WHERE id=1").get();
257
+ if (row.snapshot !== JSON.stringify(observed))
258
+ throw new Error("The controller state changed during stop verification.");
259
+ const stopped = { ...observed, lifecycle: "stopped", nativeStopped: true, stoppedAt: observed.stoppedAt ?? new Date().toISOString(), activity: "stopped", capabilities: { send: false, steer: false, cancel: false, respond: false } };
260
+ db.prepare("UPDATE execution SET snapshot=?,owner_pid=NULL WHERE id=1").run(JSON.stringify(stopped));
261
+ return stopped;
262
+ }).immediate();
263
+ }
264
+ finally {
265
+ db.close();
266
+ }
267
+ };
268
+ export const readControllerOperation = (file, operationId) => {
269
+ const db = new Database(file, { readonly: true, fileMustExist: true });
270
+ try {
271
+ const row = db.prepare("SELECT value FROM operations WHERE id=?").get(operationId);
272
+ return row === undefined ? null : json(row.value);
273
+ }
274
+ finally {
275
+ db.close();
276
+ }
277
+ };
278
+ //# sourceMappingURL=lifecycle-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-store.js","sourceRoot":"","sources":["../../../src/commands/controller/lifecycle-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,cAAc,EAA8F,MAAM,2BAA2B,CAAC;AACvJ,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAA+B,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAAE,gBAAgB,EAA4B,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAE,iCAAiC,EAAqB,MAAM,oBAAoB,CAAC;AAiB1F,MAAM,IAAI,GAAG,CAAI,KAAc,EAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAM,CAAC;AACtE,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,oBAA0B;IAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5N,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAAY,EAAE,MAA8B,EAAE,OAAO,GAA+D,EAAE,EAAE,EAAE;IACrK,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC1H,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACxH,MAAM,OAAO,GAAuB,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC7lB,MAAM,MAAM,GAAG,CAAI,MAAe,EAAK,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7E,IAAI,CAAC;QAAC,MAAM,CAAC,GAAG,EAAE;YAChB,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAChO,IAAI,OAAO,KAAK,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,kVAAkV,CAAC,CAAC;YAC/W,IAAI,OAAO,GAAG,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,kOAAkO,CAAC,CAAC;YAC7P,IAAI,OAAO,GAAG,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,mGAAmG,CAAC,CAAC;YAC9H,IAAI,OAAO,GAAG,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;YACzG,IAAI,OAAO,GAAG,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,wLAAwL,CAAC,CAAC;YACnN,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,EAAqF,CAAC;YAC1L,IAAI,QAAQ,KAAK,SAAS;gBAAE,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;iBACvL,CAAC;gBACJ,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;oBAChC,IAAI,CAAC;wBAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;wBAAC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;oBAAC,CAAC;oBACzH,OAAO,KAAK,EAAE,CAAC;wBAAC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;4BAAE,MAAM,KAAK,CAAC;oBAAC,CAAC;gBAC5G,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAqB,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC7D,IAAI,QAAQ,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBAC9P,IAAI,QAAQ,CAAC,WAAW,KAAK,qBAAqB,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,iBAAiB,KAAK,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;gBACnN,IAAI,QAAQ,CAAC,WAAW,KAAK,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3D,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,eAAe,KAAK,IAAI,IAAI,QAAQ,CAAC,eAAe,KAAK,MAAM,CAAC,qBAAqB;wBAAE,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;oBAChW,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAC,GAAG,EAAE;4BACjN,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;4BACzF,uEAAuE;4BACvE,uEAAuE;4BACvE,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,+HAA+H,CAAC,CAAC,OAAO,EAA2C,EAAE,CAAC;gCACjN,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK;oCAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;4BACrI,CAAC;4BACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;wBACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACX,CAAC;gBACD,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IAChD,MAAM,WAAW,GAAG,GAAuB,EAAE,CAAC,IAAI,CAAE,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,EAA2B,CAAC,QAAQ,CAAC,CAAC;IACrJ,MAAM,YAAY,GAAG,CAAC,WAAmB,EAA8B,EAAE,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAkC,CAAC,CAAC,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtP,MAAM,cAAc,GAAG,CAAC,SAA8B,EAAuB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,gHAAgH,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1R,MAAM,aAAa,GAAG,CAAC,KAAsJ,EAAsB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;QAChN,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACzO,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,KAAK,CAAC,eAAe,KAAK,OAAO,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrM,MAAM,KAAK,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;QAAC,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IAC5I,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,GAAW,EAAE,CAAE,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;IAC5J,MAAM,mBAAmB,GAAG,GAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,WAAW,EAAE,IAAI,cAAc,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7O,MAAM,YAAY,GAAG,yBAAyB,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAyB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;QAC3E,IAAI,OAAO,CAAC,mBAAmB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACtJ,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;gBAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACrF,IAAI,WAAW,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,cAAc,EAAE,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,mBAAmB;gBAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnH,uEAAuE;YACvE,yEAAyE;YACzE,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAE,CAAC;YACvC,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,EAAE,CAAC;QACjF,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iHAAiH,CAAC,CAAC,GAAG,EAA0B,CAAC;QACxK,IAAI,OAAO,CAAC,mBAAmB,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,cAAc;YAAE,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,EAAE,CAAC;;YAC1J,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACrG,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO;QACL,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB;QAC7D,GAAG,YAAY;QACf,cAAc,EAAE,GAAW,EAAE,CAAE,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,EAA2B,CAAC,QAAQ;QAC5J,qBAAqB,EAAE,GAAW,EAAE,CAAE,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,EAA2B,CAAC,QAAQ;QACpK,iBAAiB,EAAE,CAAC,MAAc,EAAQ,EAAE;YAC1C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC7G,iFAAiF;YACjF,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,EAAC,MAAM,EAAC,UAAU,GAAG,SAAS,EAAC,EAAC,CAAC,CAAC,GAAG,GAAG;oBAAE,MAAM;gBACzG,UAAU,IAAI,SAAS,CAAC;YAC1B,CAAC;YACD,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1G,CAAC;QACD,kBAAkB,EAAE,GAAiC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;YAClE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,EAA0B,CAAC;YAClH,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,OAAO,GAAG,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,EAAC,EAAC,MAAM,EAAC,GAAG,CAAC,MAAM,EAAC,EAAC,CAAC;YACzD,IAAI,WAAW,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,cAAc;gBAAE,OAAO,IAAI,CAAC;YAC7F,gBAAgB,CAAC,EAAC,SAAS,EAAC,GAAG,EAAC,GAAG,OAAO,EAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QACF,cAAc,EAAE,GAA0B,EAAE,CAAE,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,EAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAsB,GAAG,CAAC,KAAK,CAAC,CAAC;QACtL,4BAA4B,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE,gBAAyB,EAAyB,EAAE;YAC9F,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7H,OAAQ,EAAE,CAAC,OAAO,CAAC,4IAA4I,CAAC,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,EAAE,KAAK,CAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAsB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACjR,CAAC;QACD,yBAAyB,EAAE,CAAC,EAAU,EAAQ,EAAE,GAAG,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClU,2BAA2B,EAAE,GAAW,EAAE,CAAE,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,EAA2B,CAAC,QAAQ;QAC9K,eAAe,EAAE,CAAC,KAA0B,EAAgC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;YACzF,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;YAC3E,KAAK,OAAO,CAAC;YAAC,KAAK,eAAe,CAAC;YACnC,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,qHAAqH,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAA6E,CAAC;YAClP,IAAI,QAAQ,EAAE,YAAY,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;YACtF,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAK,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;YAC/J,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAyB,CAAC;YACtH,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;YACvE,EAAE,CAAC,OAAO,CAAC,yLAAyL,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACjR,OAAO,WAAW,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACjI,CAAC,CAAC;QACF,gBAAgB,EAAE,CAAC,KAAoE,EAAuB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;YAC3H,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC3G,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACnI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAAC,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAAC,OAAO,QAAQ,CAAC;YAAC,CAAC;YAC1I,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;gBAAE,mBAAmB,EAAE,CAAC;YACrM,OAAO,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtM,CAAC,CAAC;QACF,eAAe,EAAE,CAAC,WAAmB,EAAuB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;YACzE,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YAAC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACzL,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;gBAAE,aAAa,CAAC,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC,CAAC;YACtF,OAAO,cAAc,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC;QACF,eAAe,EAAE,CAAC,WAAmB,EAAE,KAAqB,EAAE,MAAM,GAAY,IAAI,EAAE,KAAK,GAAkB,IAAI,EAAuB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;YACrJ,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YAAC,IAAI,SAAS,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAChI,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YAClL,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACxJ,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;gBAAE,aAAa,CAAC,EAAE,iBAAiB,EAAE,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACvI,OAAO,cAAc,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC;QACF,WAAW;QACX,aAAa,EAAE,CAAC,KAAK,GAAG,GAAG,EAA2B,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACvH,OAAQ,EAAE,CAAC,OAAO,CAAC,8FAA8F,CAAC,CAAC,GAAG,CAAC,KAAK,CAA2C,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/O,CAAC;QACD,iBAAiB,EAAE,CAAC,QAAgB,EAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;YACzD,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,EAA0B,CAAC;YACxK,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9D,EAAE,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtG,CAAC,CAAC;QACF,KAAK,EAAE,GAAS,EAAE,GAAG,IAAI,MAAM;YAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;KACrK,CAAC;AACJ,CAAC,CAAC;AAGF,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAA6B,EAAE;IAChF,IAAI,EAAqB,CAAC;IAC1B,IAAI,CAAC;QAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IACzE,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IAC9H,IAAI,CAAC;QAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,EAAsC,CAAC;QAAC,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;YACpK,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACzB,CAAC,CAAC;AAEF,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iCAAiC,GAAG,KAAK,EAAE,IAAY,EAAE,MAA8B,EAA+B,EAAE;IACnI,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,iBAAiB,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe,IAAI,QAAQ,CAAC,mBAAmB,KAAK,MAAM,CAAC,mBAAmB,IAAI,QAAQ,CAAC,oBAAoB,KAAK,MAAM,CAAC,oBAAoB;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAChZ,IAAI,CAAC,MAAM,iCAAiC,CAAC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,eAAe,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACrL,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,EAA0B,CAAC;YAClG,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACzH,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,SAAkB,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAkB,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;YACzP,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAAC,OAAO,OAAO,CAAC;QACvH,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC3C,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAE,WAAmB,EAA8B,EAAE;IACvG,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC;QAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAkC,CAAC;QAAC,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;YACvK,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACzB,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type SessionBinding } from "../../session/protocol.js";
2
+ import type { ControllerLaunchTicket } from "./launch-ticket.js";
3
+ import type { ControllerSnapshot, ControllerOperation } from "./lifecycle-store.js";
4
+ export type ControllerLocalAction = {
5
+ readonly kind: "observe";
6
+ } | {
7
+ readonly kind: "submit_initial";
8
+ readonly operationId: string;
9
+ } | {
10
+ readonly kind: "cleanup";
11
+ readonly operationId: string;
12
+ readonly prompt: string;
13
+ readonly deadline: number;
14
+ } | {
15
+ readonly kind: "stop";
16
+ readonly deadline: number;
17
+ };
18
+ export type ControllerLocalRequest = SessionBinding & {
19
+ readonly requestId: string;
20
+ readonly executionId: string;
21
+ readonly executionGeneration: string;
22
+ readonly controllerInstanceId: string;
23
+ readonly secret: string;
24
+ readonly action: ControllerLocalAction;
25
+ };
26
+ export type ControllerLocalResponse = {
27
+ readonly requestId: string;
28
+ readonly ok: true;
29
+ readonly snapshot: ControllerSnapshot;
30
+ readonly operation?: ControllerOperation;
31
+ } | {
32
+ readonly requestId: string;
33
+ readonly ok: false;
34
+ readonly error: string;
35
+ };
36
+ export declare const validateControllerLocalRequest: (value: unknown, ticket: ControllerLaunchTicket) => ControllerLocalRequest;
37
+ export declare class ControllerIpcOutcomeUnknownError extends Error {
38
+ }
39
+ export declare const requestController: (ticket: ControllerLaunchTicket, action: ControllerLocalAction, options?: {
40
+ signal?: AbortSignal;
41
+ timeoutMs?: number;
42
+ }) => Promise<ControllerLocalResponse & {
43
+ ok: true;
44
+ }>;