@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,36 @@
|
|
|
1
|
+
import { type MissingPackError, type NodeCatalogIndex } from "@nodetool-ai/node-catalog";
|
|
2
|
+
import { type InstallMode } from "./mode.js";
|
|
3
|
+
export interface InstalledPackage {
|
|
4
|
+
readonly npm: string;
|
|
5
|
+
readonly version: string;
|
|
6
|
+
readonly packageRoot: string;
|
|
7
|
+
readonly realPackageRoot: string;
|
|
8
|
+
}
|
|
9
|
+
export interface InstalledPack extends InstalledPackage {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly providedPackages: readonly InstalledPackage[];
|
|
12
|
+
}
|
|
13
|
+
export interface WrongVersionPack {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly npm: string;
|
|
16
|
+
readonly version: string;
|
|
17
|
+
readonly expectedVersion: string;
|
|
18
|
+
readonly packageRoot: string;
|
|
19
|
+
}
|
|
20
|
+
export interface InvalidInstalledPackage {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly npm: string;
|
|
23
|
+
readonly packageRoot: string;
|
|
24
|
+
readonly reason: string;
|
|
25
|
+
}
|
|
26
|
+
export interface InstalledPackSnapshot {
|
|
27
|
+
readonly mode: InstallMode;
|
|
28
|
+
readonly packs: readonly InstalledPack[];
|
|
29
|
+
readonly wrongVersions: readonly WrongVersionPack[];
|
|
30
|
+
readonly invalidPackages: readonly InvalidInstalledPackage[];
|
|
31
|
+
}
|
|
32
|
+
/** Read the scoped tree once. Hosts retain this snapshot until an explicit reload. */
|
|
33
|
+
export declare function readInstalledPacks(mode: InstallMode, catalog?: NodeCatalogIndex): InstalledPackSnapshot;
|
|
34
|
+
/** Apply CLI layout guidance without changing library or server defaults. */
|
|
35
|
+
export declare function createMissingPackErrorForMode(mode: InstallMode, packId: string, nodeTypes?: readonly string[]): MissingPackError;
|
|
36
|
+
//# sourceMappingURL=installed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.d.ts","sourceRoot":"","sources":["../../src/packs/installed.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACxD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACpD,QAAQ,CAAC,eAAe,EAAE,SAAS,uBAAuB,EAAE,CAAC;CAC9D;AAID,sFAAsF;AACtF,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,gBAAqC,GAC7C,qBAAqB,CAwEvB;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,SAAS,MAAM,EAAO,GAChC,gBAAgB,CAElB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, realpathSync } from "node:fs";
|
|
2
|
+
import { posix, win32 } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { createMissingPackError, readCatalogIndex } from "@nodetool-ai/node-catalog";
|
|
5
|
+
import { installDetailsForMode } from "./mode.js";
|
|
6
|
+
const installedManifestSchema = z.object({ name: z.string(), version: z.string().min(1) });
|
|
7
|
+
/** Read the scoped tree once. Hosts retain this snapshot until an explicit reload. */
|
|
8
|
+
export function readInstalledPacks(mode, catalog = readCatalogIndex()) {
|
|
9
|
+
if (mode.coreVersion !== catalog.coreVersion) {
|
|
10
|
+
throw new Error(`Node catalog core version ${catalog.coreVersion} differs from CLI core version ${mode.coreVersion}`);
|
|
11
|
+
}
|
|
12
|
+
const packs = [];
|
|
13
|
+
const wrongVersions = [];
|
|
14
|
+
const invalidPackages = [];
|
|
15
|
+
if (!mode.nodeModulesRoot) {
|
|
16
|
+
return { mode, packs, wrongVersions, invalidPackages };
|
|
17
|
+
}
|
|
18
|
+
const paths = mode.pathStyle === "win32" ? win32 : posix;
|
|
19
|
+
const scope = paths.join(mode.nodeModulesRoot, "@nodetool-ai");
|
|
20
|
+
let names;
|
|
21
|
+
try {
|
|
22
|
+
names = readdirSync(scope).sort();
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
26
|
+
return { mode, packs, wrongVersions, invalidPackages };
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
const byNpm = new Map();
|
|
31
|
+
for (const pack of catalog.packs) {
|
|
32
|
+
for (const npm of [pack.npm.name, ...pack.provides]) {
|
|
33
|
+
byNpm.set(npm, pack);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const installed = new Map();
|
|
37
|
+
const rejected = new Set();
|
|
38
|
+
for (const name of names) {
|
|
39
|
+
const npm = `@nodetool-ai/${name}`;
|
|
40
|
+
const pack = byNpm.get(npm);
|
|
41
|
+
if (!pack) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const packageRoot = paths.join(scope, name);
|
|
45
|
+
try {
|
|
46
|
+
const manifest = installedManifestSchema.parse(JSON.parse(readFileSync(paths.join(packageRoot, "package.json"), "utf8")));
|
|
47
|
+
if (manifest.name !== npm) {
|
|
48
|
+
throw new Error(`Expected package name ${npm}, found ${manifest.name}`);
|
|
49
|
+
}
|
|
50
|
+
if (manifest.version !== mode.coreVersion) {
|
|
51
|
+
wrongVersions.push({ id: pack.id, npm, version: manifest.version, expectedVersion: mode.coreVersion, packageRoot });
|
|
52
|
+
rejected.add(pack.id);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
installed.set(npm, { npm, version: manifest.version, packageRoot, realPackageRoot: realpathSync(packageRoot) });
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
invalidPackages.push({ id: pack.id, npm, packageRoot, reason: error instanceof Error ? error.message : String(error) });
|
|
59
|
+
rejected.add(pack.id);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const pack of catalog.packs) {
|
|
63
|
+
const primary = installed.get(pack.npm.name);
|
|
64
|
+
if (!primary || rejected.has(pack.id)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const missingCompanions = pack.provides.filter((npm) => !installed.has(npm));
|
|
68
|
+
if (missingCompanions.length > 0) {
|
|
69
|
+
for (const npm of missingCompanions) {
|
|
70
|
+
invalidPackages.push({ id: pack.id, npm, packageRoot: paths.join(mode.nodeModulesRoot, npm), reason: `Missing companion package for node pack ${pack.id}` });
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const providedPackages = pack.provides.flatMap((npm) => {
|
|
75
|
+
const companion = installed.get(npm);
|
|
76
|
+
return companion ? [companion] : [];
|
|
77
|
+
});
|
|
78
|
+
packs.push({ id: pack.id, ...primary, providedPackages });
|
|
79
|
+
}
|
|
80
|
+
packs.sort((a, b) => a.id.localeCompare(b.id));
|
|
81
|
+
return { mode, packs, wrongVersions, invalidPackages };
|
|
82
|
+
}
|
|
83
|
+
/** Apply CLI layout guidance without changing library or server defaults. */
|
|
84
|
+
export function createMissingPackErrorForMode(mode, packId, nodeTypes = []) {
|
|
85
|
+
return createMissingPackError(packId, nodeTypes, installDetailsForMode(mode));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=installed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.js","sourceRoot":"","sources":["../../src/packs/installed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type NodeCatalogIndex, type CatalogNode } from "@nodetool-ai/node-catalog";
|
|
2
|
+
import { type InstalledPackSnapshot } from "./installed.js";
|
|
3
|
+
export declare function verifyPackLoads(snapshot: InstalledPackSnapshot, catalog: NodeCatalogIndex, nodes: readonly CatalogNode[], ids: readonly string[]): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=installer-load-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer-load-check.d.ts","sourceRoot":"","sources":["../../src/packs/installer-load-check.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE1J,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGhF,wBAAsB,eAAe,CAAC,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBtK"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { realpath } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { readCatalogIndex, importPack, readCatalogNodes, setPackLoaderContext } from "@nodetool-ai/node-catalog";
|
|
7
|
+
import { NodeRegistry, isCallable } from "@nodetool-ai/node-sdk";
|
|
8
|
+
import { readInstalledPacks } from "./installed.js";
|
|
9
|
+
import { loaderContextForSnapshot } from "./host.js";
|
|
10
|
+
export async function verifyPackLoads(snapshot, catalog, nodes, ids) {
|
|
11
|
+
setPackLoaderContext(loaderContextForSnapshot(snapshot));
|
|
12
|
+
const coreSdk = await realpath(createRequire(join(snapshot.mode.cliRoot, "package.json")).resolve("@nodetool-ai/node-sdk"));
|
|
13
|
+
for (const id of ids) {
|
|
14
|
+
const pack = catalog.packs.find((entry) => entry.id === id);
|
|
15
|
+
const installed = snapshot.packs.find((entry) => entry.id === id);
|
|
16
|
+
if (!pack || !installed) {
|
|
17
|
+
throw new Error(`Load check pack unavailable: ${id}`);
|
|
18
|
+
}
|
|
19
|
+
for (const entry of [installed, ...installed.providedPackages]) {
|
|
20
|
+
const sdk = await realpath(createRequire(join(entry.realPackageRoot, "package.json")).resolve("@nodetool-ai/node-sdk"));
|
|
21
|
+
if (sdk !== coreSdk) {
|
|
22
|
+
throw new Error(`Pack resolves another node-sdk: ${entry.npm}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const module = await importPack(id);
|
|
26
|
+
const registrar = z.object({
|
|
27
|
+
[pack.registrar]: z.custom(isCallable)
|
|
28
|
+
}).parse(module)[pack.registrar];
|
|
29
|
+
const registry = new NodeRegistry();
|
|
30
|
+
registry.registerPackage(id, registrar);
|
|
31
|
+
const actual = [...registry.list()].sort();
|
|
32
|
+
const expected = nodes.filter((node) => node.pack === id).map((node) => node.node_type).sort();
|
|
33
|
+
if (JSON.stringify(actual) !== JSON.stringify(expected)) {
|
|
34
|
+
throw new Error(`Pack owned node types differ from catalog: ${id}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Fresh child entry. Parent integrity verification must succeed before spawning this process. */
|
|
39
|
+
async function main() {
|
|
40
|
+
const [cliRoot, installRoot, ...ids] = process.argv.slice(2);
|
|
41
|
+
if (!cliRoot || !installRoot) {
|
|
42
|
+
throw new Error("Pack load check requires CLI and install roots");
|
|
43
|
+
}
|
|
44
|
+
const catalog = readCatalogIndex();
|
|
45
|
+
const mode = { kind: "local", cliRoot, installRoot, nodeModulesRoot: join(installRoot, "node_modules"),
|
|
46
|
+
coreVersion: catalog.coreVersion, pathStyle: process.platform === "win32" ? "win32" : "posix" };
|
|
47
|
+
await verifyPackLoads(readInstalledPacks(mode, catalog), catalog, readCatalogNodes(), ids);
|
|
48
|
+
}
|
|
49
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
50
|
+
main().catch((error) => { console.error(error); process.exitCode = 1; });
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=installer-load-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer-load-check.js","sourceRoot":"","sources":["../../src/packs/installer-load-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { installerNpmVersion, runInstallerNpm } from "../npm-runner.js";
|
|
2
|
+
import { type InstallPacksRequest, type DesiredPackState } from "./install-selection.js";
|
|
3
|
+
import { type InstallAuthorization } from "../commands/pack-install-authorization.js";
|
|
4
|
+
import type { InstallMode } from "./mode.js";
|
|
5
|
+
export type { DesiredPackState, InstallPacksRequest } from "./install-selection.js";
|
|
6
|
+
export interface InstallerOperations {
|
|
7
|
+
readonly npmVersion: typeof installerNpmVersion;
|
|
8
|
+
readonly npm: typeof runInstallerNpm;
|
|
9
|
+
readonly loadCheck: (mode: InstallMode, packs: readonly string[], signal?: AbortSignal) => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare const DEFAULT_INSTALLER_OPERATIONS: InstallerOperations;
|
|
12
|
+
/** Additive install transaction. Requires a live command authorization. */
|
|
13
|
+
export declare function installPacks(request: InstallPacksRequest, authorization: InstallAuthorization, operations?: InstallerOperations): Promise<DesiredPackState>;
|
|
14
|
+
/** Repair verifies the current pinned cohort and explicitly restores missing desired entries. */
|
|
15
|
+
export declare function repairPackInstallation(request: InstallPacksRequest, authorization: InstallAuthorization, operations?: InstallerOperations): Promise<DesiredPackState>;
|
|
16
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/packs/installer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAA+C,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACtI,OAAO,EAAmE,KAAK,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAMvJ,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACpF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,OAAO,mBAAmB,CAAC;IAChD,QAAQ,CAAC,GAAG,EAAE,OAAO,eAAe,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1G;AAiBD,eAAO,MAAM,4BAA4B,EAAE,mBAE1C,CAAC;AAEF,2EAA2E;AAC3E,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,GAAE,mBAAkD,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE/L;AAED,iGAAiG;AACjG,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,GAAE,mBAAkD,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEzM"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { acquireInstallLock } from "../install-lock.js";
|
|
4
|
+
import { installerNpmVersion, runInstallerNpm } from "../npm-runner.js";
|
|
5
|
+
import { prepareInstallSelection, expandCatalogPacks } from "./install-selection.js";
|
|
6
|
+
import { assertLiveInstallAuthorization, assertInstallAuthorizationScope } from "../commands/pack-install-authorization.js";
|
|
7
|
+
import { prepareTreeVerification } from "./install-verification.js";
|
|
8
|
+
import { captureInstallManifests } from "./install-manifests.js";
|
|
9
|
+
import { normalizeGlobalBootstrap } from "./global-bootstrap.js";
|
|
10
|
+
import { normalizeOwnedPackReplay } from "./owned-replay-plan.js";
|
|
11
|
+
import { writeDesiredState } from "./install-state.js";
|
|
12
|
+
import { snapshotInstallTree, installTreeRestored, parseInstallPlan, assertAdditivePlan, assertTreePins, assertSharedIdentities, removeSnapshotAdditions } from "./install-tree.js";
|
|
13
|
+
function childLoadCheck(mode, packs, signal) {
|
|
14
|
+
if (mode.kind !== "global" && mode.kind !== "local") {
|
|
15
|
+
throw new Error(mode.reason);
|
|
16
|
+
}
|
|
17
|
+
const entry = fileURLToPath(new URL("./installer-load-check.js", import.meta.url));
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const child = spawn(process.execPath, [entry, mode.cliRoot, mode.installRoot, ...packs], {
|
|
20
|
+
shell: false, stdio: ["ignore", "pipe", "pipe"], signal
|
|
21
|
+
});
|
|
22
|
+
let output = "";
|
|
23
|
+
child.stdout.on("data", (chunk) => { output += chunk.toString(); });
|
|
24
|
+
child.stderr.on("data", (chunk) => { output += chunk.toString(); });
|
|
25
|
+
child.on("error", reject);
|
|
26
|
+
child.on("close", (code) => { if (code === 0) {
|
|
27
|
+
resolve();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
reject(new Error(`Pack load check failed (${String(code)}): ${output.trim()}`));
|
|
31
|
+
} });
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export const DEFAULT_INSTALLER_OPERATIONS = {
|
|
35
|
+
npmVersion: installerNpmVersion, npm: runInstallerNpm, loadCheck: childLoadCheck
|
|
36
|
+
};
|
|
37
|
+
/** Additive install transaction. Requires a live command authorization. */
|
|
38
|
+
export async function installPacks(request, authorization, operations = DEFAULT_INSTALLER_OPERATIONS) {
|
|
39
|
+
return installPacksTransaction(request, authorization, operations, "install");
|
|
40
|
+
}
|
|
41
|
+
/** Repair verifies the current pinned cohort and explicitly restores missing desired entries. */
|
|
42
|
+
export async function repairPackInstallation(request, authorization, operations = DEFAULT_INSTALLER_OPERATIONS) {
|
|
43
|
+
return installPacksTransaction(request, authorization, operations, "repair");
|
|
44
|
+
}
|
|
45
|
+
async function installPacksTransaction(request, authorization, operations, operation) {
|
|
46
|
+
const { mode } = request;
|
|
47
|
+
if (mode.kind !== "global" && mode.kind !== "local") {
|
|
48
|
+
throw new Error(mode.reason);
|
|
49
|
+
}
|
|
50
|
+
assertLiveInstallAuthorization(authorization);
|
|
51
|
+
const selectionOptions = operation === "repair" ? { allowDirty: true, restoreDesired: true } : {};
|
|
52
|
+
const initial = await prepareInstallSelection(request, selectionOptions);
|
|
53
|
+
assertInstallAuthorizationScope(authorization, initial, operation, request);
|
|
54
|
+
const root = initial.root;
|
|
55
|
+
const release = await acquireInstallLock(mode.nodeModulesRoot, ".nodetool-packs.lock", { signal: request.signal });
|
|
56
|
+
try {
|
|
57
|
+
const selection = await prepareInstallSelection(request, selectionOptions);
|
|
58
|
+
assertInstallAuthorizationScope(authorization, selection, operation, request);
|
|
59
|
+
const { previous, before, installedIds, packs, catalog, replayLibraries, initialGlobalLockMissing } = selection;
|
|
60
|
+
const libraries = selection.runtimeLibraries;
|
|
61
|
+
const version = await operations.npmVersion(root, request.signal, request.onWarning);
|
|
62
|
+
const { pins: selectedPins, provided, runtimePins, shared, coreNames, libraryPins, pinByFolder } = await prepareTreeVerification(selection, mode.cliRoot);
|
|
63
|
+
const bootstrap = selection.bootstrap ?? [];
|
|
64
|
+
const pins = [...selectedPins, ...bootstrap];
|
|
65
|
+
const spec = (pin) => pin.installName && pin.installName !== pin.name
|
|
66
|
+
? `${pin.installName}@npm:${pin.name}@${pin.version}` : `${pin.name}@${pin.version}`;
|
|
67
|
+
const specs = [...new Set([...packs.map((pack) => spec(pack.npm)), ...provided.map(spec), ...runtimePins.map(spec), ...bootstrap.map(spec)])];
|
|
68
|
+
const alreadyComplete = operation === "repair" && !initialGlobalLockMissing && pins.every((pin) => before.some((entry) => entry.name === pin.name && entry.version === pin.version && entry.integrity === pin.integrity));
|
|
69
|
+
const plan = alreadyComplete ? { add: [], change: [], remove: [] } :
|
|
70
|
+
parseInstallPlan(await operations.npm(root, ["install", ...specs, ...(Number(version.split(".")[0]) >= 11 ? ["--json"] : [])], { mode: mode.kind, dryRun: true, signal: request.signal, onWarning: request.onWarning }), version);
|
|
71
|
+
assertAdditivePlan(normalizeGlobalBootstrap(normalizeOwnedPackReplay(plan, before, catalog, coreNames), bootstrap), before, coreNames, shared, mode.coreVersion);
|
|
72
|
+
let desired = { root, coreVersion: mode.coreVersion, packs: [...new Set([...previous.packs, ...packs.filter((pack) => pack.kind === "node-pack").map((pack) => pack.id)])].sort(), runtimeLibraries: [...new Set([...previous.runtimeLibraries, ...libraries])].sort() };
|
|
73
|
+
if (operation === "repair") {
|
|
74
|
+
desired = { ...desired, dirty: false };
|
|
75
|
+
}
|
|
76
|
+
const restoreSavedFiles = await captureInstallManifests(root);
|
|
77
|
+
try {
|
|
78
|
+
if (!alreadyComplete) {
|
|
79
|
+
await operations.npm(root, ["install", ...specs], { mode: mode.kind, signal: request.signal, onWarning: request.onWarning });
|
|
80
|
+
}
|
|
81
|
+
const after = await snapshotInstallTree(root);
|
|
82
|
+
const installedShared = shared.filter((pin) => after.some((entry) => entry.name === pin.name));
|
|
83
|
+
assertTreePins(before, after, [...pins, ...installedShared], coreNames, mode.coreVersion, initialGlobalLockMissing);
|
|
84
|
+
if (mode.kind === "global" && after.some((entry) => entry.name === "@nodetool-ai/cli")) {
|
|
85
|
+
throw new Error("Install added another CLI core package");
|
|
86
|
+
}
|
|
87
|
+
await assertSharedIdentities(after, installedShared);
|
|
88
|
+
for (const pin of new Map(packs.flatMap((pack) => pack.scriptAllowlist).map((pin) => [pin.name, pin])).values()) {
|
|
89
|
+
if (operation === "repair" || !before.some((entry) => entry.name === pin.name && entry.version === pin.version && entry.integrity === pin.integrity)) {
|
|
90
|
+
await operations.npm(root, ["rebuild", pin.name], { mode: mode.kind, rebuild: true, signal: request.signal, onWarning: request.onWarning });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
await operations.loadCheck(mode, packs.filter((pack) => pack.kind === "node-pack").map((pack) => pack.id), request.signal);
|
|
94
|
+
await writeDesiredState(request.stateFile, desired);
|
|
95
|
+
return desired;
|
|
96
|
+
}
|
|
97
|
+
catch (cause) {
|
|
98
|
+
let restored = false;
|
|
99
|
+
try {
|
|
100
|
+
const oldPacks = expandCatalogPacks(catalog, installedIds);
|
|
101
|
+
const oldSpecs = [...bootstrap.map(spec), ...oldPacks.map((pack) => spec(pack.npm)), ...oldPacks.flatMap((pack) => pack.provides.map((name) => {
|
|
102
|
+
const pin = pinByFolder.get(name);
|
|
103
|
+
if (!pin) {
|
|
104
|
+
throw new Error(`Provided package ${name} has no rollback integrity pin`);
|
|
105
|
+
}
|
|
106
|
+
return spec(pin);
|
|
107
|
+
})), ...replayLibraries.flatMap((id) => libraryPins(id).map(spec))];
|
|
108
|
+
const oldNames = new Set(before.map((entry) => entry.name));
|
|
109
|
+
const additions = [...new Set(plan.add.filter((entry) => !oldNames.has(entry.name)).map((entry) => entry.name))];
|
|
110
|
+
// npm uninstall --no-save retains extraneous no-save additions. The
|
|
111
|
+
// saving removal is confined to rollback and manifests are restored below.
|
|
112
|
+
if (additions.length) {
|
|
113
|
+
await operations.npm(root, ["uninstall", ...additions], { mode: "local", onWarning: request.onWarning });
|
|
114
|
+
}
|
|
115
|
+
if (mode.kind === "global") {
|
|
116
|
+
await removeSnapshotAdditions(root, mode.nodeModulesRoot, before);
|
|
117
|
+
await restoreSavedFiles();
|
|
118
|
+
await operations.npm(root, ["install", ...oldSpecs], { mode: mode.kind });
|
|
119
|
+
}
|
|
120
|
+
restored = installTreeRestored(before, await snapshotInstallTree(root), initialGlobalLockMissing);
|
|
121
|
+
if (restored) {
|
|
122
|
+
await restoreSavedFiles();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
restored = false;
|
|
127
|
+
}
|
|
128
|
+
if (!restored) {
|
|
129
|
+
await writeDesiredState(request.stateFile, { ...previous, dirty: true });
|
|
130
|
+
throw new Error("Pack install failed and rollback did not restore the tree. Run nodetool packs doctor --repair.", { cause });
|
|
131
|
+
}
|
|
132
|
+
if (operation === "repair") {
|
|
133
|
+
await writeDesiredState(request.stateFile, { ...previous, dirty: true });
|
|
134
|
+
}
|
|
135
|
+
throw cause;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
await release();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/packs/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { NodeCatalogIndex } from "@nodetool-ai/node-catalog";
|
|
2
|
+
import type { DesiredPackState } from "./install-selection.js";
|
|
3
|
+
import type { InstalledPackSnapshot } from "./installed.js";
|
|
4
|
+
export interface PackListRow {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly kind: "core" | "node-pack" | "runtime-library";
|
|
7
|
+
readonly installed: boolean;
|
|
8
|
+
readonly version: string | null;
|
|
9
|
+
readonly installBytes: number | null;
|
|
10
|
+
readonly nodeCount: number | null;
|
|
11
|
+
readonly requiredBy: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function requestedInstallIds(catalog: NodeCatalogIndex, ids: readonly string[]): {
|
|
14
|
+
packs: string[];
|
|
15
|
+
runtimeLibraries: string[];
|
|
16
|
+
};
|
|
17
|
+
/** The installed tree decides availability. Desired intent never makes a package installed. */
|
|
18
|
+
export declare function listPackRows(catalog: NodeCatalogIndex, snapshot: InstalledPackSnapshot, installedRuntimeIds?: ReadonlySet<string>): PackListRow[];
|
|
19
|
+
export declare function explainPack(catalog: NodeCatalogIndex, snapshot: InstalledPackSnapshot, target: string, installedRuntimeIds?: ReadonlySet<string>): {
|
|
20
|
+
target: string;
|
|
21
|
+
id: "email-imap" | "esbuild" | "fabric" | "imaging" | "node-llama-cpp" | "office-documents" | "pdf-js" | "playwright" | "rapier" | "tensorflow-js" | "tesseract-ocr" | "tokenizer" | "tracing" | "transformers-js" | "typescript" | "whisper-cpp";
|
|
22
|
+
kind: string;
|
|
23
|
+
installed: boolean;
|
|
24
|
+
packages: readonly ["@dimforge/rapier3d-compat@0.19.3"] | readonly ["@fugood/whisper.node@1.1.3"] | readonly ["esbuild@0.28.1"] | readonly ["fabric@7.4.0"] | readonly ["js-tiktoken@1.0.21"] | readonly ["node-llama-cpp@3.19.1"] | readonly ["playwright@1.60.0"] | readonly ["tesseract.js@7.0.0"] | readonly ["typescript@npm:@typescript/typescript6@6.0.2"] | readonly ["@huggingface/transformers@3.8.1", "kokoro-js@1.2.1"] | readonly ["imapflow@1.7.1", "mailparser@3.9.15"] | readonly ["sharp@0.35.5", "@napi-rs/canvas@0.1.100"] | readonly ["@llamaindex/liteparse@1.5.3", "pdf-parse@2.4.5", "pdf-lib@1.17.1"] | readonly ["@opentelemetry/core@2.12.0", "@opentelemetry/resources@2.12.0", "@opentelemetry/sdk-trace-base@2.12.0"] | readonly ["@tensorflow/tfjs@4.22.0", "@tensorflow-models/mobilenet@2.1.1", "@tensorflow-models/coco-ssd@2.2.3", "@tensorflow-models/qna@1.0.2"] | readonly ["exceljs@4.4.0", "docx@9.7.1", "mammoth@1.12.1", "pptxgenjs@4.0.1", "office-text-extractor@4.0.0", "epub2@3.0.2"];
|
|
25
|
+
requiredBy: string[];
|
|
26
|
+
npm?: undefined;
|
|
27
|
+
version?: undefined;
|
|
28
|
+
requires?: undefined;
|
|
29
|
+
runtimeLibraries?: undefined;
|
|
30
|
+
} | {
|
|
31
|
+
packages?: undefined;
|
|
32
|
+
target: string;
|
|
33
|
+
id: string;
|
|
34
|
+
kind: "core" | "node-pack";
|
|
35
|
+
npm: string;
|
|
36
|
+
version: string;
|
|
37
|
+
installed: boolean;
|
|
38
|
+
requires: string[];
|
|
39
|
+
runtimeLibraries: readonly string[];
|
|
40
|
+
requiredBy: string[];
|
|
41
|
+
};
|
|
42
|
+
export declare function restoreWarning(snapshot: InstalledPackSnapshot, desired: DesiredPackState | undefined): string | null;
|
|
43
|
+
/** Removal retains any requested pack still required by another installed pack. */
|
|
44
|
+
export declare function planPackRemoval(catalog: NodeCatalogIndex, installedIds: readonly string[], requestedIds: readonly string[]): {
|
|
45
|
+
remove: string[];
|
|
46
|
+
kept: string[];
|
|
47
|
+
remaining: string[];
|
|
48
|
+
runtimeLibraries: string[];
|
|
49
|
+
};
|
|
50
|
+
export declare function restartNotice(ids: readonly string[]): string;
|
|
51
|
+
//# sourceMappingURL=management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"management.d.ts","sourceRoot":"","sources":["../../src/packs/management.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,iBAAiB,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBtI;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,mBAAmB,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,WAAW,EAAE,CAc5J;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAE,WAAW,CAAC,MAAM,CAAa;;;;;;;;;;;;;;;;;;;;;;EAc3J;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAUpH;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE;;;;;EAW1H;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { RUNTIME_NPM_PACKAGES, isRuntimeNpmPackageId } from "@nodetool-ai/protocol/runtime-npm-packages";
|
|
2
|
+
import { expandCatalogPacks } from "./install-selection.js";
|
|
3
|
+
export function requestedInstallIds(catalog, ids) {
|
|
4
|
+
const packs = [];
|
|
5
|
+
const runtimeLibraries = [];
|
|
6
|
+
for (const id of new Set(ids)) {
|
|
7
|
+
const pack = catalog.packs.find(entry => entry.id === id);
|
|
8
|
+
if (pack) {
|
|
9
|
+
if (pack.kind === "core") {
|
|
10
|
+
throw new Error(`Pack ${id} ships with the CLI and cannot be installed separately`);
|
|
11
|
+
}
|
|
12
|
+
packs.push(id);
|
|
13
|
+
}
|
|
14
|
+
else if (isRuntimeNpmPackageId(id)) {
|
|
15
|
+
runtimeLibraries.push(id);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
throw new Error(`Unknown node pack or runtime library: ${id}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return { packs: packs.sort(), runtimeLibraries: runtimeLibraries.sort() };
|
|
22
|
+
}
|
|
23
|
+
/** The installed tree decides availability. Desired intent never makes a package installed. */
|
|
24
|
+
export function listPackRows(catalog, snapshot, installedRuntimeIds = new Set()) {
|
|
25
|
+
const installed = new Map(snapshot.packs.map(pack => [pack.id, pack.version]));
|
|
26
|
+
const rows = catalog.packs.map(pack => ({
|
|
27
|
+
id: pack.id, kind: pack.kind, installed: installed.has(pack.id), version: installed.get(pack.id) ?? null,
|
|
28
|
+
installBytes: pack.installBytes, nodeCount: pack.nodeCount,
|
|
29
|
+
requiredBy: catalog.packs.filter(candidate => installed.has(candidate.id) && candidate.requires.includes(pack.id)).map(candidate => candidate.id).sort()
|
|
30
|
+
}));
|
|
31
|
+
for (const [id, runtime] of Object.entries(RUNTIME_NPM_PACKAGES)) {
|
|
32
|
+
rows.push({ id, kind: "runtime-library", installed: installedRuntimeIds.has(id),
|
|
33
|
+
version: installedRuntimeIds.has(id) ? runtime.npmPackages.join(", ") : null,
|
|
34
|
+
installBytes: null, nodeCount: null,
|
|
35
|
+
requiredBy: catalog.packs.filter(pack => installed.has(pack.id) && pack.runtimeLibraries.includes(id)).map(pack => pack.id).sort() });
|
|
36
|
+
}
|
|
37
|
+
return rows.sort((a, b) => a.id.localeCompare(b.id) || a.kind.localeCompare(b.kind));
|
|
38
|
+
}
|
|
39
|
+
export function explainPack(catalog, snapshot, target, installedRuntimeIds = new Set()) {
|
|
40
|
+
const id = catalog.owners[target] ?? target;
|
|
41
|
+
const pack = catalog.packs.find(entry => entry.id === id);
|
|
42
|
+
if (!pack) {
|
|
43
|
+
if (!isRuntimeNpmPackageId(id)) {
|
|
44
|
+
throw new Error(`Unknown node type, pack or runtime library: ${target}`);
|
|
45
|
+
}
|
|
46
|
+
return { target, id, kind: "runtime-library", installed: installedRuntimeIds.has(id), packages: RUNTIME_NPM_PACKAGES[id].npmPackages,
|
|
47
|
+
requiredBy: catalog.packs.filter(entry => entry.runtimeLibraries.includes(id)).map(entry => entry.id).sort() };
|
|
48
|
+
}
|
|
49
|
+
return { target, id, kind: pack.kind, npm: pack.npm.name, version: pack.npm.version,
|
|
50
|
+
installed: snapshot.packs.some(entry => entry.id === id),
|
|
51
|
+
requires: expandCatalogPacks(catalog, pack.requires).map(entry => entry.id), runtimeLibraries: pack.runtimeLibraries,
|
|
52
|
+
requiredBy: catalog.packs.filter(entry => entry.requires.includes(id)).map(entry => entry.id).sort() };
|
|
53
|
+
}
|
|
54
|
+
export function restoreWarning(snapshot, desired) {
|
|
55
|
+
if (!desired || desired.coreVersion === snapshot.mode.coreVersion) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const installed = new Set(snapshot.packs.map(pack => pack.id));
|
|
59
|
+
const missing = [...new Set(desired.packs)].filter(id => !installed.has(id)).sort();
|
|
60
|
+
if (missing.length === 0) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return `${missing.length} pack${missing.length === 1 ? "" : "s"} from ${desired.coreVersion} ${missing.length === 1 ? "is" : "are"} not installed for ${snapshot.mode.coreVersion}: ${missing.join(", ")}. Run "nodetool packs add --restore".`;
|
|
64
|
+
}
|
|
65
|
+
/** Removal retains any requested pack still required by another installed pack. */
|
|
66
|
+
export function planPackRemoval(catalog, installedIds, requestedIds) {
|
|
67
|
+
const requested = requestedInstallIds(catalog, requestedIds);
|
|
68
|
+
const installed = new Set(installedIds);
|
|
69
|
+
const wanted = new Set(requested.packs);
|
|
70
|
+
const other = installedIds.filter(id => !wanted.has(id));
|
|
71
|
+
const needed = new Set(expandCatalogPacks(catalog, other).map(pack => pack.id));
|
|
72
|
+
const remove = requested.packs.filter(id => installed.has(id) && !needed.has(id));
|
|
73
|
+
const kept = requested.packs.filter(id => needed.has(id));
|
|
74
|
+
const removed = new Set(remove);
|
|
75
|
+
const remaining = installedIds.filter(id => !removed.has(id));
|
|
76
|
+
return { remove, kept, remaining, runtimeLibraries: requested.runtimeLibraries };
|
|
77
|
+
}
|
|
78
|
+
export function restartNotice(ids) {
|
|
79
|
+
return `Restart running "nodetool serve" and "nodetool mcp serve" processes to load ${[...new Set(ids)].sort().join(", ")}.`;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=management.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"management.js","sourceRoot":"","sources":["../../src/packs/management.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAEzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAa5D,MAAM,UAAU,mBAAmB,CAAC,OAAyB,EAAE,GAAsB;IACnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,KAAK,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,wDAAwD,CAAC,CAAC;YACtF,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,qBAAqB,CAAC,EAAE,CAAC,EAAE,CAAC;YACrC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,yCAAyC,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC;AAC5E,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,YAAY,CAAC,OAAyB,EAAE,QAA+B,EAAE,mBAAmB,GAAwB,IAAI,GAAG,EAAE;IAC3I,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAkB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI;QACxG,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS;QAC1D,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;KACzJ,CAAC,CAAC,CAAC;IACJ,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7E,OAAO,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;YAC5E,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI;YACnC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1I,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAyB,EAAE,QAA+B,EAAE,MAAc,EAAE,mBAAmB,GAAwB,IAAI,GAAG,EAAE;IAC1J,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC,WAAW;YAClI,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACnH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO;QACjF,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QACxD,QAAQ,EAAE,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACpH,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAA+B,EAAE,OAAqC;IACnG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,MAAM,QAAQ,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,sBAAsB,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uCAAuC,CAAC;AAClP,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,OAAyB,EAAE,YAA+B,EAAE,YAA+B;IACzH,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAsB;IAClD,OAAO,+EAA+E,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC/H,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { MissingPackInstall } from "@nodetool-ai/node-catalog";
|
|
2
|
+
export type InstallPathStyle = "posix" | "win32";
|
|
3
|
+
interface InstallIdentity {
|
|
4
|
+
readonly cliRoot: string;
|
|
5
|
+
readonly coreVersion: string;
|
|
6
|
+
readonly pathStyle: InstallPathStyle;
|
|
7
|
+
}
|
|
8
|
+
export type InstallMode = InstallIdentity & ({
|
|
9
|
+
readonly kind: "global";
|
|
10
|
+
readonly installRoot: string;
|
|
11
|
+
readonly nodeModulesRoot: string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: "local";
|
|
14
|
+
readonly installRoot: string;
|
|
15
|
+
readonly nodeModulesRoot: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: "npx" | "dev" | "unsupported";
|
|
18
|
+
readonly reason: string;
|
|
19
|
+
readonly nodeModulesRoot: string | null;
|
|
20
|
+
});
|
|
21
|
+
export interface InstallLayout {
|
|
22
|
+
readonly cliRoot: string;
|
|
23
|
+
readonly coreVersion: string;
|
|
24
|
+
readonly pathStyle?: InstallPathStyle;
|
|
25
|
+
readonly globalNodeModulesRoots?: readonly string[];
|
|
26
|
+
readonly projectHasCli?: boolean;
|
|
27
|
+
readonly yarnPnp?: boolean;
|
|
28
|
+
readonly bunGlobalRoots?: readonly string[];
|
|
29
|
+
readonly workspaceRoot?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface InstallModeOptions {
|
|
32
|
+
readonly globalNodeModulesRoots?: readonly string[];
|
|
33
|
+
readonly bunGlobalRoots?: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
/** Classify a known package root without filesystem reads or npm subprocesses. */
|
|
36
|
+
export declare function classifyInstallLayout(layout: InstallLayout): InstallMode;
|
|
37
|
+
/** Resolve the real CLI entry and inspect its layout only when the host requests it. */
|
|
38
|
+
export declare function detectInstallMode(entryPath: string, options?: InstallModeOptions): InstallMode;
|
|
39
|
+
/** The catalog factory supplies the concrete closure when no ids are available yet. */
|
|
40
|
+
export declare function installDetailsForMode(mode: InstallMode, ids?: readonly string[]): MissingPackInstall;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../../src/packs/mode.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjD,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAED,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,CACxC;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GAC1F;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CACrH,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpD,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpD,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAqBD,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAmCxE;AAiHD,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAkClG;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,GAAE,SAAS,MAAM,EAAO,GAAG,kBAAkB,CAKxG"}
|