@osva-ai/cli 1.1.0-rc.1 → 1.1.0-rc.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/README.md +178 -0
- package/dist/bin/osva.js +83 -5
- package/dist/bin/osva.js.map +1 -1
- package/dist/commands/index.js +13 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/doctor/format.d.ts +4 -0
- package/dist/doctor/format.d.ts.map +1 -0
- package/dist/doctor/format.js +18 -0
- package/dist/doctor/format.js.map +1 -0
- package/dist/doctor/http-probe.d.ts +17 -0
- package/dist/doctor/http-probe.d.ts.map +1 -0
- package/dist/doctor/http-probe.js +104 -0
- package/dist/doctor/http-probe.js.map +1 -0
- package/dist/doctor/index.d.ts +7 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +15 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/read-env.d.ts +3 -0
- package/dist/doctor/read-env.d.ts.map +1 -0
- package/dist/doctor/read-env.js +27 -0
- package/dist/doctor/read-env.js.map +1 -0
- package/dist/doctor/redact.d.ts +2 -0
- package/dist/doctor/redact.d.ts.map +1 -0
- package/dist/doctor/redact.js +10 -0
- package/dist/doctor/redact.js.map +1 -0
- package/dist/doctor/run-doctor.d.ts +6 -0
- package/dist/doctor/run-doctor.d.ts.map +1 -0
- package/dist/doctor/run-doctor.js +250 -0
- package/dist/doctor/run-doctor.js.map +1 -0
- package/dist/doctor/types.d.ts +22 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/exit.d.ts +7 -0
- package/dist/exit.d.ts.map +1 -0
- package/dist/exit.js +9 -0
- package/dist/exit.js.map +1 -0
- package/dist/init/index.d.ts +7 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +40 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/resolve-target.d.ts +2 -0
- package/dist/init/resolve-target.d.ts.map +1 -0
- package/dist/init/resolve-target.js +15 -0
- package/dist/init/resolve-target.js.map +1 -0
- package/dist/init/run-init.d.ts +6 -0
- package/dist/init/run-init.d.ts.map +1 -0
- package/dist/init/run-init.js +34 -0
- package/dist/init/run-init.js.map +1 -0
- package/dist/init/scaffold.d.ts +6 -0
- package/dist/init/scaffold.d.ts.map +1 -0
- package/dist/init/scaffold.js +66 -0
- package/dist/init/scaffold.js.map +1 -0
- package/dist/init/template-root.d.ts +3 -0
- package/dist/init/template-root.d.ts.map +1 -0
- package/dist/init/template-root.js +8 -0
- package/dist/init/template-root.js.map +1 -0
- package/dist/init/template-vars.d.ts +4 -0
- package/dist/init/template-vars.d.ts.map +1 -0
- package/dist/init/template-vars.js +18 -0
- package/dist/init/template-vars.js.map +1 -0
- package/dist/init/types.d.ts +18 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +2 -0
- package/dist/init/types.js.map +1 -0
- package/dist/init/validate-project-name.d.ts +3 -0
- package/dist/init/validate-project-name.d.ts.map +1 -0
- package/dist/init/validate-project-name.js +26 -0
- package/dist/init/validate-project-name.js.map +1 -0
- package/dist/project/compose-volume.d.ts +11 -0
- package/dist/project/compose-volume.d.ts.map +1 -0
- package/dist/project/compose-volume.js +66 -0
- package/dist/project/compose-volume.js.map +1 -0
- package/dist/project/deploy-env.d.ts +12 -0
- package/dist/project/deploy-env.d.ts.map +1 -0
- package/dist/project/deploy-env.js +50 -0
- package/dist/project/deploy-env.js.map +1 -0
- package/dist/project/ensure-agent-version.d.ts +17 -0
- package/dist/project/ensure-agent-version.d.ts.map +1 -0
- package/dist/project/ensure-agent-version.js +105 -0
- package/dist/project/ensure-agent-version.js.map +1 -0
- package/dist/project/errors.d.ts +10 -0
- package/dist/project/errors.d.ts.map +1 -0
- package/dist/project/errors.js +19 -0
- package/dist/project/errors.js.map +1 -0
- package/dist/project/format.d.ts +42 -0
- package/dist/project/format.d.ts.map +1 -0
- package/dist/project/format.js +66 -0
- package/dist/project/format.js.map +1 -0
- package/dist/project/index.d.ts +5 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +101 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/install-trusted-runtime.d.ts +14 -0
- package/dist/project/install-trusted-runtime.d.ts.map +1 -0
- package/dist/project/install-trusted-runtime.js +82 -0
- package/dist/project/install-trusted-runtime.js.map +1 -0
- package/dist/project/load-manifest.d.ts +3 -0
- package/dist/project/load-manifest.d.ts.map +1 -0
- package/dist/project/load-manifest.js +13 -0
- package/dist/project/load-manifest.js.map +1 -0
- package/dist/project/manifest.d.ts +4 -0
- package/dist/project/manifest.d.ts.map +1 -0
- package/dist/project/manifest.js +12 -0
- package/dist/project/manifest.js.map +1 -0
- package/dist/project/parse-run-input.d.ts +6 -0
- package/dist/project/parse-run-input.d.ts.map +1 -0
- package/dist/project/parse-run-input.js +43 -0
- package/dist/project/parse-run-input.js.map +1 -0
- package/dist/project/poll.d.ts +15 -0
- package/dist/project/poll.d.ts.map +1 -0
- package/dist/project/poll.js +32 -0
- package/dist/project/poll.js.map +1 -0
- package/dist/project/run-deploy.d.ts +16 -0
- package/dist/project/run-deploy.d.ts.map +1 -0
- package/dist/project/run-deploy.js +142 -0
- package/dist/project/run-deploy.js.map +1 -0
- package/dist/project/run-run.d.ts +17 -0
- package/dist/project/run-run.d.ts.map +1 -0
- package/dist/project/run-run.js +203 -0
- package/dist/project/run-run.js.map +1 -0
- package/dist/project/run-status.d.ts +15 -0
- package/dist/project/run-status.d.ts.map +1 -0
- package/dist/project/run-status.js +122 -0
- package/dist/project/run-status.js.map +1 -0
- package/dist/project/sdk-error.d.ts +10 -0
- package/dist/project/sdk-error.d.ts.map +1 -0
- package/dist/project/sdk-error.js +49 -0
- package/dist/project/sdk-error.js.map +1 -0
- package/dist/project/state.d.ts +28 -0
- package/dist/project/state.d.ts.map +1 -0
- package/dist/project/state.js +54 -0
- package/dist/project/state.js.map +1 -0
- package/dist/project/workspace-context.d.ts +6 -0
- package/dist/project/workspace-context.d.ts.map +1 -0
- package/dist/project/workspace-context.js +25 -0
- package/dist/project/workspace-context.js.map +1 -0
- package/dist/stdout.d.ts +3 -0
- package/dist/stdout.d.ts.map +1 -0
- package/dist/stdout.js +27 -0
- package/dist/stdout.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/validate/canonical-json.d.ts +2 -0
- package/dist/validate/canonical-json.d.ts.map +1 -0
- package/dist/validate/canonical-json.js +17 -0
- package/dist/validate/canonical-json.js.map +1 -0
- package/dist/validate/exit-code.d.ts +3 -0
- package/dist/validate/exit-code.d.ts.map +1 -0
- package/dist/validate/exit-code.js +4 -0
- package/dist/validate/exit-code.js.map +1 -0
- package/dist/validate/format.d.ts +4 -0
- package/dist/validate/format.d.ts.map +1 -0
- package/dist/validate/format.js +23 -0
- package/dist/validate/format.js.map +1 -0
- package/dist/validate/index.d.ts +6 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +29 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/integrity.d.ts +4 -0
- package/dist/validate/integrity.d.ts.map +1 -0
- package/dist/validate/integrity.js +24 -0
- package/dist/validate/integrity.js.map +1 -0
- package/dist/validate/json-schema-draft.d.ts +8 -0
- package/dist/validate/json-schema-draft.d.ts.map +1 -0
- package/dist/validate/json-schema-draft.js +32 -0
- package/dist/validate/json-schema-draft.js.map +1 -0
- package/dist/validate/project-config.d.ts +24 -0
- package/dist/validate/project-config.d.ts.map +1 -0
- package/dist/validate/project-config.js +27 -0
- package/dist/validate/project-config.js.map +1 -0
- package/dist/validate/resolve-project-dir.d.ts +12 -0
- package/dist/validate/resolve-project-dir.d.ts.map +1 -0
- package/dist/validate/resolve-project-dir.js +27 -0
- package/dist/validate/resolve-project-dir.js.map +1 -0
- package/dist/validate/run-validate.d.ts +3 -0
- package/dist/validate/run-validate.d.ts.map +1 -0
- package/dist/validate/run-validate.js +278 -0
- package/dist/validate/run-validate.js.map +1 -0
- package/dist/validate/safe-path.d.ts +4 -0
- package/dist/validate/safe-path.d.ts.map +1 -0
- package/dist/validate/safe-path.js +42 -0
- package/dist/validate/safe-path.js.map +1 -0
- package/dist/validate/types.d.ts +14 -0
- package/dist/validate/types.d.ts.map +1 -0
- package/dist/validate/types.js +2 -0
- package/dist/validate/types.js.map +1 -0
- package/package.json +6 -3
- package/templates/agent-typescript/.gitignore +4 -0
- package/templates/agent-typescript/README.md.template +56 -0
- package/templates/agent-typescript/agent/agent.ts.template +25 -0
- package/templates/agent-typescript/contracts/input.v1.schema.json +12 -0
- package/templates/agent-typescript/contracts/output.v1.schema.json +12 -0
- package/templates/agent-typescript/osva-agent.project.json.template +21 -0
- package/templates/agent-typescript/package.json.template +16 -0
- package/templates/agent-typescript/scripts/build-manifest.mjs +53 -0
- package/templates/agent-typescript/tsconfig.json +19 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DoctorProbeOptions, DoctorReport, DoctorEnv } from "./types.js";
|
|
2
|
+
export declare const REQUIRED_NODE_MAJOR = 24;
|
|
3
|
+
export declare const DEFAULT_PROBE_TIMEOUT_MS = 5000;
|
|
4
|
+
export declare function runDoctorPipeline(env: DoctorEnv, options?: DoctorProbeOptions): Promise<DoctorReport>;
|
|
5
|
+
export declare function doctorExitCode(report: DoctorReport): number;
|
|
6
|
+
//# sourceMappingURL=run-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-doctor.d.ts","sourceRoot":"","sources":["../../src/doctor/run-doctor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,SAAS,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,YAAY,CAAC,CAqGvB;AAuXD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE3D"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { CLI_VERSION } from "../version.js";
|
|
2
|
+
import { createFetchProbeTransport, createNodeProbeTransport, } from "./http-probe.js";
|
|
3
|
+
import { redactSecrets } from "./redact.js";
|
|
4
|
+
export const REQUIRED_NODE_MAJOR = 24;
|
|
5
|
+
export const DEFAULT_PROBE_TIMEOUT_MS = 5_000;
|
|
6
|
+
export async function runDoctorPipeline(env, options = {}) {
|
|
7
|
+
const probeTimeoutMs = options.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;
|
|
8
|
+
const transport = options.fetch === undefined
|
|
9
|
+
? createNodeProbeTransport(probeTimeoutMs)
|
|
10
|
+
: createFetchProbeTransport(options.fetch, probeTimeoutMs);
|
|
11
|
+
const checks = [];
|
|
12
|
+
checks.push(checkNodeRuntime());
|
|
13
|
+
checks.push(checkCliVersion());
|
|
14
|
+
const baseUrlCheck = checkBaseUrl(env.baseUrl);
|
|
15
|
+
checks.push(baseUrlCheck);
|
|
16
|
+
const normalizedBaseUrl = baseUrlCheck.status === "PASS" ? normalizeBaseUrl(env.baseUrl) : undefined;
|
|
17
|
+
if (normalizedBaseUrl === undefined) {
|
|
18
|
+
checks.push(skipCheck("api_reachability", "No valid OSVA_BASE_URL configured."));
|
|
19
|
+
checks.push(skipCheck("control_plane_ready", "No valid OSVA_BASE_URL configured."));
|
|
20
|
+
checks.push(env.apiKey === undefined
|
|
21
|
+
? skipCheck("api_key", "Skipped because OSVA_BASE_URL is not configured.")
|
|
22
|
+
: warnCheck("api_key", "OSVA_API_KEY is set but OSVA_BASE_URL is missing.", "Set OSVA_BASE_URL or pass --base-url to the control plane URL."));
|
|
23
|
+
checks.push(skipCheck("authentication", "No valid OSVA_BASE_URL configured."));
|
|
24
|
+
checks.push(skipCheck("workspace_access", "No valid OSVA_BASE_URL configured."));
|
|
25
|
+
return finalizeReport(checks);
|
|
26
|
+
}
|
|
27
|
+
const reachability = await probeHealth(normalizedBaseUrl, transport);
|
|
28
|
+
checks.push(reachability);
|
|
29
|
+
if (reachability.status !== "PASS") {
|
|
30
|
+
checks.push(skipCheck("control_plane_ready", "Skipped because the control plane endpoint is not reachable."));
|
|
31
|
+
checks.push(apiKeyCheck(env.apiKey));
|
|
32
|
+
checks.push(skipCheck("authentication", "Skipped because the control plane is unreachable."));
|
|
33
|
+
checks.push(skipCheck("workspace_access", "Skipped because the control plane is unreachable."));
|
|
34
|
+
return finalizeReport(checks);
|
|
35
|
+
}
|
|
36
|
+
checks.push(await probeReady(normalizedBaseUrl, transport));
|
|
37
|
+
const apiKeyResult = apiKeyCheck(env.apiKey);
|
|
38
|
+
checks.push(apiKeyResult);
|
|
39
|
+
if (env.apiKey === undefined) {
|
|
40
|
+
checks.push(skipCheck("authentication", "OSVA_API_KEY is not set; cannot verify credentials."));
|
|
41
|
+
checks.push(skipCheck("workspace_access", "OSVA_API_KEY is not set; cannot verify workspace access."));
|
|
42
|
+
return finalizeReport(checks);
|
|
43
|
+
}
|
|
44
|
+
checks.push(...(await evaluateAuthAndWorkspace(normalizedBaseUrl, env.apiKey, env.workspaceId, transport)));
|
|
45
|
+
return finalizeReport(checks);
|
|
46
|
+
}
|
|
47
|
+
function checkNodeRuntime() {
|
|
48
|
+
const version = process.version;
|
|
49
|
+
const match = /^v(\d+)\./.exec(version);
|
|
50
|
+
const major = match === null ? NaN : Number.parseInt(match[1], 10);
|
|
51
|
+
if (Number.isFinite(major) && major >= REQUIRED_NODE_MAJOR) {
|
|
52
|
+
return passCheck("node_runtime", `Node.js ${version} satisfies >=${String(REQUIRED_NODE_MAJOR)}.`);
|
|
53
|
+
}
|
|
54
|
+
return failCheck("node_runtime", `Node.js ${version} does not satisfy >=${String(REQUIRED_NODE_MAJOR)}.`, `Install Node.js ${String(REQUIRED_NODE_MAJOR)} or newer (see packages/cli engines).`);
|
|
55
|
+
}
|
|
56
|
+
function checkCliVersion() {
|
|
57
|
+
return passCheck("cli_version", `OSVA CLI ${CLI_VERSION}.`);
|
|
58
|
+
}
|
|
59
|
+
function checkBaseUrl(baseUrl) {
|
|
60
|
+
if (baseUrl === undefined || baseUrl.trim().length === 0) {
|
|
61
|
+
return failCheck("base_url", "OSVA_BASE_URL is not set.", "Export OSVA_BASE_URL (or pass --base-url) to your control plane, e.g. http://127.0.0.1:8080.");
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const url = new URL(baseUrl);
|
|
65
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
66
|
+
return failCheck("base_url", `OSVA_BASE_URL must use http or https (got ${url.protocol}).`, "Use a full URL such as http://127.0.0.1:8080.");
|
|
67
|
+
}
|
|
68
|
+
if (url.username.length > 0 || url.password.length > 0) {
|
|
69
|
+
return failCheck("base_url", "OSVA_BASE_URL must not embed credentials.", "Remove userinfo from the URL and set OSVA_API_KEY separately.");
|
|
70
|
+
}
|
|
71
|
+
return passCheck("base_url", `OSVA_BASE_URL is ${normalizeBaseUrl(baseUrl)}.`);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return failCheck("base_url", "OSVA_BASE_URL is not a valid URL.", "Use a full URL such as http://127.0.0.1:8080.");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function apiKeyCheck(apiKey) {
|
|
78
|
+
if (apiKey === undefined) {
|
|
79
|
+
return warnCheck("api_key", "OSVA_API_KEY is not set.", "Create or copy an API key from your OSVA workspace bootstrap output and export OSVA_API_KEY.");
|
|
80
|
+
}
|
|
81
|
+
if (!apiKey.startsWith("osva_ak_")) {
|
|
82
|
+
return warnCheck("api_key", "OSVA_API_KEY is set but does not look like an OSVA API key.", "Expected a value starting with osva_ak_.");
|
|
83
|
+
}
|
|
84
|
+
return passCheck("api_key", "OSVA_API_KEY is set.");
|
|
85
|
+
}
|
|
86
|
+
async function probeHealth(baseUrl, transport) {
|
|
87
|
+
const result = await transport.getJson(`${baseUrl}/health`);
|
|
88
|
+
if (result.kind === "transport") {
|
|
89
|
+
return failCheck("api_reachability", redactSecrets(`Control plane is unreachable at ${baseUrl}.`), "Start the web process (Compose, Helm, or pnpm dev:web) and confirm OSVA_BASE_URL.");
|
|
90
|
+
}
|
|
91
|
+
if (result.kind === "timeout") {
|
|
92
|
+
return failCheck("api_reachability", redactSecrets(`Timed out reaching ${baseUrl}/health.`), "Check network connectivity, firewalls, and that the control plane is listening.");
|
|
93
|
+
}
|
|
94
|
+
if (result.status !== 200) {
|
|
95
|
+
return failCheck("api_reachability", `GET /health returned HTTP ${String(result.status)}.`, "Confirm OSVA_BASE_URL points at the OSVA web control plane.");
|
|
96
|
+
}
|
|
97
|
+
const status = typeof result.body === "object" &&
|
|
98
|
+
result.body !== null &&
|
|
99
|
+
"status" in result.body &&
|
|
100
|
+
result.body.status;
|
|
101
|
+
if (status !== "ok") {
|
|
102
|
+
return warnCheck("api_reachability", "GET /health succeeded but the response was unexpected.", "The host may not be an OSVA control plane.");
|
|
103
|
+
}
|
|
104
|
+
return passCheck("api_reachability", "GET /health returned HTTP 200.");
|
|
105
|
+
}
|
|
106
|
+
async function probeReady(baseUrl, transport) {
|
|
107
|
+
const result = await transport.getJson(`${baseUrl}/ready`);
|
|
108
|
+
if (result.kind === "transport") {
|
|
109
|
+
return failCheck("control_plane_ready", redactSecrets(`Could not reach ${baseUrl}/ready.`), "Verify the control plane is running.");
|
|
110
|
+
}
|
|
111
|
+
if (result.kind === "timeout") {
|
|
112
|
+
return failCheck("control_plane_ready", "Timed out on GET /ready.", "Check dependency connectivity to the web process.");
|
|
113
|
+
}
|
|
114
|
+
if (result.status === 200) {
|
|
115
|
+
return passCheck("control_plane_ready", "GET /ready returned HTTP 200 (PostgreSQL and Valkey reachable).");
|
|
116
|
+
}
|
|
117
|
+
if (result.status === 503) {
|
|
118
|
+
const detail = readyFailureDetail(result.body);
|
|
119
|
+
return failCheck("control_plane_ready", `GET /ready returned HTTP 503${detail}.`, "Ensure PostgreSQL and Valkey are running and reachable from the web process (see deploy/compose or RUNBOOK.md).");
|
|
120
|
+
}
|
|
121
|
+
return failCheck("control_plane_ready", `GET /ready returned HTTP ${String(result.status)}.`, "Inspect web logs and dependency configuration.");
|
|
122
|
+
}
|
|
123
|
+
function readyFailureDetail(body) {
|
|
124
|
+
if (typeof body !== "object" || body === null) {
|
|
125
|
+
return "";
|
|
126
|
+
}
|
|
127
|
+
const failed = body.failedDependency;
|
|
128
|
+
if (typeof failed === "string" && failed.length > 0) {
|
|
129
|
+
return ` (${failed})`;
|
|
130
|
+
}
|
|
131
|
+
const failedMany = body
|
|
132
|
+
.failedDependencies;
|
|
133
|
+
if (Array.isArray(failedMany) && failedMany.length > 0) {
|
|
134
|
+
return ` (${failedMany.map(String).join(", ")})`;
|
|
135
|
+
}
|
|
136
|
+
return "";
|
|
137
|
+
}
|
|
138
|
+
async function evaluateAuthAndWorkspace(baseUrl, apiKey, configuredWorkspaceId, transport) {
|
|
139
|
+
const result = await transport.getJson(`${baseUrl}/v1/auth/context`, {
|
|
140
|
+
authorization: `Bearer ${apiKey}`,
|
|
141
|
+
});
|
|
142
|
+
const authCheck = mapAuthProbeResult(result);
|
|
143
|
+
if (authCheck.status !== "PASS") {
|
|
144
|
+
const workspaceCheck = configuredWorkspaceId === undefined
|
|
145
|
+
? skipCheck("workspace_access", "OSVA_WORKSPACE_ID is not set; workspace scoping is derived from the API key.")
|
|
146
|
+
: failCheck("workspace_access", "Skipped workspace verification because authentication failed.", "Fix OSVA_API_KEY and rerun osva doctor.");
|
|
147
|
+
if (authCheck.id !== "authentication") {
|
|
148
|
+
return [
|
|
149
|
+
failCheck("authentication", authCheck.message, authCheck.remediation ??
|
|
150
|
+
"Verify OSVA_API_KEY and control-plane availability."),
|
|
151
|
+
workspaceCheck,
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
return [authCheck, workspaceCheck];
|
|
155
|
+
}
|
|
156
|
+
const context = parseAuthContext(result.kind === "ok" ? result.body : null);
|
|
157
|
+
if (context === null) {
|
|
158
|
+
return [
|
|
159
|
+
failCheck("authentication", "GET /v1/auth/context returned an unexpected body.", "Confirm OSVA_BASE_URL points at an OSVA control plane."),
|
|
160
|
+
configuredWorkspaceId === undefined
|
|
161
|
+
? skipCheck("workspace_access", "OSVA_WORKSPACE_ID is not set; workspace scoping is derived from the API key.")
|
|
162
|
+
: failCheck("workspace_access", "Skipped workspace verification because authentication response was invalid.", "Fix control-plane connectivity and rerun osva doctor."),
|
|
163
|
+
];
|
|
164
|
+
}
|
|
165
|
+
const authentication = passCheck("authentication", `API key is valid (workspace ${context.workspaceId}, role ${context.role}).`);
|
|
166
|
+
if (configuredWorkspaceId === undefined) {
|
|
167
|
+
return [
|
|
168
|
+
authentication,
|
|
169
|
+
skipCheck("workspace_access", "OSVA_WORKSPACE_ID is not set; workspace scoping is derived from the API key."),
|
|
170
|
+
];
|
|
171
|
+
}
|
|
172
|
+
if (context.workspaceId === configuredWorkspaceId) {
|
|
173
|
+
return [
|
|
174
|
+
authentication,
|
|
175
|
+
passCheck("workspace_access", `OSVA_WORKSPACE_ID matches the authenticated workspace (${context.workspaceId}).`),
|
|
176
|
+
];
|
|
177
|
+
}
|
|
178
|
+
return [
|
|
179
|
+
authentication,
|
|
180
|
+
failCheck("workspace_access", `OSVA_WORKSPACE_ID (${configuredWorkspaceId}) does not match the API key workspace (${context.workspaceId}).`, "Use the workspace from bootstrap output or unset OSVA_WORKSPACE_ID for CLI-only usage."),
|
|
181
|
+
];
|
|
182
|
+
}
|
|
183
|
+
function mapAuthProbeResult(result) {
|
|
184
|
+
if (result.kind === "transport") {
|
|
185
|
+
return failCheck("authentication", "OSVA API transport failed.", "Verify OSVA_BASE_URL and that /v1 routes are reachable.");
|
|
186
|
+
}
|
|
187
|
+
if (result.kind === "timeout") {
|
|
188
|
+
return failCheck("authentication", "OSVA API request timed out.", "Increase network stability or check control-plane load.");
|
|
189
|
+
}
|
|
190
|
+
if (result.status === 401) {
|
|
191
|
+
return failCheck("authentication", "API key was rejected (HTTP 401 AUTHENTICATION_REQUIRED).", "Verify OSVA_API_KEY matches a key issued for this OSVA installation.");
|
|
192
|
+
}
|
|
193
|
+
if (result.status === 503) {
|
|
194
|
+
return failCheck("authentication", "Authentication could not be verified (HTTP 503 SERVICE_UNAVAILABLE).", "The rate-limit store may be unavailable; retry after Valkey is healthy.");
|
|
195
|
+
}
|
|
196
|
+
if (result.status !== 200) {
|
|
197
|
+
const domain = typeof result.body === "object" &&
|
|
198
|
+
result.body !== null &&
|
|
199
|
+
"status" in result.body &&
|
|
200
|
+
typeof result.body.status === "string"
|
|
201
|
+
? result.body.status
|
|
202
|
+
: "error";
|
|
203
|
+
return failCheck("authentication", redactSecrets(`Authenticated request failed with HTTP ${String(result.status)} (${domain}).`), "Inspect control-plane logs using the request ID when available.");
|
|
204
|
+
}
|
|
205
|
+
return passCheck("authentication", "API key is valid.");
|
|
206
|
+
}
|
|
207
|
+
function parseAuthContext(body) {
|
|
208
|
+
if (typeof body !== "object" || body === null) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
const record = body;
|
|
212
|
+
if (typeof record.subjectId === "string" &&
|
|
213
|
+
record.subjectId.length > 0 &&
|
|
214
|
+
typeof record.workspaceId === "string" &&
|
|
215
|
+
record.workspaceId.length > 0 &&
|
|
216
|
+
typeof record.role === "string" &&
|
|
217
|
+
record.role.length > 0) {
|
|
218
|
+
return {
|
|
219
|
+
subjectId: record.subjectId,
|
|
220
|
+
workspaceId: record.workspaceId,
|
|
221
|
+
role: record.role,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
function normalizeBaseUrl(baseUrl) {
|
|
227
|
+
return baseUrl.trim().replace(/\/+$/, "");
|
|
228
|
+
}
|
|
229
|
+
function passCheck(id, message) {
|
|
230
|
+
return { id, status: "PASS", message };
|
|
231
|
+
}
|
|
232
|
+
function warnCheck(id, message, remediation) {
|
|
233
|
+
return { id, status: "WARN", message, remediation };
|
|
234
|
+
}
|
|
235
|
+
function failCheck(id, message, remediation) {
|
|
236
|
+
return { id, status: "FAIL", message, remediation };
|
|
237
|
+
}
|
|
238
|
+
function skipCheck(id, message) {
|
|
239
|
+
return { id, status: "SKIP", message };
|
|
240
|
+
}
|
|
241
|
+
function finalizeReport(checks) {
|
|
242
|
+
const hasFail = checks.some((check) => check.status === "FAIL");
|
|
243
|
+
const hasWarn = checks.some((check) => check.status === "WARN");
|
|
244
|
+
const result = hasFail ? "fail" : hasWarn ? "warn" : "pass";
|
|
245
|
+
return { result, checks };
|
|
246
|
+
}
|
|
247
|
+
export function doctorExitCode(report) {
|
|
248
|
+
return report.result === "fail" ? 1 : 0;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=run-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-doctor.js","sourceRoot":"","sources":["../../src/doctor/run-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type DoctorCheckStatus = "PASS" | "WARN" | "FAIL" | "SKIP";
|
|
2
|
+
export interface DoctorCheck {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly status: DoctorCheckStatus;
|
|
5
|
+
readonly message: string;
|
|
6
|
+
readonly remediation?: string;
|
|
7
|
+
}
|
|
8
|
+
export type DoctorOverallResult = "pass" | "warn" | "fail";
|
|
9
|
+
export interface DoctorReport {
|
|
10
|
+
readonly result: DoctorOverallResult;
|
|
11
|
+
readonly checks: readonly DoctorCheck[];
|
|
12
|
+
}
|
|
13
|
+
export interface DoctorEnv {
|
|
14
|
+
readonly baseUrl?: string;
|
|
15
|
+
readonly apiKey?: string;
|
|
16
|
+
readonly workspaceId?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DoctorProbeOptions {
|
|
19
|
+
readonly fetch?: typeof fetch;
|
|
20
|
+
readonly probeTimeoutMs?: number;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":""}
|
package/dist/exit.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminate the CLI after async I/O. process.exit() on Windows while libuv is
|
|
3
|
+
* closing HTTP handles can abort with UV_HANDLE_CLOSING (Node 24+). Doctor uses
|
|
4
|
+
* node:http with Connection: close; other commands rely on a natural drain.
|
|
5
|
+
*/
|
|
6
|
+
export declare function exitCli(code: number): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=exit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit.d.ts","sourceRoot":"","sources":["../src/exit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD"}
|
package/dist/exit.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminate the CLI after async I/O. process.exit() on Windows while libuv is
|
|
3
|
+
* closing HTTP handles can abort with UV_HANDLE_CLOSING (Node 24+). Doctor uses
|
|
4
|
+
* node:http with Connection: close; other commands rely on a natural drain.
|
|
5
|
+
*/
|
|
6
|
+
export async function exitCli(code) {
|
|
7
|
+
process.exitCode = code;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=exit.js.map
|
package/dist/exit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit.js","sourceRoot":"","sources":["../src/exit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY;IACxC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { InitResult } from "./types.js";
|
|
2
|
+
export { runInit } from "./run-init.js";
|
|
3
|
+
export { validateProjectName } from "./validate-project-name.js";
|
|
4
|
+
export { resolveInitTargetDir } from "./resolve-target.js";
|
|
5
|
+
export { resolveAgentTemplateRoot } from "./template-root.js";
|
|
6
|
+
export declare function runInitCommand(command: readonly string[], flags: Readonly<Record<string, string | boolean>>, cwd?: string): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,wBAAsB,cAAc,CAClC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EACjD,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { writeStdout } from "../stdout.js";
|
|
2
|
+
import { runInit } from "./run-init.js";
|
|
3
|
+
export { runInit } from "./run-init.js";
|
|
4
|
+
export { validateProjectName } from "./validate-project-name.js";
|
|
5
|
+
export { resolveInitTargetDir } from "./resolve-target.js";
|
|
6
|
+
export { resolveAgentTemplateRoot } from "./template-root.js";
|
|
7
|
+
export async function runInitCommand(command, flags, cwd = process.cwd()) {
|
|
8
|
+
void flags.yes;
|
|
9
|
+
const projectName = command[1];
|
|
10
|
+
const result = await runInit({ projectName, cwd });
|
|
11
|
+
const json = flags.json === true;
|
|
12
|
+
if (!result.ok) {
|
|
13
|
+
if (json) {
|
|
14
|
+
await writeStdout(`${JSON.stringify({ ok: false, error: result.error })}\n`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
process.stderr.write(`${result.error}\n`);
|
|
18
|
+
}
|
|
19
|
+
return 1;
|
|
20
|
+
}
|
|
21
|
+
if (json) {
|
|
22
|
+
await writeStdout(`${JSON.stringify(result, null, 2)}\n`);
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
await writeStdout([
|
|
26
|
+
`Created OSVA agent project "${result.projectName}".`,
|
|
27
|
+
"",
|
|
28
|
+
"Next steps:",
|
|
29
|
+
` cd ${result.projectName}`,
|
|
30
|
+
" npm install",
|
|
31
|
+
" npm run build",
|
|
32
|
+
" npm run manifest",
|
|
33
|
+
"",
|
|
34
|
+
" osva deploy",
|
|
35
|
+
' osva run --wait --input \'{"message":"Hello OSVA"}\'',
|
|
36
|
+
"",
|
|
37
|
+
].join("\n"));
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA0B,EAC1B,KAAiD,EACjD,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,KAAK,KAAK,CAAC,GAAG,CAAC;IACf,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;IAEjC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,WAAW,CACf,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAC1D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,WAAW,CACf;QACE,+BAA+B,MAAM,CAAC,WAAW,IAAI;QACrD,EAAE;QACF,aAAa;QACb,QAAQ,MAAM,CAAC,WAAW,EAAE;QAC5B,eAAe;QACf,iBAAiB;QACjB,oBAAoB;QACpB,EAAE;QACF,eAAe;QACf,wDAAwD;QACxD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-target.d.ts","sourceRoot":"","sources":["../../src/init/resolve-target.ts"],"names":[],"mappings":"AAIA,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAe7E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { validateProjectName } from "./validate-project-name.js";
|
|
3
|
+
export function resolveInitTargetDir(cwd, projectName) {
|
|
4
|
+
validateProjectName(projectName);
|
|
5
|
+
const normalizedCwd = path.resolve(cwd);
|
|
6
|
+
const targetDir = path.resolve(normalizedCwd, projectName);
|
|
7
|
+
const relative = path.relative(normalizedCwd, targetDir);
|
|
8
|
+
if (relative.startsWith(`..${path.sep}`) ||
|
|
9
|
+
relative === ".." ||
|
|
10
|
+
path.isAbsolute(relative)) {
|
|
11
|
+
throw new Error("Project directory must stay within the current working directory.");
|
|
12
|
+
}
|
|
13
|
+
return targetDir;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=resolve-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-target.js","sourceRoot":"","sources":["../../src/init/resolve-target.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,WAAmB;IACnE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACzD,IACE,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,QAAQ,KAAK,IAAI;QACjB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EACzB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-init.d.ts","sourceRoot":"","sources":["../../src/init/run-init.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAsB,OAAO,CAAC,KAAK,EAAE;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,UAAU,CAAC,CA2BtB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { resolveInitTargetDir } from "./resolve-target.js";
|
|
3
|
+
import { scaffoldAgentProject } from "./scaffold.js";
|
|
4
|
+
import { buildTemplateVars } from "./template-vars.js";
|
|
5
|
+
import { validateProjectName } from "./validate-project-name.js";
|
|
6
|
+
export async function runInit(input) {
|
|
7
|
+
const projectName = input.projectName?.trim();
|
|
8
|
+
if (projectName === undefined || projectName.length === 0) {
|
|
9
|
+
return {
|
|
10
|
+
ok: false,
|
|
11
|
+
error: "Usage: osva init <project-name> [--yes] [--json]",
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
validateProjectName(projectName);
|
|
16
|
+
const cwd = input.cwd ?? process.cwd();
|
|
17
|
+
const targetDir = resolveInitTargetDir(cwd, projectName);
|
|
18
|
+
const vars = buildTemplateVars(projectName);
|
|
19
|
+
const files = await scaffoldAgentProject({ targetDir, vars });
|
|
20
|
+
return {
|
|
21
|
+
ok: true,
|
|
22
|
+
projectName,
|
|
23
|
+
projectDir: path.resolve(targetDir),
|
|
24
|
+
files,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
error: error instanceof Error ? error.message : "Init failed.",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=run-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-init.js","sourceRoot":"","sources":["../../src/init/run-init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAG7B;IACC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,kDAAkD;SAC1D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO;YACL,EAAE,EAAE,IAAI;YACR,WAAW;YACX,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACnC,KAAK;SACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/init/scaffold.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAsDnD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAuB7B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { renderTemplateString } from "./template-vars.js";
|
|
4
|
+
import { resolveAgentTemplateRoot } from "./template-root.js";
|
|
5
|
+
async function assertTargetAvailable(targetDir) {
|
|
6
|
+
try {
|
|
7
|
+
const entries = await readdir(targetDir);
|
|
8
|
+
if (entries.length > 0) {
|
|
9
|
+
throw new Error(`Refusing to overwrite existing directory: ${targetDir}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (error instanceof Error &&
|
|
14
|
+
"code" in error &&
|
|
15
|
+
error.code === "ENOENT") {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function collectTemplateFiles(templateRoot, relativeDir = "") {
|
|
22
|
+
const absoluteDir = path.join(templateRoot, relativeDir);
|
|
23
|
+
const names = await readdir(absoluteDir);
|
|
24
|
+
const files = [];
|
|
25
|
+
for (const name of names) {
|
|
26
|
+
const relativePath = relativeDir.length === 0 ? name : `${relativeDir}/${name}`;
|
|
27
|
+
const absolutePath = path.join(templateRoot, relativePath);
|
|
28
|
+
const info = await stat(absolutePath);
|
|
29
|
+
if (info.isDirectory()) {
|
|
30
|
+
files.push(...(await collectTemplateFiles(templateRoot, relativePath)));
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
files.push(relativePath.replace(/\\/g, "/"));
|
|
34
|
+
}
|
|
35
|
+
return files;
|
|
36
|
+
}
|
|
37
|
+
function mapTemplateOutputPath(relativePath, vars) {
|
|
38
|
+
if (relativePath === "agent/agent.ts.template") {
|
|
39
|
+
return `agent/${vars.entrypoint.replace(/\.js$/, ".ts")}`;
|
|
40
|
+
}
|
|
41
|
+
if (relativePath.endsWith(".template")) {
|
|
42
|
+
return relativePath.slice(0, -".template".length);
|
|
43
|
+
}
|
|
44
|
+
return relativePath;
|
|
45
|
+
}
|
|
46
|
+
export async function scaffoldAgentProject(input) {
|
|
47
|
+
await assertTargetAvailable(input.targetDir);
|
|
48
|
+
await mkdir(input.targetDir, { recursive: true });
|
|
49
|
+
const templateRoot = resolveAgentTemplateRoot();
|
|
50
|
+
const templateFiles = await collectTemplateFiles(templateRoot);
|
|
51
|
+
const written = [];
|
|
52
|
+
for (const relativePath of templateFiles) {
|
|
53
|
+
const sourcePath = path.join(templateRoot, relativePath);
|
|
54
|
+
const outputRelative = mapTemplateOutputPath(relativePath, input.vars);
|
|
55
|
+
const outputPath = path.join(input.targetDir, outputRelative);
|
|
56
|
+
await mkdir(path.dirname(outputPath), { recursive: true });
|
|
57
|
+
const raw = await readFile(sourcePath, "utf8");
|
|
58
|
+
const contents = relativePath.endsWith(".template")
|
|
59
|
+
? renderTemplateString(raw, input.vars)
|
|
60
|
+
: raw;
|
|
61
|
+
await writeFile(outputPath, contents, { encoding: "utf8", flag: "wx" });
|
|
62
|
+
written.push(outputRelative.replace(/\\/g, "/"));
|
|
63
|
+
}
|
|
64
|
+
return written.sort();
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/init/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-root.d.ts","sourceRoot":"","sources":["../../src/init/template-root.ts"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
const initModuleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
4
|
+
/** Bundled scaffold lives beside compiled `dist/` output. */
|
|
5
|
+
export function resolveAgentTemplateRoot() {
|
|
6
|
+
return path.resolve(initModuleDir, "../../templates/agent-typescript");
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=template-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-root.js","sourceRoot":"","sources":["../../src/init/template-root.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEnE,6DAA6D;AAC7D,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { InitTemplateVars } from "./types.js";
|
|
2
|
+
export declare function buildTemplateVars(projectName: string): InitTemplateVars;
|
|
3
|
+
export declare function renderTemplateString(source: string, vars: InitTemplateVars): string;
|
|
4
|
+
//# sourceMappingURL=template-vars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-vars.d.ts","sourceRoot":"","sources":["../../src/init/template-vars.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAQvE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,GACrB,MAAM,CAMR"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { displayNameFromProjectName } from "./validate-project-name.js";
|
|
2
|
+
export function buildTemplateVars(projectName) {
|
|
3
|
+
const entrypoint = `${projectName}.js`;
|
|
4
|
+
return {
|
|
5
|
+
agentKey: projectName,
|
|
6
|
+
agentName: displayNameFromProjectName(projectName),
|
|
7
|
+
packageName: projectName,
|
|
8
|
+
entrypoint,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function renderTemplateString(source, vars) {
|
|
12
|
+
return source
|
|
13
|
+
.replaceAll("{{AGENT_KEY}}", vars.agentKey)
|
|
14
|
+
.replaceAll("{{AGENT_NAME}}", vars.agentName)
|
|
15
|
+
.replaceAll("{{PACKAGE_NAME}}", vars.packageName)
|
|
16
|
+
.replaceAll("{{ENTRYPOINT}}", vars.entrypoint);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=template-vars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-vars.js","sourceRoot":"","sources":["../../src/init/template-vars.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,MAAM,UAAU,GAAG,GAAG,WAAW,KAAK,CAAC;IACvC,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,0BAA0B,CAAC,WAAW,CAAC;QAClD,WAAW,EAAE,WAAW;QACxB,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,IAAsB;IAEtB,OAAO,MAAM;SACV,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC;SAC1C,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;SAC5C,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC;SAChD,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACnD,CAAC"}
|