@synergenius/flow-weaver 0.33.1 → 0.44.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/LICENSE +201 -226
- package/NOTICE +13 -0
- package/README.md +152 -244
- package/dist/agent/agent-loop.d.ts +4 -2
- package/dist/agent/cli-session.d.ts +3 -3
- package/dist/agent/cli-session.js +511 -438
- package/dist/agent/cli-spawn-config.d.ts +4 -4
- package/dist/agent/gate.d.ts +164 -0
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +174 -28
- package/dist/agent/mcp-bridge.d.ts +1 -1
- package/dist/agent/mcp-bridge.js +114 -128
- package/dist/agent/mcp-tool-server.d.ts +2 -2
- package/dist/agent/mcp-tool-server.js +147 -189
- package/dist/agent/profiles.d.ts +69 -0
- package/dist/agent/providers/anthropic.d.ts +2 -4
- package/dist/agent/providers/claude-cli.d.ts +4 -5
- package/dist/agent/providers/openai-compat.d.ts +8 -1
- package/dist/agent/streaming.d.ts +2 -2
- package/dist/agent/types.d.ts +16 -10
- package/dist/api/builder.d.ts +3 -3
- package/dist/api/compile.d.ts +9 -4
- package/dist/api/durable-validation.d.ts +15 -0
- package/dist/api/generate-in-place.d.ts +21 -19
- package/dist/api/generate.d.ts +21 -16
- package/dist/api/generated-module/local-node-functions.d.ts +24 -0
- package/dist/api/generated-module/module-format.d.ts +23 -0
- package/dist/api/generated-module/module-writer.d.ts +34 -0
- package/dist/api/generated-module/node-type-imports.d.ts +39 -0
- package/dist/api/generated-module/preamble.d.ts +16 -0
- package/dist/api/generated-module/workflow-functions.d.ts +29 -0
- package/dist/api/graph-identity.d.ts +39 -0
- package/dist/api/helpers.d.ts +4 -60
- package/dist/api/in-place/built-in-nodes.d.ts +18 -0
- package/dist/api/in-place/function-body.d.ts +21 -0
- package/dist/api/in-place/fw-imports.d.ts +30 -0
- package/dist/api/in-place/macro-coverage.d.ts +14 -0
- package/dist/api/in-place/node-type-functions.d.ts +18 -0
- package/dist/api/in-place/node-type-jsdoc.d.ts +20 -0
- package/dist/api/in-place/orphaned-node-types.d.ts +16 -0
- package/dist/api/in-place/runtime-section.d.ts +16 -0
- package/dist/api/in-place/signature.d.ts +47 -0
- package/dist/api/in-place/source-file.d.ts +19 -0
- package/dist/api/in-place/workflow-jsdoc.d.ts +19 -0
- package/dist/api/index.d.ts +18 -21
- package/dist/api/index.js +259 -53
- package/dist/api/inline-engine.generated.d.ts +3 -0
- package/dist/api/inline-runtime.d.ts +10 -2
- package/dist/api/manipulation/connections.d.ts +1 -1
- package/dist/api/manipulation/index.d.ts +8 -8
- package/dist/api/manipulation/node-types.d.ts +1 -1
- package/dist/api/manipulation/nodes.d.ts +3 -13
- package/dist/api/manipulation/ports.d.ts +1 -1
- package/dist/api/manipulation/scopes.d.ts +1 -1
- package/dist/api/manipulation/workflow.d.ts +1 -1
- package/dist/api/modify-operation.d.ts +0 -2
- package/dist/api/parse.d.ts +22 -1
- package/dist/api/port-references.d.ts +66 -0
- package/dist/api/query.d.ts +18 -2
- package/dist/api/templates.d.ts +1 -1
- package/dist/api/transform.d.ts +1 -1
- package/dist/api/validate.d.ts +1 -1
- package/dist/api/validation-registry.d.ts +2 -2
- package/dist/artifacts/brief.d.ts +43 -0
- package/dist/artifacts/index.d.ts +31 -0
- package/dist/artifacts/pdf.d.ts +19 -0
- package/dist/ast/builder.d.ts +3 -3
- package/dist/ast/index.d.ts +4 -4
- package/dist/ast/index.js +60 -5
- package/dist/ast/serialization-node.d.ts +1 -1
- package/dist/ast/serialization.d.ts +1 -1
- package/dist/ast/types.d.ts +82 -291
- package/dist/ast/workflow-utils.d.ts +4 -4
- package/dist/built-in-nodes/coercion-types.d.ts +1 -1
- package/dist/built-in-nodes/delay.d.ts +3 -1
- package/dist/built-in-nodes/generated-registry.d.ts +1 -1
- package/dist/built-in-nodes/index.d.ts +6 -5
- package/dist/built-in-nodes/index.js +79 -5
- package/dist/built-in-nodes/invoke-workflow.d.ts +2 -1
- package/dist/built-in-nodes/mock-types.d.ts +45 -14
- package/dist/built-in-nodes/sleep.d.ts +12 -0
- package/dist/built-in-nodes/wait-for-agent.d.ts +2 -1
- package/dist/built-in-nodes/wait-for-event.d.ts +2 -1
- package/dist/chevrotain-parser/coerce-parser.d.ts +1 -1
- package/dist/chevrotain-parser/connect-parser.d.ts +1 -1
- package/dist/chevrotain-parser/grammar-diagrams.d.ts +1 -1
- package/dist/chevrotain-parser/index.d.ts +20 -23
- package/dist/chevrotain-parser/node-parser.d.ts +7 -8
- package/dist/chevrotain-parser/parse-line.d.ts +54 -0
- package/dist/chevrotain-parser/tokens.d.ts +0 -17
- package/dist/chevrotain-parser/trigger-cancel-parser.d.ts +6 -1
- package/dist/chunks/chunk-4EUSHAY6.js +298 -0
- package/dist/chunks/chunk-4KDUEOFD.js +197 -0
- package/dist/chunks/chunk-5Y3AIUWY.js +911 -0
- package/dist/chunks/chunk-6KMVP6AU.js +20 -0
- package/dist/chunks/chunk-6PNJORFL.js +128 -0
- package/dist/chunks/chunk-7AAQNGRH.js +2001 -0
- package/dist/chunks/chunk-7YYKTPJ5.js +22705 -0
- package/dist/chunks/chunk-A5MBOFVY.js +33 -0
- package/dist/chunks/chunk-AXNQRVJB.js +18 -0
- package/dist/chunks/chunk-B6HQ6YS5.js +572 -0
- package/dist/chunks/chunk-CY3RNVML.js +296 -0
- package/dist/chunks/chunk-CYHYDLV4.js +653 -0
- package/dist/chunks/chunk-CZBCCK4Y.js +82 -0
- package/dist/chunks/chunk-DCMGQP5V.js +505 -0
- package/dist/chunks/chunk-DIAA66GL.js +72 -0
- package/dist/chunks/chunk-DUO6H5PR.js +20 -0
- package/dist/chunks/chunk-E5WN7IGO.js +125 -0
- package/dist/chunks/chunk-EFGFXXQF.js +184 -0
- package/dist/chunks/chunk-F3RTZV2A.js +2811 -0
- package/dist/chunks/chunk-FMTLP5ZX.js +1397 -0
- package/dist/chunks/chunk-HKZLQJDV.js +79 -0
- package/dist/chunks/chunk-INDEVYEC.js +146 -0
- package/dist/chunks/chunk-JQTF4R5L.js +390 -0
- package/dist/chunks/chunk-KMCAYNUM.js +331 -0
- package/dist/chunks/chunk-KMWCCOUJ.js +1444 -0
- package/dist/chunks/chunk-KU3CLJI2.js +338 -0
- package/dist/chunks/chunk-NDSTGMKR.js +3300 -0
- package/dist/chunks/chunk-NQNLUAPO.js +505 -0
- package/dist/chunks/chunk-O2U2LO57.js +466 -0
- package/dist/chunks/chunk-OOQG7UPP.js +457 -0
- package/dist/chunks/chunk-OZQAW5ZG.js +112 -0
- package/dist/chunks/chunk-P2CVDGHR.js +487 -0
- package/dist/chunks/chunk-P44RIZ7C.js +592 -0
- package/dist/chunks/chunk-PEZCT37T.js +1475 -0
- package/dist/chunks/chunk-PKWSAW6O.js +152 -0
- package/dist/chunks/chunk-Q6MDDZMT.js +4373 -0
- package/dist/chunks/chunk-QDE4Z7KW.js +6 -0
- package/dist/chunks/chunk-QJDAVSNY.js +8 -0
- package/dist/chunks/chunk-QYPORSLO.js +7552 -0
- package/dist/chunks/chunk-R4QGNK34.js +183 -0
- package/dist/chunks/chunk-REEYC73I.js +3002 -0
- package/dist/chunks/chunk-SEWDMQ6Q.js +46 -0
- package/dist/chunks/chunk-TAIUWKZB.js +3057 -0
- package/dist/chunks/chunk-TN4YZ3O7.js +196 -0
- package/dist/chunks/chunk-TRMFB43C.js +143 -0
- package/dist/chunks/chunk-VO4QXG2X.js +1016 -0
- package/dist/chunks/chunk-VP2P3BPA.js +1002 -0
- package/dist/chunks/chunk-VQ7H33J4.js +2176 -0
- package/dist/chunks/chunk-VWA7MCV2.js +105 -0
- package/dist/chunks/chunk-XAV22WD7.js +253 -0
- package/dist/chunks/chunk-YSPBPZDV.js +148 -0
- package/dist/chunks/chunk-ZKEGXO73.js +282 -0
- package/dist/chunks/chunk-ZMGN6F3S.js +4256 -0
- package/dist/chunks/grammar-diagrams-AI7VDXOM.js +14 -0
- package/dist/chunks/index.min-ECJD6GZC.js +37 -0
- package/dist/chunks/manifest-EPTR5MYH.js +21 -0
- package/dist/chunks/openapi-document-6TCGVDUW.js +69 -0
- package/dist/chunks/registry-K2U5KUTY.js +23 -0
- package/dist/chunks/serialization-node-UGY6CFH6.js +38 -0
- package/dist/chunks/validate-GEKSZPIN.js +24 -0
- package/dist/chunks/validation-registry-IQZX3UE3.js +7 -0
- package/dist/chunks/validator-VXFHLPDW.js +26 -0
- package/dist/chunks/workflow-executor-KBGFKHNR.js +36 -0
- package/dist/cli/commands/agents.d.ts +16 -0
- package/dist/cli/commands/artifact.d.ts +10 -0
- package/dist/cli/commands/compile.d.ts +0 -30
- package/dist/cli/commands/console.d.ts +32 -0
- package/dist/cli/commands/context.d.ts +0 -3
- package/dist/cli/commands/describe.js +386 -352
- package/dist/cli/commands/dev.d.ts +9 -4
- package/dist/cli/commands/diagram.d.ts +3 -5
- package/dist/cli/commands/doctor.d.ts +27 -4
- package/dist/cli/commands/doctor.js +3307 -633
- package/dist/cli/commands/export.d.ts +6 -4
- package/dist/cli/commands/grammar.d.ts +0 -3
- package/dist/cli/commands/implement.d.ts +1 -1
- package/dist/cli/commands/init/agent-handoff.d.ts +28 -0
- package/dist/cli/commands/init/config.d.ts +3 -0
- package/dist/cli/commands/init/files.d.ts +12 -0
- package/dist/cli/commands/init/naming.d.ts +13 -0
- package/dist/cli/commands/init/output.d.ts +12 -0
- package/dist/cli/commands/init/setup.d.ts +21 -0
- package/dist/cli/commands/init/types.d.ts +53 -0
- package/dist/cli/commands/init-personas.d.ts +9 -1
- package/dist/cli/commands/init.d.ts +24 -88
- package/dist/cli/commands/market.d.ts +1 -1
- package/dist/cli/commands/mcp-setup.d.ts +1 -4
- package/dist/cli/commands/modify.d.ts +0 -5
- package/dist/cli/commands/openapi.d.ts +9 -11
- package/dist/cli/commands/run.d.ts +0 -4
- package/dist/cli/commands/serve.d.ts +24 -26
- package/dist/cli/commands/status.d.ts +1 -1
- package/dist/cli/exports.d.ts +3 -4
- package/dist/cli/exports.js +124 -23
- package/dist/cli/flow-weaver-agents-H653446S.mjs +81 -0
- package/dist/cli/flow-weaver-artifact-WBFYTW76.mjs +58 -0
- package/dist/cli/flow-weaver-chunk-265CEK74.mjs +2 -0
- package/dist/cli/flow-weaver-chunk-2C7PZCV5.mjs +186 -0
- package/dist/cli/flow-weaver-chunk-3BSYCWPL.mjs +3109 -0
- package/dist/cli/flow-weaver-chunk-3MKUQP3D.mjs +547 -0
- package/dist/cli/flow-weaver-chunk-3ZLMPQTH.mjs +27 -0
- package/dist/cli/flow-weaver-chunk-4DVY73ML.mjs +280 -0
- package/dist/cli/flow-weaver-chunk-54M4KNEL.mjs +200 -0
- package/dist/cli/flow-weaver-chunk-55QMUZIA.mjs +256 -0
- package/dist/cli/flow-weaver-chunk-6ZUJ7LMX.mjs +2003 -0
- package/dist/cli/flow-weaver-chunk-7ET6N32V.mjs +419 -0
- package/dist/cli/flow-weaver-chunk-7G63RR4K.mjs +8880 -0
- package/dist/cli/flow-weaver-chunk-A6M5K3W7.mjs +4418 -0
- package/dist/cli/flow-weaver-chunk-AA3NATMX.mjs +154 -0
- package/dist/cli/flow-weaver-chunk-APX6MQ5A.mjs +5652 -0
- package/dist/cli/flow-weaver-chunk-BHCC5FE5.mjs +17 -0
- package/dist/cli/flow-weaver-chunk-DM4BBRRU.mjs +35 -0
- package/dist/cli/flow-weaver-chunk-DRN7KPWY.mjs +168 -0
- package/dist/cli/flow-weaver-chunk-EKWF27G6.mjs +23 -0
- package/dist/cli/flow-weaver-chunk-EM5HWQ4R.mjs +338 -0
- package/dist/cli/flow-weaver-chunk-FPPPU2DG.mjs +226 -0
- package/dist/cli/flow-weaver-chunk-GAQXZHNO.mjs +3005 -0
- package/dist/cli/flow-weaver-chunk-GBUNNP33.mjs +1329 -0
- package/dist/cli/flow-weaver-chunk-HMAKDE55.mjs +636 -0
- package/dist/cli/flow-weaver-chunk-HQ3ZAN44.mjs +367 -0
- package/dist/cli/flow-weaver-chunk-I4APCXYN.mjs +21442 -0
- package/dist/cli/flow-weaver-chunk-IJJ4JXTL.mjs +2297 -0
- package/dist/cli/flow-weaver-chunk-J7EPZW2I.mjs +33 -0
- package/dist/cli/flow-weaver-chunk-KOEMJHLG.mjs +83 -0
- package/dist/cli/flow-weaver-chunk-M6CBWQKJ.mjs +271 -0
- package/dist/cli/flow-weaver-chunk-MHJ4N652.mjs +1580 -0
- package/dist/cli/flow-weaver-chunk-MKAFQWLP.mjs +202 -0
- package/dist/cli/flow-weaver-chunk-MMV2XGD3.mjs +3291 -0
- package/dist/cli/flow-weaver-chunk-MSI2UJES.mjs +125 -0
- package/dist/cli/flow-weaver-chunk-N767YRAI.mjs +48 -0
- package/dist/cli/flow-weaver-chunk-NQKKWDGF.mjs +56 -0
- package/dist/cli/flow-weaver-chunk-NYZDQYFU.mjs +45 -0
- package/dist/cli/flow-weaver-chunk-OMVWSNHJ.mjs +14 -0
- package/dist/cli/flow-weaver-chunk-PUWZ47H5.mjs +2188 -0
- package/dist/cli/flow-weaver-chunk-QOPRVDES.mjs +46 -0
- package/dist/cli/flow-weaver-chunk-RIWE7YTR.mjs +216 -0
- package/dist/cli/flow-weaver-chunk-S63Q3JIU.mjs +789 -0
- package/dist/cli/flow-weaver-chunk-T7X5A23H.mjs +558 -0
- package/dist/cli/flow-weaver-chunk-TLV3VZUN.mjs +2 -0
- package/dist/cli/flow-weaver-chunk-TS5P3PIN.mjs +194 -0
- package/dist/cli/flow-weaver-chunk-U3EO3X4B.mjs +649 -0
- package/dist/cli/flow-weaver-chunk-UNFS3NQP.mjs +34 -0
- package/dist/cli/flow-weaver-chunk-V6DHWFQG.mjs +2811 -0
- package/dist/cli/flow-weaver-chunk-VXWNLYQU.mjs +9 -0
- package/dist/cli/flow-weaver-chunk-W3YNK26P.mjs +149 -0
- package/dist/cli/flow-weaver-chunk-XG2WKXYZ.mjs +324 -0
- package/dist/cli/flow-weaver-chunk-YLSRZWFK.mjs +2219 -0
- package/dist/cli/flow-weaver-chunk-YVPURWS6.mjs +40 -0
- package/dist/cli/flow-weaver-chunk-Z44JK332.mjs +582 -0
- package/dist/cli/flow-weaver-chunk-Z5ZJPNSY.mjs +517 -0
- package/dist/cli/flow-weaver-chunk-ZQALO25T.mjs +594 -0
- package/dist/cli/flow-weaver-compile-A2CABDSB.mjs +37 -0
- package/dist/cli/flow-weaver-console-6EBHDBTN.mjs +71 -0
- package/dist/cli/flow-weaver-context-ECLYANFF.mjs +17 -0
- package/dist/cli/flow-weaver-context-ZRUMW2KE.mjs +69 -0
- package/dist/cli/flow-weaver-create-WIP4EFNP.mjs +124 -0
- package/dist/cli/flow-weaver-deployment-WJJRK7NO.mjs +14 -0
- package/dist/cli/flow-weaver-describe-XDIFF5LI.mjs +41 -0
- package/dist/cli/flow-weaver-dev-LG2NSQAU.mjs +196 -0
- package/dist/cli/flow-weaver-diagram-3EVQARQE.mjs +52 -0
- package/dist/cli/flow-weaver-diagram-7LR7O4M2.mjs +44 -0
- package/dist/cli/flow-weaver-diff-USF7DJLU.mjs +85 -0
- package/dist/cli/flow-weaver-docs-QU2ZOXKH.mjs +96 -0
- package/dist/cli/flow-weaver-doctor-K447YWHR.mjs +43 -0
- package/dist/cli/flow-weaver-export-LAS6N56Y.mjs +140 -0
- package/dist/cli/flow-weaver-grammar-RIRUS3Q6.mjs +49 -0
- package/dist/cli/flow-weaver-grammar-diagrams-WXRTW5SK.mjs +15 -0
- package/dist/cli/flow-weaver-implement-5JG6BCFZ.mjs +114 -0
- package/dist/cli/flow-weaver-index.min-OR5SIHXD.mjs +39 -0
- package/dist/cli/flow-weaver-init-34YZNPQX.mjs +972 -0
- package/dist/cli/flow-weaver-init-personas-NOGZTQQ2.mjs +48 -0
- package/dist/cli/flow-weaver-manifest-4JNUSEB3.mjs +18 -0
- package/dist/cli/flow-weaver-market-WA4CKHKV.mjs +444 -0
- package/dist/cli/flow-weaver-mcp-setup-O26MGXSD.mjs +22 -0
- package/dist/cli/flow-weaver-migrate-VFVEUTPH.mjs +119 -0
- package/dist/cli/flow-weaver-modify-VM3JP5K6.mjs +97 -0
- package/dist/cli/flow-weaver-openapi-IRBWI3HM.mjs +71 -0
- package/dist/cli/flow-weaver-openapi-document-7N6YMPG3.mjs +30 -0
- package/dist/cli/flow-weaver-pack-commands-OS2QRXAK.mjs +146 -0
- package/dist/cli/flow-weaver-registry-5MLFRPPT.mjs +25 -0
- package/dist/cli/flow-weaver-run-DSTLSTHR.mjs +555 -0
- package/dist/cli/flow-weaver-serialization-node-LE6PCG4M.mjs +50 -0
- package/dist/cli/flow-weaver-serve-NVLCLSOW.mjs +192 -0
- package/dist/cli/flow-weaver-server-7IERLVXE.mjs +2925 -0
- package/dist/cli/flow-weaver-server-KWF4PXYC.mjs +19112 -0
- package/dist/cli/flow-weaver-status-75W2S3YB.mjs +138 -0
- package/dist/cli/flow-weaver-strip-AZPXUYVA.mjs +79 -0
- package/dist/cli/flow-weaver-templates-DSNMB6K7.mjs +72 -0
- package/dist/cli/flow-weaver-validate-A4UWDQN6.mjs +19 -0
- package/dist/cli/flow-weaver-validate-GRBZ5W4C.mjs +296 -0
- package/dist/cli/flow-weaver-validation-registry-BINGUNXX.mjs +9 -0
- package/dist/cli/flow-weaver-validator-TY56CI42.mjs +21 -0
- package/dist/cli/flow-weaver-watch-OPPERXL6.mjs +114 -0
- package/dist/cli/flow-weaver-workflow-executor-6AHYPXAN.mjs +26 -0
- package/dist/cli/flow-weaver.mjs +3557 -89498
- package/dist/cli/index.d.ts +5 -2
- package/dist/cli/pack-commands-needed.d.ts +12 -0
- package/dist/cli/program.d.ts +14 -0
- package/dist/cli/templates/ai/mock-provider.d.ts +1 -1
- package/dist/cli/templates/index.d.ts +1 -8
- package/dist/cli/templates/nodes/agent-router.d.ts +1 -1
- package/dist/cli/templates/nodes/aggregator.d.ts +1 -1
- package/dist/cli/templates/nodes/conversation-memory.d.ts +1 -1
- package/dist/cli/templates/nodes/http.d.ts +1 -1
- package/dist/cli/templates/nodes/human-approval.d.ts +1 -1
- package/dist/cli/templates/nodes/json-extractor.d.ts +1 -1
- package/dist/cli/templates/nodes/llm-call.d.ts +1 -1
- package/dist/cli/templates/nodes/prompt-template.d.ts +1 -1
- package/dist/cli/templates/nodes/rag-retriever.d.ts +1 -1
- package/dist/cli/templates/nodes/tool-executor.d.ts +1 -1
- package/dist/cli/templates/nodes/transformer.d.ts +1 -1
- package/dist/cli/templates/nodes/validator.d.ts +1 -1
- package/dist/cli/templates/shared/approval-types.d.ts +1 -1
- package/dist/cli/templates/shared/case.d.ts +14 -0
- package/dist/cli/templates/shared/llm-types.d.ts +4 -4
- package/dist/cli/templates/workflows/aggregator.d.ts +1 -1
- package/dist/cli/templates/workflows/ai-agent.d.ts +1 -1
- package/dist/cli/templates/workflows/ai-chat.d.ts +1 -1
- package/dist/cli/templates/workflows/ai-rag.d.ts +1 -1
- package/dist/cli/templates/workflows/ai-react.d.ts +1 -1
- package/dist/cli/templates/workflows/approval.d.ts +10 -0
- package/dist/cli/templates/workflows/conditional.d.ts +2 -2
- package/dist/cli/templates/workflows/error-handler.d.ts +2 -2
- package/dist/cli/templates/workflows/foreach.d.ts +1 -1
- package/dist/cli/templates/workflows/sequential.d.ts +1 -1
- package/dist/cli/templates/workflows/webhook.d.ts +1 -1
- package/dist/cli/utils/interactive.d.ts +6 -0
- package/dist/cli/utils/json-option.d.ts +8 -0
- package/dist/cli/utils/logger.d.ts +2 -0
- package/dist/compiler/durable-source-proof.d.ts +23 -0
- package/dist/compiler/executable-artifact.d.ts +29 -0
- package/dist/compiler/index.d.ts +4 -0
- package/dist/compiler/index.js +36 -0
- package/dist/console/app.js +106 -0
- package/dist/console/assets/synergenius.svg +18 -0
- package/dist/console/author.d.ts +32 -0
- package/dist/console/cli-catalog.d.ts +21 -0
- package/dist/console/cli-run.d.ts +35 -0
- package/dist/console/cli-run.js +46 -0
- package/dist/console/debug.d.ts +67 -0
- package/dist/console/diff-view.d.ts +96 -0
- package/dist/console/export.d.ts +36 -0
- package/dist/console/git.d.ts +27 -0
- package/dist/console/index.d.ts +4 -0
- package/dist/console/index.html +16 -0
- package/dist/console/index.js +203 -0
- package/dist/console/packs.d.ts +100 -0
- package/dist/console/request-guard.d.ts +10 -0
- package/dist/console/respond.d.ts +16 -0
- package/dist/console/router.d.ts +64 -0
- package/dist/console/routes-agents.d.ts +14 -0
- package/dist/console/routes-project.d.ts +3 -0
- package/dist/console/routes-runs.d.ts +3 -0
- package/dist/console/routes-services.d.ts +7 -0
- package/dist/console/routes-tools.d.ts +3 -0
- package/dist/console/runs.d.ts +69 -0
- package/dist/console/scan.d.ts +49 -0
- package/dist/console/schema.d.ts +74 -0
- package/dist/console/server.d.ts +34 -0
- package/dist/console/server.js +43264 -0
- package/dist/console/services.d.ts +119 -0
- package/dist/console/source.d.ts +23 -0
- package/dist/console/status.d.ts +68 -0
- package/dist/console/styles.css +1023 -0
- package/dist/console/terminals.d.ts +22 -0
- package/dist/console/workflow-view.d.ts +153 -0
- package/dist/constants.d.ts +5 -1
- package/dist/constants.js +56 -167
- package/dist/context/index.d.ts +10 -0
- package/dist/context/index.js +14 -191
- package/dist/coordinator/agent-gate.d.ts +107 -0
- package/dist/coordinator/bundle-digest.d.ts +20 -0
- package/dist/coordinator/clock-tick.d.ts +4 -0
- package/dist/coordinator/effect-receipts.d.ts +10 -0
- package/dist/coordinator/errors.d.ts +31 -0
- package/dist/coordinator/file-store.d.ts +3 -0
- package/dist/coordinator/gate-labeling.d.ts +33 -0
- package/dist/coordinator/gate-resolution.d.ts +28 -0
- package/dist/coordinator/index.d.ts +12 -0
- package/dist/coordinator/index.js +107 -0
- package/dist/coordinator/memory-store.d.ts +3 -0
- package/dist/coordinator/params.d.ts +18 -0
- package/dist/coordinator/run-annotations.d.ts +6 -0
- package/dist/coordinator/run-context.d.ts +11 -0
- package/dist/coordinator/run-ending.d.ts +5 -0
- package/dist/coordinator/run-outcome.d.ts +31 -0
- package/dist/coordinator/run-resume.d.ts +6 -0
- package/dist/coordinator/run-start.d.ts +4 -0
- package/dist/coordinator/run-store.d.ts +275 -0
- package/dist/coordinator/run-trace.d.ts +41 -0
- package/dist/coordinator/run-views.d.ts +12 -0
- package/dist/coordinator/runs-dir.d.ts +26 -0
- package/dist/coordinator/store.d.ts +67 -0
- package/dist/coordinator/time.d.ts +39 -0
- package/dist/coordinator/workflow-selection.d.ts +6 -0
- package/dist/deployment/index.d.ts +11 -16
- package/dist/deployment/index.js +541 -50
- package/dist/deployment/targets/base.d.ts +11 -13
- package/dist/deployment/targets/openapi-parts.d.ts +92 -0
- package/dist/diagram/arms.d.ts +70 -0
- package/dist/diagram/ascii-renderer.d.ts +1 -1
- package/dist/diagram/geometry.d.ts +22 -29
- package/dist/diagram/graph/bounds.d.ts +30 -0
- package/dist/diagram/graph/metrics.d.ts +21 -0
- package/dist/diagram/graph/nodes.d.ts +33 -0
- package/dist/diagram/graph/placement.d.ts +22 -0
- package/dist/diagram/graph/ports.d.ts +23 -0
- package/dist/diagram/graph/routing.d.ts +40 -0
- package/dist/diagram/graph/scopes.d.ts +30 -0
- package/dist/diagram/index.d.ts +15 -23
- package/dist/diagram/index.js +632 -111
- package/dist/diagram/labels.d.ts +12 -0
- package/dist/diagram/lanes.d.ts +93 -0
- package/dist/diagram/layout.d.ts +1 -1
- package/dist/diagram/material-symbols.d.ts +7 -0
- package/dist/diagram/orthogonal-router.d.ts +15 -51
- package/dist/diagram/process-view.d.ts +79 -0
- package/dist/diagram/spine.d.ts +25 -0
- package/dist/diagram/theme.d.ts +3 -5
- package/dist/diagram/types.d.ts +6 -20
- package/dist/diff/index.js +53 -9
- package/dist/diff/types.d.ts +1 -5
- package/dist/doc-metadata/extractors/annotations.d.ts +0 -4
- package/dist/doc-metadata/extractors/cli-commands.d.ts +2 -1
- package/dist/doc-metadata/extractors/core-metadata.d.ts +19 -4
- package/dist/doc-metadata/extractors/error-codes.d.ts +1 -1
- package/dist/doc-metadata/extractors/mcp-tools.d.ts +7 -3
- package/dist/doc-metadata/index.d.ts +1 -2
- package/dist/doc-metadata/index.js +2368 -9
- package/dist/doc-metadata/types.d.ts +7 -24
- package/dist/docs/guide.d.ts +33 -0
- package/dist/docs/index.d.ts +7 -4
- package/dist/docs/index.js +298 -298
- package/dist/docs/pack-topics.d.ts +18 -0
- package/dist/editor-completions/annotationValues.d.ts +1 -1
- package/dist/editor-completions/contextParser.d.ts +3 -2
- package/dist/editor-completions/dataTypes.d.ts +1 -1
- package/dist/editor-completions/goToDefinition.d.ts +1 -1
- package/dist/editor-completions/index.d.ts +8 -8
- package/dist/editor-completions/index.js +1244 -175
- package/dist/editor-completions/jsDocAnnotations.d.ts +1 -1
- package/dist/editor-completions/modifierCompletions.d.ts +1 -1
- package/dist/export/index.d.ts +7 -1
- package/dist/generated-branding.js +8 -21
- package/dist/generated-version.d.ts +1 -1
- package/dist/generated-version.js +7 -3
- package/dist/generator/annotation-generator.d.ts +84 -0
- package/dist/generator/async-detection.d.ts +1 -1
- package/dist/{body-generator.d.ts → generator/body-generator.d.ts} +7 -3
- package/dist/generator/code-utils.d.ts +15 -60
- package/dist/generator/connection-reads.d.ts +94 -0
- package/dist/generator/control-flow-plan.d.ts +74 -0
- package/dist/generator/control-flow.d.ts +1 -1
- package/dist/generator/exit-assembly.d.ts +11 -0
- package/dist/generator/index.d.ts +4 -5
- package/dist/generator/index.js +34 -11
- package/dist/generator/input-port-values.d.ts +22 -0
- package/dist/generator/{scope-function-generator.d.ts → node-arguments.d.ts} +76 -1
- package/dist/generator/node-invocation.d.ts +74 -0
- package/dist/{node-types-generator.d.ts → generator/node-types-generator.d.ts} +3 -2
- package/dist/generator/scope-closure.d.ts +23 -0
- package/dist/generator/scoped-child.d.ts +49 -0
- package/dist/{sugar-optimizer.d.ts → generator/sugar-optimizer.d.ts} +1 -1
- package/dist/generator/unified.d.ts +14 -2
- package/dist/generator/workflow-generator.d.ts +37 -0
- package/dist/index.d.ts +29 -26
- package/dist/index.js +1322 -92
- package/dist/jsdoc-port-sync/apply-diff.d.ts +15 -0
- package/dist/jsdoc-port-sync/callback-signature.d.ts +17 -0
- package/dist/jsdoc-port-sync/diff.d.ts +5 -7
- package/dist/jsdoc-port-sync/incomplete-lines.d.ts +41 -0
- package/dist/jsdoc-port-sync/index.d.ts +11 -11
- package/dist/jsdoc-port-sync/index.js +88 -45
- package/dist/jsdoc-port-sync/jsdoc-to-signature.d.ts +66 -0
- package/dist/jsdoc-port-sync/port-parser.d.ts +6 -24
- package/dist/jsdoc-port-sync/port-tag-placement.d.ts +55 -0
- package/dist/jsdoc-port-sync/scoped-ports.d.ts +21 -0
- package/dist/jsdoc-port-sync/signature-parser.d.ts +8 -1
- package/dist/jsdoc-port-sync/signature-to-jsdoc.d.ts +77 -0
- package/dist/jsdoc-port-sync/sync.d.ts +4 -1
- package/dist/marketplace/index.d.ts +5 -3
- package/dist/marketplace/index.js +62 -10
- package/dist/marketplace/install.d.ts +24 -0
- package/dist/marketplace/manifest.d.ts +1 -1
- package/dist/marketplace/npmrc.d.ts +24 -0
- package/dist/marketplace/registry.d.ts +46 -11
- package/dist/marketplace/types.d.ts +41 -24
- package/dist/marketplace/validator.d.ts +1 -1
- package/dist/mcp/debug-session.d.ts +2 -4
- package/dist/mcp/dist-imports.d.ts +12 -0
- package/dist/mcp/response-utils.d.ts +11 -9
- package/dist/mcp/server.d.ts +0 -1
- package/dist/mcp/tools-context.d.ts +11 -0
- package/dist/mcp/tools-diagram.d.ts +1 -2
- package/dist/mcp/tools-export.d.ts +2 -2
- package/dist/mcp/tools-marketplace.d.ts +1 -1
- package/dist/mcp/tools-run.d.ts +17 -0
- package/dist/mcp/tools-workflow.d.ts +3 -0
- package/dist/mcp/types.d.ts +4 -14
- package/dist/mcp/workflow-executor.d.ts +57 -19
- package/dist/npm-packages.d.ts +1 -1
- package/dist/npm-packages.js +10 -473
- package/dist/parser/annotation-parser.d.ts +88 -0
- package/dist/parser/annotation-suggestion.d.ts +23 -0
- package/dist/parser/durable-effect-contract.d.ts +10 -0
- package/dist/parser/expression-references.d.ts +101 -0
- package/dist/parser/external-node-types.d.ts +69 -0
- package/dist/{function-like.d.ts → parser/function-like.d.ts} +10 -3
- package/dist/parser/generated-sections.d.ts +25 -0
- package/dist/parser/import-resolution.d.ts +67 -0
- package/dist/parser/import-stub.d.ts +29 -0
- package/dist/parser/jsdoc/config-types.d.ts +209 -0
- package/dist/parser/jsdoc/graph-tags.d.ts +54 -0
- package/dist/parser/jsdoc/node-type-block.d.ts +23 -0
- package/dist/parser/jsdoc/parse-line-once.d.ts +11 -0
- package/dist/parser/jsdoc/port-tags.d.ts +42 -0
- package/dist/parser/jsdoc/runtime-tags.d.ts +65 -0
- package/dist/parser/jsdoc/signature-types.d.ts +52 -0
- package/dist/parser/jsdoc/workflow-block.d.ts +22 -0
- package/dist/parser/jsdoc-parser.d.ts +23 -0
- package/dist/parser/macro-expansion.d.ts +80 -0
- package/dist/parser/module-resolution.d.ts +38 -0
- package/dist/parser/node-inference.d.ts +39 -0
- package/dist/parser/npm-node-types.d.ts +24 -0
- package/dist/parser/pack-handlers.d.ts +12 -0
- package/dist/parser/path-data-resolution.d.ts +75 -0
- package/dist/parser/port-inference.d.ts +15 -0
- package/dist/{resolve-package-types.d.ts → parser/resolve-package-types.d.ts} +4 -0
- package/dist/parser/serialize-deploy-annotations.d.ts +19 -0
- package/dist/parser/tag-registry.d.ts +22 -0
- package/dist/parser/workflow-extraction.d.ts +39 -0
- package/dist/runtime/ExecutionContext.d.ts +87 -99
- package/dist/runtime/continuation-core.d.ts +147 -0
- package/dist/runtime/continuation.d.ts +48 -0
- package/dist/runtime/debug-controller.d.ts +7 -22
- package/dist/runtime/durable-execution.d.ts +176 -0
- package/dist/runtime/events.d.ts +16 -1
- package/dist/runtime/executable-module-contract.d.ts +16 -0
- package/dist/runtime/index.d.ts +13 -10
- package/dist/runtime/index.js +947 -9
- package/dist/runtime/strict-json.d.ts +15 -0
- package/dist/server/access.d.ts +12 -0
- package/dist/server/api.d.ts +126 -0
- package/dist/server/callback-delivery.d.ts +62 -0
- package/dist/server/callback-url.d.ts +44 -0
- package/dist/server/context.d.ts +35 -0
- package/dist/server/http-error.d.ts +10 -0
- package/dist/server/index.d.ts +7 -1
- package/dist/server/index.js +125 -6
- package/dist/server/openapi-document.d.ts +33 -0
- package/dist/server/openapi.d.ts +32 -0
- package/dist/server/respond.d.ts +35 -0
- package/dist/server/route-params.d.ts +17 -0
- package/dist/server/route-plan.d.ts +41 -0
- package/dist/server/routes-catalog.d.ts +5 -0
- package/dist/server/routes-declared.d.ts +12 -0
- package/dist/server/routes-runs.d.ts +8 -0
- package/dist/server/run-driver.d.ts +58 -0
- package/dist/server/run-view.d.ts +26 -0
- package/dist/server/transport.d.ts +35 -0
- package/dist/server/types.d.ts +143 -52
- package/dist/server/webhook-server.d.ts +12 -38
- package/dist/server/workflow-registry.d.ts +7 -4
- package/dist/service-registry.d.ts +49 -0
- package/dist/service-registry.js +123 -0
- package/dist/testing/assertions.d.ts +2 -2
- package/dist/testing/index.d.ts +14 -13
- package/dist/testing/index.js +582 -24
- package/dist/testing/mock-approval.d.ts +3 -5
- package/dist/testing/mock-llm.d.ts +2 -3
- package/dist/testing/recorder.d.ts +5 -6
- package/dist/testing/replayer.d.ts +6 -7
- package/dist/testing/run-store-check.d.ts +3 -0
- package/dist/testing/token-tracker.d.ts +2 -2
- package/dist/{type-mappings.d.ts → types/type-mappings.d.ts} +13 -1
- package/dist/utils/error-utils.d.ts +4 -2
- package/dist/utils/port-ordering.d.ts +2 -2
- package/dist/utils/port-tag-utils.d.ts +1 -1
- package/dist/validation/agent-detection.d.ts +17 -5
- package/dist/validation/agent-rules.d.ts +6 -7
- package/dist/validation/core-rules.d.ts +49 -0
- package/dist/validation/design-rules.d.ts +9 -3
- package/dist/validation/rule-registry.d.ts +3 -3
- package/dist/validation/rules/connections.d.ts +27 -0
- package/dist/validation/rules/context.d.ts +11 -0
- package/dist/validation/rules/cycles.d.ts +17 -0
- package/dist/validation/rules/data-flow.d.ts +19 -0
- package/dist/validation/rules/scope-topology.d.ts +35 -0
- package/dist/validation/rules/type-compatibility.d.ts +30 -0
- package/dist/validation/type-checker.d.ts +39 -0
- package/dist/validation/validator-helpers.d.ts +31 -0
- package/dist/validation/validator.d.ts +30 -0
- package/docs/reference/advanced-annotations.md +277 -60
- package/docs/reference/built-in-nodes.md +164 -94
- package/docs/reference/cancellation.md +44 -0
- package/docs/reference/cli-reference.md +252 -234
- package/docs/reference/compilation.md +36 -109
- package/docs/reference/concepts.md +80 -63
- package/docs/reference/console.md +169 -0
- package/docs/reference/debugging.md +26 -57
- package/docs/reference/deployment.md +217 -143
- package/docs/reference/durable-gates.md +445 -0
- package/docs/reference/error-codes.md +90 -43
- package/docs/reference/export-interface.md +91 -26
- package/docs/reference/iterative-development.md +50 -28
- package/docs/reference/jsdoc-grammar.md +66 -311
- package/docs/reference/library.md +250 -0
- package/docs/reference/marketplace.md +301 -152
- package/docs/reference/mcp-tools.md +102 -0
- package/docs/reference/node-conversion.md +84 -59
- package/docs/reference/orientation.md +68 -0
- package/docs/reference/scaffold.md +5 -4
- package/docs/reference/tutorial.md +106 -166
- package/docs/reference/visual-reference.md +1 -1
- package/package.json +85 -50
- package/dist/agent/agent-loop.js +0 -156
- package/dist/agent/cli-spawn-config.js +0 -65
- package/dist/agent/device-connection.d.ts +0 -79
- package/dist/agent/device-connection.js +0 -184
- package/dist/agent/env-allowlist.js +0 -60
- package/dist/agent/providers/anthropic.js +0 -198
- package/dist/agent/providers/claude-cli.js +0 -161
- package/dist/agent/providers/openai-compat.js +0 -205
- package/dist/agent/providers/platform.d.ts +0 -23
- package/dist/agent/providers/platform.js +0 -132
- package/dist/agent/streaming.js +0 -186
- package/dist/agent/types.js +0 -20
- package/dist/annotation-generator.d.ts +0 -50
- package/dist/annotation-generator.js +0 -743
- package/dist/api/builder.js +0 -345
- package/dist/api/command-runner.js +0 -787
- package/dist/api/compile.js +0 -148
- package/dist/api/extract-types.js +0 -57
- package/dist/api/generate-in-place.js +0 -1477
- package/dist/api/generate.js +0 -514
- package/dist/api/helpers.js +0 -285
- package/dist/api/inline-runtime.js +0 -526
- package/dist/api/manipulation/connections.js +0 -151
- package/dist/api/manipulation/index.js +0 -41
- package/dist/api/manipulation/node-types.js +0 -200
- package/dist/api/manipulation/nodes.js +0 -355
- package/dist/api/manipulation/ports.js +0 -228
- package/dist/api/manipulation/scopes.js +0 -156
- package/dist/api/manipulation/workflow.js +0 -116
- package/dist/api/modify-operation.js +0 -177
- package/dist/api/parse.js +0 -115
- package/dist/api/patterns.d.ts +0 -112
- package/dist/api/patterns.js +0 -303
- package/dist/api/query.js +0 -840
- package/dist/api/templates.js +0 -117
- package/dist/api/transform.js +0 -40
- package/dist/api/validate.js +0 -64
- package/dist/api/validation-registry.js +0 -10
- package/dist/api/workflow-file-operations.js +0 -180
- package/dist/ast/builder.js +0 -395
- package/dist/ast/serialization-node.js +0 -30
- package/dist/ast/serialization.js +0 -134
- package/dist/ast/types.js +0 -2
- package/dist/ast/workflow-utils.js +0 -114
- package/dist/body-generator.js +0 -35
- package/dist/built-in-nodes/coercion-types.js +0 -61
- package/dist/built-in-nodes/delay.js +0 -29
- package/dist/built-in-nodes/generated-registry.js +0 -299
- package/dist/built-in-nodes/invoke-workflow.js +0 -36
- package/dist/built-in-nodes/mock-types.js +0 -42
- package/dist/built-in-nodes/wait-for-agent.js +0 -31
- package/dist/built-in-nodes/wait-for-event.js +0 -25
- package/dist/chevrotain-parser/coerce-parser.js +0 -103
- package/dist/chevrotain-parser/connect-parser.js +0 -136
- package/dist/chevrotain-parser/fan-parser.js +0 -149
- package/dist/chevrotain-parser/grammar-diagrams.js +0 -273
- package/dist/chevrotain-parser/index.js +0 -31
- package/dist/chevrotain-parser/map-parser.js +0 -130
- package/dist/chevrotain-parser/node-parser.js +0 -558
- package/dist/chevrotain-parser/path-parser.js +0 -140
- package/dist/chevrotain-parser/port-parser.js +0 -519
- package/dist/chevrotain-parser/position-parser.d.ts +0 -20
- package/dist/chevrotain-parser/position-parser.js +0 -83
- package/dist/chevrotain-parser/scope-parser.js +0 -104
- package/dist/chevrotain-parser/tokens.js +0 -429
- package/dist/chevrotain-parser/trigger-cancel-parser.js +0 -291
- package/dist/cli/commands/account.d.ts +0 -4
- package/dist/cli/commands/account.js +0 -50
- package/dist/cli/commands/ai-credentials.d.ts +0 -12
- package/dist/cli/commands/ai-credentials.js +0 -95
- package/dist/cli/commands/apikey.d.ts +0 -4
- package/dist/cli/commands/apikey.js +0 -64
- package/dist/cli/commands/auth.d.ts +0 -9
- package/dist/cli/commands/auth.js +0 -255
- package/dist/cli/commands/compile.js +0 -331
- package/dist/cli/commands/connect.d.ts +0 -4
- package/dist/cli/commands/connect.js +0 -163
- package/dist/cli/commands/context.js +0 -51
- package/dist/cli/commands/create.js +0 -139
- package/dist/cli/commands/deploy.d.ts +0 -6
- package/dist/cli/commands/deploy.js +0 -74
- package/dist/cli/commands/dev.js +0 -227
- package/dist/cli/commands/diagram.js +0 -39
- package/dist/cli/commands/diff.js +0 -57
- package/dist/cli/commands/docs.js +0 -74
- package/dist/cli/commands/export.js +0 -153
- package/dist/cli/commands/grammar.js +0 -40
- package/dist/cli/commands/implement.js +0 -91
- package/dist/cli/commands/init-personas.js +0 -541
- package/dist/cli/commands/init.js +0 -797
- package/dist/cli/commands/market.js +0 -440
- package/dist/cli/commands/mcp-setup.js +0 -433
- package/dist/cli/commands/migrate.js +0 -91
- package/dist/cli/commands/modify.js +0 -58
- package/dist/cli/commands/openapi.js +0 -71
- package/dist/cli/commands/org.d.ts +0 -8
- package/dist/cli/commands/org.js +0 -136
- package/dist/cli/commands/pattern.d.ts +0 -34
- package/dist/cli/commands/pattern.js +0 -186
- package/dist/cli/commands/plugin.d.ts +0 -16
- package/dist/cli/commands/plugin.js +0 -176
- package/dist/cli/commands/run.js +0 -742
- package/dist/cli/commands/serve.js +0 -93
- package/dist/cli/commands/status.js +0 -123
- package/dist/cli/commands/strip.js +0 -61
- package/dist/cli/commands/templates.js +0 -58
- package/dist/cli/commands/validate.js +0 -267
- package/dist/cli/commands/watch.js +0 -71
- package/dist/cli/config/credentials.d.ts +0 -15
- package/dist/cli/config/credentials.js +0 -43
- package/dist/cli/config/platform-client.d.ts +0 -123
- package/dist/cli/config/platform-client.js +0 -248
- package/dist/cli/env-setup.js +0 -12
- package/dist/cli/index.js +0 -850
- package/dist/cli/pack-commands.js +0 -122
- package/dist/cli/postinstall.d.ts +0 -16
- package/dist/cli/postinstall.js +0 -119
- package/dist/cli/templates/ai/mock-provider.js +0 -64
- package/dist/cli/templates/ai/types.js +0 -5
- package/dist/cli/templates/approvals/index.d.ts +0 -15
- package/dist/cli/templates/approvals/index.js +0 -241
- package/dist/cli/templates/index.js +0 -123
- package/dist/cli/templates/nodes/agent-router.js +0 -114
- package/dist/cli/templates/nodes/aggregator.js +0 -63
- package/dist/cli/templates/nodes/conversation-memory.js +0 -85
- package/dist/cli/templates/nodes/http.js +0 -80
- package/dist/cli/templates/nodes/human-approval.js +0 -109
- package/dist/cli/templates/nodes/json-extractor.js +0 -119
- package/dist/cli/templates/nodes/llm-call.js +0 -106
- package/dist/cli/templates/nodes/prompt-template.js +0 -52
- package/dist/cli/templates/nodes/rag-retriever.js +0 -128
- package/dist/cli/templates/nodes/tool-executor.js +0 -108
- package/dist/cli/templates/nodes/transformer.js +0 -68
- package/dist/cli/templates/nodes/validator.js +0 -62
- package/dist/cli/templates/pack-loader.js +0 -58
- package/dist/cli/templates/providers/index.js +0 -239
- package/dist/cli/templates/shared/approval-types.js +0 -31
- package/dist/cli/templates/shared/llm-types.js +0 -109
- package/dist/cli/templates/workflows/aggregator.js +0 -101
- package/dist/cli/templates/workflows/ai-agent.js +0 -326
- package/dist/cli/templates/workflows/ai-chat.js +0 -167
- package/dist/cli/templates/workflows/ai-rag.js +0 -184
- package/dist/cli/templates/workflows/ai-react.js +0 -293
- package/dist/cli/templates/workflows/conditional.js +0 -139
- package/dist/cli/templates/workflows/error-handler.js +0 -145
- package/dist/cli/templates/workflows/foreach.js +0 -140
- package/dist/cli/templates/workflows/sequential.js +0 -200
- package/dist/cli/templates/workflows/webhook.js +0 -158
- package/dist/cli/utils/cli-helpers.d.ts +0 -44
- package/dist/cli/utils/cli-helpers.js +0 -99
- package/dist/cli/utils/logger.js +0 -126
- package/dist/cli/utils/parse-int-strict.js +0 -17
- package/dist/cli/utils/safe-write.js +0 -54
- package/dist/deployment/config/defaults.d.ts +0 -29
- package/dist/deployment/config/defaults.js +0 -98
- package/dist/deployment/config/loader.d.ts +0 -24
- package/dist/deployment/config/loader.js +0 -237
- package/dist/deployment/config/types.d.ts +0 -117
- package/dist/deployment/config/types.js +0 -5
- package/dist/deployment/core/adapters.d.ts +0 -66
- package/dist/deployment/core/adapters.js +0 -156
- package/dist/deployment/core/executor.d.ts +0 -62
- package/dist/deployment/core/executor.js +0 -197
- package/dist/deployment/core/formatters.d.ts +0 -42
- package/dist/deployment/core/formatters.js +0 -146
- package/dist/deployment/openapi/generator.d.ts +0 -146
- package/dist/deployment/openapi/generator.js +0 -347
- package/dist/deployment/openapi/schema-converter.d.ts +0 -49
- package/dist/deployment/openapi/schema-converter.js +0 -192
- package/dist/deployment/targets/base.js +0 -855
- package/dist/deployment/types.d.ts +0 -140
- package/dist/deployment/types.js +0 -8
- package/dist/diagram/ascii-renderer.js +0 -528
- package/dist/diagram/geometry.js +0 -1267
- package/dist/diagram/html-viewer.d.ts +0 -21
- package/dist/diagram/html-viewer.js +0 -1689
- package/dist/diagram/layout.js +0 -143
- package/dist/diagram/orthogonal-router.js +0 -568
- package/dist/diagram/renderer.d.ts +0 -3
- package/dist/diagram/renderer.js +0 -266
- package/dist/diagram/theme.js +0 -282
- package/dist/diagram/types.js +0 -2
- package/dist/diff/WorkflowDiffer.js +0 -429
- package/dist/diff/formatDiff.js +0 -239
- package/dist/diff/impact.js +0 -119
- package/dist/diff/types.js +0 -35
- package/dist/doc-metadata/extractors/annotations.js +0 -638
- package/dist/doc-metadata/extractors/cli-commands.js +0 -326
- package/dist/doc-metadata/extractors/core-metadata.js +0 -61
- package/dist/doc-metadata/extractors/error-codes.js +0 -372
- package/dist/doc-metadata/extractors/grammar-rules.js +0 -51
- package/dist/doc-metadata/extractors/mcp-tools.js +0 -705
- package/dist/doc-metadata/extractors/plugin-api.d.ts +0 -19
- package/dist/doc-metadata/extractors/plugin-api.js +0 -279
- package/dist/doc-metadata/types.js +0 -5
- package/dist/editor-completions/annotationValues.js +0 -146
- package/dist/editor-completions/contextParser.js +0 -410
- package/dist/editor-completions/dataTypes.js +0 -95
- package/dist/editor-completions/goToDefinition.js +0 -112
- package/dist/editor-completions/jsDocAnnotations.js +0 -359
- package/dist/editor-completions/modifierCompletions.js +0 -197
- package/dist/editor-completions/types.js +0 -8
- package/dist/export/index.js +0 -212
- package/dist/extensions/index.d.ts +0 -16
- package/dist/extensions/index.js +0 -17
- package/dist/friendly-errors.js +0 -761
- package/dist/function-like.js +0 -84
- package/dist/generator/async-detection.js +0 -56
- package/dist/generator/code-utils.js +0 -551
- package/dist/generator/compile-target-registry.d.ts +0 -20
- package/dist/generator/compile-target-registry.js +0 -20
- package/dist/generator/control-flow.js +0 -358
- package/dist/generator/dev-mode-registry.d.ts +0 -27
- package/dist/generator/dev-mode-registry.js +0 -20
- package/dist/generator/scope-function-generator.js +0 -397
- package/dist/generator/unified.js +0 -1831
- package/dist/generator.d.ts +0 -54
- package/dist/generator.js +0 -101
- package/dist/jsdoc-parser.d.ts +0 -377
- package/dist/jsdoc-parser.js +0 -1189
- package/dist/jsdoc-port-sync/constants.js +0 -103
- package/dist/jsdoc-port-sync/diff.js +0 -319
- package/dist/jsdoc-port-sync/port-parser.js +0 -579
- package/dist/jsdoc-port-sync/rename.js +0 -256
- package/dist/jsdoc-port-sync/signature-parser.js +0 -559
- package/dist/jsdoc-port-sync/sync.js +0 -653
- package/dist/marketplace/manifest.js +0 -194
- package/dist/marketplace/registry.js +0 -198
- package/dist/marketplace/types.js +0 -9
- package/dist/marketplace/validator.js +0 -150
- package/dist/mcp/agent-channel.d.ts +0 -35
- package/dist/mcp/agent-channel.js +0 -61
- package/dist/mcp/auto-registration.d.ts +0 -3
- package/dist/mcp/auto-registration.js +0 -62
- package/dist/mcp/debug-session.js +0 -25
- package/dist/mcp/index.d.ts +0 -11
- package/dist/mcp/index.js +0 -10
- package/dist/mcp/pack-tools.js +0 -59
- package/dist/mcp/prompts.js +0 -68
- package/dist/mcp/response-utils.js +0 -97
- package/dist/mcp/run-registry.d.ts +0 -29
- package/dist/mcp/run-registry.js +0 -24
- package/dist/mcp/server.js +0 -63
- package/dist/mcp/tools-context.js +0 -51
- package/dist/mcp/tools-debug.js +0 -451
- package/dist/mcp/tools-diagram.js +0 -97
- package/dist/mcp/tools-docs.js +0 -62
- package/dist/mcp/tools-export.js +0 -222
- package/dist/mcp/tools-marketplace.js +0 -132
- package/dist/mcp/tools-model.d.ts +0 -3
- package/dist/mcp/tools-model.js +0 -279
- package/dist/mcp/tools-pattern.d.ts +0 -3
- package/dist/mcp/tools-pattern.js +0 -604
- package/dist/mcp/tools-query.js +0 -377
- package/dist/mcp/tools-resources.js +0 -41
- package/dist/mcp/tools-template.js +0 -119
- package/dist/mcp/tools-workflow-run.d.ts +0 -40
- package/dist/mcp/tools-workflow-run.js +0 -150
- package/dist/mcp/types.js +0 -2
- package/dist/mcp/workflow-executor.js +0 -242
- package/dist/migration/registry.js +0 -29
- package/dist/node-types-generator.js +0 -139
- package/dist/parser/tag-registry.js +0 -57
- package/dist/parser.d.ts +0 -232
- package/dist/parser.js +0 -2500
- package/dist/plugin/PluginPanel.d.ts +0 -12
- package/dist/plugin/PluginPanel.js +0 -5
- package/dist/plugin/index.d.ts +0 -13
- package/dist/plugin/index.js +0 -14
- package/dist/plugin/types.d.ts +0 -75
- package/dist/plugin/types.js +0 -8
- package/dist/resolve-package-types.js +0 -123
- package/dist/runtime/CancellationError.js +0 -20
- package/dist/runtime/ExecutionContext.js +0 -280
- package/dist/runtime/builtin-functions.js +0 -549
- package/dist/runtime/checkpoint.d.ts +0 -84
- package/dist/runtime/checkpoint.js +0 -225
- package/dist/runtime/debug-controller.js +0 -247
- package/dist/runtime/events.js +0 -2
- package/dist/runtime/function-registry.js +0 -66
- package/dist/runtime/parameter-resolver.js +0 -113
- package/dist/server/types.js +0 -5
- package/dist/server/webhook-server.js +0 -269
- package/dist/server/workflow-registry.js +0 -202
- package/dist/shared-project.js +0 -28
- package/dist/sugar-optimizer.js +0 -498
- package/dist/testing/assertions.js +0 -127
- package/dist/testing/mock-approval.js +0 -98
- package/dist/testing/mock-llm.js +0 -119
- package/dist/testing/recorder.js +0 -70
- package/dist/testing/replayer.js +0 -143
- package/dist/testing/token-tracker.js +0 -94
- package/dist/type-checker.d.ts +0 -42
- package/dist/type-checker.js +0 -190
- package/dist/type-mappings.js +0 -131
- package/dist/types/branded-ports.d.ts +0 -151
- package/dist/types/branded-ports.js +0 -121
- package/dist/types/index.d.ts +0 -5
- package/dist/types/index.js +0 -5
- package/dist/types.d.ts +0 -139
- package/dist/types.js +0 -15
- package/dist/utils/error-utils.js +0 -27
- package/dist/utils/lru-cache.js +0 -40
- package/dist/utils/port-ordering.js +0 -81
- package/dist/utils/port-tag-utils.js +0 -41
- package/dist/utils/string-distance.js +0 -56
- package/dist/validation/agent-detection.js +0 -115
- package/dist/validation/agent-rules.js +0 -262
- package/dist/validation/design-rules.js +0 -377
- package/dist/validation/rule-registry.js +0 -37
- package/dist/validator.d.ts +0 -113
- package/dist/validator.js +0 -1631
- package/docs/reference/patterns.md +0 -159
- package/scripts/postinstall.cjs +0 -86
- /package/dist/{shared-project.d.ts → parser/shared-project.d.ts} +0 -0
- /package/dist/{friendly-errors.d.ts → validation/friendly-errors.d.ts} +0 -0
|
@@ -0,0 +1,1329 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "module";
|
|
2
|
+
const require = __createRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
getAvailableWorkflows
|
|
5
|
+
} from "./flow-weaver-chunk-NQKKWDGF.mjs";
|
|
6
|
+
import {
|
|
7
|
+
compileWorkflow
|
|
8
|
+
} from "./flow-weaver-chunk-V6DHWFQG.mjs";
|
|
9
|
+
import {
|
|
10
|
+
CONTINUATION_FORMAT_VERSION,
|
|
11
|
+
ENGINE_VERSION,
|
|
12
|
+
GENERATOR_ABI,
|
|
13
|
+
MAX_CONTINUATION_BYTES,
|
|
14
|
+
MAX_CONTINUATION_DEPTH,
|
|
15
|
+
MAX_CONTINUATION_ENTRIES,
|
|
16
|
+
MAX_CONTINUATION_STRING_BYTES,
|
|
17
|
+
WireValidationError,
|
|
18
|
+
acceptContinuation,
|
|
19
|
+
assertAcceptedContinuation,
|
|
20
|
+
canonicalWireValue,
|
|
21
|
+
cloneAndFreezeWireValue,
|
|
22
|
+
continuationChecksum,
|
|
23
|
+
createContinuationEnvelope,
|
|
24
|
+
durableGateId,
|
|
25
|
+
executionAddressKey,
|
|
26
|
+
graphIdentity,
|
|
27
|
+
hasExactlyTheKeys,
|
|
28
|
+
isPlainObjectRecord,
|
|
29
|
+
operationKey,
|
|
30
|
+
sha256Hex,
|
|
31
|
+
structurallyValidEnvelope,
|
|
32
|
+
utf8ByteLength,
|
|
33
|
+
validateWireValue
|
|
34
|
+
} from "./flow-weaver-chunk-A6M5K3W7.mjs";
|
|
35
|
+
import {
|
|
36
|
+
parseWorkflow
|
|
37
|
+
} from "./flow-weaver-chunk-W3YNK26P.mjs";
|
|
38
|
+
import {
|
|
39
|
+
VERSION
|
|
40
|
+
} from "./flow-weaver-chunk-VXWNLYQU.mjs";
|
|
41
|
+
import {
|
|
42
|
+
validateDurableClosure
|
|
43
|
+
} from "./flow-weaver-chunk-EM5HWQ4R.mjs";
|
|
44
|
+
|
|
45
|
+
// src/mcp/workflow-executor.ts
|
|
46
|
+
import * as path from "path";
|
|
47
|
+
import * as fs2 from "fs";
|
|
48
|
+
import { pathToFileURL } from "url";
|
|
49
|
+
import ts from "typescript";
|
|
50
|
+
|
|
51
|
+
// src/runtime/CancellationError.ts
|
|
52
|
+
var CancellationError = class _CancellationError extends Error {
|
|
53
|
+
constructor(message = "Workflow execution cancelled", executionIndex = 0, nodeId, timestamp = Date.now()) {
|
|
54
|
+
super(message);
|
|
55
|
+
this.executionIndex = executionIndex;
|
|
56
|
+
this.nodeId = nodeId;
|
|
57
|
+
this.timestamp = timestamp;
|
|
58
|
+
this.name = "CancellationError";
|
|
59
|
+
}
|
|
60
|
+
executionIndex;
|
|
61
|
+
nodeId;
|
|
62
|
+
timestamp;
|
|
63
|
+
static isCancellationError(error) {
|
|
64
|
+
return error instanceof _CancellationError || error instanceof Error && error.name === "CancellationError";
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// src/mcp/dist-imports.ts
|
|
69
|
+
import * as fs from "node:fs";
|
|
70
|
+
import * as nodePath from "node:path";
|
|
71
|
+
function rewriteSrcImportsToDist(code, srcDir, fileExists = fs.existsSync, path2 = nodePath) {
|
|
72
|
+
const srcSegment = `${path2.sep}src${path2.sep}`;
|
|
73
|
+
if (!`${srcDir}${path2.sep}`.includes(srcSegment)) return code;
|
|
74
|
+
return code.replace(/from\s+['"](\.[^'"]+)['"]/g, (match, specifier) => {
|
|
75
|
+
const resolvedSrc = path2.resolve(srcDir, specifier);
|
|
76
|
+
if (fileExists(resolvedSrc)) return match;
|
|
77
|
+
const distEquivalent = resolvedSrc.replace(srcSegment, `${path2.sep}dist${path2.sep}`);
|
|
78
|
+
if (!fileExists(distEquivalent)) return match;
|
|
79
|
+
const relative = path2.relative(srcDir, distEquivalent).replace(/\\/g, "/");
|
|
80
|
+
return `from '${relative.startsWith(".") ? relative : `./${relative}`}'`;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/runtime/strict-json.ts
|
|
85
|
+
var encoder = new TextEncoder();
|
|
86
|
+
function parseStrictJson(text, limits) {
|
|
87
|
+
let index = 0;
|
|
88
|
+
let aggregateEntries = 0;
|
|
89
|
+
const fail = (code, message) => {
|
|
90
|
+
throw new StrictJsonError(code, message);
|
|
91
|
+
};
|
|
92
|
+
const skipWhitespace = () => {
|
|
93
|
+
while (text[index] === " " || text[index] === "\n" || text[index] === "\r" || text[index] === " ") {
|
|
94
|
+
index += 1;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const parseString = () => {
|
|
98
|
+
const start = index;
|
|
99
|
+
index += 1;
|
|
100
|
+
while (index < text.length) {
|
|
101
|
+
const character = text[index];
|
|
102
|
+
if (character === '"') {
|
|
103
|
+
index += 1;
|
|
104
|
+
let value2;
|
|
105
|
+
try {
|
|
106
|
+
value2 = JSON.parse(text.slice(start, index));
|
|
107
|
+
} catch {
|
|
108
|
+
return fail("malformed", "JSON string is malformed");
|
|
109
|
+
}
|
|
110
|
+
if (typeof value2 !== "string" || encoder.encode(value2).byteLength > limits.maxStringBytes) {
|
|
111
|
+
return fail("oversized", "JSON string byte limit exceeded");
|
|
112
|
+
}
|
|
113
|
+
return value2;
|
|
114
|
+
}
|
|
115
|
+
if (character === "\\") {
|
|
116
|
+
index += 1;
|
|
117
|
+
if (index >= text.length) {
|
|
118
|
+
return fail("malformed", "JSON string escape is incomplete");
|
|
119
|
+
}
|
|
120
|
+
if (text[index] === "u") {
|
|
121
|
+
for (let offset = 1; offset <= 4; offset += 1) {
|
|
122
|
+
if (!/[0-9a-fA-F]/.test(text[index + offset] ?? "")) {
|
|
123
|
+
return fail("malformed", "JSON unicode escape is malformed");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
index += 4;
|
|
127
|
+
} else if (!/["\\/bfnrt]/.test(text[index])) {
|
|
128
|
+
return fail("malformed", "JSON string escape is malformed");
|
|
129
|
+
}
|
|
130
|
+
} else if ((character?.charCodeAt(0) ?? 0) < 32) {
|
|
131
|
+
return fail("malformed", "JSON string contains a control character");
|
|
132
|
+
}
|
|
133
|
+
index += 1;
|
|
134
|
+
}
|
|
135
|
+
return fail("malformed", "JSON string is unterminated");
|
|
136
|
+
};
|
|
137
|
+
const parseValue = (depth) => {
|
|
138
|
+
if (depth > limits.maxDepth) {
|
|
139
|
+
return fail("oversized", "JSON depth limit exceeded");
|
|
140
|
+
}
|
|
141
|
+
skipWhitespace();
|
|
142
|
+
const character = text[index];
|
|
143
|
+
if (character === '"') return parseString();
|
|
144
|
+
if (text.startsWith("true", index)) {
|
|
145
|
+
index += 4;
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
if (text.startsWith("false", index)) {
|
|
149
|
+
index += 5;
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
if (text.startsWith("null", index)) {
|
|
153
|
+
index += 4;
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
if (character === "[") {
|
|
157
|
+
index += 1;
|
|
158
|
+
skipWhitespace();
|
|
159
|
+
const values = [];
|
|
160
|
+
if (text[index] === "]") {
|
|
161
|
+
index += 1;
|
|
162
|
+
return values;
|
|
163
|
+
}
|
|
164
|
+
while (true) {
|
|
165
|
+
if (values.length >= limits.maxArrayItems) {
|
|
166
|
+
return fail("oversized", "JSON array item limit exceeded");
|
|
167
|
+
}
|
|
168
|
+
aggregateEntries += 1;
|
|
169
|
+
if (aggregateEntries > limits.maxAggregateEntries) {
|
|
170
|
+
return fail("oversized", "JSON aggregate entry limit exceeded");
|
|
171
|
+
}
|
|
172
|
+
values.push(parseValue(depth + 1));
|
|
173
|
+
skipWhitespace();
|
|
174
|
+
if (text[index] === "]") {
|
|
175
|
+
index += 1;
|
|
176
|
+
return values;
|
|
177
|
+
}
|
|
178
|
+
if (text[index] !== ",") {
|
|
179
|
+
return fail("malformed", "JSON array separator is malformed");
|
|
180
|
+
}
|
|
181
|
+
index += 1;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (character === "{") {
|
|
185
|
+
index += 1;
|
|
186
|
+
skipWhitespace();
|
|
187
|
+
const value2 = /* @__PURE__ */ Object.create(null);
|
|
188
|
+
const keys = /* @__PURE__ */ new Set();
|
|
189
|
+
if (text[index] === "}") {
|
|
190
|
+
index += 1;
|
|
191
|
+
return value2;
|
|
192
|
+
}
|
|
193
|
+
while (true) {
|
|
194
|
+
if (keys.size >= limits.maxObjectKeys) {
|
|
195
|
+
return fail("oversized", "JSON object key limit exceeded");
|
|
196
|
+
}
|
|
197
|
+
skipWhitespace();
|
|
198
|
+
if (text[index] !== '"') {
|
|
199
|
+
return fail("malformed", "JSON object key must be a string");
|
|
200
|
+
}
|
|
201
|
+
const key = parseString();
|
|
202
|
+
if (keys.has(key)) {
|
|
203
|
+
return fail("malformed", `duplicate JSON object member ${key}`);
|
|
204
|
+
}
|
|
205
|
+
keys.add(key);
|
|
206
|
+
aggregateEntries += 1;
|
|
207
|
+
if (aggregateEntries > limits.maxAggregateEntries) {
|
|
208
|
+
return fail("oversized", "JSON aggregate entry limit exceeded");
|
|
209
|
+
}
|
|
210
|
+
skipWhitespace();
|
|
211
|
+
if (text[index] !== ":") {
|
|
212
|
+
return fail("malformed", "JSON object member is missing a colon");
|
|
213
|
+
}
|
|
214
|
+
index += 1;
|
|
215
|
+
value2[key] = parseValue(depth + 1);
|
|
216
|
+
skipWhitespace();
|
|
217
|
+
if (text[index] === "}") {
|
|
218
|
+
index += 1;
|
|
219
|
+
return value2;
|
|
220
|
+
}
|
|
221
|
+
if (text[index] !== ",") {
|
|
222
|
+
return fail("malformed", "JSON object separator is malformed");
|
|
223
|
+
}
|
|
224
|
+
index += 1;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const number = text.slice(index).match(/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/)?.[0];
|
|
228
|
+
if (number !== void 0) {
|
|
229
|
+
index += number.length;
|
|
230
|
+
const value2 = Number(number);
|
|
231
|
+
if (!Number.isFinite(value2)) {
|
|
232
|
+
return fail("malformed", "JSON number must be finite");
|
|
233
|
+
}
|
|
234
|
+
return value2;
|
|
235
|
+
}
|
|
236
|
+
return fail("malformed", "JSON value is malformed");
|
|
237
|
+
};
|
|
238
|
+
const value = parseValue(0);
|
|
239
|
+
skipWhitespace();
|
|
240
|
+
if (index !== text.length) {
|
|
241
|
+
fail("malformed", "JSON has trailing data");
|
|
242
|
+
}
|
|
243
|
+
return value;
|
|
244
|
+
}
|
|
245
|
+
var StrictJsonError = class extends Error {
|
|
246
|
+
constructor(code, message) {
|
|
247
|
+
super(message);
|
|
248
|
+
this.code = code;
|
|
249
|
+
}
|
|
250
|
+
code;
|
|
251
|
+
name = "StrictJsonError";
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
// src/runtime/continuation.ts
|
|
255
|
+
function refusal(reason, message) {
|
|
256
|
+
return { accepted: false, reason, message };
|
|
257
|
+
}
|
|
258
|
+
function isGraphBranchPath(value) {
|
|
259
|
+
return Array.isArray(value) && value.every(
|
|
260
|
+
(requirement) => isPlainObjectRecord(requirement) && hasExactlyTheKeys(requirement, ["nodeId", "arm"]) && typeof requirement.nodeId === "string" && requirement.nodeId.length > 0 && typeof requirement.arm === "string" && requirement.arm.length > 0
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
function graphNodeFor(graph, workflowId, nodeId, nodeType) {
|
|
264
|
+
return graph.nodes.find(
|
|
265
|
+
(node) => node.workflowId === workflowId && node.nodeId === nodeId && node.nodeType === nodeType
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
function graphNodeForAddress(graph, address) {
|
|
269
|
+
const workflowId = address.frames[address.frames.length - 1]?.workflowId;
|
|
270
|
+
return workflowId === void 0 ? void 0 : graphNodeFor(graph, workflowId, address.nodeId, address.nodeType);
|
|
271
|
+
}
|
|
272
|
+
function progressVector(graph, address) {
|
|
273
|
+
const progress = [];
|
|
274
|
+
for (let index = 1; index < address.frames.length; index++) {
|
|
275
|
+
const frame = address.frames[index];
|
|
276
|
+
const parent = address.frames[index - 1];
|
|
277
|
+
if (frame.callerNodeId === void 0 || frame.callerExecutionIndex === void 0) {
|
|
278
|
+
return void 0;
|
|
279
|
+
}
|
|
280
|
+
const caller = graph.nodes.find(
|
|
281
|
+
(node2) => node2.workflowId === parent.workflowId && node2.nodeId === frame.callerNodeId
|
|
282
|
+
);
|
|
283
|
+
if (caller === void 0 || !caller.invokedWorkflows.includes(frame.workflowId)) {
|
|
284
|
+
return void 0;
|
|
285
|
+
}
|
|
286
|
+
progress.push(caller.executionOrder, frame.callerExecutionIndex, frame.invocation);
|
|
287
|
+
}
|
|
288
|
+
const lastFrameWorkflowId = address.frames[address.frames.length - 1]?.workflowId;
|
|
289
|
+
for (const scope of address.scopes) {
|
|
290
|
+
const owner = graph.nodes.find(
|
|
291
|
+
(node2) => node2.workflowId === lastFrameWorkflowId && node2.nodeId === scope.parentNodeId
|
|
292
|
+
);
|
|
293
|
+
if (owner === void 0) return void 0;
|
|
294
|
+
progress.push(owner.executionOrder, scope.loopIteration ?? scope.invocation);
|
|
295
|
+
}
|
|
296
|
+
const node = graphNodeForAddress(graph, address);
|
|
297
|
+
if (node === void 0) return void 0;
|
|
298
|
+
progress.push(node.executionOrder, address.executionIndex);
|
|
299
|
+
return progress;
|
|
300
|
+
}
|
|
301
|
+
function compareProgress(left, right) {
|
|
302
|
+
const length = Math.min(left.length, right.length);
|
|
303
|
+
for (let index = 0; index < length; index++) {
|
|
304
|
+
if (left[index] !== right[index]) return left[index] - right[index];
|
|
305
|
+
}
|
|
306
|
+
return left.length - right.length;
|
|
307
|
+
}
|
|
308
|
+
function sameFrames(left, right) {
|
|
309
|
+
return canonicalWireValue(left) === canonicalWireValue(right);
|
|
310
|
+
}
|
|
311
|
+
function hasCompleteRequiredPrefix(graph, location, completed) {
|
|
312
|
+
for (let frameIndex = 0; frameIndex < location.frames.length; frameIndex++) {
|
|
313
|
+
const frame = location.frames[frameIndex];
|
|
314
|
+
const frameAddress = location.frames.slice(0, frameIndex + 1);
|
|
315
|
+
const boundaryNodeId = frameIndex === location.frames.length - 1 ? location.nodeId : location.frames[frameIndex + 1].callerNodeId;
|
|
316
|
+
if (boundaryNodeId === void 0) return false;
|
|
317
|
+
const boundaryNode = graph.nodes.find(
|
|
318
|
+
(node) => node.workflowId === frame.workflowId && node.nodeId === boundaryNodeId
|
|
319
|
+
);
|
|
320
|
+
if (boundaryNode === void 0) return false;
|
|
321
|
+
const boundaryScopeOwners = new Set(
|
|
322
|
+
frameIndex === location.frames.length - 1 ? location.scopes.map((scope) => scope.parentNodeId) : []
|
|
323
|
+
);
|
|
324
|
+
for (const predecessor of boundaryNode.predecessors) {
|
|
325
|
+
if (boundaryScopeOwners.has(predecessor.nodeId)) continue;
|
|
326
|
+
const predecessorNode = graph.nodes.find(
|
|
327
|
+
(node) => node.workflowId === frame.workflowId && node.nodeId === predecessor.nodeId
|
|
328
|
+
);
|
|
329
|
+
if (predecessorNode === void 0 || !completed.some(
|
|
330
|
+
(address) => sameFrames(address.frames, frameAddress) && address.nodeId === predecessorNode.nodeId && address.nodeType === predecessorNode.nodeType && predecessor.branchPath.every(
|
|
331
|
+
(requirement) => address.branches.some(
|
|
332
|
+
(branch) => branch.nodeId === requirement.nodeId && branch.arm === requirement.arm
|
|
333
|
+
)
|
|
334
|
+
)
|
|
335
|
+
)) {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
function addressBelongsToGraph(graph, rootWorkflowId, address) {
|
|
343
|
+
const isScopedAddress = address.scopes.length > 0;
|
|
344
|
+
if (address.frames[0]?.workflowId !== rootWorkflowId || address.frames[0]?.invocation !== 0 || address.frames[0]?.callerNodeId !== void 0 || !isScopedAddress && address.executionIndex !== 0 || // Scopes are authenticated per-scope below (each scope's parent node must
|
|
345
|
+
// declare it) and, for a scoped node, against the node's own parentScope.
|
|
346
|
+
// A scoped durable boundary therefore carries scopes; blanket-rejecting any
|
|
347
|
+
// scope here would refuse a legitimate loop iteration's committed address.
|
|
348
|
+
address.branches.some((branch) => branch.executionIndex !== 0) || address.frames.some(
|
|
349
|
+
(frame, index) => frame.invocation !== 0 || index > 0 && frame.callerExecutionIndex !== 0
|
|
350
|
+
)) {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
for (let index = 1; index < address.frames.length; index++) {
|
|
354
|
+
const frame = address.frames[index];
|
|
355
|
+
const parent = address.frames[index - 1];
|
|
356
|
+
const caller = frame.callerNodeId === void 0 ? void 0 : graph.nodes.find(
|
|
357
|
+
(node2) => node2.workflowId === parent.workflowId && node2.nodeId === frame.callerNodeId
|
|
358
|
+
);
|
|
359
|
+
if (caller === void 0 || frame.callerExecutionIndex === void 0 || !caller.invokedWorkflows.includes(frame.workflowId)) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
const workflowId = address.frames[address.frames.length - 1]?.workflowId;
|
|
364
|
+
const node = graphNodeForAddress(graph, address);
|
|
365
|
+
const graphNodeInFrames = (nodeId) => address.frames.map(
|
|
366
|
+
(frame) => graph.nodes.find((candidate) => candidate.workflowId === frame.workflowId && candidate.nodeId === nodeId)
|
|
367
|
+
).find((candidate) => candidate !== void 0);
|
|
368
|
+
if (workflowId === void 0 || node === void 0 || address.scopes.some((scope) => {
|
|
369
|
+
const parent = graphNodeInFrames(scope.parentNodeId);
|
|
370
|
+
return parent === void 0 || !parent.scopeNames.includes(scope.scopeName);
|
|
371
|
+
}) || address.branches.some((branch) => {
|
|
372
|
+
const frame = address.frames[branch.frameDepth];
|
|
373
|
+
const owner = graph.nodes.find(
|
|
374
|
+
(candidate) => candidate.workflowId === branch.workflowId && candidate.nodeId === branch.nodeId
|
|
375
|
+
);
|
|
376
|
+
return frame === void 0 || frame.workflowId !== branch.workflowId || owner === void 0 || !owner.branchArms.includes(branch.arm);
|
|
377
|
+
})) {
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
for (let frameDepth = 0; frameDepth < address.frames.length; frameDepth++) {
|
|
381
|
+
const frame = address.frames[frameDepth];
|
|
382
|
+
const boundaryNodeId = frameDepth === address.frames.length - 1 ? address.nodeId : address.frames[frameDepth + 1].callerNodeId;
|
|
383
|
+
const boundaryNode = graph.nodes.find(
|
|
384
|
+
(candidate) => candidate.workflowId === frame.workflowId && candidate.nodeId === boundaryNodeId
|
|
385
|
+
);
|
|
386
|
+
const observedBranchPath = address.branches.filter((branch) => branch.frameDepth === frameDepth && branch.workflowId === frame.workflowId).map((branch) => ({ nodeId: branch.nodeId, arm: branch.arm }));
|
|
387
|
+
if (boundaryNode === void 0 || canonicalWireValue(observedBranchPath) !== canonicalWireValue(boundaryNode.branchPath)) {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
if (node.parentScope !== void 0) {
|
|
392
|
+
const localScope = address.scopes[address.scopes.length - 1];
|
|
393
|
+
if (localScope === void 0 || localScope.parentNodeId !== node.parentScope.parentNodeId || localScope.scopeName !== node.parentScope.scopeName) {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return true;
|
|
398
|
+
}
|
|
399
|
+
function hasConflictingBranchHistory(addresses) {
|
|
400
|
+
const selected = /* @__PURE__ */ new Map();
|
|
401
|
+
for (const address of addresses) {
|
|
402
|
+
for (const branch of address.branches) {
|
|
403
|
+
const key = `${branch.frameDepth}\0${branch.workflowId}\0${branch.nodeId}\0${branch.executionIndex}`;
|
|
404
|
+
const prior = selected.get(key);
|
|
405
|
+
if (prior !== void 0 && prior !== branch.arm) return true;
|
|
406
|
+
selected.set(key, branch.arm);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
function decodeContinuation(input, compatibility) {
|
|
412
|
+
let value = input;
|
|
413
|
+
try {
|
|
414
|
+
if (typeof input === "string") {
|
|
415
|
+
if (utf8ByteLength(input) > MAX_CONTINUATION_BYTES) {
|
|
416
|
+
return refusal("oversized", "continuation exceeds maximum wire size");
|
|
417
|
+
}
|
|
418
|
+
value = parseStrictJson(input, {
|
|
419
|
+
maxDepth: MAX_CONTINUATION_DEPTH,
|
|
420
|
+
maxStringBytes: MAX_CONTINUATION_STRING_BYTES,
|
|
421
|
+
maxObjectKeys: MAX_CONTINUATION_ENTRIES,
|
|
422
|
+
maxArrayItems: MAX_CONTINUATION_ENTRIES,
|
|
423
|
+
maxAggregateEntries: MAX_CONTINUATION_ENTRIES
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
validateWireValue(value);
|
|
427
|
+
} catch (error) {
|
|
428
|
+
if (error instanceof WireValidationError) {
|
|
429
|
+
return refusal(error.reason, error.message);
|
|
430
|
+
}
|
|
431
|
+
if (error instanceof StrictJsonError) {
|
|
432
|
+
return refusal(error.code, error.message);
|
|
433
|
+
}
|
|
434
|
+
return refusal("malformed", "continuation is not valid JSON");
|
|
435
|
+
}
|
|
436
|
+
if (!structurallyValidEnvelope(value)) {
|
|
437
|
+
return refusal("malformed", "continuation has missing, unknown, or invalid fields");
|
|
438
|
+
}
|
|
439
|
+
if (value.formatVersion !== CONTINUATION_FORMAT_VERSION) {
|
|
440
|
+
return refusal("unsupported-format", `unsupported continuation format ${value.formatVersion}`);
|
|
441
|
+
}
|
|
442
|
+
if (continuationChecksum(value) !== value.checksum) {
|
|
443
|
+
return refusal("checksum-mismatch", "continuation checksum does not match");
|
|
444
|
+
}
|
|
445
|
+
if (value.gateId !== durableGateId(value.runId, value.gateKind, value.location)) {
|
|
446
|
+
return refusal("malformed", "continuation gate identity does not match its execution address");
|
|
447
|
+
}
|
|
448
|
+
const graphNodes = compatibility.graph.nodes;
|
|
449
|
+
const graphNodeKeys = new Set(graphNodes.map((node) => `${node.workflowId}\0${node.nodeId}\0${node.nodeType}`));
|
|
450
|
+
const graphOrderKeys = new Set(graphNodes.map((node) => `${node.workflowId}\0${node.executionOrder}`));
|
|
451
|
+
if (graphNodeKeys.size !== graphNodes.length || graphOrderKeys.size !== graphNodes.length || graphNodes.some(
|
|
452
|
+
(node) => !Number.isSafeInteger(node.executionOrder) || node.executionOrder < -1 || new Set(node.inputPorts).size !== node.inputPorts.length || new Set(node.outputPorts).size !== node.outputPorts.length || new Set(node.scopeNames).size !== node.scopeNames.length || new Set(node.invokedWorkflows).size !== node.invokedWorkflows.length || new Set(node.branchArms).size !== node.branchArms.length || !isGraphBranchPath(node.branchPath) || new Set(node.branchPath.map((requirement) => `${requirement.nodeId}\0${requirement.arm}`)).size !== node.branchPath.length || node.branchPath.some((requirement) => {
|
|
453
|
+
const owner = graphNodes.find(
|
|
454
|
+
(candidate) => candidate.workflowId === node.workflowId && candidate.nodeId === requirement.nodeId
|
|
455
|
+
);
|
|
456
|
+
return owner === void 0 || !owner.branchArms.includes(requirement.arm);
|
|
457
|
+
}) || !Array.isArray(node.predecessors) || new Set(node.predecessors.map((predecessor) => predecessor.nodeId)).size !== node.predecessors.length || node.predecessors.some(
|
|
458
|
+
(predecessor) => typeof predecessor.nodeId !== "string" || predecessor.nodeId.length === 0 || predecessor.nodeId === node.nodeId || !isGraphBranchPath(predecessor.branchPath) || (() => {
|
|
459
|
+
const predecessorNode = graphNodes.find(
|
|
460
|
+
(candidate) => candidate.workflowId === node.workflowId && candidate.nodeId === predecessor.nodeId
|
|
461
|
+
);
|
|
462
|
+
return predecessorNode === void 0 || predecessorNode.executionOrder >= node.executionOrder || canonicalWireValue(predecessor.branchPath) !== canonicalWireValue(predecessorNode.branchPath) || predecessor.branchPath.some(
|
|
463
|
+
(requirement) => !node.branchPath.some(
|
|
464
|
+
(active) => active.nodeId === requirement.nodeId && active.arm === requirement.arm
|
|
465
|
+
)
|
|
466
|
+
);
|
|
467
|
+
})() || new Set(
|
|
468
|
+
predecessor.branchPath.map(
|
|
469
|
+
(requirement) => `${requirement.nodeId}\0${requirement.arm}`
|
|
470
|
+
)
|
|
471
|
+
).size !== predecessor.branchPath.length || predecessor.branchPath.some((requirement) => {
|
|
472
|
+
const owner = graphNodes.find(
|
|
473
|
+
(candidate) => candidate.workflowId === node.workflowId && candidate.nodeId === requirement.nodeId
|
|
474
|
+
);
|
|
475
|
+
return typeof requirement.nodeId !== "string" || typeof requirement.arm !== "string" || owner === void 0 || !owner.branchArms.includes(requirement.arm);
|
|
476
|
+
})
|
|
477
|
+
)
|
|
478
|
+
) || !addressBelongsToGraph(compatibility.graph, compatibility.workflowId, value.location) || graphNodeForAddress(compatibility.graph, value.location)?.durableGate !== value.gateKind) {
|
|
479
|
+
return refusal("wrong-graph", "continuation boundary is not owned by the compiled graph");
|
|
480
|
+
}
|
|
481
|
+
const completed = new Set(value.state.completed.map(executionAddressKey));
|
|
482
|
+
if (completed.size !== value.state.completed.length) {
|
|
483
|
+
return refusal("malformed", "continuation contains duplicate completed addresses");
|
|
484
|
+
}
|
|
485
|
+
if (value.state.completed.some(
|
|
486
|
+
(address) => !addressBelongsToGraph(compatibility.graph, compatibility.workflowId, address)
|
|
487
|
+
)) {
|
|
488
|
+
return refusal("wrong-graph", "continuation contains an address outside the compiled graph");
|
|
489
|
+
}
|
|
490
|
+
const boundaryProgress = progressVector(compatibility.graph, value.location);
|
|
491
|
+
if (boundaryProgress === void 0 || value.state.completed.some((address) => {
|
|
492
|
+
const completedProgress = progressVector(compatibility.graph, address);
|
|
493
|
+
return completedProgress === void 0 || compareProgress(completedProgress, boundaryProgress) >= 0;
|
|
494
|
+
}) || hasConflictingBranchHistory([...value.state.completed, value.location])) {
|
|
495
|
+
return refusal(
|
|
496
|
+
"wrong-graph",
|
|
497
|
+
"continuation completed state is not a valid execution prefix before its boundary"
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
if (!hasCompleteRequiredPrefix(compatibility.graph, value.location, value.state.completed)) {
|
|
501
|
+
return refusal("wrong-graph", "continuation is missing a required compiled predecessor before its boundary");
|
|
502
|
+
}
|
|
503
|
+
const variableKeys = /* @__PURE__ */ new Set();
|
|
504
|
+
for (const variable of value.state.variables) {
|
|
505
|
+
const address = executionAddressKey(variable.address);
|
|
506
|
+
const key = `${address}\0${variable.portName}`;
|
|
507
|
+
const graphNode = graphNodeForAddress(compatibility.graph, variable.address);
|
|
508
|
+
if (!completed.has(address) || variableKeys.has(key) || graphNode === void 0 || !graphNode.outputPorts.includes(variable.portName)) {
|
|
509
|
+
return refusal(
|
|
510
|
+
"wrong-graph",
|
|
511
|
+
`continuation variable ${variable.address.frames[variable.address.frames.length - 1]?.workflowId}.${variable.address.nodeId}.${variable.portName} is not a unique graph-owned output of a completed address`
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
variableKeys.add(key);
|
|
515
|
+
}
|
|
516
|
+
const receiptAddresses = /* @__PURE__ */ new Set();
|
|
517
|
+
for (const receipt of value.receipts) {
|
|
518
|
+
const address = executionAddressKey(receipt.address);
|
|
519
|
+
if (receiptAddresses.has(address) || !completed.has(address) || graphNodeForAddress(compatibility.graph, receipt.address)?.durableEffect !== true || receipt.operationKey !== operationKey(value.runId, receipt.address)) {
|
|
520
|
+
return refusal(
|
|
521
|
+
"malformed",
|
|
522
|
+
"continuation effect receipts must be unique, completed, and match their operation identity"
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
receiptAddresses.add(address);
|
|
526
|
+
}
|
|
527
|
+
if (value.state.completed.some(
|
|
528
|
+
(address) => graphNodeForAddress(compatibility.graph, address)?.durableEffect === true && !receiptAddresses.has(executionAddressKey(address))
|
|
529
|
+
)) {
|
|
530
|
+
return refusal("malformed", "every completed effect requires its exact durable receipt");
|
|
531
|
+
}
|
|
532
|
+
if (value.engineVersion !== (compatibility.engineVersion ?? VERSION)) {
|
|
533
|
+
return refusal("incompatible-engine", "continuation engine version does not match");
|
|
534
|
+
}
|
|
535
|
+
if (value.generatorAbi !== (compatibility.generatorAbi ?? GENERATOR_ABI)) {
|
|
536
|
+
return refusal("incompatible-generator", "continuation generator ABI does not match");
|
|
537
|
+
}
|
|
538
|
+
if (value.runId !== compatibility.runId) {
|
|
539
|
+
return refusal("wrong-run", "continuation belongs to another run");
|
|
540
|
+
}
|
|
541
|
+
if (value.workflowId !== compatibility.workflowId) {
|
|
542
|
+
return refusal("wrong-workflow", "continuation belongs to another workflow");
|
|
543
|
+
}
|
|
544
|
+
if (value.bundleDigest !== compatibility.bundleDigest) {
|
|
545
|
+
return refusal("wrong-bundle", "continuation belongs to another bundle");
|
|
546
|
+
}
|
|
547
|
+
if (value.graphFingerprint !== compatibility.graphFingerprint) {
|
|
548
|
+
return refusal("wrong-graph", "continuation belongs to another workflow graph");
|
|
549
|
+
}
|
|
550
|
+
if (compatibility.gateId !== void 0 && value.gateId !== compatibility.gateId) {
|
|
551
|
+
return refusal("stale-gate", "continuation gate is stale or reordered");
|
|
552
|
+
}
|
|
553
|
+
return acceptContinuation(value, {
|
|
554
|
+
runId: compatibility.runId,
|
|
555
|
+
workflowId: compatibility.workflowId,
|
|
556
|
+
...compatibility.gateId === void 0 ? {} : { gateId: compatibility.gateId }
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// src/runtime/durable-execution.ts
|
|
561
|
+
function acceptGateResolution(resolution) {
|
|
562
|
+
if (resolution === void 0) return void 0;
|
|
563
|
+
validateWireValue(resolution);
|
|
564
|
+
const keys = Object.keys(resolution).sort();
|
|
565
|
+
if (keys.length !== 2 || keys[0] !== "gateId" || keys[1] !== "value" || !/^[0-9a-f]{64}$/.test(resolution.gateId)) {
|
|
566
|
+
throw new Error("resolution must contain exactly a canonical gateId and wire value");
|
|
567
|
+
}
|
|
568
|
+
return cloneAndFreezeWireValue(resolution);
|
|
569
|
+
}
|
|
570
|
+
function mockedGateAnswer(mocks, boundary) {
|
|
571
|
+
if (!mocks) return void 0;
|
|
572
|
+
const { nodeId, nodeType } = boundary;
|
|
573
|
+
const pick = (section, key) => {
|
|
574
|
+
if (!section) return void 0;
|
|
575
|
+
if (key !== void 0 && section[`${nodeId}:${key}`] !== void 0) return section[`${nodeId}:${key}`];
|
|
576
|
+
if (section[`${nodeId}:*`] !== void 0) return section[`${nodeId}:*`];
|
|
577
|
+
return key !== void 0 ? section[key] : void 0;
|
|
578
|
+
};
|
|
579
|
+
const firstInput = () => {
|
|
580
|
+
const p = boundary.payload;
|
|
581
|
+
const v = p?.arguments?.[0]?.value;
|
|
582
|
+
return v === void 0 || v === null ? void 0 : String(v);
|
|
583
|
+
};
|
|
584
|
+
let data = mocks.gates?.[nodeId];
|
|
585
|
+
if (data === void 0 && nodeType === "waitForAgent") {
|
|
586
|
+
const v = pick(mocks.agents, firstInput());
|
|
587
|
+
if (v !== void 0) data = { agentResult: v };
|
|
588
|
+
}
|
|
589
|
+
if (data === void 0 && nodeType === "waitForEvent") {
|
|
590
|
+
const v = pick(mocks.events, firstInput());
|
|
591
|
+
if (v !== void 0) data = { eventData: v };
|
|
592
|
+
}
|
|
593
|
+
if (data === void 0 && nodeType === "sleep" && mocks.fast === true) {
|
|
594
|
+
data = { wokeAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
595
|
+
}
|
|
596
|
+
if (data === void 0 || typeof data !== "object") return void 0;
|
|
597
|
+
const value = { onSuccess: true, onFailure: false, ...data };
|
|
598
|
+
validateWireValue(value);
|
|
599
|
+
return value;
|
|
600
|
+
}
|
|
601
|
+
var DurableGateYield = class extends Error {
|
|
602
|
+
constructor(gate, state, receipts, continuation) {
|
|
603
|
+
super(`Workflow yielded at ${gate.kind} gate "${gate.id}"`);
|
|
604
|
+
this.gate = gate;
|
|
605
|
+
this.state = state;
|
|
606
|
+
this.receipts = receipts;
|
|
607
|
+
this.continuation = continuation;
|
|
608
|
+
this.name = "DurableGateYield";
|
|
609
|
+
}
|
|
610
|
+
gate;
|
|
611
|
+
state;
|
|
612
|
+
receipts;
|
|
613
|
+
continuation;
|
|
614
|
+
code = "FLOW_WEAVER_DURABLE_GATE_YIELD";
|
|
615
|
+
};
|
|
616
|
+
var AmbiguousEffectError = class extends Error {
|
|
617
|
+
constructor(operationKey2, address) {
|
|
618
|
+
super(`Effect "${operationKey2}" has an ambiguous commit state`);
|
|
619
|
+
this.operationKey = operationKey2;
|
|
620
|
+
this.address = address;
|
|
621
|
+
this.name = "AmbiguousEffectError";
|
|
622
|
+
}
|
|
623
|
+
operationKey;
|
|
624
|
+
address;
|
|
625
|
+
code = "FLOW_WEAVER_AMBIGUOUS_EFFECT";
|
|
626
|
+
};
|
|
627
|
+
function durableAddressKey(address) {
|
|
628
|
+
return executionAddressKey(address);
|
|
629
|
+
}
|
|
630
|
+
function durableVariableKey(address, portName) {
|
|
631
|
+
return `${executionAddressKey(address)}\0${portName}`;
|
|
632
|
+
}
|
|
633
|
+
function cloneExecutionAddress(address) {
|
|
634
|
+
return {
|
|
635
|
+
frames: address.frames.map((frame) => ({ ...frame })),
|
|
636
|
+
scopes: address.scopes.map((scope) => ({ ...scope })),
|
|
637
|
+
branches: address.branches.map((branch) => ({ ...branch })),
|
|
638
|
+
nodeId: address.nodeId,
|
|
639
|
+
nodeType: address.nodeType,
|
|
640
|
+
executionIndex: address.executionIndex
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
function isCanonicalPrefix(candidate, current) {
|
|
644
|
+
return candidate.length <= current.length && canonicalWireValue(candidate) === canonicalWireValue(current.slice(0, candidate.length));
|
|
645
|
+
}
|
|
646
|
+
function isCanonicalEqual(left, right) {
|
|
647
|
+
return left.length === right.length && canonicalWireValue(left) === canonicalWireValue(right);
|
|
648
|
+
}
|
|
649
|
+
function requireEffectRecovery(value, key, address) {
|
|
650
|
+
try {
|
|
651
|
+
validateWireValue(value);
|
|
652
|
+
} catch {
|
|
653
|
+
throw new AmbiguousEffectError(key, address);
|
|
654
|
+
}
|
|
655
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
656
|
+
throw new AmbiguousEffectError(key, address);
|
|
657
|
+
}
|
|
658
|
+
const record = value;
|
|
659
|
+
const kind = record.kind;
|
|
660
|
+
if ((kind === "not-committed" || kind === "repeatable" || kind === "ambiguous") && Object.keys(record).length === 1) {
|
|
661
|
+
return { kind };
|
|
662
|
+
}
|
|
663
|
+
if (kind === "committed" && Object.keys(record).length === 3 && Object.prototype.hasOwnProperty.call(record, "receipt") && Object.prototype.hasOwnProperty.call(record, "result")) {
|
|
664
|
+
return {
|
|
665
|
+
kind,
|
|
666
|
+
receipt: record.receipt,
|
|
667
|
+
result: record.result
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
throw new AmbiguousEffectError(key, address);
|
|
671
|
+
}
|
|
672
|
+
function requireEffectExecution(value, key, address) {
|
|
673
|
+
try {
|
|
674
|
+
validateWireValue(value);
|
|
675
|
+
} catch {
|
|
676
|
+
throw new AmbiguousEffectError(key, address);
|
|
677
|
+
}
|
|
678
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
679
|
+
throw new AmbiguousEffectError(key, address);
|
|
680
|
+
}
|
|
681
|
+
const record = value;
|
|
682
|
+
if (Object.keys(record).length !== 2 || !Object.prototype.hasOwnProperty.call(record, "result") || !Object.prototype.hasOwnProperty.call(record, "receipt")) {
|
|
683
|
+
throw new AmbiguousEffectError(key, address);
|
|
684
|
+
}
|
|
685
|
+
return {
|
|
686
|
+
result: record.result,
|
|
687
|
+
receipt: record.receipt
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
var DurableExecution = class {
|
|
691
|
+
constructor(runId, workflowId, continuation, resolution, bundleDigest) {
|
|
692
|
+
this.runId = runId;
|
|
693
|
+
this.workflowId = workflowId;
|
|
694
|
+
if (continuation !== void 0) {
|
|
695
|
+
assertAcceptedContinuation(continuation);
|
|
696
|
+
if (continuation.runId !== runId) {
|
|
697
|
+
throw new Error("accepted continuation belongs to another run");
|
|
698
|
+
}
|
|
699
|
+
if (continuation.workflowId !== workflowId) {
|
|
700
|
+
throw new Error("accepted continuation belongs to another workflow");
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
if (bundleDigest !== void 0 && !/^sha256:[0-9a-f]{64}$/.test(bundleDigest)) {
|
|
704
|
+
throw new Error("bundleDigest must use canonical sha256:<64hex> form");
|
|
705
|
+
}
|
|
706
|
+
this.givenBundleDigest = bundleDigest;
|
|
707
|
+
this.resumeEnvelope = continuation;
|
|
708
|
+
this.resolution = acceptGateResolution(resolution);
|
|
709
|
+
for (const address of continuation?.state.completed ?? []) {
|
|
710
|
+
this.completed.set(durableAddressKey(address), cloneExecutionAddress(address));
|
|
711
|
+
}
|
|
712
|
+
for (const variable of continuation?.state.variables ?? []) {
|
|
713
|
+
this.variables.set(durableVariableKey(variable.address, variable.portName), {
|
|
714
|
+
address: cloneExecutionAddress(variable.address),
|
|
715
|
+
portName: variable.portName,
|
|
716
|
+
value: variable.value
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
for (const receipt of continuation?.receipts ?? []) {
|
|
720
|
+
this.receipts.set(durableAddressKey(receipt.address), {
|
|
721
|
+
address: cloneExecutionAddress(receipt.address),
|
|
722
|
+
operationKey: receipt.operationKey,
|
|
723
|
+
receipt: receipt.receipt
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
runId;
|
|
728
|
+
workflowId;
|
|
729
|
+
completed = /* @__PURE__ */ new Map();
|
|
730
|
+
variables = /* @__PURE__ */ new Map();
|
|
731
|
+
receipts = /* @__PURE__ */ new Map();
|
|
732
|
+
resumeEnvelope;
|
|
733
|
+
resolution;
|
|
734
|
+
givenBundleDigest;
|
|
735
|
+
graphFingerprint;
|
|
736
|
+
resolutionConsumed = false;
|
|
737
|
+
address(runtime, nodeId, nodeType, executionIndex) {
|
|
738
|
+
return {
|
|
739
|
+
frames: runtime.frames.map((frame) => ({ ...frame })),
|
|
740
|
+
scopes: runtime.scopes.map((scope) => ({ ...scope })),
|
|
741
|
+
branches: runtime.branches.map((branch) => ({ ...branch })),
|
|
742
|
+
nodeId,
|
|
743
|
+
nodeType,
|
|
744
|
+
executionIndex
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* The artifact identity this run executes under: the one the coordinator
|
|
749
|
+
* gave, or one derived from the graph identity the body declared. Known
|
|
750
|
+
* only after `bind`.
|
|
751
|
+
*/
|
|
752
|
+
bundleDigest() {
|
|
753
|
+
if (this.givenBundleDigest !== void 0) return this.givenBundleDigest;
|
|
754
|
+
if (this.graphFingerprint === void 0) return void 0;
|
|
755
|
+
return `sha256:${sha256Hex(`flow-weaver-inline\0${this.workflowId}\0${this.graphFingerprint}\0${ENGINE_VERSION}`)}`;
|
|
756
|
+
}
|
|
757
|
+
bind(runtime, workflowId, graphFingerprint) {
|
|
758
|
+
if (runtime.frames.length !== 1) return;
|
|
759
|
+
if (workflowId !== this.workflowId) {
|
|
760
|
+
throw new Error(`runtime was created for workflow "${this.workflowId}" but "${workflowId}" is running on it`);
|
|
761
|
+
}
|
|
762
|
+
this.graphFingerprint = graphFingerprint;
|
|
763
|
+
if (this.resumeEnvelope === void 0) return;
|
|
764
|
+
if (this.resumeEnvelope.graphFingerprint !== graphFingerprint) {
|
|
765
|
+
const error = new Error("continuation belongs to another workflow graph");
|
|
766
|
+
error.name = "ContinuationMismatchError";
|
|
767
|
+
throw error;
|
|
768
|
+
}
|
|
769
|
+
const bundleDigest = this.bundleDigest();
|
|
770
|
+
if (bundleDigest !== void 0 && this.resumeEnvelope.bundleDigest !== bundleDigest) {
|
|
771
|
+
const error = new Error("continuation belongs to another bundle");
|
|
772
|
+
error.name = "ContinuationMismatchError";
|
|
773
|
+
throw error;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
shouldExecute(address) {
|
|
777
|
+
return !this.completed.has(durableAddressKey(address));
|
|
778
|
+
}
|
|
779
|
+
commitNode(address) {
|
|
780
|
+
this.completed.set(durableAddressKey(address), cloneExecutionAddress(address));
|
|
781
|
+
}
|
|
782
|
+
setVariable(address, portName, value) {
|
|
783
|
+
this.variables.set(durableVariableKey(address, portName), {
|
|
784
|
+
address: cloneExecutionAddress(address),
|
|
785
|
+
portName,
|
|
786
|
+
value
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
getVariable(address, portName, allowAncestorLookup = true) {
|
|
790
|
+
const exact = this.variables.get(durableVariableKey(address, portName));
|
|
791
|
+
if (exact !== void 0) return exact.value;
|
|
792
|
+
if (!allowAncestorLookup) return void 0;
|
|
793
|
+
const candidates = [...this.variables.values()].filter(
|
|
794
|
+
(variable) => variable.portName === portName && variable.address.nodeId === address.nodeId && variable.address.nodeType === address.nodeType && variable.address.executionIndex === address.executionIndex && isCanonicalPrefix(variable.address.frames, address.frames) && isCanonicalPrefix(variable.address.scopes, address.scopes) && isCanonicalPrefix(variable.address.branches, address.branches)
|
|
795
|
+
).sort(
|
|
796
|
+
(left, right) => right.address.frames.length + right.address.scopes.length + right.address.branches.length - (left.address.frames.length + left.address.scopes.length + left.address.branches.length)
|
|
797
|
+
);
|
|
798
|
+
const specificity = (candidate) => candidate.address.frames.length + candidate.address.scopes.length + candidate.address.branches.length;
|
|
799
|
+
if (candidates.length > 1 && specificity(candidates[0]) === specificity(candidates[1])) {
|
|
800
|
+
throw new Error(`Ambiguous durable variable address for ${address.nodeId}.${portName}`);
|
|
801
|
+
}
|
|
802
|
+
if (candidates[0] !== void 0) return candidates[0].value;
|
|
803
|
+
const converged = [...this.variables.values()].filter(
|
|
804
|
+
(variable) => variable.portName === portName && variable.address.nodeId === address.nodeId && variable.address.nodeType === address.nodeType && variable.address.executionIndex === address.executionIndex && isCanonicalEqual(variable.address.frames, address.frames) && isCanonicalEqual(variable.address.scopes, address.scopes) && isCanonicalPrefix(address.branches, variable.address.branches)
|
|
805
|
+
);
|
|
806
|
+
if (converged.length > 1) {
|
|
807
|
+
throw new Error(`Ambiguous durable variable address for ${address.nodeId}.${portName}`);
|
|
808
|
+
}
|
|
809
|
+
return converged[0]?.value;
|
|
810
|
+
}
|
|
811
|
+
resolveGate(runtime, boundary) {
|
|
812
|
+
validateWireValue(boundary.payload);
|
|
813
|
+
const mocked = mockedGateAnswer(runtime.services.mocks, boundary);
|
|
814
|
+
if (mocked !== void 0) return mocked;
|
|
815
|
+
const address = this.address(runtime, boundary.nodeId, boundary.nodeType, boundary.executionIndex);
|
|
816
|
+
const id = durableGateId(this.runId, boundary.kind, address);
|
|
817
|
+
if (this.resumeEnvelope !== void 0 && !this.resolutionConsumed) {
|
|
818
|
+
if (durableAddressKey(this.resumeEnvelope.location) !== durableAddressKey(address) || this.resumeEnvelope.gateId !== id || this.resumeEnvelope.gateKind !== boundary.kind || this.resolution === void 0 || this.resolution.gateId !== id) {
|
|
819
|
+
const error = new Error("Gate resolution is stale, reordered, or does not match the resume boundary");
|
|
820
|
+
error.name = "StaleGateError";
|
|
821
|
+
throw error;
|
|
822
|
+
}
|
|
823
|
+
validateWireValue(this.resolution.value);
|
|
824
|
+
this.resolutionConsumed = true;
|
|
825
|
+
return this.resolution.value;
|
|
826
|
+
}
|
|
827
|
+
if (this.resumeEnvelope !== void 0 && durableAddressKey(this.resumeEnvelope.location) === durableAddressKey(address)) {
|
|
828
|
+
const error = new Error("The consumed resume gate was re-entered");
|
|
829
|
+
error.name = "StaleGateError";
|
|
830
|
+
throw error;
|
|
831
|
+
}
|
|
832
|
+
const gate = {
|
|
833
|
+
id,
|
|
834
|
+
kind: boundary.kind,
|
|
835
|
+
address,
|
|
836
|
+
payload: boundary.payload
|
|
837
|
+
};
|
|
838
|
+
const state = this.snapshot(address);
|
|
839
|
+
const receipts = [...this.receipts.values()];
|
|
840
|
+
const bundleDigest = this.bundleDigest();
|
|
841
|
+
const continuation = this.graphFingerprint === void 0 || bundleDigest === void 0 ? void 0 : createContinuationEnvelope({
|
|
842
|
+
runId: this.runId,
|
|
843
|
+
gateId: id,
|
|
844
|
+
gateKind: boundary.kind,
|
|
845
|
+
workflowId: this.workflowId,
|
|
846
|
+
bundleDigest,
|
|
847
|
+
graphFingerprint: this.graphFingerprint,
|
|
848
|
+
location: address,
|
|
849
|
+
state,
|
|
850
|
+
receipts
|
|
851
|
+
});
|
|
852
|
+
throw new DurableGateYield(gate, state, receipts, continuation);
|
|
853
|
+
}
|
|
854
|
+
async executeEffect(runtime, boundary, execute) {
|
|
855
|
+
const address = this.address(runtime, boundary.nodeId, boundary.nodeType, boundary.executionIndex);
|
|
856
|
+
const key = operationKey(this.runId, address);
|
|
857
|
+
const committed = this.receipts.get(durableAddressKey(address));
|
|
858
|
+
if (committed !== void 0) {
|
|
859
|
+
throw new Error(`Committed effect "${key}" reached its execution body`);
|
|
860
|
+
}
|
|
861
|
+
let recovery;
|
|
862
|
+
try {
|
|
863
|
+
recovery = await runtime.services.effectAdapter?.recover(key, address);
|
|
864
|
+
} catch {
|
|
865
|
+
throw new AmbiguousEffectError(key, address);
|
|
866
|
+
}
|
|
867
|
+
if (recovery === void 0) {
|
|
868
|
+
throw new AmbiguousEffectError(key, address);
|
|
869
|
+
}
|
|
870
|
+
recovery = requireEffectRecovery(recovery, key, address);
|
|
871
|
+
if (recovery.kind === "ambiguous") throw new AmbiguousEffectError(key, address);
|
|
872
|
+
if (recovery.kind === "committed") {
|
|
873
|
+
this.receipts.set(durableAddressKey(address), {
|
|
874
|
+
address: cloneExecutionAddress(address),
|
|
875
|
+
operationKey: key,
|
|
876
|
+
receipt: recovery.receipt
|
|
877
|
+
});
|
|
878
|
+
return recovery.result;
|
|
879
|
+
}
|
|
880
|
+
let executed;
|
|
881
|
+
try {
|
|
882
|
+
executed = requireEffectExecution(await execute(key), key, address);
|
|
883
|
+
} catch (error) {
|
|
884
|
+
let afterFailure;
|
|
885
|
+
try {
|
|
886
|
+
afterFailure = await runtime.services.effectAdapter?.recover(key, address) ?? { kind: "ambiguous" };
|
|
887
|
+
} catch {
|
|
888
|
+
throw new AmbiguousEffectError(key, address);
|
|
889
|
+
}
|
|
890
|
+
afterFailure = requireEffectRecovery(afterFailure, key, address);
|
|
891
|
+
if (afterFailure.kind === "committed") {
|
|
892
|
+
this.receipts.set(durableAddressKey(address), {
|
|
893
|
+
address: cloneExecutionAddress(address),
|
|
894
|
+
operationKey: key,
|
|
895
|
+
receipt: afterFailure.receipt
|
|
896
|
+
});
|
|
897
|
+
return afterFailure.result;
|
|
898
|
+
}
|
|
899
|
+
if (afterFailure.kind === "ambiguous") {
|
|
900
|
+
throw new AmbiguousEffectError(key, address);
|
|
901
|
+
}
|
|
902
|
+
throw error;
|
|
903
|
+
}
|
|
904
|
+
if (runtime.services.effectAdapter?.commit !== void 0) {
|
|
905
|
+
try {
|
|
906
|
+
await runtime.services.effectAdapter.commit(key, address, executed);
|
|
907
|
+
} catch {
|
|
908
|
+
let committed2;
|
|
909
|
+
try {
|
|
910
|
+
committed2 = requireEffectRecovery(
|
|
911
|
+
await runtime.services.effectAdapter.recover(key, address),
|
|
912
|
+
key,
|
|
913
|
+
address
|
|
914
|
+
);
|
|
915
|
+
} catch {
|
|
916
|
+
throw new AmbiguousEffectError(key, address);
|
|
917
|
+
}
|
|
918
|
+
if (committed2.kind !== "committed" || canonicalWireValue(committed2.receipt) !== canonicalWireValue(executed.receipt) || canonicalWireValue(committed2.result) !== canonicalWireValue(executed.result)) throw new AmbiguousEffectError(key, address);
|
|
919
|
+
this.receipts.set(durableAddressKey(address), {
|
|
920
|
+
address: cloneExecutionAddress(address),
|
|
921
|
+
operationKey: key,
|
|
922
|
+
receipt: committed2.receipt
|
|
923
|
+
});
|
|
924
|
+
return committed2.result;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
this.receipts.set(durableAddressKey(address), {
|
|
928
|
+
address: cloneExecutionAddress(address),
|
|
929
|
+
operationKey: key,
|
|
930
|
+
receipt: executed.receipt
|
|
931
|
+
});
|
|
932
|
+
return executed.result;
|
|
933
|
+
}
|
|
934
|
+
snapshot(nextBoundary) {
|
|
935
|
+
const completedKeys = new Set(this.completed.keys());
|
|
936
|
+
return {
|
|
937
|
+
completed: [...this.completed.values()].map(cloneExecutionAddress),
|
|
938
|
+
variables: [...this.variables.values()].filter((variable) => completedKeys.has(durableAddressKey(variable.address))).map((variable) => {
|
|
939
|
+
try {
|
|
940
|
+
validateWireValue(variable.value);
|
|
941
|
+
} catch (error) {
|
|
942
|
+
throw new Error(
|
|
943
|
+
`Continuation variable ${variable.address.nodeId}.${variable.portName} is not a wire value: ${error instanceof Error ? error.message : String(error)}`
|
|
944
|
+
);
|
|
945
|
+
}
|
|
946
|
+
return {
|
|
947
|
+
address: cloneExecutionAddress(variable.address),
|
|
948
|
+
portName: variable.portName,
|
|
949
|
+
value: variable.value
|
|
950
|
+
};
|
|
951
|
+
}),
|
|
952
|
+
nextBoundary: cloneExecutionAddress(nextBoundary)
|
|
953
|
+
};
|
|
954
|
+
}
|
|
955
|
+
assertResumeResolutionConsumed() {
|
|
956
|
+
if (this.resumeEnvelope !== void 0 && !this.resolutionConsumed) {
|
|
957
|
+
const error = new Error("Resumed execution completed or yielded without consuming its exact gate resolution");
|
|
958
|
+
error.name = "UnconsumedGateResolutionError";
|
|
959
|
+
throw error;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
};
|
|
963
|
+
function createWorkflowRuntime(options) {
|
|
964
|
+
if (options.runId.trim().length === 0) {
|
|
965
|
+
throw new Error("runId must be a non-empty coordinator-owned identity");
|
|
966
|
+
}
|
|
967
|
+
const rootFrame = {
|
|
968
|
+
workflowId: options.workflowId,
|
|
969
|
+
invocation: 0
|
|
970
|
+
};
|
|
971
|
+
return {
|
|
972
|
+
runId: options.runId,
|
|
973
|
+
abortSignal: options.abortSignal,
|
|
974
|
+
services: options.services ?? {},
|
|
975
|
+
durable: new DurableExecution(
|
|
976
|
+
options.runId,
|
|
977
|
+
options.workflowId,
|
|
978
|
+
options.continuation,
|
|
979
|
+
options.resolution,
|
|
980
|
+
options.bundleDigest
|
|
981
|
+
),
|
|
982
|
+
frames: [rootFrame],
|
|
983
|
+
scopes: [],
|
|
984
|
+
branches: []
|
|
985
|
+
};
|
|
986
|
+
}
|
|
987
|
+
function isDurableGateYield(error) {
|
|
988
|
+
return error instanceof DurableGateYield || typeof error === "object" && error !== null && error.code === "FLOW_WEAVER_DURABLE_GATE_YIELD";
|
|
989
|
+
}
|
|
990
|
+
function isAmbiguousEffectError(error) {
|
|
991
|
+
return error instanceof AmbiguousEffectError || typeof error === "object" && error !== null && error.code === "FLOW_WEAVER_AMBIGUOUS_EFFECT";
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
// src/mcp/workflow-executor.ts
|
|
995
|
+
var ContinuationRefusalError = class extends Error {
|
|
996
|
+
constructor(refusal2) {
|
|
997
|
+
super(refusal2.message);
|
|
998
|
+
this.refusal = refusal2;
|
|
999
|
+
}
|
|
1000
|
+
refusal;
|
|
1001
|
+
name = "ContinuationRefusalError";
|
|
1002
|
+
};
|
|
1003
|
+
async function executeWorkflow(request) {
|
|
1004
|
+
const {
|
|
1005
|
+
runId,
|
|
1006
|
+
bundleDigest,
|
|
1007
|
+
filePath,
|
|
1008
|
+
params,
|
|
1009
|
+
workflowName,
|
|
1010
|
+
production: requestedProduction,
|
|
1011
|
+
includeTrace: requestedIncludeTrace,
|
|
1012
|
+
mocks,
|
|
1013
|
+
debugController,
|
|
1014
|
+
onEvent,
|
|
1015
|
+
externalNodeTypes,
|
|
1016
|
+
abortSignal,
|
|
1017
|
+
continuation,
|
|
1018
|
+
resolution,
|
|
1019
|
+
effectAdapter
|
|
1020
|
+
} = request;
|
|
1021
|
+
if (runId.trim().length === 0) {
|
|
1022
|
+
throw new Error("runId must be a non-empty coordinator-owned identity");
|
|
1023
|
+
}
|
|
1024
|
+
if (bundleDigest !== void 0 && !/^sha256:[0-9a-f]{64}$/.test(bundleDigest)) {
|
|
1025
|
+
throw new Error("bundleDigest must use canonical sha256:<64hex> form");
|
|
1026
|
+
}
|
|
1027
|
+
const acceptedResolution = acceptGateResolution(resolution);
|
|
1028
|
+
if (abortSignal?.aborted) throw new CancellationError();
|
|
1029
|
+
const resolvedPath = path.resolve(filePath);
|
|
1030
|
+
const includeTrace = requestedIncludeTrace !== false;
|
|
1031
|
+
const tmpId = `fw-exec-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
1032
|
+
const tmpBase = path.join(path.dirname(resolvedPath), tmpId);
|
|
1033
|
+
const tmpTsFile = `${tmpBase}.ts`;
|
|
1034
|
+
const tmpFile = `${tmpBase}.mjs`;
|
|
1035
|
+
try {
|
|
1036
|
+
fs2.copyFileSync(resolvedPath, tmpTsFile);
|
|
1037
|
+
const source = fs2.readFileSync(resolvedPath, "utf8");
|
|
1038
|
+
const allWorkflows = getAvailableWorkflows(source);
|
|
1039
|
+
if (allWorkflows.length === 0) {
|
|
1040
|
+
throw new Error("No workflow definition found in file");
|
|
1041
|
+
}
|
|
1042
|
+
const selectedWorkflow = workflowName ? allWorkflows.find((workflow) => workflow.functionName === workflowName) : allWorkflows[0];
|
|
1043
|
+
if (!selectedWorkflow) {
|
|
1044
|
+
throw new Error(`Workflow "${workflowName}" not found in file. Available: ${allWorkflows.map((w) => w.functionName).join(", ")}`);
|
|
1045
|
+
}
|
|
1046
|
+
const effectiveWorkflowId = selectedWorkflow.functionName;
|
|
1047
|
+
const parsed = await parseWorkflow(resolvedPath, {
|
|
1048
|
+
workflowName: effectiveWorkflowId,
|
|
1049
|
+
projectDir: path.dirname(resolvedPath),
|
|
1050
|
+
externalNodeTypes
|
|
1051
|
+
});
|
|
1052
|
+
if (parsed.errors.length > 0) {
|
|
1053
|
+
throw new Error(`Cannot fingerprint invalid workflow: ${parsed.errors.join("; ")}`);
|
|
1054
|
+
}
|
|
1055
|
+
const { capabilities, graphFingerprint, continuationGraph } = graphIdentity(
|
|
1056
|
+
parsed.ast,
|
|
1057
|
+
parsed.allWorkflows
|
|
1058
|
+
);
|
|
1059
|
+
if (capabilities.gate && bundleDigest === void 0) {
|
|
1060
|
+
throw new ContinuationRefusalError({
|
|
1061
|
+
accepted: false,
|
|
1062
|
+
reason: "wrong-bundle",
|
|
1063
|
+
message: "a workflow graph with durable gates requires coordinator-verified whole-bundle identity before execution"
|
|
1064
|
+
});
|
|
1065
|
+
}
|
|
1066
|
+
if (capabilities.gate && capabilities.effect && effectAdapter === void 0) {
|
|
1067
|
+
throw new ContinuationRefusalError({
|
|
1068
|
+
accepted: false,
|
|
1069
|
+
reason: "ambiguous-effect",
|
|
1070
|
+
message: "a durable-gate graph with effects requires an operation-key recovery adapter before execution"
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1073
|
+
validateDurableClosure(parsed.ast, parsed.allWorkflows);
|
|
1074
|
+
let acceptedContinuation;
|
|
1075
|
+
if (continuation !== void 0) {
|
|
1076
|
+
if (bundleDigest === void 0) {
|
|
1077
|
+
throw new ContinuationRefusalError({
|
|
1078
|
+
accepted: false,
|
|
1079
|
+
reason: "wrong-bundle",
|
|
1080
|
+
message: "durable resume requires coordinator-verified whole-bundle identity"
|
|
1081
|
+
});
|
|
1082
|
+
}
|
|
1083
|
+
const decoded = decodeContinuation(continuation, {
|
|
1084
|
+
runId,
|
|
1085
|
+
workflowId: effectiveWorkflowId,
|
|
1086
|
+
bundleDigest,
|
|
1087
|
+
graphFingerprint,
|
|
1088
|
+
gateId: acceptedResolution?.gateId,
|
|
1089
|
+
graph: continuationGraph
|
|
1090
|
+
});
|
|
1091
|
+
if (!decoded.accepted) throw new ContinuationRefusalError(decoded);
|
|
1092
|
+
if (acceptedResolution === void 0) {
|
|
1093
|
+
throw new ContinuationRefusalError({
|
|
1094
|
+
accepted: false,
|
|
1095
|
+
reason: "stale-gate",
|
|
1096
|
+
message: "a continuation resume requires its exact gate resolution"
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
acceptedContinuation = decoded.envelope;
|
|
1100
|
+
for (const receipt of acceptedContinuation.receipts) {
|
|
1101
|
+
const receiptWorkflowId = receipt.address.frames.at(-1)?.workflowId;
|
|
1102
|
+
const receiptNode = continuationGraph.nodes.find(
|
|
1103
|
+
(node) => node.workflowId === receiptWorkflowId && node.nodeId === receipt.address.nodeId && node.nodeType === receipt.address.nodeType
|
|
1104
|
+
);
|
|
1105
|
+
let recovery;
|
|
1106
|
+
try {
|
|
1107
|
+
recovery = requireEffectRecovery(
|
|
1108
|
+
await effectAdapter?.recover(receipt.operationKey, receipt.address),
|
|
1109
|
+
receipt.operationKey,
|
|
1110
|
+
receipt.address
|
|
1111
|
+
);
|
|
1112
|
+
} catch {
|
|
1113
|
+
recovery = { kind: "ambiguous" };
|
|
1114
|
+
}
|
|
1115
|
+
const recordedResult = Object.fromEntries(
|
|
1116
|
+
acceptedContinuation.state.variables.filter(
|
|
1117
|
+
(variable) => canonicalWireValue(variable.address) === canonicalWireValue(receipt.address) && receiptNode?.outputPorts.includes(variable.portName) === true
|
|
1118
|
+
).map((variable) => [variable.portName, variable.value])
|
|
1119
|
+
);
|
|
1120
|
+
if (recovery?.kind !== "committed" || canonicalWireValue(recovery.receipt) !== canonicalWireValue(receipt.receipt) || canonicalWireValue(recovery.result) !== canonicalWireValue(recordedResult)) {
|
|
1121
|
+
throw new ContinuationRefusalError({
|
|
1122
|
+
accepted: false,
|
|
1123
|
+
reason: "ambiguous-effect",
|
|
1124
|
+
message: "a completed effect continuation must be re-attested by its operation-key adapter"
|
|
1125
|
+
});
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
} else if (acceptedResolution !== void 0) {
|
|
1129
|
+
throw new ContinuationRefusalError({
|
|
1130
|
+
accepted: false,
|
|
1131
|
+
reason: "stale-gate",
|
|
1132
|
+
message: "a gate resolution cannot be supplied without a continuation"
|
|
1133
|
+
});
|
|
1134
|
+
}
|
|
1135
|
+
const production = debugController ? false : requestedProduction ?? !includeTrace;
|
|
1136
|
+
for (const wf of allWorkflows) {
|
|
1137
|
+
await compileWorkflow(tmpTsFile, {
|
|
1138
|
+
write: true,
|
|
1139
|
+
inPlace: true,
|
|
1140
|
+
// Forward caller-supplied foreign nodeType definitions so a
|
|
1141
|
+
// workflow that references a node from another package (an
|
|
1142
|
+
// `@node <id> <foreignType>` the file doesn't declare, e.g.
|
|
1143
|
+
// pack-core's `waitForApproval`) resolves its real ports during
|
|
1144
|
+
// the executor's own compile. Without this the internal parse
|
|
1145
|
+
// can't see those nodeTypes and falls back to a stub, failing
|
|
1146
|
+
// validation. Callers that resolve foreign defs from a wire
|
|
1147
|
+
// manifest (no node_modules to read a .d.ts) pass them here.
|
|
1148
|
+
parse: { workflowName: wf.functionName, externalNodeTypes },
|
|
1149
|
+
generate: { production }
|
|
1150
|
+
});
|
|
1151
|
+
}
|
|
1152
|
+
const compiledCode = fs2.readFileSync(tmpTsFile, "utf8");
|
|
1153
|
+
const jsOutput = ts.transpileModule(compiledCode, {
|
|
1154
|
+
compilerOptions: {
|
|
1155
|
+
module: ts.ModuleKind.ESNext,
|
|
1156
|
+
target: ts.ScriptTarget.ESNext,
|
|
1157
|
+
esModuleInterop: true
|
|
1158
|
+
}
|
|
1159
|
+
});
|
|
1160
|
+
const transpiledOutput = rewriteSrcImportsToDist(jsOutput.outputText, path.dirname(tmpTsFile));
|
|
1161
|
+
fs2.writeFileSync(tmpFile, transpiledOutput, "utf8");
|
|
1162
|
+
const trace = [];
|
|
1163
|
+
const debugger_ = includeTrace ? {
|
|
1164
|
+
sendEvent: (event) => {
|
|
1165
|
+
const traceEvent = {
|
|
1166
|
+
type: event.type || "UNKNOWN",
|
|
1167
|
+
timestamp: Date.now(),
|
|
1168
|
+
data: event
|
|
1169
|
+
};
|
|
1170
|
+
trace.push(traceEvent);
|
|
1171
|
+
onEvent?.(traceEvent);
|
|
1172
|
+
},
|
|
1173
|
+
innerFlowInvocation: false
|
|
1174
|
+
} : void 0;
|
|
1175
|
+
const mod = await import(pathToFileURL(tmpFile).href);
|
|
1176
|
+
const workflowRegistry = {};
|
|
1177
|
+
for (const workflow of parsed.allWorkflows) {
|
|
1178
|
+
const value = mod[workflow.functionName];
|
|
1179
|
+
if (typeof value === "function") {
|
|
1180
|
+
workflowRegistry[workflow.functionName] = value;
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
const services = {
|
|
1184
|
+
debugger: debugger_,
|
|
1185
|
+
debugController,
|
|
1186
|
+
mocks,
|
|
1187
|
+
effectAdapter,
|
|
1188
|
+
workflowRegistry
|
|
1189
|
+
};
|
|
1190
|
+
const runtime = createWorkflowRuntime({
|
|
1191
|
+
runId,
|
|
1192
|
+
workflowId: effectiveWorkflowId,
|
|
1193
|
+
abortSignal,
|
|
1194
|
+
services,
|
|
1195
|
+
continuation: acceptedContinuation,
|
|
1196
|
+
resolution: acceptedResolution,
|
|
1197
|
+
bundleDigest
|
|
1198
|
+
});
|
|
1199
|
+
const exportedFn = findExportedFunction(mod, effectiveWorkflowId);
|
|
1200
|
+
if (!exportedFn) {
|
|
1201
|
+
const available = Object.entries(mod).filter(([k, v]) => k !== "__esModule" && typeof v === "function").map(([k]) => k);
|
|
1202
|
+
const availStr = available.length > 0 ? `. Available: ${available.join(", ")}` : "";
|
|
1203
|
+
throw new Error(
|
|
1204
|
+
workflowName ? `Workflow "${workflowName}" not found in file${availStr}` : `No exported workflow function found in file${availStr}`
|
|
1205
|
+
);
|
|
1206
|
+
}
|
|
1207
|
+
const startTime = Date.now();
|
|
1208
|
+
if (abortSignal?.aborted) throw new CancellationError();
|
|
1209
|
+
try {
|
|
1210
|
+
const result = await exportedFn.fn(true, params ?? {}, runtime);
|
|
1211
|
+
runtime.durable.assertResumeResolutionConsumed();
|
|
1212
|
+
const executionTime = Date.now() - startTime;
|
|
1213
|
+
return {
|
|
1214
|
+
kind: "completed",
|
|
1215
|
+
result,
|
|
1216
|
+
functionName: exportedFn.name,
|
|
1217
|
+
executionTime,
|
|
1218
|
+
...includeTrace && { trace, summary: computeTraceSummary(trace) }
|
|
1219
|
+
};
|
|
1220
|
+
} catch (error) {
|
|
1221
|
+
if (isDurableGateYield(error)) {
|
|
1222
|
+
if (bundleDigest === void 0) {
|
|
1223
|
+
throw new ContinuationRefusalError({
|
|
1224
|
+
accepted: false,
|
|
1225
|
+
reason: "wrong-bundle",
|
|
1226
|
+
message: "durable yield requires coordinator-verified whole-bundle identity"
|
|
1227
|
+
});
|
|
1228
|
+
}
|
|
1229
|
+
runtime.durable.assertResumeResolutionConsumed();
|
|
1230
|
+
const executionTime = Date.now() - startTime;
|
|
1231
|
+
return {
|
|
1232
|
+
kind: "yielded",
|
|
1233
|
+
gate: error.gate,
|
|
1234
|
+
continuation: createContinuationEnvelope({
|
|
1235
|
+
runId,
|
|
1236
|
+
gateId: error.gate.id,
|
|
1237
|
+
gateKind: error.gate.kind,
|
|
1238
|
+
workflowId: effectiveWorkflowId,
|
|
1239
|
+
bundleDigest,
|
|
1240
|
+
graphFingerprint,
|
|
1241
|
+
location: error.gate.address,
|
|
1242
|
+
state: error.state,
|
|
1243
|
+
receipts: error.receipts
|
|
1244
|
+
}),
|
|
1245
|
+
functionName: exportedFn.name,
|
|
1246
|
+
executionTime,
|
|
1247
|
+
...includeTrace && { trace, summary: computeTraceSummary(trace) }
|
|
1248
|
+
};
|
|
1249
|
+
}
|
|
1250
|
+
if (isAmbiguousEffectError(error)) {
|
|
1251
|
+
throw new ContinuationRefusalError({
|
|
1252
|
+
accepted: false,
|
|
1253
|
+
reason: "ambiguous-effect",
|
|
1254
|
+
message: error.message
|
|
1255
|
+
});
|
|
1256
|
+
}
|
|
1257
|
+
throw error;
|
|
1258
|
+
}
|
|
1259
|
+
} finally {
|
|
1260
|
+
try {
|
|
1261
|
+
fs2.unlinkSync(tmpFile);
|
|
1262
|
+
} catch {
|
|
1263
|
+
}
|
|
1264
|
+
try {
|
|
1265
|
+
fs2.unlinkSync(tmpTsFile);
|
|
1266
|
+
} catch {
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
function computeTraceSummary(trace) {
|
|
1271
|
+
if (trace.length === 0) {
|
|
1272
|
+
return { totalNodes: 0, succeeded: 0, failed: 0, cancelled: 0, nodeTimings: [], totalDurationMs: 0 };
|
|
1273
|
+
}
|
|
1274
|
+
const nodeStartTimes = /* @__PURE__ */ new Map();
|
|
1275
|
+
const nodeFinalStatus = /* @__PURE__ */ new Map();
|
|
1276
|
+
const nodeTimings = [];
|
|
1277
|
+
for (const event of trace) {
|
|
1278
|
+
if (event.type !== "STATUS_CHANGED" || !event.data) continue;
|
|
1279
|
+
const id = event.data.id;
|
|
1280
|
+
const status = event.data.status;
|
|
1281
|
+
if (!id || !status) continue;
|
|
1282
|
+
if (status === "RUNNING") {
|
|
1283
|
+
nodeStartTimes.set(id, event.timestamp);
|
|
1284
|
+
}
|
|
1285
|
+
if (status === "SUCCEEDED" || status === "FAILED" || status === "CANCELLED") {
|
|
1286
|
+
nodeFinalStatus.set(id, status);
|
|
1287
|
+
const startTime = nodeStartTimes.get(id);
|
|
1288
|
+
if (startTime !== void 0) {
|
|
1289
|
+
nodeTimings.push({ nodeId: id, durationMs: event.timestamp - startTime });
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
let succeeded = 0;
|
|
1294
|
+
let failed = 0;
|
|
1295
|
+
let cancelled = 0;
|
|
1296
|
+
for (const status of nodeFinalStatus.values()) {
|
|
1297
|
+
if (status === "SUCCEEDED") succeeded++;
|
|
1298
|
+
else if (status === "FAILED") failed++;
|
|
1299
|
+
else if (status === "CANCELLED") cancelled++;
|
|
1300
|
+
}
|
|
1301
|
+
const totalDurationMs = trace[trace.length - 1].timestamp - trace[0].timestamp;
|
|
1302
|
+
return {
|
|
1303
|
+
totalNodes: nodeFinalStatus.size,
|
|
1304
|
+
succeeded,
|
|
1305
|
+
failed,
|
|
1306
|
+
cancelled,
|
|
1307
|
+
nodeTimings,
|
|
1308
|
+
totalDurationMs
|
|
1309
|
+
};
|
|
1310
|
+
}
|
|
1311
|
+
function findExportedFunction(mod, preferredName) {
|
|
1312
|
+
if (preferredName && typeof mod[preferredName] === "function") {
|
|
1313
|
+
return { name: preferredName, fn: mod[preferredName] };
|
|
1314
|
+
}
|
|
1315
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
1316
|
+
if (key === "__esModule") continue;
|
|
1317
|
+
if (typeof value === "function") {
|
|
1318
|
+
return { name: key, fn: value };
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
return null;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
export {
|
|
1325
|
+
CancellationError,
|
|
1326
|
+
ContinuationRefusalError,
|
|
1327
|
+
executeWorkflow,
|
|
1328
|
+
computeTraceSummary
|
|
1329
|
+
};
|