@codetreker/daynight 0.25.4 → 0.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +160 -11
  2. package/config.example.yml +3 -0
  3. package/dist/api/client.d.ts +3 -2
  4. package/dist/api/client.js +10 -6
  5. package/dist/api/client.js.map +1 -1
  6. package/dist/api/parse.d.ts +3 -2
  7. package/dist/api/parse.js +59 -10
  8. package/dist/api/parse.js.map +1 -1
  9. package/dist/api/types.d.ts +75 -1
  10. package/dist/api/worker-mode.d.ts +6 -0
  11. package/dist/api/worker-mode.js +14 -0
  12. package/dist/api/worker-mode.js.map +1 -0
  13. package/dist/cli/commands.js +2 -0
  14. package/dist/cli/commands.js.map +1 -1
  15. package/dist/commands/controller/command-controls.d.ts +4 -0
  16. package/dist/commands/controller/command-controls.js +33 -0
  17. package/dist/commands/controller/command-controls.js.map +1 -0
  18. package/dist/commands/controller/definition.d.ts +3 -0
  19. package/dist/commands/controller/definition.js +22 -0
  20. package/dist/commands/controller/definition.js.map +1 -0
  21. package/dist/commands/controller/independent.d.ts +3 -0
  22. package/dist/commands/controller/independent.js +344 -0
  23. package/dist/commands/controller/independent.js.map +1 -0
  24. package/dist/commands/controller/index.d.ts +12 -0
  25. package/dist/commands/controller/index.js +73 -0
  26. package/dist/commands/controller/index.js.map +1 -0
  27. package/dist/commands/controller/launch-ticket.d.ts +49 -0
  28. package/dist/commands/controller/launch-ticket.js +99 -0
  29. package/dist/commands/controller/launch-ticket.js.map +1 -0
  30. package/dist/commands/controller/lifecycle-store.d.ts +84 -0
  31. package/dist/commands/controller/lifecycle-store.js +278 -0
  32. package/dist/commands/controller/lifecycle-store.js.map +1 -0
  33. package/dist/commands/controller/local-client.d.ts +44 -0
  34. package/dist/commands/controller/local-client.js +75 -0
  35. package/dist/commands/controller/local-client.js.map +1 -0
  36. package/dist/commands/controller/local-content.d.ts +23 -0
  37. package/dist/commands/controller/local-content.js +103 -0
  38. package/dist/commands/controller/local-content.js.map +1 -0
  39. package/dist/commands/controller/process-proof.d.ts +13 -0
  40. package/dist/commands/controller/process-proof.js +121 -0
  41. package/dist/commands/controller/process-proof.js.map +1 -0
  42. package/dist/commands/controller/providers/claude.d.ts +2 -0
  43. package/dist/commands/controller/providers/claude.js +470 -0
  44. package/dist/commands/controller/providers/claude.js.map +1 -0
  45. package/dist/commands/controller/providers/codex.d.ts +2 -0
  46. package/dist/commands/controller/providers/codex.js +254 -0
  47. package/dist/commands/controller/providers/codex.js.map +1 -0
  48. package/dist/commands/controller/providers/controls-claude.d.ts +26 -0
  49. package/dist/commands/controller/providers/controls-claude.js +138 -0
  50. package/dist/commands/controller/providers/controls-claude.js.map +1 -0
  51. package/dist/commands/controller/providers/controls-codex.d.ts +38 -0
  52. package/dist/commands/controller/providers/controls-codex.js +199 -0
  53. package/dist/commands/controller/providers/controls-codex.js.map +1 -0
  54. package/dist/commands/controller/providers/controls-copilot.d.ts +20 -0
  55. package/dist/commands/controller/providers/controls-copilot.js +143 -0
  56. package/dist/commands/controller/providers/controls-copilot.js.map +1 -0
  57. package/dist/commands/controller/providers/controls.d.ts +21 -0
  58. package/dist/commands/controller/providers/controls.js +53 -0
  59. package/dist/commands/controller/providers/controls.js.map +1 -0
  60. package/dist/commands/controller/providers/copilot-interactions.d.ts +47 -0
  61. package/dist/commands/controller/providers/copilot-interactions.js +295 -0
  62. package/dist/commands/controller/providers/copilot-interactions.js.map +1 -0
  63. package/dist/commands/controller/providers/copilot-projection.d.ts +11 -0
  64. package/dist/commands/controller/providers/copilot-projection.js +93 -0
  65. package/dist/commands/controller/providers/copilot-projection.js.map +1 -0
  66. package/dist/commands/controller/providers/copilot-runtime.d.ts +9 -0
  67. package/dist/commands/controller/providers/copilot-runtime.js +127 -0
  68. package/dist/commands/controller/providers/copilot-runtime.js.map +1 -0
  69. package/dist/commands/controller/providers/copilot.d.ts +2 -0
  70. package/dist/commands/controller/providers/copilot.js +309 -0
  71. package/dist/commands/controller/providers/copilot.js.map +1 -0
  72. package/dist/commands/controller/providers/interactions.d.ts +3 -0
  73. package/dist/commands/controller/providers/interactions.js +79 -0
  74. package/dist/commands/controller/providers/interactions.js.map +1 -0
  75. package/dist/commands/controller/providers/native-rpc.d.ts +28 -0
  76. package/dist/commands/controller/providers/native-rpc.js +85 -0
  77. package/dist/commands/controller/providers/native-rpc.js.map +1 -0
  78. package/dist/commands/controller/providers/projection.d.ts +23 -0
  79. package/dist/commands/controller/providers/projection.js +99 -0
  80. package/dist/commands/controller/providers/projection.js.map +1 -0
  81. package/dist/commands/controller/providers/turns.d.ts +7 -0
  82. package/dist/commands/controller/providers/turns.js +21 -0
  83. package/dist/commands/controller/providers/turns.js.map +1 -0
  84. package/dist/commands/controller/providers/types.d.ts +44 -0
  85. package/dist/commands/controller/providers/types.js +2 -0
  86. package/dist/commands/controller/providers/types.js.map +1 -0
  87. package/dist/commands/controller/recovery.d.ts +6 -0
  88. package/dist/commands/controller/recovery.js +22 -0
  89. package/dist/commands/controller/recovery.js.map +1 -0
  90. package/dist/commands/controller/relay.d.ts +18 -0
  91. package/dist/commands/controller/relay.js +299 -0
  92. package/dist/commands/controller/relay.js.map +1 -0
  93. package/dist/commands/controller/resume.d.ts +18 -0
  94. package/dist/commands/controller/resume.js +193 -0
  95. package/dist/commands/controller/resume.js.map +1 -0
  96. package/dist/commands/controller/runtime.d.ts +5 -0
  97. package/dist/commands/controller/runtime.js +455 -0
  98. package/dist/commands/controller/runtime.js.map +1 -0
  99. package/dist/commands/controller/windows-job.d.ts +3 -0
  100. package/dist/commands/controller/windows-job.js +59 -0
  101. package/dist/commands/controller/windows-job.js.map +1 -0
  102. package/dist/commands/controller/wire-display.d.ts +5 -0
  103. package/dist/commands/controller/wire-display.js +11 -0
  104. package/dist/commands/controller/wire-display.js.map +1 -0
  105. package/dist/commands/skill/skills/using-daynight/SKILL.md +52 -162
  106. package/dist/commands/skill/skills/using-daynight/references/authorization.md +36 -0
  107. package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +77 -193
  108. package/dist/commands/skill/skills/using-daynight/references/create-task.md +31 -186
  109. package/dist/commands/skill/skills/using-daynight/references/final-acceptance.md +25 -0
  110. package/dist/commands/skill/skills/using-daynight/references/goal.md +46 -243
  111. package/dist/commands/skill/skills/using-daynight/references/handbook.md +37 -294
  112. package/dist/commands/skill/skills/using-daynight/references/handoff.md +33 -91
  113. package/dist/commands/skill/skills/using-daynight/references/project-management.md +24 -0
  114. package/dist/commands/skill/skills/using-daynight/references/run-task.md +18 -59
  115. package/dist/commands/skill/skills/using-daynight/references/setup.md +16 -0
  116. package/dist/commands/skill/skills/using-daynight/references/task-content.md +80 -177
  117. package/dist/commands/skill/skills/using-daynight/references/task-execution.md +34 -126
  118. package/dist/commands/skill/skills/using-daynight/references/task-management.md +135 -0
  119. package/dist/commands/skill/skills/using-daynight/references/write-safety.md +34 -0
  120. package/dist/commands/task/command.js +5 -3
  121. package/dist/commands/task/command.js.map +1 -1
  122. package/dist/commands/task/definition.js +4 -2
  123. package/dist/commands/task/definition.js.map +1 -1
  124. package/dist/commands/task/rendering.d.ts +1 -0
  125. package/dist/commands/task/rendering.js +10 -1
  126. package/dist/commands/task/rendering.js.map +1 -1
  127. package/dist/commands/worker/backend.d.ts +7 -0
  128. package/dist/commands/worker/backend.js +7 -0
  129. package/dist/commands/worker/backend.js.map +1 -0
  130. package/dist/commands/worker/backends/grant-renewal.d.ts +13 -0
  131. package/dist/commands/worker/backends/grant-renewal.js +42 -0
  132. package/dist/commands/worker/backends/grant-renewal.js.map +1 -0
  133. package/dist/commands/worker/backends/session-api.d.ts +66 -0
  134. package/dist/commands/worker/backends/session-api.js +84 -0
  135. package/dist/commands/worker/backends/session-api.js.map +1 -0
  136. package/dist/commands/worker/backends/web-process.d.ts +79 -0
  137. package/dist/commands/worker/backends/web-process.js +156 -0
  138. package/dist/commands/worker/backends/web-process.js.map +1 -0
  139. package/dist/commands/worker/backends/web-store.d.ts +49 -0
  140. package/dist/commands/worker/backends/web-store.js +323 -0
  141. package/dist/commands/worker/backends/web-store.js.map +1 -0
  142. package/dist/commands/worker/backends/web-types.d.ts +83 -0
  143. package/dist/commands/worker/backends/web-types.js +3 -0
  144. package/dist/commands/worker/backends/web-types.js.map +1 -0
  145. package/dist/commands/worker/backends/web.d.ts +26 -0
  146. package/dist/commands/worker/backends/web.js +178 -0
  147. package/dist/commands/worker/backends/web.js.map +1 -0
  148. package/dist/commands/worker/config.js +12 -5
  149. package/dist/commands/worker/config.js.map +1 -1
  150. package/dist/commands/worker/control.d.ts +2 -0
  151. package/dist/commands/worker/control.js +11 -4
  152. package/dist/commands/worker/control.js.map +1 -1
  153. package/dist/commands/worker/coordinator.d.ts +10 -1
  154. package/dist/commands/worker/coordinator.js +153 -24
  155. package/dist/commands/worker/coordinator.js.map +1 -1
  156. package/dist/commands/worker/herdr/agents.js +5 -4
  157. package/dist/commands/worker/herdr/agents.js.map +1 -1
  158. package/dist/commands/worker/herdr/arguments.js +9 -4
  159. package/dist/commands/worker/herdr/arguments.js.map +1 -1
  160. package/dist/commands/worker/herdr/claude-input.d.ts +2 -0
  161. package/dist/commands/worker/herdr/claude-input.js +20 -0
  162. package/dist/commands/worker/herdr/claude-input.js.map +1 -0
  163. package/dist/commands/worker/herdr/command.d.ts +11 -2
  164. package/dist/commands/worker/herdr/command.js +23 -8
  165. package/dist/commands/worker/herdr/command.js.map +1 -1
  166. package/dist/commands/worker/herdr/instance.d.ts +5 -1
  167. package/dist/commands/worker/herdr/instance.js +31 -1
  168. package/dist/commands/worker/herdr/instance.js.map +1 -1
  169. package/dist/commands/worker/herdr/preflight.d.ts +1 -1
  170. package/dist/commands/worker/herdr/preflight.js +34 -15
  171. package/dist/commands/worker/herdr/preflight.js.map +1 -1
  172. package/dist/commands/worker/herdr/version-probe.d.ts +13 -0
  173. package/dist/commands/worker/herdr/version-probe.js +21 -0
  174. package/dist/commands/worker/herdr/version-probe.js.map +1 -0
  175. package/dist/commands/worker/herdr.js +7 -7
  176. package/dist/commands/worker/herdr.js.map +1 -1
  177. package/dist/commands/worker/index.d.ts +2 -0
  178. package/dist/commands/worker/index.js +1 -1
  179. package/dist/commands/worker/index.js.map +1 -1
  180. package/dist/commands/worker/prompts.js +5 -1
  181. package/dist/commands/worker/prompts.js.map +1 -1
  182. package/dist/commands/worker/remote.d.ts +3 -1
  183. package/dist/commands/worker/remote.js +4 -0
  184. package/dist/commands/worker/remote.js.map +1 -1
  185. package/dist/commands/worker/reporter.d.ts +14 -0
  186. package/dist/commands/worker/reporter.js +174 -0
  187. package/dist/commands/worker/reporter.js.map +1 -0
  188. package/dist/commands/worker/repositories.js +2 -2
  189. package/dist/commands/worker/repositories.js.map +1 -1
  190. package/dist/commands/worker/runtime.d.ts +2 -0
  191. package/dist/commands/worker/runtime.js +76 -11
  192. package/dist/commands/worker/runtime.js.map +1 -1
  193. package/dist/commands/worker/setup-environment.d.ts +2 -1
  194. package/dist/commands/worker/setup-environment.js +10 -4
  195. package/dist/commands/worker/setup-environment.js.map +1 -1
  196. package/dist/commands/worker/setup.js +5 -5
  197. package/dist/commands/worker/setup.js.map +1 -1
  198. package/dist/commands/worker/store.d.ts +2 -1
  199. package/dist/commands/worker/store.js +19 -9
  200. package/dist/commands/worker/store.js.map +1 -1
  201. package/dist/commands/worker/telemetry.d.ts +22 -0
  202. package/dist/commands/worker/telemetry.js +265 -0
  203. package/dist/commands/worker/telemetry.js.map +1 -0
  204. package/dist/commands/worker/types.d.ts +4 -1
  205. package/dist/session/controller-protocol.d.ts +245 -0
  206. package/dist/session/controller-protocol.js +218 -0
  207. package/dist/session/controller-protocol.js.map +1 -0
  208. package/dist/session/controls.d.ts +28 -0
  209. package/dist/session/controls.js +37 -0
  210. package/dist/session/controls.js.map +1 -0
  211. package/dist/session/protocol.d.ts +290 -0
  212. package/dist/session/protocol.js +307 -0
  213. package/dist/session/protocol.js.map +1 -0
  214. package/package.json +7 -2
@@ -0,0 +1,455 @@
1
+ import { createNativeCommandQueue, assertControlCommand } from "./command-controls.js";
2
+ import { createServer } from "node:net";
3
+ import { chmod, mkdir, realpath, unlink } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { controllerExecutionDirectory, readLaunchTicket } from "./launch-ticket.js";
6
+ import { openControllerLifecycleStore } from "./lifecycle-store.js";
7
+ import { validateControllerLocalRequest } from "./local-client.js";
8
+ import { captureProcessProof, captureControllerProcessProof } from "./process-proof.js";
9
+ import { createControllerRelay } from "./relay.js";
10
+ import { isCleaningGeneration, observeNativeInput, observeNativeInteraction } from "./recovery.js";
11
+ import { NativeRpcError } from "./providers/native-rpc.js";
12
+ export const runController = async (options) => {
13
+ const ticket = await readLaunchTicket(options.homeDirectory, options.launchId);
14
+ if (ticket.provider !== options.provider || await realpath(ticket.cwd) !== await realpath(process.cwd()))
15
+ throw new Error("Controller launch provider or working directory mismatch.");
16
+ const directory = controllerExecutionDirectory(options.homeDirectory, ticket.executionId);
17
+ await mkdir(directory, { recursive: true, mode: 0o700 });
18
+ const journal = openControllerLifecycleStore(path.join(directory, "journal.sqlite"), ticket, { contentOwnedLocally: true });
19
+ let provider = null, stopping = false, synchronized = false;
20
+ let projectionFailure = null, providerFailure = null;
21
+ let startup = null, shutdownPromise = null;
22
+ const knownInteractions = new Set(), cleanupInteractions = new Set();
23
+ let cleanupInputStarted = false;
24
+ let cleaning = isCleaningGeneration(journal.listOperations(), ticket.executionGeneration);
25
+ let complete;
26
+ const finished = new Promise(resolve => { complete = resolve; });
27
+ const queueNative = createNativeCommandQueue();
28
+ const sockets = new Set(), active = new Map();
29
+ const processCaptures = [];
30
+ const diagnostic = (message) => { process.stderr.write(`${new Date().toISOString()} ${message.slice(0, 4096)}\n`); };
31
+ const publishState = () => {
32
+ const s = journal.getSnapshot();
33
+ if (!stopping && !["failed", "paused", "stopped", "stopping"].includes(s.lifecycle)) {
34
+ // Initial native input needs both the completed provider startup and a
35
+ // synchronized relay. Provider state can arrive before its handle does.
36
+ const waiting = !provider || s.activity === "initializing" || s.initialInputState === "not_submitted" && !synchronized;
37
+ journal.patchSnapshot({ lifecycle: waiting ? "starting" : s.activity === "idle" ? "ready" : "working" });
38
+ }
39
+ journal.appendEvent({ kind: "state", payload: readState() });
40
+ };
41
+ const readState = () => {
42
+ const s = journal.getSnapshot();
43
+ return { nativeSessionId: s.nativeSessionId, initialInputState: s.initialInputState, synchronized, activity: !provider ? "initializing" : stopping ? "stopped" : s.activity, currentTurnId: s.currentTurnId, ...(provider && !stopping && s.controls ? { controls: s.controls } : {}), ...(s.turnStartedAt !== undefined ? { turnStartedAt: s.turnStartedAt } : {}), ...(cleaning ? { cleanupInteractionIds: [...cleanupInteractions] } : {}), capabilities: !provider || stopping ? { send: false, steer: false, cancel: false, respond: false } : cleaning ? { ...s.capabilities, send: false, steer: false, cancel: false } : s.capabilities };
44
+ };
45
+ const fail = (error) => { const message = error instanceof Error ? error.message : String(error); diagnostic(message); try {
46
+ journal.patchSnapshot({ lifecycle: "paused", error: message });
47
+ }
48
+ catch { /* The private log retains a journal failure when disk writes fail. */ } };
49
+ const dispatch = (operation, invoke) => {
50
+ const running = active.get(operation.operationId);
51
+ if (running)
52
+ return running;
53
+ if (operation.state !== "accepted")
54
+ return Promise.resolve(operation);
55
+ const execute = (async () => {
56
+ if (["initial", "send_message", "interaction_response", "execute_command", "update_setting"].includes(operation.kind))
57
+ journal.assertInputCapacity();
58
+ journal.markDispatching(operation.operationId);
59
+ nativeEvent(publishState);
60
+ try {
61
+ const result = await invoke();
62
+ const saved = journal.recordOperation(operation.operationId, "confirmed", result);
63
+ nativeEvent(publishState);
64
+ return saved;
65
+ }
66
+ catch (error) {
67
+ const observed = journal.getOperation(operation.operationId);
68
+ if (observed && (["confirmed", "failed", "rejected", "expired"].includes(observed.state) || ["initial", "send_message", "execute_command"].includes(operation.kind) && observed.state === "provider_accepted")) {
69
+ nativeEvent(publishState);
70
+ return observed;
71
+ }
72
+ const saved = journal.recordOperation(operation.operationId, error instanceof NativeRpcError ? "rejected" : "unknown", null, error instanceof Error ? error.message : String(error));
73
+ nativeEvent(publishState);
74
+ return saved;
75
+ }
76
+ })();
77
+ active.set(operation.operationId, execute);
78
+ void execute.finally(() => active.delete(operation.operationId)).catch(fail);
79
+ return execute;
80
+ };
81
+ const relay = createControllerRelay(ticket, journal, {
82
+ onConnection: connected => { synchronized = connected; if (!stopping) {
83
+ try {
84
+ publishState();
85
+ }
86
+ catch (error) {
87
+ fail(error);
88
+ }
89
+ } },
90
+ onError: diagnostic,
91
+ readState,
92
+ onCommand: async (command) => {
93
+ if (command.sessionId !== ticket.sessionId || command.claimId !== ticket.claimId || command.testExecutionId !== ticket.testExecutionId || command.executionGeneration !== ticket.executionGeneration)
94
+ throw new Error("Stale session command.");
95
+ const operation = journal.prepareOperation({ operationId: command.operationId, kind: command.kind, payload: command.payload });
96
+ if (operation.state !== "accepted") {
97
+ relay.receipt(operation);
98
+ return;
99
+ }
100
+ if (!provider || stopping || !synchronized)
101
+ throw new Error("Native provider is not available.");
102
+ await queueNative(command.kind, async () => {
103
+ const current = journal.getOperation(command.operationId);
104
+ if (current && current.state !== "accepted") {
105
+ relay.receipt(current);
106
+ return;
107
+ }
108
+ if (!provider || stopping || !synchronized)
109
+ throw new Error("Native provider is not available.");
110
+ await relay.authorize(command.operationId);
111
+ if (!relay.connected() || stopping)
112
+ throw new Error("Relay authorization lost before native dispatch.");
113
+ const result = await dispatch(operation, () => executeCommand(command));
114
+ relay.receipt(result);
115
+ });
116
+ },
117
+ });
118
+ const executeCommand = async (command) => {
119
+ if (!provider || stopping)
120
+ throw new NativeRpcError(-32602, "Native provider is unavailable.");
121
+ if (cleaning && command.kind !== "interaction_response")
122
+ throw new NativeRpcError(-32602, "The controller is cleaning this execution.");
123
+ assertControlCommand(command, journal.getSnapshot());
124
+ if (command.kind === "update_setting") {
125
+ if (!provider.setSetting)
126
+ throw new NativeRpcError(-32602, "Native settings are unavailable.");
127
+ return provider.setSetting(command.payload.settingId, command.payload.value, command.operationId, command.payload.expectedControlsRevision);
128
+ }
129
+ if (command.kind === "execute_command") {
130
+ if (!provider.executeCommand || !["not_required", "provider_accepted", "confirmed"].includes(journal.getSnapshot().initialInputState))
131
+ throw new NativeRpcError(-32602, "Native commands are unavailable.");
132
+ return provider.executeCommand(command.payload.commandId, command.payload.arguments, command.operationId, command.payload.expectedControlsRevision, command.payload.expectedTurnId);
133
+ }
134
+ if (command.kind === "refresh_controls") {
135
+ if (!provider.refreshControls)
136
+ throw new NativeRpcError(-32602, "Native controls are unavailable.");
137
+ return provider.refreshControls();
138
+ }
139
+ if (command.kind === "send_message") {
140
+ if (!["not_required", "provider_accepted", "confirmed"].includes(journal.getSnapshot().initialInputState))
141
+ throw new NativeRpcError(-32602, "Initial task input is not confirmed.");
142
+ if (ticket.initialInput === "none" && journal.getSnapshot().nativeSessionId === null && journal.listOperations().some(operation => operation.operationId !== command.operationId && operation.kind === "send_message" && ["dispatching", "provider_accepted", "confirmed", "unknown"].includes(operation.state)))
143
+ throw new NativeRpcError(-32602, "The first native input is still unconfirmed; its original operation must be reconciled.");
144
+ return provider.send(command.payload.content.map(part => part.text).join("\n"), command.operationId, command.payload.expectedTurnId);
145
+ }
146
+ if (command.kind === "cancel")
147
+ return provider.cancel(command.payload.expectedTurnId);
148
+ if (cleaning && !cleanupInteractions.has(command.payload.interactionId))
149
+ throw new NativeRpcError(-32602, "Only the current cleanup interaction may be answered.");
150
+ return provider.respond(command.payload.interactionId, command.payload.interactionRevision, command.payload.response);
151
+ };
152
+ const shutdown = () => {
153
+ if (shutdownPromise)
154
+ return shutdownPromise;
155
+ stopping = true;
156
+ shutdownPromise = (async () => {
157
+ try {
158
+ await startup?.catch(() => { });
159
+ journal.patchSnapshot({ lifecycle: "stopping" });
160
+ await provider?.close();
161
+ await Promise.all(processCaptures);
162
+ journal.patchSnapshot({ activity: "stopped", currentTurnId: null, capabilities: { send: false, steer: false, cancel: false, respond: false } });
163
+ if (projectionFailure) {
164
+ // Drain committed events before recording a visible gap. Never discard an
165
+ // earlier outbox row to make room for a later native callback.
166
+ await relay.flush();
167
+ journal.drainProjectionGap();
168
+ }
169
+ publishState();
170
+ await relay.flush().catch(fail);
171
+ }
172
+ catch (error) {
173
+ fail(error);
174
+ }
175
+ finally {
176
+ relay.close();
177
+ for (const socket of sockets)
178
+ socket.destroy();
179
+ server.close();
180
+ journal.close();
181
+ if (process.platform !== "win32")
182
+ await unlink(ticket.ipcEndpoint).catch(() => { });
183
+ complete();
184
+ }
185
+ })();
186
+ return shutdownPromise;
187
+ };
188
+ // One completion listener per dispatch, with removable socket waiters. A
189
+ // disconnected caller cannot cancel native work or retain an async handler.
190
+ const localWaiters = new Map();
191
+ let localWaiterCount = 0;
192
+ const waitForOperation = (socket, execution, milliseconds) => {
193
+ const existing = localWaiters.get(execution);
194
+ const waiters = existing ?? new Set();
195
+ if (!existing) {
196
+ localWaiters.set(execution, waiters);
197
+ const complete = (value, error) => {
198
+ localWaiters.delete(execution);
199
+ for (const waiter of waiters)
200
+ waiter(value, error);
201
+ };
202
+ void execution.then(value => complete(value), error => complete(null, error));
203
+ }
204
+ return new Promise((resolve, reject) => {
205
+ const finish = (value, error) => {
206
+ if (!waiters.delete(finish))
207
+ return;
208
+ localWaiterCount--;
209
+ clearTimeout(timer);
210
+ socket.off("close", disconnected);
211
+ if (error !== undefined)
212
+ reject(error);
213
+ else
214
+ resolve(value);
215
+ };
216
+ const disconnected = () => finish(null);
217
+ const timer = setTimeout(() => { socket.destroy(); disconnected(); }, milliseconds);
218
+ waiters.add(finish);
219
+ localWaiterCount++;
220
+ socket.once("close", disconnected);
221
+ if (socket.destroyed)
222
+ disconnected();
223
+ });
224
+ };
225
+ const server = createServer(socket => {
226
+ sockets.add(socket);
227
+ socket.once("close", () => sockets.delete(socket));
228
+ socket.on("error", () => { });
229
+ socket.setTimeout(30_000, () => socket.destroy());
230
+ socket.setEncoding("utf8");
231
+ let buffer = "", handled = false;
232
+ socket.on("data", (text) => {
233
+ if (handled)
234
+ return;
235
+ buffer += text;
236
+ if (Buffer.byteLength(buffer) > 5 * 1024 * 1024) {
237
+ socket.destroy();
238
+ return;
239
+ }
240
+ const newline = buffer.indexOf("\n");
241
+ if (newline < 0)
242
+ return;
243
+ handled = true;
244
+ void (async () => {
245
+ let requestId = "";
246
+ try {
247
+ const request = validateControllerLocalRequest(JSON.parse(buffer.slice(0, newline)), ticket);
248
+ requestId = request.requestId;
249
+ buffer = "";
250
+ // Admission bounds unauthenticated/incomplete frames. Once admitted,
251
+ // native RPC and action deadlines govern completion, including input
252
+ // acceptance that legitimately takes longer than this socket window.
253
+ socket.setTimeout(0);
254
+ let operation;
255
+ if (request.action.kind === "stop") {
256
+ socket.end(JSON.stringify({ requestId, ok: true, snapshot: journal.getSnapshot() }) + "\n", () => { void shutdown(); });
257
+ return;
258
+ }
259
+ if (request.action.kind !== "observe") {
260
+ const pending = active.get(request.action.operationId);
261
+ if (localWaiterCount >= 32 || localWaiters.size >= 32 && (!pending || !localWaiters.has(pending)))
262
+ throw new Error("Controller IPC action capacity is unavailable.");
263
+ if (!stopping && request.action.kind === "submit_initial" && (!provider || !synchronized)) {
264
+ // No dispatch intent exists yet. The worker may observe again
265
+ // after startup/reconnection without treating this as a failure.
266
+ journal.patchSnapshot({ lifecycle: "starting" });
267
+ socket.end(JSON.stringify({ requestId, ok: true, snapshot: journal.getSnapshot() }) + "\n");
268
+ return;
269
+ }
270
+ if (!provider || stopping || request.action.kind === "submit_initial" && !synchronized)
271
+ throw new Error("Controller is still initializing or disconnected.");
272
+ if (request.action.kind === "submit_initial") {
273
+ const prepared = journal.prepareOperation({ operationId: ticket.initialOperationId, kind: "initial", payload: { text: ticket.initialPrompt } });
274
+ operation = await waitForOperation(socket, dispatch(prepared, () => provider.send(ticket.initialPrompt, ticket.initialOperationId, null)), 65_000);
275
+ if (operation === null)
276
+ return;
277
+ }
278
+ else {
279
+ const action = request.action;
280
+ cleaning = true;
281
+ cleanupInputStarted = false;
282
+ cleanupInteractions.clear();
283
+ nativeEvent(publishState);
284
+ if (stopping)
285
+ throw new Error("Controller stopped after a durable event failure.");
286
+ if (Date.now() >= action.deadline)
287
+ throw new Error("Cleanup deadline expired.");
288
+ const prepared = journal.prepareOperation({ operationId: action.operationId, kind: "cleanup", payload: { text: action.prompt, deadline: action.deadline } });
289
+ operation = await waitForOperation(socket, dispatch(prepared, async () => {
290
+ const turn = journal.getSnapshot().currentTurnId;
291
+ if (turn !== null) {
292
+ await provider.cancel(turn);
293
+ while (journal.getSnapshot().currentTurnId !== null && Date.now() < action.deadline)
294
+ await new Promise(resolve => setTimeout(resolve, 25));
295
+ }
296
+ if (Date.now() >= action.deadline)
297
+ throw new Error("Cleanup deadline expired before input submission.");
298
+ journal.assertInputCapacity();
299
+ cleanupInputStarted = true;
300
+ const receipt = await provider.send(action.prompt, action.operationId, null);
301
+ journal.recordOperation(action.operationId, "provider_accepted", receipt);
302
+ if (!receipt.turnId)
303
+ throw new Error("Native cleanup turn identity is unknown.");
304
+ await provider.waitForTurn(receipt.turnId, action.deadline);
305
+ return receipt;
306
+ }), Math.max(1, Math.min(30_000, action.deadline - Date.now())));
307
+ if (operation === null)
308
+ return;
309
+ }
310
+ }
311
+ socket.end(JSON.stringify({ requestId, ok: true, snapshot: journal.getSnapshot(), ...(operation ? { operation } : {}) }) + "\n");
312
+ }
313
+ catch (error) {
314
+ socket.end(JSON.stringify({ requestId, ok: false, error: error instanceof Error ? error.message : String(error) }) + "\n");
315
+ }
316
+ })().catch(fail);
317
+ });
318
+ });
319
+ const nativeEvent = (write) => {
320
+ if (projectionFailure)
321
+ return;
322
+ try {
323
+ write();
324
+ }
325
+ catch (error) {
326
+ projectionFailure = error instanceof Error ? error.message : String(error);
327
+ fail(error);
328
+ try {
329
+ journal.markProjectionGap("Native projection stopped after a durable event failure. Resume must reload native history.");
330
+ }
331
+ catch (failure) {
332
+ fail(failure);
333
+ }
334
+ // Initialization must acquire the provider handle before it can close it.
335
+ if (provider)
336
+ void shutdown();
337
+ }
338
+ };
339
+ const signal = () => { void shutdown(); };
340
+ process.once("SIGINT", signal);
341
+ process.once("SIGTERM", signal);
342
+ startup = (async () => {
343
+ journal.patchSnapshot({ controllerProcess: await captureControllerProcessProof(ticket.launchId) });
344
+ if (stopping)
345
+ return;
346
+ await new Promise((resolve, reject) => { server.once("error", reject); server.listen(ticket.ipcEndpoint, () => { server.off("error", reject); resolve(); }); });
347
+ if (process.platform !== "win32")
348
+ await chmod(ticket.ipcEndpoint, 0o600);
349
+ if (stopping)
350
+ return;
351
+ const env = { ...process.env };
352
+ for (const key of ["CODEX_THREAD_ID", "CODEX_TURN_ID", "CLAUDECODE", "CLAUDE_CODE_ENTRYPOINT", "DAYNIGHT_CONTROLLER_TOKEN"])
353
+ delete env[key];
354
+ if (ticket.provider === "codex")
355
+ env.CODEX_HOME = ticket.nativeHome;
356
+ else if (ticket.provider === "claude")
357
+ env.CLAUDE_CONFIG_DIR = ticket.nativeHome;
358
+ else
359
+ env.COPILOT_HOME = ticket.nativeHome;
360
+ const nativeOptions = {
361
+ ...(journal.getSnapshot().controlsRevisionFloor ? { controlsRevisionFloor: journal.getSnapshot().controlsRevisionFloor } : {}),
362
+ cwd: ticket.cwd, model: ticket.configuration.model, args: ticket.configuration.args, resumeNativeSessionId: ticket.resumeNativeSessionId, unattended: ticket.claimId !== undefined, env,
363
+ onDiagnostic: diagnostic,
364
+ onFatalError: error => {
365
+ if (providerFailure)
366
+ return;
367
+ providerFailure = error.message;
368
+ fail(error);
369
+ // Startup must first acquire the provider handle. Awaiting shutdown from
370
+ // an opening callback would make startup wait for its own completion.
371
+ if (provider)
372
+ void shutdown();
373
+ },
374
+ onInputObserved: operationId => nativeEvent(() => {
375
+ if (!observeNativeInput(journal, operationId))
376
+ return;
377
+ publishState();
378
+ const receipt = journal.getOperation(operationId);
379
+ if (receipt?.kind === "send_message" || receipt?.kind === "execute_command") {
380
+ try {
381
+ relay.receipt(receipt);
382
+ }
383
+ catch (error) {
384
+ diagnostic(String(error));
385
+ }
386
+ }
387
+ }),
388
+ onControlConfirmed: operationId => nativeEvent(() => {
389
+ const operation = journal.getOperation(operationId);
390
+ if (!operation || !["update_setting", "execute_command"].includes(operation.kind) || !["dispatching", "provider_accepted", "unknown"].includes(operation.state))
391
+ return;
392
+ const receipt = journal.recordOperation(operationId, "confirmed", { disposition: "handled" });
393
+ publishState();
394
+ try {
395
+ relay.receipt(receipt);
396
+ }
397
+ catch (error) {
398
+ diagnostic(String(error));
399
+ }
400
+ }),
401
+ onTimeline: entry => nativeEvent(() => {
402
+ journal.projectTimeline(entry);
403
+ if (entry.kind === "interaction") {
404
+ const id = entry.interaction.interactionId;
405
+ if (cleaning && cleanupInputStarted && !knownInteractions.has(id) && entry.interaction.state === "pending")
406
+ cleanupInteractions.add(id);
407
+ knownInteractions.add(id);
408
+ if (entry.interaction.state !== "pending")
409
+ cleanupInteractions.delete(id);
410
+ if (cleaning)
411
+ publishState();
412
+ }
413
+ if (entry.kind === "interaction" && entry.interaction.state === "resolved") {
414
+ for (const receipt of observeNativeInteraction(journal, entry.interaction.interactionId, ticket.executionGeneration)) {
415
+ try {
416
+ relay.receipt(receipt);
417
+ }
418
+ catch (error) {
419
+ diagnostic(String(error));
420
+ }
421
+ }
422
+ }
423
+ }),
424
+ onState: state => nativeEvent(() => { const { nativeSessionId, ...status } = state; journal.patchSnapshot({ ...status, ...(nativeSessionId !== null ? { nativeSessionId } : {}), lifecycle: state.activity === "idle" ? "ready" : state.activity === "stopped" ? "stopping" : "working" }); publishState(); }),
425
+ onSpawn: child => { if (!child.pid)
426
+ throw new Error("Native process identity is unavailable."); const capture = captureProcessProof(child.pid).then(proof => { const s = journal.getSnapshot(); journal.patchSnapshot({ nativeProcesses: [...s.nativeProcesses, proof] }); }); processCaptures.push(capture); void capture.catch(fail); },
427
+ };
428
+ provider = await (ticket.provider === "codex" ? (await import("./providers/codex.js")).openCodexProvider(nativeOptions)
429
+ : ticket.provider === "claude" ? (await import("./providers/claude.js")).openClaudeProvider(nativeOptions)
430
+ : (await import("./providers/copilot.js")).openCopilotProvider(nativeOptions));
431
+ await Promise.all(processCaptures);
432
+ if (projectionFailure)
433
+ throw new Error(projectionFailure);
434
+ if (providerFailure)
435
+ throw new Error(providerFailure);
436
+ if (stopping)
437
+ return;
438
+ journal.patchSnapshot({ lifecycle: "ready" });
439
+ publishState();
440
+ })();
441
+ try {
442
+ await startup;
443
+ await finished;
444
+ }
445
+ catch (error) {
446
+ fail(error);
447
+ await shutdown();
448
+ throw error;
449
+ }
450
+ finally {
451
+ process.off("SIGINT", signal);
452
+ process.off("SIGTERM", signal);
453
+ }
454
+ };
455
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/commands/controller/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Job membership survives handle closure while associated processes remain; breakaway is not enabled. */
2
+ export declare const createControllerJob: (launchId: string, pid: number) => Promise<string>;
3
+ export declare const inspectControllerJob: (name: string, stop?: boolean) => Promise<readonly number[]>;
@@ -0,0 +1,59 @@
1
+ import { execFile } from "node:child_process";
2
+ const api = `
3
+ using System;
4
+ using System.ComponentModel;
5
+ using System.Runtime.InteropServices;
6
+ public static class DaynightJob {
7
+ [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern IntPtr CreateJobObject(IntPtr attrs,string name);
8
+ [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern IntPtr OpenJobObject(uint access,bool inherit,string name);
9
+ [DllImport("kernel32.dll", SetLastError=true)] static extern IntPtr OpenProcess(uint access,bool inherit,int pid);
10
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool AssignProcessToJobObject(IntPtr job,IntPtr process);
11
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool QueryInformationJobObject(IntPtr job,int info,IntPtr data,uint size,IntPtr returned);
12
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool TerminateJobObject(IntPtr job,uint code);
13
+ [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle);
14
+ public static void Create(string name,int pid) {
15
+ IntPtr job=CreateJobObject(IntPtr.Zero,name); int error=Marshal.GetLastWin32Error();
16
+ if(job==IntPtr.Zero) throw new Win32Exception(error);
17
+ try { if(error==183) throw new InvalidOperationException("Controller job identity already exists.");
18
+ IntPtr process=OpenProcess(0x101,false,pid); if(process==IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error());
19
+ try { if(!AssignProcessToJobObject(job,process)) throw new Win32Exception(Marshal.GetLastWin32Error()); } finally { CloseHandle(process); }
20
+ } finally { CloseHandle(job); }
21
+ }
22
+ public static long[] Inspect(string name,bool stop) {
23
+ IntPtr job=OpenJobObject(stop?12u:4u,false,name);
24
+ if(job==IntPtr.Zero) { int error=Marshal.GetLastWin32Error(); if(error==2) return null; throw new Win32Exception(error); }
25
+ try {
26
+ if(stop && !TerminateJobObject(job,1)) throw new Win32Exception(Marshal.GetLastWin32Error());
27
+ uint size=262144; IntPtr data=Marshal.AllocHGlobal((int)size);
28
+ try { if(!QueryInformationJobObject(job,3,data,size,IntPtr.Zero)) throw new Win32Exception(Marshal.GetLastWin32Error());
29
+ int count=Marshal.ReadInt32(data,4); if(count<0 || 8L+(long)count*IntPtr.Size>size) throw new InvalidOperationException("Invalid job process inventory.");
30
+ long[] ids=new long[count]; for(int i=0;i<count;i++) ids[i]=Marshal.ReadIntPtr(data,8+i*IntPtr.Size).ToInt64(); return ids;
31
+ } finally { Marshal.FreeHGlobal(data); }
32
+ } finally { CloseHandle(job); }
33
+ }
34
+ }
35
+ `;
36
+ const invoke = async (command) => {
37
+ const script = `$ErrorActionPreference='Stop'\nAdd-Type -TypeDefinition @'\n${api}\n'@\n${command}`;
38
+ return new Promise((resolve, reject) => execFile("powershell.exe", ["-NoProfile", "-NonInteractive", "-EncodedCommand", Buffer.from(script, "utf16le").toString("base64")], { encoding: "utf8", timeout: 15000, maxBuffer: 1048576, windowsHide: true }, (error, stdout) => error === null ? resolve(stdout) : reject(new Error("Windows controller Job Object operation failed.", { cause: error }))));
39
+ };
40
+ const validate = (name) => { if (!/^Local\\Daynight-[0-9a-f-]{36}$/.test(name))
41
+ throw new Error("Invalid controller Job Object identity."); };
42
+ /** Job membership survives handle closure while associated processes remain; breakaway is not enabled. */
43
+ export const createControllerJob = async (launchId, pid) => {
44
+ const name = `Local\\Daynight-${launchId}`;
45
+ validate(name);
46
+ if (!Number.isSafeInteger(pid) || pid <= 0)
47
+ throw new Error("Invalid controller process ID.");
48
+ await invoke(`[DaynightJob]::Create('${name}',${pid})`);
49
+ return name;
50
+ };
51
+ export const inspectControllerJob = async (name, stop = false) => {
52
+ validate(name);
53
+ const output = await invoke(`$ids=[DaynightJob]::Inspect('${name}',$${stop ? 'true' : 'false'}); ConvertTo-Json -InputObject @($ids) -Compress`);
54
+ const value = JSON.parse(output);
55
+ if (!Array.isArray(value) || value.some(id => id !== null && (!Number.isSafeInteger(id) || id <= 0)))
56
+ throw new Error("Invalid controller Job Object process inventory.");
57
+ return value.filter((id) => id !== null);
58
+ };
59
+ //# sourceMappingURL=windows-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-job.js","sourceRoot":"","sources":["../../../src/commands/controller/windows-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCX,CAAC;AACF,MAAM,MAAM,GAAG,KAAK,EAAE,OAAe,EAAmB,EAAE;IACxD,MAAM,MAAM,GAAG,+DAA+D,GAAG,SAAS,OAAO,EAAE,CAAC;IACpG,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAC,MAAM,EAAE,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAE,EAAC,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE,CAAA,KAAK,KAAG,IAAI,CAAA,CAAC,CAAA,OAAO,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,IAAI,KAAK,CAAC,iDAAiD,EAAC,EAAC,KAAK,EAAC,KAAK,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpX,CAAC,CAAC;AACF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAQ,EAAE,GAAG,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC;IAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5J,0GAA0G;AAC1G,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,QAAgB,EAAE,GAAW,EAAmB,EAAE;IAC1F,MAAM,IAAI,GAAG,mBAAmB,QAAQ,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC5F,MAAM,MAAM,CAAC,0BAA0B,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC;IAAC,OAAO,IAAI,CAAC;AACvE,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,IAAY,EAAE,IAAI,GAAG,KAAK,EAA8B,EAAE;IACnG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,MAAM,GAAC,MAAM,MAAM,CAAC,gCAAgC,IAAI,MAAM,IAAI,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,OAAO,kDAAkD,CAAC,CAAC;IAC3J,MAAM,KAAK,GAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAAC,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAA,EAAE,CAAA,EAAE,KAAG,IAAI,IAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAE,EAAE,IAAE,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACrM,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAc,EAAE,CAAA,EAAE,KAAG,IAAI,CAAC,CAAC;AACpD,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { TimelineEntry } from "../../session/protocol.js";
2
+ import type { SourceTimelineEntry } from "../../session/controller-protocol.js";
3
+ export declare const sessionWireBytes: (value: unknown) => number;
4
+ export declare function sessionDisplayEntry(entry: TimelineEntry): TimelineEntry;
5
+ export declare function sessionDisplayEntry(entry: SourceTimelineEntry): SourceTimelineEntry;
@@ -0,0 +1,11 @@
1
+ // Go's JSON encoder preserves HTML text on this transport, but still escapes
2
+ // these two Unicode separators in typed strings. Budget for that representation
3
+ // even when the controller's JSON.stringify leaves them as literal characters.
4
+ export const sessionWireBytes = (value) => Buffer.byteLength(JSON.stringify(value).replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029"));
5
+ const maxDisplayEntryBytes = 1_400_000;
6
+ export function sessionDisplayEntry(entry) {
7
+ if (entry.kind === "interaction" || sessionWireBytes(entry) <= maxDisplayEntryBytes)
8
+ return entry;
9
+ return { entryId: entry.entryId, ...(entry.entrySeq === undefined ? {} : { entrySeq: entry.entrySeq }), revision: entry.revision, kind: "error", code: "display_budget_exceeded", message: "This entry exceeds the web display size limit. Its complete projected content is retained in the controller's local session journal." };
10
+ }
11
+ //# sourceMappingURL=wire-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire-display.js","sourceRoot":"","sources":["../../../src/commands/controller/wire-display.ts"],"names":[],"mappings":"AAGA,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACrK,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAOvC,MAAM,UAAU,mBAAmB,CAAC,KAA0B;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,oBAAoB;QAAE,OAAO,KAAK,CAAC;IAClG,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,sIAAsI,EAAE,CAAC;AACtU,CAAC"}