@nodetool-ai/node-sdk 0.7.0-rc.23 → 0.8.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 (158) hide show
  1. package/README.md +34 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/base-node.d.ts +285 -14
  4. package/dist/base-node.d.ts.map +1 -1
  5. package/dist/base-node.js +359 -49
  6. package/dist/base-node.js.map +1 -1
  7. package/dist/class-name-to-title.d.ts +26 -0
  8. package/dist/class-name-to-title.d.ts.map +1 -0
  9. package/dist/class-name-to-title.js +59 -0
  10. package/dist/class-name-to-title.js.map +1 -0
  11. package/dist/code-analysis.d.ts +234 -0
  12. package/dist/code-analysis.d.ts.map +1 -0
  13. package/dist/code-analysis.js +919 -0
  14. package/dist/code-analysis.js.map +1 -0
  15. package/dist/code-body.d.ts +61 -0
  16. package/dist/code-body.d.ts.map +1 -0
  17. package/dist/code-body.js +288 -0
  18. package/dist/code-body.js.map +1 -0
  19. package/dist/code-node-validation.d.ts +67 -0
  20. package/dist/code-node-validation.d.ts.map +1 -0
  21. package/dist/code-node-validation.js +540 -0
  22. package/dist/code-node-validation.js.map +1 -0
  23. package/dist/content-card.d.ts +30 -0
  24. package/dist/content-card.d.ts.map +1 -0
  25. package/dist/content-card.js +68 -0
  26. package/dist/content-card.js.map +1 -0
  27. package/dist/correlation-validation.d.ts +19 -0
  28. package/dist/correlation-validation.d.ts.map +1 -0
  29. package/dist/correlation-validation.js +101 -0
  30. package/dist/correlation-validation.js.map +1 -0
  31. package/dist/cost-estimate.d.ts +244 -0
  32. package/dist/cost-estimate.d.ts.map +1 -0
  33. package/dist/cost-estimate.js +637 -0
  34. package/dist/cost-estimate.js.map +1 -0
  35. package/dist/decorators.d.ts.map +1 -1
  36. package/dist/decorators.js +4 -1
  37. package/dist/decorators.js.map +1 -1
  38. package/dist/docs/nodes.d.ts.map +1 -1
  39. package/dist/docs/nodes.js +3 -2
  40. package/dist/docs/nodes.js.map +1 -1
  41. package/dist/docs/overview.d.ts.map +1 -1
  42. package/dist/docs/overview.js +4 -3
  43. package/dist/docs/overview.js.map +1 -1
  44. package/dist/docs/workflows.d.ts.map +1 -1
  45. package/dist/docs/workflows.js +10 -9
  46. package/dist/docs/workflows.js.map +1 -1
  47. package/dist/field-classification.d.ts +31 -0
  48. package/dist/field-classification.d.ts.map +1 -0
  49. package/dist/field-classification.js +58 -0
  50. package/dist/field-classification.js.map +1 -0
  51. package/dist/graph-validation.d.ts +239 -0
  52. package/dist/graph-validation.d.ts.map +1 -0
  53. package/dist/graph-validation.js +1174 -0
  54. package/dist/graph-validation.js.map +1 -0
  55. package/dist/index.d.ts +27 -2
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +29 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/js-script-link.d.ts +53 -0
  60. package/dist/js-script-link.d.ts.map +1 -0
  61. package/dist/js-script-link.js +58 -0
  62. package/dist/js-script-link.js.map +1 -0
  63. package/dist/js-script-materialize.d.ts +52 -0
  64. package/dist/js-script-materialize.d.ts.map +1 -0
  65. package/dist/js-script-materialize.js +24 -0
  66. package/dist/js-script-materialize.js.map +1 -0
  67. package/dist/manifest-node-values.d.ts +106 -0
  68. package/dist/manifest-node-values.d.ts.map +1 -0
  69. package/dist/manifest-node-values.js +195 -0
  70. package/dist/manifest-node-values.js.map +1 -0
  71. package/dist/metadata.d.ts +75 -3
  72. package/dist/metadata.d.ts.map +1 -1
  73. package/dist/metadata.js +132 -49
  74. package/dist/metadata.js.map +1 -1
  75. package/dist/node-metadata.d.ts.map +1 -1
  76. package/dist/node-metadata.js +61 -56
  77. package/dist/node-metadata.js.map +1 -1
  78. package/dist/node-type-inventory.d.ts +51 -0
  79. package/dist/node-type-inventory.d.ts.map +1 -0
  80. package/dist/node-type-inventory.js +121 -0
  81. package/dist/node-type-inventory.js.map +1 -0
  82. package/dist/nodes/test-nodes.d.ts +77 -30
  83. package/dist/nodes/test-nodes.d.ts.map +1 -1
  84. package/dist/nodes/test-nodes.js +2 -34
  85. package/dist/nodes/test-nodes.js.map +1 -1
  86. package/dist/pack-loader.d.ts +202 -0
  87. package/dist/pack-loader.d.ts.map +1 -0
  88. package/dist/pack-loader.js +529 -0
  89. package/dist/pack-loader.js.map +1 -0
  90. package/dist/port-types.d.ts +15 -0
  91. package/dist/port-types.d.ts.map +1 -0
  92. package/dist/port-types.js +72 -0
  93. package/dist/port-types.js.map +1 -0
  94. package/dist/pricing-bundle.d.ts +83 -0
  95. package/dist/pricing-bundle.d.ts.map +1 -0
  96. package/dist/pricing-bundle.js +82 -0
  97. package/dist/pricing-bundle.js.map +1 -0
  98. package/dist/pricing-params.d.ts +59 -0
  99. package/dist/pricing-params.d.ts.map +1 -0
  100. package/dist/pricing-params.js +282 -0
  101. package/dist/pricing-params.js.map +1 -0
  102. package/dist/python-package-scan.d.ts +8 -0
  103. package/dist/python-package-scan.d.ts.map +1 -1
  104. package/dist/python-package-scan.js +21 -8
  105. package/dist/python-package-scan.js.map +1 -1
  106. package/dist/registry.d.ts +105 -2
  107. package/dist/registry.d.ts.map +1 -1
  108. package/dist/registry.js +403 -30
  109. package/dist/registry.js.map +1 -1
  110. package/dist/sandbox-bridge-packs.d.ts +39 -0
  111. package/dist/sandbox-bridge-packs.d.ts.map +1 -0
  112. package/dist/sandbox-bridge-packs.js +249 -0
  113. package/dist/sandbox-bridge-packs.js.map +1 -0
  114. package/dist/sandbox-catalog-host.d.ts +31 -0
  115. package/dist/sandbox-catalog-host.d.ts.map +1 -0
  116. package/dist/sandbox-catalog-host.js +78 -0
  117. package/dist/sandbox-catalog-host.js.map +1 -0
  118. package/dist/sandbox-module-catalog.d.ts +14 -0
  119. package/dist/sandbox-module-catalog.d.ts.map +1 -0
  120. package/dist/sandbox-module-catalog.js +402 -0
  121. package/dist/sandbox-module-catalog.js.map +1 -0
  122. package/dist/sandbox-npm-artifacts.d.ts +56 -0
  123. package/dist/sandbox-npm-artifacts.d.ts.map +1 -0
  124. package/dist/sandbox-npm-artifacts.js +17 -0
  125. package/dist/sandbox-npm-artifacts.js.map +1 -0
  126. package/dist/sandbox-pack-discovery.d.ts +93 -0
  127. package/dist/sandbox-pack-discovery.d.ts.map +1 -0
  128. package/dist/sandbox-pack-discovery.js +807 -0
  129. package/dist/sandbox-pack-discovery.js.map +1 -0
  130. package/dist/search.d.ts +29 -1
  131. package/dist/search.d.ts.map +1 -1
  132. package/dist/search.js +136 -9
  133. package/dist/search.js.map +1 -1
  134. package/dist/type-compat.d.ts +36 -0
  135. package/dist/type-compat.d.ts.map +1 -0
  136. package/dist/type-compat.js +98 -0
  137. package/dist/type-compat.js.map +1 -0
  138. package/dist/type-predicates.d.ts +25 -0
  139. package/dist/type-predicates.d.ts.map +1 -0
  140. package/dist/type-predicates.js +31 -0
  141. package/dist/type-predicates.js.map +1 -0
  142. package/dist/validation.d.ts +18 -0
  143. package/dist/validation.d.ts.map +1 -1
  144. package/dist/validation.js +70 -11
  145. package/dist/validation.js.map +1 -1
  146. package/dist/workflow-document-tools.d.ts +35 -0
  147. package/dist/workflow-document-tools.d.ts.map +1 -0
  148. package/dist/workflow-document-tools.js +402 -0
  149. package/dist/workflow-document-tools.js.map +1 -0
  150. package/dist/workflow-interface.d.ts +62 -0
  151. package/dist/workflow-interface.d.ts.map +1 -0
  152. package/dist/workflow-interface.js +351 -0
  153. package/dist/workflow-interface.js.map +1 -0
  154. package/package.json +67 -10
  155. package/dist/package-registry-client.d.ts +0 -12
  156. package/dist/package-registry-client.d.ts.map +0 -1
  157. package/dist/package-registry-client.js +0 -40
  158. package/dist/package-registry-client.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-loader.d.ts","sourceRoot":"","sources":["../src/pack-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,529 @@
1
+ /**
2
+ * Dynamic node pack loader with a trust/governance layer.
3
+ *
4
+ * Discovers installed third-party node packs and registers their nodes into a
5
+ * {@link NodeRegistry}. A pack is any npm package whose `package.json` carries a
6
+ * `nodetool` field:
7
+ *
8
+ * ```jsonc
9
+ * {
10
+ * "name": "@acme/cool-nodes",
11
+ * "main": "dist/index.js",
12
+ * "nodetool": {
13
+ * "apiVersion": 1,
14
+ * "register": "register" // named export called with the registry
15
+ * }
16
+ * }
17
+ * ```
18
+ *
19
+ * Trust model — packs run in-process with full server privileges (filesystem,
20
+ * secrets, network), so loading is gated:
21
+ *
22
+ * - **Allowlist**: explicit list of trusted pack names. `"*"` allows all.
23
+ * - **allowUnlisted**: whether packs not on the allowlist load anyway.
24
+ * Defaults to `true` in development and `false` in production, so a
25
+ * production server never silently runs whatever happens to be in
26
+ * `node_modules`.
27
+ *
28
+ * Resolved (when not passed explicitly) from `NODETOOL_PACKS_ALLOWLIST` and a
29
+ * config file at `~/.config/nodetool/packs.json` (override via
30
+ * `NODETOOL_PACKS_CONFIG`).
31
+ *
32
+ * Two further guards protect the registry from misbehaving packs:
33
+ * - **Reserved namespaces**: packs cannot register node types under
34
+ * first-party namespaces (`nodetool.`, `lib.`, provider names, …).
35
+ * - **Collision protection**: a pack cannot shadow an already-registered node
36
+ * type (e.g. a built-in); the conflicting node is skipped with a warning.
37
+ */
38
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
39
+ import { homedir } from "node:os";
40
+ import { isBoolean, isCallable, isObjectLike, isString } from "./type-predicates.js";
41
+ import { dirname, isAbsolute, join, resolve } from "node:path";
42
+ import { fileURLToPath, pathToFileURL } from "node:url";
43
+ import { SHIPPED_SANDBOX_PACKS_BUNDLE_DIR, SHIPPED_SANDBOX_PACKS_SOURCE_DIR } from "@nodetool-ai/config";
44
+ import { NodePackHostManifestSchema } from "@nodetool-ai/protocol";
45
+ /** The current pack API version. Packs declaring a higher version are skipped. */
46
+ export const PACK_API_VERSION = 1;
47
+ /** Default named export a pack's entry should expose. */
48
+ const DEFAULT_REGISTER_EXPORT = "register";
49
+ /**
50
+ * First-party node-type namespaces a third-party pack may not register under.
51
+ * Matched against the first dot-separated segment of a node type.
52
+ */
53
+ export const DEFAULT_RESERVED_NAMESPACES = [
54
+ "nodetool",
55
+ "lib",
56
+ "comfy",
57
+ "default",
58
+ "huggingface",
59
+ "hf",
60
+ "mlx",
61
+ "transformers",
62
+ "openai",
63
+ "gemini",
64
+ "anthropic",
65
+ "mistral",
66
+ "groq",
67
+ "ollama",
68
+ "replicate",
69
+ "fal",
70
+ "elevenlabs",
71
+ "kie",
72
+ "vector",
73
+ "apify",
74
+ "search",
75
+ "messaging"
76
+ ];
77
+ /**
78
+ * Walk up from `start` collecting each `node_modules` directory that exists,
79
+ * then add the root holding the packs that ship with NodeTool.
80
+ *
81
+ * Also includes any extra `node_modules` directories named in the
82
+ * `NODETOOL_OPTIONAL_NODE_MODULES` or `NODETOOL_PACK_SEARCH_PATHS` env vars
83
+ * (comma- or platform-separator-delimited). These are how the Electron app and
84
+ * other hosts hand the loader an install root outside the project tree.
85
+ *
86
+ * The shipped root comes last, so a pack of the same name found in any
87
+ * `node_modules` wins: what the user installed shadows the copy in the app.
88
+ */
89
+ export function defaultPackSearchPaths(start = process.cwd()) {
90
+ const paths = [];
91
+ for (const extra of readEnvPackPaths()) {
92
+ if (existsSync(extra))
93
+ paths.push(extra);
94
+ }
95
+ let dir = resolve(start);
96
+ for (;;) {
97
+ const candidate = join(dir, "node_modules");
98
+ if (existsSync(candidate))
99
+ paths.push(candidate);
100
+ const parent = dirname(dir);
101
+ if (parent === dir)
102
+ break;
103
+ dir = parent;
104
+ }
105
+ paths.push(...shippedPackSearchPaths());
106
+ // Dedupe — an env-supplied path may also be on the cwd walk.
107
+ return [...new Set(paths)];
108
+ }
109
+ /**
110
+ * Roots holding the sandbox packs that ship with NodeTool.
111
+ *
112
+ * They are config-only packages no host code may import, so they are not
113
+ * workspaces and npm links nothing into `node_modules`. Every host therefore
114
+ * reads them from where its own build put them, found relative to this module:
115
+ *
116
+ * - the bundled backend inlines this file into `server.mjs`, and
117
+ * `bundle-backend.mjs` stages the packs in `_sandbox/` beside it — the
118
+ * layout the packaged desktop app and the Docker/Fly image both run;
119
+ * - a checkout resolves this file inside `packages/node-sdk`, so the source
120
+ * directory is on the way up to the repo root.
121
+ *
122
+ * `NODETOOL_SHIPPED_PACKS_DIR` overrides both, for a host that stages them
123
+ * somewhere else. Non-existent candidates are dropped, so a host that ships no
124
+ * packs at all gets an empty list rather than a bad root.
125
+ */
126
+ export function shippedPackSearchPaths() {
127
+ const override = process.env["NODETOOL_SHIPPED_PACKS_DIR"];
128
+ if (override)
129
+ return splitPathList(override).filter((p) => existsSync(p));
130
+ const here = dirname(fileURLToPath(import.meta.url));
131
+ const bundled = join(here, SHIPPED_SANDBOX_PACKS_BUNDLE_DIR);
132
+ if (existsSync(bundled))
133
+ return [bundled];
134
+ const segments = SHIPPED_SANDBOX_PACKS_SOURCE_DIR.split("/");
135
+ let dir = here;
136
+ for (;;) {
137
+ const candidate = join(dir, ...segments);
138
+ if (existsSync(candidate))
139
+ return [candidate];
140
+ const parent = dirname(dir);
141
+ if (parent === dir)
142
+ return [];
143
+ dir = parent;
144
+ }
145
+ }
146
+ function splitPathList(list) {
147
+ // Comma, semicolon, or the platform PATH separator. ":" must not split
148
+ // on Windows — it would shear drive letters off absolute paths (C:\…).
149
+ const separators = process.platform === "win32" ? /[,;]/ : /[,;:]/;
150
+ return list
151
+ .split(separators)
152
+ .map((entry) => entry.trim())
153
+ .filter((entry) => entry.length > 0);
154
+ }
155
+ function readEnvPackPaths() {
156
+ // Stryker disable next-line ArrayDeclaration: a bogus seed path is dropped by the existsSync filter in defaultPackSearchPaths (its only caller), so the result is unchanged (equivalent).
157
+ const out = [];
158
+ const single = process.env["NODETOOL_OPTIONAL_NODE_MODULES"];
159
+ // Stryker disable next-line ConditionalExpression: forcing this pushes an undefined single, which the existsSync filter downstream discards (equivalent).
160
+ if (single)
161
+ out.push(single);
162
+ const list = process.env["NODETOOL_PACK_SEARCH_PATHS"];
163
+ if (list)
164
+ out.push(...splitPathList(list));
165
+ return out;
166
+ }
167
+ /**
168
+ * Resolve the effective trust config from explicit options, then environment,
169
+ * then the config file, then defaults.
170
+ */
171
+ export function resolvePackTrust(options = {}) {
172
+ const fromFile = readPacksConfigFile();
173
+ const envAllow = process.env["NODETOOL_PACKS_ALLOWLIST"];
174
+ const envList = envAllow
175
+ ? envAllow
176
+ .split(",")
177
+ .map((s) => s.trim())
178
+ .filter(Boolean)
179
+ : undefined;
180
+ const allowlist = options.allowlist ?? envList ?? fromFile.allow ?? [];
181
+ // Unlisted packs are trusted by default only in development. Production
182
+ // servers (NODETOOL_ENV=production) and the packaged desktop app
183
+ // (NODETOOL_PACKS_REQUIRE_ALLOWLIST=1 — set by Electron, which must NOT run
184
+ // in production mode because that disables local-only features like the
185
+ // Python bridge and the file browser) both require an explicit allowlist.
186
+ const isProd = process.env["NODETOOL_ENV"] === "production";
187
+ const requireAllowlist = process.env["NODETOOL_PACKS_REQUIRE_ALLOWLIST"] === "1";
188
+ const allowUnlisted = options.allowUnlisted ??
189
+ fromFile.allowUnlisted ??
190
+ !(isProd || requireAllowlist);
191
+ return { allowlist, allowUnlisted };
192
+ }
193
+ /**
194
+ * The trust fields as they exist ON DISK (no env or default merging). Use this
195
+ * — not {@link resolvePackTrust} — when persisting a partial trust update, so an
196
+ * ephemeral `NODETOOL_PACKS_ALLOWLIST` env override is never baked into the
197
+ * config file for a field the caller didn't set.
198
+ */
199
+ export function readPackTrustFromFile() {
200
+ const f = readPacksConfigFile();
201
+ return { allow: f.allow, allowUnlisted: f.allowUnlisted };
202
+ }
203
+ function trustConfigPath() {
204
+ return (process.env["NODETOOL_PACKS_CONFIG"] ??
205
+ // Stryker disable next-line StringLiteral: the default path is anchored at the OS home dir; tests exercise trust resolution via the NODETOOL_PACKS_CONFIG override, and these path segments are not independently asserted (home-dir manipulation is unreliable under the test sandbox).
206
+ join(homedir(), ".config", "nodetool", "packs.json"));
207
+ }
208
+ function stringArray(value) {
209
+ return Array.isArray(value)
210
+ ? value.filter((v) => typeof v === "string")
211
+ : undefined;
212
+ }
213
+ function readPacksConfigFile(path = trustConfigPath()) {
214
+ try {
215
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
216
+ return {
217
+ allow: stringArray(parsed.allow),
218
+ allowUnlisted: isBoolean(parsed.allowUnlisted)
219
+ ? parsed.allowUnlisted
220
+ : undefined,
221
+ enabledBuiltins: stringArray(parsed.enabledBuiltins),
222
+ disabledBuiltins: stringArray(parsed.disabledBuiltins)
223
+ };
224
+ }
225
+ catch {
226
+ return {};
227
+ }
228
+ }
229
+ /**
230
+ * Explicit user overrides for built-in packs, keyed by pack id. Packs absent
231
+ * from the map keep their install default (`defaultEnabled` in the catalog).
232
+ * The server applies this at bootstrap; changes take effect on restart.
233
+ */
234
+ export function readBuiltinPackOverrides() {
235
+ const config = readPacksConfigFile();
236
+ const overrides = {};
237
+ for (const id of config.disabledBuiltins ?? [])
238
+ overrides[id] = false;
239
+ for (const id of config.enabledBuiltins ?? [])
240
+ overrides[id] = true;
241
+ return overrides;
242
+ }
243
+ /**
244
+ * Persist built-in pack overrides as `enabledBuiltins` / `disabledBuiltins`
245
+ * lists, preserving the trust fields already in the config file. Creates
246
+ * parent directories as needed.
247
+ */
248
+ export function writeBuiltinPackOverrides(overrides, path = trustConfigPath()) {
249
+ const current = readPacksConfigFile(path);
250
+ const enabled = Object.keys(overrides).filter((id) => overrides[id]).sort();
251
+ const disabled = Object.keys(overrides)
252
+ .filter((id) => !overrides[id])
253
+ .sort();
254
+ mkdirSync(dirname(path), { recursive: true });
255
+ writeFileSync(path, JSON.stringify({ ...current, enabledBuiltins: enabled, disabledBuiltins: disabled }, null, 2) + "\n", "utf8");
256
+ }
257
+ /**
258
+ * Persist a trust config to disk so it's picked up by {@link resolvePackTrust}
259
+ * on the next call. Creates parent directories as needed.
260
+ */
261
+ export function writePackTrustConfig(trust, path = trustConfigPath()) {
262
+ // Preserve unrelated fields (e.g. disabledBuiltins) already in the file.
263
+ const current = readPacksConfigFile(path);
264
+ mkdirSync(dirname(path), { recursive: true });
265
+ writeFileSync(path, JSON.stringify({
266
+ ...current,
267
+ allow: trust.allowlist,
268
+ allowUnlisted: trust.allowUnlisted
269
+ }, null, 2) + "\n",
270
+ // Stryker disable next-line StringLiteral: Node decodes "" as utf-8, so the encoding argument is behaviourally equivalent.
271
+ "utf8");
272
+ }
273
+ function isAllowed(name, trust) {
274
+ if (isPackTrusted(name, trust))
275
+ return true;
276
+ return trust.allowUnlisted;
277
+ }
278
+ /**
279
+ * Whether the operator put this pack on the allowlist.
280
+ *
281
+ * Distinct from {@link isAllowed}: `allowUnlisted` lets a pack *load* (it
282
+ * defaults to true outside production, so a dev box runs what is installed),
283
+ * which is not a statement that anyone vouched for it. Only a name — or `*` —
284
+ * written on the allowlist is, and that is the line the SKILL.md disclosure
285
+ * policy draws between "registers as a skill" and "reaches the agent only as
286
+ * untrusted tool output".
287
+ */
288
+ export function isPackTrusted(name, trust = resolvePackTrust()) {
289
+ return trust.allowlist.includes("*") || trust.allowlist.includes(name);
290
+ }
291
+ /**
292
+ * Scan the given `node_modules` directories for packs.
293
+ *
294
+ * The first occurrence of a given package name wins, so nearer `node_modules`
295
+ * shadow farther ones — matching Node's own resolution order.
296
+ */
297
+ export function discoverPacks(searchPaths = defaultPackSearchPaths()) {
298
+ const found = new Map();
299
+ for (const nodeModules of searchPaths) {
300
+ for (const pkgDir of listPackageDirs(nodeModules)) {
301
+ const pack = readPack(pkgDir);
302
+ if (pack && !found.has(pack.name))
303
+ found.set(pack.name, pack);
304
+ }
305
+ }
306
+ return [...found.values()];
307
+ }
308
+ /**
309
+ * Discover and load all trusted installed packs into `registry`.
310
+ *
311
+ * Loading is gated by the trust config; reserved namespaces and existing node
312
+ * types are protected. A failure in one pack never aborts the others.
313
+ */
314
+ export async function loadInstalledPacks(registry, options = {}) {
315
+ const trust = resolvePackTrust(options.trust);
316
+ const reserved = options.reservedNamespaces ?? DEFAULT_RESERVED_NAMESPACES;
317
+ const packs = discoverPacks(options.searchPaths);
318
+ const results = [];
319
+ for (const pack of packs) {
320
+ let result;
321
+ if (!isAllowed(pack.name, trust)) {
322
+ result = {
323
+ pack,
324
+ status: "skipped",
325
+ reason: "not on pack allowlist",
326
+ registered: [],
327
+ skippedNodes: []
328
+ };
329
+ }
330
+ else {
331
+ result = await loadPack(registry, pack, reserved);
332
+ }
333
+ results.push(result);
334
+ options.onResult?.(result);
335
+ }
336
+ return results;
337
+ }
338
+ async function loadPack(registry, pack, reserved) {
339
+ const declared = pack.manifest.apiVersion ?? PACK_API_VERSION;
340
+ if (declared > PACK_API_VERSION) {
341
+ return {
342
+ pack,
343
+ status: "skipped",
344
+ reason: `requires pack API v${declared}, host supports v${PACK_API_VERSION}`,
345
+ registered: [],
346
+ skippedNodes: []
347
+ };
348
+ }
349
+ const registered = [];
350
+ const skippedNodes = [];
351
+ const guarded = makeGuardedRegistry(registry, reserved, registered, skippedNodes, pack.name);
352
+ try {
353
+ const mod = (await import(
354
+ /* @vite-ignore */ pathToFileURL(pack.entry).href));
355
+ const register = resolveRegisterFn(mod, pack.registerExport);
356
+ if (!register) {
357
+ throw new Error(`entry "${pack.entry}" has no callable export "${pack.registerExport}"`);
358
+ }
359
+ await register(guarded);
360
+ return { pack, status: "loaded", registered, skippedNodes };
361
+ }
362
+ catch (error) {
363
+ return {
364
+ pack,
365
+ status: "error",
366
+ error: error instanceof Error ? error : new Error(String(error)),
367
+ registered,
368
+ skippedNodes
369
+ };
370
+ }
371
+ }
372
+ function makeGuardedRegistry(target, reserved, registered, skippedNodes, packageId) {
373
+ return {
374
+ has: (nodeType) => target.has(nodeType),
375
+ register: (nodeClass) => {
376
+ const nodeType = nodeClass.nodeType;
377
+ // Stryker disable next-line ConditionalExpression,BlockStatement: a falsy nodeType errors either way — this branch lets target.register throw "without nodeType"; skipping it makes isReservedNamespace throw on the missing type — both surface as a loadPack error (equivalent).
378
+ if (!nodeType) {
379
+ // Let the real registry surface the "no nodeType" error.
380
+ target.register(nodeClass, { packageId });
381
+ return;
382
+ }
383
+ if (isReservedNamespace(nodeType, reserved)) {
384
+ skippedNodes.push({ nodeType, reason: "reserved-namespace" });
385
+ return;
386
+ }
387
+ if (target.has(nodeType)) {
388
+ skippedNodes.push({ nodeType, reason: "collision" });
389
+ return;
390
+ }
391
+ target.register(nodeClass, { packageId });
392
+ registered.push(nodeType);
393
+ }
394
+ };
395
+ }
396
+ function isReservedNamespace(nodeType, reserved) {
397
+ const dot = nodeType.indexOf(".");
398
+ // Stryker disable next-line EqualityOperator: > 0 vs >= 0 differ only at dot === 0 (a leading-dot type), where head becomes "" vs the full string — but neither is ever a reserved namespace, so the result is unchanged (equivalent).
399
+ const head = dot > 0 ? nodeType.slice(0, dot) : nodeType;
400
+ return reserved.includes(head);
401
+ }
402
+ function resolveRegisterFn(mod, exportName) {
403
+ const candidate = mod[exportName] ??
404
+ mod["default"]?.[exportName];
405
+ return isCallable(candidate)
406
+ ? candidate
407
+ : undefined;
408
+ }
409
+ /**
410
+ * Every package directory directly inside one `node_modules`, with scoped
411
+ * packages expanded one level deeper. Exported for the sandbox catalog host,
412
+ * which scans the same roots without importing any pack.
413
+ */
414
+ export function listPackageDirs(nodeModules) {
415
+ let entries;
416
+ try {
417
+ entries = readdirSync(nodeModules);
418
+ }
419
+ catch {
420
+ // Stryker disable next-line ArrayDeclaration: a bogus seed path has no package.json, so discoverPacks (the only caller) drops it via readPack — equivalent.
421
+ return [];
422
+ }
423
+ // Stryker disable next-line ArrayDeclaration: a bogus seed path has no package.json, so readPack returns undefined for it and discoverPacks drops it — the result is unchanged (equivalent).
424
+ const dirs = [];
425
+ for (const name of entries) {
426
+ if (name === ".bin" || name === ".cache")
427
+ continue;
428
+ const full = join(nodeModules, name);
429
+ if (name.startsWith("@")) {
430
+ // Scoped: one level deeper holds the actual packages.
431
+ let scoped;
432
+ try {
433
+ scoped = readdirSync(full);
434
+ }
435
+ catch {
436
+ continue;
437
+ }
438
+ for (const sub of scoped)
439
+ dirs.push(join(full, sub));
440
+ }
441
+ else {
442
+ dirs.push(full);
443
+ }
444
+ }
445
+ return dirs;
446
+ }
447
+ function readPack(pkgDir) {
448
+ const pkgJsonPath = join(pkgDir, "package.json");
449
+ let pkg;
450
+ try {
451
+ // Stryker disable next-line ConditionalExpression: if package.json is a directory, the readFileSync below throws into this catch and also returns undefined, so the guard is equivalent.
452
+ if (!statSync(pkgJsonPath).isFile())
453
+ return undefined;
454
+ pkg = JSON.parse(readFileSync(pkgJsonPath, "utf8"));
455
+ }
456
+ catch {
457
+ return undefined;
458
+ }
459
+ const manifest = parsePackManifest(pkg.nodetool, pkg.name ?? pkgJsonPath);
460
+ if (!manifest || isSandboxOnlyManifest(manifest))
461
+ return undefined;
462
+ if (!pkg.name)
463
+ return undefined;
464
+ const entryRel = resolveEntry(pkg);
465
+ // Stryker disable next-line ConditionalExpression: resolveEntry always returns a string (it falls back to "index.js"), so entryRel is never falsy here (equivalent).
466
+ if (!entryRel)
467
+ return undefined;
468
+ const entry = isAbsolute(entryRel) ? entryRel : join(pkgDir, entryRel);
469
+ if (!existsSync(entry))
470
+ return undefined;
471
+ return {
472
+ name: pkg.name,
473
+ version: pkg.version,
474
+ dir: pkgDir,
475
+ entry,
476
+ registerExport: manifest.register ?? DEFAULT_REGISTER_EXPORT,
477
+ manifest
478
+ };
479
+ }
480
+ function parsePackManifest(value, packageLabel) {
481
+ const parsed = NodePackHostManifestSchema.safeParse(value);
482
+ if (!parsed.success) {
483
+ if (value !== undefined) {
484
+ console.warn(`Skipping ${packageLabel}: invalid nodetool manifest: ${parsed.error.message}`);
485
+ }
486
+ return undefined;
487
+ }
488
+ const manifest = {};
489
+ if (parsed.data.apiVersion !== undefined) {
490
+ manifest.apiVersion = parsed.data.apiVersion;
491
+ }
492
+ if (parsed.data.register !== undefined) {
493
+ manifest.register = parsed.data.register;
494
+ }
495
+ if (Object.hasOwn(parsed.data, "sandboxModules")) {
496
+ manifest.sandboxModules = parsed.data.sandboxModules;
497
+ }
498
+ return manifest;
499
+ }
500
+ function isSandboxOnlyManifest(manifest) {
501
+ return (Object.hasOwn(manifest, "sandboxModules") &&
502
+ !Object.hasOwn(manifest, "register"));
503
+ }
504
+ /** Resolve the entry module from `exports["."]` (import condition) or `main`. */
505
+ function resolveEntry(pkg) {
506
+ const dot = pkg.exports?.["."];
507
+ if (isString(dot))
508
+ return dot;
509
+ const picked = pickExportCondition(dot);
510
+ if (picked != null)
511
+ return picked;
512
+ return pkg.main ?? "index.js";
513
+ }
514
+ /**
515
+ * Pick the `import` (then `default`) condition from an `exports["."]` object.
516
+ * Conditions may nest (e.g. `{ import: { types: "...", default: "x.js" } }`),
517
+ * so recurse until a string target is found. Depth-capped against cycles.
518
+ */
519
+ function pickExportCondition(dot, depth = 0) {
520
+ // Stryker disable next-line ConditionalExpression: a nullish or non-object dot has no conditions to pick — every guard variant resolves to undefined and falls through to `main` (covered by the exports/main entry tests).
521
+ if (!isObjectLike(dot) || depth > 4)
522
+ return undefined;
523
+ const conds = dot;
524
+ const picked = conds["import"] ?? conds["default"];
525
+ if (isString(picked))
526
+ return picked;
527
+ return pickExportCondition(picked, depth + 1);
528
+ }
529
+ //# sourceMappingURL=pack-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-loader.js","sourceRoot":"","sources":["../src/pack-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** Scalar and container types every NodeTool install understands. */
2
+ export declare const CORE_PORT_TYPES: readonly ["any", "str", "text", "int", "float", "number", "bool", "list", "dict", "union", "enum", "image", "audio", "video", "document", "file"];
3
+ /** The NodeTool name for a known alias, case-insensitively. */
4
+ export declare const canonicalPortType: (type: string) => string | undefined;
5
+ /** One alias found in a type declaration, and the name to use instead. */
6
+ export interface PortTypeAlias {
7
+ used: string;
8
+ canonical: string;
9
+ }
10
+ /**
11
+ * Every alias in a type declaration, walking `type_args` so `list[integer]` is
12
+ * caught as well as a bare `integer`.
13
+ */
14
+ export declare function portTypeAliases(type: unknown): PortTypeAlias[];
15
+ //# sourceMappingURL=port-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-types.d.ts","sourceRoot":"","sources":["../src/port-types.ts"],"names":[],"mappings":"AAkBA,qEAAqE;AACrE,eAAO,MAAM,eAAe,YAC1B,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,MAAM,CACE,CAAC;AA0BX,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,MAAM,GAAG,SAClB,CAAC;AAEzC,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,EAAE,CAkB9D"}
@@ -0,0 +1,72 @@
1
+ import { isObjectLike, isString } from "./type-predicates.js";
2
+ /** Scalar and container types every NodeTool install understands. */
3
+ export const CORE_PORT_TYPES = [
4
+ "any",
5
+ "str",
6
+ "text",
7
+ "int",
8
+ "float",
9
+ "number",
10
+ "bool",
11
+ "list",
12
+ "dict",
13
+ "union",
14
+ "enum",
15
+ "image",
16
+ "audio",
17
+ "video",
18
+ "document",
19
+ "file"
20
+ ];
21
+ /**
22
+ * Spellings that get reached for which NodeTool spells differently. JSON Schema
23
+ * (`integer`, `string`, `boolean`, `object`, `array`, `null`) and TypeScript
24
+ * (`String`, `Number`, `Record`) both appear in practice.
25
+ */
26
+ const ALIASES = new Map([
27
+ ["integer", "int"],
28
+ ["long", "int"],
29
+ ["double", "float"],
30
+ ["decimal", "float"],
31
+ ["string", "str"],
32
+ ["boolean", "bool"],
33
+ ["object", "dict"],
34
+ ["record", "dict"],
35
+ ["map", "dict"],
36
+ ["array", "list"],
37
+ ["tuple", "list"],
38
+ ["null", "any"],
39
+ ["none", "any"],
40
+ ["undefined", "any"],
41
+ ["unknown", "any"],
42
+ ["void", "any"]
43
+ ]);
44
+ /** The NodeTool name for a known alias, case-insensitively. */
45
+ export const canonicalPortType = (type) => ALIASES.get(type.trim().toLowerCase());
46
+ /**
47
+ * Every alias in a type declaration, walking `type_args` so `list[integer]` is
48
+ * caught as well as a bare `integer`.
49
+ */
50
+ export function portTypeAliases(type) {
51
+ const found = [];
52
+ const visit = (candidate) => {
53
+ if (!isObjectLike(candidate))
54
+ return;
55
+ const meta = candidate;
56
+ if (isString(meta.type)) {
57
+ const canonical = canonicalPortType(meta.type);
58
+ if (canonical)
59
+ found.push({ used: meta.type, canonical });
60
+ }
61
+ const args = Array.isArray(meta.type_args)
62
+ ? meta.type_args
63
+ : Array.isArray(meta.args)
64
+ ? meta.args
65
+ : [];
66
+ for (const arg of args)
67
+ visit(arg);
68
+ };
69
+ visit(type);
70
+ return found;
71
+ }
72
+ //# sourceMappingURL=port-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-types.js","sourceRoot":"","sources":["../src/port-types.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE9D,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;CACE,CAAC;AAEX;;;;GAIG;AACH,MAAM,OAAO,GAAgC,IAAI,GAAG,CAAC;IACnD,CAAC,SAAS,EAAE,KAAK,CAAC;IAClB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,QAAQ,EAAE,OAAO,CAAC;IACnB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,SAAS,EAAE,KAAK,CAAC;IAClB,CAAC,MAAM,EAAE,KAAK,CAAC;CAChB,CAAC,CAAC;AAEH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAsB,EAAE,CACpE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAQzC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,SAAkB,EAAQ,EAAE;QACzC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YAAE,OAAO;QACrC,MAAM,IAAI,GAAG,SAAyB,CAAC;QACvC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;YACxC,CAAC,CAAC,IAAI,CAAC,SAAS;YAChB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxB,CAAC,CAAC,IAAI,CAAC,IAAI;gBACX,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC;AACf,CAAC"}