@nodetool-ai/pack-manager 0.0.0-stage → 0.8.9-bootstrap.0
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 +4 -2
- package/dist/.nodetool-build-stamp +1 -0
- 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/cli-feature.d.ts +30 -0
- package/dist/cli-feature.d.ts.map +1 -0
- package/dist/cli-feature.js +89 -0
- package/dist/cli-feature.js.map +1 -0
- package/dist/command-errors.d.ts +8 -0
- package/dist/command-errors.d.ts.map +1 -0
- package/dist/command-errors.js +49 -0
- package/dist/command-errors.js.map +1 -0
- 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/output.d.ts +32 -0
- package/dist/commands/output.d.ts.map +1 -0
- package/dist/commands/output.js +150 -0
- package/dist/commands/output.js.map +1 -0
- 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 +132 -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 +5 -0
- package/dist/commands/packs.d.ts.map +1 -0
- package/dist/commands/packs.js +12 -0
- package/dist/commands/packs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- 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/npm-runner.d.ts +23 -0
- package/dist/npm-runner.d.ts.map +1 -0
- package/dist/npm-runner.js +160 -0
- package/dist/npm-runner.js.map +1 -0
- package/dist/packs/command-service.d.ts +16 -0
- package/dist/packs/command-service.d.ts.map +1 -0
- package/dist/packs/command-service.js +184 -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 +12 -0
- package/dist/packs/host.d.ts.map +1 -0
- package/dist/packs/host.js +69 -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 +25 -0
- package/dist/packs/install-state.d.ts.map +1 -0
- package/dist/packs/install-state.js +45 -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 +75 -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 +5 -0
- package/dist/packs/installer-load-check.d.ts.map +1 -0
- package/dist/packs/installer-load-check.js +98 -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 +149 -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 +78 -0
- package/dist/packs/management.js.map +1 -0
- package/dist/packs/mode.d.ts +48 -0
- package/dist/packs/mode.d.ts.map +1 -0
- package/dist/packs/mode.js +251 -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 +65 -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 +186 -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 +144 -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/package.json +51 -4
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type PackLoaderContext } from "@nodetool-ai/pack-core/loader-context";
|
|
2
|
+
import type { NodeCatalogIndex } from "@nodetool-ai/pack-core/types";
|
|
3
|
+
import { type InstalledPackSnapshot } from "./installed.js";
|
|
4
|
+
export declare function loaderContextForSnapshot(value: InstalledPackSnapshot): PackLoaderContext;
|
|
5
|
+
/** Configure inventory lazily. Reading help does not read install state. */
|
|
6
|
+
export declare function configureCliPackHost(url: string, options?: {
|
|
7
|
+
readonly catalog?: NodeCatalogIndex;
|
|
8
|
+
readonly stateFile?: string;
|
|
9
|
+
}): void;
|
|
10
|
+
/** Return the same admitted snapshot used for package resolution. */
|
|
11
|
+
export declare function loadCliPackSnapshot(): Promise<InstalledPackSnapshot>;
|
|
12
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/packs/host.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuD,KAAK,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AACpI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAOhF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,qBAAqB,GAAG,iBAAiB,CAExF;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CA8B1I;AAED,qEAAqE;AACrE,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAK1E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { realpath } from "node:fs/promises";
|
|
6
|
+
import { getNodetoolDataDir } from "@nodetool-ai/config";
|
|
7
|
+
import { loadPackLoaderContext, setPackLoaderContextProvider } from "@nodetool-ai/pack-core/loader-context";
|
|
8
|
+
import { readCatalogIndex } from "@nodetool-ai/pack-core/catalog-data";
|
|
9
|
+
import { CliRootNotFoundError, detectInstallMode, detectStandaloneFeatureMode, installDetailsForMode } from "./mode.js";
|
|
10
|
+
import { readInstalledPacks } from "./installed.js";
|
|
11
|
+
import { readDesiredState } from "./install-selection.js";
|
|
12
|
+
import { restoreWarning } from "./management.js";
|
|
13
|
+
let entryUrl;
|
|
14
|
+
let snapshot;
|
|
15
|
+
export function loaderContextForSnapshot(value) {
|
|
16
|
+
return { coreVersion: value.mode.coreVersion, packs: value.packs.map(pack => ({ id: pack.id, packages: [pack, ...pack.providedPackages] })), install: installDetailsForMode(value.mode) };
|
|
17
|
+
}
|
|
18
|
+
/** Configure inventory lazily. Reading help does not read install state. */
|
|
19
|
+
export function configureCliPackHost(url, options = {}) {
|
|
20
|
+
entryUrl = url;
|
|
21
|
+
snapshot = undefined;
|
|
22
|
+
setPackLoaderContextProvider(async () => {
|
|
23
|
+
let mode;
|
|
24
|
+
try {
|
|
25
|
+
mode = detectInstallMode(fileURLToPath(url));
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (!(error instanceof CliRootNotFoundError)) {
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
const resolver = createRequire(url);
|
|
32
|
+
try {
|
|
33
|
+
mode = detectInstallMode(resolver.resolve("@nodetool-ai/cli"));
|
|
34
|
+
}
|
|
35
|
+
catch (cause) {
|
|
36
|
+
const installedHost = (resolver.resolve.paths("@nodetool-ai/cli") ?? []).some(directory => existsSync(join(directory, "@nodetool-ai/cli")));
|
|
37
|
+
if (!(cause instanceof Error) || !("code" in cause) || cause.code !== "MODULE_NOT_FOUND" || installedHost) {
|
|
38
|
+
throw cause;
|
|
39
|
+
}
|
|
40
|
+
mode = detectStandaloneFeatureMode(fileURLToPath(url), options.catalog ?? readCatalogIndex());
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
snapshot = readInstalledPacks(mode, options.catalog);
|
|
44
|
+
if (mode.kind === "global" || mode.kind === "local") {
|
|
45
|
+
const root = await realpath(mode.installRoot);
|
|
46
|
+
const desired = (await readDesiredState(options.stateFile ?? join(getNodetoolDataDir(), "cli-packs.json")))[root];
|
|
47
|
+
if (desired?.dirty) {
|
|
48
|
+
process.stderr.write('Pack installation is dirty. Run "nodetool packs doctor --repair".\n');
|
|
49
|
+
}
|
|
50
|
+
const warning = restoreWarning(snapshot, desired);
|
|
51
|
+
if (warning) {
|
|
52
|
+
process.stderr.write(warning + "\n");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return loaderContextForSnapshot(snapshot);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Return the same admitted snapshot used for package resolution. */
|
|
59
|
+
export async function loadCliPackSnapshot() {
|
|
60
|
+
if (!entryUrl) {
|
|
61
|
+
throw new Error("CLI pack host is not configured");
|
|
62
|
+
}
|
|
63
|
+
await loadPackLoaderContext();
|
|
64
|
+
if (!snapshot) {
|
|
65
|
+
throw new Error("CLI installed pack snapshot is unavailable");
|
|
66
|
+
}
|
|
67
|
+
return snapshot;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/packs/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-manifests.d.ts","sourceRoot":"","sources":["../../src/packs/install-manifests.ts"],"names":[],"mappings":"AAGA,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAgBxF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { readFile, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export async function captureInstallManifests(root) {
|
|
4
|
+
const files = await Promise.all(["package.json", "package-lock.json"].map(async (name) => {
|
|
5
|
+
try {
|
|
6
|
+
return { name, bytes: await readFile(join(root, name)) };
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
10
|
+
return { name, bytes: null };
|
|
11
|
+
}
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
}));
|
|
15
|
+
return async () => {
|
|
16
|
+
for (const file of files) {
|
|
17
|
+
if (file.bytes) {
|
|
18
|
+
await writeFile(join(root, file.name), file.bytes);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
await unlink(join(root, file.name)).catch((error) => {
|
|
22
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=install-manifests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-manifests.js","sourceRoot":"","sources":["../../src/packs/install-manifests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACvF,IAAI,CAAC;YAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAAC,CAAC;QACjE,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAAC,CAAC;YAC3G,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,KAAK,IAAI,EAAE;QAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;iBAClE,CAAC;gBAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBAClE,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;wBAAC,MAAM,KAAK,CAAC;oBAAC,CAAC;gBAC/F,CAAC,CAAC,CAAC;YAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-process.d.ts","sourceRoot":"","sources":["../../src/packs/install-process.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjE;AACD,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
let refusingContext;
|
|
2
|
+
/** Server entry points permanently disable installation in their process. */
|
|
3
|
+
export function refusePackInstallsInProcess(context) {
|
|
4
|
+
refusingContext ??= context;
|
|
5
|
+
}
|
|
6
|
+
export function assertPackInstallProcessAllowed() {
|
|
7
|
+
if (refusingContext) {
|
|
8
|
+
throw new Error(`Node pack installation is disabled in ${refusingContext} processes`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=install-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-process.js","sourceRoot":"","sources":["../../src/packs/install-process.ts"],"names":[],"mappings":"AAAA,IAAI,eAAmC,CAAC;AAExC,6EAA6E;AAC7E,MAAM,UAAU,2BAA2B,CAAC,OAAe;IACzD,eAAe,KAAK,OAAO,CAAC;AAC9B,CAAC;AACD,MAAM,UAAU,+BAA+B;IAC7C,IAAI,eAAe,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,yCAAyC,eAAe,YAAY,CAAC,CAAC;IAAC,CAAC;AACjH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type NodeCatalogIndex, type CatalogPack, type PinnedPackage } from "@nodetool-ai/pack-core";
|
|
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,wBAAwB,CAAC;AAEvH,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/pack-core";
|
|
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) => 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":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
requestedPacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
managedPacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
dirty: z.ZodOptional<z.ZodBoolean>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
declare const stateSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
12
|
+
root: z.ZodString;
|
|
13
|
+
coreVersion: z.ZodString;
|
|
14
|
+
packs: z.ZodArray<z.ZodString>;
|
|
15
|
+
runtimeLibraries: z.ZodArray<z.ZodString>;
|
|
16
|
+
requestedPacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
17
|
+
managedPacks: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
18
|
+
dirty: z.ZodOptional<z.ZodBoolean>;
|
|
19
|
+
}, z.core.$strip>>;
|
|
20
|
+
export type DesiredPackState = z.infer<typeof desiredSchema>;
|
|
21
|
+
export declare function readDesiredState(file: string): Promise<z.infer<typeof stateSchema>>;
|
|
22
|
+
/** Each root transaction also serializes merging the shared desired-state file. */
|
|
23
|
+
export declare function writeDesiredState(file: string, value: DesiredPackState): Promise<void>;
|
|
24
|
+
export {};
|
|
25
|
+
//# 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;;;;;;;;iBAE6G,CAAC;AACjI,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,45 @@
|
|
|
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()),
|
|
8
|
+
requestedPacks: z.array(z.string()).optional(), managedPacks: z.array(z.string()).optional(), dirty: z.boolean().optional() });
|
|
9
|
+
const stateSchema = z.record(z.string(), desiredSchema);
|
|
10
|
+
export async function readDesiredState(file) {
|
|
11
|
+
try {
|
|
12
|
+
return stateSchema.parse(JSON.parse(await readFile(file, "utf8")));
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Each root transaction also serializes merging the shared desired-state file. */
|
|
22
|
+
export async function writeDesiredState(file, value) {
|
|
23
|
+
await mkdir(dirname(file), { recursive: true });
|
|
24
|
+
const release = await acquireInstallLock(dirname(file), ".cli-packs-state.lock");
|
|
25
|
+
const temporary = `${file}.${randomUUID()}.tmp`;
|
|
26
|
+
try {
|
|
27
|
+
const state = await readDesiredState(file);
|
|
28
|
+
state[value.root] = value;
|
|
29
|
+
await writeFile(temporary, JSON.stringify(state, null, 2), { flag: "wx", mode: 0o600 });
|
|
30
|
+
await rename(temporary, file);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
try {
|
|
34
|
+
await unlink(temporary).catch((error) => {
|
|
35
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT")) {
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await release();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=install-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-state.js","sourceRoot":"","sources":["../../src/packs/install-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PinnedPackage } from "@nodetool-ai/pack-core";
|
|
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,wBAAwB,CAAC;AAC5D,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"}
|