@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.
- package/README.md +38 -0
- package/dist/attachments/codex-stage.d.ts +11 -0
- package/dist/attachments/codex-stage.d.ts.map +1 -0
- package/dist/attachments/codex-stage.js +82 -0
- package/dist/attachments/codex-stage.js.map +1 -0
- package/dist/attachments/fetch-attachment.d.ts +17 -0
- package/dist/attachments/fetch-attachment.d.ts.map +1 -1
- package/dist/attachments/fetch-attachment.js +134 -6
- package/dist/attachments/fetch-attachment.js.map +1 -1
- package/dist/attachments/index.d.ts +2 -1
- package/dist/attachments/index.d.ts.map +1 -1
- package/dist/attachments/index.js +2 -1
- package/dist/attachments/index.js.map +1 -1
- package/dist/build-info.generated.d.ts +1 -1
- package/dist/build-info.generated.js +2 -2
- package/dist/commit-sha.d.ts +31 -0
- package/dist/commit-sha.d.ts.map +1 -0
- package/dist/commit-sha.js +31 -0
- package/dist/commit-sha.js.map +1 -0
- package/dist/companion-run.d.ts.map +1 -1
- package/dist/companion-run.js +14 -1
- package/dist/companion-run.js.map +1 -1
- package/dist/device-refusal.d.ts +70 -0
- package/dist/device-refusal.d.ts.map +1 -0
- package/dist/device-refusal.js +97 -0
- package/dist/device-refusal.js.map +1 -0
- package/dist/doctor.d.ts +16 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +107 -0
- package/dist/doctor.js.map +1 -1
- package/dist/engines/codex-chat.d.ts +10 -1
- package/dist/engines/codex-chat.d.ts.map +1 -1
- package/dist/engines/codex-chat.js +32 -2
- package/dist/engines/codex-chat.js.map +1 -1
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +32 -3
- package/dist/login.js.map +1 -1
- package/dist/machine-console/index.d.ts +6 -10
- package/dist/machine-console/index.d.ts.map +1 -1
- package/dist/machine-console/index.js +61 -54
- package/dist/machine-console/index.js.map +1 -1
- package/dist/machine-console/redact.d.ts.map +1 -1
- package/dist/machine-console/redact.js +10 -1
- package/dist/machine-console/redact.js.map +1 -1
- package/dist/machine-console/transport.d.ts +57 -0
- package/dist/machine-console/transport.d.ts.map +1 -0
- package/dist/machine-console/transport.js +170 -0
- package/dist/machine-console/transport.js.map +1 -0
- package/dist/preview-environments/control-plane.d.ts +11 -0
- package/dist/preview-environments/control-plane.d.ts.map +1 -0
- package/dist/preview-environments/control-plane.js +49 -0
- package/dist/preview-environments/control-plane.js.map +1 -0
- package/dist/preview-environments/http-provider.d.ts +13 -0
- package/dist/preview-environments/http-provider.d.ts.map +1 -0
- package/dist/preview-environments/http-provider.js +64 -0
- package/dist/preview-environments/http-provider.js.map +1 -0
- package/dist/preview-environments/profiles.d.ts +6 -0
- package/dist/preview-environments/profiles.d.ts.map +1 -0
- package/dist/preview-environments/profiles.js +34 -0
- package/dist/preview-environments/profiles.js.map +1 -0
- package/dist/preview-environments/safety.d.ts +7 -0
- package/dist/preview-environments/safety.d.ts.map +1 -0
- package/dist/preview-environments/safety.js +47 -0
- package/dist/preview-environments/safety.js.map +1 -0
- package/dist/preview-environments/service.d.ts +36 -0
- package/dist/preview-environments/service.d.ts.map +1 -0
- package/dist/preview-environments/service.js +149 -0
- package/dist/preview-environments/service.js.map +1 -0
- package/dist/preview-environments/types.d.ts +60 -0
- package/dist/preview-environments/types.d.ts.map +1 -0
- package/dist/preview-environments/types.js +2 -0
- package/dist/preview-environments/types.js.map +1 -0
- package/dist/production-migrations/command.d.ts +3 -0
- package/dist/production-migrations/command.d.ts.map +1 -0
- package/dist/production-migrations/command.js +21 -0
- package/dist/production-migrations/command.js.map +1 -0
- package/dist/production-migrations/executor.d.ts +59 -0
- package/dist/production-migrations/executor.d.ts.map +1 -0
- package/dist/production-migrations/executor.js +161 -0
- package/dist/production-migrations/executor.js.map +1 -0
- package/dist/production-migrations/pg-target.d.ts +22 -0
- package/dist/production-migrations/pg-target.d.ts.map +1 -0
- package/dist/production-migrations/pg-target.js +87 -0
- package/dist/production-migrations/pg-target.js.map +1 -0
- package/dist/production-migrations/profiles.d.ts +5 -0
- package/dist/production-migrations/profiles.d.ts.map +1 -0
- package/dist/production-migrations/profiles.js +39 -0
- package/dist/production-migrations/profiles.js.map +1 -0
- package/dist/production-migrations/service.d.ts +39 -0
- package/dist/production-migrations/service.d.ts.map +1 -0
- package/dist/production-migrations/service.js +166 -0
- package/dist/production-migrations/service.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +17 -0
- package/dist/program.js.map +1 -1
- package/dist/runtime/worktree.d.ts.map +1 -1
- package/dist/runtime/worktree.js +23 -1
- package/dist/runtime/worktree.js.map +1 -1
- package/dist/secure-execution/auto-lease.d.ts +57 -0
- package/dist/secure-execution/auto-lease.d.ts.map +1 -0
- package/dist/secure-execution/auto-lease.js +116 -0
- package/dist/secure-execution/auto-lease.js.map +1 -0
- package/dist/secure-execution/command-policy.d.ts +5 -0
- package/dist/secure-execution/command-policy.d.ts.map +1 -0
- package/dist/secure-execution/command-policy.js +95 -0
- package/dist/secure-execution/command-policy.js.map +1 -0
- package/dist/secure-execution/confinement.d.ts +3 -0
- package/dist/secure-execution/confinement.d.ts.map +1 -0
- package/dist/secure-execution/confinement.js +18 -0
- package/dist/secure-execution/confinement.js.map +1 -0
- package/dist/secure-execution/engine.d.ts +24 -0
- package/dist/secure-execution/engine.d.ts.map +1 -0
- package/dist/secure-execution/engine.js +272 -0
- package/dist/secure-execution/engine.js.map +1 -0
- package/dist/secure-execution/index.d.ts +7 -0
- package/dist/secure-execution/index.d.ts.map +1 -0
- package/dist/secure-execution/index.js +6 -0
- package/dist/secure-execution/index.js.map +1 -0
- package/dist/secure-execution/node-pty.d.ts +11 -0
- package/dist/secure-execution/node-pty.d.ts.map +1 -0
- package/dist/secure-execution/node-pty.js +27 -0
- package/dist/secure-execution/node-pty.js.map +1 -0
- package/dist/secure-execution/types.d.ts +176 -0
- package/dist/secure-execution/types.d.ts.map +1 -0
- package/dist/secure-execution/types.js +2 -0
- package/dist/secure-execution/types.js.map +1 -0
- package/dist/staging-migrations/command.d.ts +2 -0
- package/dist/staging-migrations/command.d.ts.map +1 -0
- package/dist/staging-migrations/command.js +58 -0
- package/dist/staging-migrations/command.js.map +1 -0
- package/dist/staging-migrations/executor.d.ts +49 -0
- package/dist/staging-migrations/executor.d.ts.map +1 -0
- package/dist/staging-migrations/executor.js +125 -0
- package/dist/staging-migrations/executor.js.map +1 -0
- package/dist/staging-migrations/pg-target.d.ts +20 -0
- package/dist/staging-migrations/pg-target.d.ts.map +1 -0
- package/dist/staging-migrations/pg-target.js +63 -0
- package/dist/staging-migrations/pg-target.js.map +1 -0
- package/dist/staging-migrations/profiles.d.ts +5 -0
- package/dist/staging-migrations/profiles.d.ts.map +1 -0
- package/dist/staging-migrations/profiles.js +31 -0
- package/dist/staging-migrations/profiles.js.map +1 -0
- package/dist/staging-migrations/service.d.ts +40 -0
- package/dist/staging-migrations/service.d.ts.map +1 -0
- package/dist/staging-migrations/service.js +157 -0
- package/dist/staging-migrations/service.js.map +1 -0
- package/dist/supervisor.d.ts +15 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +54 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/terminal/http-carrier.d.ts +17 -0
- package/dist/terminal/http-carrier.d.ts.map +1 -0
- package/dist/terminal/http-carrier.js +39 -0
- package/dist/terminal/http-carrier.js.map +1 -0
- package/dist/terminal/pty-adapter.d.ts +88 -0
- package/dist/terminal/pty-adapter.d.ts.map +1 -0
- package/dist/terminal/pty-adapter.js +252 -0
- package/dist/terminal/pty-adapter.js.map +1 -0
- package/dist/terminal/transport-contract.d.ts +115 -0
- package/dist/terminal/transport-contract.d.ts.map +1 -0
- package/dist/terminal/transport-contract.js +2 -0
- package/dist/terminal/transport-contract.js.map +1 -0
- package/dist/terminal/transport.d.ts +32 -0
- package/dist/terminal/transport.d.ts.map +1 -0
- package/dist/terminal/transport.js +208 -0
- package/dist/terminal/transport.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/watch-chat/wire.d.ts.map +1 -1
- package/dist/watch-chat/wire.js +14 -1
- package/dist/watch-chat/wire.js.map +1 -1
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +32 -0
- package/dist/watch.js.map +1 -1
- package/package.json +6 -1
- package/scripts/com.tokenfactory.acc-runner-dedicated.plist +64 -0
- package/scripts/com.tokenfactory.acc-runner.plist +90 -0
- package/scripts/gen-build-info.d.mts +3 -0
- package/scripts/gen-build-info.mjs +72 -0
- package/scripts/install-launchd.sh +235 -0
- package/scripts/setup-dedicated-runner-darwin.sh +75 -0
- package/scripts/setup-dedicated-runner-linux.sh +173 -0
- package/scripts/uninstall-launchd.sh +67 -0
|
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EACL,0BAA0B,GAI3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,kCAAkC,EAClC,oBAAoB,EACpB,8BAA8B,GAC/B,MAAM,eAAe,CAAC;AAEvB,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAmB1C,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IACrE,OAAO,GAAG,CAAC,OAAO,CAAC,8BAA8B,EAAE,mBAAmB,CAAC;SACpE,OAAO,CAAC,mCAAmC,EAAE,eAAe,CAAC;SAC7D,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAgB;IACtE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,OAAO,uBAAuB;IAUf;IACA;IACA;IACA;IAZX,KAAK,GAA0B,IAAI,CAAC;IACpC,MAAM,GAAG,KAAK,CAAC;IACf,QAAQ,GAAG,KAAK,CAAC;IACR,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,MAAM,CAAyB;IAC/B,GAAG,CAAoB;IAExC,YACmB,EAAwB,EACxB,GAAiB,EACjB,QAAgB,EAChB,UAA0C,EAAE;QAH5C,OAAE,GAAF,EAAE,CAAsB;QACxB,QAAG,GAAH,GAAG,CAAc;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAAqC;QAE7D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IAC1C,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;QACrC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0FAA0F,CAAC,CAAC;QAChH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;iBACrE,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5F,IAAI,KAAK,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACjF,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAA0B,EAAE,CAAC;gBAC9D,IAAI,IAAI,CAAC,QAAQ;oBAAE,MAAM;gBACzB,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAAc;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,oEAAoE;YACpE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAoB,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAsC,CAAC;QACnJ,MAAM,QAAQ,GAAyB;YACrC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;gBACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,EAAE;oBAChE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;oBACxD,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;iBACrD,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7F,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE;gBACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,iCAAiC,EAAE;oBAClE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS;oBAC1C,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;iBAC3D,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnG,CAAC;SACF,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,IAA4B,EAAE;YAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;iBAC1E,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1E,IAAI,MAAM,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,OAAQ,MAAM,CAAC,IAAmC,EAAE,MAAM,IAAI,IAAI,CAAC;QACrE,CAAC,CAAC;QACF,IAAI,MAAM,GAAkF,IAAI,CAAC;QACjG,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACtG,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,mBAAmB,CAAC;YAChE,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACjI,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,eAAe,GAAG,IAAI,CAAC;YACvB,MAAM,0BAA0B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;gBACjE,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,KAAK,WAAW;gBACxE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACzB,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE;wBAChC,MAAM,EAAE,6BAA6B,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;wBAC3D,aAAa,EAAE,wBAAwB,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;qBACxF,CAAC,CAAC;gBACL,CAAC;aACF,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,yEAAyE;YACzE,2CAA2C;YAC3C,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACzE,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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"}
|
|
@@ -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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"}
|