@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,136 @@
|
|
|
1
|
+
import { assertComposeSuccess, buildComposeSpawnEnv, composeCommandIncludesDestructiveVolumeRemoval, runComposeCommand, } from "../setup/compose-exec.js";
|
|
2
|
+
import { redactSecrets } from "../doctor/redact.js";
|
|
3
|
+
import { inspectComposeServices, migrateJobCompleted, } from "./compose-inspect.js";
|
|
4
|
+
import { probeInstallationReadiness } from "./readiness.js";
|
|
5
|
+
import { PLATFORM_APPLICATION_SERVICES, PLATFORM_DATA_SERVICES, PLATFORM_LIFECYCLE_SERVICES, } from "./services.js";
|
|
6
|
+
import { assertPlatformLifecycleAllowed } from "./upgrade-guard.js";
|
|
7
|
+
import { PlatformCommandError } from "./types.js";
|
|
8
|
+
export const COMPOSE_LIFECYCLE_TIMEOUT_MS = 900_000;
|
|
9
|
+
export async function runPlatformStart(installation, deps = {}) {
|
|
10
|
+
await assertPlatformLifecycleAllowed(installation.installDir, "start platform services");
|
|
11
|
+
const spawn = deps.spawn;
|
|
12
|
+
const servicesBefore = inspectComposeServices(installation.execCtx, spawn);
|
|
13
|
+
const migrateCompleted = migrateJobCompleted(servicesBefore);
|
|
14
|
+
if (migrateCompleted === false) {
|
|
15
|
+
throw new PlatformCommandError("platform_not_ready", "Database migration has not completed successfully. Run `osva setup --yes` to migrate before starting the platform (lifecycle start does not run migrations).");
|
|
16
|
+
}
|
|
17
|
+
startDataServices(installation, spawn);
|
|
18
|
+
startApplicationServices(installation, spawn);
|
|
19
|
+
const readiness = await probeInstallationReadiness(installation, deps.fetch ?? fetch);
|
|
20
|
+
if (!readiness.apiReadyOk) {
|
|
21
|
+
const detail = readiness.apiReadyDetail === undefined
|
|
22
|
+
? ""
|
|
23
|
+
: ` (${readiness.apiReadyDetail})`;
|
|
24
|
+
throw new PlatformCommandError("platform_not_ready", `Platform services started but the control plane is not ready${detail}. This can indicate schema drift or unhealthy dependencies. Inspect logs with \`osva platform logs --service web\`; migrations are not run automatically during start.`);
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
action: "start",
|
|
28
|
+
servicesAffected: [...PLATFORM_LIFECYCLE_SERVICES],
|
|
29
|
+
message: "OSVA platform services are running and the control plane reported ready.",
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function runPlatformStop(installation, deps = {}) {
|
|
33
|
+
await assertPlatformLifecycleAllowed(installation.installDir, "stop platform services");
|
|
34
|
+
const args = ["stop", ...PLATFORM_LIFECYCLE_SERVICES];
|
|
35
|
+
assertLifecycleArgs(args);
|
|
36
|
+
const result = runComposeCommand(installation.execCtx, args, {
|
|
37
|
+
spawn: deps.spawn,
|
|
38
|
+
timeoutMs: COMPOSE_LIFECYCLE_TIMEOUT_MS,
|
|
39
|
+
processEnv: buildComposeSpawnEnv(installation.execCtx),
|
|
40
|
+
});
|
|
41
|
+
if (result.status !== 0 && result.status !== null) {
|
|
42
|
+
throw new PlatformCommandError("compose_failed", redactSecrets(firstLine(result.stderr) ||
|
|
43
|
+
firstLine(result.stdout) ||
|
|
44
|
+
"docker compose stop failed."));
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
action: "stop",
|
|
48
|
+
servicesAffected: [...PLATFORM_LIFECYCLE_SERVICES],
|
|
49
|
+
message: "Stopped OSVA platform services (volumes and installation files preserved).",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export async function runPlatformRestart(installation, deps = {}) {
|
|
53
|
+
await assertPlatformLifecycleAllowed(installation.installDir, "restart platform services");
|
|
54
|
+
const args = ["restart", ...PLATFORM_LIFECYCLE_SERVICES];
|
|
55
|
+
assertLifecycleArgs(args);
|
|
56
|
+
const result = runComposeCommand(installation.execCtx, args, {
|
|
57
|
+
spawn: deps.spawn,
|
|
58
|
+
timeoutMs: COMPOSE_LIFECYCLE_TIMEOUT_MS,
|
|
59
|
+
processEnv: buildComposeSpawnEnv(installation.execCtx),
|
|
60
|
+
});
|
|
61
|
+
if (result.status !== 0) {
|
|
62
|
+
throw new PlatformCommandError("compose_failed", redactSecrets(firstLine(result.stderr) ||
|
|
63
|
+
firstLine(result.stdout) ||
|
|
64
|
+
"docker compose restart failed."));
|
|
65
|
+
}
|
|
66
|
+
let apiHealthOk = false;
|
|
67
|
+
for (let attempt = 0; attempt < 30; attempt += 1) {
|
|
68
|
+
const readiness = await probeInstallationReadiness(installation, deps.fetch ?? fetch);
|
|
69
|
+
if (readiness.apiHealthOk) {
|
|
70
|
+
apiHealthOk = true;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
await delay(2_000);
|
|
74
|
+
}
|
|
75
|
+
if (!apiHealthOk) {
|
|
76
|
+
throw new PlatformCommandError("platform_not_ready", "Services restarted but the control plane health endpoint is not OK yet. Retry `osva platform status` or inspect logs.");
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
action: "restart",
|
|
80
|
+
servicesAffected: [...PLATFORM_LIFECYCLE_SERVICES],
|
|
81
|
+
message: `Restarted: ${PLATFORM_LIFECYCLE_SERVICES.join(", ")}.`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function startDataServices(installation, spawn) {
|
|
85
|
+
const args = [
|
|
86
|
+
"up",
|
|
87
|
+
"-d",
|
|
88
|
+
"--no-build",
|
|
89
|
+
"--pull",
|
|
90
|
+
"never",
|
|
91
|
+
"--wait",
|
|
92
|
+
...PLATFORM_DATA_SERVICES,
|
|
93
|
+
];
|
|
94
|
+
assertLifecycleArgs(args);
|
|
95
|
+
const result = runComposeCommand(installation.execCtx, args, {
|
|
96
|
+
spawn,
|
|
97
|
+
timeoutMs: COMPOSE_LIFECYCLE_TIMEOUT_MS,
|
|
98
|
+
processEnv: buildComposeSpawnEnv(installation.execCtx),
|
|
99
|
+
});
|
|
100
|
+
assertComposeSuccess(result, "Starting PostgreSQL and Valkey");
|
|
101
|
+
}
|
|
102
|
+
function startApplicationServices(installation, spawn) {
|
|
103
|
+
const args = [
|
|
104
|
+
"up",
|
|
105
|
+
"-d",
|
|
106
|
+
"--no-build",
|
|
107
|
+
"--pull",
|
|
108
|
+
"never",
|
|
109
|
+
"--wait",
|
|
110
|
+
...PLATFORM_APPLICATION_SERVICES,
|
|
111
|
+
];
|
|
112
|
+
assertLifecycleArgs(args);
|
|
113
|
+
const result = runComposeCommand(installation.execCtx, args, {
|
|
114
|
+
spawn,
|
|
115
|
+
timeoutMs: COMPOSE_LIFECYCLE_TIMEOUT_MS,
|
|
116
|
+
processEnv: buildComposeSpawnEnv(installation.execCtx),
|
|
117
|
+
});
|
|
118
|
+
assertComposeSuccess(result, "Starting OSVA application services");
|
|
119
|
+
}
|
|
120
|
+
function assertLifecycleArgs(args) {
|
|
121
|
+
if (composeCommandIncludesDestructiveVolumeRemoval(args)) {
|
|
122
|
+
throw new Error("Refusing destructive docker compose down -v.");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function delay(ms) {
|
|
126
|
+
return new Promise((resolve) => {
|
|
127
|
+
setTimeout(resolve, ms);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function firstLine(text) {
|
|
131
|
+
return (text
|
|
132
|
+
.split(/\r?\n/)
|
|
133
|
+
.map((line) => line.trim())
|
|
134
|
+
.find((line) => line.length > 0) ?? "");
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/platform/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ResolvedInstallation } from "./types.js";
|
|
2
|
+
export declare const DEFAULT_LOG_TAIL = 100;
|
|
3
|
+
export declare const MAX_LOG_TAIL = 10000;
|
|
4
|
+
export declare const COMPOSE_LOGS_TIMEOUT_MS = 120000;
|
|
5
|
+
export interface PlatformLogsOptions {
|
|
6
|
+
readonly service: string | undefined;
|
|
7
|
+
readonly tail: number;
|
|
8
|
+
readonly follow: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function parsePlatformLogsOptions(flags: Readonly<Record<string, string | boolean>>): PlatformLogsOptions;
|
|
11
|
+
export declare function runPlatformLogs(installation: ResolvedInstallation, options: PlatformLogsOptions): Promise<number>;
|
|
12
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/platform/logs.ts"],"names":[],"mappings":"AAWA,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE7E,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,YAAY,QAAS,CAAC;AACnC,eAAO,MAAM,uBAAuB,SAAU,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAChD,mBAAmB,CAsCrB;AAED,wBAAsB,eAAe,CACnC,YAAY,EAAE,oBAAoB,EAClC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAqEjB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { buildComposeSpawnEnv, composeBaseArgs, runComposeCommand, } from "../setup/compose-exec.js";
|
|
2
|
+
import { redactSecrets } from "../doctor/redact.js";
|
|
3
|
+
import { defaultProbeSpawn, spawnStreamingCommand, } from "../setup/probe-spawn.js";
|
|
4
|
+
import { KNOWN_COMPOSE_SERVICES } from "./services.js";
|
|
5
|
+
import { PlatformCommandError } from "./types.js";
|
|
6
|
+
export const DEFAULT_LOG_TAIL = 100;
|
|
7
|
+
export const MAX_LOG_TAIL = 10_000;
|
|
8
|
+
export const COMPOSE_LOGS_TIMEOUT_MS = 120_000;
|
|
9
|
+
export function parsePlatformLogsOptions(flags) {
|
|
10
|
+
const follow = flags.follow === true;
|
|
11
|
+
const serviceFlag = flags.service;
|
|
12
|
+
let service;
|
|
13
|
+
if (typeof serviceFlag === "string" && serviceFlag.trim().length > 0) {
|
|
14
|
+
service = serviceFlag.trim();
|
|
15
|
+
}
|
|
16
|
+
else if (serviceFlag === true) {
|
|
17
|
+
throw new PlatformCommandError("usage", "--service requires a Compose service name (for example web, postgres, console).");
|
|
18
|
+
}
|
|
19
|
+
const tailFlag = flags.tail;
|
|
20
|
+
if (tailFlag === true) {
|
|
21
|
+
throw new PlatformCommandError("usage", "--tail requires a positive integer (default 100).");
|
|
22
|
+
}
|
|
23
|
+
let tail = DEFAULT_LOG_TAIL;
|
|
24
|
+
if (typeof tailFlag === "string" && tailFlag.trim().length > 0) {
|
|
25
|
+
if (!/^\d+$/.test(tailFlag.trim())) {
|
|
26
|
+
throw new PlatformCommandError("usage", `Invalid --tail value '${tailFlag}'; use an integer between 1 and ${String(MAX_LOG_TAIL)}.`);
|
|
27
|
+
}
|
|
28
|
+
tail = Number(tailFlag.trim());
|
|
29
|
+
if (tail < 1 || tail > MAX_LOG_TAIL) {
|
|
30
|
+
throw new PlatformCommandError("usage", `--tail must be between 1 and ${String(MAX_LOG_TAIL)}.`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { service, tail, follow };
|
|
34
|
+
}
|
|
35
|
+
export async function runPlatformLogs(installation, options) {
|
|
36
|
+
if (options.service !== undefined) {
|
|
37
|
+
const known = KNOWN_COMPOSE_SERVICES.includes(options.service);
|
|
38
|
+
if (!known) {
|
|
39
|
+
throw new PlatformCommandError("usage", `Unknown service '${options.service}'. Expected one of: ${KNOWN_COMPOSE_SERVICES.join(", ")}.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const args = [
|
|
43
|
+
"logs",
|
|
44
|
+
`--tail=${String(options.tail)}`,
|
|
45
|
+
...(options.follow ? ["--follow"] : []),
|
|
46
|
+
...(options.service === undefined ? [] : [options.service]),
|
|
47
|
+
];
|
|
48
|
+
const spawnEnv = buildComposeSpawnEnv(installation.execCtx);
|
|
49
|
+
const dockerArgs = [...composeBaseArgs(installation.execCtx), ...args];
|
|
50
|
+
if (options.follow) {
|
|
51
|
+
const { exitCode } = await spawnStreamingCommand("docker", dockerArgs, spawnEnv);
|
|
52
|
+
return exitCode === 0 ? 0 : 1;
|
|
53
|
+
}
|
|
54
|
+
const result = runComposeCommand(installation.execCtx, args, {
|
|
55
|
+
timeoutMs: COMPOSE_LOGS_TIMEOUT_MS,
|
|
56
|
+
processEnv: spawnEnv,
|
|
57
|
+
spawn: (executable, spawnArgs, timeoutMs, processEnv) => {
|
|
58
|
+
const output = defaultProbeSpawn(executable, spawnArgs, timeoutMs, processEnv);
|
|
59
|
+
if (output.stdout.length > 0) {
|
|
60
|
+
process.stdout.write(redactSecrets(output.stdout));
|
|
61
|
+
if (!output.stdout.endsWith("\n")) {
|
|
62
|
+
process.stdout.write("\n");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (output.stderr.length > 0) {
|
|
66
|
+
process.stderr.write(redactSecrets(output.stderr));
|
|
67
|
+
if (!output.stderr.endsWith("\n")) {
|
|
68
|
+
process.stderr.write("\n");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return output;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
if (result.status !== 0) {
|
|
75
|
+
throw new PlatformCommandError("compose_failed", redactSecrets(result.stderr.trim() ||
|
|
76
|
+
result.stdout.trim() ||
|
|
77
|
+
"Failed to read service logs."));
|
|
78
|
+
}
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/platform/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ResolvedInstallation } from "./types.js";
|
|
2
|
+
export interface ReadinessSnapshot {
|
|
3
|
+
readonly apiHealthOk: boolean;
|
|
4
|
+
readonly apiReadyOk: boolean;
|
|
5
|
+
readonly consoleReady: boolean;
|
|
6
|
+
readonly apiReadyDetail: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare function probeInstallationReadiness(installation: ResolvedInstallation, fetchImpl?: typeof fetch, probeTimeoutMs?: number): Promise<ReadinessSnapshot>;
|
|
9
|
+
//# sourceMappingURL=readiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/platform/readiness.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,oBAAoB,EAClC,SAAS,GAAE,OAAO,KAAa,EAC/B,cAAc,GAAE,MAAiC,GAChD,OAAO,CAAC,iBAAiB,CAAC,CAiC5B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createFetchProbeTransport } from "../doctor/http-probe.js";
|
|
2
|
+
import { DEFAULT_PROBE_TIMEOUT_MS } from "../doctor/run-doctor.js";
|
|
3
|
+
export async function probeInstallationReadiness(installation, fetchImpl = fetch, probeTimeoutMs = DEFAULT_PROBE_TIMEOUT_MS) {
|
|
4
|
+
const transport = createFetchProbeTransport(fetchImpl, probeTimeoutMs);
|
|
5
|
+
const health = await transport.getJson(`${installation.webUrl}/health`);
|
|
6
|
+
const apiHealthOk = health.kind === "ok" &&
|
|
7
|
+
health.status === 200 &&
|
|
8
|
+
isHealthOkBody(health.body);
|
|
9
|
+
let apiReadyOk = false;
|
|
10
|
+
let apiReadyDetail;
|
|
11
|
+
const ready = await transport.getJson(`${installation.webUrl}/ready`);
|
|
12
|
+
if (ready.kind === "ok" && ready.status === 200) {
|
|
13
|
+
apiReadyOk = true;
|
|
14
|
+
}
|
|
15
|
+
else if (ready.kind === "ok" && ready.status === 503) {
|
|
16
|
+
apiReadyDetail = readyFailureDetail(ready.body);
|
|
17
|
+
apiReadyOk = false;
|
|
18
|
+
}
|
|
19
|
+
else if (ready.kind === "ok") {
|
|
20
|
+
apiReadyDetail = `HTTP ${String(ready.status)}`;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
apiReadyDetail = ready.kind === "timeout" ? "timed out" : "transport error";
|
|
24
|
+
}
|
|
25
|
+
let consoleReady = false;
|
|
26
|
+
try {
|
|
27
|
+
const response = await fetchImpl(`${installation.consoleUrl}/`, {
|
|
28
|
+
signal: AbortSignal.timeout(probeTimeoutMs),
|
|
29
|
+
});
|
|
30
|
+
consoleReady = response.ok;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
consoleReady = false;
|
|
34
|
+
}
|
|
35
|
+
return { apiHealthOk, apiReadyOk, consoleReady, apiReadyDetail };
|
|
36
|
+
}
|
|
37
|
+
function isHealthOkBody(body) {
|
|
38
|
+
return (typeof body === "object" &&
|
|
39
|
+
body !== null &&
|
|
40
|
+
"status" in body &&
|
|
41
|
+
body.status === "ok");
|
|
42
|
+
}
|
|
43
|
+
function readyFailureDetail(body) {
|
|
44
|
+
if (typeof body !== "object" || body === null) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
const failed = body.failedDependency;
|
|
48
|
+
if (typeof failed === "string" && failed.length > 0) {
|
|
49
|
+
return failed;
|
|
50
|
+
}
|
|
51
|
+
const failedMany = body
|
|
52
|
+
.failedDependencies;
|
|
53
|
+
if (Array.isArray(failedMany) && failedMany.length > 0) {
|
|
54
|
+
return failedMany.map(String).join(", ");
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/platform/readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type InstallEnvValues } from "../setup/env-file.js";
|
|
2
|
+
import { type ResolvedInstallation } from "./types.js";
|
|
3
|
+
export declare function resolveInstallationForLifecycle(flags: Readonly<Record<string, string | boolean>>, processEnv?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): Promise<ResolvedInstallation>;
|
|
4
|
+
export declare function installEnvValuesFromMap(envMap: Map<string, string>): InstallEnvValues;
|
|
5
|
+
//# sourceMappingURL=resolve-installation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-installation.d.ts","sourceRoot":"","sources":["../../src/platform/resolve-installation.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,gBAAgB,EAEtB,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE7E,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EACjD,UAAU,GAAE,MAAM,CAAC,UAAwB,EAC3C,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CA6E/B;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,gBAAgB,CAkBlB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { detectShellEnvConflicts, readInstallEnvFile, INSTALL_ENV_KEYS, } from "../setup/env-file.js";
|
|
4
|
+
import { deriveComposeProjectName } from "../setup/compose-project.js";
|
|
5
|
+
import { assessInstallDirectory, INSTALLATION_MARKER_RELATIVE, } from "../setup/installation-state.js";
|
|
6
|
+
import { resolveInstallDir } from "../setup/install-path.js";
|
|
7
|
+
import { isIncompleteUpgrade, readUpgradeState } from "./upgrade/state.js";
|
|
8
|
+
import { PlatformCommandError } from "./types.js";
|
|
9
|
+
export async function resolveInstallationForLifecycle(flags, processEnv = process.env, platform = process.platform) {
|
|
10
|
+
const installDir = resolveInstallDir(flags, processEnv, platform);
|
|
11
|
+
const assessment = await assessInstallDirectory(installDir);
|
|
12
|
+
if (assessment.kind === "missing") {
|
|
13
|
+
throw new PlatformCommandError("installation_missing", `No OSVA installation at ${installDir}. Run \`osva setup\` to install first.`);
|
|
14
|
+
}
|
|
15
|
+
if (assessment.kind === "empty") {
|
|
16
|
+
throw new PlatformCommandError("installation_missing", `Installation directory ${installDir} is empty. Run \`osva setup\` to install OSVA.`);
|
|
17
|
+
}
|
|
18
|
+
if (assessment.kind === "foreign") {
|
|
19
|
+
throw new PlatformCommandError("installation_invalid", `Directory ${installDir} is not an OSVA installation (unrelated files: ${assessment.foreignEntries.join(", ")}).`);
|
|
20
|
+
}
|
|
21
|
+
if (assessment.marker === undefined) {
|
|
22
|
+
throw new PlatformCommandError("installation_invalid", `Missing or invalid installation marker at ${path.join(installDir, INSTALLATION_MARKER_RELATIVE)}.`);
|
|
23
|
+
}
|
|
24
|
+
const composePath = path.join(installDir, "compose.yml");
|
|
25
|
+
const envPath = path.join(installDir, ".env");
|
|
26
|
+
await assertReadableFile(composePath, "compose.yml");
|
|
27
|
+
await assertReadableFile(envPath, ".env");
|
|
28
|
+
const marker = assessment.marker;
|
|
29
|
+
validateMarkerPaths(installDir, marker);
|
|
30
|
+
const envMap = await readInstallEnvFile(envPath);
|
|
31
|
+
if (envMap === undefined) {
|
|
32
|
+
throw new PlatformCommandError("installation_invalid", `Could not read installation environment at ${envPath}.`);
|
|
33
|
+
}
|
|
34
|
+
const envValues = installEnvValuesFromMap(envMap);
|
|
35
|
+
await validateMarkerMetadata(marker, installDir, envValues);
|
|
36
|
+
const conflicts = detectShellEnvConflicts(envValues, processEnv);
|
|
37
|
+
if (conflicts.length > 0) {
|
|
38
|
+
const keys = conflicts.map((conflict) => conflict.key).join(", ");
|
|
39
|
+
throw new PlatformCommandError("env_conflict", `Host environment variables override installation secrets and differ from .env: ${keys}. Unset them or align values before continuing.`);
|
|
40
|
+
}
|
|
41
|
+
const execCtx = {
|
|
42
|
+
installDir,
|
|
43
|
+
envFilePath: envPath,
|
|
44
|
+
projectName: envValues.COMPOSE_PROJECT_NAME,
|
|
45
|
+
};
|
|
46
|
+
const webPort = Number(envValues.OSVA_PUBLISH_WEB_PORT);
|
|
47
|
+
const mcpPort = Number(envValues.OSVA_PUBLISH_MCP_PORT);
|
|
48
|
+
const consolePort = Number(envValues.OSVA_PUBLISH_CONSOLE_PORT);
|
|
49
|
+
return {
|
|
50
|
+
installDir,
|
|
51
|
+
marker,
|
|
52
|
+
envValues,
|
|
53
|
+
envPath,
|
|
54
|
+
composePath,
|
|
55
|
+
execCtx,
|
|
56
|
+
webUrl: `http://127.0.0.1:${String(webPort)}`,
|
|
57
|
+
mcpUrl: `http://127.0.0.1:${String(mcpPort)}`,
|
|
58
|
+
consoleUrl: `http://127.0.0.1:${String(consolePort)}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function installEnvValuesFromMap(envMap) {
|
|
62
|
+
const values = {};
|
|
63
|
+
const missing = [];
|
|
64
|
+
for (const key of INSTALL_ENV_KEYS) {
|
|
65
|
+
const raw = envMap.get(key)?.trim();
|
|
66
|
+
if (raw === undefined || raw.length === 0) {
|
|
67
|
+
missing.push(key);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
values[key] = raw;
|
|
71
|
+
}
|
|
72
|
+
if (missing.length > 0) {
|
|
73
|
+
throw new PlatformCommandError("installation_invalid", `Installation .env is missing required keys: ${missing.join(", ")}.`);
|
|
74
|
+
}
|
|
75
|
+
return values;
|
|
76
|
+
}
|
|
77
|
+
function validateMarkerPaths(installDir, marker) {
|
|
78
|
+
const normalizedInstallDir = normalizePath(installDir);
|
|
79
|
+
const normalizedMarkerDir = normalizePath(marker.installDir);
|
|
80
|
+
if (normalizedInstallDir !== normalizedMarkerDir &&
|
|
81
|
+
!pathsEquivalent(normalizedInstallDir, normalizedMarkerDir)) {
|
|
82
|
+
throw new PlatformCommandError("installation_invalid", `Installation marker installDir (${marker.installDir}) does not match the requested directory (${installDir}). Use --install-dir ${marker.installDir} or repair ${INSTALLATION_MARKER_RELATIVE}.`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function validateMarkerMetadata(marker, installDir, envValues) {
|
|
86
|
+
const expectedProject = deriveComposeProjectName(installDir);
|
|
87
|
+
if (envValues.COMPOSE_PROJECT_NAME !== marker.composeProjectName) {
|
|
88
|
+
throw new PlatformCommandError("installation_invalid", `Compose project name in .env (${envValues.COMPOSE_PROJECT_NAME}) does not match installation marker (${marker.composeProjectName}).`);
|
|
89
|
+
}
|
|
90
|
+
if (expectedProject !== marker.composeProjectName) {
|
|
91
|
+
throw new PlatformCommandError("installation_invalid", `Installation marker project name (${marker.composeProjectName}) does not match this install directory (expected ${expectedProject}). Repair ${INSTALLATION_MARKER_RELATIVE} or use the correct --install-dir.`);
|
|
92
|
+
}
|
|
93
|
+
if (envValues.OSVA_IMAGE !== marker.imageRef) {
|
|
94
|
+
const upgradeState = await readUpgradeState(installDir);
|
|
95
|
+
if (upgradeState !== undefined && isIncompleteUpgrade(upgradeState)) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
throw new PlatformCommandError("installation_invalid", `Installed image in .env (${envValues.OSVA_IMAGE}) does not match installation marker (${marker.imageRef}). Repair metadata or run \`osva platform upgrade --dry-run\`.`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function normalizePath(value) {
|
|
102
|
+
return path.resolve(value).replace(/\\/g, "/").toLowerCase();
|
|
103
|
+
}
|
|
104
|
+
function pathsEquivalent(left, right) {
|
|
105
|
+
return (left === right || left.endsWith(`/${right}`) || right.endsWith(`/${left}`));
|
|
106
|
+
}
|
|
107
|
+
async function assertReadableFile(filePath, label) {
|
|
108
|
+
try {
|
|
109
|
+
await access(filePath);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
throw new PlatformCommandError("installation_invalid", `Installation is missing ${label} at ${filePath}.`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=resolve-installation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-installation.js","sourceRoot":"","sources":["../../src/platform/resolve-installation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Long-running OSVA application services (excludes one-shot migrate/bootstrap jobs). */
|
|
2
|
+
export declare const PLATFORM_APPLICATION_SERVICES: readonly ["web", "worker", "scheduler", "workflow-orchestrator", "knowledge-worker", "mcp-server", "console"];
|
|
3
|
+
export declare const PLATFORM_DATA_SERVICES: readonly ["postgres", "valkey"];
|
|
4
|
+
export declare const PLATFORM_LIFECYCLE_SERVICES: readonly ["postgres", "valkey", "web", "worker", "scheduler", "workflow-orchestrator", "knowledge-worker", "mcp-server", "console"];
|
|
5
|
+
export type PlatformServiceName = (typeof PLATFORM_DATA_SERVICES)[number] | (typeof PLATFORM_APPLICATION_SERVICES)[number] | "migrate";
|
|
6
|
+
export declare const KNOWN_COMPOSE_SERVICES: readonly PlatformServiceName[];
|
|
7
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/platform/services.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,eAAO,MAAM,6BAA6B,+GAQhC,CAAC;AAEX,eAAO,MAAM,sBAAsB,iCAAkC,CAAC;AAEtE,eAAO,MAAM,2BAA2B,qIAG9B,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC3B,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,GACvC,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,GAC9C,SAAS,CAAC;AAEd,eAAO,MAAM,sBAAsB,EAAE,SAAS,mBAAmB,EAIhE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Long-running OSVA application services (excludes one-shot migrate/bootstrap jobs). */
|
|
2
|
+
export const PLATFORM_APPLICATION_SERVICES = [
|
|
3
|
+
"web",
|
|
4
|
+
"worker",
|
|
5
|
+
"scheduler",
|
|
6
|
+
"workflow-orchestrator",
|
|
7
|
+
"knowledge-worker",
|
|
8
|
+
"mcp-server",
|
|
9
|
+
"console",
|
|
10
|
+
];
|
|
11
|
+
export const PLATFORM_DATA_SERVICES = ["postgres", "valkey"];
|
|
12
|
+
export const PLATFORM_LIFECYCLE_SERVICES = [
|
|
13
|
+
...PLATFORM_DATA_SERVICES,
|
|
14
|
+
...PLATFORM_APPLICATION_SERVICES,
|
|
15
|
+
];
|
|
16
|
+
export const KNOWN_COMPOSE_SERVICES = [
|
|
17
|
+
...PLATFORM_DATA_SERVICES,
|
|
18
|
+
"migrate",
|
|
19
|
+
...PLATFORM_APPLICATION_SERVICES,
|
|
20
|
+
];
|
|
21
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/platform/services.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,KAAK;IACL,QAAQ;IACR,WAAW;IACX,uBAAuB;IACvB,kBAAkB;IAClB,YAAY;IACZ,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAU,CAAC;AAEtE,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,GAAG,sBAAsB;IACzB,GAAG,6BAA6B;CACxB,CAAC;AAOX,MAAM,CAAC,MAAM,sBAAsB,GAAmC;IACpE,GAAG,sBAAsB;IACzB,SAAS;IACT,GAAG,6BAA6B;CACjC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProbeSpawnFn } from "../setup/probe-spawn.js";
|
|
2
|
+
import type { PlatformStatusReport, ResolvedInstallation } from "./types.js";
|
|
3
|
+
export declare function collectPlatformStatus(installation: ResolvedInstallation, deps?: {
|
|
4
|
+
readonly fetch?: typeof fetch;
|
|
5
|
+
readonly spawn?: ProbeSpawnFn;
|
|
6
|
+
}): Promise<PlatformStatusReport>;
|
|
7
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/platform/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAQ5D,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,oBAAoB,EAClC,IAAI,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAO,GAC1E,OAAO,CAAC,oBAAoB,CAAC,CAmE/B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { inspectComposeServices, migrateJobCompleted, } from "./compose-inspect.js";
|
|
2
|
+
import { probeInstallationReadiness } from "./readiness.js";
|
|
3
|
+
import { KNOWN_COMPOSE_SERVICES } from "./services.js";
|
|
4
|
+
import { isIncompleteUpgrade, readUpgradeState } from "./upgrade/state.js";
|
|
5
|
+
export async function collectPlatformStatus(installation, deps = {}) {
|
|
6
|
+
const upgradeState = await readUpgradeState(installation.installDir);
|
|
7
|
+
const services = inspectComposeServices(installation.execCtx, deps.spawn);
|
|
8
|
+
const readiness = await probeInstallationReadiness(installation, deps.fetch ?? fetch);
|
|
9
|
+
const problems = [];
|
|
10
|
+
if (isIncompleteUpgrade(upgradeState)) {
|
|
11
|
+
problems.push(`Platform upgrade state: ${upgradeState.phase}${upgradeState.lastError === undefined ? "" : ` (${upgradeState.lastError})`}.`);
|
|
12
|
+
}
|
|
13
|
+
for (const expected of KNOWN_COMPOSE_SERVICES) {
|
|
14
|
+
if (!services.some((service) => service.name === expected)) {
|
|
15
|
+
problems.push(`Missing Compose service record for '${expected}'.`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const migrateCompleted = migrateJobCompleted(services);
|
|
19
|
+
if (migrateCompleted === false) {
|
|
20
|
+
problems.push("Database migration job has not completed successfully; platform applications may fail to start.");
|
|
21
|
+
}
|
|
22
|
+
for (const service of services) {
|
|
23
|
+
if (service.state === "unhealthy" ||
|
|
24
|
+
(service.state === "running" &&
|
|
25
|
+
service.name !== "migrate" &&
|
|
26
|
+
service.statusText.toLowerCase().includes("health") &&
|
|
27
|
+
!service.statusText.toLowerCase().includes("healthy"))) {
|
|
28
|
+
problems.push(`Service '${service.name}' is unhealthy (${service.statusText}).`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!readiness.apiHealthOk) {
|
|
32
|
+
problems.push("Control plane /health is not OK.");
|
|
33
|
+
}
|
|
34
|
+
if (!readiness.apiReadyOk) {
|
|
35
|
+
const detail = readiness.apiReadyDetail === undefined
|
|
36
|
+
? ""
|
|
37
|
+
: `: ${readiness.apiReadyDetail}`;
|
|
38
|
+
problems.push(`Control plane /ready is not OK${detail}.`);
|
|
39
|
+
}
|
|
40
|
+
if (!readiness.consoleReady) {
|
|
41
|
+
problems.push(`Console is not reachable at ${installation.consoleUrl}.`);
|
|
42
|
+
}
|
|
43
|
+
const platformReady = readiness.apiReadyOk && !hasUnhealthyCore(services);
|
|
44
|
+
return {
|
|
45
|
+
installation,
|
|
46
|
+
services,
|
|
47
|
+
platformReady,
|
|
48
|
+
consoleReady: readiness.consoleReady,
|
|
49
|
+
apiHealthOk: readiness.apiHealthOk,
|
|
50
|
+
apiReadyOk: readiness.apiReadyOk,
|
|
51
|
+
problems,
|
|
52
|
+
upgradeState,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function hasUnhealthyCore(services) {
|
|
56
|
+
const core = new Set(["postgres", "valkey", "web", "worker"]);
|
|
57
|
+
return services.some((service) => core.has(service.name) &&
|
|
58
|
+
(service.state === "unhealthy" || service.state === "stopped"));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/platform/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { InstallationMarker } from "../setup/installation-state.js";
|
|
2
|
+
import type { UpgradeState } from "./upgrade/state.js";
|
|
3
|
+
import type { InstallEnvValues } from "../setup/env-file.js";
|
|
4
|
+
import type { ComposeExecContext } from "../setup/compose-exec.js";
|
|
5
|
+
export type ServiceRuntimeState = "stopped" | "starting" | "running" | "healthy" | "unhealthy" | "unknown";
|
|
6
|
+
export interface ComposeServiceSnapshot {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly state: ServiceRuntimeState;
|
|
9
|
+
readonly statusText: string;
|
|
10
|
+
readonly health: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface ResolvedInstallation {
|
|
13
|
+
readonly installDir: string;
|
|
14
|
+
readonly marker: InstallationMarker;
|
|
15
|
+
readonly envValues: InstallEnvValues;
|
|
16
|
+
readonly envPath: string;
|
|
17
|
+
readonly composePath: string;
|
|
18
|
+
readonly execCtx: ComposeExecContext;
|
|
19
|
+
readonly webUrl: string;
|
|
20
|
+
readonly mcpUrl: string;
|
|
21
|
+
readonly consoleUrl: string;
|
|
22
|
+
}
|
|
23
|
+
export interface PlatformStatusReport {
|
|
24
|
+
readonly installation: ResolvedInstallation;
|
|
25
|
+
readonly services: readonly ComposeServiceSnapshot[];
|
|
26
|
+
readonly platformReady: boolean;
|
|
27
|
+
readonly consoleReady: boolean;
|
|
28
|
+
readonly apiHealthOk: boolean;
|
|
29
|
+
readonly apiReadyOk: boolean;
|
|
30
|
+
readonly problems: readonly string[];
|
|
31
|
+
readonly upgradeState: UpgradeState | undefined;
|
|
32
|
+
}
|
|
33
|
+
export declare class PlatformCommandError extends Error {
|
|
34
|
+
readonly code: "usage" | "installation_missing" | "installation_invalid" | "env_conflict" | "docker_unavailable" | "compose_failed" | "platform_not_ready";
|
|
35
|
+
constructor(code: PlatformCommandError["code"], message: string);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|