@nodetool-ai/node-sdk 0.7.0-rc.11

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 (61) hide show
  1. package/dist/base-node.d.ts +141 -0
  2. package/dist/base-node.d.ts.map +1 -0
  3. package/dist/base-node.js +225 -0
  4. package/dist/base-node.js.map +1 -0
  5. package/dist/decorators.d.ts +19 -0
  6. package/dist/decorators.d.ts.map +1 -0
  7. package/dist/decorators.js +42 -0
  8. package/dist/decorators.js.map +1 -0
  9. package/dist/docs/index.d.ts +4 -0
  10. package/dist/docs/index.d.ts.map +1 -0
  11. package/dist/docs/index.js +4 -0
  12. package/dist/docs/index.js.map +1 -0
  13. package/dist/docs/nodes.d.ts +10 -0
  14. package/dist/docs/nodes.d.ts.map +1 -0
  15. package/dist/docs/nodes.js +99 -0
  16. package/dist/docs/nodes.js.map +1 -0
  17. package/dist/docs/overview.d.ts +6 -0
  18. package/dist/docs/overview.d.ts.map +1 -0
  19. package/dist/docs/overview.js +71 -0
  20. package/dist/docs/overview.js.map +1 -0
  21. package/dist/docs/workflows.d.ts +10 -0
  22. package/dist/docs/workflows.d.ts.map +1 -0
  23. package/dist/docs/workflows.js +112 -0
  24. package/dist/docs/workflows.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +12 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/metadata.d.ts +76 -0
  30. package/dist/metadata.d.ts.map +1 -0
  31. package/dist/metadata.js +247 -0
  32. package/dist/metadata.js.map +1 -0
  33. package/dist/node-metadata.d.ts +16 -0
  34. package/dist/node-metadata.d.ts.map +1 -0
  35. package/dist/node-metadata.js +266 -0
  36. package/dist/node-metadata.js.map +1 -0
  37. package/dist/nodes/test-nodes.d.ts +215 -0
  38. package/dist/nodes/test-nodes.d.ts.map +1 -0
  39. package/dist/nodes/test-nodes.js +436 -0
  40. package/dist/nodes/test-nodes.js.map +1 -0
  41. package/dist/package-registry-client.d.ts +12 -0
  42. package/dist/package-registry-client.d.ts.map +1 -0
  43. package/dist/package-registry-client.js +40 -0
  44. package/dist/package-registry-client.js.map +1 -0
  45. package/dist/python-package-scan.d.ts +45 -0
  46. package/dist/python-package-scan.d.ts.map +1 -0
  47. package/dist/python-package-scan.js +158 -0
  48. package/dist/python-package-scan.js.map +1 -0
  49. package/dist/registry.d.ts +55 -0
  50. package/dist/registry.d.ts.map +1 -0
  51. package/dist/registry.js +188 -0
  52. package/dist/registry.js.map +1 -0
  53. package/dist/search.d.ts +58 -0
  54. package/dist/search.d.ts.map +1 -0
  55. package/dist/search.js +127 -0
  56. package/dist/search.js.map +1 -0
  57. package/dist/validation.d.ts +63 -0
  58. package/dist/validation.d.ts.map +1 -0
  59. package/dist/validation.js +138 -0
  60. package/dist/validation.js.map +1 -0
  61. package/package.json +49 -0
@@ -0,0 +1,71 @@
1
+ import { slugifyNodeFilename } from "./nodes.js";
2
+ function shortDescription(text) {
3
+ if (!text)
4
+ return "";
5
+ const firstLine = text.split(/\r?\n/)[0] ?? "";
6
+ return firstLine.trim();
7
+ }
8
+ function exampleLabel(example) {
9
+ if (!example || typeof example !== "object" || Array.isArray(example)) {
10
+ return String(example);
11
+ }
12
+ const record = example;
13
+ return ((typeof record["name"] === "string" && record["name"]) ||
14
+ (typeof record["id"] === "string" && record["id"]) ||
15
+ "example");
16
+ }
17
+ export function generatePackageOverviewMarkdown(pkg, opts = {}) {
18
+ const nodes = pkg.nodes ?? [];
19
+ const examples = pkg.examples ?? [];
20
+ const authors = (pkg.authors ?? []).join(", ");
21
+ if (opts.compact) {
22
+ const nodeList = nodes
23
+ .map((n) => `- ${n.title} (\`${n.node_type}\`)${shortDescription(n.description)
24
+ ? ` — ${shortDescription(n.description)}`
25
+ : ""}`)
26
+ .join("\n");
27
+ const header = [
28
+ `# ${pkg.name}${pkg.version ? ` (${pkg.version})` : ""}`,
29
+ pkg.description ?? "",
30
+ `Nodes: ${nodes.length} Examples: ${examples.length}`
31
+ ]
32
+ .filter(Boolean)
33
+ .join(" · ");
34
+ return `${header}\n\n${nodeList}\n`;
35
+ }
36
+ const lines = [];
37
+ lines.push(`# ${pkg.name}`, "");
38
+ if (pkg.description) {
39
+ lines.push(pkg.description, "");
40
+ }
41
+ if (pkg.version)
42
+ lines.push(`**Version:** ${pkg.version}`);
43
+ if (authors)
44
+ lines.push(`**Authors:** ${authors}`);
45
+ if (pkg.version || authors)
46
+ lines.push("");
47
+ lines.push(`## Nodes (${nodes.length})`, "");
48
+ if (nodes.length === 0) {
49
+ lines.push("_(no nodes)_", "");
50
+ }
51
+ else {
52
+ for (const node of nodes) {
53
+ const desc = shortDescription(node.description);
54
+ const file = slugifyNodeFilename(node);
55
+ lines.push(`- [${node.title}](${file})${desc ? ` — ${desc}` : ""}`);
56
+ }
57
+ lines.push("");
58
+ }
59
+ lines.push(`## Examples (${examples.length})`, "");
60
+ if (examples.length === 0) {
61
+ lines.push("_(no examples)_", "");
62
+ }
63
+ else {
64
+ for (const example of examples) {
65
+ lines.push(`- ${exampleLabel(example)}`);
66
+ }
67
+ lines.push("");
68
+ }
69
+ return lines.join("\n");
70
+ }
71
+ //# sourceMappingURL=overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/docs/overview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface WorkflowDocOptions {
2
+ packageName?: string;
3
+ }
4
+ export interface WorkflowFile {
5
+ path: string;
6
+ data: Record<string, unknown>;
7
+ }
8
+ export declare function generateWorkflowMarkdown(wf: WorkflowFile): string;
9
+ export declare function generateAllWorkflowDocs(workflows: WorkflowFile[], opts?: WorkflowDocOptions): Map<string, string>;
10
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/docs/workflows.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAyDD,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAgEjE;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,YAAY,EAAE,EACzB,IAAI,GAAE,kBAAuB,GAC5B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAerB"}
@@ -0,0 +1,112 @@
1
+ import path from "node:path";
2
+ function asGraph(data) {
3
+ const graph = (data["graph"] ?? data);
4
+ const nodes = Array.isArray(graph["nodes"])
5
+ ? graph["nodes"]
6
+ : [];
7
+ const edges = Array.isArray(graph["edges"])
8
+ ? graph["edges"]
9
+ : [];
10
+ return { nodes, edges };
11
+ }
12
+ function filterIO(nodes, prefix) {
13
+ return nodes.filter((n) => typeof n.type === "string" && n.type.startsWith(prefix));
14
+ }
15
+ function slotName(node) {
16
+ const props = (node.properties ?? node.data ?? {});
17
+ if (typeof props["name"] === "string" && props["name"])
18
+ return props["name"];
19
+ return node.id ?? (node.type ?? "unknown");
20
+ }
21
+ function slotDescription(node) {
22
+ const props = (node.properties ?? node.data ?? {});
23
+ if (typeof props["description"] === "string")
24
+ return props["description"];
25
+ return "";
26
+ }
27
+ function slotType(node) {
28
+ const t = node.type ?? "";
29
+ const lastDot = t.lastIndexOf(".");
30
+ return lastDot > 0 ? t.slice(lastDot + 1) : t;
31
+ }
32
+ function slugifyWorkflowName(name) {
33
+ return name
34
+ .toLowerCase()
35
+ .replace(/[^a-z0-9]+/g, "-")
36
+ .replace(/-+/g, "-")
37
+ .replace(/^-|-$/g, "");
38
+ }
39
+ export function generateWorkflowMarkdown(wf) {
40
+ const { nodes, edges } = asGraph(wf.data);
41
+ const name = typeof wf.data["name"] === "string"
42
+ ? wf.data["name"]
43
+ : path.basename(wf.path, ".json");
44
+ const description = typeof wf.data["description"] === "string" ? wf.data["description"] : "";
45
+ const inputs = filterIO(nodes, "nodetool.input.");
46
+ const outputs = filterIO(nodes, "nodetool.output.");
47
+ const lines = [];
48
+ lines.push(`# ${name}`, "");
49
+ if (description)
50
+ lines.push(description, "");
51
+ lines.push(`**Source:** \`${wf.path}\``);
52
+ lines.push(`**Nodes:** ${nodes.length}`);
53
+ lines.push(`**Edges:** ${edges.length}`, "");
54
+ lines.push("## Inputs", "");
55
+ if (inputs.length === 0) {
56
+ lines.push("_(none)_", "");
57
+ }
58
+ else {
59
+ lines.push("| Name | Type | Description |");
60
+ lines.push("|------|------|-------------|");
61
+ for (const input of inputs) {
62
+ const cells = [
63
+ slotName(input),
64
+ slotType(input),
65
+ slotDescription(input)
66
+ ].map((c) => c
67
+ .replace(/\\/g, "\\\\")
68
+ .replace(/\|/g, "\\|")
69
+ .replace(/\r?\n/g, " "));
70
+ lines.push(`| ${cells.join(" | ")} |`);
71
+ }
72
+ lines.push("");
73
+ }
74
+ lines.push("## Outputs", "");
75
+ if (outputs.length === 0) {
76
+ lines.push("_(none)_", "");
77
+ }
78
+ else {
79
+ lines.push("| Name | Type | Description |");
80
+ lines.push("|------|------|-------------|");
81
+ for (const output of outputs) {
82
+ const cells = [
83
+ slotName(output),
84
+ slotType(output),
85
+ slotDescription(output)
86
+ ].map((c) => c
87
+ .replace(/\\/g, "\\\\")
88
+ .replace(/\|/g, "\\|")
89
+ .replace(/\r?\n/g, " "));
90
+ lines.push(`| ${cells.join(" | ")} |`);
91
+ }
92
+ lines.push("");
93
+ }
94
+ return lines.join("\n");
95
+ }
96
+ export function generateAllWorkflowDocs(workflows, opts = {}) {
97
+ const docs = new Map();
98
+ for (const wf of workflows) {
99
+ if (opts.packageName) {
100
+ const pkg = wf.data["package_name"];
101
+ if (typeof pkg === "string" && pkg !== opts.packageName)
102
+ continue;
103
+ }
104
+ const name = typeof wf.data["name"] === "string"
105
+ ? wf.data["name"]
106
+ : path.basename(wf.path, ".json");
107
+ const filename = `${slugifyWorkflowName(name)}.md`;
108
+ docs.set(filename, generateWorkflowMarkdown(wf));
109
+ }
110
+ return docs;
111
+ }
112
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/docs/workflows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export * from "./base-node.js";
2
+ export * from "./registry.js";
3
+ export * from "./metadata.js";
4
+ export * from "./node-metadata.js";
5
+ export * from "./decorators.js";
6
+ export * from "./search.js";
7
+ export * from "./validation.js";
8
+ export * from "./nodes/test-nodes.js";
9
+ export * from "./package-registry-client.js";
10
+ export * from "./docs/index.js";
11
+ export * from "./python-package-scan.js";
12
+ export type { StreamingInputs, StreamingOutputs } from "@nodetool-ai/runtime";
13
+ export type { ImageRef, AudioRef, VideoRef, TextRef, DataframeRef } from "@nodetool-ai/protocol";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,EACb,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from "./base-node.js";
2
+ export * from "./registry.js";
3
+ export * from "./metadata.js";
4
+ export * from "./node-metadata.js";
5
+ export * from "./decorators.js";
6
+ export * from "./search.js";
7
+ export * from "./validation.js";
8
+ export * from "./nodes/test-nodes.js";
9
+ export * from "./package-registry-client.js";
10
+ export * from "./docs/index.js";
11
+ export * from "./python-package-scan.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,76 @@
1
+ export interface TypeMetadata {
2
+ type: string;
3
+ optional?: boolean;
4
+ values?: Array<string | number>;
5
+ type_args: TypeMetadata[];
6
+ type_name?: string | null;
7
+ }
8
+ /** Ensure a raw type object from JSON always has type_args as an array. */
9
+ export declare function normalizeTypeMetadata(t: TypeMetadata): TypeMetadata;
10
+ export interface PropertyMetadata {
11
+ name: string;
12
+ type: TypeMetadata;
13
+ default?: unknown;
14
+ title?: string | null;
15
+ description?: string | null;
16
+ min?: number | null;
17
+ max?: number | null;
18
+ values?: Array<string | number> | null;
19
+ json_schema_extra?: Record<string, unknown> | null;
20
+ required?: boolean;
21
+ }
22
+ export interface OutputSlotMetadata {
23
+ type: TypeMetadata;
24
+ name: string;
25
+ stream?: boolean;
26
+ }
27
+ export interface NodeMetadata {
28
+ title: string;
29
+ description: string;
30
+ namespace: string;
31
+ node_type: string;
32
+ layout?: string;
33
+ properties: PropertyMetadata[];
34
+ outputs: OutputSlotMetadata[];
35
+ recommended_models?: unknown[];
36
+ basic_fields?: string[];
37
+ required_settings?: string[];
38
+ /**
39
+ * Runtime packages this node depends on (e.g. "ffmpeg", "python", "ollama").
40
+ * The frontend uses this to show install prompts before execution.
41
+ */
42
+ required_runtimes?: string[];
43
+ is_dynamic?: boolean;
44
+ is_streaming_input?: boolean;
45
+ is_streaming_output?: boolean;
46
+ is_controlled?: boolean;
47
+ expose_as_tool?: boolean;
48
+ supports_dynamic_outputs?: boolean;
49
+ auto_save_asset?: boolean;
50
+ model_packs?: unknown[];
51
+ }
52
+ export interface PackageMetadata {
53
+ name: string;
54
+ description?: string;
55
+ version?: string;
56
+ authors?: string[];
57
+ repo_id?: string | null;
58
+ nodes?: NodeMetadata[];
59
+ examples?: unknown[];
60
+ assets?: unknown[];
61
+ /** Absolute path to the source root (e.g. /path/to/nodetool-base/src or /path/to/nodetool-base) */
62
+ sourceFolder?: string;
63
+ }
64
+ export interface PythonMetadataLoadOptions {
65
+ roots?: string[];
66
+ maxDepth?: number;
67
+ }
68
+ export interface PythonMetadataLoadResult {
69
+ files: string[];
70
+ packages: PackageMetadata[];
71
+ nodesByType: Map<string, NodeMetadata>;
72
+ duplicates: string[];
73
+ warnings: string[];
74
+ }
75
+ export declare function loadPythonPackageMetadata(options?: PythonMetadataLoadOptions): PythonMetadataLoadResult;
76
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import crypto from "node:crypto";
4
+ import os from "node:os";
5
+ /** Ensure a raw type object from JSON always has type_args as an array. */
6
+ export function normalizeTypeMetadata(t) {
7
+ return {
8
+ ...t,
9
+ type_args: (t.type_args ?? []).map(normalizeTypeMetadata)
10
+ };
11
+ }
12
+ function isRecord(value) {
13
+ return !!value && typeof value === "object" && !Array.isArray(value);
14
+ }
15
+ function walkForMetadataFiles(root, maxDepth, files, warnings, depth = 0) {
16
+ if (depth > maxDepth)
17
+ return;
18
+ const normalizedRoot = root.split(path.sep).join("/");
19
+ if (normalizedRoot.endsWith("/src/nodetool/package_metadata") ||
20
+ normalizedRoot.endsWith("/nodetool/package_metadata")) {
21
+ try {
22
+ const metadataFiles = fs
23
+ .readdirSync(root, { withFileTypes: true })
24
+ .filter((f) => f.isFile() && f.name.endsWith(".json"))
25
+ .map((f) => path.join(root, f.name));
26
+ files.push(...metadataFiles);
27
+ }
28
+ catch (error) {
29
+ warnings.push(`Failed to scan metadata dir ${root}: ${String(error)}`);
30
+ }
31
+ return;
32
+ }
33
+ let entries;
34
+ try {
35
+ entries = fs.readdirSync(root, { withFileTypes: true });
36
+ }
37
+ catch (error) {
38
+ warnings.push(`Failed to read directory ${root}: ${String(error)}`);
39
+ return;
40
+ }
41
+ for (const entry of entries) {
42
+ const fullPath = path.join(root, entry.name);
43
+ if (entry.isDirectory()) {
44
+ if (entry.name === ".git" ||
45
+ entry.name === "node_modules" ||
46
+ entry.name === "dist") {
47
+ continue;
48
+ }
49
+ const normalized = fullPath.split(path.sep).join("/");
50
+ if (normalized.endsWith("/src/nodetool/package_metadata") ||
51
+ normalized.endsWith("/nodetool/package_metadata")) {
52
+ try {
53
+ const metadataFiles = fs
54
+ .readdirSync(fullPath, { withFileTypes: true })
55
+ .filter((f) => f.isFile() && f.name.endsWith(".json"))
56
+ .map((f) => path.join(fullPath, f.name));
57
+ files.push(...metadataFiles);
58
+ }
59
+ catch (error) {
60
+ warnings.push(`Failed to scan metadata dir ${fullPath}: ${String(error)}`);
61
+ }
62
+ continue;
63
+ }
64
+ walkForMetadataFiles(fullPath, maxDepth, files, warnings, depth + 1);
65
+ }
66
+ }
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Metadata cache — avoids re-reading and re-parsing JSON files on every startup
70
+ // when the underlying metadata files haven't changed.
71
+ // ---------------------------------------------------------------------------
72
+ const CACHE_DIR = path.join(os.tmpdir(), "nodetool-metadata-cache");
73
+ const CACHE_VERSION = 1;
74
+ /** Build a fingerprint from sorted file paths + their mtime/size. */
75
+ function buildFingerprint(files) {
76
+ const hash = crypto.createHash("sha256");
77
+ for (const file of files) {
78
+ hash.update(file);
79
+ try {
80
+ const stat = fs.statSync(file);
81
+ hash.update(`|${stat.mtimeMs}|${stat.size}`);
82
+ }
83
+ catch {
84
+ hash.update("|missing");
85
+ }
86
+ }
87
+ return hash.digest("hex");
88
+ }
89
+ function getCachePath(roots) {
90
+ const key = crypto
91
+ .createHash("sha256")
92
+ .update(roots.join(":"))
93
+ .digest("hex")
94
+ .slice(0, 16);
95
+ return path.join(CACHE_DIR, `metadata-${key}.json`);
96
+ }
97
+ function tryReadCache(cachePath, fingerprint) {
98
+ try {
99
+ if (!fs.existsSync(cachePath))
100
+ return null;
101
+ const raw = fs.readFileSync(cachePath, "utf8");
102
+ const entry = JSON.parse(raw);
103
+ if (entry.version !== CACHE_VERSION || entry.fingerprint !== fingerprint)
104
+ return null;
105
+ return {
106
+ files: entry.files,
107
+ packages: entry.packages,
108
+ nodesByType: new Map(entry.nodesByType),
109
+ duplicates: entry.duplicates,
110
+ warnings: entry.warnings
111
+ };
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ function writeCache(cachePath, fingerprint, result) {
118
+ try {
119
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
120
+ const entry = {
121
+ version: CACHE_VERSION,
122
+ fingerprint,
123
+ files: result.files,
124
+ packages: result.packages,
125
+ nodesByType: [...result.nodesByType.entries()],
126
+ duplicates: result.duplicates,
127
+ warnings: result.warnings
128
+ };
129
+ fs.writeFileSync(cachePath, JSON.stringify(entry));
130
+ }
131
+ catch {
132
+ // Cache write failure is non-fatal
133
+ }
134
+ }
135
+ function parseMetadataFiles(files) {
136
+ const packages = [];
137
+ const nodesByType = new Map();
138
+ const duplicates = new Set();
139
+ const warnings = [];
140
+ for (const file of files) {
141
+ let parsed;
142
+ try {
143
+ // Python's json module allows NaN/Infinity which are not valid JSON; replace them with null.
144
+ const raw = fs
145
+ .readFileSync(file, "utf8")
146
+ .replace(/\bNaN\b|-?Infinity\b/g, "null");
147
+ parsed = JSON.parse(raw);
148
+ }
149
+ catch (error) {
150
+ warnings.push(`Failed to parse JSON ${file}: ${String(error)}`);
151
+ continue;
152
+ }
153
+ if (!isRecord(parsed)) {
154
+ warnings.push(`Skipping non-object metadata file: ${file}`);
155
+ continue;
156
+ }
157
+ // Infer source folder from the metadata file path:
158
+ // file is at {root}/nodetool/package_metadata/{name}.json or {root}/src/nodetool/package_metadata/{name}.json
159
+ const metaDir = path.dirname(file); // .../nodetool/package_metadata
160
+ const sourceFolder = path.dirname(path.dirname(metaDir)); // strip /nodetool/package_metadata
161
+ const pkg = {
162
+ name: typeof parsed.name === "string"
163
+ ? parsed.name
164
+ : path.basename(file, ".json"),
165
+ description: typeof parsed.description === "string" ? parsed.description : undefined,
166
+ version: typeof parsed.version === "string" ? parsed.version : undefined,
167
+ authors: Array.isArray(parsed.authors)
168
+ ? parsed.authors
169
+ : undefined,
170
+ repo_id: typeof parsed.repo_id === "string" ? parsed.repo_id : undefined,
171
+ nodes: Array.isArray(parsed.nodes)
172
+ ? parsed.nodes
173
+ : undefined,
174
+ examples: Array.isArray(parsed.examples) ? parsed.examples : undefined,
175
+ assets: Array.isArray(parsed.assets) ? parsed.assets : undefined,
176
+ sourceFolder
177
+ };
178
+ packages.push(pkg);
179
+ for (const node of pkg.nodes ?? []) {
180
+ if (!node ||
181
+ typeof node !== "object" ||
182
+ typeof node.node_type !== "string") {
183
+ continue;
184
+ }
185
+ if (nodesByType.has(node.node_type)) {
186
+ duplicates.add(node.node_type);
187
+ }
188
+ // Normalize type_args to always be an array (some JSON files omit it)
189
+ const normalized = {
190
+ ...node,
191
+ properties: (node.properties ?? []).map((p) => ({
192
+ ...p,
193
+ type: normalizeTypeMetadata(p.type)
194
+ })),
195
+ outputs: (node.outputs ?? []).map((o) => ({
196
+ ...o,
197
+ type: normalizeTypeMetadata(o.type)
198
+ }))
199
+ };
200
+ nodesByType.set(node.node_type, normalized);
201
+ }
202
+ }
203
+ return {
204
+ files,
205
+ packages,
206
+ nodesByType,
207
+ duplicates: [...duplicates].sort(),
208
+ warnings
209
+ };
210
+ }
211
+ export function loadPythonPackageMetadata(options = {}) {
212
+ const roots = (options.roots && options.roots.length > 0 ? options.roots : [process.cwd()]).map((p) => path.resolve(p));
213
+ const maxDepth = options.maxDepth ?? 8;
214
+ const warnings = [];
215
+ const fileSet = new Set();
216
+ for (const root of roots) {
217
+ if (!fs.existsSync(root)) {
218
+ warnings.push(`Metadata root does not exist: ${root}`);
219
+ continue;
220
+ }
221
+ const found = [];
222
+ walkForMetadataFiles(root, maxDepth, found, warnings);
223
+ for (const file of found) {
224
+ fileSet.add(path.resolve(file));
225
+ }
226
+ }
227
+ const files = [...fileSet].sort();
228
+ // Try cache first — avoids re-reading and parsing all JSON files.
229
+ const fingerprint = buildFingerprint(files);
230
+ const cachePath = getCachePath(roots);
231
+ const cached = tryReadCache(cachePath, fingerprint);
232
+ if (cached) {
233
+ // Merge any walk warnings into the cached result
234
+ if (warnings.length > 0) {
235
+ cached.warnings = [...warnings, ...cached.warnings];
236
+ }
237
+ return cached;
238
+ }
239
+ const result = parseMetadataFiles(files);
240
+ if (warnings.length > 0) {
241
+ result.warnings = [...warnings, ...result.warnings];
242
+ }
243
+ // Persist cache for next startup
244
+ writeCache(cachePath, fingerprint, result);
245
+ return result;
246
+ }
247
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Node metadata introspection.
3
+ *
4
+ * TS classes are authoritative when no Python metadata is loaded. When Python
5
+ * metadata is available for a node, registry-emitted metadata should match the
6
+ * Python package JSON exactly so downstream consumers see a stable shape.
7
+ */
8
+ import type { NodeClass } from "./base-node.js";
9
+ import type { NodeMetadata } from "./metadata.js";
10
+ export interface GetNodeMetadataOptions {
11
+ pythonMetadata?: NodeMetadata;
12
+ mergePythonBackfill?: boolean;
13
+ }
14
+ export declare function getNodeMetadata(nodeClass: NodeClass, options?: GetNodeMetadataOptions): NodeMetadata;
15
+ export declare function getNodeMetadataBatch(nodeClasses: NodeClass[], options?: GetNodeMetadataOptions): NodeMetadata[];
16
+ //# sourceMappingURL=node-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-metadata.d.ts","sourceRoot":"","sources":["../src/node-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAmPD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,sBAA2B,GACnC,YAAY,CA0Cd;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,SAAS,EAAE,EACxB,OAAO,GAAE,sBAA2B,GACnC,YAAY,EAAE,CAEhB"}