@nodetool-ai/pack-manager 0.0.0-stage → 0.8.9-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +4 -2
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/child-exit.d.ts +3 -0
  4. package/dist/child-exit.d.ts.map +1 -0
  5. package/dist/child-exit.js +17 -0
  6. package/dist/child-exit.js.map +1 -0
  7. package/dist/cli-feature.d.ts +30 -0
  8. package/dist/cli-feature.d.ts.map +1 -0
  9. package/dist/cli-feature.js +89 -0
  10. package/dist/cli-feature.js.map +1 -0
  11. package/dist/command-errors.d.ts +8 -0
  12. package/dist/command-errors.d.ts.map +1 -0
  13. package/dist/command-errors.js +49 -0
  14. package/dist/command-errors.js.map +1 -0
  15. package/dist/commands/authorized-pack-install.d.ts +7 -0
  16. package/dist/commands/authorized-pack-install.d.ts.map +1 -0
  17. package/dist/commands/authorized-pack-install.js +20 -0
  18. package/dist/commands/authorized-pack-install.js.map +1 -0
  19. package/dist/commands/output.d.ts +32 -0
  20. package/dist/commands/output.d.ts.map +1 -0
  21. package/dist/commands/output.js +150 -0
  22. package/dist/commands/output.js.map +1 -0
  23. package/dist/commands/pack-install-authorization.d.ts +40 -0
  24. package/dist/commands/pack-install-authorization.d.ts.map +1 -0
  25. package/dist/commands/pack-install-authorization.js +132 -0
  26. package/dist/commands/pack-install-authorization.js.map +1 -0
  27. package/dist/commands/pack-management.d.ts +26 -0
  28. package/dist/commands/pack-management.d.ts.map +1 -0
  29. package/dist/commands/pack-management.js +74 -0
  30. package/dist/commands/pack-management.js.map +1 -0
  31. package/dist/commands/packs.d.ts +5 -0
  32. package/dist/commands/packs.d.ts.map +1 -0
  33. package/dist/commands/packs.js +12 -0
  34. package/dist/commands/packs.js.map +1 -0
  35. package/dist/index.d.ts +5 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/install-lock.d.ts +12 -0
  40. package/dist/install-lock.d.ts.map +1 -0
  41. package/dist/install-lock.js +139 -0
  42. package/dist/install-lock.js.map +1 -0
  43. package/dist/npm-runner.d.ts +23 -0
  44. package/dist/npm-runner.d.ts.map +1 -0
  45. package/dist/npm-runner.js +160 -0
  46. package/dist/npm-runner.js.map +1 -0
  47. package/dist/packs/command-service.d.ts +16 -0
  48. package/dist/packs/command-service.d.ts.map +1 -0
  49. package/dist/packs/command-service.js +203 -0
  50. package/dist/packs/command-service.js.map +1 -0
  51. package/dist/packs/doctor-lock.d.ts +8 -0
  52. package/dist/packs/doctor-lock.d.ts.map +1 -0
  53. package/dist/packs/doctor-lock.js +50 -0
  54. package/dist/packs/doctor-lock.js.map +1 -0
  55. package/dist/packs/doctor.d.ts +25 -0
  56. package/dist/packs/doctor.d.ts.map +1 -0
  57. package/dist/packs/doctor.js +12 -0
  58. package/dist/packs/doctor.js.map +1 -0
  59. package/dist/packs/global-bootstrap.d.ts +11 -0
  60. package/dist/packs/global-bootstrap.d.ts.map +1 -0
  61. package/dist/packs/global-bootstrap.js +72 -0
  62. package/dist/packs/global-bootstrap.js.map +1 -0
  63. package/dist/packs/host.d.ts +12 -0
  64. package/dist/packs/host.d.ts.map +1 -0
  65. package/dist/packs/host.js +69 -0
  66. package/dist/packs/host.js.map +1 -0
  67. package/dist/packs/install-manifests.d.ts +2 -0
  68. package/dist/packs/install-manifests.d.ts.map +1 -0
  69. package/dist/packs/install-manifests.js +30 -0
  70. package/dist/packs/install-manifests.js.map +1 -0
  71. package/dist/packs/install-process.d.ts +4 -0
  72. package/dist/packs/install-process.d.ts.map +1 -0
  73. package/dist/packs/install-process.js +11 -0
  74. package/dist/packs/install-process.js.map +1 -0
  75. package/dist/packs/install-selection.d.ts +39 -0
  76. package/dist/packs/install-selection.d.ts.map +1 -0
  77. package/dist/packs/install-selection.js +67 -0
  78. package/dist/packs/install-selection.js.map +1 -0
  79. package/dist/packs/install-state.d.ts +25 -0
  80. package/dist/packs/install-state.d.ts.map +1 -0
  81. package/dist/packs/install-state.js +45 -0
  82. package/dist/packs/install-state.js.map +1 -0
  83. package/dist/packs/install-tree.d.ts +35 -0
  84. package/dist/packs/install-tree.d.ts.map +1 -0
  85. package/dist/packs/install-tree.js +253 -0
  86. package/dist/packs/install-tree.js.map +1 -0
  87. package/dist/packs/install-verification.d.ts +12 -0
  88. package/dist/packs/install-verification.d.ts.map +1 -0
  89. package/dist/packs/install-verification.js +75 -0
  90. package/dist/packs/install-verification.js.map +1 -0
  91. package/dist/packs/installed.d.ts +36 -0
  92. package/dist/packs/installed.d.ts.map +1 -0
  93. package/dist/packs/installed.js +87 -0
  94. package/dist/packs/installed.js.map +1 -0
  95. package/dist/packs/installer-load-check.d.ts +5 -0
  96. package/dist/packs/installer-load-check.d.ts.map +1 -0
  97. package/dist/packs/installer-load-check.js +98 -0
  98. package/dist/packs/installer-load-check.js.map +1 -0
  99. package/dist/packs/installer.d.ts +16 -0
  100. package/dist/packs/installer.d.ts.map +1 -0
  101. package/dist/packs/installer.js +149 -0
  102. package/dist/packs/installer.js.map +1 -0
  103. package/dist/packs/management.d.ts +51 -0
  104. package/dist/packs/management.d.ts.map +1 -0
  105. package/dist/packs/management.js +78 -0
  106. package/dist/packs/management.js.map +1 -0
  107. package/dist/packs/mode.d.ts +48 -0
  108. package/dist/packs/mode.d.ts.map +1 -0
  109. package/dist/packs/mode.js +251 -0
  110. package/dist/packs/mode.js.map +1 -0
  111. package/dist/packs/owned-replay-plan.d.ts +5 -0
  112. package/dist/packs/owned-replay-plan.d.ts.map +1 -0
  113. package/dist/packs/owned-replay-plan.js +65 -0
  114. package/dist/packs/owned-replay-plan.js.map +1 -0
  115. package/dist/packs/removal-selection.d.ts +12 -0
  116. package/dist/packs/removal-selection.d.ts.map +1 -0
  117. package/dist/packs/removal-selection.js +186 -0
  118. package/dist/packs/removal-selection.js.map +1 -0
  119. package/dist/packs/removal.d.ts +12 -0
  120. package/dist/packs/removal.d.ts.map +1 -0
  121. package/dist/packs/removal.js +144 -0
  122. package/dist/packs/removal.js.map +1 -0
  123. package/dist/packs/repair.d.ts +2 -0
  124. package/dist/packs/repair.d.ts.map +1 -0
  125. package/dist/packs/repair.js +2 -0
  126. package/dist/packs/repair.js.map +1 -0
  127. package/package.json +51 -4
@@ -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;;GAgD7D"}
@@ -0,0 +1,75 @@
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.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
+ const dependencySchema = z.object({ name: z.string().optional(), dependencies: z.record(z.string(), z.string()).optional(),
50
+ optionalDependencies: z.record(z.string(), z.string()).optional(), peerDependencies: z.record(z.string(), z.string()).optional(),
51
+ peerDependenciesMeta: z.record(z.string(), z.object({ optional: z.boolean().optional() })).optional() });
52
+ for (const directory of [cliRoot, ...before.filter((entry) => coreNames.has(entry.name)).map((entry) => entry.realPath)]) {
53
+ const manifest = dependencySchema.parse(JSON.parse(await readFile(join(directory, "package.json"), "utf8")));
54
+ const requiredPeers = Object.keys(manifest.peerDependencies ?? {}).filter((name) => !manifest.peerDependenciesMeta?.[name]?.optional);
55
+ for (const name of [...Object.keys({ ...manifest.dependencies, ...manifest.optionalDependencies }), ...requiredPeers]) {
56
+ if (name.startsWith("@nodetool-ai/") && ((directory === cliRoot && manifest.name === "@nodetool-ai/cli") || !packNames.has(name))) {
57
+ coreNames.add(name);
58
+ }
59
+ }
60
+ }
61
+ if (initialGlobalLockMissing) {
62
+ for (const pin of pins) {
63
+ const existing = before.filter((entry) => entry.name === pin.name && (!pin.installPath || entry.path === pin.installPath));
64
+ if (existing.some((entry) => entry.version !== pin.version)) {
65
+ throw new Error(`Global baseline package version differs from pin: ${pin.name}`);
66
+ }
67
+ if (shared.some((identity) => identity.name === pin.name) && existing.length !== 1) {
68
+ throw new Error(`Shared library must exist exactly once: ${pin.name}`);
69
+ }
70
+ }
71
+ }
72
+ 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);
73
+ return { pins, provided, runtimePins, shared, coreNames, libraryPins, pinByFolder };
74
+ }
75
+ //# 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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"}
@@ -0,0 +1,36 @@
1
+ import { type MissingPackError, type NodeCatalogIndex } from "@nodetool-ai/pack-core";
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,wBAAwB,CAAC;AAChC,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/pack-core";
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,5 @@
1
+ import { type InstalledPackSnapshot } from "./installed.js";
2
+ import type { NodeCatalogIndex } from "@nodetool-ai/pack-core/types";
3
+ /** Verify selected feature modules without importing a node registry in the lean host. */
4
+ export declare function verifyPackLoads(snapshot: InstalledPackSnapshot, catalog: NodeCatalogIndex, ids: readonly string[]): Promise<void>;
5
+ //# 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":"AASA,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAUrE,0FAA0F;AAC1F,wBAAsB,eAAe,CAAC,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDvI"}
@@ -0,0 +1,98 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { join } from "node:path";
3
+ import { realpath, readFile } from "node:fs/promises";
4
+ import { createRequire } from "node:module";
5
+ import { z } from "zod";
6
+ import { readCatalogIndex } from "@nodetool-ai/pack-core/catalog-data";
7
+ import { resolveInstalledPack } from "@nodetool-ai/pack-core/installed-resolver";
8
+ import { setPackLoaderContext } from "@nodetool-ai/pack-core/loader-context";
9
+ import { verifyCliFeature } from "../cli-feature.js";
10
+ import { readInstalledPacks } from "./installed.js";
11
+ import { loaderContextForSnapshot } from "./host.js";
12
+ import { readInstallTree } from "./install-tree.js";
13
+ const NODE_SDK_PACKAGE = "@nodetool-ai/node-sdk";
14
+ const packageDependencies = z.object({
15
+ dependencies: z.record(z.string(), z.string()).optional(),
16
+ peerDependencies: z.record(z.string(), z.string()).optional()
17
+ });
18
+ /** Verify selected feature modules without importing a node registry in the lean host. */
19
+ export async function verifyPackLoads(snapshot, catalog, ids) {
20
+ const context = loaderContextForSnapshot(snapshot);
21
+ setPackLoaderContext(context);
22
+ const nodePacks = [];
23
+ for (const id of ids) {
24
+ const pack = catalog.packs.find(candidate => candidate.id === id);
25
+ if (!pack || !snapshot.packs.some(candidate => candidate.id === id)) {
26
+ throw new Error(`Load check pack unavailable: ${id}`);
27
+ }
28
+ if (pack.kind === "cli-feature") {
29
+ const module = await import(resolveInstalledPack(pack, pack.npm.name, context));
30
+ verifyCliFeature(module, pack);
31
+ }
32
+ else {
33
+ nodePacks.push(pack);
34
+ }
35
+ }
36
+ if (nodePacks.length) {
37
+ if (snapshot.mode.kind !== "local" && snapshot.mode.kind !== "global") {
38
+ throw new Error(snapshot.mode.reason);
39
+ }
40
+ const tree = await readInstallTree(snapshot.mode.installRoot, snapshot.mode.kind === "global");
41
+ const copies = tree.packages.filter(entry => entry.name === NODE_SDK_PACKAGE);
42
+ const sdk = copies[0];
43
+ if (copies.length !== 1 || !sdk) {
44
+ throw new Error("Node packs require exactly one admitted node-sdk");
45
+ }
46
+ if (sdk.version !== context.coreVersion) {
47
+ throw new Error("Node SDK version differs from the admitted core version");
48
+ }
49
+ const sdkPin = catalog.installPins?.find(pin => pin.name === NODE_SDK_PACKAGE);
50
+ if (sdkPin && (sdkPin.version !== sdk.version || sdkPin.integrity !== sdk.integrity)) {
51
+ throw new Error("Node SDK integrity differs from its catalog pin");
52
+ }
53
+ const typesByPack = new Map();
54
+ for (const [nodeType, owner] of Object.entries(catalog.owners)) {
55
+ const types = typesByPack.get(owner) ?? [];
56
+ types.push(nodeType);
57
+ typesByPack.set(owner, types);
58
+ }
59
+ for (const pack of nodePacks) {
60
+ const installed = snapshot.packs.find(entry => entry.id === pack.id);
61
+ if (!installed) {
62
+ throw new Error(`Load check pack unavailable: ${pack.id}`);
63
+ }
64
+ const manifest = packageDependencies.parse(JSON.parse(await readFile(join(installed.realPackageRoot, "package.json"), "utf8")));
65
+ if (!manifest.dependencies?.[NODE_SDK_PACKAGE] && !manifest.peerDependencies?.[NODE_SDK_PACKAGE]) {
66
+ throw new Error(`Node pack ${pack.id} does not declare its SDK dependency`);
67
+ }
68
+ // The SDK is admitted through the selected pack's declared dependency and verified install tree.
69
+ const sdkPack = { ...pack, npm: { name: NODE_SDK_PACKAGE, version: sdk.version, integrity: sdk.integrity ?? "" }, provides: [] };
70
+ const sdkContext = { ...context, packs: [{ id: pack.id, packages: [{ npm: NODE_SDK_PACKAGE, version: sdk.version, realPackageRoot: sdk.realPath }] }] };
71
+ const expectedSdk = await realpath(fileURLToPath(resolveInstalledPack(sdkPack, NODE_SDK_PACKAGE, sdkContext)));
72
+ for (const entry of [installed, ...installed.providedPackages]) {
73
+ const resolved = await realpath(createRequire(join(entry.realPackageRoot, "package.json")).resolve(NODE_SDK_PACKAGE));
74
+ if (resolved !== expectedSdk) {
75
+ throw new Error(`Pack resolves another node-sdk: ${entry.npm}`);
76
+ }
77
+ }
78
+ const verifierModule = await import(resolveInstalledPack(sdkPack, `${NODE_SDK_PACKAGE}/pack-verifier`, sdkContext));
79
+ const verifier = z.object({ verifyNodePackRegistration: z.custom(value => typeof value === "function") }).parse(verifierModule);
80
+ const module = await import(resolveInstalledPack(pack, pack.npm.name, context));
81
+ const registrar = z.record(z.string(), z.unknown()).parse(module)[pack.registrar];
82
+ verifier.verifyNodePackRegistration(pack.id, registrar, typesByPack.get(pack.id) ?? []);
83
+ }
84
+ }
85
+ }
86
+ async function main() {
87
+ const [cliRoot, installRoot, ...ids] = process.argv.slice(2);
88
+ if (!cliRoot || !installRoot) {
89
+ throw new Error("Pack load check requires CLI and install roots");
90
+ }
91
+ const catalog = readCatalogIndex();
92
+ const mode = { kind: "local", cliRoot, installRoot, nodeModulesRoot: join(installRoot, "node_modules"), coreVersion: catalog.coreVersion, pathStyle: process.platform === "win32" ? "win32" : "posix" };
93
+ await verifyPackLoads(readInstalledPacks(mode, catalog), catalog, ids);
94
+ }
95
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
96
+ main().catch((error) => { console.error(error); process.exitCode = 1; });
97
+ }
98
+ //# sourceMappingURL=installer-load-check.js.map