@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,13 @@
|
|
|
1
|
+
export interface ComposeDistributionManifest {
|
|
2
|
+
readonly distributionSchemaVersion: number;
|
|
3
|
+
readonly platformVersion: string;
|
|
4
|
+
readonly imageRef: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ComposeDistribution {
|
|
7
|
+
readonly manifest: ComposeDistributionManifest;
|
|
8
|
+
readonly composeYaml: string;
|
|
9
|
+
readonly templateRoot: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function loadComposeDistribution(): Promise<ComposeDistribution>;
|
|
12
|
+
export declare function assertPinnedImageRef(imageRef: string): void;
|
|
13
|
+
//# sourceMappingURL=distribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.d.ts","sourceRoot":"","sources":["../../src/setup/distribution.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAY5E;AAwBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAoB3D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveComposeInstallTemplateRoot } from "./compose-template-root.js";
|
|
4
|
+
export async function loadComposeDistribution() {
|
|
5
|
+
const templateRoot = resolveComposeInstallTemplateRoot();
|
|
6
|
+
const manifestPath = path.join(templateRoot, "distribution.json");
|
|
7
|
+
const composePath = path.join(templateRoot, "compose.yml");
|
|
8
|
+
const [manifestRaw, composeYaml] = await Promise.all([
|
|
9
|
+
readFile(manifestPath, "utf8"),
|
|
10
|
+
readFile(composePath, "utf8"),
|
|
11
|
+
]);
|
|
12
|
+
const manifest = JSON.parse(manifestRaw);
|
|
13
|
+
assertDistributionManifest(manifest);
|
|
14
|
+
assertRegistryOnlyCompose(composeYaml);
|
|
15
|
+
return { manifest, composeYaml, templateRoot };
|
|
16
|
+
}
|
|
17
|
+
function assertDistributionManifest(manifest) {
|
|
18
|
+
if (manifest.distributionSchemaVersion !== 1) {
|
|
19
|
+
throw new Error(`Unsupported compose distribution schema version ${String(manifest.distributionSchemaVersion)}.`);
|
|
20
|
+
}
|
|
21
|
+
if (typeof manifest.platformVersion !== "string" ||
|
|
22
|
+
manifest.platformVersion.length === 0) {
|
|
23
|
+
throw new Error("Compose distribution manifest is missing platformVersion.");
|
|
24
|
+
}
|
|
25
|
+
if (typeof manifest.imageRef !== "string" || manifest.imageRef.length === 0) {
|
|
26
|
+
throw new Error("Compose distribution manifest is missing imageRef.");
|
|
27
|
+
}
|
|
28
|
+
assertPinnedImageRef(manifest.imageRef);
|
|
29
|
+
}
|
|
30
|
+
export function assertPinnedImageRef(imageRef) {
|
|
31
|
+
const trimmed = imageRef.trim();
|
|
32
|
+
if (trimmed.length === 0) {
|
|
33
|
+
throw new Error("OSVA image reference must not be empty.");
|
|
34
|
+
}
|
|
35
|
+
if (trimmed === "latest" || trimmed.endsWith(":latest")) {
|
|
36
|
+
throw new Error("Refusing unversioned OSVA image tag for installation.");
|
|
37
|
+
}
|
|
38
|
+
const lastSegment = trimmed.split("/").at(-1) ?? trimmed;
|
|
39
|
+
if (!lastSegment.includes(":")) {
|
|
40
|
+
throw new Error("Refusing OSVA image reference without an explicit version tag.");
|
|
41
|
+
}
|
|
42
|
+
const tag = lastSegment.split(":").at(-1) ?? "";
|
|
43
|
+
if (tag.length === 0) {
|
|
44
|
+
throw new Error("Refusing OSVA image reference without an explicit version tag.");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function assertRegistryOnlyCompose(composeYaml) {
|
|
48
|
+
if (/\n\s*build\s*:/.test(composeYaml)) {
|
|
49
|
+
throw new Error("Bundled installation compose must not contain image build contexts.");
|
|
50
|
+
}
|
|
51
|
+
if (!composeYaml.includes("OSVA_IMAGE:?OSVA_IMAGE is required")) {
|
|
52
|
+
throw new Error("Bundled installation compose must require an explicit OSVA_IMAGE.");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=distribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/setup/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Keys written to the installation `.env` and checked for host-shell conflicts. */
|
|
2
|
+
export declare const INSTALL_ENV_KEYS: readonly ["COMPOSE_PROJECT_NAME", "OSVA_IMAGE", "POSTGRES_PASSWORD", "OSVA_AUTH_SECRET", "OSVA_PUBLISH_WEB_PORT", "OSVA_PUBLISH_MCP_PORT", "OSVA_PUBLISH_CONSOLE_PORT", "OSVA_AUTH_BASE_URL", "OSVA_AUTH_TRUSTED_ORIGINS", "OSVA_VALKEY_URL"];
|
|
3
|
+
export type InstallEnvKey = (typeof INSTALL_ENV_KEYS)[number];
|
|
4
|
+
export type InstallEnvValues = Record<InstallEnvKey, string>;
|
|
5
|
+
export interface EnvConflict {
|
|
6
|
+
readonly key: InstallEnvKey;
|
|
7
|
+
readonly shellValue: string;
|
|
8
|
+
readonly fileValue: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseDotEnv(contents: string): Map<string, string>;
|
|
11
|
+
export declare function readInstallEnvFile(envPath: string): Promise<Map<string, string> | undefined>;
|
|
12
|
+
export declare function detectShellEnvConflicts(fileValues: InstallEnvValues, shellEnv: NodeJS.ProcessEnv): readonly EnvConflict[];
|
|
13
|
+
export declare function renderInstallEnvFile(values: InstallEnvValues): string;
|
|
14
|
+
export declare function buildInstallEnvValues(input: {
|
|
15
|
+
readonly imageRef: string;
|
|
16
|
+
readonly composeProjectName: string;
|
|
17
|
+
readonly webPort: number;
|
|
18
|
+
readonly mcpPort: number;
|
|
19
|
+
readonly consolePort: number;
|
|
20
|
+
readonly existing?: Map<string, string>;
|
|
21
|
+
readonly generateSecret: () => string;
|
|
22
|
+
}): InstallEnvValues;
|
|
23
|
+
//# sourceMappingURL=env-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-file.d.ts","sourceRoot":"","sources":["../../src/setup/env-file.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,+OAWnB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBjE;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAc1C;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,gBAAgB,EAC5B,QAAQ,EAAE,MAAM,CAAC,UAAU,GAC1B,SAAS,WAAW,EAAE,CAgBxB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA0BrE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC;CACvC,GAAG,gBAAgB,CA+BnB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
/** Keys written to the installation `.env` and checked for host-shell conflicts. */
|
|
3
|
+
export const INSTALL_ENV_KEYS = [
|
|
4
|
+
"COMPOSE_PROJECT_NAME",
|
|
5
|
+
"OSVA_IMAGE",
|
|
6
|
+
"POSTGRES_PASSWORD",
|
|
7
|
+
"OSVA_AUTH_SECRET",
|
|
8
|
+
"OSVA_PUBLISH_WEB_PORT",
|
|
9
|
+
"OSVA_PUBLISH_MCP_PORT",
|
|
10
|
+
"OSVA_PUBLISH_CONSOLE_PORT",
|
|
11
|
+
"OSVA_AUTH_BASE_URL",
|
|
12
|
+
"OSVA_AUTH_TRUSTED_ORIGINS",
|
|
13
|
+
"OSVA_VALKEY_URL",
|
|
14
|
+
];
|
|
15
|
+
export function parseDotEnv(contents) {
|
|
16
|
+
const values = new Map();
|
|
17
|
+
for (const line of contents.split(/\r?\n/)) {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
if (trimmed.length === 0 || trimmed.startsWith("#")) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const withoutExport = trimmed.startsWith("export ")
|
|
23
|
+
? trimmed.slice("export ".length).trim()
|
|
24
|
+
: trimmed;
|
|
25
|
+
const eq = withoutExport.indexOf("=");
|
|
26
|
+
if (eq <= 0) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const key = withoutExport.slice(0, eq).trim();
|
|
30
|
+
let value = withoutExport.slice(eq + 1).trim();
|
|
31
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
32
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
33
|
+
value = value.slice(1, -1);
|
|
34
|
+
}
|
|
35
|
+
values.set(key, value);
|
|
36
|
+
}
|
|
37
|
+
return values;
|
|
38
|
+
}
|
|
39
|
+
export async function readInstallEnvFile(envPath) {
|
|
40
|
+
try {
|
|
41
|
+
const contents = await readFile(envPath, "utf8");
|
|
42
|
+
return parseDotEnv(contents);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof Error &&
|
|
46
|
+
"code" in error &&
|
|
47
|
+
error.code === "ENOENT") {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function detectShellEnvConflicts(fileValues, shellEnv) {
|
|
54
|
+
const conflicts = [];
|
|
55
|
+
for (const key of INSTALL_ENV_KEYS) {
|
|
56
|
+
const shellRaw = key === "COMPOSE_PROJECT_NAME"
|
|
57
|
+
? shellEnv.COMPOSE_PROJECT_NAME?.trim()
|
|
58
|
+
: shellEnv[key]?.trim();
|
|
59
|
+
if (shellRaw === undefined || shellRaw.length === 0) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const fileValue = fileValues[key];
|
|
63
|
+
if (shellRaw !== fileValue) {
|
|
64
|
+
conflicts.push({ key, shellValue: shellRaw, fileValue });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return conflicts;
|
|
68
|
+
}
|
|
69
|
+
export function renderInstallEnvFile(values) {
|
|
70
|
+
const lines = [
|
|
71
|
+
"# Generated by `osva setup`. Do not commit this file.",
|
|
72
|
+
"# Host shell exports override these values during `docker compose` interpolation.",
|
|
73
|
+
"",
|
|
74
|
+
`COMPOSE_PROJECT_NAME=${values.COMPOSE_PROJECT_NAME}`,
|
|
75
|
+
"",
|
|
76
|
+
`OSVA_IMAGE=${values.OSVA_IMAGE}`,
|
|
77
|
+
`POSTGRES_PASSWORD=${values.POSTGRES_PASSWORD}`,
|
|
78
|
+
"",
|
|
79
|
+
"OSVA_VALKEY_URL=redis://valkey:6379",
|
|
80
|
+
"",
|
|
81
|
+
`OSVA_PUBLISH_WEB_PORT=${values.OSVA_PUBLISH_WEB_PORT}`,
|
|
82
|
+
`OSVA_PUBLISH_MCP_PORT=${values.OSVA_PUBLISH_MCP_PORT}`,
|
|
83
|
+
`OSVA_PUBLISH_CONSOLE_PORT=${values.OSVA_PUBLISH_CONSOLE_PORT}`,
|
|
84
|
+
"",
|
|
85
|
+
`OSVA_AUTH_SECRET=${values.OSVA_AUTH_SECRET}`,
|
|
86
|
+
`OSVA_AUTH_BASE_URL=${values.OSVA_AUTH_BASE_URL}`,
|
|
87
|
+
`OSVA_AUTH_TRUSTED_ORIGINS=${values.OSVA_AUTH_TRUSTED_ORIGINS}`,
|
|
88
|
+
"",
|
|
89
|
+
"OSVA_KNOWLEDGE_EMBEDDING_PROVIDER=DETERMINISTIC",
|
|
90
|
+
"OSVA_KNOWLEDGE_EMBEDDING_MODEL=deterministic-v1",
|
|
91
|
+
"OSVA_KNOWLEDGE_EMBEDDING_DIMENSIONS=384",
|
|
92
|
+
"",
|
|
93
|
+
];
|
|
94
|
+
return `${lines.join("\n")}\n`;
|
|
95
|
+
}
|
|
96
|
+
export function buildInstallEnvValues(input) {
|
|
97
|
+
const webOrigin = `http://127.0.0.1:${String(input.webPort)}`;
|
|
98
|
+
const consoleOrigin = `http://127.0.0.1:${String(input.consolePort)}`;
|
|
99
|
+
const existing = input.existing;
|
|
100
|
+
const postgresPassword = existing?.get("POSTGRES_PASSWORD")?.trim() || input.generateSecret();
|
|
101
|
+
const authSecret = existing?.get("OSVA_AUTH_SECRET")?.trim() || input.generateSecret();
|
|
102
|
+
const imageRef = existing?.get("OSVA_IMAGE")?.trim() || input.imageRef;
|
|
103
|
+
assertRequiredSecret("POSTGRES_PASSWORD", postgresPassword);
|
|
104
|
+
assertRequiredSecret("OSVA_AUTH_SECRET", authSecret);
|
|
105
|
+
const composeProjectName = existing?.get("COMPOSE_PROJECT_NAME")?.trim() || input.composeProjectName;
|
|
106
|
+
return {
|
|
107
|
+
COMPOSE_PROJECT_NAME: composeProjectName,
|
|
108
|
+
OSVA_IMAGE: imageRef,
|
|
109
|
+
POSTGRES_PASSWORD: postgresPassword,
|
|
110
|
+
OSVA_AUTH_SECRET: authSecret,
|
|
111
|
+
OSVA_PUBLISH_WEB_PORT: String(input.webPort),
|
|
112
|
+
OSVA_PUBLISH_MCP_PORT: String(input.mcpPort),
|
|
113
|
+
OSVA_PUBLISH_CONSOLE_PORT: String(input.consolePort),
|
|
114
|
+
OSVA_AUTH_BASE_URL: existing?.get("OSVA_AUTH_BASE_URL")?.trim() || webOrigin,
|
|
115
|
+
OSVA_AUTH_TRUSTED_ORIGINS: mergeInstallTrustedOrigins(existing?.get("OSVA_AUTH_TRUSTED_ORIGINS"), webOrigin, consoleOrigin),
|
|
116
|
+
OSVA_VALKEY_URL: existing?.get("OSVA_VALKEY_URL")?.trim() || "redis://valkey:6379",
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function mergeInstallTrustedOrigins(existing, webOrigin, consoleOrigin) {
|
|
120
|
+
const required = [webOrigin, consoleOrigin];
|
|
121
|
+
const merged = new Set();
|
|
122
|
+
for (const origin of required) {
|
|
123
|
+
merged.add(origin);
|
|
124
|
+
}
|
|
125
|
+
const raw = existing?.trim();
|
|
126
|
+
if (raw !== undefined && raw.length > 0) {
|
|
127
|
+
for (const segment of raw.split(",")) {
|
|
128
|
+
const origin = segment.trim();
|
|
129
|
+
if (origin.length > 0) {
|
|
130
|
+
merged.add(origin);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return [...merged].join(",");
|
|
135
|
+
}
|
|
136
|
+
function assertRequiredSecret(name, value) {
|
|
137
|
+
if (value.length < 32) {
|
|
138
|
+
throw new Error(`${name} must be at least 32 characters for installation.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=env-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/setup/env-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/setup/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqD5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAK3D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export function formatSetupHuman(report) {
|
|
2
|
+
const lines = [
|
|
3
|
+
"OSVA Setup",
|
|
4
|
+
"",
|
|
5
|
+
"Preflight checks and local Compose provisioning for self-hosted OSVA.",
|
|
6
|
+
report.installDir !== undefined
|
|
7
|
+
? `Installation directory: ${report.installDir}`
|
|
8
|
+
: undefined,
|
|
9
|
+
"",
|
|
10
|
+
].filter((line) => line !== undefined);
|
|
11
|
+
for (const check of report.checks) {
|
|
12
|
+
const status = check.status.padEnd(4, " ");
|
|
13
|
+
const id = check.id.padEnd(26, " ");
|
|
14
|
+
lines.push(`${status} ${id} ${check.message}`);
|
|
15
|
+
if (check.remediation !== undefined) {
|
|
16
|
+
lines.push(` → ${check.remediation}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
lines.push("");
|
|
20
|
+
lines.push(`Result: ${report.result.toUpperCase()}`);
|
|
21
|
+
if (report.platformReady === true) {
|
|
22
|
+
lines.push("Platform services: READY");
|
|
23
|
+
}
|
|
24
|
+
else if (report.phase === "provision") {
|
|
25
|
+
lines.push("Platform services: NOT READY");
|
|
26
|
+
}
|
|
27
|
+
if (report.consoleReady === true) {
|
|
28
|
+
lines.push("Console: READY");
|
|
29
|
+
}
|
|
30
|
+
else if (report.phase === "provision") {
|
|
31
|
+
lines.push("Console: NOT READY");
|
|
32
|
+
}
|
|
33
|
+
if (report.administratorBootstrapped === true) {
|
|
34
|
+
lines.push("Administrator bootstrap: DONE");
|
|
35
|
+
}
|
|
36
|
+
else if (report.phase === "provision") {
|
|
37
|
+
lines.push("Administrator bootstrap: PENDING");
|
|
38
|
+
}
|
|
39
|
+
if (report.installationComplete === true) {
|
|
40
|
+
lines.push("Installation: COMPLETE");
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
lines.push("Installation: NOT COMPLETE (complete Console sign-in and Agent Studio onboarding).");
|
|
44
|
+
}
|
|
45
|
+
if (report.setupTokenForOperator !== undefined) {
|
|
46
|
+
lines.push("");
|
|
47
|
+
lines.push("One-time administrator password setup token (single use):");
|
|
48
|
+
lines.push(report.setupTokenForOperator);
|
|
49
|
+
lines.push("");
|
|
50
|
+
lines.push("Enter this token at the Console /setup page. It is not stored in installation files or JSON output.");
|
|
51
|
+
}
|
|
52
|
+
return `${lines.join("\n")}\n`;
|
|
53
|
+
}
|
|
54
|
+
export function formatSetupJson(report) {
|
|
55
|
+
const safeReport = Object.fromEntries(Object.entries(report).filter(([key]) => key !== "setupTokenForOperator"));
|
|
56
|
+
return `${JSON.stringify(safeReport, null, 2)}\n`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/setup/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type SetupProbeDependencies } from "./run-setup.js";
|
|
2
|
+
export type { SetupOptions } from "./read-options.js";
|
|
3
|
+
export type { SetupProbeDependencies } from "./run-setup.js";
|
|
4
|
+
export type { SetupReport } from "./setup-report.js";
|
|
5
|
+
export { DEFAULT_SETUP_SUBPROCESS_TIMEOUT_MS, runSetupPipeline, setupExitCode, } from "./run-setup.js";
|
|
6
|
+
export { parsePortNumber, readSetupOptions } from "./read-options.js";
|
|
7
|
+
export { runSetupProvision } from "./run-provision.js";
|
|
8
|
+
export { buildInstallEnvValues, detectShellEnvConflicts, parseDotEnv, renderInstallEnvFile, } from "./env-file.js";
|
|
9
|
+
export { materializeInstallation } from "./materialize-install.js";
|
|
10
|
+
export { composeBaseArgs, composeCommandIncludesDestructiveVolumeRemoval, } from "./compose-exec.js";
|
|
11
|
+
export { assertPinnedImageRef, loadComposeDistribution, } from "./distribution.js";
|
|
12
|
+
export { defaultInstallDir, resolveInstallDir } from "./install-path.js";
|
|
13
|
+
export interface SetupCommandDependencies extends SetupProbeDependencies {
|
|
14
|
+
readonly processEnv?: NodeJS.ProcessEnv;
|
|
15
|
+
}
|
|
16
|
+
export declare function runSetupCommand(flags: Readonly<Record<string, string | boolean>>, processEnv?: NodeJS.ProcessEnv, deps?: SetupCommandDependencies): Promise<number>;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,mCAAmC,EACnC,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,EACX,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EACL,eAAe,EACf,8CAA8C,GAC/C,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,wBAAyB,SAAQ,sBAAsB;IACtE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzC;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EACjD,UAAU,GAAE,MAAM,CAAC,UAAwB,EAC3C,IAAI,GAAE,wBAA6B,GAClC,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { writeStdout } from "../stdout.js";
|
|
2
|
+
import { formatSetupHuman, formatSetupJson } from "./format.js";
|
|
3
|
+
import { readSetupOptions } from "./read-options.js";
|
|
4
|
+
import { runSetupProvision } from "./run-provision.js";
|
|
5
|
+
import { runSetupPipeline, setupExitCode, } from "./run-setup.js";
|
|
6
|
+
import { mergeSetupReport } from "./setup-report.js";
|
|
7
|
+
export { DEFAULT_SETUP_SUBPROCESS_TIMEOUT_MS, runSetupPipeline, setupExitCode, } from "./run-setup.js";
|
|
8
|
+
export { parsePortNumber, readSetupOptions } from "./read-options.js";
|
|
9
|
+
export { runSetupProvision } from "./run-provision.js";
|
|
10
|
+
export { buildInstallEnvValues, detectShellEnvConflicts, parseDotEnv, renderInstallEnvFile, } from "./env-file.js";
|
|
11
|
+
export { materializeInstallation } from "./materialize-install.js";
|
|
12
|
+
export { composeBaseArgs, composeCommandIncludesDestructiveVolumeRemoval, } from "./compose-exec.js";
|
|
13
|
+
export { assertPinnedImageRef, loadComposeDistribution, } from "./distribution.js";
|
|
14
|
+
export { defaultInstallDir, resolveInstallDir } from "./install-path.js";
|
|
15
|
+
export async function runSetupCommand(flags, processEnv = process.env, deps = {}) {
|
|
16
|
+
const options = readSetupOptions(flags, processEnv, deps.platform);
|
|
17
|
+
const preflight = await runSetupPipeline(options, {
|
|
18
|
+
...deps,
|
|
19
|
+
cwdForDisk: options.installDir,
|
|
20
|
+
});
|
|
21
|
+
const json = flags.json === true;
|
|
22
|
+
if (preflight.result === "fail" || options.preflightOnly) {
|
|
23
|
+
const report = mergeSetupReport({
|
|
24
|
+
preflight,
|
|
25
|
+
installDir: options.installDir,
|
|
26
|
+
phase: "preflight",
|
|
27
|
+
});
|
|
28
|
+
await writeStdout(json ? formatSetupJson(report) : formatSetupHuman(report));
|
|
29
|
+
return setupExitCode(report);
|
|
30
|
+
}
|
|
31
|
+
const provision = await runSetupProvision(options, {
|
|
32
|
+
spawn: deps.spawn,
|
|
33
|
+
processEnv,
|
|
34
|
+
});
|
|
35
|
+
const report = mergeSetupReport({
|
|
36
|
+
preflight,
|
|
37
|
+
provisionChecks: provision.checks,
|
|
38
|
+
installDir: options.installDir,
|
|
39
|
+
phase: "provision",
|
|
40
|
+
setupTokenForOperator: provision.setupTokenForOperator,
|
|
41
|
+
});
|
|
42
|
+
await writeStdout(json ? formatSetupJson(report) : formatSetupHuman(report));
|
|
43
|
+
return setupExitCode(report);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,aAAa,GAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKrD,OAAO,EACL,mCAAmC,EACnC,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,EACX,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EACL,eAAe,EACf,8CAA8C,GAC/C,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMzE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAiD,EACjD,aAAgC,OAAO,CAAC,GAAG,EAC3C,OAAiC,EAAE;IAEnC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE;QAChD,GAAG,IAAI;QACP,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;IAEjC,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAC9B,SAAS;YACT,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;QACH,MAAM,WAAW,CACf,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAC1D,CAAC;QACF,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE;QACjD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU;KACX,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,SAAS;QACT,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,WAAW;QAClB,qBAAqB,EAAE,SAAS,CAAC,qBAAqB;KACvD,CAAC,CAAC;IACH,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function defaultInstallDir(platform?: NodeJS.Platform): string;
|
|
2
|
+
export declare function resolveInstallDir(flags: Readonly<Record<string, string | boolean>>, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): string;
|
|
3
|
+
//# sourceMappingURL=install-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-path.d.ts","sourceRoot":"","sources":["../../src/setup/install-path.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,CAC/B,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CASR;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EACjD,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAaR"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function defaultInstallDir(platform = process.platform) {
|
|
4
|
+
if (platform === "win32") {
|
|
5
|
+
const localAppData = process.env.LOCALAPPDATA?.trim();
|
|
6
|
+
if (localAppData !== undefined && localAppData.length > 0) {
|
|
7
|
+
return path.join(localAppData, "OSVA", "install");
|
|
8
|
+
}
|
|
9
|
+
return path.join(os.homedir(), "AppData", "Local", "OSVA", "install");
|
|
10
|
+
}
|
|
11
|
+
return path.join(os.homedir(), ".osva", "install");
|
|
12
|
+
}
|
|
13
|
+
export function resolveInstallDir(flags, env = process.env, platform = process.platform) {
|
|
14
|
+
const flagValue = flags["install-dir"];
|
|
15
|
+
if (typeof flagValue === "boolean") {
|
|
16
|
+
throw new Error("--install-dir requires a directory path.");
|
|
17
|
+
}
|
|
18
|
+
const raw = typeof flagValue === "string" && flagValue.trim().length > 0
|
|
19
|
+
? flagValue.trim()
|
|
20
|
+
: env.OSVA_INSTALL_DIR?.trim();
|
|
21
|
+
if (raw === undefined || raw.length === 0) {
|
|
22
|
+
return path.resolve(defaultInstallDir(platform));
|
|
23
|
+
}
|
|
24
|
+
return path.resolve(raw);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=install-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-path.js","sourceRoot":"","sources":["../../src/setup/install-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,iBAAiB,CAC/B,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;QACtD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAiD,EACjD,MAAyB,OAAO,CAAC,GAAG,EACpC,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACvC,IAAI,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,GAAG,GACP,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC1D,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE;QAClB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const INSTALLATION_MARKER_RELATIVE: string;
|
|
2
|
+
export interface InstallationMarker {
|
|
3
|
+
readonly schemaVersion: 1;
|
|
4
|
+
readonly platformVersion: string;
|
|
5
|
+
readonly imageRef: string;
|
|
6
|
+
readonly cliVersion: string;
|
|
7
|
+
readonly installDir: string;
|
|
8
|
+
readonly composeProjectName: string;
|
|
9
|
+
readonly createdAt: string;
|
|
10
|
+
readonly updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export type InstallDirectoryKind = "missing" | "empty" | "osva_installation" | "foreign";
|
|
13
|
+
export interface InstallDirectoryAssessment {
|
|
14
|
+
readonly kind: InstallDirectoryKind;
|
|
15
|
+
readonly marker: InstallationMarker | undefined;
|
|
16
|
+
readonly foreignEntries: readonly string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function assessInstallDirectory(installDir: string): Promise<InstallDirectoryAssessment>;
|
|
19
|
+
export declare function readInstallationMarker(markerPath: string): Promise<InstallationMarker | undefined>;
|
|
20
|
+
export declare function renderInstallationMarker(input: {
|
|
21
|
+
readonly platformVersion: string;
|
|
22
|
+
readonly imageRef: string;
|
|
23
|
+
readonly cliVersion: string;
|
|
24
|
+
readonly installDir: string;
|
|
25
|
+
readonly composeProjectName: string;
|
|
26
|
+
readonly existing?: InstallationMarker;
|
|
27
|
+
}): InstallationMarker;
|
|
28
|
+
export declare function pathIsDirectory(targetPath: string): Promise<boolean>;
|
|
29
|
+
//# sourceMappingURL=installation-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation-state.d.ts","sourceRoot":"","sources":["../../src/setup/installation-state.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,4BAA4B,QAGxC,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAC9B,SAAS,GAAG,OAAO,GAAG,mBAAmB,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,0BAA0B,CAAC,CAyCrC;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAkBzC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CACxC,GAAG,kBAAkB,CAYrB;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const INSTALLATION_MARKER_RELATIVE = path.join(".osva", "installation.json");
|
|
4
|
+
export async function assessInstallDirectory(installDir) {
|
|
5
|
+
let entries;
|
|
6
|
+
try {
|
|
7
|
+
entries = await readdir(installDir);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (error instanceof Error &&
|
|
11
|
+
"code" in error &&
|
|
12
|
+
error.code === "ENOENT") {
|
|
13
|
+
return { kind: "missing", marker: undefined, foreignEntries: [] };
|
|
14
|
+
}
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
if (entries.length === 0) {
|
|
18
|
+
return { kind: "empty", marker: undefined, foreignEntries: [] };
|
|
19
|
+
}
|
|
20
|
+
const markerPath = path.join(installDir, INSTALLATION_MARKER_RELATIVE);
|
|
21
|
+
const marker = await readInstallationMarker(markerPath);
|
|
22
|
+
const recognized = new Set([
|
|
23
|
+
".osva",
|
|
24
|
+
"compose.yml",
|
|
25
|
+
".env",
|
|
26
|
+
".env.example",
|
|
27
|
+
"README.md",
|
|
28
|
+
".acceptance-bootstrap-key",
|
|
29
|
+
".acceptance-setup-token",
|
|
30
|
+
]);
|
|
31
|
+
const foreignEntries = entries.filter((entry) => !recognized.has(entry));
|
|
32
|
+
if (marker !== undefined) {
|
|
33
|
+
return { kind: "osva_installation", marker, foreignEntries };
|
|
34
|
+
}
|
|
35
|
+
if (foreignEntries.length > 0) {
|
|
36
|
+
return { kind: "foreign", marker: undefined, foreignEntries };
|
|
37
|
+
}
|
|
38
|
+
if (entries.every((entry) => recognized.has(entry))) {
|
|
39
|
+
return { kind: "empty", marker: undefined, foreignEntries: [] };
|
|
40
|
+
}
|
|
41
|
+
return { kind: "foreign", marker: undefined, foreignEntries: entries };
|
|
42
|
+
}
|
|
43
|
+
export async function readInstallationMarker(markerPath) {
|
|
44
|
+
try {
|
|
45
|
+
const raw = await readFile(markerPath, "utf8");
|
|
46
|
+
const parsed = JSON.parse(raw);
|
|
47
|
+
if (parsed.schemaVersion !== 1) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
return parsed;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error instanceof Error &&
|
|
54
|
+
"code" in error &&
|
|
55
|
+
error.code === "ENOENT") {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function renderInstallationMarker(input) {
|
|
62
|
+
const now = new Date().toISOString();
|
|
63
|
+
return {
|
|
64
|
+
schemaVersion: 1,
|
|
65
|
+
platformVersion: input.platformVersion,
|
|
66
|
+
imageRef: input.imageRef,
|
|
67
|
+
cliVersion: input.cliVersion,
|
|
68
|
+
installDir: input.installDir,
|
|
69
|
+
composeProjectName: input.composeProjectName,
|
|
70
|
+
createdAt: input.existing?.createdAt ?? now,
|
|
71
|
+
updatedAt: now,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export async function pathIsDirectory(targetPath) {
|
|
75
|
+
try {
|
|
76
|
+
const info = await stat(targetPath);
|
|
77
|
+
return info.isDirectory();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=installation-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation-state.js","sourceRoot":"","sources":["../../src/setup/installation-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { WorkspaceId } from "@osva-ai/contracts";
|
|
2
|
+
export interface InstallationStatusSnapshot {
|
|
3
|
+
readonly schemaVersion: 1;
|
|
4
|
+
readonly workspaceCount: number;
|
|
5
|
+
readonly apiKeyCount: number;
|
|
6
|
+
readonly organizationCount: number;
|
|
7
|
+
readonly humanUserCount: number;
|
|
8
|
+
readonly pendingSetupUserCount: number;
|
|
9
|
+
readonly unlinkedWorkspaceIds: readonly WorkspaceId[];
|
|
10
|
+
}
|
|
11
|
+
export type AdministratorBootstrapPhase = "fresh_installation" | "workspace_without_human_administrator" | "administrator_pending_password_setup" | "administrator_ready" | "multiple_unlinked_workspaces" | "ambiguous_workspace_state";
|
|
12
|
+
export declare function parseInstallationStatusJson(stdout: string): InstallationStatusSnapshot;
|
|
13
|
+
export declare function classifyAdministratorBootstrapPhase(status: InstallationStatusSnapshot): AdministratorBootstrapPhase;
|
|
14
|
+
//# sourceMappingURL=installation-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation-status.d.ts","sourceRoot":"","sources":["../../src/setup/installation-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,oBAAoB,EAAE,SAAS,WAAW,EAAE,CAAC;CACvD;AAED,MAAM,MAAM,2BAA2B,GACnC,oBAAoB,GACpB,uCAAuC,GACvC,sCAAsC,GACtC,qBAAqB,GACrB,8BAA8B,GAC9B,2BAA2B,CAAC;AAEhC,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,GACb,0BAA0B,CAc5B;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,0BAA0B,GACjC,2BAA2B,CA2B7B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function parseInstallationStatusJson(stdout) {
|
|
2
|
+
const trimmed = stdout.trim();
|
|
3
|
+
const jsonLine = trimmed
|
|
4
|
+
.split(/\r?\n/)
|
|
5
|
+
.map((line) => line.trim())
|
|
6
|
+
.find((line) => line.startsWith("{")) ?? trimmed;
|
|
7
|
+
const parsed = JSON.parse(jsonLine);
|
|
8
|
+
if (parsed.schemaVersion !== 1) {
|
|
9
|
+
throw new Error(`Unsupported installation status schema version ${String(parsed.schemaVersion)}.`);
|
|
10
|
+
}
|
|
11
|
+
return parsed;
|
|
12
|
+
}
|
|
13
|
+
export function classifyAdministratorBootstrapPhase(status) {
|
|
14
|
+
if (status.organizationCount > 0) {
|
|
15
|
+
if (status.pendingSetupUserCount > 0) {
|
|
16
|
+
return "administrator_pending_password_setup";
|
|
17
|
+
}
|
|
18
|
+
if (status.humanUserCount > 0) {
|
|
19
|
+
return "administrator_ready";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (status.unlinkedWorkspaceIds.length === 0 && status.workspaceCount > 0) {
|
|
23
|
+
return "administrator_ready";
|
|
24
|
+
}
|
|
25
|
+
if (status.unlinkedWorkspaceIds.length > 1) {
|
|
26
|
+
return "multiple_unlinked_workspaces";
|
|
27
|
+
}
|
|
28
|
+
if (status.unlinkedWorkspaceIds.length === 1) {
|
|
29
|
+
return "workspace_without_human_administrator";
|
|
30
|
+
}
|
|
31
|
+
if (status.workspaceCount === 0 && status.apiKeyCount === 0) {
|
|
32
|
+
return "fresh_installation";
|
|
33
|
+
}
|
|
34
|
+
return "ambiguous_workspace_state";
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=installation-status.js.map
|