@osva-ai/cli 1.1.0 → 1.1.2
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/LICENSE +202 -0
- package/README.md +36 -0
- package/dist/bin/osva.js +26 -0
- package/dist/bin/osva.js.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/doctor/redact.d.ts.map +1 -1
- package/dist/doctor/redact.js +3 -1
- package/dist/doctor/redact.js.map +1 -1
- package/dist/doctor/run-doctor.d.ts +2 -1
- package/dist/doctor/run-doctor.d.ts.map +1 -1
- package/dist/doctor/run-doctor.js +1 -1
- package/dist/doctor/run-doctor.js.map +1 -1
- package/dist/doctor/streaming-redact.d.ts +11 -0
- package/dist/doctor/streaming-redact.d.ts.map +1 -0
- package/dist/doctor/streaming-redact.js +29 -0
- package/dist/doctor/streaming-redact.js.map +1 -0
- package/dist/platform/compose-inspect.d.ts +9 -0
- package/dist/platform/compose-inspect.d.ts.map +1 -0
- package/dist/platform/compose-inspect.js +114 -0
- package/dist/platform/compose-inspect.js.map +1 -0
- package/dist/platform/doctor.d.ts +10 -0
- package/dist/platform/doctor.d.ts.map +1 -0
- package/dist/platform/doctor.js +154 -0
- package/dist/platform/doctor.js.map +1 -0
- package/dist/platform/format.d.ts +10 -0
- package/dist/platform/format.d.ts.map +1 -0
- package/dist/platform/format.js +73 -0
- package/dist/platform/format.js.map +1 -0
- package/dist/platform/index.d.ts +9 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +143 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/lifecycle.d.ts +20 -0
- package/dist/platform/lifecycle.d.ts.map +1 -0
- package/dist/platform/lifecycle.js +136 -0
- package/dist/platform/lifecycle.js.map +1 -0
- package/dist/platform/logs.d.ts +12 -0
- package/dist/platform/logs.d.ts.map +1 -0
- package/dist/platform/logs.js +81 -0
- package/dist/platform/logs.js.map +1 -0
- package/dist/platform/readiness.d.ts +9 -0
- package/dist/platform/readiness.d.ts.map +1 -0
- package/dist/platform/readiness.js +58 -0
- package/dist/platform/readiness.js.map +1 -0
- package/dist/platform/resolve-installation.d.ts +5 -0
- package/dist/platform/resolve-installation.d.ts.map +1 -0
- package/dist/platform/resolve-installation.js +115 -0
- package/dist/platform/resolve-installation.js.map +1 -0
- package/dist/platform/services.d.ts +7 -0
- package/dist/platform/services.d.ts.map +1 -0
- package/dist/platform/services.js +21 -0
- package/dist/platform/services.js.map +1 -0
- package/dist/platform/status.d.ts +7 -0
- package/dist/platform/status.d.ts.map +1 -0
- package/dist/platform/status.js +60 -0
- package/dist/platform/status.js.map +1 -0
- package/dist/platform/types.d.ts +37 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +8 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/platform/upgrade/backup-policy.d.ts +4 -0
- package/dist/platform/upgrade/backup-policy.d.ts.map +1 -0
- package/dist/platform/upgrade/backup-policy.js +20 -0
- package/dist/platform/upgrade/backup-policy.js.map +1 -0
- package/dist/platform/upgrade/catalog.d.ts +26 -0
- package/dist/platform/upgrade/catalog.d.ts.map +1 -0
- package/dist/platform/upgrade/catalog.js +56 -0
- package/dist/platform/upgrade/catalog.js.map +1 -0
- package/dist/platform/upgrade/options.d.ts +8 -0
- package/dist/platform/upgrade/options.d.ts.map +1 -0
- package/dist/platform/upgrade/options.js +17 -0
- package/dist/platform/upgrade/options.js.map +1 -0
- package/dist/platform/upgrade/preflight.d.ts +25 -0
- package/dist/platform/upgrade/preflight.d.ts.map +1 -0
- package/dist/platform/upgrade/preflight.js +91 -0
- package/dist/platform/upgrade/preflight.js.map +1 -0
- package/dist/platform/upgrade/run-upgrade.d.ts +22 -0
- package/dist/platform/upgrade/run-upgrade.d.ts.map +1 -0
- package/dist/platform/upgrade/run-upgrade.js +253 -0
- package/dist/platform/upgrade/run-upgrade.js.map +1 -0
- package/dist/platform/upgrade/state.d.ts +31 -0
- package/dist/platform/upgrade/state.d.ts.map +1 -0
- package/dist/platform/upgrade/state.js +129 -0
- package/dist/platform/upgrade/state.js.map +1 -0
- package/dist/platform/upgrade/version.d.ts +11 -0
- package/dist/platform/upgrade/version.d.ts.map +1 -0
- package/dist/platform/upgrade/version.js +70 -0
- package/dist/platform/upgrade/version.js.map +1 -0
- package/dist/platform/upgrade-guard.d.ts +2 -0
- package/dist/platform/upgrade-guard.d.ts.map +1 -0
- package/dist/platform/upgrade-guard.js +12 -0
- package/dist/platform/upgrade-guard.js.map +1 -0
- package/dist/setup/acceptance-install.d.ts +15 -0
- package/dist/setup/acceptance-install.d.ts.map +1 -0
- package/dist/setup/acceptance-install.js +44 -0
- package/dist/setup/acceptance-install.js.map +1 -0
- package/dist/setup/atomic-write.d.ts +4 -0
- package/dist/setup/atomic-write.d.ts.map +1 -0
- package/dist/setup/atomic-write.js +19 -0
- package/dist/setup/atomic-write.js.map +1 -0
- package/dist/setup/bootstrap-capture.d.ts +9 -0
- package/dist/setup/bootstrap-capture.d.ts.map +1 -0
- package/dist/setup/bootstrap-capture.js +64 -0
- package/dist/setup/bootstrap-capture.js.map +1 -0
- package/dist/setup/compose-exec.d.ts +21 -0
- package/dist/setup/compose-exec.d.ts.map +1 -0
- package/dist/setup/compose-exec.js +55 -0
- package/dist/setup/compose-exec.js.map +1 -0
- package/dist/setup/compose-project.d.ts +3 -0
- package/dist/setup/compose-project.d.ts.map +1 -0
- package/dist/setup/compose-project.js +12 -0
- package/dist/setup/compose-project.js.map +1 -0
- package/dist/setup/compose-template-root.d.ts +3 -0
- package/dist/setup/compose-template-root.d.ts.map +1 -0
- package/dist/setup/compose-template-root.js +8 -0
- package/dist/setup/compose-template-root.js.map +1 -0
- package/dist/setup/distribution.d.ts +13 -0
- package/dist/setup/distribution.d.ts.map +1 -0
- package/dist/setup/distribution.js +55 -0
- package/dist/setup/distribution.js.map +1 -0
- package/dist/setup/env-file.d.ts +23 -0
- package/dist/setup/env-file.d.ts.map +1 -0
- package/dist/setup/env-file.js +141 -0
- package/dist/setup/env-file.js.map +1 -0
- package/dist/setup/format.d.ts +4 -0
- package/dist/setup/format.d.ts.map +1 -0
- package/dist/setup/format.js +58 -0
- package/dist/setup/format.js.map +1 -0
- package/dist/setup/index.d.ts +17 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +45 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/install-path.d.ts +3 -0
- package/dist/setup/install-path.d.ts.map +1 -0
- package/dist/setup/install-path.js +26 -0
- package/dist/setup/install-path.js.map +1 -0
- package/dist/setup/installation-state.d.ts +29 -0
- package/dist/setup/installation-state.d.ts.map +1 -0
- package/dist/setup/installation-state.js +83 -0
- package/dist/setup/installation-state.js.map +1 -0
- package/dist/setup/installation-status.d.ts +14 -0
- package/dist/setup/installation-status.d.ts.map +1 -0
- package/dist/setup/installation-status.js +36 -0
- package/dist/setup/installation-status.js.map +1 -0
- package/dist/setup/materialize-install.d.ts +24 -0
- package/dist/setup/materialize-install.d.ts.map +1 -0
- package/dist/setup/materialize-install.js +108 -0
- package/dist/setup/materialize-install.js.map +1 -0
- package/dist/setup/probe-spawn.d.ts +16 -0
- package/dist/setup/probe-spawn.d.ts.map +1 -0
- package/dist/setup/probe-spawn.js +87 -0
- package/dist/setup/probe-spawn.js.map +1 -0
- package/dist/setup/read-options.d.ts +15 -0
- package/dist/setup/read-options.d.ts.map +1 -0
- package/dist/setup/read-options.js +69 -0
- package/dist/setup/read-options.js.map +1 -0
- package/dist/setup/run-onboarding.d.ts +22 -0
- package/dist/setup/run-onboarding.d.ts.map +1 -0
- package/dist/setup/run-onboarding.js +273 -0
- package/dist/setup/run-onboarding.js.map +1 -0
- package/dist/setup/run-provision.d.ts +17 -0
- package/dist/setup/run-provision.d.ts.map +1 -0
- package/dist/setup/run-provision.js +224 -0
- package/dist/setup/run-provision.js.map +1 -0
- package/dist/setup/run-setup.d.ts +26 -0
- package/dist/setup/run-setup.d.ts.map +1 -0
- package/dist/setup/run-setup.js +227 -0
- package/dist/setup/run-setup.js.map +1 -0
- package/dist/setup/secrets.d.ts +2 -0
- package/dist/setup/secrets.d.ts.map +1 -0
- package/dist/setup/secrets.js +8 -0
- package/dist/setup/secrets.js.map +1 -0
- package/dist/setup/setup-report.d.ts +19 -0
- package/dist/setup/setup-report.d.ts.map +1 -0
- package/dist/setup/setup-report.js +35 -0
- package/dist/setup/setup-report.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -15
- package/templates/agent-typescript/.gitignore +4 -0
- package/templates/compose-install/compose.yml +307 -0
- package/templates/compose-install/distribution.json +5 -0
- package/templates/compose-install/upgrade-catalog.json +39 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const UPGRADE_STATE_RELATIVE: string;
|
|
2
|
+
export declare const UPGRADE_LOCK_RELATIVE: string;
|
|
3
|
+
export type UpgradePhase = "locked" | "pulling_image" | "prepared_configuration" | "stopped_applications" | "migrating" | "migration_failed" | "starting_applications" | "validating_readiness" | "completed" | "failed";
|
|
4
|
+
export interface UpgradeState {
|
|
5
|
+
readonly schemaVersion: 1;
|
|
6
|
+
readonly phase: UpgradePhase;
|
|
7
|
+
readonly fromPlatformVersion: string;
|
|
8
|
+
readonly toPlatformVersion: string;
|
|
9
|
+
readonly fromImageRef: string;
|
|
10
|
+
readonly targetImageRef: string;
|
|
11
|
+
readonly startedAt: string;
|
|
12
|
+
readonly updatedAt: string;
|
|
13
|
+
readonly lastError?: string;
|
|
14
|
+
readonly migrationRequired: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface UpgradeLock {
|
|
17
|
+
readonly schemaVersion: 1;
|
|
18
|
+
readonly pid: number;
|
|
19
|
+
readonly startedAt: string;
|
|
20
|
+
readonly hostname: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function readUpgradeState(installDir: string): Promise<UpgradeState | undefined>;
|
|
23
|
+
export declare function writeUpgradeState(installDir: string, state: UpgradeState): Promise<void>;
|
|
24
|
+
export declare function clearUpgradeState(installDir: string): Promise<void>;
|
|
25
|
+
export declare function isUpgradeInProgress(state: UpgradeState | undefined): boolean;
|
|
26
|
+
export declare function isIncompleteUpgrade(state: UpgradeState | undefined): boolean;
|
|
27
|
+
export declare function recoveryGuidance(state: UpgradeState): string;
|
|
28
|
+
export declare function acquireUpgradeLock(installDir: string): Promise<void>;
|
|
29
|
+
export declare function releaseUpgradeLock(installDir: string): Promise<void>;
|
|
30
|
+
export declare function upgradeStateExists(installDir: string): Promise<boolean>;
|
|
31
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/platform/upgrade/state.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB,QAA2C,CAAC;AAC/E,eAAO,MAAM,qBAAqB,QAAqC,CAAC;AAExE,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,eAAe,GACf,wBAAwB,GACxB,sBAAsB,GACtB,WAAW,GACX,kBAAkB,GAClB,uBAAuB,GACvB,sBAAsB,GACtB,WAAW,GACX,QAAQ,CAAC;AAEb,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAYnC;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAS5E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAS5E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAoB5D;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB1E;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1E;AA2BD,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import { readFile, stat, unlink } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { writeFileAtomic } from "../../setup/atomic-write.js";
|
|
5
|
+
export const UPGRADE_STATE_RELATIVE = path.join(".osva", "upgrade-state.json");
|
|
6
|
+
export const UPGRADE_LOCK_RELATIVE = path.join(".osva", "upgrade.lock");
|
|
7
|
+
export async function readUpgradeState(installDir) {
|
|
8
|
+
const statePath = path.join(installDir, UPGRADE_STATE_RELATIVE);
|
|
9
|
+
try {
|
|
10
|
+
const raw = await readFile(statePath, "utf8");
|
|
11
|
+
const parsed = JSON.parse(raw);
|
|
12
|
+
if (parsed.schemaVersion !== 1) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function writeUpgradeState(installDir, state) {
|
|
22
|
+
const statePath = path.join(installDir, UPGRADE_STATE_RELATIVE);
|
|
23
|
+
await writeFileAtomic(statePath, `${JSON.stringify(state, null, 2)}\n`, {
|
|
24
|
+
restrictPermissions: true,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function clearUpgradeState(installDir) {
|
|
28
|
+
const statePath = path.join(installDir, UPGRADE_STATE_RELATIVE);
|
|
29
|
+
try {
|
|
30
|
+
await unlink(statePath);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// ignore missing
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function isUpgradeInProgress(state) {
|
|
37
|
+
if (state === undefined) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return (state.phase !== "completed" &&
|
|
41
|
+
state.phase !== "failed" &&
|
|
42
|
+
state.phase !== "migration_failed");
|
|
43
|
+
}
|
|
44
|
+
export function isIncompleteUpgrade(state) {
|
|
45
|
+
if (state === undefined) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return (state.phase === "failed" ||
|
|
49
|
+
state.phase === "migration_failed" ||
|
|
50
|
+
isUpgradeInProgress(state));
|
|
51
|
+
}
|
|
52
|
+
export function recoveryGuidance(state) {
|
|
53
|
+
switch (state.phase) {
|
|
54
|
+
case "migration_failed":
|
|
55
|
+
case "failed":
|
|
56
|
+
return [
|
|
57
|
+
"An upgrade did not finish successfully.",
|
|
58
|
+
"Database schema may be ahead of the running image — do not downgrade the application image without operator review.",
|
|
59
|
+
"Inspect `osva platform status`, PostgreSQL logs, and docs/operations/UPGRADE.md.",
|
|
60
|
+
state.lastError === undefined ? "" : `Last error: ${state.lastError}`,
|
|
61
|
+
]
|
|
62
|
+
.filter((line) => line.length > 0)
|
|
63
|
+
.join("\n");
|
|
64
|
+
case "stopped_applications":
|
|
65
|
+
case "migrating":
|
|
66
|
+
case "starting_applications":
|
|
67
|
+
case "validating_readiness":
|
|
68
|
+
return "Upgrade was interrupted mid-flight. Re-run `osva platform upgrade` with the same --to version after resolving Docker health, or follow docs/operations/UPGRADE.md for manual recovery.";
|
|
69
|
+
default:
|
|
70
|
+
return "See docs/operations/UPGRADE.md for incomplete upgrade recovery.";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function acquireUpgradeLock(installDir) {
|
|
74
|
+
const lockPath = path.join(installDir, UPGRADE_LOCK_RELATIVE);
|
|
75
|
+
const existing = await readUpgradeLock(installDir);
|
|
76
|
+
if (existing !== undefined && isProcessAlive(existing.pid)) {
|
|
77
|
+
throw new Error(`Another upgrade appears in progress (pid ${String(existing.pid)} since ${existing.startedAt}).`);
|
|
78
|
+
}
|
|
79
|
+
const lock = {
|
|
80
|
+
schemaVersion: 1,
|
|
81
|
+
pid: process.pid,
|
|
82
|
+
startedAt: new Date().toISOString(),
|
|
83
|
+
hostname: osHostname(),
|
|
84
|
+
};
|
|
85
|
+
await writeFileAtomic(lockPath, `${JSON.stringify(lock, null, 2)}\n`, {
|
|
86
|
+
restrictPermissions: true,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export async function releaseUpgradeLock(installDir) {
|
|
90
|
+
const lockPath = path.join(installDir, UPGRADE_LOCK_RELATIVE);
|
|
91
|
+
try {
|
|
92
|
+
await unlink(lockPath);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// ignore
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function readUpgradeLock(installDir) {
|
|
99
|
+
const lockPath = path.join(installDir, UPGRADE_LOCK_RELATIVE);
|
|
100
|
+
try {
|
|
101
|
+
const raw = await readFile(lockPath, "utf8");
|
|
102
|
+
return JSON.parse(raw);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function isProcessAlive(pid) {
|
|
109
|
+
try {
|
|
110
|
+
process.kill(pid, 0);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function osHostname() {
|
|
118
|
+
return os.hostname();
|
|
119
|
+
}
|
|
120
|
+
export async function upgradeStateExists(installDir) {
|
|
121
|
+
try {
|
|
122
|
+
await stat(path.join(installDir, UPGRADE_STATE_RELATIVE));
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/platform/upgrade/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAkCxE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QAC/C,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,KAAmB;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;IAChE,MAAM,eAAe,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACtE,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,KAAK,CAAC,KAAK,KAAK,WAAW;QAC3B,KAAK,CAAC,KAAK,KAAK,QAAQ;QACxB,KAAK,CAAC,KAAK,KAAK,kBAAkB,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,KAAK,CAAC,KAAK,KAAK,QAAQ;QACxB,KAAK,CAAC,KAAK,KAAK,kBAAkB;QAClC,mBAAmB,CAAC,KAAK,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,kBAAkB,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO;gBACL,yCAAyC;gBACzC,qHAAqH;gBACrH,kFAAkF;gBAClF,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,SAAS,EAAE;aACtE;iBACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;iBACjC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,KAAK,sBAAsB,CAAC;QAC5B,KAAK,WAAW,CAAC;QACjB,KAAK,uBAAuB,CAAC;QAC7B,KAAK,sBAAsB;YACzB,OAAO,wLAAwL,CAAC;QAClM;YACE,OAAO,iEAAiE,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,4CAA4C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,SAAS,IAAI,CACjG,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAgB;QACxB,aAAa,EAAE,CAAC;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,UAAU,EAAE;KACvB,CAAC;IACF,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpE,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IACzD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ParsedPlatformVersion {
|
|
2
|
+
readonly major: number;
|
|
3
|
+
readonly minor: number;
|
|
4
|
+
readonly patch: number;
|
|
5
|
+
readonly prerelease: readonly string[];
|
|
6
|
+
readonly raw: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function parsePlatformVersion(raw: string): ParsedPlatformVersion;
|
|
9
|
+
/** Semantic ordering for OSVA platform versions (not lexical string compare). */
|
|
10
|
+
export declare function comparePlatformVersions(left: string, right: string): -1 | 0 | 1;
|
|
11
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/platform/upgrade/version.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAevE;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAoDZ"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function parsePlatformVersion(raw) {
|
|
2
|
+
const trimmed = raw.trim();
|
|
3
|
+
const match = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(trimmed);
|
|
4
|
+
if (match === null) {
|
|
5
|
+
throw new Error(`Invalid platform version '${raw}'.`);
|
|
6
|
+
}
|
|
7
|
+
const major = Number(match[1]);
|
|
8
|
+
const minor = Number(match[2]);
|
|
9
|
+
const patch = Number(match[3]);
|
|
10
|
+
const prereleaseRaw = match[4];
|
|
11
|
+
const prerelease = prereleaseRaw === undefined || prereleaseRaw.length === 0
|
|
12
|
+
? []
|
|
13
|
+
: prereleaseRaw.split(".");
|
|
14
|
+
return { major, minor, patch, prerelease, raw: trimmed };
|
|
15
|
+
}
|
|
16
|
+
/** Semantic ordering for OSVA platform versions (not lexical string compare). */
|
|
17
|
+
export function comparePlatformVersions(left, right) {
|
|
18
|
+
const a = parsePlatformVersion(left);
|
|
19
|
+
const b = parsePlatformVersion(right);
|
|
20
|
+
if (a.major !== b.major) {
|
|
21
|
+
return a.major < b.major ? -1 : 1;
|
|
22
|
+
}
|
|
23
|
+
if (a.minor !== b.minor) {
|
|
24
|
+
return a.minor < b.minor ? -1 : 1;
|
|
25
|
+
}
|
|
26
|
+
if (a.patch !== b.patch) {
|
|
27
|
+
return a.patch < b.patch ? -1 : 1;
|
|
28
|
+
}
|
|
29
|
+
const aPre = a.prerelease.length > 0;
|
|
30
|
+
const bPre = b.prerelease.length > 0;
|
|
31
|
+
if (!aPre && !bPre) {
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
if (!aPre && bPre) {
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
if (aPre && !bPre) {
|
|
38
|
+
return -1;
|
|
39
|
+
}
|
|
40
|
+
const len = Math.max(a.prerelease.length, b.prerelease.length);
|
|
41
|
+
for (let index = 0; index < len; index += 1) {
|
|
42
|
+
const aPart = a.prerelease[index];
|
|
43
|
+
const bPart = b.prerelease[index];
|
|
44
|
+
if (aPart === undefined) {
|
|
45
|
+
return -1;
|
|
46
|
+
}
|
|
47
|
+
if (bPart === undefined) {
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
const aNum = /^\d+$/.test(aPart) ? Number(aPart) : undefined;
|
|
51
|
+
const bNum = /^\d+$/.test(bPart) ? Number(bPart) : undefined;
|
|
52
|
+
if (aNum !== undefined && bNum !== undefined) {
|
|
53
|
+
if (aNum !== bNum) {
|
|
54
|
+
return aNum < bNum ? -1 : 1;
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (aNum !== undefined) {
|
|
59
|
+
return -1;
|
|
60
|
+
}
|
|
61
|
+
if (bNum !== undefined) {
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
if (aPart !== bPart) {
|
|
65
|
+
return aPart < bPart ? -1 : 1;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/platform/upgrade/version.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-guard.d.ts","sourceRoot":"","sources":["../../src/platform/upgrade-guard.ts"],"names":[],"mappings":"AAQA,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isIncompleteUpgrade, isUpgradeInProgress, readUpgradeState, recoveryGuidance, } from "./upgrade/state.js";
|
|
2
|
+
import { PlatformCommandError } from "./types.js";
|
|
3
|
+
export async function assertPlatformLifecycleAllowed(installDir, action) {
|
|
4
|
+
const state = await readUpgradeState(installDir);
|
|
5
|
+
if (isUpgradeInProgress(state)) {
|
|
6
|
+
throw new PlatformCommandError("installation_invalid", `Cannot ${action} while platform upgrade is in progress (phase ${state.phase}).`);
|
|
7
|
+
}
|
|
8
|
+
if (isIncompleteUpgrade(state) && state.phase !== "migration_failed") {
|
|
9
|
+
throw new PlatformCommandError("installation_invalid", `Cannot ${action} until the incomplete upgrade is resolved.\n${recoveryGuidance(state)}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=upgrade-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-guard.js","sourceRoot":"","sources":["../../src/platform/upgrade-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,UAAkB,EAClB,MAAc;IAEd,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,oBAAoB,CAC5B,sBAAsB,EACtB,UAAU,MAAM,iDAAiD,KAAM,CAAC,KAAK,IAAI,CAClF,CAAC;IACJ,CAAC;IACD,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,KAAM,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;QACtE,MAAM,IAAI,oBAAoB,CAC5B,sBAAsB,EACtB,UAAU,MAAM,+CAA+C,gBAAgB,CAAC,KAAM,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function acceptanceInstallEnabled(env?: NodeJS.ProcessEnv): boolean;
|
|
2
|
+
export declare function resolveSetupImageRef(input: {
|
|
3
|
+
readonly distributionImageRef: string;
|
|
4
|
+
readonly processEnv: NodeJS.ProcessEnv;
|
|
5
|
+
}): string;
|
|
6
|
+
export declare function writeAcceptanceSetupTokenFile(input: {
|
|
7
|
+
readonly processEnv: NodeJS.ProcessEnv;
|
|
8
|
+
readonly token: string;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
export declare function writeAcceptanceBootstrapKeyFile(input: {
|
|
11
|
+
readonly processEnv: NodeJS.ProcessEnv;
|
|
12
|
+
readonly apiKey: string;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function wipeAcceptanceBootstrapKeyFile(env?: NodeJS.ProcessEnv): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=acceptance-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acceptance-install.d.ts","sourceRoot":"","sources":["../../src/setup/acceptance-install.ts"],"names":[],"mappings":"AAIA,wBAAgB,wBAAwB,CACtC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAET;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CACxC,GAAG,MAAM,CAMT;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhB;AAED,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhB;AAED,wBAAsB,8BAA8B,CAClD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { writeFileAtomic } from "./atomic-write.js";
|
|
3
|
+
export function acceptanceInstallEnabled(env = process.env) {
|
|
4
|
+
return env.OSVA_ACCEPTANCE_INSTALL?.trim() === "1";
|
|
5
|
+
}
|
|
6
|
+
export function resolveSetupImageRef(input) {
|
|
7
|
+
const override = input.processEnv.OSVA_SETUP_LOCAL_IMAGE?.trim();
|
|
8
|
+
if (override !== undefined && override.length > 0) {
|
|
9
|
+
return override;
|
|
10
|
+
}
|
|
11
|
+
return input.distributionImageRef;
|
|
12
|
+
}
|
|
13
|
+
export async function writeAcceptanceSetupTokenFile(input) {
|
|
14
|
+
if (!acceptanceInstallEnabled(input.processEnv)) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const targetPath = input.processEnv.OSVA_SETUP_SETUP_TOKEN_FILE?.trim();
|
|
18
|
+
if (targetPath === undefined || targetPath.length === 0) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
await writeFileAtomic(targetPath, `${input.token}\n`, {
|
|
22
|
+
restrictPermissions: true,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export async function writeAcceptanceBootstrapKeyFile(input) {
|
|
26
|
+
if (!acceptanceInstallEnabled(input.processEnv)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const targetPath = input.processEnv.OSVA_SETUP_BOOTSTRAP_KEY_FILE?.trim();
|
|
30
|
+
if (targetPath === undefined || targetPath.length === 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
await writeFileAtomic(targetPath, `${input.apiKey}\n`, {
|
|
34
|
+
restrictPermissions: true,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function wipeAcceptanceBootstrapKeyFile(env = process.env) {
|
|
38
|
+
const targetPath = env.OSVA_SETUP_BOOTSTRAP_KEY_FILE?.trim();
|
|
39
|
+
if (targetPath === undefined || targetPath.length === 0) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await writeFile(targetPath, "", { encoding: "utf8", mode: 0o600 });
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=acceptance-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acceptance-install.js","sourceRoot":"","sources":["../../src/setup/acceptance-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,UAAU,wBAAwB,CACtC,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAGpC;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IACjE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,oBAAoB,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,KAGnD;IACC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC;IACxE,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO;IACT,CAAC;IACD,MAAM,eAAe,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE;QACpD,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,KAGrD;IACC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,6BAA6B,EAAE,IAAI,EAAE,CAAC;IAC1E,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO;IACT,CAAC;IACD,MAAM,eAAe,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE;QACrD,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,UAAU,GAAG,GAAG,CAAC,6BAA6B,EAAE,IAAI,EAAE,CAAC;IAC7D,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO;IACT,CAAC;IACD,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/setup/atomic-write.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,GACnD,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { chmod, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function writeFileAtomic(targetPath, contents, options) {
|
|
4
|
+
const directory = path.dirname(targetPath);
|
|
5
|
+
const baseName = path.basename(targetPath);
|
|
6
|
+
const tempPath = path.join(directory, `.${baseName}.${String(process.pid)}.tmp`);
|
|
7
|
+
await writeFile(tempPath, contents, { encoding: "utf8", flag: "wx" }).catch(async (error) => {
|
|
8
|
+
if (error.code === "EEXIST") {
|
|
9
|
+
await writeFile(tempPath, contents, { encoding: "utf8" });
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
throw error;
|
|
13
|
+
});
|
|
14
|
+
await rename(tempPath, targetPath);
|
|
15
|
+
if (options?.restrictPermissions === true && process.platform !== "win32") {
|
|
16
|
+
await chmod(targetPath, 0o600);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=atomic-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/setup/atomic-write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,QAAgB,EAChB,OAAoD;IAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,SAAS,EACT,IAAI,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAC1C,CAAC;IACF,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CACzE,KAAK,EAAE,KAA4B,EAAE,EAAE;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CACF,CAAC;IACF,MAAM,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnC,IAAI,OAAO,EAAE,mBAAmB,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1E,MAAM,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function parseBootstrapApiKey(stdout: string): string | undefined;
|
|
2
|
+
export declare function parseWorkspaceBootstrapOutput(stdout: string): {
|
|
3
|
+
readonly workspaceId?: string;
|
|
4
|
+
readonly alreadyCompleted: boolean;
|
|
5
|
+
readonly apiKey?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function parseIdentityBootstrapSetupToken(stdout: string): string | undefined;
|
|
8
|
+
export declare function redactBootstrapSubprocessOutput(text: string): string;
|
|
9
|
+
//# sourceMappingURL=bootstrap-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-capture.d.ts","sourceRoot":"","sources":["../../src/setup/bootstrap-capture.ts"],"names":[],"mappings":"AAUA,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGvE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAWA;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAkBpB;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAapE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { redactSecrets } from "../doctor/redact.js";
|
|
2
|
+
const WORKSPACE_ID_PATTERN = /Workspace ID:\s*([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i;
|
|
3
|
+
const BOOTSTRAP_API_KEY_PATTERN = /(osva_ak_[0-9A-Za-z_-]+\.[0-9A-Za-z_-]+)/;
|
|
4
|
+
const SETUP_TOKEN_MARKER = "One-time password setup token (single use; do not log or share):";
|
|
5
|
+
export function parseBootstrapApiKey(stdout) {
|
|
6
|
+
const match = stdout.match(BOOTSTRAP_API_KEY_PATTERN);
|
|
7
|
+
return match?.[1];
|
|
8
|
+
}
|
|
9
|
+
export function parseWorkspaceBootstrapOutput(stdout) {
|
|
10
|
+
const alreadyCompleted = stdout.includes("Installation bootstrap has already completed");
|
|
11
|
+
const match = stdout.match(WORKSPACE_ID_PATTERN);
|
|
12
|
+
const apiKey = parseBootstrapApiKey(stdout);
|
|
13
|
+
return {
|
|
14
|
+
...(match?.[1] === undefined ? {} : { workspaceId: match[1] }),
|
|
15
|
+
...(apiKey === undefined ? {} : { apiKey }),
|
|
16
|
+
alreadyCompleted,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function parseIdentityBootstrapSetupToken(stdout) {
|
|
20
|
+
const lines = stdout.split(/\r?\n/);
|
|
21
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
22
|
+
if (lines[index]?.trim() !== SETUP_TOKEN_MARKER) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
for (let next = index + 1; next < lines.length; next += 1) {
|
|
26
|
+
const candidate = lines[next]?.trim() ?? "";
|
|
27
|
+
if (candidate.length === 0) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (candidate.startsWith("Complete setup:")) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return candidate;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
export function redactBootstrapSubprocessOutput(text) {
|
|
39
|
+
let redacted = redactSecrets(text);
|
|
40
|
+
redacted = redactLineAfterMarker(redacted, SETUP_TOKEN_MARKER, "[setup-token-redacted]");
|
|
41
|
+
redacted = redactLineAfterMarker(redacted, "Copy the API key below now. It cannot be retrieved again:", "osva_ak_***");
|
|
42
|
+
return redacted;
|
|
43
|
+
}
|
|
44
|
+
function redactLineAfterMarker(text, marker, replacement) {
|
|
45
|
+
const lines = text.split(/\r?\n/);
|
|
46
|
+
const output = [];
|
|
47
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
48
|
+
output.push(lines[index] ?? "");
|
|
49
|
+
if (lines[index]?.trim() === marker) {
|
|
50
|
+
for (let next = index + 1; next < lines.length; next += 1) {
|
|
51
|
+
const candidate = lines[next]?.trim() ?? "";
|
|
52
|
+
if (candidate.length === 0) {
|
|
53
|
+
output.push(lines[next] ?? "");
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
output.push(replacement);
|
|
57
|
+
index = next;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return output.join("\n");
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=bootstrap-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-capture.js","sourceRoot":"","sources":["../../src/setup/bootstrap-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ProbeSpawnFn, type ProbeSpawnResult } from "./probe-spawn.js";
|
|
2
|
+
export interface ComposeExecContext {
|
|
3
|
+
readonly installDir: string;
|
|
4
|
+
readonly envFilePath: string;
|
|
5
|
+
readonly projectName: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ComposeExecOptions {
|
|
8
|
+
readonly spawn?: ProbeSpawnFn;
|
|
9
|
+
readonly timeoutMs: number;
|
|
10
|
+
readonly processEnv?: NodeJS.ProcessEnv;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildComposeSpawnEnv(ctx: ComposeExecContext, processEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
13
|
+
export declare function composeBaseArgs(ctx: ComposeExecContext): string[];
|
|
14
|
+
export declare function runComposeCommand(ctx: ComposeExecContext, args: readonly string[], options: ComposeExecOptions): ProbeSpawnResult;
|
|
15
|
+
export declare function assertComposeSuccess(result: ProbeSpawnResult, action: string): void;
|
|
16
|
+
export declare function composeCommandIncludesDestructiveVolumeRemoval(args: readonly string[]): boolean;
|
|
17
|
+
export declare class ComposeExecError extends Error {
|
|
18
|
+
readonly code: "timeout" | "command_failed";
|
|
19
|
+
constructor(code: "timeout" | "command_failed", message: string);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=compose-exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-exec.d.ts","sourceRoot":"","sources":["../../src/setup/compose-exec.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzC;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,kBAAkB,EACvB,UAAU,GAAE,MAAM,CAAC,UAAwB,GAC1C,MAAM,CAAC,UAAU,CAKnB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAYjE;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,kBAAkB,GAC1B,gBAAgB,CAMlB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,GACb,IAAI,CAgBN;AAED,wBAAgB,8CAA8C,CAC5D,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,OAAO,CAGT;AAWD,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAC;gBAEhC,IAAI,EAAE,SAAS,GAAG,gBAAgB,EAAE,OAAO,EAAE,MAAM;CAIhE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { redactSecrets } from "../doctor/redact.js";
|
|
3
|
+
import { defaultProbeSpawn, } from "./probe-spawn.js";
|
|
4
|
+
export function buildComposeSpawnEnv(ctx, processEnv = process.env) {
|
|
5
|
+
return {
|
|
6
|
+
...processEnv,
|
|
7
|
+
COMPOSE_PROJECT_NAME: ctx.projectName,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function composeBaseArgs(ctx) {
|
|
11
|
+
return [
|
|
12
|
+
"compose",
|
|
13
|
+
"--project-name",
|
|
14
|
+
ctx.projectName,
|
|
15
|
+
"--project-directory",
|
|
16
|
+
ctx.installDir,
|
|
17
|
+
"--env-file",
|
|
18
|
+
ctx.envFilePath,
|
|
19
|
+
"-f",
|
|
20
|
+
path.join(ctx.installDir, "compose.yml"),
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
export function runComposeCommand(ctx, args, options) {
|
|
24
|
+
const spawn = options.spawn ?? defaultProbeSpawn;
|
|
25
|
+
const dockerArgs = [...composeBaseArgs(ctx), ...args];
|
|
26
|
+
const processEnv = options.processEnv ?? buildComposeSpawnEnv(ctx, process.env);
|
|
27
|
+
return spawn("docker", dockerArgs, options.timeoutMs, processEnv);
|
|
28
|
+
}
|
|
29
|
+
export function assertComposeSuccess(result, action) {
|
|
30
|
+
if (result.error?.code === "ETIMEDOUT") {
|
|
31
|
+
throw new ComposeExecError("timeout", `${action} timed out. Retry when Docker responds promptly.`);
|
|
32
|
+
}
|
|
33
|
+
if (result.status !== 0) {
|
|
34
|
+
const detail = redactSecrets(firstLine(result.stderr) || firstLine(result.stdout));
|
|
35
|
+
throw new ComposeExecError("command_failed", detail.length > 0 ? `${action} failed: ${detail}` : `${action} failed.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function composeCommandIncludesDestructiveVolumeRemoval(args) {
|
|
39
|
+
const joined = args.join(" ");
|
|
40
|
+
return /\bdown\b/.test(joined) && /(?:^|\s)-v(?:\s|$)/.test(joined);
|
|
41
|
+
}
|
|
42
|
+
function firstLine(text) {
|
|
43
|
+
return (text
|
|
44
|
+
.split(/\r?\n/)
|
|
45
|
+
.map((line) => line.trim())
|
|
46
|
+
.find((line) => line.length > 0) ?? "");
|
|
47
|
+
}
|
|
48
|
+
export class ComposeExecError extends Error {
|
|
49
|
+
code;
|
|
50
|
+
constructor(code, message) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.code = code;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=compose-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-exec.js","sourceRoot":"","sources":["../../src/setup/compose-exec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,iBAAiB,GAGlB,MAAM,kBAAkB,CAAC;AAc1B,MAAM,UAAU,oBAAoB,CAClC,GAAuB,EACvB,aAAgC,OAAO,CAAC,GAAG;IAE3C,OAAO;QACL,GAAG,UAAU;QACb,oBAAoB,EAAE,GAAG,CAAC,WAAW;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,OAAO;QACL,SAAS;QACT,gBAAgB;QAChB,GAAG,CAAC,WAAW;QACf,qBAAqB;QACrB,GAAG,CAAC,UAAU;QACd,YAAY;QACZ,GAAG,CAAC,WAAW;QACf,IAAI;QACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAuB,EACvB,IAAuB,EACvB,OAA2B;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC;IACjD,MAAM,UAAU,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,IAAI,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAwB,EACxB,MAAc;IAEd,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,gBAAgB,CACxB,SAAS,EACT,GAAG,MAAM,kDAAkD,CAC5D,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,aAAa,CAC1B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CACrD,CAAC;QACF,MAAM,IAAI,gBAAgB,CACxB,gBAAgB,EAChB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,UAAU,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8CAA8C,CAC5D,IAAuB;IAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,CACL,IAAI;SACD,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CACzC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAA+B;IAE5C,YAAY,IAAkC,EAAE,OAAe;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-project.d.ts","sourceRoot":"","sources":["../../src/setup/compose-project.ts"],"names":[],"mappings":"AAGA,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOnE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/** Stable Compose project identity scoped to the installation directory path. */
|
|
4
|
+
export function deriveComposeProjectName(installDir) {
|
|
5
|
+
const normalized = path.resolve(installDir).replace(/\\/g, "/").toLowerCase();
|
|
6
|
+
const digest = createHash("sha256")
|
|
7
|
+
.update(normalized)
|
|
8
|
+
.digest("hex")
|
|
9
|
+
.slice(0, 12);
|
|
10
|
+
return `osva-${digest}`;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=compose-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-project.js","sourceRoot":"","sources":["../../src/setup/compose-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,iFAAiF;AACjF,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC;SAChC,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-template-root.d.ts","sourceRoot":"","sources":["../../src/setup/compose-template-root.ts"],"names":[],"mappings":"AAKA,+EAA+E;AAC/E,wBAAgB,iCAAiC,IAAI,MAAM,CAE1D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
const setupModuleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
4
|
+
/** Bundled registry-only Compose distribution shipped with the CLI package. */
|
|
5
|
+
export function resolveComposeInstallTemplateRoot() {
|
|
6
|
+
return path.resolve(setupModuleDir, "../../templates/compose-install");
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=compose-template-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-template-root.js","sourceRoot":"","sources":["../../src/setup/compose-template-root.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpE,+EAA+E;AAC/E,MAAM,UAAU,iCAAiC;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;AACzE,CAAC"}
|