@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,6 @@
1
+ export { confinedCwd } from "./confinement.js";
2
+ export { commandDigest, SecureExecutionEngine } from "./engine.js";
3
+ export { NodePtyFactory } from "./node-pty.js";
4
+ export { SupabaseAutoLeaseVerifier, MemoryCompletionOutbox, bindIssuedAutoLease } from "./auto-lease.js";
5
+ export { assertAutoExecutionPolicy } from "./command-policy.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/secure-execution/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PtyFactory, PtyProcess } from "./types.js";
2
+ /** Production adapter; tests inject a deterministic PtyFactory. */
3
+ export declare class NodePtyFactory implements PtyFactory {
4
+ spawn(file: string, args: string[], options: {
5
+ cwd: string;
6
+ env: Record<string, string>;
7
+ cols: number;
8
+ rows: number;
9
+ }): PtyProcess;
10
+ }
11
+ //# sourceMappingURL=node-pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-pty.d.ts","sourceRoot":"","sources":["../../src/secure-execution/node-pty.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKzD,mEAAmE;AACnE,qBAAa,cAAe,YAAW,UAAU;IAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;CAqBnI"}
@@ -0,0 +1,27 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ /** Production adapter; tests inject a deterministic PtyFactory. */
4
+ export class NodePtyFactory {
5
+ spawn(file, args, options) {
6
+ // Resolve lazily so importing the bounded console does not load a native
7
+ // addon. Packaged runners include node-pty; stripped test installs can still
8
+ // exercise every policy through an injected PtyFactory.
9
+ const nodePty = require("node-pty");
10
+ const child = nodePty.spawn(file, args, {
11
+ cwd: options.cwd,
12
+ env: options.env,
13
+ cols: options.cols,
14
+ rows: options.rows,
15
+ name: options.env.TERM ?? "xterm-256color",
16
+ });
17
+ return {
18
+ get pid() { return child.pid; },
19
+ write: (data) => child.write(data),
20
+ resize: (cols, rows) => child.resize(cols, rows),
21
+ kill: (signal) => child.kill(signal),
22
+ onData: (callback) => child.onData(callback),
23
+ onExit: (callback) => child.onExit(callback),
24
+ };
25
+ }
26
+ }
27
+ //# sourceMappingURL=node-pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-pty.js","sourceRoot":"","sources":["../../src/secure-execution/node-pty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,mEAAmE;AACnE,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,IAAY,EAAE,IAAc,EAAE,OAAiF;QACnH,yEAAyE;QACzE,6EAA6E;QAC7E,wDAAwD;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAkB,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,gBAAgB;SAC3C,CAAC,CAAC;QACH,OAAO;YACL,IAAI,GAAG,KAAK,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;YAChD,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YACpC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC5C,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,176 @@
1
+ export type ExecutionMode = "human" | "auto";
2
+ export type ExecutionTermination = "exited" | "cancelled" | "expired" | "output_limit" | "resource_limit" | "quarantined" | "policy_denied";
3
+ export interface AutoExecutionLease {
4
+ leaseId: string;
5
+ leaseToken?: string;
6
+ issueReceiptId?: string;
7
+ orgId?: string;
8
+ userId?: string;
9
+ profileId?: string;
10
+ runnerId: string;
11
+ repo: string;
12
+ paths?: string[];
13
+ commandClass?: string;
14
+ networkDestinations?: string[];
15
+ commandDigest: string;
16
+ expiresAt: string;
17
+ nonce?: string;
18
+ limits?: Pick<ExecutionLimits, "wallMs" | "outputBytes" | "cpuSeconds" | "memoryMb">;
19
+ }
20
+ export interface AutoLeaseVerifier {
21
+ verify(lease: AutoExecutionLease, context: AutoLeaseVerificationContext): Promise<AutoLeaseVerdict>;
22
+ }
23
+ export interface AutoLeaseVerificationContext {
24
+ runnerId: string;
25
+ orgId?: string;
26
+ userId?: string;
27
+ repo: string;
28
+ paths: string[];
29
+ commandClass?: string;
30
+ commandDigest: string;
31
+ destinations: NetworkDestination[];
32
+ limits: ExecutionLimits;
33
+ now: Date;
34
+ }
35
+ export interface AutoLeaseVerdict {
36
+ valid: boolean;
37
+ reason?: string;
38
+ consumeReceiptId?: string;
39
+ profileId?: string;
40
+ }
41
+ export interface SecretProvider {
42
+ resolve(names: readonly string[], context: {
43
+ repo: string;
44
+ sessionId: string;
45
+ }): Promise<Record<string, string>>;
46
+ }
47
+ export interface NetworkDestination {
48
+ host: string;
49
+ port: number;
50
+ protocol: "tcp" | "udp" | "https";
51
+ }
52
+ export interface DestinationPolicy {
53
+ authorize(destinations: readonly NetworkDestination[], context: {
54
+ repo: string;
55
+ mode: ExecutionMode;
56
+ }): Promise<{
57
+ allowed: boolean;
58
+ reason?: string;
59
+ }>;
60
+ /** Install the runtime egress boundary for a spawned AUTO process. Merely
61
+ * authorizing a list is insufficient: AUTO fails closed without this hook. */
62
+ activate?(pid: number, destinations: readonly NetworkDestination[], context: {
63
+ repo: string;
64
+ mode: ExecutionMode;
65
+ }): Promise<{
66
+ dispose(): void;
67
+ }>;
68
+ }
69
+ export interface ExecutionLimits {
70
+ wallMs: number;
71
+ outputBytes: number;
72
+ inputBytes: number;
73
+ maxCols: number;
74
+ maxRows: number;
75
+ cpuSeconds: number;
76
+ memoryMb: number;
77
+ }
78
+ export interface ResourceController {
79
+ attach(pid: number, limits: Pick<ExecutionLimits, "cpuSeconds" | "memoryMb">, onExceeded: () => void): Promise<{
80
+ dispose(): void;
81
+ }>;
82
+ }
83
+ export interface SecureExecutionRequest {
84
+ sessionId: string;
85
+ runnerId: string;
86
+ repo: string;
87
+ orgId?: string;
88
+ userId?: string;
89
+ repoRoot: string;
90
+ cwd?: string;
91
+ paths?: string[];
92
+ commandClass?: string;
93
+ command: string;
94
+ mode: ExecutionMode;
95
+ autoLease?: AutoExecutionLease;
96
+ secretNames?: string[];
97
+ destinations?: NetworkDestination[];
98
+ env?: Record<string, string>;
99
+ limits?: Partial<ExecutionLimits>;
100
+ }
101
+ export interface AutoCompletionRecord {
102
+ idempotencyKey: string;
103
+ leaseId: string;
104
+ issueReceiptId?: string;
105
+ consumeReceiptId?: string;
106
+ profileId?: string;
107
+ execution: ExecutionReceipt;
108
+ }
109
+ export interface AutoCompletionReporter {
110
+ report(record: AutoCompletionRecord): Promise<void>;
111
+ }
112
+ export interface AutoCompletionRetrySink {
113
+ enqueue(record: AutoCompletionRecord): Promise<void>;
114
+ }
115
+ export interface ExecutionFrame {
116
+ sequence: number;
117
+ stream: "pty" | "system";
118
+ content: string;
119
+ bytes: number;
120
+ at: string;
121
+ }
122
+ export interface ExecutionReceipt {
123
+ sessionId: string;
124
+ repo: string;
125
+ commandDigest: string;
126
+ mode: ExecutionMode;
127
+ cwd: string;
128
+ startedAt: string;
129
+ finishedAt: string;
130
+ exitCode: number | null;
131
+ termination: ExecutionTermination;
132
+ outputBytes: number;
133
+ secretNames: string[];
134
+ destinations: NetworkDestination[];
135
+ }
136
+ export interface ProvenanceSink {
137
+ record(event: "execution.started" | "execution.finished" | "execution.denied", payload: Record<string, unknown>): Promise<void>;
138
+ }
139
+ export interface QuarantineSource {
140
+ current(): Promise<{
141
+ quarantined: boolean;
142
+ reason?: string;
143
+ }>;
144
+ }
145
+ export interface PtyProcess {
146
+ readonly pid: number;
147
+ write(data: string): void;
148
+ resize(cols: number, rows: number): void;
149
+ kill(signal?: string): void;
150
+ onData(callback: (data: string) => void): {
151
+ dispose(): void;
152
+ };
153
+ onExit(callback: (event: {
154
+ exitCode: number;
155
+ signal?: number;
156
+ }) => void): {
157
+ dispose(): void;
158
+ };
159
+ }
160
+ export interface PtyFactory {
161
+ spawn(file: string, args: string[], options: {
162
+ cwd: string;
163
+ env: Record<string, string>;
164
+ cols: number;
165
+ rows: number;
166
+ }): PtyProcess;
167
+ }
168
+ export interface SecureExecutionSession {
169
+ readonly id: string;
170
+ write(data: string): void;
171
+ resize(cols: number, rows: number): void;
172
+ cancel(): void;
173
+ reconnect(afterSequence?: number): ExecutionFrame[];
174
+ wait(): Promise<ExecutionReceipt>;
175
+ }
176
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/secure-execution/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/secure-execution/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function applyApprovedStagingMigrationCommand(planId: string): Promise<void>;
2
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/staging-migrations/command.ts"],"names":[],"mappings":"AAWA,wBAAsB,oCAAoC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CxF"}
@@ -0,0 +1,58 @@
1
+ import { loadConfig } from "../config.js";
2
+ import { getTokenProvider } from "../token-provider.js";
3
+ import { createRunnerClient } from "../supabase.js";
4
+ import { resolveMachineRepoPath } from "../machine-console/index.js";
5
+ import { executeApprovedStagingPlan } from "./executor.js";
6
+ import { PgStagingTarget } from "./pg-target.js";
7
+ function rpcError(error, fallback) {
8
+ throw new Error(error?.message ?? fallback);
9
+ }
10
+ export async function applyApprovedStagingMigrationCommand(planId) {
11
+ const cfg = loadConfig();
12
+ const session = await getTokenProvider().load();
13
+ if (!session?.runner_id)
14
+ throw new Error("runner login required");
15
+ const sb = createRunnerClient(cfg, session.access_token, session.realtime_config);
16
+ const claimed = await sb.rpc("claim_staging_migration_plan", { p_plan_id: planId });
17
+ if (claimed.error)
18
+ rpcError(claimed.error, "could not claim staging migration plan");
19
+ const payload = claimed.data;
20
+ if (!payload.plan || !payload.credential_profile_ref || !Array.isArray(payload.items))
21
+ throw new Error("invalid migration claim receipt");
22
+ const plan = {
23
+ ...payload.plan,
24
+ credential_profile_ref: payload.credential_profile_ref,
25
+ items: payload.items,
26
+ };
27
+ const repoRoot = resolveMachineRepoPath(cfg, plan.repo);
28
+ const target = new PgStagingTarget(plan.credential_profile_ref);
29
+ const receipts = {
30
+ item: async (ordinal, status, errorCode) => {
31
+ const result = await sb.rpc("record_staging_migration_item", {
32
+ p_plan_id: plan.id,
33
+ p_ordinal: ordinal,
34
+ p_status: status,
35
+ p_error_code: errorCode ?? null,
36
+ });
37
+ if (result.error)
38
+ rpcError(result.error, "could not record migration item receipt");
39
+ },
40
+ complete: async (succeeded, failureCode) => {
41
+ const result = await sb.rpc("complete_staging_migration_plan", {
42
+ p_plan_id: plan.id,
43
+ p_succeeded: succeeded,
44
+ p_failure_code: failureCode ?? null,
45
+ });
46
+ if (result.error)
47
+ rpcError(result.error, "could not record migration completion receipt");
48
+ },
49
+ };
50
+ await target.connect();
51
+ try {
52
+ await executeApprovedStagingPlan(plan, repoRoot, target, receipts);
53
+ }
54
+ finally {
55
+ await target.close();
56
+ }
57
+ }
58
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/staging-migrations/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export interface ApprovedMigrationItem {
2
+ ordinal: number;
3
+ seq: string;
4
+ slug: string;
5
+ path: string;
6
+ sha: string;
7
+ status: "pending" | "skipped" | "applied" | "failed";
8
+ }
9
+ export interface ApprovedMigrationPlan {
10
+ id: string;
11
+ repo: string;
12
+ commit_sha: string;
13
+ staging_project_ref: string;
14
+ credential_profile_ref: string;
15
+ ledger_head_seq: string | null;
16
+ plan_hash: string;
17
+ items: ApprovedMigrationItem[];
18
+ }
19
+ export interface StagingTarget {
20
+ projectRef(): Promise<string>;
21
+ tryAdvisoryLock(key: string): Promise<boolean>;
22
+ unlockAdvisory(key: string): Promise<void>;
23
+ ledgerHead(): Promise<string | null>;
24
+ ledger(seq: string): Promise<{
25
+ slug: string;
26
+ sha: string;
27
+ } | null>;
28
+ apply(sql: string): Promise<void>;
29
+ }
30
+ export interface MigrationExecutionHooks {
31
+ /** Observed between files; a migration already handed to Postgres is never interrupted. */
32
+ cancelled?: () => Promise<boolean>;
33
+ heartbeat?: (event: "lock_acquired" | "item_started" | "item_finished") => Promise<void>;
34
+ }
35
+ export declare class StagingMigrationCancelledError extends Error {
36
+ constructor();
37
+ }
38
+ export interface MigrationReceiptSink {
39
+ item(ordinal: number, status: "skipped" | "applied" | "failed", errorCode?: string): Promise<void>;
40
+ complete(succeeded: boolean, failureCode?: string): Promise<void>;
41
+ }
42
+ export declare function canonicalPlanHash(plan: Pick<ApprovedMigrationPlan, "repo" | "commit_sha" | "staging_project_ref" | "ledger_head_seq" | "items">): string;
43
+ /**
44
+ * Applies only the exact files named by an approved plan. Each migration file
45
+ * owns its transaction; execution stops at the first failure and can be safely
46
+ * resumed because already-ledgered items are hash checked then skipped.
47
+ */
48
+ export declare function executeApprovedStagingPlan(plan: ApprovedMigrationPlan, repoRoot: string, target: StagingTarget, receipts: MigrationReceiptSink, hooks?: MigrationExecutionHooks): Promise<void>;
49
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/staging-migrations/executor.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;CACtD;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,qBAAqB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACnE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,uBAAuB;IACtC,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,GAAG,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAED,qBAAa,8BAA+B,SAAQ,KAAK;;CAIxD;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CACF,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,EACxC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CACR,qBAAqB,EACrB,MAAM,GAAG,YAAY,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,OAAO,CAC5E,GACA,MAAM,CAeR;AA4BD;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,GAAE,uBAA4B,GAClC,OAAO,CAAC,IAAI,CAAC,CA2Df"}
@@ -0,0 +1,125 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { isSha256Digest } from "../commit-sha.js";
5
+ export class StagingMigrationCancelledError extends Error {
6
+ constructor() {
7
+ super("staging_migration_cancelled");
8
+ }
9
+ }
10
+ export function canonicalPlanHash(plan) {
11
+ const value = JSON.stringify({
12
+ repo: plan.repo.toLowerCase(),
13
+ commitSha: plan.commit_sha.toLowerCase(),
14
+ stagingProjectRef: plan.staging_project_ref,
15
+ ledgerHeadSeq: plan.ledger_head_seq,
16
+ items: plan.items.map(({ ordinal, seq, slug, path: migrationPath, sha }) => ({
17
+ ordinal,
18
+ seq,
19
+ slug,
20
+ path: migrationPath,
21
+ sha,
22
+ })),
23
+ });
24
+ return createHash("sha256").update(value).digest("hex");
25
+ }
26
+ function assertPlan(plan) {
27
+ if (plan.staging_project_ref === "ctknjrtevjrzwpuojghx")
28
+ throw new Error("production_target_forbidden");
29
+ if (!/^[a-z0-9]{20}$/.test(plan.staging_project_ref))
30
+ throw new Error("staging_project_pin_invalid");
31
+ if (plan.items.length === 0 || canonicalPlanHash(plan) !== plan.plan_hash)
32
+ throw new Error("plan_hash_mismatch");
33
+ let previous = plan.ledger_head_seq ? Number(plan.ledger_head_seq) : null;
34
+ for (const [index, item] of plan.items.entries()) {
35
+ const expectedPath = `supabase/migrations/${item.seq}_${item.slug}.sql`;
36
+ if (item.ordinal !== index || item.path !== expectedPath || !isSha256Digest(item.sha)) {
37
+ throw new Error("plan_item_invalid");
38
+ }
39
+ if (previous !== null && Number(item.seq) !== previous + 1)
40
+ throw new Error("plan_not_contiguous");
41
+ previous = Number(item.seq);
42
+ }
43
+ }
44
+ function fileInsideRepo(repoRoot, migrationPath) {
45
+ const root = path.resolve(repoRoot);
46
+ const resolved = path.resolve(root, migrationPath);
47
+ if (!resolved.startsWith(`${root}${path.sep}`))
48
+ throw new Error("migration_path_escape");
49
+ return resolved;
50
+ }
51
+ /**
52
+ * Applies only the exact files named by an approved plan. Each migration file
53
+ * owns its transaction; execution stops at the first failure and can be safely
54
+ * resumed because already-ledgered items are hash checked then skipped.
55
+ */
56
+ export async function executeApprovedStagingPlan(plan, repoRoot, target, receipts, hooks = {}) {
57
+ const lockKey = `acc:staging-migrations:${plan.staging_project_ref}`;
58
+ let locked = false;
59
+ try {
60
+ assertPlan(plan);
61
+ if ((await target.projectRef()) !== plan.staging_project_ref)
62
+ throw new Error("staging_project_pin_mismatch");
63
+ if (!(await target.tryAdvisoryLock(lockKey)))
64
+ throw new Error("staging_migration_lock_busy");
65
+ locked = true;
66
+ const head = await target.ledgerHead();
67
+ const resumableHeads = new Set([plan.ledger_head_seq, ...plan.items.map((item) => item.seq)]);
68
+ if (!resumableHeads.has(head))
69
+ throw new Error("ledger_head_mismatch");
70
+ await hooks.heartbeat?.("lock_acquired");
71
+ }
72
+ catch (error) {
73
+ if (locked)
74
+ await target.unlockAdvisory(lockKey).catch(() => undefined);
75
+ await receipts.complete(false, error.message);
76
+ throw error;
77
+ }
78
+ try {
79
+ for (const item of plan.items) {
80
+ if (await hooks.cancelled?.())
81
+ throw new StagingMigrationCancelledError();
82
+ if (item.status === "applied" || item.status === "skipped")
83
+ continue;
84
+ await hooks.heartbeat?.("item_started");
85
+ const existing = await target.ledger(item.seq);
86
+ if (existing) {
87
+ if (existing.slug !== item.slug || existing.sha !== item.sha)
88
+ throw new Error(`ledger_drift_${item.seq}`);
89
+ await receipts.item(item.ordinal, "skipped");
90
+ await hooks.heartbeat?.("item_finished");
91
+ continue;
92
+ }
93
+ const sql = await readFile(fileInsideRepo(repoRoot, item.path), "utf8");
94
+ const sha = createHash("sha256").update(sql).digest("hex");
95
+ if (sha !== item.sha)
96
+ throw new Error(`file_hash_mismatch_${item.seq}`);
97
+ try {
98
+ await target.apply(sql);
99
+ const recorded = await target.ledger(item.seq);
100
+ if (!recorded || recorded.slug !== item.slug || recorded.sha !== item.sha) {
101
+ throw new Error(`ledger_receipt_missing_${item.seq}`);
102
+ }
103
+ await receipts.item(item.ordinal, "applied");
104
+ await hooks.heartbeat?.("item_finished");
105
+ }
106
+ catch (error) {
107
+ await receipts.item(item.ordinal, "failed", error.message);
108
+ throw error;
109
+ }
110
+ }
111
+ await receipts.complete(true);
112
+ }
113
+ catch (error) {
114
+ // A control-plane cancellation owns the terminal state. Its completion RPC
115
+ // intentionally rejects, so do not overwrite it with a second transition.
116
+ if (!(error instanceof StagingMigrationCancelledError)) {
117
+ await receipts.complete(false, error.message);
118
+ }
119
+ throw error;
120
+ }
121
+ finally {
122
+ await target.unlockAdvisory(lockKey);
123
+ }
124
+ }
125
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/staging-migrations/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { StagingTarget } from "./executor.js";
2
+ export declare function credentialEnvName(profileRef: string): string;
3
+ export declare function projectRefFromUrl(value: string): string;
4
+ export declare class PgStagingTarget implements StagingTarget {
5
+ private readonly client;
6
+ private readonly pinnedRef;
7
+ constructor(profileRef: string, env?: NodeJS.ProcessEnv);
8
+ connect(): Promise<void>;
9
+ close(): Promise<void>;
10
+ projectRef(): Promise<string>;
11
+ tryAdvisoryLock(key: string): Promise<boolean>;
12
+ unlockAdvisory(key: string): Promise<void>;
13
+ ledger(seq: string): Promise<{
14
+ slug: string;
15
+ sha: string;
16
+ } | null>;
17
+ ledgerHead(): Promise<string | null>;
18
+ apply(sql: string): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=pg-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-target.d.ts","sourceRoot":"","sources":["../../src/staging-migrations/pg-target.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUvD;AAED,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,UAAU,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB;IAW9D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAGxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAGtB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAG7B,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO9C,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAG1C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAOlE,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMpC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
@@ -0,0 +1,63 @@
1
+ import { Client } from "pg";
2
+ export function credentialEnvName(profileRef) {
3
+ if (!/^[A-Za-z0-9_.-]{1,80}$/.test(profileRef))
4
+ throw new Error("credential_profile_ref_invalid");
5
+ return `ACC_DB_PROFILE_${profileRef.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_URL`;
6
+ }
7
+ export function projectRefFromUrl(value) {
8
+ let url;
9
+ try {
10
+ url = new URL(value);
11
+ }
12
+ catch {
13
+ throw new Error("credential_profile_url_invalid");
14
+ }
15
+ const match = `${url.hostname}${url.pathname}`.match(/\b([a-z0-9]{20})\b/);
16
+ if (!match)
17
+ throw new Error("credential_profile_project_ref_missing");
18
+ return match[1];
19
+ }
20
+ export class PgStagingTarget {
21
+ client;
22
+ pinnedRef;
23
+ constructor(profileRef, env = process.env) {
24
+ const value = env[credentialEnvName(profileRef)];
25
+ if (!value)
26
+ throw new Error("credential_profile_not_configured");
27
+ this.pinnedRef = projectRefFromUrl(value);
28
+ if (this.pinnedRef === "ctknjrtevjrzwpuojghx")
29
+ throw new Error("production_target_forbidden");
30
+ this.client = new Client({
31
+ connectionString: value,
32
+ application_name: "acc-staging-migration-executor",
33
+ });
34
+ }
35
+ async connect() {
36
+ await this.client.connect();
37
+ }
38
+ async close() {
39
+ await this.client.end();
40
+ }
41
+ async projectRef() {
42
+ return this.pinnedRef;
43
+ }
44
+ async tryAdvisoryLock(key) {
45
+ const result = await this.client.query("select pg_try_advisory_lock(hashtextextended($1, 0)) as locked", [key]);
46
+ return result.rows[0]?.locked === true;
47
+ }
48
+ async unlockAdvisory(key) {
49
+ await this.client.query("select pg_advisory_unlock(hashtextextended($1, 0))", [key]);
50
+ }
51
+ async ledger(seq) {
52
+ const result = await this.client.query("select slug, sha from acc.applied_migrations where seq = $1", [seq]);
53
+ return result.rows[0] ?? null;
54
+ }
55
+ async ledgerHead() {
56
+ const result = await this.client.query("select seq from acc.applied_migrations order by seq::integer desc limit 1");
57
+ return result.rows[0]?.seq ?? null;
58
+ }
59
+ async apply(sql) {
60
+ await this.client.query(sql);
61
+ }
62
+ }
63
+ //# sourceMappingURL=pg-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-target.js","sourceRoot":"","sources":["../../src/staging-migrations/pg-target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function configuredStagingMigrationProfiles(env?: NodeJS.ProcessEnv): string[];
2
+ export declare function stagingMigrationCaps(env?: NodeJS.ProcessEnv): Record<string, unknown>;
3
+ /** Explicit opt-in: credentials alone never make a runner claim migrations. */
4
+ export declare function stagingMigrationServiceEnabled(env?: NodeJS.ProcessEnv): boolean;
5
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/staging-migrations/profiles.ts"],"names":[],"mappings":"AASA,wBAAgB,kCAAkC,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAUjG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGlG;AAED,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE5F"}