@nodetool-ai/cli 0.8.3 → 0.8.4-a24.1
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/dist/.nodetool-build-stamp +1 -1
- package/dist/app-debug/harness.js +1 -1
- package/dist/app-debug/harness.js.map +1 -1
- package/dist/command-errors.d.ts +7 -9
- package/dist/command-errors.d.ts.map +1 -1
- package/dist/command-errors.js +36 -2
- package/dist/command-errors.js.map +1 -1
- package/dist/commands/__tests__/jtbd.test.js +1 -1
- package/dist/commands/__tests__/jtbd.test.js.map +1 -1
- package/dist/commands/__tests__/runtime.test.d.ts +2 -0
- package/dist/commands/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/commands/__tests__/runtime.test.js +128 -0
- package/dist/commands/__tests__/runtime.test.js.map +1 -0
- package/dist/commands/agent.js +1 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +3 -5
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/apps.d.ts.map +1 -1
- package/dist/commands/apps.js +20 -20
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/authorized-pack-install.d.ts +7 -0
- package/dist/commands/authorized-pack-install.d.ts.map +1 -0
- package/dist/commands/authorized-pack-install.js +20 -0
- package/dist/commands/authorized-pack-install.js.map +1 -0
- package/dist/commands/debug.d.ts.map +1 -1
- package/dist/commands/debug.js +15 -3
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/eval.js +2 -2
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/game-benchmark.d.ts +4 -0
- package/dist/commands/game-benchmark.d.ts.map +1 -1
- package/dist/commands/game-benchmark.js +8 -0
- package/dist/commands/game-benchmark.js.map +1 -1
- package/dist/commands/game-smoke.d.ts.map +1 -1
- package/dist/commands/game-smoke.js +3 -3
- package/dist/commands/game-smoke.js.map +1 -1
- package/dist/commands/game.d.ts.map +1 -1
- package/dist/commands/game.js +72 -25
- package/dist/commands/game.js.map +1 -1
- package/dist/commands/harness.d.ts +21 -0
- package/dist/commands/harness.d.ts.map +1 -1
- package/dist/commands/harness.js +198 -10
- package/dist/commands/harness.js.map +1 -1
- package/dist/commands/install-missing-packs.d.ts +21 -0
- package/dist/commands/install-missing-packs.d.ts.map +1 -0
- package/dist/commands/install-missing-packs.js +48 -0
- package/dist/commands/install-missing-packs.js.map +1 -0
- package/dist/commands/js-script.d.ts.map +1 -1
- package/dist/commands/js-script.js +11 -9
- package/dist/commands/js-script.js.map +1 -1
- package/dist/commands/node.d.ts.map +1 -1
- package/dist/commands/node.js +15 -3
- package/dist/commands/node.js.map +1 -1
- package/dist/commands/pack-install-authorization.d.ts +40 -0
- package/dist/commands/pack-install-authorization.d.ts.map +1 -0
- package/dist/commands/pack-install-authorization.js +131 -0
- package/dist/commands/pack-install-authorization.js.map +1 -0
- package/dist/commands/pack-management.d.ts +26 -0
- package/dist/commands/pack-management.d.ts.map +1 -0
- package/dist/commands/pack-management.js +74 -0
- package/dist/commands/pack-management.js.map +1 -0
- package/dist/commands/packs.d.ts +2 -1
- package/dist/commands/packs.d.ts.map +1 -1
- package/dist/commands/packs.js +7 -2
- package/dist/commands/packs.js.map +1 -1
- package/dist/commands/projects.d.ts +11 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +145 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/resource-read.d.ts.map +1 -1
- package/dist/commands/resource-read.js +6 -12
- package/dist/commands/resource-read.js.map +1 -1
- package/dist/commands/runs.js +1 -1
- package/dist/commands/runs.js.map +1 -1
- package/dist/commands/runtime.d.ts +3 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +122 -0
- package/dist/commands/runtime.js.map +1 -0
- package/dist/commands/sketch.d.ts.map +1 -1
- package/dist/commands/sketch.js +2 -4
- package/dist/commands/sketch.js.map +1 -1
- package/dist/commands/timeline-render.d.ts +0 -10
- package/dist/commands/timeline-render.d.ts.map +1 -1
- package/dist/commands/timeline-render.js +18 -8
- package/dist/commands/timeline-render.js.map +1 -1
- package/dist/commands/timeline-score.d.ts.map +1 -1
- package/dist/commands/timeline-score.js +1 -2
- package/dist/commands/timeline-score.js.map +1 -1
- package/dist/commands/timeline.d.ts.map +1 -1
- package/dist/commands/timeline.js +2 -4
- package/dist/commands/timeline.js.map +1 -1
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +8 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/version-commands.d.ts.map +1 -1
- package/dist/commands/version-commands.js +5 -10
- package/dist/commands/version-commands.js.map +1 -1
- package/dist/debug/server-runner.d.ts.map +1 -1
- package/dist/debug/server-runner.js +7 -1
- package/dist/debug/server-runner.js.map +1 -1
- package/dist/debug/target.d.ts.map +1 -1
- package/dist/debug/target.js +2 -11
- package/dist/debug/target.js.map +1 -1
- package/dist/evals/graph-runner.d.ts +1 -1
- package/dist/evals/graph-runner.d.ts.map +1 -1
- package/dist/evals/graph-runner.js +2 -2
- package/dist/evals/graph-runner.js.map +1 -1
- package/dist/harness/capability-table.d.ts.map +1 -1
- package/dist/harness/capability-table.js +17 -9
- package/dist/harness/capability-table.js.map +1 -1
- package/dist/harness/registry.d.ts.map +1 -1
- package/dist/harness/registry.js +131 -2
- package/dist/harness/registry.js.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/install-lock.d.ts +12 -0
- package/dist/install-lock.d.ts.map +1 -0
- package/dist/install-lock.js +139 -0
- package/dist/install-lock.js.map +1 -0
- package/dist/js-script-debug/harness.d.ts +4 -0
- package/dist/js-script-debug/harness.d.ts.map +1 -1
- package/dist/js-script-debug/harness.js.map +1 -1
- package/dist/node/run-node.d.ts +3 -0
- package/dist/node/run-node.d.ts.map +1 -1
- package/dist/node/run-node.js +18 -2
- package/dist/node/run-node.js.map +1 -1
- package/dist/node-registry.d.ts +6 -4
- package/dist/node-registry.d.ts.map +1 -1
- package/dist/node-registry.js +10 -5
- package/dist/node-registry.js.map +1 -1
- package/dist/nodetool-main.js +57 -62
- package/dist/nodetool-main.js.map +1 -1
- package/dist/nodetool.js +8 -1
- package/dist/nodetool.js.map +1 -1
- package/dist/npm-runner.d.ts +23 -0
- package/dist/npm-runner.d.ts.map +1 -0
- package/dist/npm-runner.js +159 -0
- package/dist/npm-runner.js.map +1 -0
- package/dist/optional-node-root.d.ts +10 -0
- package/dist/optional-node-root.d.ts.map +1 -0
- package/dist/optional-node-root.js +26 -0
- package/dist/optional-node-root.js.map +1 -0
- package/dist/packs/command-service.d.ts +14 -0
- package/dist/packs/command-service.d.ts.map +1 -0
- package/dist/packs/command-service.js +190 -0
- package/dist/packs/command-service.js.map +1 -0
- package/dist/packs/doctor-lock.d.ts +8 -0
- package/dist/packs/doctor-lock.d.ts.map +1 -0
- package/dist/packs/doctor-lock.js +50 -0
- package/dist/packs/doctor-lock.js.map +1 -0
- package/dist/packs/doctor.d.ts +25 -0
- package/dist/packs/doctor.d.ts.map +1 -0
- package/dist/packs/doctor.js +12 -0
- package/dist/packs/doctor.js.map +1 -0
- package/dist/packs/global-bootstrap.d.ts +11 -0
- package/dist/packs/global-bootstrap.d.ts.map +1 -0
- package/dist/packs/global-bootstrap.js +72 -0
- package/dist/packs/global-bootstrap.js.map +1 -0
- package/dist/packs/host.d.ts +17 -0
- package/dist/packs/host.d.ts.map +1 -0
- package/dist/packs/host.js +79 -0
- package/dist/packs/host.js.map +1 -0
- package/dist/packs/install-manifests.d.ts +2 -0
- package/dist/packs/install-manifests.d.ts.map +1 -0
- package/dist/packs/install-manifests.js +30 -0
- package/dist/packs/install-manifests.js.map +1 -0
- package/dist/packs/install-process.d.ts +4 -0
- package/dist/packs/install-process.d.ts.map +1 -0
- package/dist/packs/install-process.js +11 -0
- package/dist/packs/install-process.js.map +1 -0
- package/dist/packs/install-selection.d.ts +39 -0
- package/dist/packs/install-selection.d.ts.map +1 -0
- package/dist/packs/install-selection.js +67 -0
- package/dist/packs/install-selection.js.map +1 -0
- package/dist/packs/install-state.d.ts +21 -0
- package/dist/packs/install-state.d.ts.map +1 -0
- package/dist/packs/install-state.js +44 -0
- package/dist/packs/install-state.js.map +1 -0
- package/dist/packs/install-tree.d.ts +35 -0
- package/dist/packs/install-tree.d.ts.map +1 -0
- package/dist/packs/install-tree.js +253 -0
- package/dist/packs/install-tree.js.map +1 -0
- package/dist/packs/install-verification.d.ts +12 -0
- package/dist/packs/install-verification.d.ts.map +1 -0
- package/dist/packs/install-verification.js +76 -0
- package/dist/packs/install-verification.js.map +1 -0
- package/dist/packs/installed.d.ts +36 -0
- package/dist/packs/installed.d.ts.map +1 -0
- package/dist/packs/installed.js +87 -0
- package/dist/packs/installed.js.map +1 -0
- package/dist/packs/installer-load-check.d.ts +4 -0
- package/dist/packs/installer-load-check.d.ts.map +1 -0
- package/dist/packs/installer-load-check.js +52 -0
- package/dist/packs/installer-load-check.js.map +1 -0
- package/dist/packs/installer.d.ts +16 -0
- package/dist/packs/installer.d.ts.map +1 -0
- package/dist/packs/installer.js +142 -0
- package/dist/packs/installer.js.map +1 -0
- package/dist/packs/management.d.ts +51 -0
- package/dist/packs/management.d.ts.map +1 -0
- package/dist/packs/management.js +81 -0
- package/dist/packs/management.js.map +1 -0
- package/dist/packs/mode.d.ts +42 -0
- package/dist/packs/mode.d.ts.map +1 -0
- package/dist/packs/mode.js +215 -0
- package/dist/packs/mode.js.map +1 -0
- package/dist/packs/owned-replay-plan.d.ts +5 -0
- package/dist/packs/owned-replay-plan.d.ts.map +1 -0
- package/dist/packs/owned-replay-plan.js +68 -0
- package/dist/packs/owned-replay-plan.js.map +1 -0
- package/dist/packs/removal-selection.d.ts +12 -0
- package/dist/packs/removal-selection.d.ts.map +1 -0
- package/dist/packs/removal-selection.js +169 -0
- package/dist/packs/removal-selection.js.map +1 -0
- package/dist/packs/removal.d.ts +12 -0
- package/dist/packs/removal.d.ts.map +1 -0
- package/dist/packs/removal.js +138 -0
- package/dist/packs/removal.js.map +1 -0
- package/dist/packs/repair.d.ts +2 -0
- package/dist/packs/repair.d.ts.map +1 -0
- package/dist/packs/repair.js +2 -0
- package/dist/packs/repair.js.map +1 -0
- package/dist/packs/serve.d.ts +2 -0
- package/dist/packs/serve.d.ts.map +1 -0
- package/dist/packs/serve.js +14 -0
- package/dist/packs/serve.js.map +1 -0
- package/dist/providers.d.ts +1 -1
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +42 -6
- package/dist/providers.js.map +1 -1
- package/dist/run-dsl-supervised.d.ts.map +1 -1
- package/dist/run-dsl-supervised.js +8 -1
- package/dist/run-dsl-supervised.js.map +1 -1
- package/dist/runtime-env.d.ts +4 -0
- package/dist/runtime-env.d.ts.map +1 -0
- package/dist/runtime-env.js +31 -0
- package/dist/runtime-env.js.map +1 -0
- package/dist/sketch-debug/harness.d.ts +1 -1
- package/dist/sketch-debug/harness.d.ts.map +1 -1
- package/dist/sketch-debug/harness.js +2 -7
- package/dist/sketch-debug/harness.js.map +1 -1
- package/dist/validate/index.d.ts +3 -2
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +30 -2
- package/dist/validate/index.js.map +1 -1
- package/dist/workflow-file.d.ts +3 -0
- package/dist/workflow-file.d.ts.map +1 -0
- package/dist/workflow-file.js +176 -0
- package/dist/workflow-file.js.map +1 -0
- package/package.json +34 -41
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { realpath } from "node:fs/promises";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { getNodetoolDataDir } from "@nodetool-ai/config";
|
|
6
|
+
import { readCatalogIndex, readCatalogNodes } from "@nodetool-ai/node-catalog";
|
|
7
|
+
import { RUNTIME_NPM_PACKAGES, isRuntimeNpmPackageId } from "@nodetool-ai/protocol/runtime-npm-packages";
|
|
8
|
+
import { installWithCommandAuthorization } from "../commands/authorized-pack-install.js";
|
|
9
|
+
import { authorizePackInstallCommand } from "../commands/pack-install-authorization.js";
|
|
10
|
+
import { loadCliPackSnapshot } from "./host.js";
|
|
11
|
+
import { readDesiredState } from "./install-selection.js";
|
|
12
|
+
import { installPacks } from "./installer.js";
|
|
13
|
+
import { listPackRows, explainPack, requestedInstallIds, restartNotice } from "./management.js";
|
|
14
|
+
import { reportPackInstallation } from "./doctor.js";
|
|
15
|
+
import { assertPackInstallProcessAllowed } from "./install-process.js";
|
|
16
|
+
import { inspectPackInstallLock } from "./doctor-lock.js";
|
|
17
|
+
import { readInstalledPacks } from "./installed.js";
|
|
18
|
+
import { readInstallTree, assertTreePins, assertSharedIdentities } from "./install-tree.js";
|
|
19
|
+
import { installerNpmVersion } from "../npm-runner.js";
|
|
20
|
+
async function verifyInstalledInChild(cliRoot, installRoot, ids) {
|
|
21
|
+
const entry = fileURLToPath(new URL("./installer-load-check.js", import.meta.url));
|
|
22
|
+
await new Promise((resolve, reject) => {
|
|
23
|
+
const child = spawn(process.execPath, [entry, cliRoot, installRoot, ...ids], { shell: false, stdio: ["ignore", "pipe", "pipe"] });
|
|
24
|
+
let output = "";
|
|
25
|
+
child.stdout.on("data", (chunk) => { output += chunk.toString(); });
|
|
26
|
+
child.stderr.on("data", (chunk) => { output += chunk.toString(); });
|
|
27
|
+
child.on("error", reject);
|
|
28
|
+
child.on("close", code => { if (code === 0) {
|
|
29
|
+
resolve();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
reject(new Error(`Installed pack registration failed (${String(code)}): ${output.trim()}`));
|
|
33
|
+
} });
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function createPackCommandServices(context = {}) {
|
|
37
|
+
const snapshot = context.snapshot ?? await loadCliPackSnapshot();
|
|
38
|
+
const catalog = context.catalog ?? readCatalogIndex();
|
|
39
|
+
const stateFile = context.stateFile ?? join(getNodetoolDataDir(), "cli-packs.json");
|
|
40
|
+
const operations = context.operations;
|
|
41
|
+
const root = snapshot.mode.kind === "global" || snapshot.mode.kind === "local" ? await realpath(snapshot.mode.installRoot) : null;
|
|
42
|
+
const state = await readDesiredState(stateFile);
|
|
43
|
+
const desired = root ? state[root] : undefined;
|
|
44
|
+
const request = (packs, runtimeLibraries = []) => ({ mode: snapshot.mode, packs, runtimeLibraries, catalog, stateFile });
|
|
45
|
+
const tree = async () => root ? (await readInstallTree(root, snapshot.mode.kind === "global")).packages : [];
|
|
46
|
+
const runtimeIds = async () => {
|
|
47
|
+
const installed = await tree();
|
|
48
|
+
const byFolder = new Map((catalog.installPins ?? []).map(pin => [pin.installName ?? pin.name, pin]));
|
|
49
|
+
return new Set(Object.entries(RUNTIME_NPM_PACKAGES).filter(([, runtime]) => runtime.packageNames.every(name => {
|
|
50
|
+
const pin = byFolder.get(name);
|
|
51
|
+
return pin && installed.some(entry => entry.path === `node_modules/${name}` && entry.name === pin.name && entry.version === pin.version && entry.integrity === pin.integrity);
|
|
52
|
+
})).map(([id]) => id));
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
async list() { return listPackRows(catalog, snapshot, await runtimeIds()); },
|
|
56
|
+
async why(target) { return explainPack(catalog, snapshot, target, await runtimeIds()); },
|
|
57
|
+
async add(ids, options) {
|
|
58
|
+
let selected = requestedInstallIds(catalog, ids);
|
|
59
|
+
if (options.restore) {
|
|
60
|
+
selected = { packs: desired?.packs ?? [], runtimeLibraries: desired?.runtimeLibraries ?? [] };
|
|
61
|
+
}
|
|
62
|
+
else if (options.for) {
|
|
63
|
+
const { resolveTarget } = await import("../debug/target.js");
|
|
64
|
+
const { findMissingPacks } = await import("@nodetool-ai/execution");
|
|
65
|
+
const { NodeRegistry } = await import("@nodetool-ai/node-sdk");
|
|
66
|
+
let db;
|
|
67
|
+
const load = async (id) => {
|
|
68
|
+
db ??= import("@nodetool-ai/models").then(async (models) => {
|
|
69
|
+
const { getDefaultDbPath } = await import("@nodetool-ai/config");
|
|
70
|
+
models.initDb(getDefaultDbPath());
|
|
71
|
+
return models;
|
|
72
|
+
});
|
|
73
|
+
return (await db).Workflow.find("1", id);
|
|
74
|
+
};
|
|
75
|
+
const resolved = await resolveTarget(options.for, load);
|
|
76
|
+
const registry = new NodeRegistry();
|
|
77
|
+
const installed = new Set(snapshot.packs.map(pack => pack.id));
|
|
78
|
+
registry.loadCatalog(context.catalogNodes ?? readCatalogNodes(), catalog.packs);
|
|
79
|
+
const missing = await findMissingPacks(resolved.graph, registry, { catalog, installedPackIds: installed, loadWorkflow: load });
|
|
80
|
+
const libraries = await runtimeIds();
|
|
81
|
+
selected = { packs: missing?.packs.map(pack => pack.id).filter(id => !installed.has(id)) ?? [],
|
|
82
|
+
runtimeLibraries: missing ? missing.runtimeLibraries.filter(id => isRuntimeNpmPackageId(id) && !libraries.has(id)) : [] };
|
|
83
|
+
}
|
|
84
|
+
if (selected.packs.length === 0 && selected.runtimeLibraries.length === 0) {
|
|
85
|
+
console.log("No missing node packs or runtime libraries to install.");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
assertPackInstallProcessAllowed();
|
|
89
|
+
const installRequest = request(selected.packs, selected.runtimeLibraries);
|
|
90
|
+
const installed = await installWithCommandAuthorization({
|
|
91
|
+
authorize: () => authorizePackInstallCommand({ request: installRequest,
|
|
92
|
+
command: options.restore ? "packs-restore" : "packs-add", confirm: !options.yes }),
|
|
93
|
+
install: authorization => installPacks(installRequest, authorization, operations)
|
|
94
|
+
});
|
|
95
|
+
if (!installed) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
process.stderr.write(restartNotice([...selected.packs, ...selected.runtimeLibraries]) + "\n");
|
|
99
|
+
},
|
|
100
|
+
async remove(ids) {
|
|
101
|
+
const selected = requestedInstallIds(catalog, ids);
|
|
102
|
+
const removeRequest = request(selected.packs, selected.runtimeLibraries);
|
|
103
|
+
const authorization = await authorizePackInstallCommand({ request: removeRequest, command: "packs-remove" });
|
|
104
|
+
if (!authorization) {
|
|
105
|
+
throw new Error("Node pack removal was not authorized");
|
|
106
|
+
}
|
|
107
|
+
const { removePacks } = await import("./removal.js");
|
|
108
|
+
const result = await removePacks(removeRequest, authorization, operations);
|
|
109
|
+
if (result.kept.length) {
|
|
110
|
+
console.log(`Keeping required packages: ${result.kept.join(", ")}`);
|
|
111
|
+
}
|
|
112
|
+
console.log(result.removed.length ? `Removed: ${result.removed.join(", ")}` : "No installed packages were removed.");
|
|
113
|
+
process.stderr.write('Running "nodetool serve" and "nodetool mcp serve" processes may fail on later lazy imports. Restart them after removing packs.\n');
|
|
114
|
+
},
|
|
115
|
+
async doctor(options) {
|
|
116
|
+
const issues = [];
|
|
117
|
+
const baseline = { ...reportPackInstallation(snapshot), installRoot: root,
|
|
118
|
+
reason: snapshot.mode.kind === "global" || snapshot.mode.kind === "local" ? null : snapshot.mode.reason,
|
|
119
|
+
installedPacks: snapshot.packs.map(pack => ({ id: pack.id, npm: pack.npm, version: pack.version })),
|
|
120
|
+
desiredCoreVersion: desired?.coreVersion ?? null };
|
|
121
|
+
issues.push(...await inspectPackInstallLock(snapshot.mode));
|
|
122
|
+
let npmVersion = null;
|
|
123
|
+
if (root) {
|
|
124
|
+
try {
|
|
125
|
+
npmVersion = await (operations?.npmVersion ?? installerNpmVersion)(root);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
issues.push({ kind: "npm", message: error instanceof Error ? error.message : String(error) });
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const installed = await tree();
|
|
132
|
+
const admitted = new Set(snapshot.packs.map(pack => pack.npm));
|
|
133
|
+
const packs = catalog.packs.filter(pack => admitted.has(pack.npm.name));
|
|
134
|
+
const byFolder = new Map((catalog.installPins ?? []).map(pin => [pin.installName ?? pin.name, pin]));
|
|
135
|
+
const requiredPin = (name) => {
|
|
136
|
+
const pin = byFolder.get(name);
|
|
137
|
+
if (!pin) {
|
|
138
|
+
throw new Error(`Installed package ${name} has no catalog integrity pin`);
|
|
139
|
+
}
|
|
140
|
+
return pin;
|
|
141
|
+
};
|
|
142
|
+
const libraries = new Set([...(desired?.runtimeLibraries ?? []), ...packs.filter(pack => pack.kind === "node-pack").flatMap(pack => pack.runtimeLibraries)]);
|
|
143
|
+
const runtimePins = [...libraries].flatMap(id => {
|
|
144
|
+
if (!isRuntimeNpmPackageId(id)) {
|
|
145
|
+
throw new Error(`Unknown desired runtime library: ${id}`);
|
|
146
|
+
}
|
|
147
|
+
return RUNTIME_NPM_PACKAGES[id].packageNames.map(name => ({ ...requiredPin(name), installPath: `node_modules/${name}` }));
|
|
148
|
+
});
|
|
149
|
+
const pins = [...packs.map(pack => pack.npm), ...packs.flatMap(pack => pack.provides.map(requiredPin)),
|
|
150
|
+
...packs.flatMap(pack => pack.scriptAllowlist), ...runtimePins, ...(catalog.installPins ?? []).filter(pin => pin.shared)];
|
|
151
|
+
const coreNames = new Set(catalog.packs.filter(pack => pack.kind === "core").map(pack => pack.npm.name));
|
|
152
|
+
assertTreePins(installed, installed, pins, coreNames, catalog.coreVersion);
|
|
153
|
+
await assertSharedIdentities(installed, (catalog.installPins ?? []).filter(pin => pin.shared));
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
issues.push({ kind: "integrity", message: error instanceof Error ? error.message : String(error) });
|
|
157
|
+
}
|
|
158
|
+
if (options.installed || options.pack?.length) {
|
|
159
|
+
try {
|
|
160
|
+
const ids = options.pack ?? snapshot.packs.map(pack => pack.id);
|
|
161
|
+
if (operations) {
|
|
162
|
+
await operations.loadCheck(snapshot.mode, ids);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
await verifyInstalledInChild(snapshot.mode.cliRoot, root, ids);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
issues.push({ kind: "registration", message: error instanceof Error ? error.message : String(error) });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (options.repair) {
|
|
174
|
+
const repairRequest = request(desired?.packs ?? [], desired?.runtimeLibraries ?? []);
|
|
175
|
+
const authorization = await authorizePackInstallCommand({ request: repairRequest, command: "packs-repair" });
|
|
176
|
+
if (!authorization) {
|
|
177
|
+
throw new Error("Node pack repair was not authorized");
|
|
178
|
+
}
|
|
179
|
+
const { repairPackInstallation } = await import("./repair.js");
|
|
180
|
+
await repairPackInstallation(repairRequest, authorization, operations);
|
|
181
|
+
process.stderr.write("Node pack installation verified and repaired. Restart running serve and MCP processes.\n");
|
|
182
|
+
const repaired = reportPackInstallation(readInstalledPacks(snapshot.mode, catalog));
|
|
183
|
+
return { ...repaired, npmVersion, dirty: false };
|
|
184
|
+
}
|
|
185
|
+
return { ...baseline, healthy: baseline.healthy && issues.length === 0 && !desired?.dirty,
|
|
186
|
+
npmVersion, dirty: desired?.dirty ?? false, issues: [...baseline.issues, ...issues] };
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=command-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-service.js","sourceRoot":"","sources":["../../src/packs/command-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { InstallMode } from "./mode.js";
|
|
2
|
+
export interface PackLockIssue {
|
|
3
|
+
readonly kind: string;
|
|
4
|
+
readonly message: string;
|
|
5
|
+
}
|
|
6
|
+
/** A killed installer can leave a valid tree without a desired-state dirty marker. */
|
|
7
|
+
export declare function inspectPackInstallLock(mode: InstallMode): Promise<readonly PackLockIssue[]>;
|
|
8
|
+
//# sourceMappingURL=doctor-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-lock.d.ts","sourceRoot":"","sources":["../../src/packs/doctor-lock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,WAAW,aAAa;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAElF,sFAAsF;AACtF,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CA4BjG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { hostname } from "node:os";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const ownerSchema = z.object({ pid: z.number().int().positive().max(2_147_483_647), hostname: z.string(), token: z.string(), startedAt: z.string() });
|
|
6
|
+
/** A killed installer can leave a valid tree without a desired-state dirty marker. */
|
|
7
|
+
export async function inspectPackInstallLock(mode) {
|
|
8
|
+
if (!mode.nodeModulesRoot) {
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
const file = join(mode.nodeModulesRoot, ".nodetool-packs.lock");
|
|
12
|
+
const issues = [];
|
|
13
|
+
try {
|
|
14
|
+
await stat(file + ".guard");
|
|
15
|
+
issues.push({ kind: "install_guard", message: `Install lock guard exists at ${file}.guard. Confirm its owner stopped before removing it; repair never steals the guard.` });
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const info = await stat(file);
|
|
24
|
+
const owner = ownerSchema.parse(JSON.parse(await readFile(file, "utf8")));
|
|
25
|
+
let stopped = false;
|
|
26
|
+
if (owner.hostname === hostname()) {
|
|
27
|
+
try {
|
|
28
|
+
process.kill(owner.pid, 0);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error instanceof Error && "code" in error && error.code === "ESRCH") {
|
|
32
|
+
stopped = true;
|
|
33
|
+
}
|
|
34
|
+
else if (!(error instanceof Error && "code" in error && error.code === "EPERM")) {
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const interrupted = stopped || Date.now() - info.mtimeMs > 60_000;
|
|
40
|
+
issues.push({ kind: interrupted ? "interrupted_install" : "active_install",
|
|
41
|
+
message: interrupted ? `Interrupted install lock at ${file}. Run nodetool packs doctor --repair after its heartbeat expires.` : `An install is active at ${file}. Wait for it to finish before checking or repairing the tree.` });
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
45
|
+
issues.push({ kind: "invalid_install_lock", message: `Cannot inspect install lock ${file}: ${error instanceof Error ? error.message : String(error)}` });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return issues;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=doctor-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-lock.js","sourceRoot":"","sources":["../../src/packs/doctor-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { InstalledPackSnapshot } from "./installed.js";
|
|
2
|
+
export type PackDoctorIssue = {
|
|
3
|
+
readonly kind: "wrong_version";
|
|
4
|
+
readonly pack: string;
|
|
5
|
+
readonly npm: string;
|
|
6
|
+
readonly version: string;
|
|
7
|
+
readonly expectedVersion: string;
|
|
8
|
+
readonly packageRoot: string;
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: "invalid_package";
|
|
11
|
+
readonly pack: string;
|
|
12
|
+
readonly npm: string;
|
|
13
|
+
readonly reason: string;
|
|
14
|
+
readonly packageRoot: string;
|
|
15
|
+
};
|
|
16
|
+
export interface PackDoctorReport {
|
|
17
|
+
readonly mode: InstalledPackSnapshot["mode"]["kind"];
|
|
18
|
+
readonly cliRoot: string;
|
|
19
|
+
readonly coreVersion: string;
|
|
20
|
+
readonly healthy: boolean;
|
|
21
|
+
readonly issues: readonly PackDoctorIssue[];
|
|
22
|
+
}
|
|
23
|
+
/** Report rejected tree entries without importing them or mutating the installed tree. */
|
|
24
|
+
export declare function reportPackInstallation(snapshot: InstalledPackSnapshot): PackDoctorReport;
|
|
25
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/packs/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACtG,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,gBAAgB,CASxF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Report rejected tree entries without importing them or mutating the installed tree. */
|
|
2
|
+
export function reportPackInstallation(snapshot) {
|
|
3
|
+
const issues = [
|
|
4
|
+
...snapshot.wrongVersions.map((entry) => ({ kind: "wrong_version", pack: entry.id,
|
|
5
|
+
npm: entry.npm, version: entry.version, expectedVersion: entry.expectedVersion, packageRoot: entry.packageRoot })),
|
|
6
|
+
...snapshot.invalidPackages.map((entry) => ({ kind: "invalid_package", pack: entry.id,
|
|
7
|
+
npm: entry.npm, reason: entry.reason, packageRoot: entry.packageRoot }))
|
|
8
|
+
];
|
|
9
|
+
return { mode: snapshot.mode.kind, cliRoot: snapshot.mode.cliRoot, coreVersion: snapshot.mode.coreVersion,
|
|
10
|
+
healthy: issues.length === 0, issues };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/packs/doctor.ts"],"names":[],"mappings":"AAgBA,0FAA0F;AAC1F,MAAM,UAAU,sBAAsB,CAAC,QAA+B;IACpE,MAAM,MAAM,GAAsB;QAChC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE;YAChG,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACpH,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE;YACpG,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;KAC3E,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW;QACvG,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { NodeCatalogIndex } from "@nodetool-ai/node-catalog";
|
|
2
|
+
import type { InstallPlan, TreePackage, VerificationPin } from "./install-tree.js";
|
|
3
|
+
export interface GlobalBootstrapPin extends VerificationPin {
|
|
4
|
+
readonly installPath: string;
|
|
5
|
+
readonly realPath: string;
|
|
6
|
+
}
|
|
7
|
+
/** Initial global npm installs omit locks. Reify only catalog-owned existing roots. */
|
|
8
|
+
export declare function globalBootstrapPins(catalog: NodeCatalogIndex, before: readonly TreePackage[], libraries: readonly string[]): readonly GlobalBootstrapPin[];
|
|
9
|
+
/** Permit only explicitly authorized same-version root reification, never arbitrary changes. */
|
|
10
|
+
export declare function normalizeGlobalBootstrap(plan: InstallPlan, pins: readonly GlobalBootstrapPin[]): InstallPlan;
|
|
11
|
+
//# sourceMappingURL=global-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-bootstrap.d.ts","sourceRoot":"","sources":["../../src/packs/global-bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEnF,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IAAG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAEvH,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,kBAAkB,EAAE,CAwB1J;AAID,gGAAgG;AAChG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAAG,WAAW,CAyB5G"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { RUNTIME_NPM_PACKAGES, isRuntimeNpmPackageId } from "@nodetool-ai/protocol/runtime-npm-packages";
|
|
3
|
+
/** Initial global npm installs omit locks. Reify only catalog-owned existing roots. */
|
|
4
|
+
export function globalBootstrapPins(catalog, before, libraries) {
|
|
5
|
+
const table = new Map((catalog.installPins ?? []).map(pin => [pin.installName ?? pin.name, pin]));
|
|
6
|
+
const installed = new Set(before.map(entry => entry.name));
|
|
7
|
+
const packs = catalog.packs.filter(pack => installed.has(pack.npm.name));
|
|
8
|
+
const required = (name) => {
|
|
9
|
+
const pin = table.get(name);
|
|
10
|
+
if (!pin) {
|
|
11
|
+
throw new Error(`Global bootstrap has no integrity pin for ${name}`);
|
|
12
|
+
}
|
|
13
|
+
return pin;
|
|
14
|
+
};
|
|
15
|
+
const candidates = [...packs.flatMap(pack => [pack.npm, ...pack.provides.map(required), ...pack.scriptAllowlist]),
|
|
16
|
+
...(catalog.installPins ?? []).filter(pin => pin.shared),
|
|
17
|
+
...libraries.flatMap(id => isRuntimeNpmPackageId(id) ? RUNTIME_NPM_PACKAGES[id].packageNames.map(name => ({ ...required(name), installPath: `node_modules/${name}` })) : [])];
|
|
18
|
+
const result = new Map();
|
|
19
|
+
for (const pin of candidates) {
|
|
20
|
+
const entries = before.filter(entry => entry.name === pin.name && (!pin.installPath || entry.path === pin.installPath));
|
|
21
|
+
if (!entries.length) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const path = `node_modules/${pin.installName ?? pin.name}`;
|
|
25
|
+
if (!pin.integrity || pin.integrity === "PENDING" || entries.length !== 1 || entries[0].path !== path ||
|
|
26
|
+
entries[0].version !== pin.version || entries[0].integrity !== undefined) {
|
|
27
|
+
throw new Error(`Global bootstrap requires one exact unrecorded root package: ${pin.name}`);
|
|
28
|
+
}
|
|
29
|
+
result.set(path, { ...pin, installPath: path, realPath: entries[0].realPath });
|
|
30
|
+
}
|
|
31
|
+
return [...result.values()].sort((a, b) => a.installPath.localeCompare(b.installPath));
|
|
32
|
+
}
|
|
33
|
+
const identity = z.object({ name: z.string(), version: z.string(), path: z.string() });
|
|
34
|
+
const changeSchema = z.object({ from: identity, to: identity });
|
|
35
|
+
/** Permit only explicitly authorized same-version root reification, never arbitrary changes. */
|
|
36
|
+
export function normalizeGlobalBootstrap(plan, pins) {
|
|
37
|
+
const byPath = new Map(pins.map(pin => [pin.realPath, pin]));
|
|
38
|
+
const byName = new Map();
|
|
39
|
+
for (const pin of pins) {
|
|
40
|
+
byName.set(pin.name, [...(byName.get(pin.name) ?? []), pin]);
|
|
41
|
+
}
|
|
42
|
+
const replayed = new Set();
|
|
43
|
+
return { ...plan, change: plan.change.filter(raw => {
|
|
44
|
+
const text = z.string().safeParse(raw);
|
|
45
|
+
if (text.success) {
|
|
46
|
+
const match = /^change (\S+) (\S+) => (\S+)$/.exec(text.data);
|
|
47
|
+
const candidates = match ? byName.get(match[1]) : undefined;
|
|
48
|
+
if (!match || candidates?.length !== 1) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
const pin = candidates[0];
|
|
52
|
+
if (replayed.has(pin.realPath) || match[2] !== pin.version || match[3] !== pin.version) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
replayed.add(pin.realPath);
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const parsed = changeSchema.safeParse(raw);
|
|
59
|
+
if (!parsed.success) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
const { from, to } = parsed.data;
|
|
63
|
+
const pin = byPath.get(from.path);
|
|
64
|
+
if (!pin || replayed.has(pin.realPath) || from.path !== to.path || from.name !== pin.name || to.name !== pin.name ||
|
|
65
|
+
from.version !== pin.version || to.version !== pin.version) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
replayed.add(pin.realPath);
|
|
69
|
+
return false;
|
|
70
|
+
}) };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=global-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-bootstrap.js","sourceRoot":"","sources":["../../src/packs/global-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type NodeCatalogIndex, type PackLoaderContext } from "@nodetool-ai/node-catalog";
|
|
2
|
+
import type { BuiltinPackPolicy, NodeRegistry } from "@nodetool-ai/node-sdk";
|
|
3
|
+
import type { PackSource } from "@nodetool-ai/websocket/pack-source";
|
|
4
|
+
import { type InstalledPackSnapshot } from "./installed.js";
|
|
5
|
+
export declare function loaderContextForSnapshot(value: InstalledPackSnapshot): PackLoaderContext;
|
|
6
|
+
/** Configure the host before loading commands. Help and non-pack commands do no inventory IO. */
|
|
7
|
+
export declare function configureCliPackHost(url: string, options?: {
|
|
8
|
+
readonly catalog?: NodeCatalogIndex;
|
|
9
|
+
readonly stateFile?: string;
|
|
10
|
+
}): void;
|
|
11
|
+
/** Doctor and installers use the same snapshot that authorized module loading. */
|
|
12
|
+
export declare function loadCliPackSnapshot(): Promise<InstalledPackSnapshot>;
|
|
13
|
+
/** Serve and command registries share one source and admitted snapshot per process. */
|
|
14
|
+
export declare function getCliPackSource(): Promise<PackSource | undefined>;
|
|
15
|
+
/** Preserve library callers until a CLI entry explicitly configures its installed policy. */
|
|
16
|
+
export declare function registerCliPacks(registry: NodeRegistry, policy: BuiltinPackPolicy): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/packs/host.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAQhF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,qBAAqB,GAAG,iBAAiB,CAMxF;AAED,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,IAAI,CAuBZ;AAED,kFAAkF;AAClF,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAS1E;AAED,uFAAuF;AACvF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAOxE;AAED,6FAA6F;AAC7F,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvG"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { realpath } from "node:fs/promises";
|
|
4
|
+
import { getNodetoolDataDir } from "@nodetool-ai/config";
|
|
5
|
+
import { loadPackLoaderContext, registerAvailablePacks, setPackLoaderContextProvider } from "@nodetool-ai/node-catalog";
|
|
6
|
+
import { detectInstallMode, installDetailsForMode } from "./mode.js";
|
|
7
|
+
import { readInstalledPacks } from "./installed.js";
|
|
8
|
+
import { readDesiredState } from "./install-selection.js";
|
|
9
|
+
import { restoreWarning } from "./management.js";
|
|
10
|
+
let entryUrl;
|
|
11
|
+
let snapshot;
|
|
12
|
+
let sourcePromise;
|
|
13
|
+
export function loaderContextForSnapshot(value) {
|
|
14
|
+
return {
|
|
15
|
+
coreVersion: value.mode.coreVersion,
|
|
16
|
+
packs: value.packs.map((pack) => ({ id: pack.id, packages: [pack, ...pack.providedPackages] })),
|
|
17
|
+
install: installDetailsForMode(value.mode)
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Configure the host before loading commands. Help and non-pack commands do no inventory IO. */
|
|
21
|
+
export function configureCliPackHost(url, options = {}) {
|
|
22
|
+
entryUrl = url;
|
|
23
|
+
snapshot = undefined;
|
|
24
|
+
sourcePromise = undefined;
|
|
25
|
+
setPackLoaderContextProvider(async () => {
|
|
26
|
+
const mode = detectInstallMode(fileURLToPath(url));
|
|
27
|
+
snapshot = readInstalledPacks(mode, options.catalog);
|
|
28
|
+
if (mode.kind === "global" || mode.kind === "local") {
|
|
29
|
+
try {
|
|
30
|
+
const root = await realpath(mode.installRoot);
|
|
31
|
+
const desired = (await readDesiredState(options.stateFile ?? join(getNodetoolDataDir(), "cli-packs.json")))[root];
|
|
32
|
+
if (desired?.dirty) {
|
|
33
|
+
process.stderr.write("Node pack installation is dirty. Run \"nodetool packs doctor --repair\".\n");
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const warning = restoreWarning(snapshot, desired);
|
|
37
|
+
if (warning) {
|
|
38
|
+
process.stderr.write(warning + "\n");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
process.stderr.write("Cannot read node pack desired state. Run \"nodetool packs doctor\".\n");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return loaderContextForSnapshot(snapshot);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** Doctor and installers use the same snapshot that authorized module loading. */
|
|
50
|
+
export async function loadCliPackSnapshot() {
|
|
51
|
+
if (!entryUrl) {
|
|
52
|
+
throw new Error("CLI pack host is not configured");
|
|
53
|
+
}
|
|
54
|
+
await loadPackLoaderContext();
|
|
55
|
+
if (!snapshot) {
|
|
56
|
+
throw new Error("CLI installed pack snapshot is unavailable");
|
|
57
|
+
}
|
|
58
|
+
return snapshot;
|
|
59
|
+
}
|
|
60
|
+
/** Serve and command registries share one source and admitted snapshot per process. */
|
|
61
|
+
export async function getCliPackSource() {
|
|
62
|
+
if (!entryUrl) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
await loadCliPackSnapshot();
|
|
66
|
+
sourcePromise ??= import("@nodetool-ai/websocket/pack-source").then(({ createCatalogPackSource }) => createCatalogPackSource());
|
|
67
|
+
return sourcePromise;
|
|
68
|
+
}
|
|
69
|
+
/** Preserve library callers until a CLI entry explicitly configures its installed policy. */
|
|
70
|
+
export async function registerCliPacks(registry, policy) {
|
|
71
|
+
const source = await getCliPackSource();
|
|
72
|
+
if (source) {
|
|
73
|
+
await source.register(registry, policy);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
await registerAvailablePacks(registry, policy);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/packs/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-manifests.d.ts","sourceRoot":"","sources":["../../src/packs/install-manifests.ts"],"names":[],"mappings":"AAGA,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAgBxF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { readFile, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export async function captureInstallManifests(root) {
|
|
4
|
+
const files = await Promise.all(["package.json", "package-lock.json"].map(async (name) => {
|
|
5
|
+
try {
|
|
6
|
+
return { name, bytes: await readFile(join(root, name)) };
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
10
|
+
return { name, bytes: null };
|
|
11
|
+
}
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
}));
|
|
15
|
+
return async () => {
|
|
16
|
+
for (const file of files) {
|
|
17
|
+
if (file.bytes) {
|
|
18
|
+
await writeFile(join(root, file.name), file.bytes);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
await unlink(join(root, file.name)).catch((error) => {
|
|
22
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=install-manifests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-manifests.js","sourceRoot":"","sources":["../../src/packs/install-manifests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACvF,IAAI,CAAC;YAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAAC,CAAC;QACjE,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAAC,CAAC;YAC3G,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,KAAK,IAAI,EAAE;QAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;iBAClE,CAAC;gBAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBAClE,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;wBAAC,MAAM,KAAK,CAAC;oBAAC,CAAC;gBAC/F,CAAC,CAAC,CAAC;YAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-process.d.ts","sourceRoot":"","sources":["../../src/packs/install-process.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjE;AACD,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
let refusingContext;
|
|
2
|
+
/** Server entry points permanently disable installation in their process. */
|
|
3
|
+
export function refusePackInstallsInProcess(context) {
|
|
4
|
+
refusingContext ??= context;
|
|
5
|
+
}
|
|
6
|
+
export function assertPackInstallProcessAllowed() {
|
|
7
|
+
if (refusingContext) {
|
|
8
|
+
throw new Error(`Node pack installation is disabled in ${refusingContext} processes`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=install-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-process.js","sourceRoot":"","sources":["../../src/packs/install-process.ts"],"names":[],"mappings":"AAAA,IAAI,eAAmC,CAAC;AAExC,6EAA6E;AAC7E,MAAM,UAAU,2BAA2B,CAAC,OAAe;IACzD,eAAe,KAAK,OAAO,CAAC;AAC9B,CAAC;AACD,MAAM,UAAU,+BAA+B;IAC7C,IAAI,eAAe,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,yCAAyC,eAAe,YAAY,CAAC,CAAC;IAAC,CAAC;AACjH,CAAC"}
|