@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,57 @@
|
|
|
1
|
+
import type { RunnerSupabaseClient } from "../supabase.js";
|
|
2
|
+
import type { MachineCommandClassification } from "./policy.js";
|
|
3
|
+
export type MachineCommandStream = "stdout" | "stderr" | "system";
|
|
4
|
+
export type MachineCommandRunnerStatus = "running" | "cancel_requested" | "succeeded" | "failed" | "cancelled" | "expired";
|
|
5
|
+
export type MachineCommandCompletionStatus = Extract<MachineCommandRunnerStatus, "succeeded" | "failed" | "cancelled" | "expired">;
|
|
6
|
+
export interface ClaimedMachineCommand {
|
|
7
|
+
command_id: string;
|
|
8
|
+
session_id: string;
|
|
9
|
+
project_id: string;
|
|
10
|
+
repo: string;
|
|
11
|
+
command_text: string;
|
|
12
|
+
classification: MachineCommandClassification;
|
|
13
|
+
expires_at: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Opaque capability returned only after the runner-scoped claim RPC succeeds.
|
|
17
|
+
* Every later transport operation requires this exact object, preventing a
|
|
18
|
+
* command id from another session from being mixed into the active execution.
|
|
19
|
+
*/
|
|
20
|
+
export interface MachineCommandLease {
|
|
21
|
+
readonly command: ClaimedMachineCommand;
|
|
22
|
+
}
|
|
23
|
+
export type MachineCommandTransportErrorCode = "authorization_failed" | "transport_unavailable" | "invalid_claim" | "invalid_lease" | "invalid_status" | "invalid_output";
|
|
24
|
+
export declare class MachineCommandTransportError extends Error {
|
|
25
|
+
readonly code: MachineCommandTransportErrorCode;
|
|
26
|
+
constructor(code: MachineCommandTransportErrorCode, message: string);
|
|
27
|
+
}
|
|
28
|
+
export interface MachineCommandTransport {
|
|
29
|
+
claim(): Promise<MachineCommandLease | null>;
|
|
30
|
+
append(lease: MachineCommandLease, stream: MachineCommandStream, content: string): Promise<void>;
|
|
31
|
+
status(lease: MachineCommandLease): Promise<MachineCommandRunnerStatus>;
|
|
32
|
+
complete(lease: MachineCommandLease, status: MachineCommandCompletionStatus, exitCode: number | null): Promise<void>;
|
|
33
|
+
refreshClient(client: RunnerSupabaseClient): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Runner-side adapter for the existing machine-session RPC transport.
|
|
37
|
+
*
|
|
38
|
+
* The database remains the authorization authority. This adapter adds a local
|
|
39
|
+
* fail-closed boundary: malformed claims never reach spawn, leases are bound to
|
|
40
|
+
* the exact claimed command/session pair, and output sequence numbers are owned
|
|
41
|
+
* by the transport rather than by event callbacks.
|
|
42
|
+
*/
|
|
43
|
+
export declare class SupabaseMachineCommandTransport implements MachineCommandTransport {
|
|
44
|
+
private readonly runnerId;
|
|
45
|
+
private client;
|
|
46
|
+
private readonly leases;
|
|
47
|
+
private readonly recentClaimIds;
|
|
48
|
+
private readonly recentClaimOrder;
|
|
49
|
+
constructor(client: RunnerSupabaseClient, runnerId: string);
|
|
50
|
+
refreshClient(client: RunnerSupabaseClient): void;
|
|
51
|
+
claim(): Promise<MachineCommandLease | null>;
|
|
52
|
+
append(lease: MachineCommandLease, stream: MachineCommandStream, content: string): Promise<void>;
|
|
53
|
+
status(lease: MachineCommandLease): Promise<MachineCommandRunnerStatus>;
|
|
54
|
+
complete(lease: MachineCommandLease, status: MachineCommandCompletionStatus, exitCode: number | null): Promise<void>;
|
|
55
|
+
private requireLease;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/machine-console/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAClE,MAAM,MAAM,0BAA0B,GAClC,SAAS,GACT,kBAAkB,GAClB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,SAAS,CAAC;AACd,MAAM,MAAM,8BAA8B,GAAG,OAAO,CAClD,0BAA0B,EAC1B,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CACjD,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,4BAA4B,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,MAAM,gCAAgC,GACxC,sBAAsB,GACtB,uBAAuB,GACvB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,qBAAa,4BAA6B,SAAQ,KAAK;IAEnD,QAAQ,CAAC,IAAI,EAAE,gCAAgC;gBAAtC,IAAI,EAAE,gCAAgC,EAC/C,OAAO,EAAE,MAAM;CAKlB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjG,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACxE,QAAQ,CACN,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,8BAA8B,EACtC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACnD;AA+DD;;;;;;;GAOG;AACH,qBAAa,+BAAgC,YAAW,uBAAuB;IAQ3E,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IACzE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;gBAG/C,MAAM,EAAE,oBAAoB,EACX,QAAQ,EAAE,MAAM;IAMnC,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAI3C,KAAK,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IA4B5C,MAAM,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBhG,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAcvE,QAAQ,CACZ,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,8BAA8B,EACtC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC;IAahB,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
export class MachineCommandTransportError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.code = code;
|
|
6
|
+
this.name = "MachineCommandTransportError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
10
|
+
const REPO = /^[^/\s]+\/[^/\s]+$/;
|
|
11
|
+
const STATUSES = new Set([
|
|
12
|
+
"running",
|
|
13
|
+
"cancel_requested",
|
|
14
|
+
"succeeded",
|
|
15
|
+
"failed",
|
|
16
|
+
"cancelled",
|
|
17
|
+
"expired",
|
|
18
|
+
]);
|
|
19
|
+
const MAX_COMMAND_CHARACTERS = 16_384;
|
|
20
|
+
const MAX_OUTPUT_CHUNK_BYTES = 64 * 1024;
|
|
21
|
+
const MAX_RECENT_CLAIMS = 1_024;
|
|
22
|
+
function rpcError(operation, error) {
|
|
23
|
+
const detail = `${error?.code ?? ""} ${error?.message ?? ""}`;
|
|
24
|
+
const denied = /42501|unauthori[sz]ed|permission|forbidden|target_unavailable|jwt/i.test(detail);
|
|
25
|
+
return new MachineCommandTransportError(denied ? "authorization_failed" : "transport_unavailable", denied
|
|
26
|
+
? `Machine command ${operation} was not authorized.`
|
|
27
|
+
: `Machine command ${operation} transport is unavailable.`);
|
|
28
|
+
}
|
|
29
|
+
function invalidClaim(message) {
|
|
30
|
+
throw new MachineCommandTransportError("invalid_claim", message);
|
|
31
|
+
}
|
|
32
|
+
function parseClaim(value) {
|
|
33
|
+
if (!value || typeof value !== "object")
|
|
34
|
+
invalidClaim("Runner claim payload must be an object.");
|
|
35
|
+
const row = value;
|
|
36
|
+
for (const key of ["command_id", "session_id", "project_id"]) {
|
|
37
|
+
if (typeof row[key] !== "string" || !UUID.test(row[key]))
|
|
38
|
+
invalidClaim(`Runner claim has an invalid ${key}.`);
|
|
39
|
+
}
|
|
40
|
+
if (typeof row.repo !== "string" || !REPO.test(row.repo) || row.repo !== row.repo.toLowerCase()) {
|
|
41
|
+
invalidClaim("Runner claim has an invalid repository scope.");
|
|
42
|
+
}
|
|
43
|
+
if (typeof row.command_text !== "string"
|
|
44
|
+
|| row.command_text.length < 1
|
|
45
|
+
|| row.command_text.length > MAX_COMMAND_CHARACTERS) {
|
|
46
|
+
invalidClaim("Runner claim has an invalid bounded command.");
|
|
47
|
+
}
|
|
48
|
+
if (row.classification !== "read" && row.classification !== "write" && row.classification !== "destructive") {
|
|
49
|
+
invalidClaim("Runner claim has an invalid command classification.");
|
|
50
|
+
}
|
|
51
|
+
if (typeof row.expires_at !== "string" || !Number.isFinite(Date.parse(row.expires_at))) {
|
|
52
|
+
invalidClaim("Runner claim has an invalid expiry.");
|
|
53
|
+
}
|
|
54
|
+
return row;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Runner-side adapter for the existing machine-session RPC transport.
|
|
58
|
+
*
|
|
59
|
+
* The database remains the authorization authority. This adapter adds a local
|
|
60
|
+
* fail-closed boundary: malformed claims never reach spawn, leases are bound to
|
|
61
|
+
* the exact claimed command/session pair, and output sequence numbers are owned
|
|
62
|
+
* by the transport rather than by event callbacks.
|
|
63
|
+
*/
|
|
64
|
+
export class SupabaseMachineCommandTransport {
|
|
65
|
+
runnerId;
|
|
66
|
+
client;
|
|
67
|
+
leases = new WeakMap();
|
|
68
|
+
recentClaimIds = new Set();
|
|
69
|
+
recentClaimOrder = [];
|
|
70
|
+
constructor(client, runnerId) {
|
|
71
|
+
this.runnerId = runnerId;
|
|
72
|
+
this.client = client;
|
|
73
|
+
if (!runnerId.trim())
|
|
74
|
+
throw new Error("runnerId is required");
|
|
75
|
+
}
|
|
76
|
+
refreshClient(client) {
|
|
77
|
+
this.client = client;
|
|
78
|
+
}
|
|
79
|
+
async claim() {
|
|
80
|
+
const { data, error } = await this.client.rpc("claim_machine_command", {
|
|
81
|
+
p_runner_id: this.runnerId,
|
|
82
|
+
});
|
|
83
|
+
if (error)
|
|
84
|
+
throw rpcError("claim", error);
|
|
85
|
+
if (!Array.isArray(data))
|
|
86
|
+
invalidClaim("Runner claim response must be an array.");
|
|
87
|
+
if (data.length === 0)
|
|
88
|
+
return null;
|
|
89
|
+
if (data.length !== 1)
|
|
90
|
+
invalidClaim("Runner claim response returned more than one command.");
|
|
91
|
+
const command = parseClaim(data[0]);
|
|
92
|
+
if (this.recentClaimIds.has(command.command_id)) {
|
|
93
|
+
invalidClaim("Runner claim replayed a command already seen by this process.");
|
|
94
|
+
}
|
|
95
|
+
this.recentClaimIds.add(command.command_id);
|
|
96
|
+
this.recentClaimOrder.push(command.command_id);
|
|
97
|
+
if (this.recentClaimOrder.length > MAX_RECENT_CLAIMS) {
|
|
98
|
+
const oldest = this.recentClaimOrder.shift();
|
|
99
|
+
if (oldest)
|
|
100
|
+
this.recentClaimIds.delete(oldest);
|
|
101
|
+
}
|
|
102
|
+
const lease = Object.freeze({ command: Object.freeze(command) });
|
|
103
|
+
this.leases.set(lease, {
|
|
104
|
+
commandId: command.command_id,
|
|
105
|
+
sessionId: command.session_id,
|
|
106
|
+
nextOutputSequence: 0,
|
|
107
|
+
settled: false,
|
|
108
|
+
});
|
|
109
|
+
return lease;
|
|
110
|
+
}
|
|
111
|
+
async append(lease, stream, content) {
|
|
112
|
+
const state = this.requireLease(lease);
|
|
113
|
+
if (state.settled)
|
|
114
|
+
throw new MachineCommandTransportError("invalid_lease", "Machine command lease is already settled.");
|
|
115
|
+
if (stream !== "stdout" && stream !== "stderr" && stream !== "system") {
|
|
116
|
+
throw new MachineCommandTransportError("invalid_output", "Machine command output stream is invalid.");
|
|
117
|
+
}
|
|
118
|
+
if (Buffer.byteLength(content) > MAX_OUTPUT_CHUNK_BYTES) {
|
|
119
|
+
throw new MachineCommandTransportError("invalid_output", "Machine command output chunk exceeds 64 KiB.");
|
|
120
|
+
}
|
|
121
|
+
const sequence = state.nextOutputSequence;
|
|
122
|
+
const { error } = await this.client.rpc("append_machine_output", {
|
|
123
|
+
p_command_id: state.commandId,
|
|
124
|
+
p_sequence_no: sequence,
|
|
125
|
+
p_stream: stream,
|
|
126
|
+
p_content: content,
|
|
127
|
+
p_runner_id: this.runnerId,
|
|
128
|
+
});
|
|
129
|
+
if (error)
|
|
130
|
+
throw rpcError("output", error);
|
|
131
|
+
state.nextOutputSequence = sequence + 1;
|
|
132
|
+
}
|
|
133
|
+
async status(lease) {
|
|
134
|
+
const state = this.requireLease(lease);
|
|
135
|
+
if (state.settled)
|
|
136
|
+
throw new MachineCommandTransportError("invalid_lease", "Machine command lease is already settled.");
|
|
137
|
+
const { data, error } = await this.client.rpc("machine_command_status_for_runner", {
|
|
138
|
+
p_command_id: state.commandId,
|
|
139
|
+
p_runner_id: this.runnerId,
|
|
140
|
+
});
|
|
141
|
+
if (error)
|
|
142
|
+
throw rpcError("status", error);
|
|
143
|
+
if (typeof data !== "string" || !STATUSES.has(data)) {
|
|
144
|
+
throw new MachineCommandTransportError("invalid_status", "Machine command status response is invalid.");
|
|
145
|
+
}
|
|
146
|
+
return data;
|
|
147
|
+
}
|
|
148
|
+
async complete(lease, status, exitCode) {
|
|
149
|
+
const state = this.requireLease(lease);
|
|
150
|
+
if (state.settled)
|
|
151
|
+
throw new MachineCommandTransportError("invalid_lease", "Machine command lease is already settled.");
|
|
152
|
+
const { error } = await this.client.rpc("complete_machine_command", {
|
|
153
|
+
p_command_id: state.commandId,
|
|
154
|
+
p_status: status,
|
|
155
|
+
p_exit_code: exitCode,
|
|
156
|
+
p_runner_id: this.runnerId,
|
|
157
|
+
});
|
|
158
|
+
if (error)
|
|
159
|
+
throw rpcError("completion", error);
|
|
160
|
+
state.settled = true;
|
|
161
|
+
}
|
|
162
|
+
requireLease(lease) {
|
|
163
|
+
const state = this.leases.get(lease);
|
|
164
|
+
if (!state || lease.command.command_id !== state.commandId || lease.command.session_id !== state.sessionId) {
|
|
165
|
+
throw new MachineCommandTransportError("invalid_lease", "Machine command lease does not belong to this transport.");
|
|
166
|
+
}
|
|
167
|
+
return state;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/machine-console/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PreviewControlPlane, PreviewEnvironmentLease } from "./types.js";
|
|
2
|
+
export declare class SupabasePreviewControlPlane implements PreviewControlPlane {
|
|
3
|
+
private readonly client;
|
|
4
|
+
constructor(url: string, serviceRoleKey: string);
|
|
5
|
+
listCandidates(limit: number): Promise<PreviewEnvironmentLease[]>;
|
|
6
|
+
recordObservation(input: Parameters<PreviewControlPlane["recordObservation"]>[0]): Promise<{
|
|
7
|
+
idempotent_replay?: boolean;
|
|
8
|
+
}>;
|
|
9
|
+
audit(verb: string, environmentId: string, payload: Record<string, unknown>): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=control-plane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../src/preview-environments/control-plane.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE/E,qBAAa,2BAA4B,YAAW,mBAAmB;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAEZ,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAQzC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAWjE,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;4BAYvC,OAAO;;IAGhD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CASlG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createClient } from "@supabase/supabase-js";
|
|
2
|
+
export class SupabasePreviewControlPlane {
|
|
3
|
+
client;
|
|
4
|
+
constructor(url, serviceRoleKey) {
|
|
5
|
+
if (!url || !serviceRoleKey)
|
|
6
|
+
throw new Error("preview_control_plane_credentials_missing");
|
|
7
|
+
this.client = createClient(url, serviceRoleKey, {
|
|
8
|
+
db: { schema: "acc" },
|
|
9
|
+
auth: { persistSession: false, autoRefreshToken: false },
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
async listCandidates(limit) {
|
|
13
|
+
const { data, error } = await this.client
|
|
14
|
+
.from("preview_environments")
|
|
15
|
+
.select("id,org_id,project_id,repo,pull_request_number,head_sha,provider,provider_credential_profile_ref,deployment_identity_sha,provider_deployment_id,desired_state,observed_state,generation,lease_expires_at,updated_at")
|
|
16
|
+
.neq("observed_state", "archived")
|
|
17
|
+
.order("updated_at", { ascending: true })
|
|
18
|
+
.limit(limit);
|
|
19
|
+
if (error)
|
|
20
|
+
throw new Error(`preview_candidate_read_failed:${error.code ?? "unknown"}`);
|
|
21
|
+
return (data ?? []);
|
|
22
|
+
}
|
|
23
|
+
async recordObservation(input) {
|
|
24
|
+
const { data, error } = await this.client.rpc("record_preview_environment_observation", {
|
|
25
|
+
p_environment_id: input.environmentId,
|
|
26
|
+
p_generation: input.generation,
|
|
27
|
+
p_observed_state: input.observedState,
|
|
28
|
+
p_provider_deployment_id: input.providerDeploymentId,
|
|
29
|
+
p_preview_url: input.previewUrl ?? null,
|
|
30
|
+
p_provider_receipt_sha: input.providerReceiptSha,
|
|
31
|
+
p_failure_code: input.failureCode ?? null,
|
|
32
|
+
p_idempotency_key: input.idempotencyKey,
|
|
33
|
+
});
|
|
34
|
+
if (error)
|
|
35
|
+
throw new Error(`preview_observation_failed:${error.code ?? "unknown"}`);
|
|
36
|
+
return (data ?? {});
|
|
37
|
+
}
|
|
38
|
+
async audit(verb, environmentId, payload) {
|
|
39
|
+
const { error } = await this.client.rpc("log_activity", {
|
|
40
|
+
p_verb: verb,
|
|
41
|
+
p_target_id: environmentId,
|
|
42
|
+
p_target_type: "preview_environment",
|
|
43
|
+
p_payload: payload,
|
|
44
|
+
});
|
|
45
|
+
if (error)
|
|
46
|
+
throw new Error(`preview_audit_failed:${error.code ?? "unknown"}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=control-plane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.js","sourceRoot":"","sources":["../../src/preview-environments/control-plane.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,OAAO,2BAA2B;IACrB,MAAM,CAAC;IAExB,YAAY,GAAW,EAAE,cAAsB;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1F,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE;YAC9C,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACrB,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE;SACzD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAa;QAChC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM;aACtC,IAAI,CAAC,sBAAsB,CAAC;aAC5B,MAAM,CAAC,oNAAoN,CAAC;aAC5N,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC;aACjC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;aACxC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,IAAI,EAAE,CAA8B,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAA8D;QACpF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,EAAE;YACtF,gBAAgB,EAAE,KAAK,CAAC,aAAa;YACrC,YAAY,EAAE,KAAK,CAAC,UAAU;YAC9B,gBAAgB,EAAE,KAAK,CAAC,aAAa;YACrC,wBAAwB,EAAE,KAAK,CAAC,oBAAoB;YACpD,aAAa,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;YACvC,sBAAsB,EAAE,KAAK,CAAC,kBAAkB;YAChD,cAAc,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACzC,iBAAiB,EAAE,KAAK,CAAC,cAAc;SACxC,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,IAAI,EAAE,CAAoC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,aAAqB,EAAE,OAAgC;QAC/E,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE;YACtD,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,aAAa;YAC1B,aAAa,EAAE,qBAAqB;YACpC,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;IAChF,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PreviewProviderAdapter, PreviewProviderRequest, PreviewProviderResult } from "./types.js";
|
|
2
|
+
export interface HttpPreviewProviderOptions {
|
|
3
|
+
endpoint: string;
|
|
4
|
+
token: string;
|
|
5
|
+
fetchImpl?: typeof fetch;
|
|
6
|
+
}
|
|
7
|
+
export declare class HttpPreviewProvider implements PreviewProviderAdapter {
|
|
8
|
+
private readonly options;
|
|
9
|
+
private readonly fetchImpl;
|
|
10
|
+
constructor(options: HttpPreviewProviderOptions);
|
|
11
|
+
execute(request: PreviewProviderRequest): Promise<PreviewProviderResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=http-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-provider.d.ts","sourceRoot":"","sources":["../../src/preview-environments/http-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AASD,qBAAa,mBAAoB,YAAW,sBAAsB;IAGpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAEZ,OAAO,EAAE,0BAA0B;IAQ1D,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAyC/E"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
function publicPreviewUrl(value) {
|
|
2
|
+
if (typeof value !== "string" || !value.startsWith("https://"))
|
|
3
|
+
return null;
|
|
4
|
+
const url = new URL(value);
|
|
5
|
+
if (url.username || url.password)
|
|
6
|
+
throw new Error("preview_provider_url_credentials_forbidden");
|
|
7
|
+
return url.toString();
|
|
8
|
+
}
|
|
9
|
+
export class HttpPreviewProvider {
|
|
10
|
+
options;
|
|
11
|
+
fetchImpl;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.options = options;
|
|
14
|
+
const endpoint = new URL(options.endpoint);
|
|
15
|
+
if (endpoint.protocol !== "https:" || endpoint.username || endpoint.password)
|
|
16
|
+
throw new Error("preview_provider_endpoint_invalid");
|
|
17
|
+
if (!options.token)
|
|
18
|
+
throw new Error("preview_provider_token_missing");
|
|
19
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
20
|
+
}
|
|
21
|
+
async execute(request) {
|
|
22
|
+
const response = await this.fetchImpl(this.options.endpoint, {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: {
|
|
25
|
+
authorization: `Bearer ${this.options.token}`,
|
|
26
|
+
"content-type": "application/json",
|
|
27
|
+
"idempotency-key": `${request.deploymentIdentity}:${request.generation}:${request.action}`,
|
|
28
|
+
},
|
|
29
|
+
signal: request.signal,
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
action: request.action,
|
|
32
|
+
environment_id: request.environmentId,
|
|
33
|
+
org_id: request.orgId,
|
|
34
|
+
project_id: request.projectId,
|
|
35
|
+
repo: request.repo,
|
|
36
|
+
pull_request_number: request.pullRequestNumber,
|
|
37
|
+
head_sha: request.headSha,
|
|
38
|
+
generation: request.generation,
|
|
39
|
+
deployment_identity_sha: request.deploymentIdentity,
|
|
40
|
+
provider_deployment_id: request.providerDeploymentId,
|
|
41
|
+
lease_expires_at: request.leaseExpiresAt,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok)
|
|
45
|
+
throw new Error(`preview_provider_http_${response.status}`);
|
|
46
|
+
const body = (await response.json());
|
|
47
|
+
const state = body.observed_state;
|
|
48
|
+
if (!['ready', 'failed', 'stopped', 'archived'].includes(String(state)))
|
|
49
|
+
throw new Error("preview_provider_response_invalid");
|
|
50
|
+
if (request.action === "stop" && !["stopped", "failed"].includes(String(state)))
|
|
51
|
+
throw new Error("preview_provider_stop_state_invalid");
|
|
52
|
+
if (["create", "refresh", "promote"].includes(request.action) && !["ready", "failed"].includes(String(state)))
|
|
53
|
+
throw new Error("preview_provider_active_state_invalid");
|
|
54
|
+
if (body.provider_deployment_id !== request.providerDeploymentId)
|
|
55
|
+
throw new Error("preview_provider_identity_mismatch");
|
|
56
|
+
return {
|
|
57
|
+
providerDeploymentId: request.providerDeploymentId,
|
|
58
|
+
observedState: state,
|
|
59
|
+
previewUrl: publicPreviewUrl(body.preview_url),
|
|
60
|
+
receipt: typeof body.receipt === "object" && body.receipt ? body.receipt : {},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=http-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-provider.js","sourceRoot":"","sources":["../../src/preview-environments/http-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PreviewProviderAdapter } from "./types.js";
|
|
2
|
+
export declare function configuredPreviewProfiles(env?: NodeJS.ProcessEnv): string[];
|
|
3
|
+
export declare function previewEnvironmentServiceEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
4
|
+
export declare function previewEnvironmentCaps(env?: NodeJS.ProcessEnv): Record<string, unknown>;
|
|
5
|
+
export declare function providerForProfile(provider: string, profile: string, env?: NodeJS.ProcessEnv, fetchImpl?: typeof fetch): PreviewProviderAdapter;
|
|
6
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/preview-environments/profiles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAOzD,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAMxF;AAED,wBAAgB,gCAAgC,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAM9F;AAED,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGpG;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,CAAC,EAAE,OAAO,KAAK,GACvB,sBAAsB,CASxB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { HttpPreviewProvider } from "./http-provider.js";
|
|
2
|
+
function envStem(profile) {
|
|
3
|
+
if (!/^[A-Za-z0-9_.-]{1,80}$/.test(profile))
|
|
4
|
+
throw new Error("preview_provider_profile_invalid");
|
|
5
|
+
return profile.toUpperCase().replace(/[^A-Z0-9]/g, "_");
|
|
6
|
+
}
|
|
7
|
+
export function configuredPreviewProfiles(env = process.env) {
|
|
8
|
+
return Object.keys(env)
|
|
9
|
+
.flatMap((key) => /^ACC_PREVIEW_PROVIDER_([A-Z0-9_]+)_ENDPOINT$/.exec(key)?.[1] ?? [])
|
|
10
|
+
.filter((stem) => Boolean(env[`ACC_PREVIEW_PROVIDER_${stem}_TOKEN`]))
|
|
11
|
+
.map((stem) => stem.toLowerCase())
|
|
12
|
+
.sort();
|
|
13
|
+
}
|
|
14
|
+
export function previewEnvironmentServiceEnabled(env = process.env) {
|
|
15
|
+
return (env.ACC_PREVIEW_ENVIRONMENT_SERVICE === "1" &&
|
|
16
|
+
Boolean(env.ACC_PREVIEW_CONTROL_PLANE_SERVICE_ROLE_KEY) &&
|
|
17
|
+
configuredPreviewProfiles(env).length > 0);
|
|
18
|
+
}
|
|
19
|
+
export function previewEnvironmentCaps(env = process.env) {
|
|
20
|
+
const profiles = configuredPreviewProfiles(env);
|
|
21
|
+
return profiles.length ? { preview_environments: true, preview_provider_profiles: profiles } : {};
|
|
22
|
+
}
|
|
23
|
+
export function providerForProfile(provider, profile, env = process.env, fetchImpl) {
|
|
24
|
+
const stem = envStem(profile);
|
|
25
|
+
const endpoint = env[`ACC_PREVIEW_PROVIDER_${stem}_ENDPOINT`];
|
|
26
|
+
const token = env[`ACC_PREVIEW_PROVIDER_${stem}_TOKEN`];
|
|
27
|
+
const configuredProvider = env[`ACC_PREVIEW_PROVIDER_${stem}_KIND`]?.toLowerCase();
|
|
28
|
+
if (!endpoint || !token)
|
|
29
|
+
throw new Error("preview_provider_profile_missing");
|
|
30
|
+
if (configuredProvider && configuredProvider !== provider.toLowerCase())
|
|
31
|
+
throw new Error("preview_provider_profile_kind_mismatch");
|
|
32
|
+
return new HttpPreviewProvider({ endpoint, token, fetchImpl });
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/preview-environments/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,SAAS,OAAO,CAAC,OAAe;IAC9B,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC5E,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,8CAA8C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACrF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,QAAQ,CAAC,CAAC,CAAC;SACpE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACjC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnF,OAAO,CACL,GAAG,CAAC,+BAA+B,KAAK,GAAG;QAC3C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC;QACvD,yBAAyB,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACzE,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,OAAe,EACf,MAAyB,OAAO,CAAC,GAAG,EACpC,SAAwB;IAExB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,wBAAwB,IAAI,WAAW,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,wBAAwB,IAAI,QAAQ,CAAC,CAAC;IACxD,MAAM,kBAAkB,GAAG,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACnF,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC7E,IAAI,kBAAkB,IAAI,kBAAkB,KAAK,QAAQ,CAAC,WAAW,EAAE;QACrE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,OAAO,IAAI,mBAAmB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PreviewAction, PreviewEnvironmentLease } from "./types.js";
|
|
2
|
+
export declare function safePreviewCode(error: unknown): string;
|
|
3
|
+
export declare function receiptSha(value: unknown): string;
|
|
4
|
+
export declare function deterministicUuid(...parts: Array<string | number>): string;
|
|
5
|
+
export declare function desiredAction(row: PreviewEnvironmentLease, now?: number, staleAfterMs?: number): PreviewAction | null;
|
|
6
|
+
export declare function validateLease(row: PreviewEnvironmentLease): void;
|
|
7
|
+
//# sourceMappingURL=safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/preview-environments/safety.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAKzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOtD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAG1E;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,uBAAuB,EAC5B,GAAG,SAAa,EAChB,YAAY,SAAU,GACrB,aAAa,GAAG,IAAI,CAatB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,uBAAuB,GAAG,IAAI,CAShE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { isCommitSha, isSha256Digest } from "../commit-sha.js";
|
|
3
|
+
const UUID_NAMESPACE = "acc-preview-environment-runner-v1";
|
|
4
|
+
export function safePreviewCode(error) {
|
|
5
|
+
const raw = error instanceof Error ? error.message : "unknown_error";
|
|
6
|
+
return raw
|
|
7
|
+
.replace(/https?:\/\/[^\s]+/gi, "[REDACTED_URL]")
|
|
8
|
+
.replace(/(authorization|password|token|secret|key)[=:]?[^\s]*/gi, "$1=[REDACTED]")
|
|
9
|
+
.replace(/[^a-zA-Z0-9_.:[\] -]/g, "_")
|
|
10
|
+
.slice(0, 180);
|
|
11
|
+
}
|
|
12
|
+
export function receiptSha(value) {
|
|
13
|
+
return createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
14
|
+
}
|
|
15
|
+
export function deterministicUuid(...parts) {
|
|
16
|
+
const hex = createHash("sha256").update([UUID_NAMESPACE, ...parts].join(":"), "utf8").digest("hex");
|
|
17
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;
|
|
18
|
+
}
|
|
19
|
+
export function desiredAction(row, now = Date.now(), staleAfterMs = 180_000) {
|
|
20
|
+
const staleProvision = row.observed_state === "provisioning" &&
|
|
21
|
+
Number.isFinite(Date.parse(row.updated_at)) &&
|
|
22
|
+
Date.parse(row.updated_at) + staleAfterMs <= now;
|
|
23
|
+
if (row.desired_state === "active" && ["pending", "failed", "stopped"].includes(row.observed_state))
|
|
24
|
+
return row.generation === 1 ? "create" : "refresh";
|
|
25
|
+
if (row.desired_state === "active" && staleProvision)
|
|
26
|
+
return row.generation === 1 ? "create" : "refresh";
|
|
27
|
+
if (row.desired_state === "promoted" && row.observed_state === "ready")
|
|
28
|
+
return "promote";
|
|
29
|
+
if (row.desired_state === "promoted" && staleProvision)
|
|
30
|
+
return "promote";
|
|
31
|
+
if (row.desired_state === "stopped" && !["stopped", "archived"].includes(row.observed_state))
|
|
32
|
+
return "stop";
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
export function validateLease(row) {
|
|
36
|
+
if (!isCommitSha(row.head_sha))
|
|
37
|
+
throw new Error("preview_commit_invalid");
|
|
38
|
+
if (!isSha256Digest(row.deployment_identity_sha))
|
|
39
|
+
throw new Error("preview_deployment_identity_invalid");
|
|
40
|
+
if (!/^[\w.-]+\/[\w.-]+$/.test(row.repo))
|
|
41
|
+
throw new Error("preview_repo_invalid");
|
|
42
|
+
if (!Number.isInteger(row.pull_request_number) || row.pull_request_number < 1)
|
|
43
|
+
throw new Error("preview_pull_request_invalid");
|
|
44
|
+
if (!Number.isInteger(row.generation) || row.generation < 1)
|
|
45
|
+
throw new Error("preview_generation_invalid");
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/preview-environments/safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { RunnerConfig } from "../config.js";
|
|
2
|
+
import type { PreviewControlPlane, PreviewEnvironmentLease, PreviewProviderAdapter } from "./types.js";
|
|
3
|
+
export interface PreviewEnvironmentLogger {
|
|
4
|
+
info(message: string): void;
|
|
5
|
+
error(message: string): void;
|
|
6
|
+
}
|
|
7
|
+
export interface PreviewEnvironmentServiceOptions {
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
pollMs?: number;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
batchSize?: number;
|
|
12
|
+
logger?: PreviewEnvironmentLogger;
|
|
13
|
+
controlPlane?: PreviewControlPlane;
|
|
14
|
+
providerFactory?: (provider: string, profile: string) => PreviewProviderAdapter;
|
|
15
|
+
}
|
|
16
|
+
export declare class PreviewEnvironmentService {
|
|
17
|
+
private readonly runnerId;
|
|
18
|
+
private readonly options;
|
|
19
|
+
private timer;
|
|
20
|
+
private active;
|
|
21
|
+
private stopping;
|
|
22
|
+
private readonly env;
|
|
23
|
+
private readonly logger;
|
|
24
|
+
private readonly pollMs;
|
|
25
|
+
private readonly timeoutMs;
|
|
26
|
+
private readonly staleAfterMs;
|
|
27
|
+
private readonly batchSize;
|
|
28
|
+
private readonly controlPlane;
|
|
29
|
+
constructor(cfg: RunnerConfig, runnerId: string, options?: PreviewEnvironmentServiceOptions);
|
|
30
|
+
start(): void;
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
pollOnce(): Promise<void>;
|
|
33
|
+
process(row: PreviewEnvironmentLease): Promise<"skipped" | "succeeded" | "failed">;
|
|
34
|
+
}
|
|
35
|
+
export { previewEnvironmentCaps, previewEnvironmentServiceEnabled } from "./profiles.js";
|
|
36
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/preview-environments/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,gCAAgC;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,sBAAsB,CAAC;CACjF;AAED,qBAAa,yBAAyB;IAclC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAGjD,GAAG,EAAE,YAAY,EACA,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gCAAqC;IAcjE,KAAK,IAAI,IAAI;IAQP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBzB,OAAO,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;CAkFzF;AAMD,OAAO,EAAE,sBAAsB,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC"}
|