@tokenfactory/acc-runner 0.44.8 → 0.44.9

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 (174) 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/doctor.d.ts +16 -0
  24. package/dist/doctor.d.ts.map +1 -1
  25. package/dist/doctor.js +107 -0
  26. package/dist/doctor.js.map +1 -1
  27. package/dist/engines/codex-chat.d.ts +10 -1
  28. package/dist/engines/codex-chat.d.ts.map +1 -1
  29. package/dist/engines/codex-chat.js +32 -2
  30. package/dist/engines/codex-chat.js.map +1 -1
  31. package/dist/login.d.ts.map +1 -1
  32. package/dist/login.js +7 -1
  33. package/dist/login.js.map +1 -1
  34. package/dist/machine-console/index.d.ts +6 -10
  35. package/dist/machine-console/index.d.ts.map +1 -1
  36. package/dist/machine-console/index.js +61 -54
  37. package/dist/machine-console/index.js.map +1 -1
  38. package/dist/machine-console/transport.d.ts +57 -0
  39. package/dist/machine-console/transport.d.ts.map +1 -0
  40. package/dist/machine-console/transport.js +170 -0
  41. package/dist/machine-console/transport.js.map +1 -0
  42. package/dist/preview-environments/control-plane.d.ts +11 -0
  43. package/dist/preview-environments/control-plane.d.ts.map +1 -0
  44. package/dist/preview-environments/control-plane.js +49 -0
  45. package/dist/preview-environments/control-plane.js.map +1 -0
  46. package/dist/preview-environments/http-provider.d.ts +13 -0
  47. package/dist/preview-environments/http-provider.d.ts.map +1 -0
  48. package/dist/preview-environments/http-provider.js +64 -0
  49. package/dist/preview-environments/http-provider.js.map +1 -0
  50. package/dist/preview-environments/profiles.d.ts +6 -0
  51. package/dist/preview-environments/profiles.d.ts.map +1 -0
  52. package/dist/preview-environments/profiles.js +34 -0
  53. package/dist/preview-environments/profiles.js.map +1 -0
  54. package/dist/preview-environments/safety.d.ts +7 -0
  55. package/dist/preview-environments/safety.d.ts.map +1 -0
  56. package/dist/preview-environments/safety.js +47 -0
  57. package/dist/preview-environments/safety.js.map +1 -0
  58. package/dist/preview-environments/service.d.ts +36 -0
  59. package/dist/preview-environments/service.d.ts.map +1 -0
  60. package/dist/preview-environments/service.js +149 -0
  61. package/dist/preview-environments/service.js.map +1 -0
  62. package/dist/preview-environments/types.d.ts +60 -0
  63. package/dist/preview-environments/types.d.ts.map +1 -0
  64. package/dist/preview-environments/types.js +2 -0
  65. package/dist/preview-environments/types.js.map +1 -0
  66. package/dist/production-migrations/command.d.ts +3 -0
  67. package/dist/production-migrations/command.d.ts.map +1 -0
  68. package/dist/production-migrations/command.js +21 -0
  69. package/dist/production-migrations/command.js.map +1 -0
  70. package/dist/production-migrations/executor.d.ts +59 -0
  71. package/dist/production-migrations/executor.d.ts.map +1 -0
  72. package/dist/production-migrations/executor.js +161 -0
  73. package/dist/production-migrations/executor.js.map +1 -0
  74. package/dist/production-migrations/pg-target.d.ts +22 -0
  75. package/dist/production-migrations/pg-target.d.ts.map +1 -0
  76. package/dist/production-migrations/pg-target.js +87 -0
  77. package/dist/production-migrations/pg-target.js.map +1 -0
  78. package/dist/production-migrations/profiles.d.ts +5 -0
  79. package/dist/production-migrations/profiles.d.ts.map +1 -0
  80. package/dist/production-migrations/profiles.js +39 -0
  81. package/dist/production-migrations/profiles.js.map +1 -0
  82. package/dist/production-migrations/service.d.ts +39 -0
  83. package/dist/production-migrations/service.d.ts.map +1 -0
  84. package/dist/production-migrations/service.js +166 -0
  85. package/dist/production-migrations/service.js.map +1 -0
  86. package/dist/program.d.ts.map +1 -1
  87. package/dist/program.js +17 -0
  88. package/dist/program.js.map +1 -1
  89. package/dist/runtime/worktree.d.ts.map +1 -1
  90. package/dist/runtime/worktree.js +23 -1
  91. package/dist/runtime/worktree.js.map +1 -1
  92. package/dist/secure-execution/auto-lease.d.ts +57 -0
  93. package/dist/secure-execution/auto-lease.d.ts.map +1 -0
  94. package/dist/secure-execution/auto-lease.js +116 -0
  95. package/dist/secure-execution/auto-lease.js.map +1 -0
  96. package/dist/secure-execution/command-policy.d.ts +5 -0
  97. package/dist/secure-execution/command-policy.d.ts.map +1 -0
  98. package/dist/secure-execution/command-policy.js +95 -0
  99. package/dist/secure-execution/command-policy.js.map +1 -0
  100. package/dist/secure-execution/confinement.d.ts +3 -0
  101. package/dist/secure-execution/confinement.d.ts.map +1 -0
  102. package/dist/secure-execution/confinement.js +18 -0
  103. package/dist/secure-execution/confinement.js.map +1 -0
  104. package/dist/secure-execution/engine.d.ts +24 -0
  105. package/dist/secure-execution/engine.d.ts.map +1 -0
  106. package/dist/secure-execution/engine.js +272 -0
  107. package/dist/secure-execution/engine.js.map +1 -0
  108. package/dist/secure-execution/index.d.ts +7 -0
  109. package/dist/secure-execution/index.d.ts.map +1 -0
  110. package/dist/secure-execution/index.js +6 -0
  111. package/dist/secure-execution/index.js.map +1 -0
  112. package/dist/secure-execution/node-pty.d.ts +11 -0
  113. package/dist/secure-execution/node-pty.d.ts.map +1 -0
  114. package/dist/secure-execution/node-pty.js +27 -0
  115. package/dist/secure-execution/node-pty.js.map +1 -0
  116. package/dist/secure-execution/types.d.ts +176 -0
  117. package/dist/secure-execution/types.d.ts.map +1 -0
  118. package/dist/secure-execution/types.js +2 -0
  119. package/dist/secure-execution/types.js.map +1 -0
  120. package/dist/staging-migrations/command.d.ts +2 -0
  121. package/dist/staging-migrations/command.d.ts.map +1 -0
  122. package/dist/staging-migrations/command.js +58 -0
  123. package/dist/staging-migrations/command.js.map +1 -0
  124. package/dist/staging-migrations/executor.d.ts +49 -0
  125. package/dist/staging-migrations/executor.d.ts.map +1 -0
  126. package/dist/staging-migrations/executor.js +125 -0
  127. package/dist/staging-migrations/executor.js.map +1 -0
  128. package/dist/staging-migrations/pg-target.d.ts +20 -0
  129. package/dist/staging-migrations/pg-target.d.ts.map +1 -0
  130. package/dist/staging-migrations/pg-target.js +63 -0
  131. package/dist/staging-migrations/pg-target.js.map +1 -0
  132. package/dist/staging-migrations/profiles.d.ts +5 -0
  133. package/dist/staging-migrations/profiles.d.ts.map +1 -0
  134. package/dist/staging-migrations/profiles.js +31 -0
  135. package/dist/staging-migrations/profiles.js.map +1 -0
  136. package/dist/staging-migrations/service.d.ts +40 -0
  137. package/dist/staging-migrations/service.d.ts.map +1 -0
  138. package/dist/staging-migrations/service.js +157 -0
  139. package/dist/staging-migrations/service.js.map +1 -0
  140. package/dist/supervisor.d.ts +15 -0
  141. package/dist/supervisor.d.ts.map +1 -0
  142. package/dist/supervisor.js +54 -0
  143. package/dist/supervisor.js.map +1 -0
  144. package/dist/terminal/http-carrier.d.ts +17 -0
  145. package/dist/terminal/http-carrier.d.ts.map +1 -0
  146. package/dist/terminal/http-carrier.js +39 -0
  147. package/dist/terminal/http-carrier.js.map +1 -0
  148. package/dist/terminal/pty-adapter.d.ts +88 -0
  149. package/dist/terminal/pty-adapter.d.ts.map +1 -0
  150. package/dist/terminal/pty-adapter.js +252 -0
  151. package/dist/terminal/pty-adapter.js.map +1 -0
  152. package/dist/terminal/transport-contract.d.ts +115 -0
  153. package/dist/terminal/transport-contract.d.ts.map +1 -0
  154. package/dist/terminal/transport-contract.js +2 -0
  155. package/dist/terminal/transport-contract.js.map +1 -0
  156. package/dist/terminal/transport.d.ts +32 -0
  157. package/dist/terminal/transport.d.ts.map +1 -0
  158. package/dist/terminal/transport.js +208 -0
  159. package/dist/terminal/transport.js.map +1 -0
  160. package/dist/watch-chat/wire.d.ts.map +1 -1
  161. package/dist/watch-chat/wire.js +14 -1
  162. package/dist/watch-chat/wire.js.map +1 -1
  163. package/dist/watch.d.ts.map +1 -1
  164. package/dist/watch.js +32 -0
  165. package/dist/watch.js.map +1 -1
  166. package/package.json +6 -1
  167. package/scripts/com.tokenfactory.acc-runner-dedicated.plist +64 -0
  168. package/scripts/com.tokenfactory.acc-runner.plist +90 -0
  169. package/scripts/gen-build-info.d.mts +3 -0
  170. package/scripts/gen-build-info.mjs +72 -0
  171. package/scripts/install-launchd.sh +235 -0
  172. package/scripts/setup-dedicated-runner-darwin.sh +75 -0
  173. package/scripts/setup-dedicated-runner-linux.sh +173 -0
  174. package/scripts/uninstall-launchd.sh +67 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * RUNNER-LINUX-SUPERVISOR-1: where a Linux runner host's `watch` supervisor
3
+ * lives, and what its unit is called.
4
+ *
5
+ * macOS has had a supervised `watch` since v0.12 (install-launchd.sh + the
6
+ * `launchd agent loaded` doctor check). Linux had the installer
7
+ * (setup-dedicated-runner-linux.sh, a systemd --user unit with Restart=always)
8
+ * but NO doctor check — `acc-runner doctor` returned "skipped (non-darwin)" and
9
+ * stayed green on a host whose supervisor was never installed, never enabled,
10
+ * or silently dead. A release-critical named instance could be down with every
11
+ * check passing.
12
+ *
13
+ * Two things were missing and both are name-derived, so they live here:
14
+ *
15
+ * - Named instances need their OWN unit. `--instance <name>` already forks
16
+ * the keychain slot, cache root and server-side machine string
17
+ * (instance.ts), but the installer only ever wrote one `acc-runner.service`
18
+ * running a bare `watch`. Two named instances on one host collided on it.
19
+ * - The doctor needs to resolve the SAME unit name the installer wrote, from
20
+ * the same instance env, or it checks the wrong service.
21
+ *
22
+ * Pure and fs-free on purpose: the bash installer renders the unit, this module
23
+ * only names and locates it, so there is exactly one renderer and no template
24
+ * to drift. The unit CONTENT contract is pinned by
25
+ * tests/linux-supervisor.test.ts, which reads the installer's text.
26
+ *
27
+ * Unnamed hosts keep the historic `acc-runner.service` byte-for-byte — the
28
+ * upgrade is a no-op for every runner installed before this shipped.
29
+ */
30
+ import path from "node:path";
31
+ import { resolveInstance } from "./instance.js";
32
+ /** Unit basename for the unnamed instance. FROZEN — pre-existing installs use it. */
33
+ export const SYSTEMD_UNIT_BASE = "acc-runner";
34
+ /** Directory holding systemd --user units for the invoking operator. */
35
+ export function systemdUserUnitDir(home) {
36
+ return path.join(home, ".config", "systemd", "user");
37
+ }
38
+ /**
39
+ * Unit name for an instance: `acc-runner.service` unnamed, else
40
+ * `acc-runner-<name>.service`. The name is already constrained to
41
+ * `[a-z0-9][a-z0-9-]{0,31}` by instance.ts, so it is safe in a unit name.
42
+ */
43
+ export function systemdUnitName(instance) {
44
+ return instance ? `${SYSTEMD_UNIT_BASE}-${instance}.service` : `${SYSTEMD_UNIT_BASE}.service`;
45
+ }
46
+ /** Absolute path of the unit file the installer writes. */
47
+ export function systemdUnitPath(home, instance) {
48
+ return path.join(systemdUserUnitDir(home), systemdUnitName(instance));
49
+ }
50
+ /** Unit name for the instance THIS process resolves (`--instance` / env). */
51
+ export function activeSystemdUnitName(env = process.env) {
52
+ return systemdUnitName(resolveInstance(env));
53
+ }
54
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAqB,CAAC;AAEvD,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,iBAAiB,IAAI,QAAQ,UAAU,CAAC,CAAC,CAAC,GAAG,iBAAiB,UAAU,CAAC;AAChG,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAuB;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACxE,OAAO,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { TerminalEphemeralCarrier, TerminalRunnerMessage } from "./transport-contract.js";
2
+ export interface TerminalHttpCarrierOptions {
3
+ baseUrl: string;
4
+ accessToken: () => string | Promise<string>;
5
+ leaseId: string;
6
+ fetchImpl?: typeof fetch;
7
+ }
8
+ /** One-shot private upload carrier. It retains no frame or credential. */
9
+ export declare class TerminalHttpCarrier implements TerminalEphemeralCarrier {
10
+ private readonly endpoint;
11
+ private readonly token;
12
+ private readonly leaseId;
13
+ private readonly fetchImpl;
14
+ constructor(options: TerminalHttpCarrierOptions);
15
+ publish(message: TerminalRunnerMessage): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=http-carrier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-carrier.d.ts","sourceRoot":"","sources":["../../src/terminal/http-carrier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE/F,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,0EAA0E;AAC1E,qBAAa,mBAAoB,YAAW,wBAAwB;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,OAAO,EAAE,0BAA0B;IAYzC,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB7D"}
@@ -0,0 +1,39 @@
1
+ /** One-shot private upload carrier. It retains no frame or credential. */
2
+ export class TerminalHttpCarrier {
3
+ endpoint;
4
+ token;
5
+ leaseId;
6
+ fetchImpl;
7
+ constructor(options) {
8
+ const baseUrl = options.baseUrl.trim().replace(/\/+$/, "");
9
+ if (!baseUrl.startsWith("https://") && !baseUrl.startsWith("http://localhost")) {
10
+ throw new Error("terminal carrier requires HTTPS");
11
+ }
12
+ if (!options.leaseId.trim())
13
+ throw new Error("terminal carrier requires a lease");
14
+ this.endpoint = `${baseUrl}/api/terminal/runner-ingest`;
15
+ this.token = options.accessToken;
16
+ this.leaseId = options.leaseId;
17
+ this.fetchImpl = options.fetchImpl ?? fetch;
18
+ }
19
+ async publish(message) {
20
+ const accessToken = (await this.token()).trim();
21
+ if (!accessToken)
22
+ throw new Error("terminal carrier requires runner authentication");
23
+ const response = await this.fetchImpl(this.endpoint, {
24
+ method: "POST",
25
+ headers: {
26
+ Authorization: `Bearer ${accessToken}`,
27
+ "Content-Type": "application/json",
28
+ "x-acc-terminal-lease": this.leaseId,
29
+ },
30
+ body: JSON.stringify(message),
31
+ signal: AbortSignal.timeout(15_000),
32
+ });
33
+ if (!response.ok) {
34
+ const body = await response.json().catch(() => ({}));
35
+ throw new Error(body.error ?? `terminal carrier rejected the frame (${response.status})`);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=http-carrier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-carrier.js","sourceRoot":"","sources":["../../src/terminal/http-carrier.ts"],"names":[],"mappings":"AASA,0EAA0E;AAC1E,MAAM,OAAO,mBAAmB;IACb,QAAQ,CAAS;IACjB,KAAK,CAA4C;IACjD,OAAO,CAAS;IAChB,SAAS,CAAe;IAEzC,YAAY,OAAmC;QAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,GAAG,GAAG,OAAO,6BAA6B,CAAC;QACxD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,sBAAsB,EAAE,IAAI,CAAC,OAAO;aACrC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,wCAAwC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,88 @@
1
+ import type { RunnerConfig } from "../config.js";
2
+ export declare const TERMINAL_RUNNER_ENABLED_ENV = "ACC_RUNNER_INTERACTIVE_TERMINAL";
3
+ export declare const TERMINAL_REDACTION_POLICY_VERSION = "machine-redaction.v1";
4
+ export declare const MAX_TERMINAL_INPUT_BYTES: number;
5
+ export declare const MAX_TERMINAL_OUTPUT_BYTES: number;
6
+ export interface TerminalPtyExit {
7
+ exitCode: number;
8
+ signal?: number;
9
+ }
10
+ export interface TerminalPtyProcess {
11
+ readonly pid: number;
12
+ onData(listener: (data: string) => void): {
13
+ dispose(): void;
14
+ };
15
+ onExit(listener: (event: TerminalPtyExit) => void): {
16
+ dispose(): void;
17
+ };
18
+ write(data: string): void;
19
+ resize(cols: number, rows: number): void;
20
+ kill(signal?: string): void;
21
+ }
22
+ export interface TerminalPtyFactory {
23
+ spawn(file: string, args: readonly string[], options: {
24
+ name: string;
25
+ cwd: string;
26
+ env: Record<string, string>;
27
+ cols: number;
28
+ rows: number;
29
+ }): TerminalPtyProcess;
30
+ }
31
+ export interface OpenTerminalPtyRequest {
32
+ terminalSessionId: string;
33
+ repo: string;
34
+ cols: number;
35
+ rows: number;
36
+ }
37
+ export interface TerminalOutputFrame {
38
+ terminalSessionId: string;
39
+ outputSeq: number;
40
+ stream: "stdout";
41
+ encoding: "base64";
42
+ data: string;
43
+ byteLength: number;
44
+ redactionPolicyVersion: typeof TERMINAL_REDACTION_POLICY_VERSION;
45
+ redactionApplied: true;
46
+ }
47
+ export interface TerminalInputReceipt {
48
+ inputId: string;
49
+ inputSeq: number;
50
+ runnerReceiptId: string;
51
+ inputAckCursor: number;
52
+ status: "accepted";
53
+ }
54
+ export interface TerminalExitOutcome {
55
+ terminalSessionId: string;
56
+ exitCode: number;
57
+ signal?: number;
58
+ reason: "completed" | "user_terminated" | "failed";
59
+ finalOutputSeq: number;
60
+ }
61
+ export interface TerminalRunnerSession {
62
+ readonly terminalSessionId: string;
63
+ readonly pid: number;
64
+ readonly closed: Promise<TerminalExitOutcome>;
65
+ writeInput(inputId: string, inputSeq: number, data: string): TerminalInputReceipt;
66
+ resize(resizeSeq: number, cols: number, rows: number): boolean;
67
+ terminate(): Promise<TerminalExitOutcome>;
68
+ }
69
+ export interface OpenTerminalPtyDeps {
70
+ cfg: RunnerConfig;
71
+ request: OpenTerminalPtyRequest;
72
+ onOutput: (frame: TerminalOutputFrame) => void | Promise<void>;
73
+ factory?: TerminalPtyFactory;
74
+ env?: NodeJS.ProcessEnv;
75
+ terminateGraceMs?: number;
76
+ }
77
+ export declare class TerminalRunnerError extends Error {
78
+ readonly code: string;
79
+ constructor(code: string, message: string);
80
+ }
81
+ export declare function terminalRunnerEnabled(env?: NodeJS.ProcessEnv): boolean;
82
+ /**
83
+ * Allocate one dark, runner-local PTY. This adapter has no polling, RPC, socket,
84
+ * browser, or product-surface wiring; the explicit environment kill switch must
85
+ * be on and a future authenticated gateway must supply every call.
86
+ */
87
+ export declare function openTerminalPty(deps: OpenTerminalPtyDeps): Promise<TerminalRunnerSession>;
88
+ //# sourceMappingURL=pty-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-adapter.d.ts","sourceRoot":"","sources":["../../src/terminal/pty-adapter.ts"],"names":[],"mappings":"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"}
@@ -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