@synergenius/flow-weaver 0.33.2 → 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 -245
- 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 -89384
- 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 +20 -32
- 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 +2 -3
- package/dist/diagram/process-view.d.ts +79 -0
- package/dist/diagram/spine.d.ts +25 -0
- package/dist/diagram/theme.d.ts +1 -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 -1226
- package/dist/diagram/html-viewer.d.ts +0 -21
- package/dist/diagram/html-viewer.js +0 -1745
- package/dist/diagram/layout.js +0 -143
- package/dist/diagram/orthogonal-router.js +0 -458
- package/dist/diagram/renderer.d.ts +0 -3
- package/dist/diagram/renderer.js +0 -280
- 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
package/dist/jsdoc-parser.js
DELETED
|
@@ -1,1189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSDoc annotation parser for Flow Weaver
|
|
3
|
-
*
|
|
4
|
-
* Parses @flowWeaver annotations from JSDoc comments.
|
|
5
|
-
*/
|
|
6
|
-
import { isExecutePort, isSuccessPort, isFailurePort, isScopedMandatoryPort, KNOWN_NODETYPE_TAGS, KNOWN_PATTERN_TAGS, STANDARD_JSDOC_TAGS, getKnownWorkflowTags, } from './constants.js';
|
|
7
|
-
import { inferDataTypeFromTS } from './type-mappings.js';
|
|
8
|
-
import { findClosestMatches } from './utils/string-distance.js';
|
|
9
|
-
import { parsePortLine, parseNodeLine, parseConnectLine, parsePositionLine, parseScopeLine, parseMapLine, parsePathLine, parseFanOutLine, parseFanInLine, parseCoerceLine, parseTriggerLine, parseCancelOnLine, parseThrottleLine, } from './chevrotain-parser/index.js';
|
|
10
|
-
/**
|
|
11
|
-
* Extract the type of a field from a callback's return type using ts-morph Type API.
|
|
12
|
-
*
|
|
13
|
-
* For scoped INPUT ports, we need to find the return type of the callback and extract
|
|
14
|
-
* the type of a specific field from that return type object.
|
|
15
|
-
*
|
|
16
|
-
* @param callbackType - The Type of the callback parameter
|
|
17
|
-
* @param fieldName - The name of the field to extract from the return type
|
|
18
|
-
* @returns The TypeScript type string, or undefined if extraction fails
|
|
19
|
-
*/
|
|
20
|
-
function extractCallbackReturnFieldType(callbackType, fieldName) {
|
|
21
|
-
// Get call signatures from the callback type
|
|
22
|
-
const callSignatures = callbackType.getCallSignatures();
|
|
23
|
-
if (callSignatures.length === 0) {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
// Use the first call signature (callbacks typically have one)
|
|
27
|
-
let returnType = callSignatures[0].getReturnType();
|
|
28
|
-
// Unwrap Promise<T> to get T - async callbacks return Promise<{...}>
|
|
29
|
-
const returnTypeText = returnType.getText();
|
|
30
|
-
if (returnTypeText.startsWith('Promise<')) {
|
|
31
|
-
const typeArgs = returnType.getTypeArguments();
|
|
32
|
-
if (typeArgs.length > 0) {
|
|
33
|
-
returnType = typeArgs[0];
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
// Get the property from the return type
|
|
37
|
-
const property = returnType.getProperty(fieldName);
|
|
38
|
-
if (!property) {
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
// Get the type of the property
|
|
42
|
-
const propertyType = getPropertyType(property, returnType);
|
|
43
|
-
if (!propertyType) {
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
// Get the type text - use getText() which handles complex types properly
|
|
47
|
-
// Pass undefined to avoid import path expansion
|
|
48
|
-
return propertyType.getText(undefined, 0);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Get the type of a property Symbol.
|
|
52
|
-
*/
|
|
53
|
-
function getPropertyType(property, containerType) {
|
|
54
|
-
// Try to get the type via getTypeAtLocation on the value declaration
|
|
55
|
-
const valueDecl = property.getValueDeclaration();
|
|
56
|
-
if (valueDecl) {
|
|
57
|
-
return valueDecl.getType();
|
|
58
|
-
}
|
|
59
|
-
// Fallback: get the declared type from the container
|
|
60
|
-
const declaredType = containerType.getPropertyOrThrow(property.getName());
|
|
61
|
-
if (declaredType) {
|
|
62
|
-
// This returns a Symbol, get its type via declarations
|
|
63
|
-
const decls = declaredType.getDeclarations();
|
|
64
|
-
if (decls.length > 0) {
|
|
65
|
-
return decls[0].getType();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Extract the type of a parameter from a callback's parameter list using ts-morph Type API.
|
|
72
|
-
*
|
|
73
|
-
* For scoped OUTPUT ports, we need to find the parameters of the callback and extract
|
|
74
|
-
* the type of a specific parameter by name.
|
|
75
|
-
*
|
|
76
|
-
* @param callbackType - The Type of the callback parameter
|
|
77
|
-
* @param paramName - The name of the parameter to extract
|
|
78
|
-
* @returns The TypeScript type string, or undefined if extraction fails
|
|
79
|
-
*/
|
|
80
|
-
function extractCallbackParamType(callbackType, paramName) {
|
|
81
|
-
// Get call signatures from the callback type
|
|
82
|
-
const callSignatures = callbackType.getCallSignatures();
|
|
83
|
-
if (callSignatures.length === 0) {
|
|
84
|
-
return undefined;
|
|
85
|
-
}
|
|
86
|
-
// Use the first call signature
|
|
87
|
-
const parameters = callSignatures[0].getParameters();
|
|
88
|
-
// Find the parameter by name
|
|
89
|
-
for (const param of parameters) {
|
|
90
|
-
if (param.getName() === paramName) {
|
|
91
|
-
const valueDecl = param.getValueDeclaration();
|
|
92
|
-
if (valueDecl) {
|
|
93
|
-
const paramType = valueDecl.getType();
|
|
94
|
-
return paramType.getText(undefined, 0);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return undefined;
|
|
99
|
-
}
|
|
100
|
-
export class JSDocParser {
|
|
101
|
-
/**
|
|
102
|
-
* Parse @flowWeaver nodeType from JSDoc comments.
|
|
103
|
-
* When a TagHandlerRegistry is provided, unknown tags are checked against it
|
|
104
|
-
* before being reported as warnings.
|
|
105
|
-
*/
|
|
106
|
-
parseNodeType(func, warnings, tagRegistry) {
|
|
107
|
-
const jsdocs = func.getJsDocs();
|
|
108
|
-
if (jsdocs.length === 0)
|
|
109
|
-
return null;
|
|
110
|
-
// Find the JSDoc block that contains @flowWeaver nodeType (or @flowWeaver node shorthand)
|
|
111
|
-
let jsdoc = null;
|
|
112
|
-
let flowWeaverTag = null;
|
|
113
|
-
let isNodeShorthand = false;
|
|
114
|
-
for (const doc of jsdocs) {
|
|
115
|
-
const tags = doc.getTags();
|
|
116
|
-
const tag = tags.find((t) => {
|
|
117
|
-
if (t.getTagName() !== 'flowWeaver')
|
|
118
|
-
return false;
|
|
119
|
-
const comment = t.getCommentText()?.trim();
|
|
120
|
-
return comment === 'nodeType' || comment === 'node';
|
|
121
|
-
});
|
|
122
|
-
if (tag) {
|
|
123
|
-
jsdoc = doc;
|
|
124
|
-
flowWeaverTag = tag;
|
|
125
|
-
isNodeShorthand = flowWeaverTag.getCommentText()?.trim() === 'node';
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (!jsdoc || !flowWeaverTag)
|
|
130
|
-
return null;
|
|
131
|
-
const tags = jsdoc.getTags();
|
|
132
|
-
const config = {
|
|
133
|
-
inputs: {},
|
|
134
|
-
outputs: {},
|
|
135
|
-
};
|
|
136
|
-
// @flowWeaver node implies expression mode (auto-detect from signature)
|
|
137
|
-
if (isNodeShorthand) {
|
|
138
|
-
config.expression = true;
|
|
139
|
-
}
|
|
140
|
-
// Extract description from JSDoc comment text (before tags)
|
|
141
|
-
const descriptionText = jsdoc.getDescription();
|
|
142
|
-
if (descriptionText && descriptionText.trim()) {
|
|
143
|
-
config.description = descriptionText.trim();
|
|
144
|
-
}
|
|
145
|
-
// Parse tags
|
|
146
|
-
tags.forEach((tag) => {
|
|
147
|
-
const tagName = tag.getTagName();
|
|
148
|
-
const comment = tag.getCommentText() || '';
|
|
149
|
-
switch (tagName) {
|
|
150
|
-
case 'name':
|
|
151
|
-
config.name = comment.trim();
|
|
152
|
-
break;
|
|
153
|
-
case 'label':
|
|
154
|
-
config.label = comment.trim();
|
|
155
|
-
break;
|
|
156
|
-
case 'description':
|
|
157
|
-
config.description = comment.trim();
|
|
158
|
-
break;
|
|
159
|
-
case 'color':
|
|
160
|
-
config.color = comment.trim().replace(/^["']|["']$/g, '');
|
|
161
|
-
break;
|
|
162
|
-
case 'icon':
|
|
163
|
-
config.icon = comment.trim().replace(/^["']|["']$/g, '');
|
|
164
|
-
break;
|
|
165
|
-
case 'tag':
|
|
166
|
-
config.tags = config.tags || [];
|
|
167
|
-
const tagMatch = comment.match(/^(\S+)(?:\s+"([^"]+)")?$/);
|
|
168
|
-
if (tagMatch) {
|
|
169
|
-
config.tags.push({
|
|
170
|
-
label: tagMatch[1],
|
|
171
|
-
...(tagMatch[2] && { tooltip: tagMatch[2] }),
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
break;
|
|
175
|
-
case 'executeWhen':
|
|
176
|
-
config.executeWhen = comment.trim();
|
|
177
|
-
break;
|
|
178
|
-
case 'scope':
|
|
179
|
-
config.scope = comment.trim();
|
|
180
|
-
break;
|
|
181
|
-
case 'expression':
|
|
182
|
-
config.expression = true;
|
|
183
|
-
break;
|
|
184
|
-
case 'pullExecution':
|
|
185
|
-
const pullValue = comment.trim();
|
|
186
|
-
if (pullValue) {
|
|
187
|
-
config.defaultConfig = config.defaultConfig || {};
|
|
188
|
-
config.defaultConfig.pullExecution = { triggerPort: pullValue };
|
|
189
|
-
}
|
|
190
|
-
break;
|
|
191
|
-
case 'input':
|
|
192
|
-
this.parseInputTag(tag, config, func, warnings);
|
|
193
|
-
break;
|
|
194
|
-
case 'output':
|
|
195
|
-
this.parseOutputTag(tag, config, func, warnings);
|
|
196
|
-
break;
|
|
197
|
-
case 'step':
|
|
198
|
-
this.parseStepTag(tag, config, func, warnings);
|
|
199
|
-
break;
|
|
200
|
-
case 'deploy':
|
|
201
|
-
config.deploy = config.deploy || {};
|
|
202
|
-
this.parseDeployTag(tag, config.deploy);
|
|
203
|
-
break;
|
|
204
|
-
default: {
|
|
205
|
-
// D: Context validation - tags that belong to other block types
|
|
206
|
-
if (tagName === 'param' || tagName === 'returns' || tagName === 'return') {
|
|
207
|
-
warnings.push(`@${tagName} is for workflows, not node types. Use @input/@output instead.`);
|
|
208
|
-
}
|
|
209
|
-
else if (tagRegistry && tagRegistry.has(tagName)) {
|
|
210
|
-
// Delegate to pack-contributed tag handler
|
|
211
|
-
if (!config.deploy)
|
|
212
|
-
config.deploy = {};
|
|
213
|
-
tagRegistry.handle(tagName, comment, 'nodeType', config.deploy, warnings);
|
|
214
|
-
}
|
|
215
|
-
else if (!KNOWN_NODETYPE_TAGS.has(tagName) && !STANDARD_JSDOC_TAGS.has(tagName)) {
|
|
216
|
-
// C: Unknown tag detection with suggestions
|
|
217
|
-
const suggestions = findClosestMatches(tagName, [...KNOWN_NODETYPE_TAGS]);
|
|
218
|
-
const hint = suggestions.length > 0 ? ` Did you mean @${suggestions[0]}?` : '';
|
|
219
|
-
warnings.push(`Unknown annotation @${tagName} in nodeType block.${hint}`);
|
|
220
|
-
}
|
|
221
|
-
break;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
return config;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Parse @flowWeaver workflow from JSDoc comments.
|
|
229
|
-
* When a TagHandlerRegistry is provided, unknown tags are checked against it
|
|
230
|
-
* before being reported as warnings.
|
|
231
|
-
*/
|
|
232
|
-
parseWorkflow(func, warnings, tagRegistry) {
|
|
233
|
-
const jsdocs = func.getJsDocs();
|
|
234
|
-
if (jsdocs.length === 0)
|
|
235
|
-
return null;
|
|
236
|
-
// Find the JSDoc block that contains @flowWeaver workflow
|
|
237
|
-
let jsdoc = null;
|
|
238
|
-
let flowWeaverTag = null;
|
|
239
|
-
for (const doc of jsdocs) {
|
|
240
|
-
const tags = doc.getTags();
|
|
241
|
-
const tag = tags.find((t) => t.getTagName() === 'flowWeaver' && t.getCommentText()?.trim() === 'workflow');
|
|
242
|
-
if (tag) {
|
|
243
|
-
jsdoc = doc;
|
|
244
|
-
flowWeaverTag = tag;
|
|
245
|
-
break;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
if (!jsdoc || !flowWeaverTag)
|
|
249
|
-
return null;
|
|
250
|
-
const tags = jsdoc.getTags();
|
|
251
|
-
const config = {
|
|
252
|
-
imports: [],
|
|
253
|
-
instances: [],
|
|
254
|
-
connections: [],
|
|
255
|
-
scopes: {},
|
|
256
|
-
positions: {},
|
|
257
|
-
};
|
|
258
|
-
// Parse tags
|
|
259
|
-
tags.forEach((tag) => {
|
|
260
|
-
const tagName = tag.getTagName();
|
|
261
|
-
const comment = tag.getCommentText() || '';
|
|
262
|
-
switch (tagName) {
|
|
263
|
-
case 'name':
|
|
264
|
-
config.name = comment.trim();
|
|
265
|
-
break;
|
|
266
|
-
case 'fwImport':
|
|
267
|
-
// Parse @fwImport nodeName functionName from "packageName"
|
|
268
|
-
// Example: @fwImport npm/autoprefixer/autoprefixer autoprefixer from "autoprefixer"
|
|
269
|
-
this.parseImportTag(tag, config, warnings);
|
|
270
|
-
break;
|
|
271
|
-
case 'description':
|
|
272
|
-
config.description = comment.trim();
|
|
273
|
-
break;
|
|
274
|
-
case 'strictTypes':
|
|
275
|
-
// @strictTypes with no value or any truthy value = true
|
|
276
|
-
// @strictTypes false = false
|
|
277
|
-
config.strictTypes = comment.trim().toLowerCase() !== 'false';
|
|
278
|
-
break;
|
|
279
|
-
case 'autoConnect':
|
|
280
|
-
// @autoConnect enables automatic linear connection wiring
|
|
281
|
-
// OPT-IN: only applies when present, without it behavior is unchanged
|
|
282
|
-
config.autoConnect = true;
|
|
283
|
-
break;
|
|
284
|
-
case 'node':
|
|
285
|
-
this.parseNodeTag(tag, config, warnings);
|
|
286
|
-
break;
|
|
287
|
-
case 'position':
|
|
288
|
-
this.parsePositionTag(tag, config, warnings);
|
|
289
|
-
break;
|
|
290
|
-
case 'connect':
|
|
291
|
-
this.parseConnectTag(tag, config, warnings);
|
|
292
|
-
break;
|
|
293
|
-
case 'scope':
|
|
294
|
-
this.parseScopeTag(tag, config, warnings);
|
|
295
|
-
break;
|
|
296
|
-
case 'map':
|
|
297
|
-
this.parseMapTag(tag, config, warnings);
|
|
298
|
-
break;
|
|
299
|
-
case 'path':
|
|
300
|
-
this.parsePathTag(tag, config, warnings);
|
|
301
|
-
break;
|
|
302
|
-
case 'fanOut':
|
|
303
|
-
this.parseFanOutTag(tag, config, warnings);
|
|
304
|
-
break;
|
|
305
|
-
case 'fanIn':
|
|
306
|
-
this.parseFanInTag(tag, config, warnings);
|
|
307
|
-
break;
|
|
308
|
-
case 'coerce':
|
|
309
|
-
this.parseCoerceTag(tag, config, warnings);
|
|
310
|
-
break;
|
|
311
|
-
case 'trigger':
|
|
312
|
-
this.parseTriggerTag(tag, config, warnings, tagRegistry);
|
|
313
|
-
break;
|
|
314
|
-
case 'cancelOn':
|
|
315
|
-
this.parseCancelOnTag(tag, config, warnings);
|
|
316
|
-
break;
|
|
317
|
-
case 'retries': {
|
|
318
|
-
const n = parseInt(comment.trim(), 10);
|
|
319
|
-
if (!isNaN(n) && n >= 0)
|
|
320
|
-
config.retries = n;
|
|
321
|
-
else
|
|
322
|
-
warnings.push(`Invalid @retries value: "${comment.trim()}". Expected non-negative integer.`);
|
|
323
|
-
break;
|
|
324
|
-
}
|
|
325
|
-
case 'timeout': {
|
|
326
|
-
const val = comment.trim().replace(/^["']|["']$/g, '');
|
|
327
|
-
if (val)
|
|
328
|
-
config.timeout = val;
|
|
329
|
-
break;
|
|
330
|
-
}
|
|
331
|
-
case 'throttle':
|
|
332
|
-
this.parseThrottleTag(tag, config, warnings);
|
|
333
|
-
break;
|
|
334
|
-
case 'deploy':
|
|
335
|
-
config.deploy = config.deploy || {};
|
|
336
|
-
this.parseDeployTag(tag, config.deploy);
|
|
337
|
-
break;
|
|
338
|
-
case 'param':
|
|
339
|
-
this.parseParamTag(tag, config, func, warnings);
|
|
340
|
-
break;
|
|
341
|
-
case 'return':
|
|
342
|
-
case 'returns':
|
|
343
|
-
this.parseReturnTag(tag, config, func, warnings);
|
|
344
|
-
break;
|
|
345
|
-
default: {
|
|
346
|
-
// D: Context validation - tags that belong to other block types
|
|
347
|
-
if (tagName === 'color' || tagName === 'icon' || tagName === 'tag') {
|
|
348
|
-
warnings.push(`@${tagName} is for node types, not workflows. Use it on @flowWeaver nodeType instead.`);
|
|
349
|
-
}
|
|
350
|
-
else if (tagName === 'input' || tagName === 'output' || tagName === 'step') {
|
|
351
|
-
warnings.push(`@${tagName} is for node types, not workflows. Use @param/@returns for workflows.`);
|
|
352
|
-
}
|
|
353
|
-
else if (tagRegistry && tagRegistry.has(tagName)) {
|
|
354
|
-
// Delegate to pack-contributed tag handler
|
|
355
|
-
if (!config.deploy)
|
|
356
|
-
config.deploy = {};
|
|
357
|
-
tagRegistry.handle(tagName, comment, 'workflow', config.deploy, warnings);
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
const knownTags = getKnownWorkflowTags(tagRegistry?.getRegisteredTags());
|
|
361
|
-
if (!knownTags.has(tagName) && !STANDARD_JSDOC_TAGS.has(tagName)) {
|
|
362
|
-
// C: Unknown tag detection with suggestions
|
|
363
|
-
const suggestions = findClosestMatches(tagName, [...knownTags]);
|
|
364
|
-
const hint = suggestions.length > 0 ? ` Did you mean @${suggestions[0]}?` : '';
|
|
365
|
-
warnings.push(`Unknown annotation @${tagName} in workflow block.${hint}`);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
break;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
});
|
|
372
|
-
return config;
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Parse @flowWeaver pattern from JSDoc comments
|
|
376
|
-
*/
|
|
377
|
-
parsePattern(func, warnings) {
|
|
378
|
-
const jsdocs = func.getJsDocs();
|
|
379
|
-
if (jsdocs.length === 0)
|
|
380
|
-
return null;
|
|
381
|
-
// Find the JSDoc block that contains @flowWeaver pattern
|
|
382
|
-
let jsdoc = null;
|
|
383
|
-
let flowWeaverTag = null;
|
|
384
|
-
for (const doc of jsdocs) {
|
|
385
|
-
const tags = doc.getTags();
|
|
386
|
-
const tag = tags.find((t) => t.getTagName() === 'flowWeaver' && t.getCommentText()?.trim() === 'pattern');
|
|
387
|
-
if (tag) {
|
|
388
|
-
jsdoc = doc;
|
|
389
|
-
flowWeaverTag = tag;
|
|
390
|
-
break;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
if (!jsdoc || !flowWeaverTag)
|
|
394
|
-
return null;
|
|
395
|
-
const tags = jsdoc.getTags();
|
|
396
|
-
const config = {
|
|
397
|
-
instances: [],
|
|
398
|
-
connections: [],
|
|
399
|
-
ports: [],
|
|
400
|
-
positions: {},
|
|
401
|
-
};
|
|
402
|
-
// Parse tags
|
|
403
|
-
tags.forEach((tag) => {
|
|
404
|
-
const tagName = tag.getTagName();
|
|
405
|
-
const comment = tag.getCommentText() || '';
|
|
406
|
-
switch (tagName) {
|
|
407
|
-
case 'name':
|
|
408
|
-
config.name = comment.trim();
|
|
409
|
-
break;
|
|
410
|
-
case 'description':
|
|
411
|
-
config.description = comment.trim();
|
|
412
|
-
break;
|
|
413
|
-
case 'node':
|
|
414
|
-
this.parsePatternNodeTag(tag, config, warnings);
|
|
415
|
-
break;
|
|
416
|
-
case 'position':
|
|
417
|
-
this.parsePatternPositionTag(tag, config, warnings);
|
|
418
|
-
break;
|
|
419
|
-
case 'connect':
|
|
420
|
-
this.parsePatternConnectTag(tag, config, warnings);
|
|
421
|
-
break;
|
|
422
|
-
case 'port':
|
|
423
|
-
this.parsePatternPortTag(tag, config, warnings);
|
|
424
|
-
break;
|
|
425
|
-
default:
|
|
426
|
-
if (!KNOWN_PATTERN_TAGS.has(tagName) && !STANDARD_JSDOC_TAGS.has(tagName)) {
|
|
427
|
-
const suggestions = findClosestMatches(tagName, [...KNOWN_PATTERN_TAGS]);
|
|
428
|
-
const hint = suggestions.length > 0 ? ` Did you mean @${suggestions[0]}?` : '';
|
|
429
|
-
warnings.push(`Unknown annotation @${tagName} in pattern block.${hint}`);
|
|
430
|
-
}
|
|
431
|
-
break;
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
// Apply positions to instances
|
|
435
|
-
if (config.positions && config.instances) {
|
|
436
|
-
for (const instance of config.instances) {
|
|
437
|
-
const pos = config.positions[instance.id];
|
|
438
|
-
if (pos) {
|
|
439
|
-
instance.config = instance.config || {};
|
|
440
|
-
instance.config.x = pos.x;
|
|
441
|
-
instance.config.y = pos.y;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
return config;
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Parse @node tag for patterns.
|
|
449
|
-
* Format: @node instanceId nodeType
|
|
450
|
-
*/
|
|
451
|
-
parsePatternNodeTag(tag, config, warnings) {
|
|
452
|
-
const comment = tag.getCommentText() || '';
|
|
453
|
-
const result = parseNodeLine(`@node ${comment}`, warnings);
|
|
454
|
-
if (!result) {
|
|
455
|
-
warnings.push(`Invalid @node tag format in pattern: ${comment}`);
|
|
456
|
-
return;
|
|
457
|
-
}
|
|
458
|
-
const { instanceId, nodeType } = result;
|
|
459
|
-
config.instances.push({
|
|
460
|
-
id: instanceId,
|
|
461
|
-
nodeType: nodeType,
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* Parse @position tag for patterns.
|
|
466
|
-
* Format: @position nodeId x y
|
|
467
|
-
*/
|
|
468
|
-
parsePatternPositionTag(tag, config, warnings) {
|
|
469
|
-
const comment = tag.getCommentText() || '';
|
|
470
|
-
const result = parsePositionLine(`@position ${comment}`, warnings);
|
|
471
|
-
if (!result) {
|
|
472
|
-
warnings.push(`Invalid @position tag format in pattern: ${comment}`);
|
|
473
|
-
return;
|
|
474
|
-
}
|
|
475
|
-
const { nodeId, x, y } = result;
|
|
476
|
-
config.positions[nodeId] = { x, y };
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Parse @connect tag for patterns.
|
|
480
|
-
* Supports IN/OUT pseudo-nodes: IN.port -> node.port, node.port -> OUT.port
|
|
481
|
-
*/
|
|
482
|
-
parsePatternConnectTag(tag, config, warnings) {
|
|
483
|
-
const comment = tag.getCommentText() || '';
|
|
484
|
-
const result = parseConnectLine(`@connect ${comment}`, warnings);
|
|
485
|
-
if (!result) {
|
|
486
|
-
warnings.push(`Invalid @connect tag format in pattern: ${comment}`);
|
|
487
|
-
return;
|
|
488
|
-
}
|
|
489
|
-
const { source, target } = result;
|
|
490
|
-
config.connections.push({
|
|
491
|
-
from: { node: source.nodeId, port: source.portName },
|
|
492
|
-
to: { node: target.nodeId, port: target.portName },
|
|
493
|
-
});
|
|
494
|
-
}
|
|
495
|
-
/**
|
|
496
|
-
* Parse @port tag for patterns.
|
|
497
|
-
* Format: @port IN.name - description OR @port OUT.name - description
|
|
498
|
-
*/
|
|
499
|
-
parsePatternPortTag(tag, config, warnings) {
|
|
500
|
-
const comment = tag.getCommentText() || '';
|
|
501
|
-
// Parse format: IN.name - description OR OUT.name - description
|
|
502
|
-
const match = comment.match(/^(IN|OUT)\.(\w+)\s*(?:-\s*(.*))?$/);
|
|
503
|
-
if (!match) {
|
|
504
|
-
warnings.push(`Invalid @port tag format in pattern: ${comment}`);
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
507
|
-
const [, direction, name, description] = match;
|
|
508
|
-
config.ports.push({
|
|
509
|
-
direction: direction,
|
|
510
|
-
name,
|
|
511
|
-
description: description?.trim(),
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
/**
|
|
515
|
-
* Parse @input tag using Chevrotain parser.
|
|
516
|
-
* Supports: @input name, @input [name], @input [name=default]
|
|
517
|
-
* With optional: scope:scopeName, [order:N], [placement:TOP/BOTTOM], - description
|
|
518
|
-
*/
|
|
519
|
-
parseInputTag(tag, config, func, warnings) {
|
|
520
|
-
const comment = tag.getCommentText() || '';
|
|
521
|
-
const result = parsePortLine(`@input ${comment}`, warnings);
|
|
522
|
-
if (!result) {
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
const { name, defaultValue, isOptional, scope, order, mergeStrategy, hidden, description, customMetadata } = result;
|
|
526
|
-
// Infer type from signature or scope callback return type
|
|
527
|
-
let type;
|
|
528
|
-
let tsType;
|
|
529
|
-
// Check for STEP ports: execute OR scoped mandatory ports (success, failure with scope)
|
|
530
|
-
const isScopedStepInput = scope && isScopedMandatoryPort(name);
|
|
531
|
-
if (isExecutePort(name) || isScopedStepInput) {
|
|
532
|
-
// E: Warn if user explicitly specified a non-STEP type on a reserved port
|
|
533
|
-
if (result.dataType && result.dataType !== 'STEP') {
|
|
534
|
-
warnings.push(`Port "${name}" is a reserved control port; type will always be STEP.`);
|
|
535
|
-
}
|
|
536
|
-
type = 'STEP';
|
|
537
|
-
}
|
|
538
|
-
else if (scope) {
|
|
539
|
-
// For scoped INPUT ports, look up type from the scope callback's return type
|
|
540
|
-
// The scope name matches a function parameter that is a callback
|
|
541
|
-
// Scoped INPUT ports become the callback's return values
|
|
542
|
-
const scopeParam = func.getParameters().find((p) => p.getName() === scope);
|
|
543
|
-
if (scopeParam) {
|
|
544
|
-
const scopeParamType = scopeParam.getType();
|
|
545
|
-
// Use ts-morph Type API to extract the return field type
|
|
546
|
-
// This handles complex types (generics, nested objects) that regex can't
|
|
547
|
-
const extractedType = extractCallbackReturnFieldType(scopeParamType, name);
|
|
548
|
-
if (extractedType) {
|
|
549
|
-
tsType = extractedType;
|
|
550
|
-
type = inferDataTypeFromTS(tsType);
|
|
551
|
-
}
|
|
552
|
-
else {
|
|
553
|
-
// Emit warning when type inference fails for a scoped INPUT port
|
|
554
|
-
const nodeTypeName = func.getName() || 'unknown';
|
|
555
|
-
warnings.push(`Cannot infer type for scoped INPUT port '${name}' in scope '${scope}' of node type '${nodeTypeName}'. ` +
|
|
556
|
-
`The callback parameter '${scope}' should have a return type that includes '${name}'. ` +
|
|
557
|
-
`Consider adding an explicit type annotation to the callback signature.`);
|
|
558
|
-
type = 'ANY';
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
else {
|
|
562
|
-
// Scope callback parameter not found - emit warning
|
|
563
|
-
const nodeTypeName = func.getName() || 'unknown';
|
|
564
|
-
warnings.push(`Scoped INPUT port '${name}' references scope '${scope}', but no callback parameter named '${scope}' was found ` +
|
|
565
|
-
`in node type '${nodeTypeName}'. Add a callback parameter: ${scope}: (...) => { ${name}: YourType }`);
|
|
566
|
-
type = 'ANY';
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
else {
|
|
570
|
-
const param = func.getParameters().find((p) => {
|
|
571
|
-
const pName = p.getName();
|
|
572
|
-
return pName === name || pName === `_${name}`;
|
|
573
|
-
});
|
|
574
|
-
if (param) {
|
|
575
|
-
tsType = param.getType().getText(param);
|
|
576
|
-
type = inferDataTypeFromTS(tsType);
|
|
577
|
-
}
|
|
578
|
-
else {
|
|
579
|
-
type = 'ANY';
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
// Check if description contains an expression
|
|
583
|
-
let label = description?.trim();
|
|
584
|
-
let expression = undefined;
|
|
585
|
-
if (label && label.startsWith('Expression:')) {
|
|
586
|
-
expression = label.substring('Expression:'.length).trim();
|
|
587
|
-
label = undefined;
|
|
588
|
-
}
|
|
589
|
-
// B: Duplicate port detection
|
|
590
|
-
if (config.inputs.hasOwnProperty(name)) {
|
|
591
|
-
warnings.push(`Duplicate @input "${name}". The second declaration will overwrite the first.`);
|
|
592
|
-
}
|
|
593
|
-
config.inputs[name] = {
|
|
594
|
-
type,
|
|
595
|
-
defaultValue: defaultValue ? this.parseDefaultValue(defaultValue) : undefined,
|
|
596
|
-
...(isOptional && { optional: true }),
|
|
597
|
-
label,
|
|
598
|
-
...(expression && { expression }),
|
|
599
|
-
...(scope && { scope }),
|
|
600
|
-
...(mergeStrategy && { mergeStrategy: mergeStrategy }),
|
|
601
|
-
...(hidden && { hidden }),
|
|
602
|
-
...((order !== undefined || customMetadata) && {
|
|
603
|
-
metadata: { ...(order !== undefined && { order }), ...customMetadata },
|
|
604
|
-
}),
|
|
605
|
-
...(tsType && { tsType }),
|
|
606
|
-
};
|
|
607
|
-
}
|
|
608
|
-
/**
|
|
609
|
-
* Parse @output tag using Chevrotain parser.
|
|
610
|
-
* Supports: @output name, scope:scopeName, [order:N], - description
|
|
611
|
-
*/
|
|
612
|
-
parseOutputTag(tag, config, func, warnings) {
|
|
613
|
-
const comment = tag.getCommentText() || '';
|
|
614
|
-
const result = parsePortLine(`@output ${comment}`, warnings);
|
|
615
|
-
if (!result) {
|
|
616
|
-
return;
|
|
617
|
-
}
|
|
618
|
-
const { name, scope, order, hidden, description, customMetadata } = result;
|
|
619
|
-
// Infer type from return type or scope callback parameter
|
|
620
|
-
let type;
|
|
621
|
-
let tsType;
|
|
622
|
-
// Check for STEP ports: onSuccess/onFailure OR scoped mandatory ports (start with scope)
|
|
623
|
-
const isScopedStepOutput = scope && isScopedMandatoryPort(name);
|
|
624
|
-
if (isSuccessPort(name) || isFailurePort(name) || isScopedStepOutput) {
|
|
625
|
-
// E: Warn if user explicitly specified a non-STEP type on a reserved port
|
|
626
|
-
if (result.dataType && result.dataType !== 'STEP') {
|
|
627
|
-
warnings.push(`Port "${name}" is a reserved control port; type will always be STEP.`);
|
|
628
|
-
}
|
|
629
|
-
type = 'STEP';
|
|
630
|
-
}
|
|
631
|
-
else if (scope) {
|
|
632
|
-
// For scoped OUTPUT ports, look up type from the scope callback parameter
|
|
633
|
-
// The scope name matches a function parameter that is a callback
|
|
634
|
-
// Scoped OUTPUT ports become the callback's parameters
|
|
635
|
-
const scopeParam = func.getParameters().find((p) => p.getName() === scope);
|
|
636
|
-
if (scopeParam) {
|
|
637
|
-
const scopeParamType = scopeParam.getType();
|
|
638
|
-
// Use ts-morph Type API to extract the callback parameter type
|
|
639
|
-
const extractedType = extractCallbackParamType(scopeParamType, name);
|
|
640
|
-
if (extractedType) {
|
|
641
|
-
tsType = extractedType;
|
|
642
|
-
type = inferDataTypeFromTS(tsType);
|
|
643
|
-
}
|
|
644
|
-
else {
|
|
645
|
-
// Emit warning when type inference fails for a scoped OUTPUT port
|
|
646
|
-
const nodeTypeName = func.getName() || 'unknown';
|
|
647
|
-
warnings.push(`Cannot infer type for scoped OUTPUT port '${name}' in scope '${scope}' of node type '${nodeTypeName}'. ` +
|
|
648
|
-
`The callback parameter '${scope}' should have a parameter named '${name}'. ` +
|
|
649
|
-
`Consider adding an explicit type annotation to the callback signature.`);
|
|
650
|
-
type = 'ANY';
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
else {
|
|
654
|
-
// Scope callback parameter not found - emit warning
|
|
655
|
-
const nodeTypeName = func.getName() || 'unknown';
|
|
656
|
-
warnings.push(`Scoped OUTPUT port '${name}' references scope '${scope}', but no callback parameter named '${scope}' was found ` +
|
|
657
|
-
`in node type '${nodeTypeName}'. Add a callback parameter: ${scope}: (${name}: YourType, ...) => { ... }`);
|
|
658
|
-
type = 'ANY';
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
else {
|
|
662
|
-
const returnType = func.getReturnType();
|
|
663
|
-
// Use ts-morph API to extract property type (handles generics with commas correctly)
|
|
664
|
-
const property = returnType.getProperty(name);
|
|
665
|
-
if (property) {
|
|
666
|
-
const propertyType = getPropertyType(property, returnType);
|
|
667
|
-
if (propertyType) {
|
|
668
|
-
tsType = propertyType.getText(undefined, 0);
|
|
669
|
-
type = inferDataTypeFromTS(tsType);
|
|
670
|
-
}
|
|
671
|
-
else {
|
|
672
|
-
type = 'ANY';
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
else {
|
|
676
|
-
type = 'ANY';
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
// B: Duplicate port detection
|
|
680
|
-
if (config.outputs.hasOwnProperty(name)) {
|
|
681
|
-
warnings.push(`Duplicate @output "${name}". The second declaration will overwrite the first.`);
|
|
682
|
-
}
|
|
683
|
-
config.outputs[name] = {
|
|
684
|
-
type,
|
|
685
|
-
label: description?.trim(),
|
|
686
|
-
...(scope && { scope }),
|
|
687
|
-
...(hidden && { hidden }),
|
|
688
|
-
...((order !== undefined || customMetadata) && {
|
|
689
|
-
metadata: { ...(order !== undefined && { order }), ...customMetadata },
|
|
690
|
-
}),
|
|
691
|
-
...(tsType && { tsType }),
|
|
692
|
-
};
|
|
693
|
-
}
|
|
694
|
-
/**
|
|
695
|
-
* Parse @step tag using Chevrotain parser.
|
|
696
|
-
* Used for explicit STEP/control-flow ports that are not reserved.
|
|
697
|
-
*/
|
|
698
|
-
parseStepTag(tag, config, func, warnings) {
|
|
699
|
-
const comment = tag.getCommentText() || '';
|
|
700
|
-
// Use Chevrotain to parse the port content
|
|
701
|
-
const result = parsePortLine(`@step ${comment}`, warnings);
|
|
702
|
-
if (!result) {
|
|
703
|
-
return;
|
|
704
|
-
}
|
|
705
|
-
const { name, description } = result;
|
|
706
|
-
// @step ports are control flow - determine if input or output from signature
|
|
707
|
-
const param = func.getParameters().find((p) => p.getName() === name);
|
|
708
|
-
if (param) {
|
|
709
|
-
// It's an input STEP port
|
|
710
|
-
config.inputs[name] = {
|
|
711
|
-
type: 'STEP',
|
|
712
|
-
label: description?.trim(),
|
|
713
|
-
};
|
|
714
|
-
}
|
|
715
|
-
else {
|
|
716
|
-
// It's an output STEP port (check return type or assume output)
|
|
717
|
-
config.outputs[name] = {
|
|
718
|
-
type: 'STEP',
|
|
719
|
-
label: description?.trim(),
|
|
720
|
-
};
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
/**
|
|
724
|
-
* Parse @return/@returns tag for workflow functions using Chevrotain.
|
|
725
|
-
* Format: @returns name [order:N] - Description (type inferred from signature)
|
|
726
|
-
*/
|
|
727
|
-
parseReturnTag(tag, config, func, warnings) {
|
|
728
|
-
const comment = tag.getCommentText() || '';
|
|
729
|
-
// Reuse port-parser: @output has same format as @returns
|
|
730
|
-
const result = parsePortLine(`@output ${comment}`, warnings);
|
|
731
|
-
if (!result) {
|
|
732
|
-
return;
|
|
733
|
-
}
|
|
734
|
-
const { name, order, description, customMetadata } = result;
|
|
735
|
-
// Infer type from return type signature
|
|
736
|
-
let type = 'ANY';
|
|
737
|
-
if (isSuccessPort(name) || isFailurePort(name)) {
|
|
738
|
-
type = 'STEP';
|
|
739
|
-
}
|
|
740
|
-
else if (func) {
|
|
741
|
-
const returnType = func.getReturnType();
|
|
742
|
-
const returnTypeText = returnType.getText();
|
|
743
|
-
const fieldMatch = returnTypeText.match(new RegExp(`${name}\\??\\s*:\\s*([^;},]+)`));
|
|
744
|
-
if (fieldMatch) {
|
|
745
|
-
type = inferDataTypeFromTS(fieldMatch[1].trim());
|
|
746
|
-
}
|
|
747
|
-
else {
|
|
748
|
-
// G: Type inference fallback to ANY
|
|
749
|
-
warnings.push(`Could not infer type for @returns "${name}", defaulting to ANY.`);
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
config.returnPorts = config.returnPorts || {};
|
|
753
|
-
// B: Duplicate port detection
|
|
754
|
-
if (config.returnPorts.hasOwnProperty(name)) {
|
|
755
|
-
warnings.push(`Duplicate @returns "${name}". The second declaration will overwrite the first.`);
|
|
756
|
-
}
|
|
757
|
-
config.returnPorts[name] = {
|
|
758
|
-
dataType: type,
|
|
759
|
-
label: description?.trim(),
|
|
760
|
-
...((order !== undefined || customMetadata) && {
|
|
761
|
-
metadata: { ...(order !== undefined && { order }), ...customMetadata },
|
|
762
|
-
}),
|
|
763
|
-
};
|
|
764
|
-
}
|
|
765
|
-
/**
|
|
766
|
-
* Parse @param tag for workflow functions using Chevrotain.
|
|
767
|
-
* Format: @param name [order:N] - Description (type inferred from signature)
|
|
768
|
-
*/
|
|
769
|
-
parseParamTag(tag, config, func, warnings) {
|
|
770
|
-
const compilerNode = tag.compilerNode;
|
|
771
|
-
const tagWithGetName = tag;
|
|
772
|
-
const name = compilerNode.name?.getText?.() || (tagWithGetName.getName && tagWithGetName.getName());
|
|
773
|
-
if (!name) {
|
|
774
|
-
return;
|
|
775
|
-
}
|
|
776
|
-
// Comment contains: [order:N] - Description (name parsed separately by ts-morph)
|
|
777
|
-
// Prepend name to reuse port-parser
|
|
778
|
-
const comment = tag.getCommentText() || '';
|
|
779
|
-
const result = parsePortLine(`@input ${name} ${comment}`, warnings);
|
|
780
|
-
const order = result?.order;
|
|
781
|
-
const description = result?.description;
|
|
782
|
-
// Infer type from function parameter signature
|
|
783
|
-
let type = 'ANY';
|
|
784
|
-
if (isExecutePort(name)) {
|
|
785
|
-
type = 'STEP';
|
|
786
|
-
}
|
|
787
|
-
else if (func) {
|
|
788
|
-
const params = func.getParameters();
|
|
789
|
-
const paramsParam = params.find((p) => p.getName() === 'params');
|
|
790
|
-
if (paramsParam) {
|
|
791
|
-
const paramType = paramsParam.getType();
|
|
792
|
-
const paramTypeText = paramType.getText();
|
|
793
|
-
// Skip field-matching for catch-all Record types — @param annotations are intentional metadata
|
|
794
|
-
const isCatchAllRecord = (/^Record<string,\s*(never|any|unknown)>$/.test(paramTypeText) ||
|
|
795
|
-
paramTypeText === '{}' ||
|
|
796
|
-
/^\{\s*\[[\w]+:\s*string\]:\s*(never|any|unknown);\s*\}$/.test(paramTypeText));
|
|
797
|
-
if (!isCatchAllRecord) {
|
|
798
|
-
const fieldMatch = paramTypeText.match(new RegExp(`${name}\\??\\s*:\\s*([^;},]+)`));
|
|
799
|
-
if (fieldMatch) {
|
|
800
|
-
type = inferDataTypeFromTS(fieldMatch[1].trim());
|
|
801
|
-
}
|
|
802
|
-
else {
|
|
803
|
-
// F: @param doesn't match any field in the params object
|
|
804
|
-
// G: Type inference fallback to ANY
|
|
805
|
-
warnings.push(`@param "${name}" does not match any field in the params object. Type defaults to ANY.`);
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
config.startPorts = config.startPorts || {};
|
|
811
|
-
// B: Duplicate port detection
|
|
812
|
-
if (config.startPorts.hasOwnProperty(name)) {
|
|
813
|
-
warnings.push(`Duplicate @param "${name}". The second declaration will overwrite the first.`);
|
|
814
|
-
}
|
|
815
|
-
config.startPorts[name] = {
|
|
816
|
-
dataType: type,
|
|
817
|
-
label: description?.trim(),
|
|
818
|
-
...(order !== undefined && { metadata: { order } }),
|
|
819
|
-
};
|
|
820
|
-
}
|
|
821
|
-
/**
|
|
822
|
-
* Parse @fwImport tag for npm package node types.
|
|
823
|
-
* Format: @fwImport nodeName functionName from "packageName"
|
|
824
|
-
* Examples:
|
|
825
|
-
* @fwImport npm/autoprefixer/autoprefixer autoprefixer from "autoprefixer"
|
|
826
|
-
* @fwImport npm/lodash/map map from "lodash"
|
|
827
|
-
* Note: We use @fwImport instead of @import because TypeScript treats @import specially
|
|
828
|
-
* and truncates the first word as a type annotation.
|
|
829
|
-
*/
|
|
830
|
-
parseImportTag(tag, config, warnings) {
|
|
831
|
-
const comment = tag.getCommentText()?.trim() || '';
|
|
832
|
-
// Parse format: nodeName functionName from "packageName"
|
|
833
|
-
const match = comment.match(/^(\S+)\s+(\S+)\s+from\s+["']([^"']+)["']$/);
|
|
834
|
-
if (match) {
|
|
835
|
-
const [, name, functionName, importSource] = match;
|
|
836
|
-
config.imports.push({ name, functionName, importSource });
|
|
837
|
-
}
|
|
838
|
-
else {
|
|
839
|
-
warnings.push(`Invalid @fwImport tag format: "${comment}". Expected: @fwImport nodeName functionName from "packageName"`);
|
|
840
|
-
}
|
|
841
|
-
}
|
|
842
|
-
/**
|
|
843
|
-
* Parse @node tag using Chevrotain parser.
|
|
844
|
-
* Supports: @node instanceId nodeType [parentScope] [label: "..."] [portOrder: port=N] [portLabel: port="label"] [expr: port="val"] [minimized] [pullExecution: triggerPort]
|
|
845
|
-
*/
|
|
846
|
-
parseNodeTag(tag, config, warnings) {
|
|
847
|
-
const comment = tag.getCommentText() || '';
|
|
848
|
-
// Use Chevrotain to parse the node line
|
|
849
|
-
const result = parseNodeLine(`@node ${comment}`, warnings);
|
|
850
|
-
if (!result) {
|
|
851
|
-
return;
|
|
852
|
-
}
|
|
853
|
-
const { instanceId, nodeType, parentScope, label, expressions, portOrder, portLabel, minimized, pullExecution, size, position, color, icon, tags, job, environment, suppress, } = result;
|
|
854
|
-
// Capture source location from tag
|
|
855
|
-
const line = tag.getStartLineNumber();
|
|
856
|
-
// Build portConfigs from portOrder, portLabel, and expressions
|
|
857
|
-
let portConfigs;
|
|
858
|
-
if (portOrder) {
|
|
859
|
-
portConfigs = Object.entries(portOrder).map(([portName, order]) => ({
|
|
860
|
-
portName,
|
|
861
|
-
order,
|
|
862
|
-
}));
|
|
863
|
-
}
|
|
864
|
-
if (portLabel) {
|
|
865
|
-
portConfigs = portConfigs || [];
|
|
866
|
-
for (const [portName, labelVal] of Object.entries(portLabel)) {
|
|
867
|
-
const existingIndex = portConfigs.findIndex((pc) => pc.portName === portName);
|
|
868
|
-
if (existingIndex >= 0) {
|
|
869
|
-
portConfigs[existingIndex] = { ...portConfigs[existingIndex], label: labelVal };
|
|
870
|
-
}
|
|
871
|
-
else {
|
|
872
|
-
portConfigs.push({ portName, label: labelVal });
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
if (expressions) {
|
|
877
|
-
portConfigs = portConfigs || [];
|
|
878
|
-
for (const [portName, expression] of Object.entries(expressions)) {
|
|
879
|
-
const existingIndex = portConfigs.findIndex((pc) => pc.portName === portName);
|
|
880
|
-
if (existingIndex >= 0) {
|
|
881
|
-
portConfigs[existingIndex] = { ...portConfigs[existingIndex], expression };
|
|
882
|
-
}
|
|
883
|
-
else {
|
|
884
|
-
portConfigs.push({ portName, expression });
|
|
885
|
-
}
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
config.instances.push({
|
|
889
|
-
id: instanceId,
|
|
890
|
-
type: nodeType,
|
|
891
|
-
...(parentScope && { parentScope }),
|
|
892
|
-
...(label && { label }),
|
|
893
|
-
...(portConfigs && portConfigs.length > 0 && { portConfigs }),
|
|
894
|
-
...(pullExecution && { pullExecution: { triggerPort: pullExecution } }),
|
|
895
|
-
...(minimized && { minimized }),
|
|
896
|
-
...(color && { color }),
|
|
897
|
-
...(icon && { icon }),
|
|
898
|
-
...(tags && tags.length > 0 && { tags }),
|
|
899
|
-
...(size && { width: size.width, height: size.height }),
|
|
900
|
-
...(position && { x: position.x, y: position.y }),
|
|
901
|
-
...(job && { job }),
|
|
902
|
-
...(environment && { environment }),
|
|
903
|
-
...(suppress && suppress.length > 0 && { suppressWarnings: suppress }),
|
|
904
|
-
sourceLocation: { line, column: 0 },
|
|
905
|
-
});
|
|
906
|
-
}
|
|
907
|
-
/**
|
|
908
|
-
* Parse @position tag using Chevrotain parser.
|
|
909
|
-
* Supports: @position nodeId x y
|
|
910
|
-
*/
|
|
911
|
-
parsePositionTag(tag, config, warnings) {
|
|
912
|
-
const comment = tag.getCommentText() || '';
|
|
913
|
-
// Use Chevrotain to parse the position line
|
|
914
|
-
const result = parsePositionLine(`@position ${comment}`, warnings);
|
|
915
|
-
if (!result) {
|
|
916
|
-
warnings.push(`Invalid @position tag format: ${comment}`);
|
|
917
|
-
return;
|
|
918
|
-
}
|
|
919
|
-
const { nodeId, x, y } = result;
|
|
920
|
-
config.positions[nodeId] = { x, y };
|
|
921
|
-
// Emit deprecation warning for non-virtual nodes
|
|
922
|
-
if (nodeId !== 'Start' && nodeId !== 'Exit') {
|
|
923
|
-
warnings.push(`Deprecated: @position ${nodeId} — use [position: ${x} ${y}] on the @node declaration instead.`);
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
/**
|
|
927
|
-
* Parse @connect tag using Chevrotain parser.
|
|
928
|
-
* Supports: node.port -> node.port and node.port:scope -> node.port:scope
|
|
929
|
-
*/
|
|
930
|
-
parseConnectTag(tag, config, warnings) {
|
|
931
|
-
const comment = tag.getCommentText() || '';
|
|
932
|
-
// Use Chevrotain to parse the connect line
|
|
933
|
-
const result = parseConnectLine(`@connect ${comment}`, warnings);
|
|
934
|
-
if (!result) {
|
|
935
|
-
warnings.push(`Invalid @connect tag format: @connect ${comment}`);
|
|
936
|
-
return;
|
|
937
|
-
}
|
|
938
|
-
const { source, target, coerce } = result;
|
|
939
|
-
// Capture source location from tag
|
|
940
|
-
const line = tag.getStartLineNumber();
|
|
941
|
-
config.connections.push({
|
|
942
|
-
from: {
|
|
943
|
-
node: source.nodeId,
|
|
944
|
-
port: source.portName,
|
|
945
|
-
...(source.scope && { scope: source.scope }),
|
|
946
|
-
},
|
|
947
|
-
to: {
|
|
948
|
-
node: target.nodeId,
|
|
949
|
-
port: target.portName,
|
|
950
|
-
...(target.scope && { scope: target.scope }),
|
|
951
|
-
},
|
|
952
|
-
sourceLocation: { line, column: 0 },
|
|
953
|
-
...(coerce && { coerce }),
|
|
954
|
-
});
|
|
955
|
-
}
|
|
956
|
-
/**
|
|
957
|
-
* Parse @scope tag using Chevrotain parser.
|
|
958
|
-
* Format: @scope scopeName [child1, child2] or @scope container.scopeName [child1, child2]
|
|
959
|
-
*/
|
|
960
|
-
parseScopeTag(tag, config, warnings) {
|
|
961
|
-
const comment = tag.getCommentText() || '';
|
|
962
|
-
const result = parseScopeLine(`@scope ${comment}`, warnings);
|
|
963
|
-
if (!result) {
|
|
964
|
-
warnings.push(`Invalid @scope tag format: ${comment}`);
|
|
965
|
-
return;
|
|
966
|
-
}
|
|
967
|
-
config.scopes[result.scopeName] = result.children;
|
|
968
|
-
}
|
|
969
|
-
/**
|
|
970
|
-
* Parse @map tag using Chevrotain parser.
|
|
971
|
-
* Format: @map instanceId childNode over source.port
|
|
972
|
-
* Or: @map instanceId childNode(inputPort -> outputPort) over source.port
|
|
973
|
-
*/
|
|
974
|
-
parseMapTag(tag, config, warnings) {
|
|
975
|
-
const comment = tag.getCommentText() || '';
|
|
976
|
-
const result = parseMapLine(`@map ${comment}`, warnings);
|
|
977
|
-
if (!result) {
|
|
978
|
-
warnings.push(`Invalid @map tag format: ${comment}`);
|
|
979
|
-
return;
|
|
980
|
-
}
|
|
981
|
-
config.maps = config.maps || [];
|
|
982
|
-
config.maps.push({
|
|
983
|
-
instanceId: result.instanceId,
|
|
984
|
-
childId: result.childId,
|
|
985
|
-
sourceNode: result.sourceNode,
|
|
986
|
-
sourcePort: result.sourcePort,
|
|
987
|
-
...(result.inputPort && { inputPort: result.inputPort }),
|
|
988
|
-
...(result.outputPort && { outputPort: result.outputPort }),
|
|
989
|
-
});
|
|
990
|
-
}
|
|
991
|
-
/**
|
|
992
|
-
* Parse @path tag using Chevrotain parser.
|
|
993
|
-
* Format: @path Start -> validator:ok -> classifier -> urgencyRouter:fail -> escalate -> Exit
|
|
994
|
-
*/
|
|
995
|
-
parsePathTag(tag, config, warnings) {
|
|
996
|
-
const comment = tag.getCommentText() || '';
|
|
997
|
-
const results = parsePathLine(`@path ${comment}`, warnings);
|
|
998
|
-
if (!results) {
|
|
999
|
-
warnings.push(`Invalid @path tag format: ${comment}`);
|
|
1000
|
-
return;
|
|
1001
|
-
}
|
|
1002
|
-
config.paths = config.paths || [];
|
|
1003
|
-
for (const result of results) {
|
|
1004
|
-
config.paths.push({
|
|
1005
|
-
steps: result.steps,
|
|
1006
|
-
});
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
parseFanOutTag(tag, config, warnings) {
|
|
1010
|
-
const comment = tag.getCommentText() || '';
|
|
1011
|
-
const result = parseFanOutLine(`@fanOut ${comment}`, warnings);
|
|
1012
|
-
if (!result) {
|
|
1013
|
-
warnings.push(`Invalid @fanOut tag format: ${comment}`);
|
|
1014
|
-
return;
|
|
1015
|
-
}
|
|
1016
|
-
if (!result.source.port) {
|
|
1017
|
-
warnings.push(`@fanOut source must specify a port: ${comment}`);
|
|
1018
|
-
return;
|
|
1019
|
-
}
|
|
1020
|
-
config.fanOuts = config.fanOuts || [];
|
|
1021
|
-
config.fanOuts.push({
|
|
1022
|
-
source: { node: result.source.node, port: result.source.port },
|
|
1023
|
-
targets: result.targets,
|
|
1024
|
-
});
|
|
1025
|
-
}
|
|
1026
|
-
parseFanInTag(tag, config, warnings) {
|
|
1027
|
-
const comment = tag.getCommentText() || '';
|
|
1028
|
-
const result = parseFanInLine(`@fanIn ${comment}`, warnings);
|
|
1029
|
-
if (!result) {
|
|
1030
|
-
warnings.push(`Invalid @fanIn tag format: ${comment}`);
|
|
1031
|
-
return;
|
|
1032
|
-
}
|
|
1033
|
-
if (!result.target.port) {
|
|
1034
|
-
warnings.push(`@fanIn target must specify a port: ${comment}`);
|
|
1035
|
-
return;
|
|
1036
|
-
}
|
|
1037
|
-
config.fanIns = config.fanIns || [];
|
|
1038
|
-
config.fanIns.push({
|
|
1039
|
-
sources: result.sources,
|
|
1040
|
-
target: { node: result.target.node, port: result.target.port },
|
|
1041
|
-
});
|
|
1042
|
-
}
|
|
1043
|
-
parseCoerceTag(tag, config, warnings) {
|
|
1044
|
-
const comment = tag.getCommentText() || '';
|
|
1045
|
-
const result = parseCoerceLine(`@coerce ${comment}`, warnings);
|
|
1046
|
-
if (!result) {
|
|
1047
|
-
warnings.push(`Invalid @coerce tag format: ${comment}`);
|
|
1048
|
-
return;
|
|
1049
|
-
}
|
|
1050
|
-
config.coercions = config.coercions || [];
|
|
1051
|
-
config.coercions.push({
|
|
1052
|
-
instanceId: result.instanceId,
|
|
1053
|
-
source: result.source,
|
|
1054
|
-
target: result.target,
|
|
1055
|
-
targetType: result.targetType,
|
|
1056
|
-
});
|
|
1057
|
-
}
|
|
1058
|
-
/**
|
|
1059
|
-
* Parse @trigger tag using Chevrotain parser.
|
|
1060
|
-
* Delegates unrecognized trigger formats to the tag registry (e.g. CI/CD triggers).
|
|
1061
|
-
*/
|
|
1062
|
-
parseTriggerTag(tag, config, warnings, tagRegistry) {
|
|
1063
|
-
const comment = (tag.getCommentText() || '').trim();
|
|
1064
|
-
// Check if the trigger looks like a CI/CD keyword (push, pull_request, etc.)
|
|
1065
|
-
const cicdKeywords = ['push', 'pull_request', 'dispatch', 'tag', 'schedule'];
|
|
1066
|
-
const firstToken = comment.split(/\s/)[0];
|
|
1067
|
-
// CI/CD triggers: delegate to pack handler if registered
|
|
1068
|
-
if (cicdKeywords.includes(firstToken) && tagRegistry && tagRegistry.has('_cicdTrigger')) {
|
|
1069
|
-
if (!config.deploy)
|
|
1070
|
-
config.deploy = {};
|
|
1071
|
-
tagRegistry.handle('_cicdTrigger', comment, 'workflow', config.deploy, warnings);
|
|
1072
|
-
return;
|
|
1073
|
-
}
|
|
1074
|
-
// Core FW trigger parsing (event= and/or cron=)
|
|
1075
|
-
const result = parseTriggerLine(`@trigger ${comment}`, warnings);
|
|
1076
|
-
if (result) {
|
|
1077
|
-
// Merge: multiple @trigger tags accumulate (event + cron can be separate tags)
|
|
1078
|
-
config.trigger = config.trigger || {};
|
|
1079
|
-
if (result.event)
|
|
1080
|
-
config.trigger.event = result.event;
|
|
1081
|
-
if (result.cron)
|
|
1082
|
-
config.trigger.cron = result.cron;
|
|
1083
|
-
return;
|
|
1084
|
-
}
|
|
1085
|
-
// Not a core trigger and no CI/CD handler available. Try CI/CD keywords as fallback hint.
|
|
1086
|
-
if (cicdKeywords.includes(firstToken)) {
|
|
1087
|
-
warnings.push(`@trigger ${firstToken} looks like a CI/CD trigger but no CI/CD pack is installed. ` +
|
|
1088
|
-
`Install @synergenius/flow-weaver-pack-cicd to enable CI/CD pipeline annotations.`);
|
|
1089
|
-
return;
|
|
1090
|
-
}
|
|
1091
|
-
warnings.push(`Invalid @trigger format: @trigger ${comment}`);
|
|
1092
|
-
}
|
|
1093
|
-
/**
|
|
1094
|
-
* Parse @cancelOn tag using Chevrotain parser.
|
|
1095
|
-
*/
|
|
1096
|
-
parseCancelOnTag(tag, config, warnings) {
|
|
1097
|
-
const comment = tag.getCommentText() || '';
|
|
1098
|
-
const result = parseCancelOnLine(`@cancelOn ${comment}`, warnings);
|
|
1099
|
-
if (!result) {
|
|
1100
|
-
warnings.push(`Invalid @cancelOn format: @cancelOn ${comment}`);
|
|
1101
|
-
return;
|
|
1102
|
-
}
|
|
1103
|
-
config.cancelOn = result;
|
|
1104
|
-
}
|
|
1105
|
-
/**
|
|
1106
|
-
* Parse @throttle tag using Chevrotain parser.
|
|
1107
|
-
*/
|
|
1108
|
-
parseThrottleTag(tag, config, warnings) {
|
|
1109
|
-
const comment = tag.getCommentText() || '';
|
|
1110
|
-
const result = parseThrottleLine(`@throttle ${comment}`, warnings);
|
|
1111
|
-
if (!result) {
|
|
1112
|
-
warnings.push(`Invalid @throttle format: @throttle ${comment}`);
|
|
1113
|
-
return;
|
|
1114
|
-
}
|
|
1115
|
-
config.throttle = result;
|
|
1116
|
-
}
|
|
1117
|
-
/**
|
|
1118
|
-
* Parse @deploy tag.
|
|
1119
|
-
* Format: @deploy <target> key=value key2="value with spaces" key3=123 key4=true
|
|
1120
|
-
*
|
|
1121
|
-
* Examples:
|
|
1122
|
-
* @deploy github-actions action="actions/checkout@v4"
|
|
1123
|
-
* @deploy my-target durableSteps=true framework="next" retries=3
|
|
1124
|
-
* @deploy another-target memory=256 timeout=30
|
|
1125
|
-
*
|
|
1126
|
-
* Values are auto-coerced: "true"/"false" → boolean, numeric strings → number.
|
|
1127
|
-
*/
|
|
1128
|
-
parseDeployTag(tag, deployMap) {
|
|
1129
|
-
const text = (tag.getCommentText() || '').trim();
|
|
1130
|
-
if (!text)
|
|
1131
|
-
return;
|
|
1132
|
-
// Split target name from remaining key=value pairs
|
|
1133
|
-
const spaceIdx = text.indexOf(' ');
|
|
1134
|
-
const targetName = spaceIdx === -1 ? text : text.substring(0, spaceIdx);
|
|
1135
|
-
const rest = spaceIdx === -1 ? '' : text.substring(spaceIdx + 1);
|
|
1136
|
-
if (!targetName)
|
|
1137
|
-
return;
|
|
1138
|
-
if (!deployMap[targetName])
|
|
1139
|
-
deployMap[targetName] = {};
|
|
1140
|
-
if (!rest)
|
|
1141
|
-
return;
|
|
1142
|
-
// Parse key=value and key="value with spaces" pairs
|
|
1143
|
-
// The quoted value pattern handles escaped quotes: "echo \"hello\""
|
|
1144
|
-
const kvRegex = /(\w[\w-]*)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([\S]+))/g;
|
|
1145
|
-
let match;
|
|
1146
|
-
while ((match = kvRegex.exec(rest)) !== null) {
|
|
1147
|
-
const key = match[1];
|
|
1148
|
-
const quotedVal = match[2]; // captured from "..."
|
|
1149
|
-
const bareVal = match[3]; // captured from unquoted
|
|
1150
|
-
if (quotedVal !== undefined) {
|
|
1151
|
-
// Quoted values: check if comma-separated list → string[]
|
|
1152
|
-
if (quotedVal.includes(',')) {
|
|
1153
|
-
deployMap[targetName][key] = quotedVal.split(',').map(v => v.trim());
|
|
1154
|
-
}
|
|
1155
|
-
else {
|
|
1156
|
-
deployMap[targetName][key] = quotedVal;
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
else if (bareVal !== undefined) {
|
|
1160
|
-
// Bare values: auto-coerce boolean and number
|
|
1161
|
-
if (bareVal === 'true') {
|
|
1162
|
-
deployMap[targetName][key] = true;
|
|
1163
|
-
}
|
|
1164
|
-
else if (bareVal === 'false') {
|
|
1165
|
-
deployMap[targetName][key] = false;
|
|
1166
|
-
}
|
|
1167
|
-
else {
|
|
1168
|
-
const num = Number(bareVal);
|
|
1169
|
-
deployMap[targetName][key] = isNaN(num) ? bareVal : num;
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
/**
|
|
1175
|
-
* Parse default value from string
|
|
1176
|
-
*/
|
|
1177
|
-
parseDefaultValue(value) {
|
|
1178
|
-
// Try to parse as JSON
|
|
1179
|
-
try {
|
|
1180
|
-
return JSON.parse(value);
|
|
1181
|
-
}
|
|
1182
|
-
catch {
|
|
1183
|
-
// Return as string if not valid JSON
|
|
1184
|
-
return value;
|
|
1185
|
-
}
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
export const jsdocParser = new JSDocParser();
|
|
1189
|
-
//# sourceMappingURL=jsdoc-parser.js.map
|