@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,62 @@
1
+ import type { NodeMetadata, TypeMetadata } from "./metadata.js";
2
+ export interface WorkflowInterfaceGraphNode {
3
+ id?: unknown;
4
+ type?: unknown;
5
+ data?: unknown;
6
+ properties?: unknown;
7
+ dynamic_properties?: unknown;
8
+ dynamic_outputs?: unknown;
9
+ }
10
+ export interface WorkflowInterfaceGraphEdge {
11
+ source?: unknown;
12
+ sourceHandle?: unknown;
13
+ source_handle?: unknown;
14
+ target?: unknown;
15
+ targetHandle?: unknown;
16
+ target_handle?: unknown;
17
+ }
18
+ export interface WorkflowInterfaceGraph {
19
+ nodes?: WorkflowInterfaceGraphNode[];
20
+ edges?: WorkflowInterfaceGraphEdge[];
21
+ }
22
+ export interface WorkflowInterfaceRegistry {
23
+ resolveMetadata(nodeType: string): NodeMetadata | undefined;
24
+ }
25
+ export interface WorkflowInterfaceDiagnostic {
26
+ severity: "warning" | "error";
27
+ code: string;
28
+ message: string;
29
+ node_id?: string;
30
+ pin_name?: string;
31
+ }
32
+ export interface WorkflowInterfacePin {
33
+ node_id: string;
34
+ name: string;
35
+ description: string;
36
+ type: TypeMetadata;
37
+ }
38
+ export interface WorkflowInterfaceInput extends WorkflowInterfacePin {
39
+ required: boolean;
40
+ default: unknown;
41
+ min?: number;
42
+ max?: number;
43
+ }
44
+ export interface WorkflowInterfaceOutput extends WorkflowInterfacePin {
45
+ stream: boolean;
46
+ }
47
+ export interface WorkflowInterfaceV1 {
48
+ version: 1;
49
+ workflow_id: string;
50
+ etag: string | null;
51
+ source: "server";
52
+ inputs: WorkflowInterfaceInput[];
53
+ outputs: WorkflowInterfaceOutput[];
54
+ diagnostics: WorkflowInterfaceDiagnostic[];
55
+ }
56
+ export declare function deriveWorkflowInterfaceV1(args: {
57
+ workflowId: string;
58
+ etag?: string | null;
59
+ graph: WorkflowInterfaceGraph;
60
+ registry: WorkflowInterfaceRegistry;
61
+ }): WorkflowInterfaceV1;
62
+ //# sourceMappingURL=workflow-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-interface.d.ts","sourceRoot":"","sources":["../src/workflow-interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAUhE,MAAM,WAAW,0BAA0B;IACzC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;CAC7D;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB;IACnE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,WAAW,EAAE,2BAA2B,EAAE,CAAC;CAC5C;AA+YD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,sBAAsB,CAAC;IAC9B,QAAQ,EAAE,yBAAyB,CAAC;CACrC,GAAG,mBAAmB,CA2BtB"}
@@ -0,0 +1,351 @@
1
+ import { isBoolean, isFiniteNumber, isNumber, isObjectLike, isRecord, isString } from "./type-predicates.js";
2
+ const MAX_DEFAULT_JSON_BYTES = 16 * 1024;
3
+ const INPUT_PREFIX = "nodetool.input.";
4
+ const OUTPUT_TYPE = "nodetool.output.Output";
5
+ const DEDICATED_OUTPUT_TYPES = {
6
+ "nodetool.output.ImageOutput": "image",
7
+ "nodetool.output.AudioOutput": "audio",
8
+ "nodetool.output.VideoOutput": "video"
9
+ };
10
+ function record(value) {
11
+ return isRecord(value) ? value : null;
12
+ }
13
+ function nodeProperties(node) {
14
+ return {
15
+ ...(record(node.properties) ?? record(node.data) ?? {}),
16
+ ...(record(node.dynamic_properties) ?? {})
17
+ };
18
+ }
19
+ function cloneType(type) {
20
+ const cloned = {
21
+ type: type.type,
22
+ optional: type.optional ?? false,
23
+ type_args: (type.type_args ?? []).map(cloneType),
24
+ type_name: type.type_name ?? null
25
+ };
26
+ if (type.values !== undefined) {
27
+ cloned.values = [...type.values];
28
+ }
29
+ return cloned;
30
+ }
31
+ function anyType() {
32
+ return { type: "any", optional: false, type_args: [], type_name: null };
33
+ }
34
+ function dedicatedOutputType(nodeType) {
35
+ const type = DEDICATED_OUTPUT_TYPES[nodeType];
36
+ return type
37
+ ? { type, optional: false, type_args: [], type_name: null }
38
+ : null;
39
+ }
40
+ function pinText(value) {
41
+ return isString(value) ? value.trim() : "";
42
+ }
43
+ function obviouslyExceedsDefaultBudget(value) {
44
+ let minimumBytes = 0;
45
+ const pending = [value];
46
+ const seen = new WeakSet();
47
+ while (pending.length > 0) {
48
+ const current = pending.pop();
49
+ if (current == null) {
50
+ minimumBytes += 4;
51
+ }
52
+ else if (isString(current)) {
53
+ // UTF-8 JSON needs at least one byte per UTF-16 code unit, plus quotes.
54
+ minimumBytes += current.length + 2;
55
+ }
56
+ else if (isNumber(current) || isBoolean(current)) {
57
+ minimumBytes += 1;
58
+ }
59
+ else if (isObjectLike(current)) {
60
+ if (ArrayBuffer.isView(current)) {
61
+ if (current.byteLength > MAX_DEFAULT_JSON_BYTES)
62
+ return true;
63
+ }
64
+ if (seen.has(current))
65
+ continue;
66
+ seen.add(current);
67
+ const entries = Object.entries(current);
68
+ minimumBytes += entries.length * 2;
69
+ for (const [key, child] of entries) {
70
+ minimumBytes += key.length + 3;
71
+ pending.push(child);
72
+ }
73
+ }
74
+ if (minimumBytes > MAX_DEFAULT_JSON_BYTES)
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ function safeDefault(value, nodeId, pinName, diagnostics) {
80
+ if (value === undefined)
81
+ return null;
82
+ if (obviouslyExceedsDefaultBudget(value)) {
83
+ diagnostics.push({
84
+ severity: "warning",
85
+ code: "default_too_large",
86
+ message: `Default value for input '${pinName}' exceeds ${MAX_DEFAULT_JSON_BYTES} bytes and was omitted from discovery.`,
87
+ node_id: nodeId,
88
+ pin_name: pinName
89
+ });
90
+ return null;
91
+ }
92
+ let json;
93
+ try {
94
+ json = JSON.stringify(value);
95
+ }
96
+ catch {
97
+ diagnostics.push({
98
+ severity: "warning",
99
+ code: "default_not_serializable",
100
+ message: `Default value for input '${pinName}' is not serializable and was omitted.`,
101
+ node_id: nodeId,
102
+ pin_name: pinName
103
+ });
104
+ return null;
105
+ }
106
+ if (json === undefined) {
107
+ diagnostics.push({
108
+ severity: "warning",
109
+ code: "default_not_serializable",
110
+ message: `Default value for input '${pinName}' is not JSON serializable and was omitted.`,
111
+ node_id: nodeId,
112
+ pin_name: pinName
113
+ });
114
+ return null;
115
+ }
116
+ if (new TextEncoder().encode(json).byteLength > MAX_DEFAULT_JSON_BYTES) {
117
+ diagnostics.push({
118
+ severity: "warning",
119
+ code: "default_too_large",
120
+ message: `Default value for input '${pinName}' exceeds ${MAX_DEFAULT_JSON_BYTES} bytes and was omitted from discovery.`,
121
+ node_id: nodeId,
122
+ pin_name: pinName
123
+ });
124
+ return null;
125
+ }
126
+ const normalized = JSON.parse(json);
127
+ return normalized;
128
+ }
129
+ function outputTypeForNode(node, handle, registry) {
130
+ const dynamic = record(node.dynamic_outputs);
131
+ const dynamicType = record(dynamic?.[handle]);
132
+ if (dynamicType && isString(dynamicType.type)) {
133
+ return {
134
+ type: cloneType({
135
+ ...dynamicType,
136
+ type: dynamicType.type,
137
+ // A slot saved before typed `type_args` existed has none; `cloneType`
138
+ // reads it as an array either way.
139
+ type_args: Array.isArray(dynamicType.type_args)
140
+ ? dynamicType.type_args
141
+ : []
142
+ }),
143
+ stream: false
144
+ };
145
+ }
146
+ const nodeType = isString(node.type) ? node.type : "";
147
+ const metadata = registry.resolveMetadata(nodeType);
148
+ const slot = metadata?.outputs.find((output) => output.name === handle);
149
+ return slot
150
+ ? { type: cloneType(slot.type), stream: slot.stream ?? false }
151
+ : null;
152
+ }
153
+ /**
154
+ * The type behind a generic `Output` node: what its single incoming `value`
155
+ * edge carries. Every failure path pushes a diagnostic before returning null.
156
+ */
157
+ function resolveOutputSourceType(edge, nodesById, registry, outputNodeId, outputName, diagnostics) {
158
+ const source = isString(edge.source)
159
+ ? nodesById.get(edge.source)
160
+ : undefined;
161
+ if (!source) {
162
+ diagnostics.push({
163
+ severity: "error",
164
+ code: "missing_source_node",
165
+ message: `Workflow output '${outputName}' references a source node that is not present in the graph.`,
166
+ node_id: outputNodeId,
167
+ pin_name: outputName
168
+ });
169
+ return null;
170
+ }
171
+ const handle = String(edge.sourceHandle ?? edge.source_handle ?? "");
172
+ if (!handle) {
173
+ diagnostics.push({
174
+ severity: "error",
175
+ code: "missing_source_handle",
176
+ message: `Workflow output '${outputName}' has an incoming edge without a source handle.`,
177
+ node_id: outputNodeId,
178
+ pin_name: outputName
179
+ });
180
+ return null;
181
+ }
182
+ const resolved = outputTypeForNode(source, handle, registry);
183
+ if (resolved)
184
+ return resolved;
185
+ const sourceType = isString(source.type) ? source.type : "";
186
+ const hasDynamicHandle = record(record(source.dynamic_outputs)?.[handle]) !== null;
187
+ const sourceMetadata = registry.resolveMetadata(sourceType);
188
+ const packUnavailable = !hasDynamicHandle && !sourceMetadata;
189
+ diagnostics.push({
190
+ severity: "error",
191
+ code: packUnavailable ? "missing_node_metadata" : "missing_output_handle",
192
+ message: packUnavailable
193
+ ? `Node metadata for workflow output source '${sourceType}' is unavailable. The node pack may be disabled or not loaded.`
194
+ : `Source handle '${handle}' is not declared by node '${sourceType}'.`,
195
+ node_id: isString(source.id) ? source.id : outputNodeId,
196
+ pin_name: handle
197
+ });
198
+ return null;
199
+ }
200
+ function collectInputs(nodes, registry, diagnostics) {
201
+ const inputs = [];
202
+ const seenNames = new Set();
203
+ for (const node of nodes) {
204
+ const nodeId = isString(node.id) ? node.id : "";
205
+ const nodeType = isString(node.type) ? node.type : "";
206
+ if (!nodeType.startsWith(INPUT_PREFIX))
207
+ continue;
208
+ const props = nodeProperties(node);
209
+ const name = pinText(props.name) || nodeId;
210
+ if (!nodeId || !name) {
211
+ diagnostics.push({
212
+ severity: "error",
213
+ code: "invalid_input_identity",
214
+ message: "Workflow input is missing a stable node id or public name.",
215
+ node_id: nodeId || undefined
216
+ });
217
+ continue;
218
+ }
219
+ if (seenNames.has(name)) {
220
+ diagnostics.push({
221
+ severity: "error",
222
+ code: "duplicate_input_name",
223
+ message: `Workflow input name '${name}' is duplicated.`,
224
+ node_id: nodeId,
225
+ pin_name: name
226
+ });
227
+ continue;
228
+ }
229
+ seenNames.add(name);
230
+ const resolved = outputTypeForNode(node, "output", registry);
231
+ if (!resolved) {
232
+ diagnostics.push({
233
+ severity: "error",
234
+ code: "unresolved_input_type",
235
+ message: `Cannot resolve the output type for workflow input '${name}' (${nodeType}).`,
236
+ node_id: nodeId,
237
+ pin_name: name
238
+ });
239
+ }
240
+ const type = resolved?.type ?? anyType();
241
+ if (nodeType === "nodetool.input.SelectInput") {
242
+ const options = Array.isArray(props.options)
243
+ ? props.options.filter((value) => typeof value === "string" || typeof value === "number")
244
+ : [];
245
+ if (options.length > 0)
246
+ type.values = options;
247
+ const enumName = pinText(props.enum_type_name);
248
+ if (enumName)
249
+ type.type_name = enumName;
250
+ }
251
+ const input = {
252
+ node_id: nodeId,
253
+ name,
254
+ description: pinText(props.description),
255
+ required: !type.optional,
256
+ default: safeDefault(props.value, nodeId, name, diagnostics),
257
+ type
258
+ };
259
+ if (isFiniteNumber(props.min))
260
+ input.min = props.min;
261
+ if (isFiniteNumber(props.max))
262
+ input.max = props.max;
263
+ inputs.push(input);
264
+ }
265
+ return inputs;
266
+ }
267
+ function collectOutputs(nodes, edges, nodesById, registry, diagnostics) {
268
+ const outputs = [];
269
+ const seenNames = new Set();
270
+ for (const node of nodes) {
271
+ const nodeId = isString(node.id) ? node.id : "";
272
+ const nodeType = isString(node.type) ? node.type : "";
273
+ const dedicatedType = dedicatedOutputType(nodeType);
274
+ if (nodeType !== OUTPUT_TYPE && !dedicatedType)
275
+ continue;
276
+ const props = nodeProperties(node);
277
+ const name = pinText(props.name) || nodeId;
278
+ if (!nodeId || !name) {
279
+ diagnostics.push({
280
+ severity: "error",
281
+ code: "invalid_output_identity",
282
+ message: "Workflow output is missing a stable node id or public name.",
283
+ node_id: nodeId || undefined
284
+ });
285
+ continue;
286
+ }
287
+ if (seenNames.has(name)) {
288
+ diagnostics.push({
289
+ severity: "error",
290
+ code: "duplicate_output_name",
291
+ message: `Workflow output name '${name}' is duplicated.`,
292
+ node_id: nodeId,
293
+ pin_name: name
294
+ });
295
+ continue;
296
+ }
297
+ seenNames.add(name);
298
+ // A dedicated media output carries its own type, so its edges are never
299
+ // inspected — and a bad one is never reported.
300
+ const incoming = dedicatedType
301
+ ? []
302
+ : edges.filter((edge) => edge.target === nodeId &&
303
+ String(edge.targetHandle ?? edge.target_handle ?? "") === "value");
304
+ const resolved = dedicatedType
305
+ ? { type: dedicatedType, stream: false }
306
+ : incoming.length === 1
307
+ ? resolveOutputSourceType(incoming[0], nodesById, registry, nodeId, name, diagnostics)
308
+ : null;
309
+ if (!resolved) {
310
+ diagnostics.push({
311
+ severity: "error",
312
+ code: incoming.length > 1
313
+ ? "ambiguous_output_source"
314
+ : "unresolved_output_type",
315
+ message: `Cannot resolve a unique source type for workflow output '${name}'.`,
316
+ node_id: nodeId,
317
+ pin_name: name
318
+ });
319
+ }
320
+ outputs.push({
321
+ node_id: nodeId,
322
+ name,
323
+ description: pinText(props.description),
324
+ type: resolved?.type ?? anyType(),
325
+ stream: resolved?.stream ?? false
326
+ });
327
+ }
328
+ return outputs;
329
+ }
330
+ export function deriveWorkflowInterfaceV1(args) {
331
+ const diagnostics = [];
332
+ const nodes = Array.isArray(args.graph.nodes) ? args.graph.nodes : [];
333
+ const edges = Array.isArray(args.graph.edges) ? args.graph.edges : [];
334
+ const nodesById = new Map();
335
+ for (const node of nodes) {
336
+ if (isString(node.id))
337
+ nodesById.set(node.id, node);
338
+ }
339
+ const inputs = collectInputs(nodes, args.registry, diagnostics);
340
+ const outputs = collectOutputs(nodes, edges, nodesById, args.registry, diagnostics);
341
+ return {
342
+ version: 1,
343
+ workflow_id: args.workflowId,
344
+ etag: args.etag ?? null,
345
+ source: "server",
346
+ inputs,
347
+ outputs,
348
+ diagnostics
349
+ };
350
+ }
351
+ //# sourceMappingURL=workflow-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-interface.js","sourceRoot":"","sources":["../src/workflow-interface.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,32 +1,77 @@
1
1
  {
2
2
  "name": "@nodetool-ai/node-sdk",
3
3
  "type": "module",
4
- "version": "0.7.0-rc.23",
4
+ "engines": {
5
+ "node": ">=22.0.0"
6
+ },
7
+ "version": "0.8.2",
5
8
  "description": "Node SDK: BaseNode, NodeRegistry, and example nodes",
6
9
  "main": "dist/index.js",
7
10
  "types": "dist/index.d.ts",
8
11
  "scripts": {
9
12
  "build": "node ../../scripts/build-typescript-workspace.mjs",
10
- "test": "vitest run",
11
- "test:metadata": "vitest run tests/metadata.test.ts",
12
- "test:watch": "vitest",
13
- "lint": "tsc --noEmit"
13
+ "test": "node ../../scripts/run-vitest.mjs run",
14
+ "test:metadata": "node ../../scripts/run-vitest.mjs run tests/metadata.test.ts",
15
+ "test:mutation": "stryker run",
16
+ "test:mutation:crash": "stryker run stryker.crash.config.json",
17
+ "test:crash-fuzz": "node ../../scripts/run-vitest.mjs run --config vitest.crash.config.ts",
18
+ "test:watch": "node ../../scripts/run-vitest.mjs",
19
+ "lint": "node ../../scripts/run-tsc.mjs --noEmit"
14
20
  },
15
21
  "dependencies": {
16
- "@nodetool-ai/kernel": "^0.7.0-rc.23",
17
- "@nodetool-ai/protocol": "^0.7.0-rc.23",
18
- "@nodetool-ai/runtime": "^0.7.0-rc.23"
22
+ "@nodetool-ai/config": "^0.8.2",
23
+ "@nodetool-ai/kernel": "^0.8.2",
24
+ "@nodetool-ai/protocol": "^0.8.2",
25
+ "@nodetool-ai/runtime": "^0.8.2",
26
+ "acorn": "^8.16.0",
27
+ "zod": "^4.0.0"
19
28
  },
20
29
  "devDependencies": {
30
+ "@stryker-mutator/core": "^9.6.1",
31
+ "@stryker-mutator/vitest-runner": "^9.6.1",
21
32
  "@types/node": "^22.0.0",
22
- "typescript": "^5.7.2",
23
- "vitest": "^4.1.2"
33
+ "typescript": "npm:@typescript/typescript6@6.0.2",
34
+ "vitest": "^5.0.1"
24
35
  },
25
36
  "exports": {
26
37
  ".": {
27
38
  "types": "./dist/index.d.ts",
28
39
  "import": "./dist/index.js",
29
40
  "default": "./dist/index.js"
41
+ },
42
+ "./code-analysis": {
43
+ "nodetool-dev": "./src/code-analysis.ts",
44
+ "types": "./dist/code-analysis.d.ts",
45
+ "import": "./dist/code-analysis.js",
46
+ "default": "./dist/code-analysis.js"
47
+ },
48
+ "./code-body": {
49
+ "nodetool-dev": "./src/code-body.ts",
50
+ "types": "./dist/code-body.d.ts",
51
+ "import": "./dist/code-body.js",
52
+ "default": "./dist/code-body.js"
53
+ },
54
+ "./js-script-materialize": {
55
+ "nodetool-dev": "./src/js-script-materialize.ts",
56
+ "types": "./dist/js-script-materialize.d.ts",
57
+ "import": "./dist/js-script-materialize.js",
58
+ "default": "./dist/js-script-materialize.js"
59
+ },
60
+ "./cost-estimate": {
61
+ "types": "./dist/cost-estimate.d.ts",
62
+ "import": "./dist/cost-estimate.js",
63
+ "default": "./dist/cost-estimate.js"
64
+ },
65
+ "./pricing-params": {
66
+ "types": "./dist/pricing-params.d.ts",
67
+ "import": "./dist/pricing-params.js",
68
+ "default": "./dist/pricing-params.js"
69
+ },
70
+ "./sandbox-pack-discovery": {
71
+ "nodetool-dev": "./src/sandbox-pack-discovery.ts",
72
+ "types": "./dist/sandbox-pack-discovery.d.ts",
73
+ "import": "./dist/sandbox-pack-discovery.js",
74
+ "default": "./dist/sandbox-pack-discovery.js"
30
75
  }
31
76
  },
32
77
  "license": "MIT",
@@ -45,5 +90,17 @@
45
90
  "files": [
46
91
  "dist",
47
92
  "README.md"
93
+ ],
94
+ "keywords": [
95
+ "nodetool",
96
+ "ai",
97
+ "workflow",
98
+ "workflow-automation",
99
+ "typescript",
100
+ "sdk",
101
+ "node-sdk",
102
+ "basenode",
103
+ "node-registry",
104
+ "type-system"
48
105
  ]
49
106
  }
@@ -1,12 +0,0 @@
1
- export interface AvailablePackage {
2
- name: string;
3
- repo_id: string;
4
- description?: string;
5
- }
6
- export declare const PACKAGE_REGISTRY_URL: string;
7
- /**
8
- * Fetch the package index. Returns [] on network or parse failure
9
- * (logged to stderr). Never throws.
10
- */
11
- export declare function fetchAvailablePackages(): Promise<AvailablePackage[]>;
12
- //# sourceMappingURL=package-registry-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-registry-client.d.ts","sourceRoot":"","sources":["../src/package-registry-client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,oBAAoB,QAEkD,CAAC;AAapF;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB1E"}
@@ -1,40 +0,0 @@
1
- export const PACKAGE_REGISTRY_URL = process.env["NODETOOL_PACKAGE_REGISTRY_URL"] ??
2
- "https://raw.githubusercontent.com/nodetool-ai/nodetool-registry/main/index.json";
3
- function isAvailablePackage(value) {
4
- if (!value || typeof value !== "object" || Array.isArray(value))
5
- return false;
6
- const record = value;
7
- return (typeof record["name"] === "string" &&
8
- typeof record["repo_id"] === "string" &&
9
- (record["description"] === undefined ||
10
- typeof record["description"] === "string"));
11
- }
12
- /**
13
- * Fetch the package index. Returns [] on network or parse failure
14
- * (logged to stderr). Never throws.
15
- */
16
- export async function fetchAvailablePackages() {
17
- try {
18
- const res = await fetch(PACKAGE_REGISTRY_URL);
19
- if (!res.ok) {
20
- console.error(`Failed to fetch package registry: HTTP ${res.status} ${res.statusText}`);
21
- return [];
22
- }
23
- const parsed = await res.json();
24
- const list = Array.isArray(parsed)
25
- ? parsed
26
- : parsed && typeof parsed === "object" && Array.isArray(parsed["packages"])
27
- ? parsed["packages"]
28
- : null;
29
- if (!list) {
30
- console.error("Package registry response has no packages array");
31
- return [];
32
- }
33
- return list.filter(isAvailablePackage);
34
- }
35
- catch (error) {
36
- console.error(`Failed to fetch package registry: ${String(error)}`);
37
- return [];
38
- }
39
- }
40
- //# sourceMappingURL=package-registry-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-registry-client.js","sourceRoot":"","sources":["../src/package-registry-client.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,oBAAoB,GAC/B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;IAC5C,iFAAiF,CAAC;AAEpF,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,CACL,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ;QAClC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ;QACrC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,SAAS;YAClC,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CACX,0CAA0C,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CACzE,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GAAY,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,MAAkC,CAAC,UAAU,CAAC,CAAC;gBACtG,CAAC,CAAG,MAAkC,CAAC,UAAU,CAAe;gBAChE,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACjE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}