@codetreker/daynight 0.25.4 → 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 (170) hide show
  1. package/README.md +108 -4
  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/worker/backend.d.ts +7 -0
  104. package/dist/commands/worker/backend.js +7 -0
  105. package/dist/commands/worker/backend.js.map +1 -0
  106. package/dist/commands/worker/backends/grant-renewal.d.ts +13 -0
  107. package/dist/commands/worker/backends/grant-renewal.js +42 -0
  108. package/dist/commands/worker/backends/grant-renewal.js.map +1 -0
  109. package/dist/commands/worker/backends/session-api.d.ts +66 -0
  110. package/dist/commands/worker/backends/session-api.js +84 -0
  111. package/dist/commands/worker/backends/session-api.js.map +1 -0
  112. package/dist/commands/worker/backends/web-process.d.ts +79 -0
  113. package/dist/commands/worker/backends/web-process.js +156 -0
  114. package/dist/commands/worker/backends/web-process.js.map +1 -0
  115. package/dist/commands/worker/backends/web-store.d.ts +49 -0
  116. package/dist/commands/worker/backends/web-store.js +323 -0
  117. package/dist/commands/worker/backends/web-store.js.map +1 -0
  118. package/dist/commands/worker/backends/web-types.d.ts +83 -0
  119. package/dist/commands/worker/backends/web-types.js +3 -0
  120. package/dist/commands/worker/backends/web-types.js.map +1 -0
  121. package/dist/commands/worker/backends/web.d.ts +26 -0
  122. package/dist/commands/worker/backends/web.js +178 -0
  123. package/dist/commands/worker/backends/web.js.map +1 -0
  124. package/dist/commands/worker/config.js +12 -5
  125. package/dist/commands/worker/config.js.map +1 -1
  126. package/dist/commands/worker/control.d.ts +2 -0
  127. package/dist/commands/worker/control.js +11 -4
  128. package/dist/commands/worker/control.js.map +1 -1
  129. package/dist/commands/worker/coordinator.d.ts +7 -0
  130. package/dist/commands/worker/coordinator.js +138 -19
  131. package/dist/commands/worker/coordinator.js.map +1 -1
  132. package/dist/commands/worker/herdr/agents.js +5 -4
  133. package/dist/commands/worker/herdr/agents.js.map +1 -1
  134. package/dist/commands/worker/herdr/arguments.js +9 -4
  135. package/dist/commands/worker/herdr/arguments.js.map +1 -1
  136. package/dist/commands/worker/herdr/claude-input.d.ts +2 -0
  137. package/dist/commands/worker/herdr/claude-input.js +20 -0
  138. package/dist/commands/worker/herdr/claude-input.js.map +1 -0
  139. package/dist/commands/worker/herdr/instance.js +1 -1
  140. package/dist/commands/worker/herdr/instance.js.map +1 -1
  141. package/dist/commands/worker/herdr/preflight.d.ts +1 -1
  142. package/dist/commands/worker/herdr/preflight.js +31 -10
  143. package/dist/commands/worker/herdr/preflight.js.map +1 -1
  144. package/dist/commands/worker/herdr.js +5 -1
  145. package/dist/commands/worker/herdr.js.map +1 -1
  146. package/dist/commands/worker/prompts.js +5 -1
  147. package/dist/commands/worker/prompts.js.map +1 -1
  148. package/dist/commands/worker/repositories.js +2 -2
  149. package/dist/commands/worker/repositories.js.map +1 -1
  150. package/dist/commands/worker/runtime.js +62 -10
  151. package/dist/commands/worker/runtime.js.map +1 -1
  152. package/dist/commands/worker/setup-environment.d.ts +2 -1
  153. package/dist/commands/worker/setup-environment.js +10 -4
  154. package/dist/commands/worker/setup-environment.js.map +1 -1
  155. package/dist/commands/worker/setup.js +5 -5
  156. package/dist/commands/worker/setup.js.map +1 -1
  157. package/dist/commands/worker/store.d.ts +2 -1
  158. package/dist/commands/worker/store.js +19 -9
  159. package/dist/commands/worker/store.js.map +1 -1
  160. package/dist/commands/worker/types.d.ts +4 -1
  161. package/dist/session/controller-protocol.d.ts +245 -0
  162. package/dist/session/controller-protocol.js +218 -0
  163. package/dist/session/controller-protocol.js.map +1 -0
  164. package/dist/session/controls.d.ts +28 -0
  165. package/dist/session/controls.js +37 -0
  166. package/dist/session/controls.js.map +1 -0
  167. package/dist/session/protocol.d.ts +290 -0
  168. package/dist/session/protocol.js +307 -0
  169. package/dist/session/protocol.js.map +1 -0
  170. package/package.json +7 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/commands/controller/definition.ts"],"names":[],"mappings":"AACA,MAAM,KAAK,GAAG,CAAC,KAAe,EAAE,WAAmB,EAAE,UAAU,GAAG,KAAK,EAAiB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACzM,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,wDAAwD;IACzF,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,IAAI,eAAe,EAAE,QAAQ,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE;YAC9J,KAAK,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,yBAAyB,CAAC;YACnD,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC,oBAAoB,EAAE,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/I,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,wBAAwB,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,qCAAqC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzJ,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,mDAAmD,CAAC;YACxE,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE,kEAAkE,CAAC;YAC1F,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAe,EAAE;SACpF,EAAE,sBAAsB,EAAE,IAAI;QAC/B,OAAO,EAAE,8BAA8B,IAAI,kDAAkD,IAAI,udAAud,EAAE,CAAC,CAAC;IAC5jB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CACtF,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IAAuB,OAAO;QACvF,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,QAAQ,eAAe;QAChF,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACrF,OAAO,EAAE,8BAA8B,QAAQ,qYAAqY,QAAQ,aAAa;KAC1c,CAAC;AAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliContext } from "../../cli/context.js";
2
+ import type { IndependentControllerInput } from "./index.js";
3
+ export declare const runIndependentController: (input: IndependentControllerInput, context: CliContext) => Promise<void>;
@@ -0,0 +1,344 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
3
+ import { chmod, mkdir, open, realpath, writeFile, rename } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { setTimeout as delay } from "node:timers/promises";
6
+ import { resolveConfigurationPaths } from "../../config/paths.js";
7
+ import { loadServerConfiguration } from "../../config/server.js";
8
+ import { SESSION_PROTOCOL, sessionFence, assertSessionFence } from "../../session/protocol.js";
9
+ import { parseControllerGrantResponse, parseRegistrationResponse } from "../../session/controller-protocol.js";
10
+ import { writeControllerCredential } from "../worker/backends/session-api.js";
11
+ import { controllerExecutionDirectory, controllerTicketPath, writeLaunchTicket } from "./launch-ticket.js";
12
+ import { readControllerSnapshot, recordStoppedControllerGeneration } from "./lifecycle-store.js";
13
+ import { captureProcessProof, stopControllerProcesses } from "./process-proof.js";
14
+ import { ControllerIpcOutcomeUnknownError, requestController } from "./local-client.js";
15
+ class TestSessionRequestError extends Error {
16
+ retryable;
17
+ constructor(message, retryable, options) {
18
+ super(message, options);
19
+ this.retryable = retryable;
20
+ }
21
+ }
22
+ const waitForExit = async (exited, milliseconds) => {
23
+ if (!exited)
24
+ return;
25
+ let timer;
26
+ try {
27
+ await Promise.race([exited, new Promise(resolve => { timer = setTimeout(resolve, milliseconds); })]);
28
+ }
29
+ finally {
30
+ if (timer)
31
+ clearTimeout(timer);
32
+ }
33
+ };
34
+ // Keep the registration identity before the first network write. A timeout does
35
+ // not authorize replacing it with another execution or replaying initial input.
36
+ export const runIndependentController = async (input, context) => {
37
+ const home = context.homeDirectory(), cwd = await realpath(context.workingDirectory());
38
+ const config = await loadServerConfiguration(resolveConfigurationPaths(home));
39
+ if (!config.serverToken)
40
+ throw new Error("Configure a Daynight serverToken before starting a Test Session.");
41
+ const cancellation = new AbortController();
42
+ let requestedStop = false;
43
+ const signal = () => { requestedStop = true; cancellation.abort(new Error("Test Session stopped by the terminal.")); };
44
+ process.on("SIGINT", signal);
45
+ process.on("SIGTERM", signal);
46
+ let child, ticket;
47
+ let directory, failed;
48
+ let registeredSession;
49
+ let spawnAttempted = false, archived = false, nativeStopped = false, unstartedTicketRetired = true;
50
+ let resume;
51
+ let processProof;
52
+ let childExit;
53
+ const request = async (target, body, independent = false) => {
54
+ if (!independent)
55
+ cancellation.signal.throwIfAborted();
56
+ let response;
57
+ try {
58
+ response = await fetch(`${config.serverUrl}${target}`, { method: body === undefined ? "GET" : "POST", headers: { authorization: `Bearer ${config.serverToken}`, ...(body === undefined ? {} : { "content-type": "application/json" }) }, ...(body === undefined ? {} : { body: JSON.stringify(body) }), signal: independent ? AbortSignal.timeout(10_000) : AbortSignal.any([cancellation.signal, AbortSignal.timeout(15_000)]) });
59
+ }
60
+ catch (cause) {
61
+ throw new TestSessionRequestError("Test Session connection failed; its original execution identity is retained.", true, { cause });
62
+ }
63
+ if (!response.ok) {
64
+ // The status is authoritative even if a gateway error body is truncated.
65
+ try {
66
+ await response.body?.cancel();
67
+ }
68
+ catch { /* Error bodies are not used. */ }
69
+ throw new TestSessionRequestError(`Test Session request failed with HTTP ${response.status}; its original execution identity is retained.`, response.status === 408 || response.status === 429 || response.status >= 500);
70
+ }
71
+ const chunks = [];
72
+ let size = 0;
73
+ if (response.body) {
74
+ const reader = response.body.getReader();
75
+ try {
76
+ for (;;) {
77
+ const { done, value } = await reader.read();
78
+ if (done)
79
+ break;
80
+ size += value.byteLength;
81
+ if (size > 2_097_152) {
82
+ try {
83
+ await reader.cancel();
84
+ }
85
+ catch { /* Preserve the response limit failure. */ }
86
+ throw new TestSessionRequestError("Test Session response exceeds its limit; the result is unconfirmed.", false);
87
+ }
88
+ chunks.push(value);
89
+ }
90
+ }
91
+ catch (cause) {
92
+ if (cause instanceof TestSessionRequestError)
93
+ throw cause;
94
+ throw new TestSessionRequestError("Test Session response was interrupted; its original execution identity is retained.", true, { cause });
95
+ }
96
+ finally {
97
+ reader.releaseLock();
98
+ }
99
+ }
100
+ try {
101
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
102
+ }
103
+ catch {
104
+ throw new Error("Test Session response is invalid; its result is unconfirmed.");
105
+ }
106
+ };
107
+ const persist = async (name, value) => { if (!directory)
108
+ throw new Error("Test registration directory is unavailable."); await writeFile(path.join(directory, name), `${JSON.stringify(value)}\n`, { flag: "wx", mode: 0o600 }); };
109
+ try {
110
+ const capability = await request("/api/v1/test-session-capabilities");
111
+ if (!capability || Object.keys(capability).sort().join() !== ["protocol", "schemaVersion", "projectionVersion", "providers"].sort().join() || capability.protocol !== SESSION_PROTOCOL || capability.schemaVersion !== 1 || capability.projectionVersion !== 1 || !Array.isArray(capability.providers) || !capability.providers.includes(input.provider))
112
+ throw new Error("This service has not confirmed compatible Test Session support.");
113
+ if (input.resume) {
114
+ if (input.prompt !== null || input.model !== null || input.args.length)
115
+ throw new Error("Resume cannot override native settings or replay initial input.");
116
+ resume = await (await import("./resume.js")).acquireResume({ provider: input.provider, ...(input.resume.sessionId ? { sessionId: input.resume.sessionId } : {}) }, context, { serverUrl: config.serverUrl, serverToken: config.serverToken });
117
+ context.stdout(`Resuming native context from Test Session: ${resume.ticket.sessionId}\n`);
118
+ }
119
+ const executionId = randomUUID(), launchId = randomUUID(), controllerId = randomUUID(), controllerInstanceId = randomUUID();
120
+ directory = controllerExecutionDirectory(home, executionId);
121
+ await mkdir(directory, { recursive: true, mode: 0o700 });
122
+ await chmod(directory, 0o700);
123
+ const registration = { protocol: SESSION_PROTOCOL, schemaVersion: 1, projectionVersion: 1, registrationId: randomUUID(), testExecutionId: executionId, controllerId, controllerInstanceId, provider: input.provider, initialInput: input.prompt === null ? "none" : "prompt" };
124
+ await persist("registration.json", { registration, serverOrigin: config.serverUrl, cwd, initialPrompt: input.prompt, ...(resume ? { resumedFromSessionId: resume.ticket.sessionId } : {}) });
125
+ const session = parseRegistrationResponse(await request("/api/v1/test-sessions", registration)).session;
126
+ if (session.testExecutionId !== executionId || session.identity.ownerUserId === undefined || session.identity.provider !== input.provider || session.identity.controllerId !== controllerId || session.identity.controllerInstanceId !== controllerInstanceId || session.executionGeneration !== "1" || session.initialInputState !== (input.prompt === null ? "not_required" : "not_submitted"))
127
+ throw new Error("Test Session registration does not match the durable launch intent.");
128
+ registeredSession = session;
129
+ context.stdout(`Test Session: ${new URL(`/test-sessions/${session.sessionId}`, config.serverUrl).href}\n`);
130
+ await persist("registration-result.json", { session });
131
+ const prefix = `/api/v1/test-sessions/${session.sessionId}`;
132
+ const grant = async (kind) => {
133
+ const result = parseControllerGrantResponse(await request(`${prefix}/controller-grant`, { protocol: SESSION_PROTOCOL, testExecutionId: executionId, controllerId, controllerInstanceId, executionGeneration: "1", kind, previousGeneration: null, stopProof: null }));
134
+ assertSessionFence(result, sessionFence(session));
135
+ if (result.controllerId !== controllerId || result.controllerInstanceId !== controllerInstanceId || Date.parse(result.expiresAt) <= Date.now())
136
+ throw new Error("Test controller grant does not match its launch identity or expiry.");
137
+ return result;
138
+ };
139
+ let credential = await grant("bootstrap");
140
+ const credentialFile = path.join(directory, "credential.json");
141
+ await writeControllerCredential(credentialFile, credential);
142
+ const endpointKey = createHash("sha256").update(`${home}:${launchId}`).digest("hex").slice(0, 20);
143
+ const ipcEndpoint = process.platform === "win32" ? `\\\\.\\pipe\\daynight-${endpointKey}` : path.join(home, ".daynight", "c", `${endpointKey}.sock`);
144
+ if (process.platform !== "win32") {
145
+ if (Buffer.byteLength(ipcEndpoint) > (process.platform === "darwin" ? 103 : 107))
146
+ throw new Error("The controller IPC endpoint exceeds this platform's socket path limit.");
147
+ await mkdir(path.dirname(ipcEndpoint), { recursive: true, mode: 0o700 });
148
+ }
149
+ const nativeHome = resume?.ticket.nativeHome ?? (input.provider === "codex" ? process.env.CODEX_HOME ?? path.join(home, ".codex") : input.provider === "claude" ? process.env.CLAUDE_CONFIG_DIR ?? path.join(home, ".claude") : process.env.COPILOT_HOME ?? path.join(home, ".copilot"));
150
+ ticket = { schemaVersion: 1, launchId, executionId, controllerId, controllerInstanceId, sessionId: session.sessionId, executionGeneration: session.executionGeneration, testExecutionId: executionId, ownerUserId: session.identity.ownerUserId, initialInput: registration.initialInput, serverOrigin: config.serverUrl, provider: input.provider, cwd, nativeHome, configuration: { agent: input.provider, agentControlMode: "web", model: resume ? null : input.model, args: resume?.ticket.configuration.args ?? input.args, recoveryLimit: 0 }, initialOperationId: randomUUID(), initialPrompt: input.prompt ?? "", resumeNativeSessionId: resume?.nativeSessionId ?? null, credentialFile, ipcEndpoint, ipcSecret: randomBytes(32).toString("hex"), createdAt: new Date().toISOString() };
151
+ await writeLaunchTicket(home, ticket);
152
+ // Reconnect grants are valid for the first hello and survive a lost first connection.
153
+ credential = await grant("reconnect");
154
+ await writeControllerCredential(credentialFile, credential);
155
+ context.stdout(`Provider: ${input.provider}; starting in ${cwd}\nPress Ctrl+C to stop this Test Session.\n`);
156
+ cancellation.signal.throwIfAborted();
157
+ const log = await open(path.join(directory, "controller.log"), "a", 0o600);
158
+ try {
159
+ spawnAttempted = true;
160
+ child = spawn(process.execPath, [path.join(context.packageDirectory, "dist", "main.js"), "controller", input.provider, "--launch-id", launchId], { cwd, env: { ...process.env, HOME: home, USERPROFILE: home }, detached: process.platform !== "win32", stdio: ["ignore", log.fd, log.fd], windowsHide: true });
161
+ childExit = new Promise(resolve => { child.once("exit", () => resolve()); child.once("error", () => resolve()); });
162
+ await new Promise((resolve, reject) => { child.once("spawn", resolve); child.once("error", reject); });
163
+ }
164
+ finally {
165
+ await log.close();
166
+ }
167
+ if (!child.pid)
168
+ throw new Error("Test controller process identity is unknown.");
169
+ processProof = await captureProcessProof(child.pid);
170
+ await persist("process.json", processProof);
171
+ let submitted = input.prompt === null, connected = false;
172
+ let renewalFailures = 0, nextRenewalAt = 0, ipcUnavailable = false;
173
+ const startupDeadline = Date.now() + 60_000;
174
+ while (!requestedStop) {
175
+ if (child.exitCode !== null || child.signalCode !== null)
176
+ throw new Error("Test controller exited; inspect its private controller.log. No replacement native session was created.");
177
+ let observed;
178
+ try {
179
+ observed = await requestController(ticket, { kind: "observe" }, { timeoutMs: 2000, signal: cancellation.signal });
180
+ }
181
+ catch (error) {
182
+ if (requestedStop || !(error instanceof ControllerIpcOutcomeUnknownError) || !connected && Date.now() >= startupDeadline)
183
+ throw error;
184
+ if (!ipcUnavailable)
185
+ context.stderr("Controller IPC observation is temporarily unavailable; the original native execution remains supervised.\n");
186
+ ipcUnavailable = true;
187
+ }
188
+ if (observed) {
189
+ if (ipcUnavailable) {
190
+ context.stderr("Controller IPC observation recovered for the original native execution.\n");
191
+ ipcUnavailable = false;
192
+ }
193
+ if (["paused", "failed", "stopping", "stopped"].includes(observed.snapshot.lifecycle))
194
+ throw new Error("Test controller is unavailable; its native outcome is retained in the private journal.");
195
+ // A lost reply may settle as a definitive rejection in the journal while
196
+ // the provider remains ready. Reconcile that outcome without resubmission.
197
+ if (input.prompt !== null && observed.snapshot.initialInputState === "failed")
198
+ throw new Error("Initial input failed; the same operation remains recorded.");
199
+ if (observed.snapshot.lifecycle === "ready" && !connected) {
200
+ connected = true;
201
+ context.stdout(`Provider ready: ${input.provider}; native session ${observed.snapshot.nativeSessionId ?? "awaiting first input confirmation"}\n`);
202
+ }
203
+ if (!connected && Date.now() >= startupDeadline)
204
+ throw new Error("Test controller startup timed out; its original execution is retained.");
205
+ if (!submitted && observed.snapshot.lifecycle === "ready") {
206
+ try {
207
+ const initial = await requestController(ticket, { kind: "submit_initial", operationId: ticket.initialOperationId }, { timeoutMs: 65_000, signal: cancellation.signal });
208
+ if (initial.operation) {
209
+ submitted = true;
210
+ context.stdout(`Initial input: ${initial.operation.state}\n`);
211
+ if (["failed", "rejected", "expired"].includes(initial.operation.state))
212
+ throw new Error("Initial input failed; the same operation remains recorded.");
213
+ }
214
+ }
215
+ catch (error) {
216
+ if (requestedStop || !(error instanceof ControllerIpcOutcomeUnknownError))
217
+ throw error;
218
+ // Even a later not_submitted snapshot cannot prove that this request
219
+ // never crossed dispatch. Only observe; keep the original operation ID.
220
+ submitted = true;
221
+ context.stderr(`Initial input outcome is unknown; operation ${ticket.initialOperationId} will not be replayed. The original native execution remains supervised.\n`);
222
+ }
223
+ }
224
+ }
225
+ if (Date.parse(credential.expiresAt) - Date.now() <= 60_000 && Date.now() >= nextRenewalAt) {
226
+ try {
227
+ const renewed = await grant("reconnect");
228
+ await writeControllerCredential(credentialFile, renewed);
229
+ credential = renewed;
230
+ if (renewalFailures)
231
+ context.stderr(`Test Session ${session.sessionId} credential renewal recovered; its original native execution continues.\n`);
232
+ renewalFailures = 0;
233
+ nextRenewalAt = 0;
234
+ }
235
+ catch (error) {
236
+ if (requestedStop || !(error instanceof TestSessionRequestError) || !error.retryable)
237
+ throw error;
238
+ renewalFailures = Math.min(renewalFailures + 1, 6);
239
+ const retryMs = Math.min(30_000, 1_000 * 2 ** (renewalFailures - 1));
240
+ nextRenewalAt = Date.now() + retryMs;
241
+ context.stderr(`Test Session ${session.sessionId} credential renewal is temporarily unavailable; retry in ${retryMs / 1000}s. The original native execution continues; remote writes still require valid relay authorization. ${error.message}\n`);
242
+ }
243
+ }
244
+ await delay(250, undefined, { signal: cancellation.signal });
245
+ }
246
+ }
247
+ catch (error) {
248
+ if (!requestedStop)
249
+ failed = error;
250
+ }
251
+ finally {
252
+ // Credential revocation and network failure must never prevent local stop.
253
+ if (child && ticket && directory) {
254
+ try {
255
+ await requestController(ticket, { kind: "stop", deadline: Date.now() + 15_000 }, { timeoutMs: 2000 }).catch(() => { });
256
+ await waitForExit(childExit, 2500);
257
+ const journal = path.join(directory, "journal.sqlite");
258
+ let snapshot = null;
259
+ try {
260
+ snapshot = readControllerSnapshot(journal);
261
+ }
262
+ catch { /* Startup may fail before journal creation. */ }
263
+ const proof = snapshot?.controllerProcess ?? processProof;
264
+ if (proof)
265
+ await stopControllerProcesses(proof, snapshot?.nativeProcesses ?? [], Date.now() + 10_000);
266
+ else if (child.pid && child.exitCode === null && child.signalCode === null) {
267
+ // This ChildProcess handle belongs to the spawn above, even if proof
268
+ // capture failed. Terminate it; do not infer descendants are stopped.
269
+ child.kill("SIGTERM");
270
+ await waitForExit(childExit, 2000);
271
+ if (child.exitCode === null && child.signalCode === null)
272
+ child.kill("SIGKILL");
273
+ throw new Error("Original controller process proof is unavailable; complete stopping remains unconfirmed.");
274
+ }
275
+ await childExit;
276
+ const stopped = await recordStoppedControllerGeneration(journal, ticket);
277
+ nativeStopped = true;
278
+ const stopProof = { recordId: randomUUID(), previousControllerInstanceId: ticket.controllerInstanceId, stoppedAt: stopped.stoppedAt };
279
+ const body = { protocol: SESSION_PROTOCOL, ...sessionFence(ticket), controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId, stopProof };
280
+ await persist("stop-proof.json", body);
281
+ try {
282
+ const result = parseRegistrationResponse(await request(`/api/v1/test-sessions/${ticket.sessionId}/stop`, body, true)).session;
283
+ assertSessionFence(result, ticket);
284
+ if (result.lifecycle !== "archived")
285
+ throw new Error("Test Session archival was not confirmed.");
286
+ await persist("stop-result.json", { session: result });
287
+ archived = true;
288
+ context.stdout("Test Session stopped and archived.\n");
289
+ }
290
+ catch {
291
+ context.stderr("Native execution stopped. Server archival is unconfirmed; the original stop proof is retained privately.\n");
292
+ }
293
+ }
294
+ catch (error) {
295
+ failed ??= error;
296
+ context.stderr(`Test Session stop could not be fully confirmed; execution evidence: ${directory}. Inspect controller.log and the original journal.\n`);
297
+ }
298
+ }
299
+ if (ticket && directory && !spawnAttempted) {
300
+ // A never-launched continuation has no journal. Keep its launch intent as
301
+ // evidence outside the active ticket inventory so it cannot block resume.
302
+ try {
303
+ await rename(controllerTicketPath(home, ticket.launchId), path.join(directory, "unstarted-launch.json"));
304
+ }
305
+ catch (error) {
306
+ if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
307
+ unstartedTicketRetired = false;
308
+ failed ??= error;
309
+ }
310
+ }
311
+ }
312
+ if (registeredSession && directory && !spawnAttempted) {
313
+ try {
314
+ const body = { protocol: SESSION_PROTOCOL, ...sessionFence(registeredSession), controllerId: registeredSession.identity.controllerId, controllerInstanceId: registeredSession.identity.controllerInstanceId, stopProof: { kind: "never_started", recordId: randomUUID(), previousControllerInstanceId: registeredSession.identity.controllerInstanceId, stoppedAt: new Date().toISOString() } };
315
+ await persist("stop-proof.json", body);
316
+ const result = parseRegistrationResponse(await request(`/api/v1/test-sessions/${registeredSession.sessionId}/stop`, body, true)).session;
317
+ assertSessionFence(result, sessionFence(registeredSession));
318
+ if (result.lifecycle !== "archived")
319
+ throw new Error("Unstarted Test Session archival was not confirmed.");
320
+ await persist("stop-result.json", { session: result });
321
+ archived = true;
322
+ context.stdout("Test Session archived; no controller process was started.\n");
323
+ }
324
+ catch { /* The printed identity and private proof remain available for reconciliation. */ }
325
+ }
326
+ if (registeredSession && !archived && (!child || !child.pid))
327
+ context.stderr(`Test Session ${registeredSession.sessionId} remains unarchived. ${spawnAttempted ? "Controller launch outcome is unconfirmed." : "No controller process was started."} Registration evidence: ${directory}.\n`);
328
+ else if (!registeredSession && directory)
329
+ context.stderr(`Test Session registration was not confirmed. Preserve and reconcile the original registration identity in ${path.join(directory, "registration.json")} before starting another execution.\n`);
330
+ if (resume && (!spawnAttempted && unstartedTicketRetired || nativeStopped)) {
331
+ try {
332
+ await resume.release();
333
+ }
334
+ catch (error) {
335
+ failed ??= error;
336
+ }
337
+ }
338
+ process.off("SIGINT", signal);
339
+ process.off("SIGTERM", signal);
340
+ }
341
+ if (failed)
342
+ throw failed;
343
+ };
344
+ //# sourceMappingURL=independent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"independent.js","sourceRoot":"","sources":["../../../src/commands/controller/independent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAwB,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAC/G,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,iBAAiB,EAA+B,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,sBAAsB,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAqB,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,gCAAgC,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIxF,MAAM,uBAAwB,SAAQ,KAAK;IACH,SAAS;IAA/C,YAAY,OAAe,EAAW,SAAkB,EAAE,OAAsB;QAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;yBAAtE,SAAS;IAA8D,CAAC;CAC/G;AAED,MAAM,WAAW,GAAG,KAAK,EAAE,MAAiC,EAAE,YAAoB,EAAiB,EAAE;IACnG,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;YAC3G,CAAC;QAAC,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,gFAAgF;AAChF,gFAAgF;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,KAAiC,EAAE,OAAmB,EAAiB,EAAE;IACtH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IAC7G,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;IAAC,IAAI,aAAa,GAAG,KAAK,CAAC;IACtE,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,aAAa,GAAG,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,KAA+B,EAAE,MAA0C,CAAC;IAChF,IAAI,SAA6B,EAAE,MAAe,CAAC;IACnD,IAAI,iBAA8C,CAAC;IACnD,IAAI,cAAc,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,aAAa,GAAG,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACnG,IAAI,MAA+B,CAAC;IACpC,IAAI,YAAsC,CAAC;IAC3C,IAAI,SAAoC,CAAC;IACzC,MAAM,OAAO,GAAG,KAAK,EAAE,MAAc,EAAE,IAAc,EAAE,WAAW,GAAG,KAAK,EAAoB,EAAE;QAC9F,IAAI,CAAC,WAAW;YAAE,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACvD,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YAAC,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAC3a,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,uBAAuB,CAAC,8EAA8E,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;QACrJ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,yEAAyE;YACzE,IAAI,CAAC;gBAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;YACjF,MAAM,IAAI,uBAAuB,CAAC,yCAAyC,QAAQ,CAAC,MAAM,gDAAgD,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;QAC5N,CAAC;QACD,MAAM,MAAM,GAAiB,EAAE,CAAC;QAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC;gBAAC,SAAS,CAAC;oBAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAAC,IAAI,IAAI;wBAAE,MAAM;oBAAC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;oBAAC,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;wBAAC,IAAI,CAAC;4BAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAC,0CAA0C,CAAC,CAAC;wBAAC,MAAM,IAAI,uBAAuB,CAAC,qEAAqE,EAAE,KAAK,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAAC,CAAC;YAAC,CAAC;YAC/V,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAI,KAAK,YAAY,uBAAuB;oBAAE,MAAM,KAAK,CAAC;gBAAC,MAAM,IAAI,uBAAuB,CAAC,qFAAqF,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,CAAC;oBAC/M,CAAC;gBAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAAC,CAAC;IAC1K,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,EAAE,IAAY,EAAE,KAAc,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpP,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,mCAAmC,CAA4B,CAAC;QACjG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,KAAK,gBAAgB,IAAI,UAAU,CAAC,aAAa,KAAK,CAAC,IAAI,UAAU,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAC7a,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YAC3J,MAAM,GAAG,MAAM,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9O,OAAO,CAAC,MAAM,CAAC,8CAA8C,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,EAAE,EAAE,QAAQ,GAAG,UAAU,EAAE,EAAE,YAAY,GAAG,UAAU,EAAE,EAAE,oBAAoB,GAAG,UAAU,EAAE,CAAC;QAC5H,SAAS,GAAG,4BAA4B,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACrJ,MAAM,YAAY,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC,QAAiB,EAAE,CAAC;QACjS,MAAM,OAAO,CAAC,mBAAmB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7L,MAAM,OAAO,GAAG,yBAAyB,CAAC,MAAM,OAAO,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;QACxG,IAAI,OAAO,CAAC,eAAe,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,KAAK,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,KAAK,oBAAoB,IAAI,OAAO,CAAC,mBAAmB,KAAK,GAAG,IAAI,OAAO,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACzd,iBAAiB,GAAG,OAAO,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC,kBAAkB,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3G,MAAM,OAAO,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,yBAAyB,OAAO,CAAC,SAAS,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,KAAK,EAAE,IAA+B,EAAE,EAAE;YACtD,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,OAAO,CAAC,GAAG,MAAM,mBAAmB,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtQ,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,YAAY,KAAK,YAAY,IAAI,MAAM,CAAC,oBAAoB,KAAK,oBAAoB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACvO,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAAC,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAC5H,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClG,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QACrJ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;YAC5K,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACzR,MAAM,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,eAAe,IAAI,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACjwB,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,sFAAsF;QACtF,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;QAAC,MAAM,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACnG,OAAO,CAAC,MAAM,CAAC,aAAa,KAAK,CAAC,QAAQ,iBAAiB,GAAG,6CAA6C,CAAC,CAAC;QAC7G,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3E,IAAI,CAAC;YACH,cAAc,GAAG,IAAI,CAAC;YACtB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAChT,SAAS,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,KAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3H,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,KAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjH,CAAC;gBAAS,CAAC;YAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAChF,YAAY,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAC5C,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC;QACzD,IAAI,eAAe,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC;QACnE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;QAC5C,OAAO,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,wGAAwG,CAAC,CAAC;YACpL,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBAAC,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;YAAC,CAAC;YAC1H,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,aAAa,IAAI,CAAC,CAAC,KAAK,YAAY,gCAAgC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,eAAe;oBAAE,MAAM,KAAK,CAAC;gBACtI,IAAI,CAAC,cAAc;oBAAE,OAAO,CAAC,MAAM,CAAC,4GAA4G,CAAC,CAAC;gBAClJ,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,cAAc,EAAE,CAAC;oBAAC,OAAO,CAAC,MAAM,CAAC,2EAA2E,CAAC,CAAC;oBAAC,cAAc,GAAG,KAAK,CAAC;gBAAC,CAAC;gBAC5I,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;gBACjM,yEAAyE;gBACzE,2EAA2E;gBAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,KAAK,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAC7J,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;oBAAC,SAAS,GAAG,IAAI,CAAC;oBAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,KAAK,CAAC,QAAQ,oBAAoB,QAAQ,CAAC,QAAQ,CAAC,eAAe,IAAI,mCAAmC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBACnO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,eAAe;oBAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;gBAC3I,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;oBAC1D,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,CAAC,kBAAkB,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;wBACxK,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;4BACtB,SAAS,GAAG,IAAI,CAAC;4BACjB,OAAO,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;4BAC9D,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;gCAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;wBACzJ,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,aAAa,IAAI,CAAC,CAAC,KAAK,YAAY,gCAAgC,CAAC;4BAAE,MAAM,KAAK,CAAC;wBACvF,qEAAqE;wBACrE,wEAAwE;wBACxE,SAAS,GAAG,IAAI,CAAC;wBACjB,OAAO,CAAC,MAAM,CAAC,+CAA+C,MAAM,CAAC,kBAAkB,4EAA4E,CAAC,CAAC;oBACvK,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,aAAa,EAAE,CAAC;gBAC3F,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;oBAAC,MAAM,yBAAyB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;oBAAC,UAAU,GAAG,OAAO,CAAC;oBACzH,IAAI,eAAe;wBAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,OAAO,CAAC,SAAS,2EAA2E,CAAC,CAAC;oBAClJ,eAAe,GAAG,CAAC,CAAC;oBAAC,aAAa,GAAG,CAAC,CAAC;gBACzC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,aAAa,IAAI,CAAC,CAAC,KAAK,YAAY,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;wBAAE,MAAM,KAAK,CAAC;oBAClG,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC;oBAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;oBAC3G,OAAO,CAAC,MAAM,CAAC,gBAAgB,OAAO,CAAC,SAAS,4DAA4D,OAAO,GAAG,IAAI,sGAAsG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;gBACrP,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,aAAa;YAAE,MAAM,GAAG,KAAK,CAAC;IAAC,CAAC;YAC/C,CAAC;QACP,2EAA2E;QAC3E,IAAI,KAAK,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,iBAAiB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACtH,MAAM,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;gBACvD,IAAI,QAAQ,GAAG,IAAI,CAAC;gBAAC,IAAI,CAAC;oBAAC,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,+CAA+C,CAAC,CAAC;gBAClI,MAAM,KAAK,GAAG,QAAQ,EAAE,iBAAiB,IAAI,YAAY,CAAC;gBAC1D,IAAI,KAAK;oBAAE,MAAM,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;qBACjG,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;oBAC3E,qEAAqE;oBACrE,sEAAsE;oBACtE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,MAAM,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACnC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI;wBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAChF,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;gBAC9G,CAAC;gBACD,MAAM,SAAS,CAAC;gBAChB,MAAM,OAAO,GAAG,MAAM,iCAAiC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACzE,aAAa,GAAG,IAAI,CAAC;gBACrB,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,4BAA4B,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,EAAE,OAAO,CAAC,SAAU,EAAE,CAAC;gBACvI,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,EAAE,CAAC;gBACtK,MAAM,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAoB,yBAAyB,CAAC,MAAM,OAAO,CAAC,yBAAyB,MAAM,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC/I,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBACnC,IAAI,MAAM,CAAC,SAAS,KAAK,UAAU;wBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBACjG,MAAM,OAAO,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,QAAQ,GAAG,IAAI,CAAC;oBAAC,OAAO,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;gBAClI,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,CAAC,MAAM,CAAC,4GAA4G,CAAC,CAAC;gBAAC,CAAC;YAC3I,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,MAAM,KAAK,KAAK,CAAC;gBAAC,OAAO,CAAC,MAAM,CAAC,uEAAuE,SAAS,sDAAsD,CAAC,CAAC;YAAC,CAAC;QAC/L,CAAC;QACD,IAAI,MAAM,IAAI,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,0EAA0E;YAC1E,0EAA0E;YAC1E,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC;YAAC,CAAC;YACjH,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;oBAAC,sBAAsB,GAAG,KAAK,CAAC;oBAAC,MAAM,KAAK,KAAK,CAAC;gBAAC,CAAC;YAAC,CAAC;QACtJ,CAAC;QACD,IAAI,iBAAiB,IAAI,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,YAAY,CAAC,iBAAiB,CAAC,EAAE,YAAY,EAAE,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,4BAA4B,EAAE,iBAAiB,CAAC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;gBAChY,MAAM,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;gBACvC,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,OAAO,CAAC,yBAAyB,iBAAiB,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;gBACzI,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC5D,IAAI,MAAM,CAAC,SAAS,KAAK,UAAU;oBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBAC3G,MAAM,OAAO,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC;gBACxE,OAAO,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC;YAChF,CAAC;YAAC,MAAM,CAAC,CAAC,iFAAiF,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,iBAAiB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,iBAAiB,CAAC,SAAS,wBAAwB,cAAc,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,oCAAoC,2BAA2B,SAAS,KAAK,CAAC,CAAC;aACzR,IAAI,CAAC,iBAAiB,IAAI,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,6GAA6G,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,uCAAuC,CAAC,CAAC;QACxP,IAAI,MAAM,IAAI,CAAC,CAAC,cAAc,IAAI,sBAAsB,IAAI,aAAa,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,MAAM,KAAK,KAAK,CAAC;YAAC,CAAC;QAAC,CAAC;QACnJ,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,MAAM;QAAE,MAAM,MAAM,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type CliContext } from "../../cli/context.js";
2
+ import type { SessionProvider } from "../../session/protocol.js";
3
+ export type IndependentControllerInput = {
4
+ provider: SessionProvider;
5
+ model: string | null;
6
+ args: string[];
7
+ prompt: string | null;
8
+ resume?: {
9
+ sessionId: string | null;
10
+ };
11
+ };
12
+ export declare const runControllerCommand: (args: readonly string[], context: CliContext) => Promise<void>;
@@ -0,0 +1,73 @@
1
+ import { UsageError } from "../../cli/context.js";
2
+ import { canonicalId } from "../../api/parse.js";
3
+ import { parseCommand, selectCommand, renderCommandHelp } from "../../cli/schema.js";
4
+ import { controllerDefinition, controllerResumeDefinition } from "./definition.js";
5
+ import { parseProviderArguments } from "./providers/projection.js";
6
+ export const runControllerCommand = async (args, context) => {
7
+ const selected = selectCommand(controllerDefinition, args, ["daynight", "controller"], "daynight controller --help");
8
+ if (selected.kind !== "selected") {
9
+ context.stdout(renderCommandHelp(selected.command, selected.path));
10
+ return;
11
+ }
12
+ if (selected.remaining[0] === "resume") {
13
+ const provider = selected.command.name, remaining = selected.remaining.slice(1);
14
+ const base = controllerResumeDefinition(provider);
15
+ const parsed = parseCommand({ ...base, ...(remaining.some(arg => !arg.startsWith("-")) ? { arguments: [{ name: "test-session-id", description: "Saved Daynight Test Session UUID" }] } : {}) }, remaining, [...selected.path, "resume"]);
16
+ if (parsed.kind !== "run") {
17
+ context.stdout(renderCommandHelp(parsed.command, parsed.path));
18
+ return;
19
+ }
20
+ const sessionId = parsed.values[0] ?? null;
21
+ if (sessionId !== null && canonicalId(sessionId) !== sessionId)
22
+ throw new UsageError("Test Session ID must be a canonical UUID.");
23
+ await (await import("./independent.js")).runIndependentController({ provider, model: null, args: [], prompt: null, resume: { sessionId } }, context);
24
+ return;
25
+ }
26
+ // The shared command schema has required positionals; this command alone has
27
+ // one optional native-style prompt, so declare it only when one is present.
28
+ let positional = false, terminator = false;
29
+ for (let i = 0; i < selected.remaining.length; i++) {
30
+ const arg = selected.remaining[i];
31
+ if (!terminator && arg === "--") {
32
+ terminator = true;
33
+ continue;
34
+ }
35
+ if (!terminator && arg.startsWith("-")) {
36
+ if (!arg.includes("=") && selected.command.options?.find(o => o.names.includes(arg))?.value)
37
+ i++;
38
+ continue;
39
+ }
40
+ positional = true;
41
+ }
42
+ const { commands: _subcommands, ...providerDefinition } = selected.command;
43
+ const definition = { ...providerDefinition, ...(positional ? { arguments: [{ name: "prompt", description: "Optional first native input" }] } : {}) };
44
+ const command = parseCommand(definition, selected.remaining, selected.path, "daynight controller --help");
45
+ if (command.kind !== "run") {
46
+ context.stdout(renderCommandHelp(command.command, command.path));
47
+ return;
48
+ }
49
+ const provider = command.command.name, launchId = command.options.get("--launch-id");
50
+ if (launchId !== undefined) {
51
+ if (typeof launchId !== "string" || canonicalId(launchId) !== launchId)
52
+ throw new UsageError("Controller launch ID must be a canonical UUID.");
53
+ if (command.options.size !== 1 || command.values.length)
54
+ throw new UsageError("--launch-id cannot be combined with a prompt or provider options.");
55
+ await (await import("./runtime.js")).runController({ homeDirectory: context.homeDirectory(), provider, launchId });
56
+ return;
57
+ }
58
+ const nativeArgs = [];
59
+ for (const [name, value] of command.options) {
60
+ if (name === "--model")
61
+ continue;
62
+ for (const item of typeof value === "string" ? [value] : Array.isArray(value) ? value : [])
63
+ nativeArgs.push(name, item);
64
+ }
65
+ parseProviderArguments(provider, nativeArgs);
66
+ const model = command.options.get("--model"), prompt = command.values[0] ?? null;
67
+ if (model !== undefined && (typeof model !== "string" || !model.trim() || /[\0\r\n]/.test(model)))
68
+ throw new UsageError("Native model is invalid.");
69
+ if (prompt !== null && (!prompt.trim() || !prompt.isWellFormed() || prompt.includes("\0") || Buffer.byteLength(prompt) > 1_048_576))
70
+ throw new UsageError("Prompt must be valid nonempty text within 1 MiB.");
71
+ await (await import("./independent.js")).runIndependentController({ provider, model: typeof model === "string" ? model : null, args: nativeArgs, prompt }, context);
72
+ };
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/controller/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type SessionBinding } from "../../session/protocol.js";
2
+ import type { FrozenExecutionConfiguration } from "../worker/types.js";
3
+ type LaunchCommon = {
4
+ readonly schemaVersion: 1;
5
+ readonly launchId: string;
6
+ readonly executionId: string;
7
+ readonly controllerId: string;
8
+ readonly controllerInstanceId: string;
9
+ readonly sessionId: string;
10
+ readonly executionGeneration: string;
11
+ readonly serverOrigin: string;
12
+ readonly provider: "codex" | "claude" | "copilot";
13
+ readonly cwd: string;
14
+ readonly nativeHome: string;
15
+ readonly configuration: FrozenExecutionConfiguration;
16
+ readonly initialOperationId: string;
17
+ readonly initialPrompt: string;
18
+ readonly resumeNativeSessionId: string | null;
19
+ readonly credentialFile: string;
20
+ readonly ipcEndpoint: string;
21
+ readonly ipcSecret: string;
22
+ readonly createdAt: string;
23
+ };
24
+ export type ControllerLaunchTicket = LaunchCommon & SessionBinding & ({
25
+ readonly claimId: string;
26
+ readonly projectId: string;
27
+ readonly taskId: string;
28
+ readonly workerId: string;
29
+ readonly worktreeId: string;
30
+ readonly userId: string;
31
+ readonly ownerUserId?: never;
32
+ readonly initialInput?: never;
33
+ } | {
34
+ readonly testExecutionId: string;
35
+ readonly ownerUserId: string;
36
+ readonly initialInput: "none" | "prompt";
37
+ readonly projectId?: never;
38
+ readonly taskId?: never;
39
+ readonly workerId?: never;
40
+ readonly worktreeId?: never;
41
+ readonly userId?: never;
42
+ });
43
+ export declare const controllerExecutionDirectory: (home: string, executionId: string) => string;
44
+ export declare const controllerTicketPath: (home: string, launchId: string) => string;
45
+ export declare const controllerPayloadHash: (value: unknown) => string;
46
+ export declare const parseLaunchTicket: (value: unknown) => ControllerLaunchTicket;
47
+ export declare const readLaunchTicket: (home: string, launchId: string) => Promise<ControllerLaunchTicket>;
48
+ export declare const writeLaunchTicket: (home: string, ticket: ControllerLaunchTicket) => Promise<string>;
49
+ export {};