@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,99 @@
1
+ import { createHash } from "node:crypto";
2
+ import { record, string } from "./native-rpc.js";
3
+ // Native item IDs survive reconnects; transport IDs must never create new timeline rows.
4
+ export const nativeEntryId = (session, item) => {
5
+ const h = createHash("sha256").update(session).update("\0").update(item).digest("hex");
6
+ return `${h.slice(0, 8)}-${h.slice(8, 12)}-4${h.slice(13, 16)}-8${h.slice(17, 20)}-${h.slice(20, 32)}`;
7
+ };
8
+ export const readable = (value) => typeof value === "string" ? value : JSON.stringify(value, null, 2) ?? "";
9
+ export const limited = (value) => {
10
+ if (value.length <= 200_000)
11
+ return value;
12
+ // UTF-16 limits must not split a scalar value accepted by the wire codec.
13
+ const end = /[\uD800-\uDBFF]/.test(value[199_999]) && /[\uDC00-\uDFFF]/.test(value[200_000]) ? 199_999 : 200_000;
14
+ return value.slice(0, end) + "\n[Output truncated at 200000 characters]";
15
+ };
16
+ export const parseProviderArguments = (provider, args) => {
17
+ const result = {};
18
+ for (let i = 0; i < args.length; i++) {
19
+ const arg = args[i], value = args[++i];
20
+ if (!value)
21
+ throw new Error(`Unsupported or incomplete Web ${provider} argument: ${arg}`);
22
+ if (provider === "codex" && ["--sandbox", "-s"].includes(arg) && ["read-only", "workspace-write"].includes(value))
23
+ result.sandbox = value;
24
+ else if (provider === "codex" && ["--ask-for-approval", "-a"].includes(arg) && ["untrusted", "on-request", "never"].includes(value))
25
+ result.approvalPolicy = value;
26
+ else if (provider === "claude" && arg === "--permission-mode" && ["default", "acceptEdits", "plan"].includes(value))
27
+ result.permissionMode = value;
28
+ else if (arg === "--effort" && (provider === "copilot" ? ["low", "medium", "high", "xhigh"] : ["low", "medium", "high", "xhigh", "max"]).includes(value))
29
+ result.effort = value;
30
+ else if (provider === "claude" && arg === "--add-dir")
31
+ (result.additionalDirectories ??= []).push(value);
32
+ else
33
+ throw new Error(`Unsupported Web ${provider} argument: ${arg}`);
34
+ }
35
+ return result;
36
+ };
37
+ export class CodexProjection {
38
+ sessionId;
39
+ emit;
40
+ content = new Map();
41
+ tools = new Map();
42
+ constructor(sessionId, emit) {
43
+ this.sessionId = sessionId;
44
+ this.emit = emit;
45
+ }
46
+ base(id) { return { entryId: nativeEntryId(this.sessionId, id), revision: "1" }; }
47
+ delta(id, delta, kind) {
48
+ const value = (this.content.get(id) ?? "") + delta;
49
+ this.content.set(id, value);
50
+ if (kind === "reasoning" && value.trim() === "")
51
+ return;
52
+ this.emit(kind === "reasoning" ? { ...this.base(id), kind, text: limited(value) } : { ...this.base(id), kind, content: [{ type: "text", text: limited(value) }] });
53
+ }
54
+ toolDelta(id, delta) {
55
+ const old = this.tools.get(id);
56
+ if (!old)
57
+ return;
58
+ const prior = old.output.map(part => part.type === "text" ? part.text : "").join("");
59
+ const output = prior + delta;
60
+ const entry = { ...old, output: [{ type: "text", text: limited(output) }], truncated: old.truncated || output.length > 200_000 };
61
+ this.tools.set(id, entry);
62
+ this.emit(entry);
63
+ }
64
+ item(value, completed) {
65
+ const item = record(value), id = string(item.id), type = string(item.type);
66
+ if (!id)
67
+ return;
68
+ const base = this.base(id);
69
+ if (type === "agentMessage") {
70
+ const text = string(item.text);
71
+ this.content.set(id, text);
72
+ this.emit({ ...base, kind: "assistant_message", content: [{ type: "text", text: limited(text) }] });
73
+ }
74
+ else if (type === "userMessage")
75
+ this.emit({ ...base, kind: "user_message", content: (Array.isArray(item.content) ? item.content : []).flatMap(part => { const p = record(part); return p.type === "text" ? [{ type: "text", text: limited(string(p.text)) }] : [{ type: "text", text: `[${string(p.type) || "unsupported native content"}]` }]; }) });
76
+ else if (type === "reasoning") {
77
+ const text = [...(Array.isArray(item.summary) ? item.summary : []), ...(Array.isArray(item.content) ? item.content : [])].map(readable).join("\n");
78
+ // Empty native reasoning can contain only opaque provider state. It is
79
+ // neither displayable text nor evidence that streamed text was removed.
80
+ if (text.trim() === "")
81
+ return;
82
+ this.content.set(id, text);
83
+ this.emit({ ...base, kind: "reasoning", text: limited(text) });
84
+ }
85
+ else if (["commandExecution", "fileChange", "mcpToolCall", "dynamicToolCall", "webSearch", "imageView", "collabAgentToolCall"].includes(type)) {
86
+ const output = readable(item.aggregatedOutput ?? item.result ?? item.error ?? item.changes ?? "");
87
+ const entry = { ...base, kind: "tool_call", callId: id, name: string(item.tool) || type, input: limited(readable(item.command ?? item.arguments ?? item.query ?? item.changes ?? item)), output: [{ type: "text", text: limited(output) }], status: ["failed", "declined"].includes(string(item.status)) || item.error ? "failed" : completed ? "completed" : "running", truncated: output.length > 200_000 };
88
+ this.tools.set(id, entry);
89
+ this.emit(entry);
90
+ }
91
+ else if (type === "contextCompaction")
92
+ this.emit({ ...base, kind: "compaction", summary: "Native conversation context compacted." });
93
+ else if (type === "plan")
94
+ this.emit({ ...base, kind: "assistant_message", content: [{ type: "text", text: limited(string(item.text) || readable(item)) }] });
95
+ else
96
+ this.emit({ ...base, kind: "error", code: "unsupported_native_item", message: `Unsupported native timeline item: ${type || "unknown"}. ${limited(readable(item))}` });
97
+ }
98
+ }
99
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../../src/commands/controller/providers/projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class NativeTurns {
2
+ private readonly completed;
3
+ private readonly waiters;
4
+ isComplete(id: string): boolean;
5
+ complete(id: string, error: Error | null): void;
6
+ wait(id: string, deadline: number): Promise<void>;
7
+ }
@@ -0,0 +1,21 @@
1
+ export class NativeTurns {
2
+ completed = new Map();
3
+ waiters = new Map();
4
+ isComplete(id) { return this.completed.has(id); }
5
+ complete(id, error) { this.completed.set(id, error); for (const resolve of this.waiters.get(id) ?? [])
6
+ resolve(error); this.waiters.delete(id); }
7
+ wait(id, deadline) {
8
+ if (this.completed.has(id)) {
9
+ const error = this.completed.get(id);
10
+ return error ? Promise.reject(error) : Promise.resolve();
11
+ }
12
+ return new Promise((resolve, reject) => {
13
+ const finish = (error) => { clearTimeout(timer); this.waiters.get(id)?.delete(finish); error ? reject(error) : resolve(); };
14
+ const timer = setTimeout(() => finish(new Error("Native turn completion is unknown after its deadline.")), Math.max(0, deadline - Date.now()));
15
+ const waiters = this.waiters.get(id) ?? new Set();
16
+ waiters.add(finish);
17
+ this.waiters.set(id, waiters);
18
+ });
19
+ }
20
+ }
21
+ //# sourceMappingURL=turns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turns.js","sourceRoot":"","sources":["../../../../src/commands/controller/providers/turns.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACL,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,OAAO,GAAG,IAAI,GAAG,EAA8C,CAAC;IACjF,UAAU,CAAC,EAAU,IAAa,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,EAAU,EAAE,KAAmB,IAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7K,IAAI,CAAC,EAAU,EAAE,QAAgB;QAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QAC/H,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1I,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/I,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACxG,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ import type { SessionControls } from "../../../session/controls.js";
2
+ import type { ChildProcess } from "node:child_process";
3
+ import type { InteractionResponse, SessionCapabilities, SessionSnapshot, TimelineEntry } from "../../../session/protocol.js";
4
+ export type ProviderEntry = TimelineEntry extends infer T ? T extends TimelineEntry ? Omit<T, "entrySeq"> : never : never;
5
+ export type ProviderState = {
6
+ nativeSessionId: string | null;
7
+ activity: SessionSnapshot["activity"];
8
+ currentTurnId: string | null;
9
+ capabilities: SessionCapabilities;
10
+ controls?: SessionControls;
11
+ turnStartedAt?: string | null;
12
+ };
13
+ export type ProviderOptions = {
14
+ cwd: string;
15
+ model: string | null;
16
+ args: readonly string[];
17
+ resumeNativeSessionId: string | null;
18
+ unattended?: boolean;
19
+ env?: NodeJS.ProcessEnv;
20
+ executable?: string;
21
+ controlsRevisionFloor?: string;
22
+ onTimeline(entry: ProviderEntry): void;
23
+ onState(state: ProviderState): void;
24
+ onSpawn(child: ChildProcess): void;
25
+ onDiagnostic?(line: string): void;
26
+ onFatalError?(error: Error): void;
27
+ onControlConfirmed?(operationId: string): void;
28
+ onInputObserved?(operationId: string): void;
29
+ };
30
+ export type ProviderReceipt = {
31
+ disposition: "started" | "queued" | "handled";
32
+ turnId?: string;
33
+ };
34
+ export interface NativeProvider {
35
+ readonly nativeSessionId: string;
36
+ send(text: string, operationId: string, expectedTurnId: string | null): Promise<ProviderReceipt>;
37
+ cancel(expectedTurnId: string): Promise<ProviderReceipt>;
38
+ respond(interactionId: string, revision: string, response: InteractionResponse): Promise<ProviderReceipt>;
39
+ setSetting?(settingId: string, value: string, operationId: string, expectedControlsRevision: string): Promise<ProviderReceipt>;
40
+ executeCommand?(commandId: string, args: string, operationId: string, expectedControlsRevision: string, expectedTurnId: string | null): Promise<ProviderReceipt>;
41
+ refreshControls?(): Promise<ProviderReceipt>;
42
+ waitForTurn(turnId: string, deadline: number): Promise<void>;
43
+ close(): Promise<void>;
44
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/controller/providers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { ControllerLifecycleStore, ControllerOperation } from "./lifecycle-store.js";
2
+ export declare const isCleaningGeneration: (operations: readonly ControllerOperation[], generation: string) => boolean;
3
+ /** A native user-message identity proves receipt, not successful turn completion. */
4
+ export declare const observeNativeInput: (journal: ControllerLifecycleStore, operationId: string) => boolean;
5
+ /** A late native resolution can settle a timed-out response without resubmitting it. */
6
+ export declare const observeNativeInteraction: (journal: ControllerLifecycleStore, interactionId: string, generation: string) => ControllerOperation[];
@@ -0,0 +1,22 @@
1
+ export const isCleaningGeneration = (operations, generation) => operations.some(operation => operation.kind === "cleanup" && operation.executionGeneration === generation);
2
+ /** A native user-message identity proves receipt, not successful turn completion. */
3
+ export const observeNativeInput = (journal, operationId) => {
4
+ const operation = journal.getOperation(operationId);
5
+ if (!operation || !["initial", "send_message", "execute_command"].includes(operation.kind) || !["dispatching", "unknown"].includes(operation.state))
6
+ return false;
7
+ journal.recordOperation(operationId, "provider_accepted", operation.result);
8
+ return true;
9
+ };
10
+ /** A late native resolution can settle a timed-out response without resubmitting it. */
11
+ export const observeNativeInteraction = (journal, interactionId, generation) => {
12
+ const receipts = [];
13
+ for (const operation of journal.listOperations()) {
14
+ if (operation.executionGeneration !== generation || operation.kind !== "interaction_response" || !["dispatching", "provider_accepted", "unknown"].includes(operation.state))
15
+ continue;
16
+ if (!operation.payload || typeof operation.payload !== "object" || !("interactionId" in operation.payload) || operation.payload.interactionId !== interactionId)
17
+ continue;
18
+ receipts.push(journal.recordOperation(operation.operationId, "confirmed", { disposition: "handled" }));
19
+ }
20
+ return receipts;
21
+ };
22
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../src/commands/controller/recovery.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAA0C,EAAE,UAAkB,EAAW,EAAE,CAC9G,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,mBAAmB,KAAK,UAAU,CAAC,CAAC;AAE7G,qFAAqF;AACrF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAiC,EAAE,WAAmB,EAAW,EAAE;IACpG,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClK,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,mBAAmB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAiC,EAAE,aAAqB,EAAE,UAAkB,EAAyB,EAAE;IAC9I,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,mBAAmB,KAAK,UAAU,IAAI,SAAS,CAAC,IAAI,KAAK,sBAAsB,IAAI,CAAC,CAAC,aAAa,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,SAAS;QACtL,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,aAAa,KAAK,aAAa;YAAE,SAAS;QAC1K,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type SessionCommand, type SessionOperation } from "../../session/protocol.js";
2
+ import { type ControllerGrantResponse, type ControllerState } from "../../session/controller-protocol.js";
3
+ import type { ControllerLaunchTicket } from "./launch-ticket.js";
4
+ import type { ControllerLifecycleStore, ControllerOperation } from "./lifecycle-store.js";
5
+ export declare const publicOperation: (ticket: ControllerLaunchTicket, operation: ControllerOperation) => SessionOperation;
6
+ export declare const readControllerGrant: (ticket: ControllerLaunchTicket) => Promise<ControllerGrantResponse>;
7
+ export declare const createControllerRelay: (ticket: ControllerLaunchTicket, journal: ControllerLifecycleStore, callbacks: {
8
+ onConnection(connected: boolean): void;
9
+ onCommand(command: SessionCommand): Promise<void>;
10
+ onError(message: string): void;
11
+ readState?(): ControllerState;
12
+ }) => {
13
+ connected: () => boolean;
14
+ authorize: (operationId: string) => Promise<void>;
15
+ receipt: (operation: ControllerOperation) => void;
16
+ flush(timeoutMs?: number): Promise<void>;
17
+ close: () => void;
18
+ };
@@ -0,0 +1,299 @@
1
+ import { sessionDisplayEntry, sessionWireBytes } from "./wire-display.js";
2
+ import { sessionFence } from "../../session/protocol.js";
3
+ import { readFile, lstat } from "node:fs/promises";
4
+ import { randomUUID } from "node:crypto";
5
+ import WebSocket from "ws";
6
+ import { SESSION_PROTOCOL } from "../../session/protocol.js";
7
+ import { RELAY_LIMITS, parseControllerGrantResponse, parseRelayMessage } from "../../session/controller-protocol.js";
8
+ export const publicOperation = (ticket, operation) => ({ protocol: SESSION_PROTOCOL, ...sessionFence(ticket), executionGeneration: operation.executionGeneration ?? ticket.executionGeneration, operationId: operation.operationId, kind: operation.kind === "initial" || operation.kind === "cleanup" ? "send_message" : operation.kind, state: operation.state, providerResult: operation.result?.disposition ?? null, error: operation.error ? { code: "native_operation_error", message: operation.error } : null });
9
+ export const readControllerGrant = async (ticket) => {
10
+ const metadata = await lstat(ticket.credentialFile);
11
+ if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > 16_384 || process.platform !== "win32" && (metadata.mode & 0o077) !== 0)
12
+ throw new Error("Controller credential must be a private regular file.");
13
+ const grant = parseControllerGrantResponse(JSON.parse(await readFile(ticket.credentialFile, "utf8")));
14
+ if (grant.sessionId !== ticket.sessionId || grant.claimId !== ticket.claimId || grant.testExecutionId !== ticket.testExecutionId || grant.executionGeneration !== ticket.executionGeneration || grant.controllerId !== ticket.controllerId || grant.controllerInstanceId !== ticket.controllerInstanceId || Date.parse(grant.expiresAt) <= Date.now())
15
+ throw new Error("Controller credential is stale or belongs to another execution.");
16
+ return grant;
17
+ };
18
+ export const createControllerRelay = (ticket, journal, callbacks) => {
19
+ let socket = null, fence = null, stopped = false, synchronized = false;
20
+ let reconciled = false, requiresLiveSync = false, syncPending = false, connectionFloor = "0";
21
+ let historyEpoch = "";
22
+ const contentRequests = [];
23
+ let reconciliation = [];
24
+ let pendingBatch = null, currentToken = "", lastHeartbeat = 0, reconnectAt = 0, connecting = false;
25
+ const authorization = new Map();
26
+ const settleDispatchRefusal = (operation, required = false, currentConnection = false) => {
27
+ const local = journal.getOperation(operation.operationId);
28
+ if (!required && local?.state !== "accepted")
29
+ return;
30
+ if (!local || local.state !== "accepted" || operation.kind !== local.kind || operation.sessionId !== ticket.sessionId || operation.claimId !== ticket.claimId || operation.testExecutionId !== ticket.testExecutionId || (local.executionGeneration ?? ticket.executionGeneration) !== operation.executionGeneration || currentConnection && operation.executionGeneration !== fence?.executionGeneration || (operation.state !== "rejected" && operation.state !== "expired"))
31
+ throw new Error("Invalid dispatch refusal receipt.");
32
+ journal.recordOperation(operation.operationId, operation.state, null, operation.error?.message ?? "Operation no longer has current permission or state.");
33
+ };
34
+ const clearConnection = () => { fence = null; synchronized = false; reconciled = false; syncPending = false; contentRequests.length = 0; pendingBatch = null; callbacks.onConnection(false); for (const waiter of authorization.values()) {
35
+ clearTimeout(waiter.timer);
36
+ waiter.reject(new Error("Relay disconnected before native dispatch authorization."));
37
+ } authorization.clear(); };
38
+ const send = (message) => { if (!socket || socket.readyState !== WebSocket.OPEN)
39
+ throw new Error("Session relay is offline."); const text = JSON.stringify(message); if (sessionWireBytes(message) > RELAY_LIMITS.maxFrameBytes)
40
+ throw new Error("Controller frame exceeds relay limit."); socket.send(text); };
41
+ const prefix = () => { if (!fence)
42
+ throw new Error("Session relay is not synchronized."); return { protocol: SESSION_PROTOCOL, ...fence }; };
43
+ const sendReconciliation = () => {
44
+ const batch = reconciliation.shift() ?? [];
45
+ send({ ...prefix(), type: "reconcile", final: reconciliation.length === 0, operations: batch.map(o => ({ operationId: o.operationId, state: o.state === "accepted" ? "not_submitted" : ["confirmed", "failed", "rejected", "expired", "provider_accepted"].includes(o.state) ? o.state : "unknown", providerResult: publicOperation(ticket, o).providerResult, error: publicOperation(ticket, o).error })) });
46
+ };
47
+ const connect = async () => {
48
+ if (stopped || connecting || socket)
49
+ return;
50
+ connecting = true;
51
+ try {
52
+ const grant = await readControllerGrant(ticket);
53
+ if (stopped)
54
+ return;
55
+ currentToken = grant.token;
56
+ const url = new URL("/api/v1/controller-channel", ticket.serverOrigin);
57
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
58
+ const ws = new WebSocket(url, { headers: { Authorization: `Bearer ${grant.token}` }, handshakeTimeout: 10_000, maxPayload: RELAY_LIMITS.maxFrameBytes });
59
+ socket = ws;
60
+ ws.on("error", error => callbacks.onError(error.message));
61
+ ws.on("close", () => { if (socket !== ws)
62
+ return; socket = null; clearConnection(); reconnectAt = Date.now() + 1000; });
63
+ ws.on("open", () => { if (stopped || socket !== ws)
64
+ return; send({ type: "hello", protocol: SESSION_PROTOCOL, schemaVersion: 1, projectionVersion: 1, ...sessionFence(ticket), controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId, provider: ticket.provider, sourceEpoch: ticket.executionId, lastAckedSourceSeq: journal.getLastAcknowledgedSequence(), ...(journal.getSourceFloor ? { sourceFloor: connectionFloor = journal.getSourceFloor() } : {}) }); });
65
+ ws.on("message", data => {
66
+ if (stopped || socket !== ws)
67
+ return;
68
+ try {
69
+ const message = parseRelayMessage(JSON.parse(data.toString()));
70
+ if (message.type === "welcome") {
71
+ if (message.session.sessionId !== ticket.sessionId || message.session.claimId !== ticket.claimId || message.session.testExecutionId !== ticket.testExecutionId || message.session.executionGeneration !== ticket.executionGeneration || message.session.identity.controllerInstanceId !== ticket.controllerInstanceId)
72
+ throw new Error("Relay identity mismatch.");
73
+ fence = { ...sessionFence(ticket), connectionEpoch: message.connectionEpoch };
74
+ requiresLiveSync = message.requiresLiveSync === true;
75
+ historyEpoch = message.session.historyEpoch;
76
+ journal.acknowledgeEvents(message.lastAckedSourceSeq);
77
+ const unacknowledged = [];
78
+ let after;
79
+ for (;;) {
80
+ const page = journal.listUnacknowledgedOperations(100, after);
81
+ unacknowledged.push(...page.filter(o => o.kind !== "initial" && o.kind !== "cleanup"));
82
+ if (page.length < 100)
83
+ break;
84
+ after = page.at(-1).operationId;
85
+ }
86
+ reconciliation = [];
87
+ for (let i = 0; i < unacknowledged.length; i += 100)
88
+ reconciliation.push(unacknowledged.slice(i, i + 100));
89
+ if (!reconciliation.length)
90
+ reconciliation.push([]);
91
+ sendReconciliation();
92
+ return;
93
+ }
94
+ if (!fence || message.sessionId !== fence.sessionId || message.claimId !== fence.claimId || message.testExecutionId !== fence.testExecutionId || message.executionGeneration !== fence.executionGeneration || message.connectionEpoch !== fence.connectionEpoch)
95
+ throw new Error("Stale relay frame.");
96
+ if (message.type === "reconcile_result") {
97
+ for (const operation of message.operations)
98
+ if (["confirmed", "failed", "rejected", "expired"].includes(operation.state)) {
99
+ if (operation.state === "rejected" || operation.state === "expired")
100
+ settleDispatchRefusal(operation);
101
+ journal.markOperationAcknowledged(operation.operationId);
102
+ }
103
+ if (reconciliation.length)
104
+ sendReconciliation();
105
+ else {
106
+ reconciled = true;
107
+ if (!requiresLiveSync) {
108
+ synchronized = true;
109
+ callbacks.onConnection(true);
110
+ }
111
+ }
112
+ }
113
+ else if (message.type === "sync_ack") {
114
+ if (!requiresLiveSync || !syncPending || !reconciled)
115
+ throw new Error("Unexpected live synchronization acknowledgement.");
116
+ syncPending = false;
117
+ synchronized = true;
118
+ callbacks.onConnection(true);
119
+ }
120
+ else if (message.type === "content_request") {
121
+ if (!synchronized || !requiresLiveSync)
122
+ throw new Error("Content requested before live synchronization.");
123
+ if (contentRequests.length >= 4) {
124
+ send({ ...prefix(), type: "content_response", requestId: message.requestId, sourceThrough: journal.getLastAcknowledgedSequence(), result: null, error: { code: "rate_limited", message: "Local content request capacity is unavailable." } });
125
+ }
126
+ else
127
+ contentRequests.push({ request: message, response: null });
128
+ }
129
+ else if (message.type === "receipt_ack") {
130
+ const operation = message.operation;
131
+ const waiter = authorization.get(operation.operationId);
132
+ if (waiter || operation.state === "rejected" || operation.state === "expired")
133
+ settleDispatchRefusal(operation, waiter !== undefined, true);
134
+ journal.markOperationAcknowledged(operation.operationId);
135
+ if (waiter) {
136
+ authorization.delete(operation.operationId);
137
+ clearTimeout(waiter.timer);
138
+ waiter.reject(new Error(operation.error?.message ?? "Operation no longer has current permission or state."));
139
+ }
140
+ }
141
+ else if (message.type === "events_ack") {
142
+ if (message.sourceEpoch !== ticket.executionId || !pendingBatch || message.batchId !== pendingBatch.id || BigInt(message.lastAckedSourceSeq) < BigInt(pendingBatch.through))
143
+ throw new Error("Invalid event ACK.");
144
+ journal.acknowledgeEvents(message.lastAckedSourceSeq);
145
+ pendingBatch = null;
146
+ }
147
+ else if (message.type === "operation_offer") {
148
+ if (!synchronized)
149
+ throw new Error("Operation offered before reconciliation.");
150
+ void callbacks.onCommand(message.command).catch(error => callbacks.onError(String(error)));
151
+ }
152
+ else if (message.type === "operation_authorized") {
153
+ const waiter = authorization.get(message.operationId);
154
+ if (waiter) {
155
+ authorization.delete(message.operationId);
156
+ clearTimeout(waiter.timer);
157
+ waiter.resolve();
158
+ }
159
+ }
160
+ else if (message.type === "error") {
161
+ callbacks.onError(`${message.code}: ${message.message}`);
162
+ ws.close();
163
+ }
164
+ }
165
+ catch (error) {
166
+ callbacks.onError(String(error));
167
+ ws.close(1008, "Invalid relay frame");
168
+ }
169
+ });
170
+ }
171
+ catch (error) {
172
+ callbacks.onError(String(error));
173
+ reconnectAt = Date.now() + 1000;
174
+ }
175
+ finally {
176
+ connecting = false;
177
+ }
178
+ };
179
+ let polling = false;
180
+ const tick = async () => {
181
+ if (stopped || polling)
182
+ return;
183
+ polling = true;
184
+ try {
185
+ if (!socket) {
186
+ if (Date.now() >= reconnectAt)
187
+ await connect();
188
+ return;
189
+ }
190
+ if (!fence || !reconciled)
191
+ return;
192
+ if (journal.getSourceFloor && BigInt(journal.getSourceFloor()) > BigInt(connectionFloor)) {
193
+ socket.close(1000, "Local history synchronization required");
194
+ return;
195
+ }
196
+ if (syncPending)
197
+ return;
198
+ if (Date.now() - lastHeartbeat > 10_000) {
199
+ const grant = await readControllerGrant(ticket);
200
+ if (stopped || !socket || !fence || !reconciled)
201
+ return;
202
+ if (grant.token !== currentToken) {
203
+ socket.close(1000, "Credential renewed");
204
+ return;
205
+ }
206
+ send({ ...prefix(), type: "heartbeat" });
207
+ lastHeartbeat = Date.now();
208
+ }
209
+ if (pendingBatch)
210
+ return;
211
+ if (requiresLiveSync && !synchronized && !journal.pendingEvents(1).length) {
212
+ const snapshot = journal.getSnapshot();
213
+ const state = callbacks.readState?.() ?? { nativeSessionId: snapshot.nativeSessionId, initialInputState: snapshot.initialInputState, synchronized: true, activity: snapshot.activity, currentTurnId: snapshot.currentTurnId, capabilities: snapshot.capabilities, ...(snapshot.controls ? { controls: snapshot.controls } : {}), ...(snapshot.turnStartedAt !== undefined ? { turnStartedAt: snapshot.turnStartedAt } : {}) };
214
+ send({ ...prefix(), type: "sync_state", state: { ...state, synchronized: true }, pendingInteractions: journal.pendingInteractions() });
215
+ syncPending = true;
216
+ return;
217
+ }
218
+ const request = contentRequests[0];
219
+ if (request && !request.response) {
220
+ let result = null, error = null;
221
+ try {
222
+ if (request.request.kind === "timeline" && request.request.historyEpoch !== historyEpoch)
223
+ throw new Error("Timeline cursor belongs to another connection.");
224
+ result = request.request.kind === "timeline" ? journal.readTimeline(request.request) : journal.readResource(request.request.resourceId, request.request.offset, request.request.limit);
225
+ }
226
+ catch (failure) {
227
+ error = { code: "content_unavailable", message: failure instanceof Error ? failure.message.slice(0, 4096) : "Local content is unavailable." };
228
+ }
229
+ request.response = { requestId: request.request.requestId, sourceThrough: journal.getLastSourceSequence(), result, error };
230
+ }
231
+ const response = request?.response;
232
+ if (response && BigInt(journal.getLastAcknowledgedSequence()) >= BigInt(response.sourceThrough)) {
233
+ // The response and its source barrier share WS ordering. Newer events
234
+ // remain queued until after the server has captured this page's cursor.
235
+ send({ ...prefix(), type: "content_response", ...response });
236
+ contentRequests.shift();
237
+ return;
238
+ }
239
+ journal.drainProjectionGap();
240
+ const events = [];
241
+ let bytes = 1024;
242
+ for (const row of journal.pendingEvents(RELAY_LIMITS.maxBatchEvents)) {
243
+ if (response && BigInt(row.sequence) > BigInt(response.sourceThrough))
244
+ break;
245
+ const source = { ...row.payload, sourceSeq: row.sequence };
246
+ // Older journals may already contain a display event that could never
247
+ // fit the relay. Preserve its source identity and project it as history does.
248
+ const event = requiresLiveSync && source.kind === "timeline_upsert" ? { ...source, payload: sessionDisplayEntry(source.payload) } : source;
249
+ const size = sessionWireBytes(event);
250
+ if (size + 1024 > RELAY_LIMITS.maxFrameBytes)
251
+ throw new Error("Durable controller event exceeds relay frame limit.");
252
+ if (bytes + size > RELAY_LIMITS.maxFrameBytes)
253
+ break;
254
+ events.push(event);
255
+ bytes += size;
256
+ }
257
+ if (events.length) {
258
+ const id = randomUUID();
259
+ pendingBatch = { id, through: events.at(-1).sourceSeq };
260
+ send({ ...prefix(), type: "events", batchId: id, sourceEpoch: ticket.executionId, events });
261
+ }
262
+ }
263
+ catch (error) {
264
+ callbacks.onError(String(error));
265
+ socket?.close();
266
+ }
267
+ finally {
268
+ polling = false;
269
+ }
270
+ };
271
+ const timer = setInterval(() => { void tick(); }, 100);
272
+ void tick();
273
+ return {
274
+ connected: () => synchronized && fence !== null,
275
+ authorize: (operationId) => new Promise((resolve, reject) => {
276
+ if (!synchronized) {
277
+ reject(new Error("Session relay is offline."));
278
+ return;
279
+ }
280
+ const timeout = setTimeout(() => { authorization.delete(operationId); reject(new Error("Operation authorization is unknown; native was not called.")); }, 15_000);
281
+ authorization.set(operationId, { resolve, reject, timer: timeout });
282
+ try {
283
+ send({ ...prefix(), type: "operation_begin", operationId });
284
+ }
285
+ catch (error) {
286
+ clearTimeout(timeout);
287
+ authorization.delete(operationId);
288
+ reject(error);
289
+ }
290
+ }),
291
+ receipt: (operation) => { if (synchronized && (!operation.executionGeneration || operation.executionGeneration === ticket.executionGeneration))
292
+ send({ ...prefix(), type: "operation_receipt", operation: publicOperation(ticket, operation) }); },
293
+ async flush(timeoutMs = 5000) { const end = Date.now() + timeoutMs; while (journal.pendingEvents(1).length && Date.now() < end)
294
+ await new Promise(resolve => setTimeout(resolve, 50)); if (journal.pendingEvents(1).length)
295
+ throw new Error("Session events remain in the durable outbox."); },
296
+ close: () => { stopped = true; clearInterval(timer); socket?.terminate(); socket = null; clearConnection(); },
297
+ };
298
+ };
299
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../src/commands/controller/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { CliContext } from "../../cli/context.js";
2
+ import type { SessionProvider } from "../../session/protocol.js";
3
+ import { type ControllerLaunchTicket } from "./launch-ticket.js";
4
+ export type ResumeLease = {
5
+ ticket: ControllerLaunchTicket;
6
+ nativeSessionId: string;
7
+ release(): Promise<void>;
8
+ };
9
+ /** Acquire one stopped local Test Session's native writer. The caller releases
10
+ * the lease only after proving its new controller and descendants stopped; an
11
+ * uncertain stop deliberately retains the lease for explicit reconciliation. */
12
+ export declare const acquireResume: (input: {
13
+ provider: SessionProvider;
14
+ sessionId?: string;
15
+ }, context: CliContext, config: {
16
+ serverUrl: string;
17
+ serverToken: string;
18
+ }) => Promise<ResumeLease>;