@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.
- package/CHANGELOG.md +60 -0
- package/README.md +32 -13
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-DKNYRLED.js → asset-feeds-4AWAT5PW.js} +6 -6
- package/dist/{asset-feeds-DKNYRLED.js.map → asset-feeds-4AWAT5PW.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +1 -1
- package/dist/asset-manager/index.js +5 -5
- package/dist/asset-manager/installer.js +2 -2
- package/dist/bridge/drivers/claude-sdk.js +108 -5
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +1 -1
- package/dist/bridge/drivers/continue.js +2 -2
- package/dist/bridge/drivers/echo.js +1 -1
- package/dist/bridge/drivers/gemini.js +3 -3
- package/dist/bridge/drivers/goose.js +2 -2
- package/dist/bridge/drivers/omp.js +1 -1
- package/dist/bridge/drivers/opencode.js +2 -2
- package/dist/bridge/drivers/qwen.js +3 -3
- package/dist/bridge/index.js +2 -2
- package/dist/bridge/src/drivers/claude-sdk.d.ts +33 -0
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/{chunk-CERGXDGG.js → chunk-2OCYS5EP.js} +3 -3
- package/dist/{chunk-CERGXDGG.js.map → chunk-2OCYS5EP.js.map} +1 -1
- package/dist/{chunk-W3Q37HEF.js → chunk-3HVASHBF.js} +3 -3
- package/dist/{chunk-W3Q37HEF.js.map → chunk-3HVASHBF.js.map} +1 -1
- package/dist/{chunk-UQ3RJKDD.js → chunk-4O2RAXKJ.js} +179 -52
- package/dist/chunk-4O2RAXKJ.js.map +1 -0
- package/dist/{chunk-DZM33LQO.js → chunk-4QROZZ5Z.js} +15 -3
- package/dist/chunk-4QROZZ5Z.js.map +1 -0
- package/dist/{chunk-G2ILW47R.js → chunk-57RFYEVM.js} +3 -3
- package/dist/{chunk-G2ILW47R.js.map → chunk-57RFYEVM.js.map} +1 -1
- package/dist/{chunk-BLWNI5KW.js → chunk-AKVAZ5CB.js} +2 -2
- package/dist/{chunk-BLWNI5KW.js.map → chunk-AKVAZ5CB.js.map} +1 -1
- package/dist/{chunk-BFIK6NPZ.js → chunk-AM5LFRXJ.js} +3 -3
- package/dist/{chunk-BFIK6NPZ.js.map → chunk-AM5LFRXJ.js.map} +1 -1
- package/dist/{chunk-RDE43ORT.js → chunk-D4VHBAJC.js} +4 -4
- package/dist/{chunk-RDE43ORT.js.map → chunk-D4VHBAJC.js.map} +1 -1
- package/dist/{chunk-PTS3QN5P.js → chunk-EEHOMCRU.js} +1021 -115
- package/dist/chunk-EEHOMCRU.js.map +1 -0
- package/dist/{chunk-CXX3UGJP.js → chunk-ENBTXMPL.js} +7 -7
- package/dist/{chunk-CXX3UGJP.js.map → chunk-ENBTXMPL.js.map} +1 -1
- package/dist/{chunk-LD6YGIKZ.js → chunk-EUWN4EK4.js} +60 -21
- package/dist/chunk-EUWN4EK4.js.map +1 -0
- package/dist/{chunk-FB4GPWYC.js → chunk-FKBQRV4J.js} +57 -16
- package/dist/chunk-FKBQRV4J.js.map +1 -0
- package/dist/{chunk-WG3L5VHF.js → chunk-HY3MBSNC.js} +2 -2
- package/dist/{chunk-WG3L5VHF.js.map → chunk-HY3MBSNC.js.map} +1 -1
- package/dist/{chunk-7IRH7MGV.js → chunk-IHX2SN35.js} +9 -9
- package/dist/{chunk-7IRH7MGV.js.map → chunk-IHX2SN35.js.map} +1 -1
- package/dist/{chunk-3F54MH2T.js → chunk-JAFEMG7W.js} +4 -4
- package/dist/{chunk-3F54MH2T.js.map → chunk-JAFEMG7W.js.map} +1 -1
- package/dist/{chunk-X6BPVUV2.js → chunk-L3TS7ZO4.js} +3 -3
- package/dist/{chunk-X6BPVUV2.js.map → chunk-L3TS7ZO4.js.map} +1 -1
- package/dist/{chunk-RIEXN7WA.js → chunk-MADO7PH5.js} +2 -2
- package/dist/{chunk-RIEXN7WA.js.map → chunk-MADO7PH5.js.map} +1 -1
- package/dist/{chunk-BCTU4TN7.js → chunk-MWFYXUFK.js} +3 -3
- package/dist/{chunk-BCTU4TN7.js.map → chunk-MWFYXUFK.js.map} +1 -1
- package/dist/{chunk-TK66CMXV.js → chunk-NU4E7C5I.js} +7 -3
- package/dist/chunk-NU4E7C5I.js.map +1 -0
- package/dist/{chunk-ZE2KEPE2.js → chunk-OEGHKO5N.js} +258 -24
- package/dist/chunk-OEGHKO5N.js.map +1 -0
- package/dist/{chunk-63ZPKREA.js → chunk-P43HBWKK.js} +11 -4
- package/dist/chunk-P43HBWKK.js.map +1 -0
- package/dist/{chunk-7UZGKVSK.js → chunk-PJ6INYDD.js} +3 -3
- package/dist/{chunk-7UZGKVSK.js.map → chunk-PJ6INYDD.js.map} +1 -1
- package/dist/{chunk-CA5CWLGN.js → chunk-PKEAYYEJ.js} +7 -4
- package/dist/chunk-PKEAYYEJ.js.map +1 -0
- package/dist/{chunk-ETFETLLB.js → chunk-UZYTSIX6.js} +6 -6
- package/dist/{chunk-ETFETLLB.js.map → chunk-UZYTSIX6.js.map} +1 -1
- package/dist/{chunk-SIF5F5SN.js → chunk-V4ZLZJFN.js} +3 -3
- package/dist/{chunk-SIF5F5SN.js.map → chunk-V4ZLZJFN.js.map} +1 -1
- package/dist/{chunk-ZR5Q4KZK.js → chunk-VNIKF66R.js} +3 -3
- package/dist/{chunk-ZR5Q4KZK.js.map → chunk-VNIKF66R.js.map} +1 -1
- package/dist/{chunk-CILACPUC.js → chunk-WSARNOPP.js} +5 -5
- package/dist/{chunk-CILACPUC.js.map → chunk-WSARNOPP.js.map} +1 -1
- package/dist/{chunk-TAJBFYCT.js → chunk-YWPEDILM.js} +83 -36
- package/dist/chunk-YWPEDILM.js.map +1 -0
- package/dist/{chunk-UNP4M5ZZ.js → chunk-ZR2X4SIG.js} +4 -4
- package/dist/{chunk-UNP4M5ZZ.js.map → chunk-ZR2X4SIG.js.map} +1 -1
- package/dist/cli/index.js +50 -50
- package/dist/connectors/config.js +1 -1
- package/dist/connectors/index.js +6 -6
- package/dist/core/index.js +1 -1
- package/dist/core/src/subprocess.d.ts +5 -1
- package/dist/core/src/subprocess.d.ts.map +1 -1
- package/dist/deploy/index.js +1 -1
- package/dist/discovery/index.js +1 -1
- package/dist/{ensure-sources-R6KW7K3M.js → ensure-sources-QF72HVUM.js} +8 -8
- package/dist/{ensure-sources-R6KW7K3M.js.map → ensure-sources-QF72HVUM.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +6 -6
- package/dist/factory-assets/connectors/deploy.js +6 -6
- package/dist/factory-assets/connectors/devserver.js +6 -6
- package/dist/factory-assets/connectors/flow/CONNECTOR.md +61 -14
- package/dist/factory-assets/connectors/flow/adapter.d.ts +78 -34
- package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/adapter.js +6 -6
- package/dist/factory-assets/connectors/flow/contract/expression.d.ts +55 -0
- package/dist/factory-assets/connectors/flow/contract/expression.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/contract/flow.v2.schema.json +61 -134
- package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -1
- package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/contract/schema.d.ts +14 -2
- package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/contract.js +2 -2
- package/dist/factory-assets/connectors/flow/engine/bindings.d.ts +9 -0
- package/dist/factory-assets/connectors/flow/engine/bindings.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/engine/engine.d.ts +11 -6
- package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/engine/index.d.ts +2 -0
- package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts +22 -0
- package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts +18 -0
- package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/engine/types.d.ts +21 -15
- package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/engine.js +4 -4
- package/dist/factory-assets/connectors/flow/index.d.ts +3 -0
- package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts +48 -0
- package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/node-executor.d.ts +45 -0
- package/dist/factory-assets/connectors/flow/node-executor.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +3 -2
- package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/prompt-fragments.js +2 -2
- package/dist/factory-assets/connectors/flow/run-flow.d.ts +10 -9
- package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.js +7 -7
- package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts +73 -0
- package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow.js +6 -6
- package/dist/factory-assets/connectors/git.js +6 -6
- package/dist/factory-assets/connectors/gmail.js +6 -6
- package/dist/factory-assets/connectors/googledrive.js +6 -6
- package/dist/factory-assets/connectors/local.js +6 -6
- package/dist/factory-assets/connectors/mattermost.js +6 -6
- package/dist/factory-assets/connectors/memory.js +6 -6
- package/dist/factory-assets/connectors/minio.js +6 -6
- package/dist/factory-assets/connectors/postgres.js +6 -6
- package/dist/factory-assets/connectors/s3.js +6 -6
- package/dist/factory-assets/connectors/sharepoint.js +6 -6
- package/dist/factory-assets/connectors/sqlite.js +6 -6
- package/dist/factory-assets/connectors/static-server.js +6 -6
- package/dist/factory-assets/connectors/tunnel.js +6 -6
- package/dist/factory-assets/connectors/webdav.js +6 -6
- package/dist/factory-assets/connectors/xstate-store.js +6 -6
- package/dist/factory-assets/connectors/xstate.js +6 -6
- package/dist/{flows-F3CJNMK6.js → flows-YIW4HL3L.js} +4 -4
- package/dist/{flows-F3CJNMK6.js.map → flows-YIW4HL3L.js.map} +1 -1
- package/dist/{helpers-KPOLCGKX.js → helpers-LURCZHA4.js} +8 -8
- package/dist/{helpers-KPOLCGKX.js.map → helpers-LURCZHA4.js.map} +1 -1
- package/dist/library/index.js +3 -3
- package/dist/library/install.js +1 -1
- package/dist/{library-publish-ZAPZS64O.js → library-publish-2GMJM3NZ.js} +14 -14
- package/dist/{library-publish-ZAPZS64O.js.map → library-publish-2GMJM3NZ.js.map} +1 -1
- package/dist/{open-library-I4F2UNOY.js → open-library-POFOXZWH.js} +12 -12
- package/dist/{open-library-I4F2UNOY.js.map → open-library-POFOXZWH.js.map} +1 -1
- package/dist/{paths-KBACHM5B.js → paths-ZLX4ITAQ.js} +6 -6
- package/dist/{paths-KBACHM5B.js.map → paths-ZLX4ITAQ.js.map} +1 -1
- package/dist/{plugin-store-CYSNVZIX.js → plugin-store-YIMNH2FH.js} +3 -3
- package/dist/{plugin-store-CYSNVZIX.js.map → plugin-store-YIMNH2FH.js.map} +1 -1
- package/dist/{project-SIHZBTGB.js → project-GVOPZEJZ.js} +9 -9
- package/dist/{project-SIHZBTGB.js.map → project-GVOPZEJZ.js.map} +1 -1
- package/dist/resolver/index.js +1 -1
- package/dist/runner/index.js +15 -12
- package/dist/runner/src/serve.d.ts +3 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +5 -5
- package/dist/sdk/bridge.js +2 -2
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/flow.js +4 -4
- package/dist/sdk/index.js +15 -12
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +1 -1
- package/dist/sdk/runner.js +15 -12
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/types.js +1 -1
- package/dist/session/index.js +2 -2
- package/dist/session/src/dispatcher.d.ts.map +1 -1
- package/dist/{setup-KMBXMV25.js → setup-RHWARBBB.js} +5 -5
- package/dist/{setup-KMBXMV25.js.map → setup-RHWARBBB.js.map} +1 -1
- package/dist/{skills-LHS4TOKK.js → skills-HGVH6UTA.js} +5 -5
- package/dist/{skills-LHS4TOKK.js.map → skills-HGVH6UTA.js.map} +1 -1
- package/dist/{source-X226ZJPR.js → source-FB3T4IHP.js} +13 -13
- package/dist/{source-X226ZJPR.js.map → source-FB3T4IHP.js.map} +1 -1
- package/dist/{source-manifest-publish-N2QVUR5U.js → source-manifest-publish-XTRDVPSC.js} +15 -15
- package/dist/{source-manifest-publish-N2QVUR5U.js.map → source-manifest-publish-XTRDVPSC.js.map} +1 -1
- package/dist/tui/index.js +15 -12
- package/dist/tui/index.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/src/events.d.ts +20 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/flow.d.ts +26 -0
- package/dist/types/src/flow.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/protocol.d.ts +1 -0
- package/dist/types/src/protocol.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +12 -1
- package/dist/types/src/version.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +4 -4
- package/dist/workspace-plugin/adapters/omp.js +7 -7
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-63ZPKREA.js.map +0 -1
- package/dist/chunk-CA5CWLGN.js.map +0 -1
- package/dist/chunk-DZM33LQO.js.map +0 -1
- package/dist/chunk-FB4GPWYC.js.map +0 -1
- package/dist/chunk-LD6YGIKZ.js.map +0 -1
- package/dist/chunk-PTS3QN5P.js.map +0 -1
- package/dist/chunk-TAJBFYCT.js.map +0 -1
- package/dist/chunk-TK66CMXV.js.map +0 -1
- package/dist/chunk-UQ3RJKDD.js.map +0 -1
- 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:
|
|
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 [
|
|
684
|
-
for (const expression of
|
|
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",
|
|
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 = [
|
|
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.
|
|
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-
|
|
1002
|
-
//# sourceMappingURL=chunk-
|
|
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
|