@nodetool-ai/cli 0.8.2 → 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/README.md +27 -0
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/affected/affected.d.ts +4 -1
- package/dist/affected/affected.d.ts.map +1 -1
- package/dist/affected/affected.js +9 -2
- package/dist/affected/affected.js.map +1 -1
- package/dist/app-debug/harness.js +1 -1
- package/dist/app-debug/harness.js.map +1 -1
- package/dist/child-exit.d.ts +3 -0
- package/dist/child-exit.d.ts.map +1 -0
- package/dist/child-exit.js +17 -0
- package/dist/child-exit.js.map +1 -0
- 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/affected.d.ts.map +1 -1
- package/dist/commands/affected.js +10 -5
- package/dist/commands/affected.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +11 -2
- 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 +128 -34
- 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/deploy-helpers.d.ts +2 -1
- package/dist/commands/deploy-helpers.d.ts.map +1 -1
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +4 -3
- 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 +112 -23
- 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 +203 -13
- 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/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +2 -0
- package/dist/commands/mcp.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/output.d.ts +8 -0
- package/dist/commands/output.d.ts.map +1 -1
- package/dist/commands/output.js +18 -0
- package/dist/commands/output.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 +11 -13
- 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 +20 -29
- 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 +4 -4
- 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 +2 -5
- 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 +15 -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/debug-bundle.d.ts +12 -0
- package/dist/debug-bundle.d.ts.map +1 -0
- package/dist/debug-bundle.js +23 -0
- package/dist/debug-bundle.js.map +1 -0
- package/dist/document-json.d.ts +11 -0
- package/dist/document-json.d.ts.map +1 -0
- package/dist/document-json.js +27 -0
- package/dist/document-json.js.map +1 -0
- 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-coverage.d.ts +1 -1
- package/dist/harness/capability-coverage.d.ts.map +1 -1
- package/dist/harness/capability-coverage.js +1 -1
- package/dist/harness/capability-coverage.js.map +1 -1
- package/dist/harness/capability-table.d.ts.map +1 -1
- package/dist/harness/capability-table.js +87 -17
- package/dist/harness/capability-table.js.map +1 -1
- package/dist/harness/registry.d.ts.map +1 -1
- package/dist/harness/registry.js +183 -6
- package/dist/harness/registry.js.map +1 -1
- package/dist/index.js +13 -5
- 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 +22 -0
- package/dist/js-script-debug/harness.d.ts.map +1 -1
- package/dist/js-script-debug/harness.js +14 -35
- package/dist/js-script-debug/harness.js.map +1 -1
- package/dist/js-script-debug/target.d.ts.map +1 -1
- package/dist/js-script-debug/target.js +1 -24
- package/dist/js-script-debug/target.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 +114 -76
- 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/package-assets.d.ts +8 -0
- package/dist/package-assets.d.ts.map +1 -0
- package/dist/package-assets.js +21 -0
- package/dist/package-assets.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 +46 -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/sandbox-catalog.d.ts +3 -1
- package/dist/sandbox-catalog.d.ts.map +1 -1
- package/dist/sandbox-catalog.js +7 -2
- package/dist/sandbox-catalog.js.map +1 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +2 -0
- package/dist/settings.js.map +1 -1
- package/dist/sketch-debug/harness.d.ts +15 -1
- package/dist/sketch-debug/harness.d.ts.map +1 -1
- package/dist/sketch-debug/harness.js +11 -38
- package/dist/sketch-debug/harness.js.map +1 -1
- package/dist/sketch-debug/target.d.ts.map +1 -1
- package/dist/sketch-debug/target.js +1 -24
- package/dist/sketch-debug/target.js.map +1 -1
- package/dist/stdin.d.ts +6 -1
- package/dist/stdin.d.ts.map +1 -1
- package/dist/stdin.js +8 -0
- package/dist/stdin.js.map +1 -1
- package/dist/timeline-debug/harness.d.ts +14 -0
- package/dist/timeline-debug/harness.d.ts.map +1 -1
- package/dist/timeline-debug/harness.js +9 -31
- package/dist/timeline-debug/harness.js.map +1 -1
- package/dist/timeline-debug/target.d.ts.map +1 -1
- package/dist/timeline-debug/target.js +1 -24
- package/dist/timeline-debug/target.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 -40
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type NodeCatalogIndex, type CatalogPack, type PinnedPackage } from "@nodetool-ai/node-catalog";
|
|
2
|
+
import type { InstallMode } from "./mode.js";
|
|
3
|
+
import { type TreePackage } from "./install-tree.js";
|
|
4
|
+
import { type GlobalBootstrapPin } from "./global-bootstrap.js";
|
|
5
|
+
import { type DesiredPackState } from "./install-state.js";
|
|
6
|
+
export { readDesiredState } from "./install-state.js";
|
|
7
|
+
export type { DesiredPackState } from "./install-state.js";
|
|
8
|
+
export interface InstallPacksRequest {
|
|
9
|
+
readonly mode: InstallMode;
|
|
10
|
+
readonly packs: readonly string[];
|
|
11
|
+
readonly runtimeLibraries?: readonly string[];
|
|
12
|
+
readonly stateFile: string;
|
|
13
|
+
readonly catalog?: NodeCatalogIndex;
|
|
14
|
+
readonly signal?: AbortSignal;
|
|
15
|
+
readonly onWarning?: (warning: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface InstallSelection {
|
|
18
|
+
readonly root: string;
|
|
19
|
+
readonly coreVersion: string;
|
|
20
|
+
readonly mode: "global" | "local";
|
|
21
|
+
readonly packs: readonly CatalogPack[];
|
|
22
|
+
readonly runtimeLibraries: readonly string[];
|
|
23
|
+
readonly scripts: readonly PinnedPackage[];
|
|
24
|
+
readonly previous: DesiredPackState;
|
|
25
|
+
readonly catalog: NodeCatalogIndex;
|
|
26
|
+
readonly before: readonly TreePackage[];
|
|
27
|
+
readonly replayLibraries: readonly string[];
|
|
28
|
+
readonly installedIds: readonly string[];
|
|
29
|
+
readonly initialGlobalLockMissing: boolean;
|
|
30
|
+
readonly bootstrap?: readonly GlobalBootstrapPin[];
|
|
31
|
+
readonly mutationPaths?: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
export declare function expandCatalogPacks(catalog: NodeCatalogIndex, ids: readonly string[]): CatalogPack[];
|
|
34
|
+
/** Compute all specs that npm will replay. Desired intent alone adds no specs. */
|
|
35
|
+
export declare function prepareInstallSelection(request: InstallPacksRequest, options?: {
|
|
36
|
+
readonly allowDirty?: boolean;
|
|
37
|
+
readonly restoreDesired?: boolean;
|
|
38
|
+
}): Promise<InstallSelection>;
|
|
39
|
+
//# sourceMappingURL=install-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-selection.d.ts","sourceRoot":"","sources":["../../src/packs/install-selection.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AACD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AACD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,EAAE,CAcnG;AAED,kFAAkF;AAClF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2BzL"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { realpath } from "node:fs/promises";
|
|
2
|
+
import { readCatalogIndex } from "@nodetool-ai/node-catalog";
|
|
3
|
+
import { RUNTIME_NPM_PACKAGES, isRuntimeNpmPackageId } from "@nodetool-ai/protocol/runtime-npm-packages";
|
|
4
|
+
import { readInstallTree } from "./install-tree.js";
|
|
5
|
+
import { globalBootstrapPins } from "./global-bootstrap.js";
|
|
6
|
+
import { readDesiredState } from "./install-state.js";
|
|
7
|
+
export { readDesiredState } from "./install-state.js";
|
|
8
|
+
export function expandCatalogPacks(catalog, ids) {
|
|
9
|
+
const byId = new Map(catalog.packs.map((pack) => [pack.id, pack]));
|
|
10
|
+
const visited = new Set();
|
|
11
|
+
const pending = [...ids];
|
|
12
|
+
const result = [];
|
|
13
|
+
while (pending.length) {
|
|
14
|
+
const id = pending.pop();
|
|
15
|
+
if (visited.has(id)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
visited.add(id);
|
|
19
|
+
const pack = byId.get(id);
|
|
20
|
+
if (!pack) {
|
|
21
|
+
throw new Error(`Unknown node pack: ${id}`);
|
|
22
|
+
}
|
|
23
|
+
result.push(pack);
|
|
24
|
+
pending.push(...pack.requires);
|
|
25
|
+
}
|
|
26
|
+
return result.sort((a, b) => a.id.localeCompare(b.id));
|
|
27
|
+
}
|
|
28
|
+
/** Compute all specs that npm will replay. Desired intent alone adds no specs. */
|
|
29
|
+
export async function prepareInstallSelection(request, options = {}) {
|
|
30
|
+
const { mode } = request;
|
|
31
|
+
if (mode.kind !== "global" && mode.kind !== "local") {
|
|
32
|
+
throw new Error(mode.reason);
|
|
33
|
+
}
|
|
34
|
+
const catalog = request.catalog ?? readCatalogIndex();
|
|
35
|
+
if (catalog.coreVersion !== mode.coreVersion) {
|
|
36
|
+
throw new Error("Catalog and CLI versions differ");
|
|
37
|
+
}
|
|
38
|
+
const root = await realpath(mode.installRoot);
|
|
39
|
+
const previous = (await readDesiredState(request.stateFile))[root] ?? { root, coreVersion: mode.coreVersion, packs: [], runtimeLibraries: [] };
|
|
40
|
+
if (previous.dirty && !options.allowDirty) {
|
|
41
|
+
throw new Error("Pack installation is dirty. Run nodetool packs doctor --repair.");
|
|
42
|
+
}
|
|
43
|
+
const tree = await readInstallTree(root, mode.kind === "global");
|
|
44
|
+
const before = tree.packages;
|
|
45
|
+
const names = new Set(before.map((entry) => entry.name));
|
|
46
|
+
const installedIds = catalog.packs.filter((pack) => pack.kind === "node-pack" && names.has(pack.npm.name)).map((pack) => pack.id);
|
|
47
|
+
const requested = expandCatalogPacks(catalog, [...request.packs, ...(options.restoreDesired ? previous.packs : [])]);
|
|
48
|
+
const packs = expandCatalogPacks(catalog, [...installedIds, ...requested.map((pack) => pack.id)]);
|
|
49
|
+
const byFolder = new Map((catalog.installPins ?? []).map((pin) => [pin.installName ?? pin.name, pin]));
|
|
50
|
+
const replayLibraries = previous.runtimeLibraries.filter((id) => isRuntimeNpmPackageId(id) && RUNTIME_NPM_PACKAGES[id].packageNames.every((name) => {
|
|
51
|
+
const pin = byFolder.get(name);
|
|
52
|
+
return pin && before.some((entry) => entry.path === `node_modules/${name}` && entry.name === pin.name && entry.version === pin.version &&
|
|
53
|
+
(entry.integrity === pin.integrity || (mode.kind === "global" && tree.missingLock && entry.integrity === undefined)));
|
|
54
|
+
}));
|
|
55
|
+
const explicitLibraries = [...(request.runtimeLibraries ?? []), ...(options.restoreDesired ? previous.runtimeLibraries : [])];
|
|
56
|
+
for (const id of explicitLibraries) {
|
|
57
|
+
if (!isRuntimeNpmPackageId(id)) {
|
|
58
|
+
throw new Error(`Runtime library ${id} cannot be installed by npm`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const libraries = [...new Set([...replayLibraries, ...explicitLibraries, ...requested.flatMap((pack) => pack.runtimeLibraries).filter(isRuntimeNpmPackageId)])].sort();
|
|
62
|
+
const scripts = [...new Map(packs.flatMap((pack) => pack.scriptAllowlist).map((pin) => [JSON.stringify(pin), pin])).values()];
|
|
63
|
+
return { root, coreVersion: mode.coreVersion, mode: mode.kind, packs, runtimeLibraries: libraries, scripts, previous, catalog, before, replayLibraries, installedIds,
|
|
64
|
+
initialGlobalLockMissing: mode.kind === "global" && tree.missingLock,
|
|
65
|
+
bootstrap: mode.kind === "global" && tree.missingLock ? globalBootstrapPins(catalog, before, libraries) : [] };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=install-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-selection.js","sourceRoot":"","sources":["../../src/packs/install-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAA+D,MAAM,2BAA2B,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAEzG,OAAO,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAA2B,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAyB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA2BtD,MAAM,UAAU,kBAAkB,CAAC,OAAyB,EAAE,GAAsB;IAClF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACzB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAG,CAAC;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAA4B,EAAE,OAAO,GAAyE,EAAE;IAC5J,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IACtF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAAC,CAAC;IACrG,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IAC/I,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAAC,CAAC;IAClI,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClI,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrH,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACvG,MAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QACjJ,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO;YACpI,CAAC,KAAK,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1H,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9H,KAAK,MAAM,EAAE,IAAI,iBAAiB,EAAE,CAAC;QAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,CAAC;QAAC,CAAC;IAAC,CAAC;IAChJ,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,iBAAiB,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvK,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9H,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY;QAClK,wBAAwB,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW;QACpE,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACnH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const desiredSchema: z.ZodObject<{
|
|
3
|
+
root: z.ZodString;
|
|
4
|
+
coreVersion: z.ZodString;
|
|
5
|
+
packs: z.ZodArray<z.ZodString>;
|
|
6
|
+
runtimeLibraries: z.ZodArray<z.ZodString>;
|
|
7
|
+
dirty: z.ZodOptional<z.ZodBoolean>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
declare const stateSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
10
|
+
root: z.ZodString;
|
|
11
|
+
coreVersion: z.ZodString;
|
|
12
|
+
packs: z.ZodArray<z.ZodString>;
|
|
13
|
+
runtimeLibraries: z.ZodArray<z.ZodString>;
|
|
14
|
+
dirty: z.ZodOptional<z.ZodBoolean>;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
export type DesiredPackState = z.infer<typeof desiredSchema>;
|
|
17
|
+
export declare function readDesiredState(file: string): Promise<z.infer<typeof stateSchema>>;
|
|
18
|
+
/** Each root transaction also serializes merging the shared desired-state file. */
|
|
19
|
+
export declare function writeDesiredState(file: string, value: DesiredPackState): Promise<void>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=install-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-state.d.ts","sourceRoot":"","sources":["../../src/packs/install-state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,aAAa;;;;;;iBACsD,CAAC;AAC1E,QAAA,MAAM,WAAW;;;;;;kBAAsC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE7D,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC,CAMzF;AAED,mFAAmF;AACnF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5F"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { acquireInstallLock } from "../install-lock.js";
|
|
6
|
+
const desiredSchema = z.object({ root: z.string(), coreVersion: z.string(), packs: z.array(z.string()),
|
|
7
|
+
runtimeLibraries: z.array(z.string()), dirty: z.boolean().optional() });
|
|
8
|
+
const stateSchema = z.record(z.string(), desiredSchema);
|
|
9
|
+
export async function readDesiredState(file) {
|
|
10
|
+
try {
|
|
11
|
+
return stateSchema.parse(JSON.parse(await readFile(file, "utf8")));
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Each root transaction also serializes merging the shared desired-state file. */
|
|
21
|
+
export async function writeDesiredState(file, value) {
|
|
22
|
+
await mkdir(dirname(file), { recursive: true });
|
|
23
|
+
const release = await acquireInstallLock(dirname(file), ".cli-packs-state.lock");
|
|
24
|
+
const temporary = `${file}.${randomUUID()}.tmp`;
|
|
25
|
+
try {
|
|
26
|
+
const state = await readDesiredState(file);
|
|
27
|
+
state[value.root] = value;
|
|
28
|
+
await writeFile(temporary, JSON.stringify(state, null, 2), { flag: "wx", mode: 0o600 });
|
|
29
|
+
await rename(temporary, file);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
try {
|
|
33
|
+
await unlink(temporary).catch((error) => {
|
|
34
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await release();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=install-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-state.js","sourceRoot":"","sources":["../../src/packs/install-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpG,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC1E,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;AAGxD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,IAAI,CAAC;QAAC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAC3E,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QACxF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAuB;IAC3E,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC1B,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACrD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;oBAAC,MAAM,KAAK,CAAC;gBAAC,CAAC;YAC/F,CAAC,CAAC,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,MAAM,OAAO,EAAE,CAAC;QAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PinnedPackage } from "@nodetool-ai/node-catalog";
|
|
2
|
+
export interface VerificationPin extends PinnedPackage {
|
|
3
|
+
readonly installName?: string;
|
|
4
|
+
readonly shared?: boolean;
|
|
5
|
+
readonly installPath?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TreePackage {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly version: string;
|
|
11
|
+
readonly integrity: string | undefined;
|
|
12
|
+
readonly realPath: string;
|
|
13
|
+
}
|
|
14
|
+
/** Inspect every nested package, including entries omitted by an invalid hidden lock. */
|
|
15
|
+
export declare function readInstallTree(root: string, allowMissingGlobalLock?: boolean): Promise<{
|
|
16
|
+
readonly packages: readonly TreePackage[];
|
|
17
|
+
readonly missingLock: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function snapshotInstallTree(root: string): Promise<readonly TreePackage[]>;
|
|
20
|
+
export interface InstallPlan {
|
|
21
|
+
readonly add: readonly {
|
|
22
|
+
name: string;
|
|
23
|
+
version: string;
|
|
24
|
+
}[];
|
|
25
|
+
readonly change: readonly unknown[];
|
|
26
|
+
readonly remove: readonly unknown[];
|
|
27
|
+
}
|
|
28
|
+
export declare function parseInstallPlan(output: string, npmVersion: string): InstallPlan;
|
|
29
|
+
export declare function assertAdditivePlan(plan: InstallPlan, before: readonly TreePackage[], coreNames: ReadonlySet<string>, shared: readonly PinnedPackage[], coreVersion: string): void;
|
|
30
|
+
export declare function assertTreePins(before: readonly TreePackage[], after: readonly TreePackage[], pins: readonly VerificationPin[], coreNames: ReadonlySet<string>, coreVersion: string, initialGlobalLockMissing?: boolean): void;
|
|
31
|
+
export declare function installTreeRestored(before: readonly TreePackage[], after: readonly TreePackage[], initialGlobalLockMissing?: boolean): boolean;
|
|
32
|
+
export declare function assertSharedIdentities(tree: readonly TreePackage[], shared: readonly PinnedPackage[]): Promise<void>;
|
|
33
|
+
/** npm may retain extraneous --no-save additions even after uninstall. */
|
|
34
|
+
export declare function removeSnapshotAdditions(root: string, admittedModules: string, before: readonly TreePackage[]): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=install-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-tree.d.ts","sourceRoot":"","sources":["../../src/packs/install-tree.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,MAAM,WAAW,eAAgB,SAAQ,aAAa;IAAG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAElJ,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAMD,yFAAyF;AACzF,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,sBAAsB,UAAQ,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAyCzK;AACD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAEvF;AAED,MAAM,WAAW,WAAW;IAAG,QAAQ,CAAC,GAAG,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE;AAGrK,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CA+BhF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAYjL;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,eAAe,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,wBAAwB,UAAQ,GAAG,IAAI,CAyB3N;AACD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,wBAAwB,UAAQ,GAAG,OAAO,CAQ5I;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB1H;AAED,0EAA0E;AAC1E,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkClI"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { readFile, readdir, realpath, rm } from "node:fs/promises";
|
|
2
|
+
import { join, relative, resolve, sep, dirname } from "node:path";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const manifestSchema = z.object({ name: z.string(), version: z.string() });
|
|
6
|
+
const lockSchema = z.object({ packages: z.record(z.string(), z.object({
|
|
7
|
+
version: z.string().optional(), integrity: z.string().optional()
|
|
8
|
+
})) });
|
|
9
|
+
/** Inspect every nested package, including entries omitted by an invalid hidden lock. */
|
|
10
|
+
export async function readInstallTree(root, allowMissingGlobalLock = false) {
|
|
11
|
+
let lock;
|
|
12
|
+
let raw;
|
|
13
|
+
try {
|
|
14
|
+
raw = await readFile(join(root, "node_modules/.package-lock.json"), "utf8");
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (!(allowMissingGlobalLock && error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (raw !== undefined) {
|
|
22
|
+
lock = lockSchema.parse(JSON.parse(raw));
|
|
23
|
+
}
|
|
24
|
+
const result = [];
|
|
25
|
+
const pending = [join(root, "node_modules")];
|
|
26
|
+
while (pending.length) {
|
|
27
|
+
const modules = pending.pop();
|
|
28
|
+
let entries;
|
|
29
|
+
try {
|
|
30
|
+
entries = await readdir(modules, { withFileTypes: true });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
const directories = [];
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
if (entry.name.startsWith(".")) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (entry.name.startsWith("@")) {
|
|
44
|
+
for (const scoped of await readdir(join(modules, entry.name))) {
|
|
45
|
+
directories.push(join(modules, entry.name, scoped));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (entry.isDirectory() || entry.isSymbolicLink()) {
|
|
49
|
+
directories.push(join(modules, entry.name));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const directory of directories) {
|
|
53
|
+
const actual = await realpath(directory);
|
|
54
|
+
if (actual !== resolve(directory)) {
|
|
55
|
+
throw new Error(`Installer refuses linked package ${directory}`);
|
|
56
|
+
}
|
|
57
|
+
const manifest = manifestSchema.parse(JSON.parse(await readFile(join(directory, "package.json"), "utf8")));
|
|
58
|
+
const path = relative(root, directory).replaceAll("\\", "/");
|
|
59
|
+
const pinned = lock?.packages[path];
|
|
60
|
+
if (lock && (!pinned || pinned.version !== manifest.version)) {
|
|
61
|
+
throw new Error(`Hidden lock is missing or stale for ${path}`);
|
|
62
|
+
}
|
|
63
|
+
result.push({ path, name: manifest.name, version: manifest.version, integrity: pinned?.integrity, realPath: actual });
|
|
64
|
+
pending.push(join(directory, "node_modules"));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { packages: result.sort((a, b) => a.path.localeCompare(b.path)), missingLock: lock === undefined };
|
|
68
|
+
}
|
|
69
|
+
export async function snapshotInstallTree(root) {
|
|
70
|
+
return (await readInstallTree(root)).packages;
|
|
71
|
+
}
|
|
72
|
+
const planEntry = z.object({ name: z.string(), version: z.string() });
|
|
73
|
+
const jsonPlan = z.object({ add: z.array(planEntry), change: z.array(z.unknown()), remove: z.array(z.unknown()) });
|
|
74
|
+
export function parseInstallPlan(output, npmVersion) {
|
|
75
|
+
if (Number(npmVersion.split(".")[0]) >= 11) {
|
|
76
|
+
// npm prints individual dry-run actions before its JSON summary.
|
|
77
|
+
const start = output.indexOf("{");
|
|
78
|
+
if (start < 0) {
|
|
79
|
+
throw new Error("Missing npm dry-run JSON plan");
|
|
80
|
+
}
|
|
81
|
+
return jsonPlan.parse(JSON.parse(output.slice(start)));
|
|
82
|
+
}
|
|
83
|
+
const add = [];
|
|
84
|
+
const change = [];
|
|
85
|
+
const remove = [];
|
|
86
|
+
for (const line of output.split(/\r?\n/)) {
|
|
87
|
+
const match = /^\s*(add|change|remove)\s+(\S+)\s+(\S+)/.exec(line);
|
|
88
|
+
if (match?.[1] === "add") {
|
|
89
|
+
add.push({ name: match[2], version: match[3] });
|
|
90
|
+
}
|
|
91
|
+
else if (match?.[1] === "change") {
|
|
92
|
+
change.push(line);
|
|
93
|
+
}
|
|
94
|
+
else if (match?.[1] === "remove") {
|
|
95
|
+
remove.push(line);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (!/\b(?:added|changed|removed|up to date)\b/.test(output) && add.length + change.length + remove.length === 0) {
|
|
99
|
+
throw new Error("Unrecognized npm dry-run output");
|
|
100
|
+
}
|
|
101
|
+
for (const [verb, entries] of [["added", add], ["changed", change], ["removed", remove]]) {
|
|
102
|
+
const count = new RegExp(`\\b${verb} (\\d+) packages?\\b`).exec(output);
|
|
103
|
+
if (count && Number(count[1]) !== entries.length) {
|
|
104
|
+
throw new Error(`Incomplete npm dry-run ${verb} plan`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const jsonStart = output.indexOf("{");
|
|
108
|
+
if (jsonStart >= 0) {
|
|
109
|
+
const counts = z.object({ added: z.number(), changed: z.number(), removed: z.number() }).parse(JSON.parse(output.slice(jsonStart)));
|
|
110
|
+
if (counts.added !== add.length || counts.changed !== change.length || counts.removed !== remove.length) {
|
|
111
|
+
throw new Error("Incomplete npm 10 dry-run action plan");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { add, change, remove };
|
|
115
|
+
}
|
|
116
|
+
export function assertAdditivePlan(plan, before, coreNames, shared, coreVersion) {
|
|
117
|
+
if (plan.change.length || plan.remove.length) {
|
|
118
|
+
throw new Error(`npm plan changes or removes installed packages: ${JSON.stringify({ change: plan.change, remove: plan.remove })}`);
|
|
119
|
+
}
|
|
120
|
+
const identities = new Set(shared.map((pin) => pin.name));
|
|
121
|
+
const existing = new Set(before.map((entry) => entry.name));
|
|
122
|
+
const added = new Set();
|
|
123
|
+
for (const entry of plan.add) {
|
|
124
|
+
if (coreNames.has(entry.name) || entry.name === "@nodetool-ai/cli" || (identities.has(entry.name) && (existing.has(entry.name) || added.has(entry.name)))) {
|
|
125
|
+
throw new Error(`npm plan adds another core or shared identity package: ${entry.name}`);
|
|
126
|
+
}
|
|
127
|
+
if (entry.name.startsWith("@nodetool-ai/") && entry.version !== coreVersion) {
|
|
128
|
+
throw new Error(`Wrong NodeTool version in npm plan: ${entry.name}`);
|
|
129
|
+
}
|
|
130
|
+
added.add(entry.name);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function assertTreePins(before, after, pins, coreNames, coreVersion, initialGlobalLockMissing = false) {
|
|
134
|
+
const paths = new Map(after.map((entry) => [entry.path, entry]));
|
|
135
|
+
for (const previous of before) {
|
|
136
|
+
const next = paths.get(previous.path);
|
|
137
|
+
if (!next || next.name !== previous.name || next.version !== previous.version ||
|
|
138
|
+
(!(initialGlobalLockMissing && previous.integrity === undefined) && next.integrity !== previous.integrity) || next.realPath !== previous.realPath) {
|
|
139
|
+
throw new Error(`Install changed an existing package: ${previous.path}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const names = new Map();
|
|
143
|
+
for (const entry of after) {
|
|
144
|
+
const values = names.get(entry.name) ?? [];
|
|
145
|
+
values.push(entry);
|
|
146
|
+
names.set(entry.name, values);
|
|
147
|
+
if (entry.name.startsWith("@nodetool-ai/") && entry.version !== coreVersion) {
|
|
148
|
+
throw new Error(`Wrong NodeTool version: ${entry.path}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const name of coreNames) {
|
|
152
|
+
if (names.get(name)?.length !== 1) {
|
|
153
|
+
throw new Error(`Core package must exist exactly once: ${name}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const pin of pins) {
|
|
157
|
+
const values = (names.get(pin.name) ?? []).filter((entry) => (!pin.installPath || entry.path === pin.installPath) &&
|
|
158
|
+
(!pin.installName || entry.path.endsWith(`/node_modules/${pin.installName}`) || entry.path === `node_modules/${pin.installName}`));
|
|
159
|
+
if (!pin.integrity || !values.length || values.some((entry) => entry.version !== pin.version || entry.integrity !== pin.integrity)) {
|
|
160
|
+
throw new Error(`Package integrity or version does not match pin: ${pin.name}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export function installTreeRestored(before, after, initialGlobalLockMissing = false) {
|
|
165
|
+
if (before.length !== after.length) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
const paths = new Map(after.map((entry) => [entry.path, entry]));
|
|
169
|
+
return before.every((old) => {
|
|
170
|
+
const entry = paths.get(old.path);
|
|
171
|
+
return entry && entry.name === old.name && entry.version === old.version && entry.realPath === old.realPath &&
|
|
172
|
+
((initialGlobalLockMissing && old.integrity === undefined) || entry.integrity === old.integrity);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
export async function assertSharedIdentities(tree, shared) {
|
|
176
|
+
for (const pin of shared) {
|
|
177
|
+
const entries = tree.filter((entry) => entry.name === pin.name);
|
|
178
|
+
if (entries.length !== 1) {
|
|
179
|
+
throw new Error(`Shared library must exist exactly once: ${pin.name}`);
|
|
180
|
+
}
|
|
181
|
+
for (const dependent of tree) {
|
|
182
|
+
const manifest = z.object({ dependencies: z.record(z.string(), z.string()).optional(),
|
|
183
|
+
optionalDependencies: z.record(z.string(), z.string()).optional(), peerDependencies: z.record(z.string(), z.string()).optional()
|
|
184
|
+
}).parse(JSON.parse(await readFile(join(dependent.realPath, "package.json"), "utf8")));
|
|
185
|
+
if (!(manifest.dependencies?.[pin.name] || manifest.optionalDependencies?.[pin.name] || manifest.peerDependencies?.[pin.name])) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const resolver = createRequire(join(dependent.realPath, "package.json"));
|
|
189
|
+
const locations = resolver.resolve.paths(pin.name) ?? [];
|
|
190
|
+
let found;
|
|
191
|
+
for (const location of locations) {
|
|
192
|
+
try {
|
|
193
|
+
found = await realpath(join(location, pin.name));
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (found !== entries[0].realPath) {
|
|
203
|
+
throw new Error(`Shared library identity differs from ${dependent.name}: ${pin.name}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** npm may retain extraneous --no-save additions even after uninstall. */
|
|
209
|
+
export async function removeSnapshotAdditions(root, admittedModules, before) {
|
|
210
|
+
const modules = await realpath(admittedModules);
|
|
211
|
+
if (modules !== resolve(root, "node_modules")) {
|
|
212
|
+
throw new Error("Rollback node_modules root differs from admitted tree");
|
|
213
|
+
}
|
|
214
|
+
const current = await snapshotInstallTree(root);
|
|
215
|
+
const previous = new Set(before.map((entry) => entry.path));
|
|
216
|
+
const protectedAncestors = new Set();
|
|
217
|
+
for (const entry of before) {
|
|
218
|
+
let prefix = "";
|
|
219
|
+
for (const segment of entry.path.split("/").slice(0, -1)) {
|
|
220
|
+
prefix = prefix ? `${prefix}/${segment}` : segment;
|
|
221
|
+
protectedAncestors.add(prefix);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const additions = current.filter((entry) => !previous.has(entry.path)).sort((a, b) => a.path.length - b.path.length);
|
|
225
|
+
const removed = new Set();
|
|
226
|
+
for (const entry of additions) {
|
|
227
|
+
const segments = entry.path.split("/");
|
|
228
|
+
let ancestor = "";
|
|
229
|
+
let covered = false;
|
|
230
|
+
for (const segment of segments) {
|
|
231
|
+
ancestor = ancestor ? `${ancestor}/${segment}` : segment;
|
|
232
|
+
if (removed.has(ancestor)) {
|
|
233
|
+
covered = true;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (covered) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (protectedAncestors.has(entry.path)) {
|
|
241
|
+
throw new Error(`Rollback addition contains a preexisting package: ${entry.path}`);
|
|
242
|
+
}
|
|
243
|
+
const target = resolve(root, entry.path);
|
|
244
|
+
const parent = await realpath(dirname(target));
|
|
245
|
+
const within = relative(modules, target);
|
|
246
|
+
if (!within || within === ".." || within.startsWith(`..${sep}`) || target !== await realpath(target) || parent !== dirname(target)) { // key-boundary-ok: sep anchors the parent path component on this platform.
|
|
247
|
+
throw new Error(`Rollback addition escapes admitted tree: ${entry.path}`);
|
|
248
|
+
}
|
|
249
|
+
await rm(target, { recursive: true });
|
|
250
|
+
removed.add(entry.path);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=install-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-tree.js","sourceRoot":"","sources":["../../src/packs/install-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InstallSelection } from "./install-selection.js";
|
|
2
|
+
import { type VerificationPin } from "./install-tree.js";
|
|
3
|
+
export declare function prepareTreeVerification(selection: InstallSelection, cliRoot: string): Promise<{
|
|
4
|
+
pins: readonly VerificationPin[];
|
|
5
|
+
provided: VerificationPin[];
|
|
6
|
+
runtimePins: VerificationPin[];
|
|
7
|
+
shared: VerificationPin[];
|
|
8
|
+
coreNames: Set<string>;
|
|
9
|
+
libraryPins: (id: string) => readonly VerificationPin[];
|
|
10
|
+
pinByFolder: Map<string, VerificationPin>;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=install-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-verification.d.ts","sourceRoot":"","sources":["../../src/packs/install-verification.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;;;;;;sBAI/D,MAAM,KAAG,SAAS,eAAe,EAAE;;GAiD7D"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { RUNTIME_NPM_PACKAGES, isRuntimeNpmPackageId } from "@nodetool-ai/protocol/runtime-npm-packages";
|
|
5
|
+
import { assertTreePins } from "./install-tree.js";
|
|
6
|
+
export async function prepareTreeVerification(selection, cliRoot) {
|
|
7
|
+
const { before, packs, catalog, initialGlobalLockMissing } = selection;
|
|
8
|
+
const installPins = catalog.installPins ?? [];
|
|
9
|
+
const pinByFolder = new Map(installPins.map((pin) => [pin.installName ?? pin.name, pin]));
|
|
10
|
+
const libraryPins = (id) => {
|
|
11
|
+
if (!isRuntimeNpmPackageId(id)) {
|
|
12
|
+
throw new Error(`Unknown runtime library: ${id}`);
|
|
13
|
+
}
|
|
14
|
+
return RUNTIME_NPM_PACKAGES[id].packageNames.map((name, index) => {
|
|
15
|
+
const pin = pinByFolder.get(name);
|
|
16
|
+
if (!pin) {
|
|
17
|
+
throw new Error(`Runtime library ${id} has no integrity pins; installation is unavailable until catalog pins are supplied.`);
|
|
18
|
+
}
|
|
19
|
+
const spec = pin.installName && pin.installName !== pin.name ? `${pin.installName}@npm:${pin.name}@${pin.version}` : `${pin.name}@${pin.version}`;
|
|
20
|
+
if (spec !== RUNTIME_NPM_PACKAGES[id].npmPackages[index]) {
|
|
21
|
+
throw new Error(`Runtime library ${id} pin differs from its exact runtime spec: ${name}`);
|
|
22
|
+
}
|
|
23
|
+
return { ...pin, installPath: `node_modules/${name}` };
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
const runtimePins = selection.runtimeLibraries.flatMap((id) => {
|
|
27
|
+
return libraryPins(id);
|
|
28
|
+
});
|
|
29
|
+
const provided = packs.flatMap((pack) => pack.provides.map((name) => {
|
|
30
|
+
const pin = pinByFolder.get(name);
|
|
31
|
+
if (!pin) {
|
|
32
|
+
throw new Error(`Provided package ${name} has no integrity pin`);
|
|
33
|
+
}
|
|
34
|
+
return pin;
|
|
35
|
+
}));
|
|
36
|
+
const shared = installPins.filter((pin) => pin.shared);
|
|
37
|
+
for (const name of ["mediabunny", "@mediabunny/server"]) {
|
|
38
|
+
if (before.some((entry) => entry.name === name) && !shared.some((pin) => pin.name === name)) {
|
|
39
|
+
throw new Error(`Shared library ${name} has no integrity pin`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const pins = [...packs.map((pack) => pack.npm), ...provided, ...runtimePins, ...packs.flatMap((pack) => pack.scriptAllowlist),
|
|
43
|
+
...shared.filter((pin) => before.some((entry) => entry.name === pin.name))];
|
|
44
|
+
if (pins.some((pin) => !pin.integrity || pin.integrity === "PENDING")) {
|
|
45
|
+
throw new Error("Installation requires published integrity pins");
|
|
46
|
+
}
|
|
47
|
+
const packNames = new Set(catalog.packs.filter((pack) => pack.kind === "node-pack").flatMap((pack) => [pack.npm.name, ...pack.provides]));
|
|
48
|
+
const coreNames = new Set([...before.filter((entry) => entry.name.startsWith("@nodetool-ai/") && !packNames.has(entry.name)).map((entry) => entry.name),
|
|
49
|
+
...catalog.packs.filter((pack) => pack.kind === "core").map((pack) => pack.npm.name)]);
|
|
50
|
+
const dependencySchema = z.object({ dependencies: z.record(z.string(), z.string()).optional(),
|
|
51
|
+
optionalDependencies: z.record(z.string(), z.string()).optional(), peerDependencies: z.record(z.string(), z.string()).optional(),
|
|
52
|
+
peerDependenciesMeta: z.record(z.string(), z.object({ optional: z.boolean().optional() })).optional() });
|
|
53
|
+
for (const directory of [cliRoot, ...before.filter((entry) => coreNames.has(entry.name)).map((entry) => entry.realPath)]) {
|
|
54
|
+
const manifest = dependencySchema.parse(JSON.parse(await readFile(join(directory, "package.json"), "utf8")));
|
|
55
|
+
const requiredPeers = Object.keys(manifest.peerDependencies ?? {}).filter((name) => !manifest.peerDependenciesMeta?.[name]?.optional);
|
|
56
|
+
for (const name of [...Object.keys({ ...manifest.dependencies, ...manifest.optionalDependencies }), ...requiredPeers]) {
|
|
57
|
+
if (name.startsWith("@nodetool-ai/") && !packNames.has(name)) {
|
|
58
|
+
coreNames.add(name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (initialGlobalLockMissing) {
|
|
63
|
+
for (const pin of pins) {
|
|
64
|
+
const existing = before.filter((entry) => entry.name === pin.name && (!pin.installPath || entry.path === pin.installPath));
|
|
65
|
+
if (existing.some((entry) => entry.version !== pin.version)) {
|
|
66
|
+
throw new Error(`Global baseline package version differs from pin: ${pin.name}`);
|
|
67
|
+
}
|
|
68
|
+
if (shared.some((identity) => identity.name === pin.name) && existing.length !== 1) {
|
|
69
|
+
throw new Error(`Shared library must exist exactly once: ${pin.name}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
assertTreePins(before, before, pins.filter((pin) => before.some((entry) => entry.name === pin.name && (!pin.installPath || entry.path === pin.installPath) && (!initialGlobalLockMissing || entry.integrity !== undefined))), coreNames, selection.coreVersion);
|
|
74
|
+
return { pins, provided, runtimePins, shared, coreNames, libraryPins, pinByFolder };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=install-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-verification.js","sourceRoot":"","sources":["../../src/packs/install-verification.ts"],"names":[],"mappings":"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"}
|