@tokenfactory/acc-runner 0.44.8 → 0.44.10

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 (183) hide show
  1. package/README.md +38 -0
  2. package/dist/attachments/codex-stage.d.ts +11 -0
  3. package/dist/attachments/codex-stage.d.ts.map +1 -0
  4. package/dist/attachments/codex-stage.js +82 -0
  5. package/dist/attachments/codex-stage.js.map +1 -0
  6. package/dist/attachments/fetch-attachment.d.ts +17 -0
  7. package/dist/attachments/fetch-attachment.d.ts.map +1 -1
  8. package/dist/attachments/fetch-attachment.js +134 -6
  9. package/dist/attachments/fetch-attachment.js.map +1 -1
  10. package/dist/attachments/index.d.ts +2 -1
  11. package/dist/attachments/index.d.ts.map +1 -1
  12. package/dist/attachments/index.js +2 -1
  13. package/dist/attachments/index.js.map +1 -1
  14. package/dist/build-info.generated.d.ts +1 -1
  15. package/dist/build-info.generated.js +2 -2
  16. package/dist/commit-sha.d.ts +31 -0
  17. package/dist/commit-sha.d.ts.map +1 -0
  18. package/dist/commit-sha.js +31 -0
  19. package/dist/commit-sha.js.map +1 -0
  20. package/dist/companion-run.d.ts.map +1 -1
  21. package/dist/companion-run.js +14 -1
  22. package/dist/companion-run.js.map +1 -1
  23. package/dist/device-refusal.d.ts +70 -0
  24. package/dist/device-refusal.d.ts.map +1 -0
  25. package/dist/device-refusal.js +97 -0
  26. package/dist/device-refusal.js.map +1 -0
  27. package/dist/doctor.d.ts +16 -0
  28. package/dist/doctor.d.ts.map +1 -1
  29. package/dist/doctor.js +107 -0
  30. package/dist/doctor.js.map +1 -1
  31. package/dist/engines/codex-chat.d.ts +10 -1
  32. package/dist/engines/codex-chat.d.ts.map +1 -1
  33. package/dist/engines/codex-chat.js +32 -2
  34. package/dist/engines/codex-chat.js.map +1 -1
  35. package/dist/login.d.ts.map +1 -1
  36. package/dist/login.js +32 -3
  37. package/dist/login.js.map +1 -1
  38. package/dist/machine-console/index.d.ts +6 -10
  39. package/dist/machine-console/index.d.ts.map +1 -1
  40. package/dist/machine-console/index.js +61 -54
  41. package/dist/machine-console/index.js.map +1 -1
  42. package/dist/machine-console/redact.d.ts.map +1 -1
  43. package/dist/machine-console/redact.js +10 -1
  44. package/dist/machine-console/redact.js.map +1 -1
  45. package/dist/machine-console/transport.d.ts +57 -0
  46. package/dist/machine-console/transport.d.ts.map +1 -0
  47. package/dist/machine-console/transport.js +170 -0
  48. package/dist/machine-console/transport.js.map +1 -0
  49. package/dist/preview-environments/control-plane.d.ts +11 -0
  50. package/dist/preview-environments/control-plane.d.ts.map +1 -0
  51. package/dist/preview-environments/control-plane.js +49 -0
  52. package/dist/preview-environments/control-plane.js.map +1 -0
  53. package/dist/preview-environments/http-provider.d.ts +13 -0
  54. package/dist/preview-environments/http-provider.d.ts.map +1 -0
  55. package/dist/preview-environments/http-provider.js +64 -0
  56. package/dist/preview-environments/http-provider.js.map +1 -0
  57. package/dist/preview-environments/profiles.d.ts +6 -0
  58. package/dist/preview-environments/profiles.d.ts.map +1 -0
  59. package/dist/preview-environments/profiles.js +34 -0
  60. package/dist/preview-environments/profiles.js.map +1 -0
  61. package/dist/preview-environments/safety.d.ts +7 -0
  62. package/dist/preview-environments/safety.d.ts.map +1 -0
  63. package/dist/preview-environments/safety.js +47 -0
  64. package/dist/preview-environments/safety.js.map +1 -0
  65. package/dist/preview-environments/service.d.ts +36 -0
  66. package/dist/preview-environments/service.d.ts.map +1 -0
  67. package/dist/preview-environments/service.js +149 -0
  68. package/dist/preview-environments/service.js.map +1 -0
  69. package/dist/preview-environments/types.d.ts +60 -0
  70. package/dist/preview-environments/types.d.ts.map +1 -0
  71. package/dist/preview-environments/types.js +2 -0
  72. package/dist/preview-environments/types.js.map +1 -0
  73. package/dist/production-migrations/command.d.ts +3 -0
  74. package/dist/production-migrations/command.d.ts.map +1 -0
  75. package/dist/production-migrations/command.js +21 -0
  76. package/dist/production-migrations/command.js.map +1 -0
  77. package/dist/production-migrations/executor.d.ts +59 -0
  78. package/dist/production-migrations/executor.d.ts.map +1 -0
  79. package/dist/production-migrations/executor.js +161 -0
  80. package/dist/production-migrations/executor.js.map +1 -0
  81. package/dist/production-migrations/pg-target.d.ts +22 -0
  82. package/dist/production-migrations/pg-target.d.ts.map +1 -0
  83. package/dist/production-migrations/pg-target.js +87 -0
  84. package/dist/production-migrations/pg-target.js.map +1 -0
  85. package/dist/production-migrations/profiles.d.ts +5 -0
  86. package/dist/production-migrations/profiles.d.ts.map +1 -0
  87. package/dist/production-migrations/profiles.js +39 -0
  88. package/dist/production-migrations/profiles.js.map +1 -0
  89. package/dist/production-migrations/service.d.ts +39 -0
  90. package/dist/production-migrations/service.d.ts.map +1 -0
  91. package/dist/production-migrations/service.js +166 -0
  92. package/dist/production-migrations/service.js.map +1 -0
  93. package/dist/program.d.ts.map +1 -1
  94. package/dist/program.js +17 -0
  95. package/dist/program.js.map +1 -1
  96. package/dist/runtime/worktree.d.ts.map +1 -1
  97. package/dist/runtime/worktree.js +23 -1
  98. package/dist/runtime/worktree.js.map +1 -1
  99. package/dist/secure-execution/auto-lease.d.ts +57 -0
  100. package/dist/secure-execution/auto-lease.d.ts.map +1 -0
  101. package/dist/secure-execution/auto-lease.js +116 -0
  102. package/dist/secure-execution/auto-lease.js.map +1 -0
  103. package/dist/secure-execution/command-policy.d.ts +5 -0
  104. package/dist/secure-execution/command-policy.d.ts.map +1 -0
  105. package/dist/secure-execution/command-policy.js +95 -0
  106. package/dist/secure-execution/command-policy.js.map +1 -0
  107. package/dist/secure-execution/confinement.d.ts +3 -0
  108. package/dist/secure-execution/confinement.d.ts.map +1 -0
  109. package/dist/secure-execution/confinement.js +18 -0
  110. package/dist/secure-execution/confinement.js.map +1 -0
  111. package/dist/secure-execution/engine.d.ts +24 -0
  112. package/dist/secure-execution/engine.d.ts.map +1 -0
  113. package/dist/secure-execution/engine.js +272 -0
  114. package/dist/secure-execution/engine.js.map +1 -0
  115. package/dist/secure-execution/index.d.ts +7 -0
  116. package/dist/secure-execution/index.d.ts.map +1 -0
  117. package/dist/secure-execution/index.js +6 -0
  118. package/dist/secure-execution/index.js.map +1 -0
  119. package/dist/secure-execution/node-pty.d.ts +11 -0
  120. package/dist/secure-execution/node-pty.d.ts.map +1 -0
  121. package/dist/secure-execution/node-pty.js +27 -0
  122. package/dist/secure-execution/node-pty.js.map +1 -0
  123. package/dist/secure-execution/types.d.ts +176 -0
  124. package/dist/secure-execution/types.d.ts.map +1 -0
  125. package/dist/secure-execution/types.js +2 -0
  126. package/dist/secure-execution/types.js.map +1 -0
  127. package/dist/staging-migrations/command.d.ts +2 -0
  128. package/dist/staging-migrations/command.d.ts.map +1 -0
  129. package/dist/staging-migrations/command.js +58 -0
  130. package/dist/staging-migrations/command.js.map +1 -0
  131. package/dist/staging-migrations/executor.d.ts +49 -0
  132. package/dist/staging-migrations/executor.d.ts.map +1 -0
  133. package/dist/staging-migrations/executor.js +125 -0
  134. package/dist/staging-migrations/executor.js.map +1 -0
  135. package/dist/staging-migrations/pg-target.d.ts +20 -0
  136. package/dist/staging-migrations/pg-target.d.ts.map +1 -0
  137. package/dist/staging-migrations/pg-target.js +63 -0
  138. package/dist/staging-migrations/pg-target.js.map +1 -0
  139. package/dist/staging-migrations/profiles.d.ts +5 -0
  140. package/dist/staging-migrations/profiles.d.ts.map +1 -0
  141. package/dist/staging-migrations/profiles.js +31 -0
  142. package/dist/staging-migrations/profiles.js.map +1 -0
  143. package/dist/staging-migrations/service.d.ts +40 -0
  144. package/dist/staging-migrations/service.d.ts.map +1 -0
  145. package/dist/staging-migrations/service.js +157 -0
  146. package/dist/staging-migrations/service.js.map +1 -0
  147. package/dist/supervisor.d.ts +15 -0
  148. package/dist/supervisor.d.ts.map +1 -0
  149. package/dist/supervisor.js +54 -0
  150. package/dist/supervisor.js.map +1 -0
  151. package/dist/terminal/http-carrier.d.ts +17 -0
  152. package/dist/terminal/http-carrier.d.ts.map +1 -0
  153. package/dist/terminal/http-carrier.js +39 -0
  154. package/dist/terminal/http-carrier.js.map +1 -0
  155. package/dist/terminal/pty-adapter.d.ts +88 -0
  156. package/dist/terminal/pty-adapter.d.ts.map +1 -0
  157. package/dist/terminal/pty-adapter.js +252 -0
  158. package/dist/terminal/pty-adapter.js.map +1 -0
  159. package/dist/terminal/transport-contract.d.ts +115 -0
  160. package/dist/terminal/transport-contract.d.ts.map +1 -0
  161. package/dist/terminal/transport-contract.js +2 -0
  162. package/dist/terminal/transport-contract.js.map +1 -0
  163. package/dist/terminal/transport.d.ts +32 -0
  164. package/dist/terminal/transport.d.ts.map +1 -0
  165. package/dist/terminal/transport.js +208 -0
  166. package/dist/terminal/transport.js.map +1 -0
  167. package/dist/types.d.ts +22 -0
  168. package/dist/types.d.ts.map +1 -1
  169. package/dist/watch-chat/wire.d.ts.map +1 -1
  170. package/dist/watch-chat/wire.js +14 -1
  171. package/dist/watch-chat/wire.js.map +1 -1
  172. package/dist/watch.d.ts.map +1 -1
  173. package/dist/watch.js +32 -0
  174. package/dist/watch.js.map +1 -1
  175. package/package.json +6 -1
  176. package/scripts/com.tokenfactory.acc-runner-dedicated.plist +64 -0
  177. package/scripts/com.tokenfactory.acc-runner.plist +90 -0
  178. package/scripts/gen-build-info.d.mts +3 -0
  179. package/scripts/gen-build-info.mjs +72 -0
  180. package/scripts/install-launchd.sh +235 -0
  181. package/scripts/setup-dedicated-runner-darwin.sh +75 -0
  182. package/scripts/setup-dedicated-runner-linux.sh +173 -0
  183. package/scripts/uninstall-launchd.sh +67 -0
@@ -0,0 +1,252 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { machineCommandEnv, redactMachineOutput, resolveMachineRepoPath, } from "../machine-console/index.js";
3
+ export const TERMINAL_RUNNER_ENABLED_ENV = "ACC_RUNNER_INTERACTIVE_TERMINAL";
4
+ export const TERMINAL_REDACTION_POLICY_VERSION = "machine-redaction.v1";
5
+ export const MAX_TERMINAL_INPUT_BYTES = 16 * 1024;
6
+ export const MAX_TERMINAL_OUTPUT_BYTES = 64 * 1024;
7
+ const OUTPUT_CHUNK_BYTES = 48 * 1024;
8
+ const TERMINATE_GRACE_MS = 5_000;
9
+ export class TerminalRunnerError extends Error {
10
+ code;
11
+ constructor(code, message) {
12
+ super(message);
13
+ this.code = code;
14
+ this.name = "TerminalRunnerError";
15
+ }
16
+ }
17
+ export function terminalRunnerEnabled(env = process.env) {
18
+ return (env[TERMINAL_RUNNER_ENABLED_ENV] ?? "").trim() === "1";
19
+ }
20
+ function assertDimensions(cols, rows) {
21
+ if (!Number.isInteger(cols) || cols < 1 || cols > 500) {
22
+ throw new TerminalRunnerError("invalid_dimensions", "cols must be an integer from 1 to 500");
23
+ }
24
+ if (!Number.isInteger(rows) || rows < 1 || rows > 200) {
25
+ throw new TerminalRunnerError("invalid_dimensions", "rows must be an integer from 1 to 200");
26
+ }
27
+ }
28
+ function closedEnvironment(env) {
29
+ const source = machineCommandEnv(env);
30
+ const out = {
31
+ ACC_INTERACTIVE_TERMINAL: "1",
32
+ TERM: source.TERM || "xterm-256color",
33
+ };
34
+ for (const [name, value] of Object.entries(source)) {
35
+ if (typeof value === "string")
36
+ out[name] = value;
37
+ }
38
+ return out;
39
+ }
40
+ function splitByBytes(value, maxBytes = OUTPUT_CHUNK_BYTES) {
41
+ const chunks = [];
42
+ let pending = value;
43
+ while (Buffer.byteLength(pending) > maxBytes) {
44
+ let end = Math.min(pending.length, maxBytes);
45
+ while (end > 1 && Buffer.byteLength(pending.slice(0, end)) > maxBytes)
46
+ end -= 1;
47
+ chunks.push(pending.slice(0, end));
48
+ pending = pending.slice(end);
49
+ }
50
+ if (pending)
51
+ chunks.push(pending);
52
+ return chunks;
53
+ }
54
+ /** Emit complete tokens promptly while retaining the last token across PTY chunks. */
55
+ class TerminalStreamingRedactor {
56
+ pending = "";
57
+ push(value) {
58
+ this.pending += value;
59
+ const cut = Math.max(this.pending.lastIndexOf(" "), this.pending.lastIndexOf("\n"), this.pending.lastIndexOf("\r"), this.pending.lastIndexOf("\t"));
60
+ if (cut < 0) {
61
+ if (Buffer.byteLength(this.pending) > MAX_TERMINAL_OUTPUT_BYTES) {
62
+ throw new TerminalRunnerError("redaction_buffer_exceeded", "Unbroken PTY output exceeded the redaction boundary");
63
+ }
64
+ return "";
65
+ }
66
+ const ready = this.pending.slice(0, cut + 1);
67
+ this.pending = this.pending.slice(cut + 1);
68
+ return redactMachineOutput(ready);
69
+ }
70
+ finish() {
71
+ const ready = redactMachineOutput(this.pending);
72
+ this.pending = "";
73
+ return ready;
74
+ }
75
+ }
76
+ async function defaultPtyFactory() {
77
+ const moduleName = "node-pty";
78
+ try {
79
+ return await import(moduleName);
80
+ }
81
+ catch (error) {
82
+ throw new TerminalRunnerError("pty_unavailable", `Interactive terminal support is installed incorrectly: ${error.message}`);
83
+ }
84
+ }
85
+ /**
86
+ * Allocate one dark, runner-local PTY. This adapter has no polling, RPC, socket,
87
+ * browser, or product-surface wiring; the explicit environment kill switch must
88
+ * be on and a future authenticated gateway must supply every call.
89
+ */
90
+ export async function openTerminalPty(deps) {
91
+ const env = deps.env ?? process.env;
92
+ if (!terminalRunnerEnabled(env)) {
93
+ throw new TerminalRunnerError("terminal_disabled", "Interactive terminal runner is disabled");
94
+ }
95
+ if (!deps.request.terminalSessionId.trim()) {
96
+ throw new TerminalRunnerError("invalid_session", "terminalSessionId is required");
97
+ }
98
+ assertDimensions(deps.request.cols, deps.request.rows);
99
+ const cwd = resolveMachineRepoPath(deps.cfg, deps.request.repo);
100
+ const factory = deps.factory ?? await defaultPtyFactory();
101
+ const shell = process.platform === "win32" ? (env.ComSpec || "cmd.exe") : "/bin/sh";
102
+ const args = process.platform === "win32" ? [] : ["-l"];
103
+ const pty = factory.spawn(shell, args, {
104
+ name: "xterm-256color",
105
+ cwd,
106
+ env: closedEnvironment(env),
107
+ cols: deps.request.cols,
108
+ rows: deps.request.rows,
109
+ });
110
+ const inputReceipts = new Map();
111
+ const redactor = new TerminalStreamingRedactor();
112
+ let inputCursor = 0;
113
+ let resizeCursor = 0;
114
+ let outputCursor = 0;
115
+ let terminating = false;
116
+ let settled = false;
117
+ let outputFailure = false;
118
+ let outputChain = Promise.resolve();
119
+ let hardKill;
120
+ let resolveClosed;
121
+ const closed = new Promise((resolve) => { resolveClosed = resolve; });
122
+ const emit = (value) => {
123
+ for (const chunk of splitByBytes(value)) {
124
+ const bytes = Buffer.from(chunk, "utf8");
125
+ outputCursor += 1;
126
+ const frame = {
127
+ terminalSessionId: deps.request.terminalSessionId,
128
+ outputSeq: outputCursor,
129
+ stream: "stdout",
130
+ encoding: "base64",
131
+ data: bytes.toString("base64"),
132
+ byteLength: bytes.byteLength,
133
+ redactionPolicyVersion: TERMINAL_REDACTION_POLICY_VERSION,
134
+ redactionApplied: true,
135
+ };
136
+ outputChain = outputChain.then(() => deps.onOutput(frame)).catch(() => {
137
+ outputFailure = true;
138
+ if (!terminating) {
139
+ terminating = true;
140
+ pty.kill("SIGTERM");
141
+ hardKill = setTimeout(() => {
142
+ if (!settled)
143
+ pty.kill("SIGKILL");
144
+ }, deps.terminateGraceMs ?? TERMINATE_GRACE_MS);
145
+ hardKill.unref?.();
146
+ }
147
+ });
148
+ }
149
+ };
150
+ const dataSubscription = pty.onData((data) => {
151
+ try {
152
+ emit(redactor.push(data));
153
+ }
154
+ catch {
155
+ outputFailure = true;
156
+ if (!terminating) {
157
+ terminating = true;
158
+ pty.kill("SIGTERM");
159
+ hardKill = setTimeout(() => {
160
+ if (!settled)
161
+ pty.kill("SIGKILL");
162
+ }, deps.terminateGraceMs ?? TERMINATE_GRACE_MS);
163
+ hardKill.unref?.();
164
+ }
165
+ }
166
+ });
167
+ const exitSubscription = pty.onExit((event) => {
168
+ if (settled)
169
+ return;
170
+ settled = true;
171
+ if (hardKill)
172
+ clearTimeout(hardKill);
173
+ emit(redactor.finish());
174
+ void outputChain.finally(() => {
175
+ dataSubscription.dispose();
176
+ exitSubscription.dispose();
177
+ resolveClosed({
178
+ terminalSessionId: deps.request.terminalSessionId,
179
+ exitCode: event.exitCode,
180
+ signal: event.signal,
181
+ reason: outputFailure ? "failed" : terminating ? "user_terminated" : event.exitCode === 0 ? "completed" : "failed",
182
+ finalOutputSeq: outputCursor,
183
+ });
184
+ });
185
+ });
186
+ return {
187
+ terminalSessionId: deps.request.terminalSessionId,
188
+ pid: pty.pid,
189
+ closed,
190
+ writeInput: (inputId, inputSeq, data) => {
191
+ if (settled || terminating)
192
+ throw new TerminalRunnerError("terminal_not_running", "Terminal is not accepting input");
193
+ if (!inputId.trim())
194
+ throw new TerminalRunnerError("invalid_input", "inputId is required");
195
+ if (!Number.isSafeInteger(inputSeq) || inputSeq <= 0) {
196
+ throw new TerminalRunnerError("invalid_input_sequence", "inputSeq must be positive");
197
+ }
198
+ const byteLength = Buffer.byteLength(data, "utf8");
199
+ if (byteLength > MAX_TERMINAL_INPUT_BYTES) {
200
+ throw new TerminalRunnerError("input_too_large", "PTY input exceeds the frame limit");
201
+ }
202
+ const digest = createHash("sha256").update(data).digest("hex");
203
+ const existing = inputReceipts.get(inputId);
204
+ if (existing) {
205
+ if (existing.digest !== digest || existing.receipt.inputSeq !== inputSeq) {
206
+ throw new TerminalRunnerError("input_id_conflict", "inputId was reused with different input");
207
+ }
208
+ return existing.receipt;
209
+ }
210
+ if (inputSeq !== inputCursor + 1) {
211
+ throw new TerminalRunnerError("input_sequence_gap", "inputSeq must advance by exactly one");
212
+ }
213
+ pty.write(data);
214
+ inputCursor = inputSeq;
215
+ const receipt = Object.freeze({
216
+ inputId,
217
+ inputSeq,
218
+ runnerReceiptId: randomUUID(),
219
+ inputAckCursor: inputCursor,
220
+ status: "accepted",
221
+ });
222
+ inputReceipts.set(inputId, { digest, receipt });
223
+ return receipt;
224
+ },
225
+ resize: (resizeSeq, cols, rows) => {
226
+ if (settled || terminating)
227
+ throw new TerminalRunnerError("terminal_not_running", "Terminal cannot be resized");
228
+ assertDimensions(cols, rows);
229
+ if (!Number.isSafeInteger(resizeSeq) || resizeSeq <= 0) {
230
+ throw new TerminalRunnerError("invalid_resize_sequence", "resizeSeq must be positive");
231
+ }
232
+ if (resizeSeq <= resizeCursor)
233
+ return false;
234
+ pty.resize(cols, rows);
235
+ resizeCursor = resizeSeq;
236
+ return true;
237
+ },
238
+ terminate: () => {
239
+ if (settled || terminating)
240
+ return closed;
241
+ terminating = true;
242
+ pty.kill("SIGTERM");
243
+ hardKill = setTimeout(() => {
244
+ if (!settled)
245
+ pty.kill("SIGKILL");
246
+ }, deps.terminateGraceMs ?? TERMINATE_GRACE_MS);
247
+ hardKill.unref?.();
248
+ return closed;
249
+ },
250
+ };
251
+ }
252
+ //# sourceMappingURL=pty-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-adapter.js","sourceRoot":"","sources":["../../src/terminal/pty-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import type { TerminalExitOutcome, TerminalInputReceipt, TerminalOutputFrame } from "./pty-adapter.js";
2
+ export declare const TERMINAL_TRANSPORT_PROTOCOL: "terminal.v1";
3
+ export interface TerminalRunnerLease {
4
+ terminalSessionId: string;
5
+ runnerId: string;
6
+ runnerEpoch: number;
7
+ /** Opaque gateway-issued value. Never persisted or logged by the runner. */
8
+ leaseId: string;
9
+ }
10
+ export interface TerminalRunnerEnvelope<TKind extends string, TPayload> {
11
+ protocol: typeof TERMINAL_TRANSPORT_PROTOCOL;
12
+ kind: TKind;
13
+ messageId: string;
14
+ terminalSessionId: string;
15
+ runnerId: string;
16
+ runnerEpoch: number;
17
+ connectionId: string;
18
+ occurredAt: string;
19
+ payload: TPayload;
20
+ }
21
+ export type TerminalRunnerMessage = TerminalRunnerEnvelope<"runner.hello", {
22
+ runnerId: string;
23
+ runnerEpoch: number;
24
+ pty: {
25
+ supported: true;
26
+ resize: true;
27
+ processGroupStop: true;
28
+ };
29
+ inputAckCursor: number;
30
+ outputSeq: number;
31
+ }> | TerminalRunnerEnvelope<"runner.heartbeat", {
32
+ runnerId: string;
33
+ runnerEpoch: number;
34
+ inputAckCursor: number;
35
+ outputSeq: number;
36
+ }> | TerminalRunnerEnvelope<"input.receipt", TerminalInputReceipt & {
37
+ inputDigest: string;
38
+ byteCount: number;
39
+ }> | TerminalRunnerEnvelope<"output.chunk", TerminalOutputFrame> | TerminalRunnerEnvelope<"runner.exited", TerminalExitOutcome> | TerminalRunnerEnvelope<"runner.reconcile.result", {
40
+ status: "running" | "terminated" | "unknown";
41
+ runnerEpoch: number;
42
+ inputAckCursor: number;
43
+ outputSeq: number;
44
+ exitCode?: number;
45
+ signal?: number;
46
+ }>;
47
+ /** Ephemeral carrier only. Implementations must not retain payload bodies. */
48
+ export interface TerminalEphemeralCarrier {
49
+ publish(message: TerminalRunnerMessage): Promise<void>;
50
+ }
51
+ export interface TerminalInputReceiptMetadata {
52
+ terminalSessionId: string;
53
+ runnerId: string;
54
+ runnerEpoch: number;
55
+ connectionId: string;
56
+ inputId: string;
57
+ inputSeq: number;
58
+ inputDigest: string;
59
+ byteCount: number;
60
+ runnerReceiptId: string;
61
+ inputAckCursor: number;
62
+ status: TerminalInputReceipt["status"];
63
+ }
64
+ export interface TerminalOutputReceiptMetadata {
65
+ terminalSessionId: string;
66
+ runnerId: string;
67
+ runnerEpoch: number;
68
+ outputSeq: number;
69
+ stream: TerminalOutputFrame["stream"];
70
+ byteCount: number;
71
+ outputDigest: string;
72
+ redactionPolicyVersion: string;
73
+ redactionApplied: true;
74
+ }
75
+ export interface TerminalHeartbeatMetadata {
76
+ terminalSessionId: string;
77
+ runnerId: string;
78
+ runnerEpoch: number;
79
+ inputAckCursor: number;
80
+ outputSeq: number;
81
+ occurredAt: string;
82
+ }
83
+ export interface TerminalExitMetadata {
84
+ terminalSessionId: string;
85
+ runnerId: string;
86
+ runnerEpoch: number;
87
+ exitCode: number;
88
+ signal?: number;
89
+ reason: TerminalExitOutcome["reason"];
90
+ finalOutputSeq: number;
91
+ }
92
+ /** Durable metadata boundary. Raw payload fields are impossible to pass. */
93
+ export interface TerminalMetadataSink {
94
+ recordHeartbeat(metadata: TerminalHeartbeatMetadata): Promise<void>;
95
+ recordInputReceipt(metadata: TerminalInputReceiptMetadata): Promise<void>;
96
+ recordOutputReceipt(metadata: TerminalOutputReceiptMetadata): Promise<void>;
97
+ recordExit(metadata: TerminalExitMetadata): Promise<void>;
98
+ }
99
+ export interface TerminalTransportInput {
100
+ inputId: string;
101
+ inputSeq: number;
102
+ encoding: "utf8";
103
+ data: string;
104
+ byteLength: number;
105
+ }
106
+ export interface DarkTerminalRunnerTransportOptions {
107
+ lease: TerminalRunnerLease;
108
+ connectionId: string;
109
+ carrier: TerminalEphemeralCarrier;
110
+ metadata: TerminalMetadataSink;
111
+ env?: NodeJS.ProcessEnv;
112
+ now?: () => number;
113
+ messageId?: () => string;
114
+ }
115
+ //# sourceMappingURL=transport-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-contract.d.ts","sourceRoot":"","sources":["../../src/terminal/transport-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export const TERMINAL_TRANSPORT_PROTOCOL = "terminal.v1";
2
+ //# sourceMappingURL=transport-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-contract.js","sourceRoot":"","sources":["../../src/terminal/transport-contract.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,2BAA2B,GAAG,aAAsB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type TerminalExitOutcome, type TerminalInputReceipt, type TerminalOutputFrame, type TerminalRunnerSession } from "./pty-adapter.js";
2
+ import { type DarkTerminalRunnerTransportOptions, type TerminalRunnerLease, type TerminalTransportInput } from "./transport-contract.js";
3
+ export * from "./transport-contract.js";
4
+ export declare class DarkTerminalRunnerTransport {
5
+ private readonly lease;
6
+ private readonly connectionId;
7
+ private readonly carrier;
8
+ private readonly metadata;
9
+ private readonly now;
10
+ private readonly messageId;
11
+ private session?;
12
+ private inputAckCursor;
13
+ private outputSeq;
14
+ private exitOutcome?;
15
+ private exitPromise?;
16
+ constructor(options: DarkTerminalRunnerTransportOptions);
17
+ bindSession(session: TerminalRunnerSession): void;
18
+ hello(claim: TerminalRunnerLease): Promise<void>;
19
+ heartbeat(claim: TerminalRunnerLease): Promise<void>;
20
+ writeInput(claim: TerminalRunnerLease, input: TerminalTransportInput): Promise<TerminalInputReceipt>;
21
+ resize(claim: TerminalRunnerLease, resizeSeq: number, cols: number, rows: number): boolean;
22
+ acceptOutput(claim: TerminalRunnerLease, frame: TerminalOutputFrame): Promise<void>;
23
+ reconcile(claim: TerminalRunnerLease): Promise<void>;
24
+ terminate(claim: TerminalRunnerLease): Promise<TerminalExitOutcome>;
25
+ settled(): Promise<void>;
26
+ private assertLease;
27
+ private requireSession;
28
+ private envelope;
29
+ private publish;
30
+ private publishExit;
31
+ }
32
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/terminal/transport.ts"],"names":[],"mappings":"AAQA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,kCAAkC,EAIvC,KAAK,mBAAmB,EAExB,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAEjC,cAAc,yBAAyB,CAAC;AAYxC,qBAAa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,OAAO,CAAC,CAAwB;IACxC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAgB;gBAExB,OAAO,EAAE,kCAAkC;IAmBvD,WAAW,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAS3C,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhD,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpD,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8B1G,MAAM,CAAC,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAKpF,YAAY,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BnF,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1D,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAK7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,OAAO;YAQD,WAAW;CAe1B"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Dark MA-3 runner transport.
3
+ *
4
+ * Raw, already-redacted PTY bytes cross only the injected ephemeral carrier.
5
+ * The metadata sink is deliberately incapable of accepting a raw payload. This
6
+ * module is not wired into `watch`, a browser route, or a public Realtime topic.
7
+ */
8
+ import { createHash, randomUUID } from "node:crypto";
9
+ import { MAX_TERMINAL_INPUT_BYTES, MAX_TERMINAL_OUTPUT_BYTES, TerminalRunnerError, terminalRunnerEnabled, } from "./pty-adapter.js";
10
+ import { TERMINAL_TRANSPORT_PROTOCOL, } from "./transport-contract.js";
11
+ export * from "./transport-contract.js";
12
+ function sha256(bytes) {
13
+ return createHash("sha256").update(bytes).digest("hex");
14
+ }
15
+ function assertPositiveInteger(value, name) {
16
+ if (!Number.isSafeInteger(value) || value <= 0) {
17
+ throw new TerminalRunnerError("terminal_lease_invalid", `${name} must be a positive integer`);
18
+ }
19
+ }
20
+ export class DarkTerminalRunnerTransport {
21
+ lease;
22
+ connectionId;
23
+ carrier;
24
+ metadata;
25
+ now;
26
+ messageId;
27
+ session;
28
+ inputAckCursor = 0;
29
+ outputSeq = 0;
30
+ exitOutcome;
31
+ exitPromise;
32
+ constructor(options) {
33
+ if (!terminalRunnerEnabled(options.env ?? process.env)) {
34
+ throw new TerminalRunnerError("terminal_disabled", "Interactive terminal runner is disabled");
35
+ }
36
+ if (!options.lease.terminalSessionId.trim() || !options.lease.runnerId.trim() || !options.lease.leaseId.trim()) {
37
+ throw new TerminalRunnerError("terminal_lease_invalid", "Terminal lease is incomplete");
38
+ }
39
+ assertPositiveInteger(options.lease.runnerEpoch, "runnerEpoch");
40
+ if (!options.connectionId.trim()) {
41
+ throw new TerminalRunnerError("terminal_lease_invalid", "connectionId is required");
42
+ }
43
+ this.lease = Object.freeze({ ...options.lease });
44
+ this.connectionId = options.connectionId;
45
+ this.carrier = options.carrier;
46
+ this.metadata = options.metadata;
47
+ this.now = options.now ?? Date.now;
48
+ this.messageId = options.messageId ?? randomUUID;
49
+ }
50
+ bindSession(session) {
51
+ if (this.session)
52
+ throw new TerminalRunnerError("terminal_already_bound", "Terminal transport is already bound");
53
+ if (session.terminalSessionId !== this.lease.terminalSessionId) {
54
+ throw new TerminalRunnerError("terminal_lease_invalid", "Terminal session does not match the lease");
55
+ }
56
+ this.session = session;
57
+ this.exitPromise = session.closed.then((outcome) => this.publishExit(outcome));
58
+ }
59
+ async hello(claim) {
60
+ this.assertLease(claim);
61
+ await this.publish("runner.hello", {
62
+ runnerId: this.lease.runnerId,
63
+ runnerEpoch: this.lease.runnerEpoch,
64
+ pty: { supported: true, resize: true, processGroupStop: true },
65
+ inputAckCursor: this.inputAckCursor,
66
+ outputSeq: this.outputSeq,
67
+ });
68
+ }
69
+ async heartbeat(claim) {
70
+ this.assertLease(claim);
71
+ const occurredAt = new Date(this.now()).toISOString();
72
+ const payload = {
73
+ runnerId: this.lease.runnerId,
74
+ runnerEpoch: this.lease.runnerEpoch,
75
+ inputAckCursor: this.inputAckCursor,
76
+ outputSeq: this.outputSeq,
77
+ };
78
+ await this.metadata.recordHeartbeat({
79
+ terminalSessionId: this.lease.terminalSessionId,
80
+ ...payload,
81
+ occurredAt,
82
+ });
83
+ await this.publish("runner.heartbeat", payload, occurredAt);
84
+ }
85
+ async writeInput(claim, input) {
86
+ this.assertLease(claim);
87
+ const session = this.requireSession();
88
+ if (input.encoding !== "utf8") {
89
+ throw new TerminalRunnerError("unsupported_encoding", "The dark PTY adapter currently accepts UTF-8 input only");
90
+ }
91
+ const bytes = Buffer.from(input.data, "utf8");
92
+ if (input.byteLength !== bytes.byteLength || bytes.byteLength > MAX_TERMINAL_INPUT_BYTES) {
93
+ throw new TerminalRunnerError("invalid_input_length", "Input byteLength is invalid");
94
+ }
95
+ const receipt = session.writeInput(input.inputId, input.inputSeq, input.data);
96
+ this.inputAckCursor = Math.max(this.inputAckCursor, receipt.inputAckCursor);
97
+ const inputDigest = sha256(bytes);
98
+ await this.metadata.recordInputReceipt({
99
+ terminalSessionId: this.lease.terminalSessionId,
100
+ runnerId: this.lease.runnerId,
101
+ runnerEpoch: this.lease.runnerEpoch,
102
+ connectionId: this.connectionId,
103
+ inputId: input.inputId,
104
+ inputSeq: input.inputSeq,
105
+ inputDigest,
106
+ byteCount: bytes.byteLength,
107
+ runnerReceiptId: receipt.runnerReceiptId,
108
+ inputAckCursor: receipt.inputAckCursor,
109
+ status: receipt.status,
110
+ });
111
+ await this.publish("input.receipt", { ...receipt, inputDigest, byteCount: bytes.byteLength });
112
+ return receipt;
113
+ }
114
+ resize(claim, resizeSeq, cols, rows) {
115
+ this.assertLease(claim);
116
+ return this.requireSession().resize(resizeSeq, cols, rows);
117
+ }
118
+ async acceptOutput(claim, frame) {
119
+ this.assertLease(claim);
120
+ if (frame.terminalSessionId !== this.lease.terminalSessionId || frame.redactionApplied !== true) {
121
+ throw new TerminalRunnerError("terminal_output_invalid", "Output does not match the terminal lease");
122
+ }
123
+ if (frame.outputSeq !== this.outputSeq + 1) {
124
+ throw new TerminalRunnerError("terminal_output_gap", "outputSeq must advance by exactly one");
125
+ }
126
+ const bytes = Buffer.from(frame.data, "base64");
127
+ if (bytes.byteLength !== frame.byteLength || bytes.byteLength > MAX_TERMINAL_OUTPUT_BYTES) {
128
+ throw new TerminalRunnerError("terminal_output_invalid", "Output byteLength is invalid");
129
+ }
130
+ await this.carrier.publish(this.envelope("output.chunk", frame));
131
+ await this.metadata.recordOutputReceipt({
132
+ terminalSessionId: this.lease.terminalSessionId,
133
+ runnerId: this.lease.runnerId,
134
+ runnerEpoch: this.lease.runnerEpoch,
135
+ outputSeq: frame.outputSeq,
136
+ stream: frame.stream,
137
+ byteCount: bytes.byteLength,
138
+ outputDigest: sha256(bytes),
139
+ redactionPolicyVersion: frame.redactionPolicyVersion,
140
+ redactionApplied: true,
141
+ });
142
+ this.outputSeq = frame.outputSeq;
143
+ }
144
+ async reconcile(claim) {
145
+ this.assertLease(claim);
146
+ const outcome = this.exitOutcome;
147
+ await this.publish("runner.reconcile.result", {
148
+ status: outcome ? "terminated" : this.session ? "running" : "unknown",
149
+ runnerEpoch: this.lease.runnerEpoch,
150
+ inputAckCursor: this.inputAckCursor,
151
+ outputSeq: this.outputSeq,
152
+ ...(outcome ? { exitCode: outcome.exitCode, ...(outcome.signal === undefined ? {} : { signal: outcome.signal }) } : {}),
153
+ });
154
+ }
155
+ terminate(claim) {
156
+ this.assertLease(claim);
157
+ return this.requireSession().terminate();
158
+ }
159
+ async settled() {
160
+ await this.exitPromise;
161
+ }
162
+ assertLease(claim) {
163
+ if (claim.terminalSessionId !== this.lease.terminalSessionId
164
+ || claim.runnerId !== this.lease.runnerId
165
+ || claim.runnerEpoch !== this.lease.runnerEpoch
166
+ || claim.leaseId !== this.lease.leaseId) {
167
+ throw new TerminalRunnerError("terminal_lease_invalid", "Terminal lease is invalid or stale");
168
+ }
169
+ }
170
+ requireSession() {
171
+ if (!this.session)
172
+ throw new TerminalRunnerError("terminal_not_bound", "Terminal transport has no PTY session");
173
+ return this.session;
174
+ }
175
+ envelope(kind, payload, occurredAt = new Date(this.now()).toISOString()) {
176
+ return {
177
+ protocol: TERMINAL_TRANSPORT_PROTOCOL,
178
+ kind,
179
+ messageId: this.messageId(),
180
+ terminalSessionId: this.lease.terminalSessionId,
181
+ runnerId: this.lease.runnerId,
182
+ runnerEpoch: this.lease.runnerEpoch,
183
+ connectionId: this.connectionId,
184
+ occurredAt,
185
+ payload,
186
+ };
187
+ }
188
+ publish(kind, payload, occurredAt) {
189
+ return this.carrier.publish(this.envelope(kind, payload, occurredAt));
190
+ }
191
+ async publishExit(outcome) {
192
+ if (this.exitOutcome)
193
+ return;
194
+ this.exitOutcome = outcome;
195
+ this.outputSeq = Math.max(this.outputSeq, outcome.finalOutputSeq);
196
+ await this.carrier.publish(this.envelope("runner.exited", outcome));
197
+ await this.metadata.recordExit({
198
+ terminalSessionId: this.lease.terminalSessionId,
199
+ runnerId: this.lease.runnerId,
200
+ runnerEpoch: this.lease.runnerEpoch,
201
+ exitCode: outcome.exitCode,
202
+ ...(outcome.signal === undefined ? {} : { signal: outcome.signal }),
203
+ reason: outcome.reason,
204
+ finalOutputSeq: outcome.finalOutputSeq,
205
+ });
206
+ }
207
+ }
208
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/terminal/transport.ts"],"names":[],"mappings":"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"}