@skaile/workspaces 2.3.0 → 2.5.0

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 (217) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +32 -13
  3. package/dist/app-sdk/index.js +1 -1
  4. package/dist/{asset-feeds-DKNYRLED.js → asset-feeds-4AWAT5PW.js} +6 -6
  5. package/dist/{asset-feeds-DKNYRLED.js.map → asset-feeds-4AWAT5PW.js.map} +1 -1
  6. package/dist/asset-manager/catalog-deployer.js +1 -1
  7. package/dist/asset-manager/index.js +5 -5
  8. package/dist/asset-manager/installer.js +2 -2
  9. package/dist/bridge/drivers/claude-sdk.js +108 -5
  10. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  11. package/dist/bridge/drivers/codex.js +1 -1
  12. package/dist/bridge/drivers/continue.js +2 -2
  13. package/dist/bridge/drivers/echo.js +1 -1
  14. package/dist/bridge/drivers/gemini.js +3 -3
  15. package/dist/bridge/drivers/goose.js +2 -2
  16. package/dist/bridge/drivers/omp.js +1 -1
  17. package/dist/bridge/drivers/opencode.js +2 -2
  18. package/dist/bridge/drivers/qwen.js +3 -3
  19. package/dist/bridge/index.js +2 -2
  20. package/dist/bridge/src/drivers/claude-sdk.d.ts +33 -0
  21. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  22. package/dist/{chunk-CERGXDGG.js → chunk-2OCYS5EP.js} +3 -3
  23. package/dist/{chunk-CERGXDGG.js.map → chunk-2OCYS5EP.js.map} +1 -1
  24. package/dist/{chunk-W3Q37HEF.js → chunk-3HVASHBF.js} +3 -3
  25. package/dist/{chunk-W3Q37HEF.js.map → chunk-3HVASHBF.js.map} +1 -1
  26. package/dist/{chunk-UQ3RJKDD.js → chunk-4O2RAXKJ.js} +179 -52
  27. package/dist/chunk-4O2RAXKJ.js.map +1 -0
  28. package/dist/{chunk-DZM33LQO.js → chunk-4QROZZ5Z.js} +15 -3
  29. package/dist/chunk-4QROZZ5Z.js.map +1 -0
  30. package/dist/{chunk-G2ILW47R.js → chunk-57RFYEVM.js} +3 -3
  31. package/dist/{chunk-G2ILW47R.js.map → chunk-57RFYEVM.js.map} +1 -1
  32. package/dist/{chunk-BLWNI5KW.js → chunk-AKVAZ5CB.js} +2 -2
  33. package/dist/{chunk-BLWNI5KW.js.map → chunk-AKVAZ5CB.js.map} +1 -1
  34. package/dist/{chunk-BFIK6NPZ.js → chunk-AM5LFRXJ.js} +3 -3
  35. package/dist/{chunk-BFIK6NPZ.js.map → chunk-AM5LFRXJ.js.map} +1 -1
  36. package/dist/{chunk-RDE43ORT.js → chunk-D4VHBAJC.js} +4 -4
  37. package/dist/{chunk-RDE43ORT.js.map → chunk-D4VHBAJC.js.map} +1 -1
  38. package/dist/{chunk-PTS3QN5P.js → chunk-EEHOMCRU.js} +1021 -115
  39. package/dist/chunk-EEHOMCRU.js.map +1 -0
  40. package/dist/{chunk-CXX3UGJP.js → chunk-ENBTXMPL.js} +7 -7
  41. package/dist/{chunk-CXX3UGJP.js.map → chunk-ENBTXMPL.js.map} +1 -1
  42. package/dist/{chunk-LD6YGIKZ.js → chunk-EUWN4EK4.js} +60 -21
  43. package/dist/chunk-EUWN4EK4.js.map +1 -0
  44. package/dist/{chunk-FB4GPWYC.js → chunk-FKBQRV4J.js} +57 -16
  45. package/dist/chunk-FKBQRV4J.js.map +1 -0
  46. package/dist/{chunk-WG3L5VHF.js → chunk-HY3MBSNC.js} +2 -2
  47. package/dist/{chunk-WG3L5VHF.js.map → chunk-HY3MBSNC.js.map} +1 -1
  48. package/dist/{chunk-7IRH7MGV.js → chunk-IHX2SN35.js} +9 -9
  49. package/dist/{chunk-7IRH7MGV.js.map → chunk-IHX2SN35.js.map} +1 -1
  50. package/dist/{chunk-3F54MH2T.js → chunk-JAFEMG7W.js} +4 -4
  51. package/dist/{chunk-3F54MH2T.js.map → chunk-JAFEMG7W.js.map} +1 -1
  52. package/dist/{chunk-X6BPVUV2.js → chunk-L3TS7ZO4.js} +3 -3
  53. package/dist/{chunk-X6BPVUV2.js.map → chunk-L3TS7ZO4.js.map} +1 -1
  54. package/dist/{chunk-RIEXN7WA.js → chunk-MADO7PH5.js} +2 -2
  55. package/dist/{chunk-RIEXN7WA.js.map → chunk-MADO7PH5.js.map} +1 -1
  56. package/dist/{chunk-BCTU4TN7.js → chunk-MWFYXUFK.js} +3 -3
  57. package/dist/{chunk-BCTU4TN7.js.map → chunk-MWFYXUFK.js.map} +1 -1
  58. package/dist/{chunk-TK66CMXV.js → chunk-NU4E7C5I.js} +7 -3
  59. package/dist/chunk-NU4E7C5I.js.map +1 -0
  60. package/dist/{chunk-ZE2KEPE2.js → chunk-OEGHKO5N.js} +258 -24
  61. package/dist/chunk-OEGHKO5N.js.map +1 -0
  62. package/dist/{chunk-63ZPKREA.js → chunk-P43HBWKK.js} +11 -4
  63. package/dist/chunk-P43HBWKK.js.map +1 -0
  64. package/dist/{chunk-7UZGKVSK.js → chunk-PJ6INYDD.js} +3 -3
  65. package/dist/{chunk-7UZGKVSK.js.map → chunk-PJ6INYDD.js.map} +1 -1
  66. package/dist/{chunk-CA5CWLGN.js → chunk-PKEAYYEJ.js} +7 -4
  67. package/dist/chunk-PKEAYYEJ.js.map +1 -0
  68. package/dist/{chunk-ETFETLLB.js → chunk-UZYTSIX6.js} +6 -6
  69. package/dist/{chunk-ETFETLLB.js.map → chunk-UZYTSIX6.js.map} +1 -1
  70. package/dist/{chunk-SIF5F5SN.js → chunk-V4ZLZJFN.js} +3 -3
  71. package/dist/{chunk-SIF5F5SN.js.map → chunk-V4ZLZJFN.js.map} +1 -1
  72. package/dist/{chunk-ZR5Q4KZK.js → chunk-VNIKF66R.js} +3 -3
  73. package/dist/{chunk-ZR5Q4KZK.js.map → chunk-VNIKF66R.js.map} +1 -1
  74. package/dist/{chunk-CILACPUC.js → chunk-WSARNOPP.js} +5 -5
  75. package/dist/{chunk-CILACPUC.js.map → chunk-WSARNOPP.js.map} +1 -1
  76. package/dist/{chunk-TAJBFYCT.js → chunk-YWPEDILM.js} +83 -36
  77. package/dist/chunk-YWPEDILM.js.map +1 -0
  78. package/dist/{chunk-UNP4M5ZZ.js → chunk-ZR2X4SIG.js} +4 -4
  79. package/dist/{chunk-UNP4M5ZZ.js.map → chunk-ZR2X4SIG.js.map} +1 -1
  80. package/dist/cli/index.js +50 -50
  81. package/dist/connectors/config.js +1 -1
  82. package/dist/connectors/index.js +6 -6
  83. package/dist/core/index.js +1 -1
  84. package/dist/core/src/subprocess.d.ts +5 -1
  85. package/dist/core/src/subprocess.d.ts.map +1 -1
  86. package/dist/deploy/index.js +1 -1
  87. package/dist/discovery/index.js +1 -1
  88. package/dist/{ensure-sources-R6KW7K3M.js → ensure-sources-QF72HVUM.js} +8 -8
  89. package/dist/{ensure-sources-R6KW7K3M.js.map → ensure-sources-QF72HVUM.js.map} +1 -1
  90. package/dist/factory-assets/connectors/box.js +6 -6
  91. package/dist/factory-assets/connectors/deploy.js +6 -6
  92. package/dist/factory-assets/connectors/devserver.js +6 -6
  93. package/dist/factory-assets/connectors/flow/CONNECTOR.md +61 -14
  94. package/dist/factory-assets/connectors/flow/adapter.d.ts +78 -34
  95. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  96. package/dist/factory-assets/connectors/flow/adapter.js +6 -6
  97. package/dist/factory-assets/connectors/flow/contract/expression.d.ts +55 -0
  98. package/dist/factory-assets/connectors/flow/contract/expression.d.ts.map +1 -1
  99. package/dist/factory-assets/connectors/flow/contract/flow.v2.schema.json +61 -134
  100. package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -1
  101. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
  102. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
  103. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +14 -2
  104. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  105. package/dist/factory-assets/connectors/flow/contract.js +2 -2
  106. package/dist/factory-assets/connectors/flow/engine/bindings.d.ts +9 -0
  107. package/dist/factory-assets/connectors/flow/engine/bindings.d.ts.map +1 -0
  108. package/dist/factory-assets/connectors/flow/engine/engine.d.ts +11 -6
  109. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -1
  110. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -1
  111. package/dist/factory-assets/connectors/flow/engine/index.d.ts +2 -0
  112. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -1
  113. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts +22 -0
  114. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts.map +1 -1
  115. package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts +18 -0
  116. package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts.map +1 -0
  117. package/dist/factory-assets/connectors/flow/engine/types.d.ts +21 -15
  118. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -1
  119. package/dist/factory-assets/connectors/flow/engine.js +4 -4
  120. package/dist/factory-assets/connectors/flow/index.d.ts +3 -0
  121. package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -1
  122. package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts +48 -0
  123. package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts.map +1 -0
  124. package/dist/factory-assets/connectors/flow/node-executor.d.ts +45 -0
  125. package/dist/factory-assets/connectors/flow/node-executor.d.ts.map +1 -0
  126. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +3 -2
  127. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -1
  128. package/dist/factory-assets/connectors/flow/prompt-fragments.js +2 -2
  129. package/dist/factory-assets/connectors/flow/run-flow.d.ts +10 -9
  130. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  131. package/dist/factory-assets/connectors/flow/run-flow.js +7 -7
  132. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts +73 -0
  133. package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts.map +1 -0
  134. package/dist/factory-assets/connectors/flow.js +6 -6
  135. package/dist/factory-assets/connectors/git.js +6 -6
  136. package/dist/factory-assets/connectors/gmail.js +6 -6
  137. package/dist/factory-assets/connectors/googledrive.js +6 -6
  138. package/dist/factory-assets/connectors/local.js +6 -6
  139. package/dist/factory-assets/connectors/mattermost.js +6 -6
  140. package/dist/factory-assets/connectors/memory.js +6 -6
  141. package/dist/factory-assets/connectors/minio.js +6 -6
  142. package/dist/factory-assets/connectors/postgres.js +6 -6
  143. package/dist/factory-assets/connectors/s3.js +6 -6
  144. package/dist/factory-assets/connectors/sharepoint.js +6 -6
  145. package/dist/factory-assets/connectors/sqlite.js +6 -6
  146. package/dist/factory-assets/connectors/static-server.js +6 -6
  147. package/dist/factory-assets/connectors/tunnel.js +6 -6
  148. package/dist/factory-assets/connectors/webdav.js +6 -6
  149. package/dist/factory-assets/connectors/xstate-store.js +6 -6
  150. package/dist/factory-assets/connectors/xstate.js +6 -6
  151. package/dist/{flows-F3CJNMK6.js → flows-YIW4HL3L.js} +4 -4
  152. package/dist/{flows-F3CJNMK6.js.map → flows-YIW4HL3L.js.map} +1 -1
  153. package/dist/{helpers-KPOLCGKX.js → helpers-LURCZHA4.js} +8 -8
  154. package/dist/{helpers-KPOLCGKX.js.map → helpers-LURCZHA4.js.map} +1 -1
  155. package/dist/library/index.js +3 -3
  156. package/dist/library/install.js +1 -1
  157. package/dist/{library-publish-ZAPZS64O.js → library-publish-2GMJM3NZ.js} +14 -14
  158. package/dist/{library-publish-ZAPZS64O.js.map → library-publish-2GMJM3NZ.js.map} +1 -1
  159. package/dist/{open-library-I4F2UNOY.js → open-library-POFOXZWH.js} +12 -12
  160. package/dist/{open-library-I4F2UNOY.js.map → open-library-POFOXZWH.js.map} +1 -1
  161. package/dist/{paths-KBACHM5B.js → paths-ZLX4ITAQ.js} +6 -6
  162. package/dist/{paths-KBACHM5B.js.map → paths-ZLX4ITAQ.js.map} +1 -1
  163. package/dist/{plugin-store-CYSNVZIX.js → plugin-store-YIMNH2FH.js} +3 -3
  164. package/dist/{plugin-store-CYSNVZIX.js.map → plugin-store-YIMNH2FH.js.map} +1 -1
  165. package/dist/{project-SIHZBTGB.js → project-GVOPZEJZ.js} +9 -9
  166. package/dist/{project-SIHZBTGB.js.map → project-GVOPZEJZ.js.map} +1 -1
  167. package/dist/resolver/index.js +1 -1
  168. package/dist/runner/index.js +15 -12
  169. package/dist/runner/src/serve.d.ts +3 -1
  170. package/dist/runner/src/serve.d.ts.map +1 -1
  171. package/dist/sdk/asset-manager.js +5 -5
  172. package/dist/sdk/bridge.js +2 -2
  173. package/dist/sdk/core.js +1 -1
  174. package/dist/sdk/flow.js +4 -4
  175. package/dist/sdk/index.js +15 -12
  176. package/dist/sdk/index.js.map +1 -1
  177. package/dist/sdk/resolver.js +1 -1
  178. package/dist/sdk/runner.js +15 -12
  179. package/dist/sdk/session.js +2 -2
  180. package/dist/sdk/types.js +1 -1
  181. package/dist/session/index.js +2 -2
  182. package/dist/session/src/dispatcher.d.ts.map +1 -1
  183. package/dist/{setup-KMBXMV25.js → setup-RHWARBBB.js} +5 -5
  184. package/dist/{setup-KMBXMV25.js.map → setup-RHWARBBB.js.map} +1 -1
  185. package/dist/{skills-LHS4TOKK.js → skills-HGVH6UTA.js} +5 -5
  186. package/dist/{skills-LHS4TOKK.js.map → skills-HGVH6UTA.js.map} +1 -1
  187. package/dist/{source-X226ZJPR.js → source-FB3T4IHP.js} +13 -13
  188. package/dist/{source-X226ZJPR.js.map → source-FB3T4IHP.js.map} +1 -1
  189. package/dist/{source-manifest-publish-N2QVUR5U.js → source-manifest-publish-XTRDVPSC.js} +15 -15
  190. package/dist/{source-manifest-publish-N2QVUR5U.js.map → source-manifest-publish-XTRDVPSC.js.map} +1 -1
  191. package/dist/tui/index.js +15 -12
  192. package/dist/tui/index.js.map +1 -1
  193. package/dist/types/index.js +1 -1
  194. package/dist/types/src/events.d.ts +20 -1
  195. package/dist/types/src/events.d.ts.map +1 -1
  196. package/dist/types/src/flow.d.ts +26 -0
  197. package/dist/types/src/flow.d.ts.map +1 -1
  198. package/dist/types/src/index.d.ts +1 -1
  199. package/dist/types/src/index.d.ts.map +1 -1
  200. package/dist/types/src/protocol.d.ts +1 -0
  201. package/dist/types/src/protocol.d.ts.map +1 -1
  202. package/dist/types/src/version.d.ts +12 -1
  203. package/dist/types/src/version.d.ts.map +1 -1
  204. package/dist/workspace-plugin/adapters/mcp.js +4 -4
  205. package/dist/workspace-plugin/adapters/omp.js +7 -7
  206. package/dist/workspace-plugin/index.js +1 -1
  207. package/package.json +1 -1
  208. package/dist/chunk-63ZPKREA.js.map +0 -1
  209. package/dist/chunk-CA5CWLGN.js.map +0 -1
  210. package/dist/chunk-DZM33LQO.js.map +0 -1
  211. package/dist/chunk-FB4GPWYC.js.map +0 -1
  212. package/dist/chunk-LD6YGIKZ.js.map +0 -1
  213. package/dist/chunk-PTS3QN5P.js.map +0 -1
  214. package/dist/chunk-TAJBFYCT.js.map +0 -1
  215. package/dist/chunk-TK66CMXV.js.map +0 -1
  216. package/dist/chunk-UQ3RJKDD.js.map +0 -1
  217. package/dist/chunk-ZE2KEPE2.js.map +0 -1
@@ -8,6 +8,15 @@ var FLOW_EXPRESSION_LIMITS = Object.freeze({
8
8
  maxPathSegments: 32,
9
9
  maxCollectionItems: 1024
10
10
  });
11
+ var FLOW_BINDING_NAME_PATTERN = /^(?!__proto__$)/;
12
+ function collectFlowBindingExpressions(value) {
13
+ if (typeof value === "string") {
14
+ return Array.from(value.matchAll(/\$\{([^{}]+)\}/g), (match) => match[1]);
15
+ }
16
+ if (Array.isArray(value)) return value.flatMap(collectFlowBindingExpressions);
17
+ if (typeof value !== "object" || value === null) return [];
18
+ return Object.values(value).flatMap(collectFlowBindingExpressions);
19
+ }
11
20
  var FlowExpressionError = class extends Error {
12
21
  /** Stable error name for callers that classify evaluator failures. */
13
22
  name = "FlowExpressionError";
@@ -201,16 +210,18 @@ function assertBooleanOperand(value, position) {
201
210
  if (!isBooleanOperand(value)) throw expressionError("requires boolean operands", position);
202
211
  }
203
212
  var Parser = class {
204
- constructor(tokens, context, onPath, onBooleanPath) {
213
+ constructor(tokens, context, onPath, onBooleanPath, onEvaluatedPath) {
205
214
  this.tokens = tokens;
206
215
  this.context = context;
207
216
  this.onPath = onPath;
208
217
  this.onBooleanPath = onBooleanPath;
218
+ this.onEvaluatedPath = onEvaluatedPath;
209
219
  }
210
220
  tokens;
211
221
  context;
212
222
  onPath;
213
223
  onBooleanPath;
224
+ onEvaluatedPath;
214
225
  index = 0;
215
226
  nesting = 0;
216
227
  parse(evaluate2 = true) {
@@ -288,6 +299,7 @@ var Parser = class {
288
299
  if (token.kind === "word") {
289
300
  this.onPath?.(String(token.value));
290
301
  resolvePath(String(token.value), this.context, token.position, false);
302
+ if (evaluate2) this.onEvaluatedPath?.(String(token.value));
291
303
  return evaluate2 ? resolvePath(String(token.value), this.context, token.position, true) : { marker: STATIC_PATH, path: String(token.value) };
292
304
  }
293
305
  if (token.value === "(") {
@@ -354,8 +366,200 @@ function evaluateFlowExpression(expression, context) {
354
366
  function evaluate(expression, context) {
355
367
  return evaluateFlowExpression(expression, context);
356
368
  }
369
+ function evaluateFlowExpressionValue(expression, context) {
370
+ const tokens = tokenize(expression);
371
+ if (expression.trim() === "default") return { value: true, paths: [] };
372
+ const paths = [];
373
+ const value = new Parser(
374
+ tokens,
375
+ context,
376
+ void 0,
377
+ void 0,
378
+ (path) => paths.push(path)
379
+ ).parse();
380
+ return { value, paths };
381
+ }
382
+ function originsForPath(path, nodeOutputOrigin, flowInputOrigins) {
383
+ if (path.startsWith("flow.input.")) {
384
+ const inputName = path.split(".")[2];
385
+ const inherited = flowInputOrigins[inputName];
386
+ return inherited ?? [{ source: "flow-input", path, obtainedBy: "runtime" }];
387
+ }
388
+ if (path.startsWith("defaults.")) {
389
+ return [{ source: "default", path, obtainedBy: "runtime" }];
390
+ }
391
+ const segments = path.split(".");
392
+ const nodeId = segments[1];
393
+ if (segments.length === 3 && segments[0] === "nodes" && segments[2] === "status") {
394
+ return [{ source: "node-status", nodeId, path, obtainedBy: "runtime" }];
395
+ }
396
+ if (segments.length >= 5 && segments[0] === "nodes" && segments[2] === "output" && segments[3] === "fields") {
397
+ const obtainedBy = nodeOutputOrigin[nodeId];
398
+ if (!obtainedBy) {
399
+ throw expressionError(`has no output origin for node ${nodeId}`);
400
+ }
401
+ return [{ source: "node-output", nodeId, path, obtainedBy }];
402
+ }
403
+ throw expressionError(`contains unsupported path ${path}`);
404
+ }
405
+ function stableFlowJson(value) {
406
+ if (value === void 0) return "null";
407
+ if (value === null || typeof value !== "object") return JSON.stringify(value) ?? "null";
408
+ if (Array.isArray(value)) return `[${value.map(stableFlowJson).join(",")}]`;
409
+ const object = value;
410
+ return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${stableFlowJson(object[key])}`).join(",")}}`;
411
+ }
412
+ function interpolationText(value) {
413
+ if (typeof value === "string") return value;
414
+ return stableFlowJson(value);
415
+ }
416
+ function deduplicateOrigins(origins) {
417
+ const seen = /* @__PURE__ */ new Set();
418
+ return origins.filter((origin) => {
419
+ const key = JSON.stringify(origin);
420
+ if (seen.has(key)) return false;
421
+ seen.add(key);
422
+ return true;
423
+ });
424
+ }
425
+ function resolveBindingValue(authored, bindingPath, context, nodeOutputOrigin, flowInputOrigins, depth) {
426
+ if (depth > FLOW_EXPRESSION_LIMITS.maxNesting) {
427
+ throw expressionError(`exceeds the nesting limit of ${FLOW_EXPRESSION_LIMITS.maxNesting}`);
428
+ }
429
+ if (typeof authored === "string") {
430
+ const exact = authored.match(/^\$\{([^{}]+)\}$/);
431
+ if (exact) {
432
+ const evaluated = evaluateFlowExpressionValue(exact[1], context);
433
+ return {
434
+ value: evaluated.value,
435
+ origins: deduplicateOrigins(
436
+ evaluated.paths.flatMap(
437
+ (path) => originsForPath(path, nodeOutputOrigin, flowInputOrigins)
438
+ )
439
+ )
440
+ };
441
+ }
442
+ const matches = Array.from(authored.matchAll(/\$\{([^{}]+)\}/g));
443
+ if (matches.length === 0) {
444
+ return {
445
+ value: authored,
446
+ origins: [{ source: "literal", path: bindingPath, obtainedBy: "runtime" }]
447
+ };
448
+ }
449
+ const origins = [
450
+ { source: "literal", path: bindingPath, obtainedBy: "runtime" }
451
+ ];
452
+ const value = authored.replace(/\$\{([^{}]+)\}/g, (_placeholder, expression) => {
453
+ const evaluated = evaluateFlowExpressionValue(expression, context);
454
+ origins.push(
455
+ ...evaluated.paths.flatMap(
456
+ (path) => originsForPath(path, nodeOutputOrigin, flowInputOrigins)
457
+ )
458
+ );
459
+ return interpolationText(evaluated.value);
460
+ });
461
+ return { value, origins: deduplicateOrigins(origins) };
462
+ }
463
+ if (Array.isArray(authored)) {
464
+ if (authored.length > FLOW_EXPRESSION_LIMITS.maxCollectionItems) {
465
+ throw expressionError(
466
+ `exceeds the collection item limit of ${FLOW_EXPRESSION_LIMITS.maxCollectionItems}`
467
+ );
468
+ }
469
+ const resolved = authored.map(
470
+ (value) => resolveBindingValue(
471
+ value,
472
+ bindingPath,
473
+ context,
474
+ nodeOutputOrigin,
475
+ flowInputOrigins,
476
+ depth + 1
477
+ )
478
+ );
479
+ return {
480
+ value: resolved.map(({ value }) => value),
481
+ origins: deduplicateOrigins([
482
+ { source: "literal", path: bindingPath, obtainedBy: "runtime" },
483
+ ...resolved.flatMap(({ origins }) => origins)
484
+ ])
485
+ };
486
+ }
487
+ if (typeof authored === "object" && authored !== null) {
488
+ const entries = Object.entries(authored);
489
+ if (entries.length > FLOW_EXPRESSION_LIMITS.maxCollectionItems) {
490
+ throw expressionError(
491
+ `exceeds the collection item limit of ${FLOW_EXPRESSION_LIMITS.maxCollectionItems}`
492
+ );
493
+ }
494
+ const resolved = entries.map(
495
+ ([key, value]) => [
496
+ key,
497
+ resolveBindingValue(
498
+ value,
499
+ bindingPath,
500
+ context,
501
+ nodeOutputOrigin,
502
+ flowInputOrigins,
503
+ depth + 1
504
+ )
505
+ ]
506
+ );
507
+ return {
508
+ value: Object.fromEntries(resolved.map(([key, result]) => [key, result.value])),
509
+ origins: deduplicateOrigins([
510
+ { source: "literal", path: bindingPath, obtainedBy: "runtime" },
511
+ ...resolved.flatMap(([, result]) => result.origins)
512
+ ])
513
+ };
514
+ }
515
+ return {
516
+ value: authored,
517
+ origins: [{ source: "literal", path: bindingPath, obtainedBy: "runtime" }]
518
+ };
519
+ }
520
+ function resolveFlowBindings(bindings, context, nodeOutputOrigin = {}, flowInputOrigins = {}) {
521
+ const values = {};
522
+ const origins = {};
523
+ const entries = Object.entries(bindings ?? {});
524
+ for (const [name] of entries) {
525
+ if (!FLOW_BINDING_NAME_PATTERN.test(name)) {
526
+ throw expressionError(`contains reserved binding name input.${name}`);
527
+ }
528
+ }
529
+ for (const [name, authored] of entries) {
530
+ const resolved = resolveBindingValue(
531
+ authored,
532
+ `input.${name}`,
533
+ context,
534
+ nodeOutputOrigin,
535
+ flowInputOrigins,
536
+ 0
537
+ );
538
+ values[name] = resolved.value;
539
+ origins[name] = resolved.origins;
540
+ }
541
+ return { values, origins };
542
+ }
357
543
  var nonEmptyString = z.string().min(1);
544
+ var flowAssetIdentity = z.string().regex(
545
+ /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
546
+ "Flow identity must be lowercase kebab-case without path separators"
547
+ );
358
548
  var jsonSchema = z.record(z.string(), z.json());
549
+ var bindingName = z.string().regex(FLOW_BINDING_NAME_PATTERN, "Binding name is reserved");
550
+ var nodeBindings = z.preprocess(
551
+ (value, context) => {
552
+ if (typeof value === "object" && value !== null) {
553
+ for (const key of Object.keys(value)) {
554
+ if (!FLOW_BINDING_NAME_PATTERN.test(key)) {
555
+ context.addIssue({ code: "custom", path: [key], message: "Binding name is reserved" });
556
+ }
557
+ }
558
+ }
559
+ return value;
560
+ },
561
+ z.record(bindingName, z.json())
562
+ );
359
563
  var FlowInputContractSchema = z.strictObject({
360
564
  schema: jsonSchema,
361
565
  example: z.json().optional()
@@ -377,7 +581,7 @@ var NodeOutputContractSchema = z.strictObject({
377
581
  });
378
582
  var NodeContractSchema = z.strictObject({
379
583
  requires: z.array(PreconditionSchema).optional(),
380
- input: z.record(z.string(), z.json()).optional(),
584
+ input: nodeBindings.optional(),
381
585
  output: NodeOutputContractSchema.optional()
382
586
  });
383
587
  var NodeGateSchema = z.strictObject({
@@ -387,7 +591,8 @@ var NodeControlSchema = z.strictObject({
387
591
  optional: z.boolean().optional(),
388
592
  retries: z.number().int().min(0).optional(),
389
593
  timeoutSec: z.number().positive().optional(),
390
- parallelGroup: nonEmptyString.optional()
594
+ parallelGroup: nonEmptyString.optional(),
595
+ subagent: z.boolean().optional()
391
596
  });
392
597
  var runAssets = { assets: z.array(nonEmptyString).optional() };
393
598
  var AgentRunSchema = z.strictObject({
@@ -461,13 +666,20 @@ var RouterRunSchema = z.strictObject({
461
666
  routes: z.array(RouteSchema).min(1),
462
667
  ...runAssets
463
668
  });
669
+ var SubFlowRunSchema = z.strictObject({
670
+ kind: z.literal("sub-flow"),
671
+ flow: flowAssetIdentity,
672
+ passContext: z.boolean().optional(),
673
+ ...runAssets
674
+ });
464
675
  var RunSchema = z.discriminatedUnion("kind", [
465
676
  AgentRunSchema,
466
677
  SubpromptRunSchema,
467
678
  FunctionRunSchema,
468
679
  CheckRunSchema,
469
680
  GateRunSchema,
470
- RouterRunSchema
681
+ RouterRunSchema,
682
+ SubFlowRunSchema
471
683
  ]);
472
684
  var NodeSchema = z.strictObject({
473
685
  id: nonEmptyString,
@@ -524,14 +736,6 @@ var FlowDefinitionObjectSchema = z.strictObject({
524
736
  function parseFlowDefinitionStructure(data) {
525
737
  return FlowDefinitionObjectSchema.safeParse(data);
526
738
  }
527
- function bindingExpressions(value) {
528
- if (typeof value === "string") {
529
- return Array.from(value.matchAll(/\$\{([^{}]+)\}/g), (match) => match[1]);
530
- }
531
- if (Array.isArray(value)) return value.flatMap(bindingExpressions);
532
- if (typeof value !== "object" || value === null) return [];
533
- return Object.values(value).flatMap(bindingExpressions);
534
- }
535
739
  var MISSING_FIELD = /* @__PURE__ */ Symbol("missing-field");
536
740
  function declaredFieldSchema(schema, path) {
537
741
  let current = schema;
@@ -565,11 +769,11 @@ var FlowDefinitionSchema = FlowDefinitionObjectSchema.superRefine((flow, context
565
769
  });
566
770
  }
567
771
  nodeIds.add(node.id);
568
- if (node.control?.optional === true && node.gate?.approval === "mandatory") {
772
+ if (node.control?.optional === true && (node.gate?.approval === "mandatory" || node.run.kind === "gate")) {
569
773
  context.addIssue({
570
774
  code: "custom",
571
775
  path: ["nodes", index, "control", "optional"],
572
- message: "a node cannot be both optional and a mandatory approval gate"
776
+ message: node.run.kind === "gate" ? "a first-class gate node cannot be optional" : "a node cannot be both optional and a mandatory approval gate"
573
777
  });
574
778
  }
575
779
  }
@@ -680,11 +884,11 @@ var FlowDefinitionSchema = FlowDefinitionObjectSchema.superRefine((flow, context
680
884
  "expr"
681
885
  ]);
682
886
  }
683
- for (const [bindingName, binding] of Object.entries(node.contract?.input ?? {})) {
684
- for (const expression of bindingExpressions(binding)) {
887
+ for (const [bindingName2, binding] of Object.entries(node.contract?.input ?? {})) {
888
+ for (const expression of collectFlowBindingExpressions(binding)) {
685
889
  validateExpression(
686
890
  expression,
687
- ["nodes", nodeIndex, "contract", "input", bindingName],
891
+ ["nodes", nodeIndex, "contract", "input", bindingName2],
688
892
  false
689
893
  );
690
894
  }
@@ -781,6 +985,8 @@ var LegacyNodeDataSchema = z.looseObject({
781
985
  phase: z.string().min(1).optional(),
782
986
  parallel_group: z.string().min(1).optional(),
783
987
  flow: z.string().min(1).optional(),
988
+ pass_context: z.boolean().optional(),
989
+ subagent: z.boolean().optional(),
784
990
  message: z.string().min(1).optional(),
785
991
  routes: z.array(LegacyRouteSchema).optional(),
786
992
  assets: z.array(z.string().min(1)).optional()
@@ -906,9 +1112,36 @@ function normalizeV1(data) {
906
1112
  const kind = node.type;
907
1113
  const label = data2.label ?? node.label ?? data2.skill ?? node.skill ?? node.id;
908
1114
  const description = node.description ?? data2.description ?? data2.message ?? label;
1115
+ if (kind === "sub-flow" && data2.flow) {
1116
+ const delegatedAsset = `flow:${data2.flow}`;
1117
+ const assets2 = [.../* @__PURE__ */ new Set([delegatedAsset, ...data2.assets ?? []])];
1118
+ const parameters2 = data2.parameters ?? {};
1119
+ const control2 = {
1120
+ optional: data2.optional,
1121
+ parallelGroup: data2.parallel_group,
1122
+ subagent: data2.subagent
1123
+ };
1124
+ nodes.push({
1125
+ id: node.id,
1126
+ label,
1127
+ description,
1128
+ phase: data2.phase,
1129
+ run: {
1130
+ kind: "sub-flow",
1131
+ flow: data2.flow,
1132
+ passContext: data2.pass_context,
1133
+ assets: assets2
1134
+ },
1135
+ contract: Object.keys(parameters2).length > 0 ? { input: normalizeLegacyBinding(parameters2) } : void 0,
1136
+ control: Object.values(control2).some((value) => value !== void 0) ? control2 : void 0
1137
+ });
1138
+ continue;
1139
+ }
909
1140
  if (kind !== "skill") {
910
1141
  const delegatedAsset = kind === "sub-flow" && data2.flow ? `flow:${data2.flow}` : void 0;
911
- const assets2 = [...delegatedAsset ? [delegatedAsset] : [], ...data2.assets ?? []];
1142
+ const assets2 = [
1143
+ .../* @__PURE__ */ new Set([...delegatedAsset ? [delegatedAsset] : [], ...data2.assets ?? []])
1144
+ ];
912
1145
  const parameters2 = data2.parameters ?? {};
913
1146
  nodes.push({
914
1147
  id: node.id,
@@ -924,7 +1157,7 @@ function normalizeV1(data) {
924
1157
  requires: [{ expr: "false" }],
925
1158
  input: Object.keys(parameters2).length > 0 ? normalizeLegacyBinding(parameters2) : void 0
926
1159
  },
927
- control: { optional: true, parallelGroup: data2.parallel_group }
1160
+ control: { optional: true, parallelGroup: data2.parallel_group, subagent: data2.subagent }
928
1161
  });
929
1162
  continue;
930
1163
  }
@@ -937,7 +1170,8 @@ function normalizeV1(data) {
937
1170
  const assets = [...skillAsset ? [skillAsset] : [], ...data2.assets ?? []];
938
1171
  const control = {
939
1172
  optional: data2.optional,
940
- parallelGroup: data2.parallel_group
1173
+ parallelGroup: data2.parallel_group,
1174
+ subagent: data2.subagent
941
1175
  };
942
1176
  nodes.push({
943
1177
  id: node.id,
@@ -951,7 +1185,7 @@ function normalizeV1(data) {
951
1185
  },
952
1186
  contract: Object.keys(parameters).length > 0 ? { input: normalizeLegacyBinding(parameters) } : void 0,
953
1187
  gate: data2.approval?.mandatory === true ? { approval: "mandatory" } : void 0,
954
- control: control.optional !== void 0 || control.parallelGroup !== void 0 ? control : void 0
1188
+ control: Object.values(control).some((value) => value !== void 0) ? control : void 0
955
1189
  });
956
1190
  }
957
1191
  const nodeIds = new Set(nodes.map((node) => node.id));
@@ -997,6 +1231,6 @@ function parseFlowDefinition(data) {
997
1231
  return normalizeV1(data);
998
1232
  }
999
1233
 
1000
- export { FLOW_EXPRESSION_LIMITS, FlowDefinitionSchema, FlowExpressionError, evaluate, evaluateFlowExpression, normalizeV1, parseFlowDefinition };
1001
- //# sourceMappingURL=chunk-ZE2KEPE2.js.map
1002
- //# sourceMappingURL=chunk-ZE2KEPE2.js.map
1234
+ export { FLOW_EXPRESSION_LIMITS, FlowDefinitionSchema, FlowExpressionError, collectFlowBindingExpressions, evaluate, evaluateFlowExpression, inspectFlowExpression, normalizeV1, parseFlowDefinition, resolveFlowBindings, stableFlowJson };
1235
+ //# sourceMappingURL=chunk-OEGHKO5N.js.map
1236
+ //# sourceMappingURL=chunk-OEGHKO5N.js.map