@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,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"}
@@ -0,0 +1,31 @@
1
+ const PRODUCTION_REF = "ctknjrtevjrzwpuojghx";
2
+ function projectRef(value) {
3
+ const url = new URL(value);
4
+ const match = `${url.hostname}${url.pathname}`.match(/\b([a-z0-9]{20})\b/);
5
+ if (!match)
6
+ throw new Error("credential_profile_project_ref_missing");
7
+ return match[1];
8
+ }
9
+ export function configuredStagingMigrationProfiles(env = process.env) {
10
+ const profiles = [];
11
+ for (const [name, value] of Object.entries(env)) {
12
+ const match = /^ACC_DB_PROFILE_([A-Z0-9_]+)_URL$/.exec(name);
13
+ if (!match || !value)
14
+ continue;
15
+ try {
16
+ if (projectRef(value) !== PRODUCTION_REF)
17
+ profiles.push(match[1].toLowerCase());
18
+ }
19
+ catch { /* malformed credentials are never advertised */ }
20
+ }
21
+ return profiles.sort();
22
+ }
23
+ export function stagingMigrationCaps(env = process.env) {
24
+ const profiles = configuredStagingMigrationProfiles(env);
25
+ return profiles.length === 0 ? {} : { staging_migrations: true, staging_migration_profiles: profiles };
26
+ }
27
+ /** Explicit opt-in: credentials alone never make a runner claim migrations. */
28
+ export function stagingMigrationServiceEnabled(env = process.env) {
29
+ return env.ACC_STAGING_MIGRATION_SERVICE === "1" && configuredStagingMigrationProfiles(env).length > 0;
30
+ }
31
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/staging-migrations/profiles.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAE9C,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC3E,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;YAAE,SAAS;QAC/B,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,cAAc;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC,CAAC,gDAAgD,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,MAAM,QAAQ,GAAG,kCAAkC,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,0BAA0B,EAAE,QAAQ,EAAE,CAAC;AACzG,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,8BAA8B,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjF,OAAO,GAAG,CAAC,6BAA6B,KAAK,GAAG,IAAI,kCAAkC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACzG,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { RunnerConfig } from "../config.js";
2
+ import type { RunnerSupabaseClient } from "../supabase.js";
3
+ import { type StagingTarget } from "./executor.js";
4
+ export { configuredStagingMigrationProfiles, stagingMigrationCaps, stagingMigrationServiceEnabled, } from "./profiles.js";
5
+ export interface MigrationServiceLogger {
6
+ info(message: string): void;
7
+ error(message: string): void;
8
+ }
9
+ export interface StagingMigrationServiceOptions {
10
+ pollMs?: number;
11
+ batchLimit?: number;
12
+ env?: NodeJS.ProcessEnv;
13
+ logger?: MigrationServiceLogger;
14
+ resolveRepo?: (repo: string) => string;
15
+ targetFactory?: (profile: string) => StagingTarget & {
16
+ connect(): Promise<void>;
17
+ close(): Promise<void>;
18
+ };
19
+ verifyCommit?: (root: string, sha: string) => Promise<void>;
20
+ }
21
+ export declare function verifyExactCheckout(root: string, expected: string): Promise<void>;
22
+ export declare class StagingMigrationService {
23
+ private readonly sb;
24
+ private readonly cfg;
25
+ private readonly runnerId;
26
+ private readonly options;
27
+ private timer;
28
+ private active;
29
+ private stopping;
30
+ private readonly pollMs;
31
+ private readonly batchLimit;
32
+ private readonly logger;
33
+ private readonly env;
34
+ constructor(sb: RunnerSupabaseClient, cfg: RunnerConfig, runnerId: string, options?: StagingMigrationServiceOptions);
35
+ start(): void;
36
+ stop(): Promise<void>;
37
+ pollOnce(): Promise<void>;
38
+ private claimAndRun;
39
+ }
40
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/staging-migrations/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kCAAkC,EAClC,oBAAoB,EACpB,8BAA8B,GAC/B,MAAM,eAAe,CAAC;AAIvB,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,aAAa,GAAG;QAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAC1G,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAWD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvF;AAED,qBAAa,uBAAuB;IAUhC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;gBAGrB,EAAE,EAAE,oBAAoB,EACxB,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,8BAAmC;IAQ/D,KAAK,IAAI,IAAI;IAQP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBjB,WAAW;CAgE1B"}
@@ -0,0 +1,157 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { resolveMachineRepoPath } from "../machine-console/index.js";
4
+ import { executeApprovedStagingPlan, } from "./executor.js";
5
+ import { PgStagingTarget } from "./pg-target.js";
6
+ import { isCommitSha } from "../commit-sha.js";
7
+ export { configuredStagingMigrationProfiles, stagingMigrationCaps, stagingMigrationServiceEnabled, } from "./profiles.js";
8
+ const execFileAsync = promisify(execFile);
9
+ function safeCode(error) {
10
+ const raw = error instanceof Error ? error.message : "unknown_error";
11
+ return raw.replace(/postgres(?:ql)?:\/\/[^\s]+/gi, "[REDACTED_DB_URL]")
12
+ .replace(/(password|token|secret)=?[^\s]*/gi, "$1=[REDACTED]")
13
+ .replace(/[^a-zA-Z0-9_.:[\] -]/g, "_").slice(0, 240);
14
+ }
15
+ export async function verifyExactCheckout(root, expected) {
16
+ if (!isCommitSha(expected))
17
+ throw new Error("migration_commit_invalid");
18
+ const { stdout } = await execFileAsync("git", ["rev-parse", "HEAD"], { cwd: root });
19
+ if (stdout.trim().toLowerCase() !== expected.toLowerCase())
20
+ throw new Error("migration_commit_mismatch");
21
+ }
22
+ export class StagingMigrationService {
23
+ sb;
24
+ cfg;
25
+ runnerId;
26
+ options;
27
+ timer = null;
28
+ active = false;
29
+ stopping = false;
30
+ pollMs;
31
+ batchLimit;
32
+ logger;
33
+ env;
34
+ constructor(sb, cfg, runnerId, options = {}) {
35
+ this.sb = sb;
36
+ this.cfg = cfg;
37
+ this.runnerId = runnerId;
38
+ this.options = options;
39
+ this.pollMs = Math.max(2_000, Math.min(options.pollMs ?? 15_000, 300_000));
40
+ this.batchLimit = Math.max(1, Math.min(options.batchLimit ?? 3, 10));
41
+ this.env = options.env ?? process.env;
42
+ this.logger = options.logger ?? console;
43
+ }
44
+ start() {
45
+ if (this.timer)
46
+ return;
47
+ this.stopping = false;
48
+ void this.pollOnce();
49
+ this.timer = setInterval(() => void this.pollOnce(), this.pollMs);
50
+ this.timer.unref?.();
51
+ }
52
+ async stop() {
53
+ this.stopping = true;
54
+ if (this.timer)
55
+ clearInterval(this.timer);
56
+ this.timer = null;
57
+ const deadline = Date.now() + 30_000;
58
+ while (this.active && Date.now() < deadline) {
59
+ await new Promise((resolve) => setTimeout(resolve, 25));
60
+ }
61
+ if (this.active) {
62
+ this.logger.error("[acc-runner] staging migration shutdown_wait_exceeded; server recovery retains the claim");
63
+ }
64
+ }
65
+ async pollOnce() {
66
+ if (this.active || this.stopping)
67
+ return;
68
+ this.active = true;
69
+ try {
70
+ const query = await this.sb.from("staging_migration_plans").select("id")
71
+ .eq("status", "approved").order("created_at", { ascending: true }).limit(this.batchLimit);
72
+ if (query.error)
73
+ throw new Error(`migration_poll_failed:${query.error.message}`);
74
+ for (const row of (query.data ?? [])) {
75
+ if (this.stopping)
76
+ break;
77
+ await this.claimAndRun(row.id);
78
+ }
79
+ }
80
+ catch (error) {
81
+ this.logger.error(`[acc-runner] staging migration service: ${safeCode(error)}`);
82
+ }
83
+ finally {
84
+ this.active = false;
85
+ }
86
+ }
87
+ async claimAndRun(planId) {
88
+ const claimed = await this.sb.rpc("claim_staging_migration_plan", { p_plan_id: planId });
89
+ if (claimed.error) {
90
+ // Another runner winning a claim is routine, not a service failure.
91
+ this.logger.info(`[acc-runner] staging migration claim skipped: ${safeCode(claimed.error)}`);
92
+ return;
93
+ }
94
+ const payload = claimed.data;
95
+ if (!payload.plan || !payload.credential_profile_ref || !Array.isArray(payload.items))
96
+ throw new Error("invalid_migration_claim_receipt");
97
+ const plan = { ...payload.plan, credential_profile_ref: payload.credential_profile_ref, items: payload.items };
98
+ const receipts = {
99
+ item: async (ordinal, status, errorCode) => {
100
+ const result = await this.sb.rpc("record_staging_migration_item", {
101
+ p_plan_id: plan.id, p_ordinal: ordinal, p_status: status,
102
+ p_error_code: errorCode ? safeCode(errorCode) : null,
103
+ });
104
+ if (result.error)
105
+ throw new Error(`migration_item_receipt_failed:${result.error.message}`);
106
+ },
107
+ complete: async (succeeded, failureCode) => {
108
+ const result = await this.sb.rpc("complete_staging_migration_plan", {
109
+ p_plan_id: plan.id, p_succeeded: succeeded,
110
+ p_failure_code: failureCode ? safeCode(failureCode) : null,
111
+ });
112
+ if (result.error)
113
+ throw new Error(`migration_completion_receipt_failed:${result.error.message}`);
114
+ },
115
+ };
116
+ const status = async () => {
117
+ const result = await this.sb.from("staging_migration_plans").select("status")
118
+ .eq("id", plan.id).eq("claimed_by_runner", this.runnerId).maybeSingle();
119
+ if (result.error)
120
+ throw new Error(`migration_status_failed:${result.error.message}`);
121
+ return result.data?.status ?? null;
122
+ };
123
+ let target = null;
124
+ let executorStarted = false;
125
+ try {
126
+ const repoRoot = this.options.resolveRepo?.(plan.repo) ?? resolveMachineRepoPath(this.cfg, plan.repo);
127
+ const verify = this.options.verifyCommit ?? verifyExactCheckout;
128
+ await verify(repoRoot, plan.commit_sha);
129
+ target = this.options.targetFactory?.(plan.credential_profile_ref) ?? new PgStagingTarget(plan.credential_profile_ref, this.env);
130
+ await target.connect();
131
+ executorStarted = true;
132
+ await executeApprovedStagingPlan(plan, repoRoot, target, receipts, {
133
+ cancelled: async () => this.stopping || (await status()) === "cancelled",
134
+ heartbeat: async (event) => {
135
+ await this.sb.rpc("log_activity", {
136
+ p_verb: "staging_migration.heartbeat", p_target_id: plan.id,
137
+ p_target_type: "staging_migration_plan", p_payload: { event, runner_id: this.runnerId },
138
+ });
139
+ },
140
+ });
141
+ this.logger.info(`[acc-runner] staging migration plan ${plan.id} succeeded`);
142
+ }
143
+ catch (error) {
144
+ // The executor owns all terminal receipts after it starts. Failures while
145
+ // resolving a checkout/profile or opening Postgres would otherwise leave
146
+ // a claimed plan stuck in running forever.
147
+ if (!executorStarted) {
148
+ await receipts.complete(false, safeCode(error)).catch(() => undefined);
149
+ }
150
+ this.logger.error(`[acc-runner] staging migration plan ${plan.id}: ${safeCode(error)}`);
151
+ }
152
+ finally {
153
+ await target?.close().catch(() => undefined);
154
+ }
155
+ }
156
+ }
157
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/staging-migrations/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** Unit basename for the unnamed instance. FROZEN — pre-existing installs use it. */
2
+ export declare const SYSTEMD_UNIT_BASE: "acc-runner";
3
+ /** Directory holding systemd --user units for the invoking operator. */
4
+ export declare function systemdUserUnitDir(home: string): string;
5
+ /**
6
+ * Unit name for an instance: `acc-runner.service` unnamed, else
7
+ * `acc-runner-<name>.service`. The name is already constrained to
8
+ * `[a-z0-9][a-z0-9-]{0,31}` by instance.ts, so it is safe in a unit name.
9
+ */
10
+ export declare function systemdUnitName(instance: string | null): string;
11
+ /** Absolute path of the unit file the installer writes. */
12
+ export declare function systemdUnitPath(home: string, instance: string | null): string;
13
+ /** Unit name for the instance THIS process resolves (`--instance` / env). */
14
+ export declare function activeSystemdUnitName(env?: NodeJS.ProcessEnv): string;
15
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAgCA,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAG,YAAqB,CAAC;AAEvD,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAElF"}