@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
@@ -1,3 +1,5 @@
1
+ import { slotTypeToString, valueIncompatibleWithType } from "./type-compat.js";
2
+ import { isNonEmptyString, isObjectLike, isString } from "./type-predicates.js";
1
3
  const MODEL_TYPE_SUFFIX = "_model";
2
4
  const EMPTY_PROVIDER = "empty";
3
5
  const ASSET_TYPES = new Set([
@@ -13,11 +15,13 @@ const ASSET_TYPES = new Set([
13
15
  "font"
14
16
  ]);
15
17
  function isModelType(typeStr) {
18
+ // Stryker disable next-line ConditionalExpression: declared metadata always carries a string type, so the undefined-guard is unreachable; for "" the fallthrough "".endsWith(...) === false matches the guard (equivalent).
16
19
  if (!typeStr)
17
20
  return false;
18
21
  return typeStr.endsWith(MODEL_TYPE_SUFFIX);
19
22
  }
20
23
  function isAssetType(typeStr) {
24
+ // Stryker disable next-line ConditionalExpression: see isModelType — the undefined-guard is unreachable and ASSET_TYPES.has("") === false matches the guard (equivalent).
21
25
  if (!typeStr)
22
26
  return false;
23
27
  return ASSET_TYPES.has(typeStr);
@@ -25,26 +29,30 @@ function isAssetType(typeStr) {
25
29
  function isUnsetAsset(value) {
26
30
  if (value === null || value === undefined)
27
31
  return true;
28
- if (typeof value !== "object")
32
+ if (!isObjectLike(value))
29
33
  return false;
30
34
  const v = value;
31
35
  const uri = v.uri;
32
36
  const assetId = v.asset_id;
33
37
  const tempId = v.temp_id;
34
38
  const data = v.data;
35
- const hasUri = typeof uri === "string" && uri.length > 0;
36
- const hasAssetId = typeof assetId === "string" && assetId.length > 0;
37
- const hasTempId = typeof tempId === "string" && tempId.length > 0;
38
- const hasData = data != null &&
39
- !(typeof data === "string" && data.length === 0) &&
39
+ const hasUri = isNonEmptyString(uri);
40
+ const hasAssetId = isNonEmptyString(assetId);
41
+ const hasTempId = isNonEmptyString(tempId);
42
+ const hasData = data !== null &&
43
+ data !== undefined &&
44
+ // Stryker disable next-line ConditionalExpression: forcing `typeof data === "string"` true is equivalent — for the only non-string with length 0 (an empty array) the next clause already drives hasData false.
45
+ !(isString(data) && data.length === 0) &&
40
46
  !(Array.isArray(data) && data.length === 0);
41
47
  return !hasUri && !hasAssetId && !hasTempId && !hasData;
42
48
  }
43
49
  function isEmptyValue(value) {
44
50
  if (value === null || value === undefined)
45
51
  return true;
46
- if (typeof value === "string")
52
+ // Stryker disable next-line ConditionalExpression: forcing this branch is equivalent — `.length === 0` also holds for arrays (matching the next line) and is false (undefined === 0) for numbers/objects (matching the fallback).
53
+ if (isString(value))
47
54
  return value.length === 0;
55
+ // Stryker disable next-line ConditionalExpression: forcing this branch true is equivalent — value.length === 0 matches the array check for arrays and is false (undefined === 0) for numbers/objects (matching the fallback).
48
56
  if (Array.isArray(value))
49
57
  return value.length === 0;
50
58
  return false;
@@ -52,7 +60,7 @@ function isEmptyValue(value) {
52
60
  function isUnsetModel(value) {
53
61
  if (value === null || value === undefined)
54
62
  return true;
55
- if (typeof value !== "object")
63
+ if (!isObjectLike(value))
56
64
  return false;
57
65
  const v = value;
58
66
  const provider = v.provider;
@@ -61,17 +69,20 @@ function isUnsetModel(value) {
61
69
  // is exactly the unselected default we want to flag.
62
70
  if (provider == null)
63
71
  return true;
64
- if (typeof provider === "string" && provider === EMPTY_PROVIDER)
72
+ // Stryker disable next-line ConditionalExpression: forcing `typeof provider === "string"` true is equivalent — a non-string provider can never === the "empty" string sentinel, so the second operand decides the result either way.
73
+ if (isString(provider) && provider === EMPTY_PROVIDER)
65
74
  return true;
66
75
  if (id == null)
67
76
  return true;
68
- if (typeof id === "string" && id.length === 0)
77
+ if (isString(id) && id.length === 0)
69
78
  return true;
70
79
  return false;
71
80
  }
72
81
  function toSet(handles) {
82
+ // Stryker disable next-line ConditionalExpression: every branch reduces to `new Set(handles)` — new Set(undefined) is empty and new Set(existingSet) is a membership-equivalent copy (equivalent mutants).
73
83
  if (!handles)
74
84
  return new Set();
85
+ // Stryker disable next-line ConditionalExpression: the instanceof fast-path only avoids copying a Set; the fallthrough new Set(set) is equivalent.
75
86
  if (handles instanceof Set)
76
87
  return handles;
77
88
  return new Set(handles);
@@ -100,6 +111,7 @@ export function validateNodeProperties(declared, properties, options = {}) {
100
111
  nodeId: options.nodeId,
101
112
  nodeType: options.nodeType,
102
113
  property: name,
114
+ code: "required",
103
115
  message: isAsset
104
116
  ? `Property "${name}" requires a ${typeStr} (asset, uri, or inline data)`
105
117
  : `Required property "${name}" is not set`
@@ -112,7 +124,54 @@ export function validateNodeProperties(declared, properties, options = {}) {
112
124
  nodeId: options.nodeId,
113
125
  nodeType: options.nodeType,
114
126
  property: name,
115
- message: `Property "${name}" requires a ${typeStr} to be selected (provider and model id)`
127
+ code: "unset_model",
128
+ message: `Property "${name}" requires a ${typeStr} to be selected — assign ` +
129
+ `{type: "${typeStr}", provider, id, name} (the field is \`id\`, ` +
130
+ `not \`model_id\`). \`find_model\` answers this shape on its ` +
131
+ `top-level \`ref\` — assign that verbatim.`
132
+ });
133
+ }
134
+ }
135
+ issues.push(...validateDynamicSlots(options, connected));
136
+ return issues;
137
+ }
138
+ /**
139
+ * Validate inline values against typed dynamic slot declarations.
140
+ *
141
+ * Two checks, both skipped for slots fed by an incoming edge:
142
+ * 1. `required: true` with no value → `required`.
143
+ * 2. A value that clearly cannot be the declared type → `dynamic_type_mismatch`.
144
+ *
145
+ * Slots without a declaration are untyped legacy slots and never validated.
146
+ */
147
+ function validateDynamicSlots(options, connected) {
148
+ const slots = options.dynamicSlots;
149
+ if (!slots)
150
+ return [];
151
+ const values = options.dynamicValues ?? {};
152
+ const issues = [];
153
+ for (const [name, slot] of Object.entries(slots)) {
154
+ if (connected.has(name))
155
+ continue;
156
+ const value = values[name];
157
+ const typeStr = slotTypeToString(slot);
158
+ if (slot.required && isEmptyValue(value)) {
159
+ issues.push({
160
+ nodeId: options.nodeId,
161
+ nodeType: options.nodeType,
162
+ property: name,
163
+ code: "required",
164
+ message: `Required dynamic input "${name}" is not set`
165
+ });
166
+ continue;
167
+ }
168
+ if (valueIncompatibleWithType(value, typeStr)) {
169
+ issues.push({
170
+ nodeId: options.nodeId,
171
+ nodeType: options.nodeType,
172
+ property: name,
173
+ code: "dynamic_type_mismatch",
174
+ message: `Dynamic input "${name}" is declared as ${typeStr} but holds a ${typeof value}`
116
175
  });
117
176
  }
118
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Graph } from "@nodetool-ai/protocol/api-schemas/workflows.js";
2
+ export declare const WORKFLOW_DOCUMENT_TOOL_NAMES: readonly ["ui_get_graph", "ui_add_node", "ui_connect_nodes", "ui_update_node_data", "ui_delete_node", "ui_delete_edge", "ui_move_node", "ui_set_node_title"];
3
+ export type WorkflowDocumentToolName = (typeof WORKFLOW_DOCUMENT_TOOL_NAMES)[number];
4
+ type TypeMeta = {
5
+ type?: unknown;
6
+ type_args?: unknown;
7
+ args?: unknown;
8
+ };
9
+ interface WorkflowNodeMetadata {
10
+ properties: Array<{
11
+ name: string;
12
+ type: TypeMeta;
13
+ default?: unknown;
14
+ required?: boolean;
15
+ }>;
16
+ outputs: Array<{
17
+ name: string;
18
+ type: TypeMeta;
19
+ }>;
20
+ supports_dynamic_inputs?: boolean;
21
+ }
22
+ export interface WorkflowDocumentToolOptions {
23
+ workflowId: string;
24
+ resolveMetadata: (nodeType: string) => WorkflowNodeMetadata | undefined;
25
+ createEdgeId?: () => string;
26
+ }
27
+ export interface WorkflowDocumentToolResult {
28
+ graph: Graph;
29
+ result: Record<string, unknown>;
30
+ changed: boolean;
31
+ }
32
+ /** Apply one workflow document tool to the persisted graph representation. */
33
+ export declare function applyWorkflowDocumentTool(source: Graph, name: WorkflowDocumentToolName, args: Record<string, unknown>, options: WorkflowDocumentToolOptions): WorkflowDocumentToolResult;
34
+ export {};
35
+ //# sourceMappingURL=workflow-document-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-document-tools.d.ts","sourceRoot":"","sources":["../src/workflow-document-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gDAAgD,CAAC;AAkB5E,eAAO,MAAM,4BAA4B,8JAA+B,CAAC;AAEzE,MAAM,MAAM,wBAAwB,GAClC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,KAAK,QAAQ,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAExE,UAAU,oBAAoB;IAC5B,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,QAAQ,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;IACjD,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,oBAAoB,GAAG,SAAS,CAAC;IACxE,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB;AA0OD,8EAA8E;AAC9E,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EACb,IAAI,EAAE,wBAAwB,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,2BAA2B,GACnC,0BAA0B,CAkP5B"}
@@ -0,0 +1,402 @@
1
+ import { isDynamicSchemaNodeType, wouldCreateLoopUnsafeCycle, WORKFLOW_REVISION_TOOL_NAMES } from "@nodetool-ai/protocol";
2
+ import { inferredCodeInputNames, inferredCodeOutputNames } from "./code-analysis.js";
3
+ import { isJsCodeNodeType } from "./code-node-validation.js";
4
+ import { isNumber, isString } from "./type-predicates.js";
5
+ import { typeMetaToString, typesIncompatible, valueIncompatibleWithType } from "./type-compat.js";
6
+ export const WORKFLOW_DOCUMENT_TOOL_NAMES = WORKFLOW_REVISION_TOOL_NAMES;
7
+ const DYNAMIC_NODE_DATA_FIELDS = new Set([
8
+ "dynamic_properties",
9
+ "dynamic_inputs",
10
+ "dynamic_outputs"
11
+ ]);
12
+ const UI_NODE_DATA_FIELDS = new Set([
13
+ "title",
14
+ "color",
15
+ "collapsed",
16
+ "bypassed",
17
+ "model_id",
18
+ "endpoint_id",
19
+ "selected_generation",
20
+ "selected_generations"
21
+ ]);
22
+ function isRecord(value) {
23
+ return typeof value === "object" && value !== null && !Array.isArray(value);
24
+ }
25
+ function nodeData(node) {
26
+ return isRecord(node.data) ? node.data : {};
27
+ }
28
+ function nodeUi(node) {
29
+ return isRecord(node.ui_properties) ? node.ui_properties : {};
30
+ }
31
+ function findNode(graph, id) {
32
+ const node = graph.nodes.find((candidate) => candidate.id === id);
33
+ if (!node)
34
+ throw new Error(`Node not found: ${id}`);
35
+ return node;
36
+ }
37
+ function normalizePosition(value, fallbackIndex) {
38
+ if (isRecord(value) &&
39
+ isNumber(value.x) &&
40
+ isNumber(value.y)) {
41
+ return { x: value.x, y: value.y };
42
+ }
43
+ if (isString(value)) {
44
+ const trimmed = value.trim();
45
+ if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
46
+ try {
47
+ return normalizePosition(JSON.parse(trimmed), fallbackIndex);
48
+ }
49
+ catch {
50
+ // Fall through to the numeric-pair parser.
51
+ }
52
+ }
53
+ const pair = trimmed.match(/-?\d+(?:\.\d+)?/g);
54
+ if (pair && pair.length >= 2) {
55
+ const x = Number(pair[0]);
56
+ const y = Number(pair[1]);
57
+ if (Number.isFinite(x) && Number.isFinite(y))
58
+ return { x, y };
59
+ }
60
+ }
61
+ return {
62
+ x: 120 + (fallbackIndex % 6) * 240,
63
+ y: 120 + Math.floor(fallbackIndex / 6) * 160
64
+ };
65
+ }
66
+ function nodeCode(node) {
67
+ const data = nodeData(node);
68
+ const nested = isRecord(data.properties) ? data.properties.code : undefined;
69
+ const code = nested ?? data.code;
70
+ return isString(code) ? code : "";
71
+ }
72
+ const ANY_TYPE = { type: "any" };
73
+ function outputType(node, metadata, handle) {
74
+ const declared = metadata.outputs.find((output) => output.name === handle);
75
+ if (declared)
76
+ return declared.type;
77
+ const dynamic = isRecord(node.dynamic_outputs)
78
+ ? node.dynamic_outputs[handle]
79
+ : undefined;
80
+ if (isRecord(dynamic))
81
+ return dynamic;
82
+ if (isJsCodeNodeType(String(node.type ?? "")) &&
83
+ inferredCodeOutputNames(nodeCode(node)).includes(handle)) {
84
+ return ANY_TYPE;
85
+ }
86
+ return undefined;
87
+ }
88
+ function inputType(node, metadata, handle) {
89
+ const declared = metadata.properties.find((property) => property.name === handle);
90
+ if (declared)
91
+ return declared.type;
92
+ const dynamicInputs = isRecord(node.dynamic_inputs)
93
+ ? node.dynamic_inputs
94
+ : {};
95
+ const dynamicProperties = isRecord(node.dynamic_properties)
96
+ ? node.dynamic_properties
97
+ : {};
98
+ if (handle in dynamicInputs || handle in dynamicProperties) {
99
+ const dynamic = dynamicInputs[handle] ?? dynamicProperties[handle];
100
+ if (isRecord(dynamic) && isRecord(dynamic.type))
101
+ return dynamic.type;
102
+ if (isRecord(dynamic) && isString(dynamic.type))
103
+ return dynamic;
104
+ return ANY_TYPE;
105
+ }
106
+ if (isJsCodeNodeType(String(node.type ?? "")) &&
107
+ inferredCodeInputNames(nodeCode(node)).includes(handle)) {
108
+ return ANY_TYPE;
109
+ }
110
+ return undefined;
111
+ }
112
+ /**
113
+ * A node that accepts user-named inputs (Concat, Prompt, Images To List…) gets
114
+ * the missing slot declared by the connection, as a drop on the node body does
115
+ * in the editor. Code nodes infer their ports from the body, and schema-driven
116
+ * nodes take theirs from the provider schema, so neither gets one invented.
117
+ */
118
+ function canDeclareDynamicInput(node, metadata, handle) {
119
+ const type = String(node.type ?? "");
120
+ const dynamicOutputs = isRecord(node.dynamic_outputs)
121
+ ? node.dynamic_outputs
122
+ : {};
123
+ return (metadata.supports_dynamic_inputs === true &&
124
+ handle.trim() !== "" &&
125
+ !isJsCodeNodeType(type) &&
126
+ !isDynamicSchemaNodeType(type) &&
127
+ !(handle in dynamicOutputs));
128
+ }
129
+ /**
130
+ * Declare dynamic input `handle`, typed after the output wired into it. An
131
+ * `any` source leaves the slot an untyped legacy slot.
132
+ */
133
+ function declareDynamicInput(node, handle, sourceType) {
134
+ const dynamicProperties = isRecord(node.dynamic_properties)
135
+ ? node.dynamic_properties
136
+ : {};
137
+ node.dynamic_properties = { ...dynamicProperties, [handle]: "" };
138
+ if (typeMetaToString(sourceType) === "any")
139
+ return;
140
+ const dynamicInputs = isRecord(node.dynamic_inputs)
141
+ ? node.dynamic_inputs
142
+ : {};
143
+ node.dynamic_inputs = { ...dynamicInputs, [handle]: { type: sourceType } };
144
+ }
145
+ /** Stamp inferred Code-node slots onto the node without replacing existing ones. */
146
+ function applyInferredCodeHandles(node) {
147
+ if (!isJsCodeNodeType(String(node.type ?? "")))
148
+ return;
149
+ const code = nodeCode(node);
150
+ const dynProps = isRecord(node.dynamic_properties)
151
+ ? { ...node.dynamic_properties }
152
+ : {};
153
+ const dynOuts = isRecord(node.dynamic_outputs)
154
+ ? { ...node.dynamic_outputs }
155
+ : {};
156
+ for (const name of inferredCodeInputNames(code)) {
157
+ if (!(name in dynProps))
158
+ dynProps[name] = "";
159
+ }
160
+ for (const name of inferredCodeOutputNames(code)) {
161
+ if (!(name in dynOuts))
162
+ dynOuts[name] = { type: "any" };
163
+ }
164
+ node.dynamic_properties = dynProps;
165
+ node.dynamic_outputs = dynOuts;
166
+ }
167
+ function projectGraph(graph, workflowId) {
168
+ return {
169
+ ok: true,
170
+ workflow_id: workflowId,
171
+ nodes: graph.nodes.map((node) => {
172
+ const ui = nodeUi(node);
173
+ const data = {
174
+ properties: nodeData(node),
175
+ dynamic_properties: node.dynamic_properties ?? {},
176
+ dynamic_inputs: node.dynamic_inputs ?? {},
177
+ dynamic_outputs: node.dynamic_outputs ?? {},
178
+ collapsed: ui.collapsed === true,
179
+ bypassed: ui.bypassed === true
180
+ };
181
+ for (const field of UI_NODE_DATA_FIELDS) {
182
+ if (ui[field] !== undefined) {
183
+ data[field] = ui[field];
184
+ }
185
+ }
186
+ if (ui.setup_step_id !== undefined) {
187
+ data.setupStepId = ui.setup_step_id;
188
+ }
189
+ const position = isRecord(ui.position) && isNumber(ui.position.x) && isNumber(ui.position.y)
190
+ ? { x: ui.position.x, y: ui.position.y } : { x: 0, y: 0 };
191
+ return {
192
+ id: node.id,
193
+ type: node.type,
194
+ parentId: node.parent_id || undefined,
195
+ position,
196
+ data
197
+ };
198
+ }),
199
+ edges: graph.edges.map((edge) => ({ ...edge }))
200
+ };
201
+ }
202
+ /** Apply one workflow document tool to the persisted graph representation. */
203
+ export function applyWorkflowDocumentTool(source, name, args, options) {
204
+ const graph = structuredClone(source);
205
+ if (name === "ui_get_graph") {
206
+ return {
207
+ graph,
208
+ result: projectGraph(graph, options.workflowId),
209
+ changed: false
210
+ };
211
+ }
212
+ if (name === "ui_add_node") {
213
+ const id = String(args.id);
214
+ const type = String(args.type);
215
+ if (graph.nodes.some((node) => node.id === id)) {
216
+ throw new Error(`A node with id "${id}" already exists.`);
217
+ }
218
+ const metadata = options.resolveMetadata(type);
219
+ if (!metadata) {
220
+ throw new Error(`Node type not found: ${type}. Use ui_search_nodes to find the correct type.`);
221
+ }
222
+ const provided = isRecord(args.properties) ? args.properties : {};
223
+ const properties = { ...provided };
224
+ const warnings = [];
225
+ for (const property of metadata.properties) {
226
+ if (!(property.name in properties)) {
227
+ properties[property.name] = property.default;
228
+ }
229
+ else if (valueIncompatibleWithType(properties[property.name], typeMetaToString(property.type))) {
230
+ throw new Error(`Value for property ${property.name} does not match type ${property.type.type}`);
231
+ }
232
+ const value = properties[property.name];
233
+ if (property.required &&
234
+ !(property.name in provided) &&
235
+ (value === null || value === undefined || value === "")) {
236
+ warnings.push(`Required property '${property.name}' is not set. Use ui_update_node_data to set it.`);
237
+ }
238
+ }
239
+ const added = {
240
+ id,
241
+ type,
242
+ data: properties,
243
+ ui_properties: {
244
+ position: normalizePosition(args.position, graph.nodes.length),
245
+ zIndex: 0,
246
+ width: 200,
247
+ selectable: true
248
+ },
249
+ dynamic_properties: {},
250
+ dynamic_outputs: {}
251
+ };
252
+ applyInferredCodeHandles(added);
253
+ graph.nodes.push(added);
254
+ const result = {
255
+ ok: true,
256
+ node_id: id
257
+ };
258
+ if (warnings.length) {
259
+ result.warnings = warnings;
260
+ }
261
+ return { graph, result, changed: true };
262
+ }
263
+ if (name === "ui_connect_nodes") {
264
+ const sourceId = String(args.source_node_id);
265
+ const targetId = String(args.target_node_id);
266
+ const sourceHandle = String(args.source_handle);
267
+ const targetHandle = String(args.target_handle);
268
+ const sourceNode = findNode(graph, sourceId);
269
+ const targetNode = findNode(graph, targetId);
270
+ const sourceMetadata = options.resolveMetadata(sourceNode.type);
271
+ const targetMetadata = options.resolveMetadata(targetNode.type);
272
+ if (!sourceMetadata) {
273
+ throw new Error(`Source node has no metadata: ${sourceNode.type}`);
274
+ }
275
+ if (!targetMetadata) {
276
+ throw new Error(`Target node has no metadata: ${targetNode.type}`);
277
+ }
278
+ const sourceType = outputType(sourceNode, sourceMetadata, sourceHandle);
279
+ const declaredTargetType = inputType(targetNode, targetMetadata, targetHandle);
280
+ const declaresInput = !declaredTargetType &&
281
+ canDeclareDynamicInput(targetNode, targetMetadata, targetHandle);
282
+ const targetType = declaredTargetType ?? (declaresInput ? ANY_TYPE : undefined);
283
+ if (!sourceType) {
284
+ const available = sourceMetadata.outputs.map((slot) => slot.name);
285
+ throw new Error(`Source handle '${sourceHandle}' not found on ${sourceNode.type}. Available outputs: [${available.join(", ") || "none"}]`);
286
+ }
287
+ if (!targetType) {
288
+ const available = targetMetadata.properties.map((property) => property.name);
289
+ throw new Error(`Target handle '${targetHandle}' not found on ${targetNode.type}. Available inputs: [${available.join(", ") || "none"}]`);
290
+ }
291
+ const duplicate = graph.edges.find((edge) => edge.source === sourceId &&
292
+ edge.sourceHandle === sourceHandle &&
293
+ edge.target === targetId &&
294
+ edge.targetHandle === targetHandle);
295
+ if (duplicate) {
296
+ return {
297
+ graph,
298
+ result: {
299
+ ok: true,
300
+ edge_id: duplicate.id,
301
+ note: "edge already exists"
302
+ },
303
+ changed: false
304
+ };
305
+ }
306
+ const nodeTypeOf = (id) => graph.nodes.find((node) => node.id === id)?.type;
307
+ if (wouldCreateLoopUnsafeCycle(graph.edges, sourceId, targetId, targetHandle, nodeTypeOf)) {
308
+ throw new Error(`Connecting ${sourceId} → ${targetId} would create a cycle. A cycle may only close on the "next" or "condition" input of a Loop node (nodetool.control.Loop).`);
309
+ }
310
+ const sourceTypeName = typeMetaToString(sourceType);
311
+ const targetTypeName = typeMetaToString(targetType);
312
+ if (typesIncompatible(sourceTypeName, targetTypeName)) {
313
+ throw new Error(`Type mismatch: source '${sourceHandle}' produces ${sourceTypeName} but target '${targetHandle}' expects ${targetTypeName}.`);
314
+ }
315
+ const edgeId = options.createEdgeId?.() ?? `edge_${globalThis.crypto.randomUUID()}`;
316
+ graph.edges.push({
317
+ id: edgeId,
318
+ source: sourceId,
319
+ sourceHandle,
320
+ target: targetId,
321
+ targetHandle
322
+ });
323
+ if (declaresInput) {
324
+ declareDynamicInput(targetNode, targetHandle, sourceType);
325
+ return {
326
+ graph,
327
+ result: { ok: true, edge_id: edgeId, declared_input: targetHandle },
328
+ changed: true
329
+ };
330
+ }
331
+ return { graph, result: { ok: true, edge_id: edgeId }, changed: true };
332
+ }
333
+ const nodeId = String(args.node_id);
334
+ if (name === "ui_delete_edge") {
335
+ const edgeId = String(args.edge_id);
336
+ const index = graph.edges.findIndex((edge) => edge.id === edgeId);
337
+ if (index < 0)
338
+ throw new Error(`Edge not found: ${edgeId}`);
339
+ graph.edges.splice(index, 1);
340
+ return { graph, result: { ok: true, edge_id: edgeId }, changed: true };
341
+ }
342
+ const node = findNode(graph, nodeId);
343
+ if (name === "ui_delete_node") {
344
+ const parentPosition = normalizePosition(nodeUi(node).position, 0);
345
+ for (const child of graph.nodes) {
346
+ if (child.parent_id !== nodeId)
347
+ continue;
348
+ const childPosition = normalizePosition(nodeUi(child).position, 0);
349
+ child.parent_id = null;
350
+ child.ui_properties = {
351
+ ...nodeUi(child),
352
+ position: {
353
+ x: parentPosition.x + childPosition.x,
354
+ y: parentPosition.y + childPosition.y
355
+ }
356
+ };
357
+ }
358
+ graph.nodes = graph.nodes.filter((candidate) => candidate.id !== nodeId);
359
+ graph.edges = graph.edges.filter((edge) => edge.source !== nodeId && edge.target !== nodeId);
360
+ return { graph, result: { ok: true, node_id: nodeId }, changed: true };
361
+ }
362
+ if (name === "ui_move_node") {
363
+ node.ui_properties = {
364
+ ...nodeUi(node),
365
+ position: normalizePosition(args.position, 0)
366
+ };
367
+ return {
368
+ graph,
369
+ result: { ok: true, node_id: nodeId, position: args.position },
370
+ changed: true
371
+ };
372
+ }
373
+ if (name === "ui_set_node_title") {
374
+ node.ui_properties = { ...nodeUi(node), title: String(args.title) };
375
+ return {
376
+ graph,
377
+ result: { ok: true, node_id: nodeId, title: args.title },
378
+ changed: true
379
+ };
380
+ }
381
+ const update = isRecord(args.data) ? args.data : {};
382
+ const { properties, title, ...rest } = update;
383
+ const propertyPatch = isRecord(properties) ? properties : {};
384
+ node.data = { ...nodeData(node), ...propertyPatch };
385
+ const uiPatch = {};
386
+ for (const [key, value] of Object.entries(rest)) {
387
+ if (DYNAMIC_NODE_DATA_FIELDS.has(key)) {
388
+ node[key] = value;
389
+ }
390
+ else if (UI_NODE_DATA_FIELDS.has(key)) {
391
+ uiPatch[key] = value;
392
+ }
393
+ }
394
+ if (isString(title))
395
+ uiPatch.title = title;
396
+ if (Object.keys(uiPatch).length > 0) {
397
+ node.ui_properties = { ...nodeUi(node), ...uiPatch };
398
+ }
399
+ applyInferredCodeHandles(node);
400
+ return { graph, result: { ok: true, node_id: nodeId }, changed: true };
401
+ }
402
+ //# sourceMappingURL=workflow-document-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-document-tools.js","sourceRoot":"","sources":["../src/workflow-document-tools.ts"],"names":[],"mappings":"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"}