@synergenius/flow-weaver 0.2.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 +122 -0
- package/README.md +315 -0
- package/dist/annotation-generator.d.ts +45 -0
- package/dist/annotation-generator.js +557 -0
- package/dist/api/builder.d.ts +223 -0
- package/dist/api/builder.js +345 -0
- package/dist/api/compile.d.ts +92 -0
- package/dist/api/compile.js +149 -0
- package/dist/api/extract-types.d.ts +29 -0
- package/dist/api/extract-types.js +57 -0
- package/dist/api/generate-in-place.d.ts +73 -0
- package/dist/api/generate-in-place.js +1353 -0
- package/dist/api/generate.d.ts +83 -0
- package/dist/api/generate.js +510 -0
- package/dist/api/helpers.d.ts +248 -0
- package/dist/api/helpers.js +285 -0
- package/dist/api/index.d.ts +46 -0
- package/dist/api/index.js +45 -0
- package/dist/api/inline-runtime.d.ts +27 -0
- package/dist/api/inline-runtime.js +551 -0
- package/dist/api/manipulation/connections.d.ts +79 -0
- package/dist/api/manipulation/connections.js +151 -0
- package/dist/api/manipulation/index.d.ts +34 -0
- package/dist/api/manipulation/index.js +41 -0
- package/dist/api/manipulation/node-types.d.ts +123 -0
- package/dist/api/manipulation/node-types.js +200 -0
- package/dist/api/manipulation/nodes.d.ts +144 -0
- package/dist/api/manipulation/nodes.js +333 -0
- package/dist/api/manipulation/ports.d.ts +59 -0
- package/dist/api/manipulation/ports.js +228 -0
- package/dist/api/manipulation/scopes.d.ts +52 -0
- package/dist/api/manipulation/scopes.js +156 -0
- package/dist/api/manipulation/validation.d.ts +6 -0
- package/dist/api/manipulation/validation.js +6 -0
- package/dist/api/manipulation/workflow.d.ts +81 -0
- package/dist/api/manipulation/workflow.js +116 -0
- package/dist/api/manipulation.d.ts +8 -0
- package/dist/api/manipulation.js +8 -0
- package/dist/api/parse.d.ts +48 -0
- package/dist/api/parse.js +110 -0
- package/dist/api/patterns.d.ts +112 -0
- package/dist/api/patterns.js +306 -0
- package/dist/api/query.d.ts +429 -0
- package/dist/api/query.js +816 -0
- package/dist/api/templates.d.ts +98 -0
- package/dist/api/templates.js +117 -0
- package/dist/api/transform.d.ts +31 -0
- package/dist/api/transform.js +40 -0
- package/dist/api/validate.d.ts +25 -0
- package/dist/api/validate.js +39 -0
- package/dist/api/workflow-file-operations.d.ts +29 -0
- package/dist/api/workflow-file-operations.js +180 -0
- package/dist/ast/builder.d.ts +210 -0
- package/dist/ast/builder.js +395 -0
- package/dist/ast/index.d.ts +5 -0
- package/dist/ast/index.js +5 -0
- package/dist/ast/serialization-node.d.ts +6 -0
- package/dist/ast/serialization-node.js +30 -0
- package/dist/ast/serialization.d.ts +43 -0
- package/dist/ast/serialization.js +134 -0
- package/dist/ast/types.d.ts +852 -0
- package/dist/ast/types.js +2 -0
- package/dist/ast/workflow-utils.d.ts +54 -0
- package/dist/ast/workflow-utils.js +114 -0
- package/dist/body-generator.d.ts +31 -0
- package/dist/body-generator.js +35 -0
- package/dist/built-in-nodes/delay.d.ts +11 -0
- package/dist/built-in-nodes/delay.js +29 -0
- package/dist/built-in-nodes/index.d.ts +5 -0
- package/dist/built-in-nodes/index.js +4 -0
- package/dist/built-in-nodes/invoke-workflow.d.ts +13 -0
- package/dist/built-in-nodes/invoke-workflow.js +25 -0
- package/dist/built-in-nodes/mock-types.d.ts +18 -0
- package/dist/built-in-nodes/mock-types.js +12 -0
- package/dist/built-in-nodes/wait-for-event.d.ts +13 -0
- package/dist/built-in-nodes/wait-for-event.js +25 -0
- package/dist/chevrotain-parser/connect-parser.d.ts +24 -0
- package/dist/chevrotain-parser/connect-parser.js +98 -0
- package/dist/chevrotain-parser/grammar-diagrams.d.ts +29 -0
- package/dist/chevrotain-parser/grammar-diagrams.js +264 -0
- package/dist/chevrotain-parser/index.d.ts +25 -0
- package/dist/chevrotain-parser/index.js +27 -0
- package/dist/chevrotain-parser/map-parser.d.ts +33 -0
- package/dist/chevrotain-parser/map-parser.js +130 -0
- package/dist/chevrotain-parser/node-parser.d.ts +36 -0
- package/dist/chevrotain-parser/node-parser.js +466 -0
- package/dist/chevrotain-parser/path-parser.d.ts +28 -0
- package/dist/chevrotain-parser/path-parser.js +118 -0
- package/dist/chevrotain-parser/port-parser.d.ts +36 -0
- package/dist/chevrotain-parser/port-parser.js +442 -0
- package/dist/chevrotain-parser/position-parser.d.ts +20 -0
- package/dist/chevrotain-parser/position-parser.js +83 -0
- package/dist/chevrotain-parser/scope-parser.d.ts +19 -0
- package/dist/chevrotain-parser/scope-parser.js +104 -0
- package/dist/chevrotain-parser/tokens.d.ts +78 -0
- package/dist/chevrotain-parser/tokens.js +384 -0
- package/dist/chevrotain-parser/trigger-cancel-parser.d.ts +50 -0
- package/dist/chevrotain-parser/trigger-cancel-parser.js +282 -0
- package/dist/cli/commands/changelog.d.ts +13 -0
- package/dist/cli/commands/changelog.js +135 -0
- package/dist/cli/commands/compile.d.ts +64 -0
- package/dist/cli/commands/compile.js +278 -0
- package/dist/cli/commands/create.d.ts +33 -0
- package/dist/cli/commands/create.js +147 -0
- package/dist/cli/commands/describe.d.ts +68 -0
- package/dist/cli/commands/describe.js +377 -0
- package/dist/cli/commands/dev.d.ts +32 -0
- package/dist/cli/commands/dev.js +384 -0
- package/dist/cli/commands/diagram.d.ts +13 -0
- package/dist/cli/commands/diagram.js +33 -0
- package/dist/cli/commands/diff.d.ts +11 -0
- package/dist/cli/commands/diff.js +59 -0
- package/dist/cli/commands/doctor.d.ts +57 -0
- package/dist/cli/commands/doctor.js +719 -0
- package/dist/cli/commands/export.d.ts +57 -0
- package/dist/cli/commands/export.js +163 -0
- package/dist/cli/commands/grammar.d.ts +9 -0
- package/dist/cli/commands/grammar.js +39 -0
- package/dist/cli/commands/init.d.ts +59 -0
- package/dist/cli/commands/init.js +435 -0
- package/dist/cli/commands/listen.d.ts +16 -0
- package/dist/cli/commands/listen.js +39 -0
- package/dist/cli/commands/market.d.ts +52 -0
- package/dist/cli/commands/market.js +436 -0
- package/dist/cli/commands/migrate.d.ts +13 -0
- package/dist/cli/commands/migrate.js +89 -0
- package/dist/cli/commands/openapi.d.ts +37 -0
- package/dist/cli/commands/openapi.js +67 -0
- package/dist/cli/commands/pattern.d.ts +34 -0
- package/dist/cli/commands/pattern.js +185 -0
- package/dist/cli/commands/plugin.d.ts +16 -0
- package/dist/cli/commands/plugin.js +176 -0
- package/dist/cli/commands/run.d.ts +49 -0
- package/dist/cli/commands/run.js +191 -0
- package/dist/cli/commands/serve.d.ts +45 -0
- package/dist/cli/commands/serve.js +81 -0
- package/dist/cli/commands/templates.d.ts +8 -0
- package/dist/cli/commands/templates.js +54 -0
- package/dist/cli/commands/ui.d.ts +16 -0
- package/dist/cli/commands/ui.js +130 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.js +247 -0
- package/dist/cli/commands/watch.d.ts +9 -0
- package/dist/cli/commands/watch.js +70 -0
- package/dist/cli/flow-weaver.mjs +92924 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.js +742 -0
- package/dist/cli/templates/ai/mock-provider.d.ts +7 -0
- package/dist/cli/templates/ai/mock-provider.js +64 -0
- package/dist/cli/templates/ai/types.d.ts +47 -0
- package/dist/cli/templates/ai/types.js +5 -0
- package/dist/cli/templates/approvals/index.d.ts +15 -0
- package/dist/cli/templates/approvals/index.js +241 -0
- package/dist/cli/templates/index.d.ts +102 -0
- package/dist/cli/templates/index.js +101 -0
- package/dist/cli/templates/nodes/agent-router.d.ts +3 -0
- package/dist/cli/templates/nodes/agent-router.js +114 -0
- package/dist/cli/templates/nodes/aggregator.d.ts +7 -0
- package/dist/cli/templates/nodes/aggregator.js +63 -0
- package/dist/cli/templates/nodes/conversation-memory.d.ts +3 -0
- package/dist/cli/templates/nodes/conversation-memory.js +85 -0
- package/dist/cli/templates/nodes/http.d.ts +7 -0
- package/dist/cli/templates/nodes/http.js +80 -0
- package/dist/cli/templates/nodes/human-approval.d.ts +3 -0
- package/dist/cli/templates/nodes/human-approval.js +110 -0
- package/dist/cli/templates/nodes/json-extractor.d.ts +3 -0
- package/dist/cli/templates/nodes/json-extractor.js +119 -0
- package/dist/cli/templates/nodes/llm-call.d.ts +3 -0
- package/dist/cli/templates/nodes/llm-call.js +106 -0
- package/dist/cli/templates/nodes/prompt-template.d.ts +3 -0
- package/dist/cli/templates/nodes/prompt-template.js +52 -0
- package/dist/cli/templates/nodes/rag-retriever.d.ts +3 -0
- package/dist/cli/templates/nodes/rag-retriever.js +128 -0
- package/dist/cli/templates/nodes/tool-executor.d.ts +3 -0
- package/dist/cli/templates/nodes/tool-executor.js +108 -0
- package/dist/cli/templates/nodes/transformer.d.ts +7 -0
- package/dist/cli/templates/nodes/transformer.js +68 -0
- package/dist/cli/templates/nodes/validator.d.ts +7 -0
- package/dist/cli/templates/nodes/validator.js +62 -0
- package/dist/cli/templates/providers/index.d.ts +14 -0
- package/dist/cli/templates/providers/index.js +239 -0
- package/dist/cli/templates/shared/approval-types.d.ts +9 -0
- package/dist/cli/templates/shared/approval-types.js +31 -0
- package/dist/cli/templates/shared/llm-types.d.ts +15 -0
- package/dist/cli/templates/shared/llm-types.js +104 -0
- package/dist/cli/templates/workflows/aggregator.d.ts +7 -0
- package/dist/cli/templates/workflows/aggregator.js +104 -0
- package/dist/cli/templates/workflows/ai-agent-durable.d.ts +8 -0
- package/dist/cli/templates/workflows/ai-agent-durable.js +338 -0
- package/dist/cli/templates/workflows/ai-agent.d.ts +31 -0
- package/dist/cli/templates/workflows/ai-agent.js +326 -0
- package/dist/cli/templates/workflows/ai-chat.d.ts +7 -0
- package/dist/cli/templates/workflows/ai-chat.js +169 -0
- package/dist/cli/templates/workflows/ai-pipeline-durable.d.ts +8 -0
- package/dist/cli/templates/workflows/ai-pipeline-durable.js +330 -0
- package/dist/cli/templates/workflows/ai-rag.d.ts +7 -0
- package/dist/cli/templates/workflows/ai-rag.js +186 -0
- package/dist/cli/templates/workflows/ai-react.d.ts +7 -0
- package/dist/cli/templates/workflows/ai-react.js +294 -0
- package/dist/cli/templates/workflows/conditional.d.ts +12 -0
- package/dist/cli/templates/workflows/conditional.js +142 -0
- package/dist/cli/templates/workflows/error-handler.d.ts +7 -0
- package/dist/cli/templates/workflows/error-handler.js +147 -0
- package/dist/cli/templates/workflows/foreach.d.ts +7 -0
- package/dist/cli/templates/workflows/foreach.js +143 -0
- package/dist/cli/templates/workflows/sequential.d.ts +7 -0
- package/dist/cli/templates/workflows/sequential.js +198 -0
- package/dist/cli/templates/workflows/webhook.d.ts +7 -0
- package/dist/cli/templates/workflows/webhook.js +161 -0
- package/dist/cli/utils/logger.d.ts +15 -0
- package/dist/cli/utils/logger.js +46 -0
- package/dist/constants.d.ts +100 -0
- package/dist/constants.js +125 -0
- package/dist/defaults.d.ts +3 -0
- package/dist/defaults.js +3 -0
- package/dist/deployment/config/defaults.d.ts +29 -0
- package/dist/deployment/config/defaults.js +98 -0
- package/dist/deployment/config/loader.d.ts +24 -0
- package/dist/deployment/config/loader.js +236 -0
- package/dist/deployment/config/types.d.ts +117 -0
- package/dist/deployment/config/types.js +5 -0
- package/dist/deployment/core/adapters.d.ts +90 -0
- package/dist/deployment/core/adapters.js +251 -0
- package/dist/deployment/core/executor.d.ts +62 -0
- package/dist/deployment/core/executor.js +197 -0
- package/dist/deployment/core/formatters.d.ts +57 -0
- package/dist/deployment/core/formatters.js +170 -0
- package/dist/deployment/index.d.ts +31 -0
- package/dist/deployment/index.js +48 -0
- package/dist/deployment/openapi/generator.d.ts +146 -0
- package/dist/deployment/openapi/generator.js +347 -0
- package/dist/deployment/openapi/schema-converter.d.ts +49 -0
- package/dist/deployment/openapi/schema-converter.js +192 -0
- package/dist/deployment/targets/base.d.ts +316 -0
- package/dist/deployment/targets/base.js +823 -0
- package/dist/deployment/targets/cloudflare.d.ts +23 -0
- package/dist/deployment/targets/cloudflare.js +1125 -0
- package/dist/deployment/targets/inngest.d.ts +38 -0
- package/dist/deployment/targets/inngest.js +926 -0
- package/dist/deployment/targets/lambda.d.ts +23 -0
- package/dist/deployment/targets/lambda.js +1289 -0
- package/dist/deployment/targets/vercel.d.ts +23 -0
- package/dist/deployment/targets/vercel.js +886 -0
- package/dist/deployment/types.d.ts +183 -0
- package/dist/deployment/types.js +8 -0
- package/dist/diagram/geometry.d.ts +26 -0
- package/dist/diagram/geometry.js +850 -0
- package/dist/diagram/index.d.ts +16 -0
- package/dist/diagram/index.js +42 -0
- package/dist/diagram/layout.d.ts +11 -0
- package/dist/diagram/layout.js +143 -0
- package/dist/diagram/orthogonal-router.d.ts +79 -0
- package/dist/diagram/orthogonal-router.js +568 -0
- package/dist/diagram/renderer.d.ts +3 -0
- package/dist/diagram/renderer.js +207 -0
- package/dist/diagram/theme.d.ts +20 -0
- package/dist/diagram/theme.js +189 -0
- package/dist/diagram/types.d.ts +70 -0
- package/dist/diagram/types.js +2 -0
- package/dist/diff/WorkflowDiffer.d.ts +13 -0
- package/dist/diff/WorkflowDiffer.js +429 -0
- package/dist/diff/formatDiff.d.ts +10 -0
- package/dist/diff/formatDiff.js +220 -0
- package/dist/diff/impact.d.ts +29 -0
- package/dist/diff/impact.js +119 -0
- package/dist/diff/index.d.ts +10 -0
- package/dist/diff/index.js +9 -0
- package/dist/diff/types.d.ts +138 -0
- package/dist/diff/types.js +35 -0
- package/dist/doc-metadata/extractors/annotations.d.ts +56 -0
- package/dist/doc-metadata/extractors/annotations.js +337 -0
- package/dist/doc-metadata/extractors/cli-commands.d.ts +17 -0
- package/dist/doc-metadata/extractors/cli-commands.js +355 -0
- package/dist/doc-metadata/extractors/mcp-tools.d.ts +16 -0
- package/dist/doc-metadata/extractors/mcp-tools.js +689 -0
- package/dist/doc-metadata/extractors/plugin-api.d.ts +19 -0
- package/dist/doc-metadata/extractors/plugin-api.js +279 -0
- package/dist/doc-metadata/index.d.ts +5 -0
- package/dist/doc-metadata/index.js +4 -0
- package/dist/doc-metadata/types.d.ts +120 -0
- package/dist/doc-metadata/types.js +5 -0
- package/dist/editor-completions/annotationValues.d.ts +12 -0
- package/dist/editor-completions/annotationValues.js +138 -0
- package/dist/editor-completions/contextParser.d.ts +40 -0
- package/dist/editor-completions/contextParser.js +410 -0
- package/dist/editor-completions/dataTypes.d.ts +16 -0
- package/dist/editor-completions/dataTypes.js +95 -0
- package/dist/editor-completions/goToDefinition.d.ts +27 -0
- package/dist/editor-completions/goToDefinition.js +112 -0
- package/dist/editor-completions/index.d.ts +39 -0
- package/dist/editor-completions/index.js +181 -0
- package/dist/editor-completions/jsDocAnnotations.d.ts +29 -0
- package/dist/editor-completions/jsDocAnnotations.js +357 -0
- package/dist/editor-completions/modifierCompletions.d.ts +17 -0
- package/dist/editor-completions/modifierCompletions.js +197 -0
- package/dist/editor-completions/types.d.ts +119 -0
- package/dist/editor-completions/types.js +8 -0
- package/dist/export/index.d.ts +68 -0
- package/dist/export/index.js +1074 -0
- package/dist/export/templates.d.ts +24 -0
- package/dist/export/templates.js +186 -0
- package/dist/friendly-errors.d.ts +35 -0
- package/dist/friendly-errors.js +375 -0
- package/dist/function-like.d.ts +38 -0
- package/dist/function-like.js +83 -0
- package/dist/generated-branding.d.ts +16 -0
- package/dist/generated-branding.js +22 -0
- package/dist/generator/async-detection.d.ts +27 -0
- package/dist/generator/async-detection.js +56 -0
- package/dist/generator/code-utils.d.ts +76 -0
- package/dist/generator/code-utils.js +410 -0
- package/dist/generator/control-flow.d.ts +54 -0
- package/dist/generator/control-flow.js +284 -0
- package/dist/generator/inngest.d.ts +53 -0
- package/dist/generator/inngest.js +1126 -0
- package/dist/generator/scope-function-generator.d.ts +78 -0
- package/dist/generator/scope-function-generator.js +360 -0
- package/dist/generator/unified.d.ts +42 -0
- package/dist/generator/unified.js +1504 -0
- package/dist/generator.d.ts +54 -0
- package/dist/generator.js +100 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.js +89 -0
- package/dist/jsdoc-parser.d.ts +308 -0
- package/dist/jsdoc-parser.js +923 -0
- package/dist/jsdoc-port-sync/constants.d.ts +41 -0
- package/dist/jsdoc-port-sync/constants.js +103 -0
- package/dist/jsdoc-port-sync/diff.d.ts +76 -0
- package/dist/jsdoc-port-sync/diff.js +319 -0
- package/dist/jsdoc-port-sync/index.d.ts +42 -0
- package/dist/jsdoc-port-sync/index.js +45 -0
- package/dist/jsdoc-port-sync/port-parser.d.ts +68 -0
- package/dist/jsdoc-port-sync/port-parser.js +579 -0
- package/dist/jsdoc-port-sync/rename.d.ts +21 -0
- package/dist/jsdoc-port-sync/rename.js +256 -0
- package/dist/jsdoc-port-sync/signature-parser.d.ts +104 -0
- package/dist/jsdoc-port-sync/signature-parser.js +559 -0
- package/dist/jsdoc-port-sync/sync.d.ts +36 -0
- package/dist/jsdoc-port-sync/sync.js +644 -0
- package/dist/jsdoc-port-sync.d.ts +10 -0
- package/dist/jsdoc-port-sync.js +10 -0
- package/dist/marketplace/index.d.ts +11 -0
- package/dist/marketplace/index.js +10 -0
- package/dist/marketplace/manifest.d.ts +32 -0
- package/dist/marketplace/manifest.js +176 -0
- package/dist/marketplace/registry.d.ts +30 -0
- package/dist/marketplace/registry.js +100 -0
- package/dist/marketplace/types.d.ts +154 -0
- package/dist/marketplace/types.js +9 -0
- package/dist/marketplace/validator.d.ts +13 -0
- package/dist/marketplace/validator.js +131 -0
- package/dist/mcp/auto-registration.d.ts +3 -0
- package/dist/mcp/auto-registration.js +62 -0
- package/dist/mcp/editor-connection.d.ts +50 -0
- package/dist/mcp/editor-connection.js +125 -0
- package/dist/mcp/event-buffer.d.ts +62 -0
- package/dist/mcp/event-buffer.js +150 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/resources.d.ts +14 -0
- package/dist/mcp/resources.js +55 -0
- package/dist/mcp/response-utils.d.ts +63 -0
- package/dist/mcp/response-utils.js +89 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +99 -0
- package/dist/mcp/tools-diagram.d.ts +8 -0
- package/dist/mcp/tools-diagram.js +53 -0
- package/dist/mcp/tools-editor.d.ts +5 -0
- package/dist/mcp/tools-editor.js +190 -0
- package/dist/mcp/tools-export.d.ts +9 -0
- package/dist/mcp/tools-export.js +180 -0
- package/dist/mcp/tools-marketplace.d.ts +9 -0
- package/dist/mcp/tools-marketplace.js +132 -0
- package/dist/mcp/tools-pattern.d.ts +3 -0
- package/dist/mcp/tools-pattern.js +783 -0
- package/dist/mcp/tools-query.d.ts +3 -0
- package/dist/mcp/tools-query.js +364 -0
- package/dist/mcp/tools-template.d.ts +10 -0
- package/dist/mcp/tools-template.js +119 -0
- package/dist/mcp/types.d.ts +70 -0
- package/dist/mcp/types.js +8 -0
- package/dist/mcp/workflow-executor.d.ts +47 -0
- package/dist/mcp/workflow-executor.js +133 -0
- package/dist/migration/registry.d.ts +30 -0
- package/dist/migration/registry.js +29 -0
- package/dist/node-types-generator.d.ts +49 -0
- package/dist/node-types-generator.js +139 -0
- package/dist/npm-packages.d.ts +56 -0
- package/dist/npm-packages.js +255 -0
- package/dist/parser.d.ts +204 -0
- package/dist/parser.js +2100 -0
- package/dist/plugin/PluginPanel.d.ts +12 -0
- package/dist/plugin/PluginPanel.js +5 -0
- package/dist/plugin/index.d.ts +13 -0
- package/dist/plugin/index.js +14 -0
- package/dist/plugin/types.d.ts +75 -0
- package/dist/plugin/types.js +8 -0
- package/dist/resolve-package-types.d.ts +17 -0
- package/dist/resolve-package-types.js +123 -0
- package/dist/runtime/CancellationError.d.ts +11 -0
- package/dist/runtime/CancellationError.js +20 -0
- package/dist/runtime/ExecutionContext.d.ts +146 -0
- package/dist/runtime/ExecutionContext.js +235 -0
- package/dist/runtime/builtin-functions.d.ts +8 -0
- package/dist/runtime/builtin-functions.js +549 -0
- package/dist/runtime/events.d.ts +50 -0
- package/dist/runtime/events.js +2 -0
- package/dist/runtime/function-registry.d.ts +59 -0
- package/dist/runtime/function-registry.js +66 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.js +7 -0
- package/dist/runtime/parameter-resolver.d.ts +62 -0
- package/dist/runtime/parameter-resolver.js +113 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.js +6 -0
- package/dist/server/types.d.ts +93 -0
- package/dist/server/types.js +5 -0
- package/dist/server/webhook-server.d.ts +50 -0
- package/dist/server/webhook-server.js +269 -0
- package/dist/server/workflow-registry.d.ts +61 -0
- package/dist/server/workflow-registry.js +202 -0
- package/dist/shared-project.d.ts +9 -0
- package/dist/shared-project.js +28 -0
- package/dist/sugar-optimizer.d.ts +40 -0
- package/dist/sugar-optimizer.js +387 -0
- package/dist/testing/assertions.d.ts +51 -0
- package/dist/testing/assertions.js +127 -0
- package/dist/testing/index.d.ts +30 -0
- package/dist/testing/index.js +24 -0
- package/dist/testing/mock-approval.d.ts +81 -0
- package/dist/testing/mock-approval.js +98 -0
- package/dist/testing/mock-llm.d.ts +124 -0
- package/dist/testing/mock-llm.js +119 -0
- package/dist/testing/recorder.d.ts +72 -0
- package/dist/testing/recorder.js +70 -0
- package/dist/testing/replayer.d.ts +56 -0
- package/dist/testing/replayer.js +143 -0
- package/dist/testing/token-tracker.d.ts +71 -0
- package/dist/testing/token-tracker.js +94 -0
- package/dist/type-checker.d.ts +42 -0
- package/dist/type-checker.js +190 -0
- package/dist/type-mappings.d.ts +29 -0
- package/dist/type-mappings.js +125 -0
- package/dist/types/branded-ports.d.ts +151 -0
- package/dist/types/branded-ports.js +121 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +5 -0
- package/dist/types.d.ts +139 -0
- package/dist/types.js +15 -0
- package/dist/utils/error-utils.d.ts +15 -0
- package/dist/utils/error-utils.js +27 -0
- package/dist/utils/lru-cache.d.ts +15 -0
- package/dist/utils/lru-cache.js +40 -0
- package/dist/utils/port-ordering.d.ts +26 -0
- package/dist/utils/port-ordering.js +88 -0
- package/dist/utils/port-tag-utils.d.ts +23 -0
- package/dist/utils/port-tag-utils.js +41 -0
- package/dist/utils/string-distance.d.ts +14 -0
- package/dist/utils/string-distance.js +56 -0
- package/dist/validation/agent-detection.d.ts +33 -0
- package/dist/validation/agent-detection.js +115 -0
- package/dist/validation/agent-rules.d.ts +48 -0
- package/dist/validation/agent-rules.js +262 -0
- package/dist/validator.d.ts +92 -0
- package/dist/validator.js +970 -0
- package/package.json +109 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { TNodeTypeAST, TWorkflowAST, TNodeInstanceAST } from '../ast/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a scope function closure for a scoped port (e.g., forEach iteration callback).
|
|
4
|
+
*
|
|
5
|
+
* ## Scoped Port Architecture (Key Concept)
|
|
6
|
+
*
|
|
7
|
+
* Scoped nodes enable iteration patterns WITHOUT graph cycles. The port directions
|
|
8
|
+
* are intentionally INVERTED from what you might expect:
|
|
9
|
+
*
|
|
10
|
+
* | Port Type | Direction | Purpose | Becomes in Closure |
|
|
11
|
+
* |-----------|-----------|---------|-------------------|
|
|
12
|
+
* | Scoped OUTPUT | From parent to children | Parameters like `item`, `start` | Function parameters |
|
|
13
|
+
* | Scoped INPUT | From children to parent | Returns like `success`, `result` | Return object fields |
|
|
14
|
+
*
|
|
15
|
+
* **Why the inversion?**
|
|
16
|
+
* - OUTPUT ports on the parent node emit data TO children (function params)
|
|
17
|
+
* - INPUT ports on the parent node receive data FROM children (function returns)
|
|
18
|
+
* - This allows the loop to happen in imperative code, not the graph
|
|
19
|
+
*
|
|
20
|
+
* ## Generated Closure Structure:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* ((ctx) => {
|
|
23
|
+
* return async (start: boolean, item: unknown) => {
|
|
24
|
+
* // 1. Create isolated scope context (cleanScope=true)
|
|
25
|
+
* const scopedCtx = ctx.createScope('parent', parentIdx, 'scopeName', true);
|
|
26
|
+
*
|
|
27
|
+
* // 2. Store scope parameters as variables (scoped OUTPUT ports)
|
|
28
|
+
* await scopedCtx.setVariable({ id: 'parent', portName: 'start', scope, side: 'start' }, start);
|
|
29
|
+
* await scopedCtx.setVariable({ id: 'parent', portName: 'item', scope, side: 'start' }, item);
|
|
30
|
+
*
|
|
31
|
+
* // 3. Execute child nodes in topological order
|
|
32
|
+
* const childIdx = scopedCtx.addExecution('childNode');
|
|
33
|
+
* const childResult = await childFunction(execute, ...args);
|
|
34
|
+
*
|
|
35
|
+
* // 4. Merge scope execution back to parent context
|
|
36
|
+
* ctx.mergeScope(scopedCtx);
|
|
37
|
+
*
|
|
38
|
+
* // 5. Collect return values from scoped INPUT ports
|
|
39
|
+
* const result = scopedCtx.getVariable({ id: 'childNode', portName: 'result' });
|
|
40
|
+
*
|
|
41
|
+
* // 6. Return collected values to parent
|
|
42
|
+
* return { success: true, failure: false, result };
|
|
43
|
+
* };
|
|
44
|
+
* })(ctx)
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* ## Execution Context Isolation:
|
|
48
|
+
* - `cleanScope=true`: Each call gets fresh variables (forEach pattern)
|
|
49
|
+
* - `cleanScope=false`: Variables inherited from parent (node-level scopes)
|
|
50
|
+
* - `mergeScope()`: Accumulates execution records back to parent after call
|
|
51
|
+
*
|
|
52
|
+
* ## Example forEach Pattern:
|
|
53
|
+
* ```
|
|
54
|
+
* forEach node declares:
|
|
55
|
+
* @scope processItem
|
|
56
|
+
* @output start scope:processItem // → function param (trigger)
|
|
57
|
+
* @output item scope:processItem // → function param (current item)
|
|
58
|
+
* @input success scope:processItem // → return value (completion signal)
|
|
59
|
+
* @input processed scope:processItem // → return value (processed item)
|
|
60
|
+
*
|
|
61
|
+
* forEach implementation calls:
|
|
62
|
+
* for (const item of items) {
|
|
63
|
+
* const result = await processItem(true, item); // Generated closure!
|
|
64
|
+
* results.push(result.processed);
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @param scopeName - Name of the scope (e.g., "processItem", "iteration")
|
|
69
|
+
* @param parentNodeId - ID of the parent node instance declaring this scope
|
|
70
|
+
* @param parentNodeType - The parent node type definition with scoped port specs
|
|
71
|
+
* @param workflow - The workflow AST containing child instances and connections
|
|
72
|
+
* @param childInstances - Node instances nested in this scope (have parent.scope = scopeName)
|
|
73
|
+
* @param isAsync - Whether to generate async closure (adds await, async keyword)
|
|
74
|
+
* @param production - If true, omits debug instrumentation
|
|
75
|
+
* @returns Generated closure code string to be used as a function argument
|
|
76
|
+
*/
|
|
77
|
+
export declare function generateScopeFunctionClosure(scopeName: string, parentNodeId: string, parentNodeType: TNodeTypeAST, workflow: TWorkflowAST, childInstances: TNodeInstanceAST[], isAsync: boolean, production: boolean): string;
|
|
78
|
+
//# sourceMappingURL=scope-function-generator.d.ts.map
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { isSuccessPort, isFailurePort } from '../constants.js';
|
|
2
|
+
import { buildNodeArgumentsWithContext, toValidIdentifier } from './code-utils.js';
|
|
3
|
+
import { performKahnsTopologicalSort, buildControlFlowGraph } from './control-flow.js';
|
|
4
|
+
import { mapToTypeScript } from '../type-mappings.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate a scope function closure for a scoped port (e.g., forEach iteration callback).
|
|
7
|
+
*
|
|
8
|
+
* ## Scoped Port Architecture (Key Concept)
|
|
9
|
+
*
|
|
10
|
+
* Scoped nodes enable iteration patterns WITHOUT graph cycles. The port directions
|
|
11
|
+
* are intentionally INVERTED from what you might expect:
|
|
12
|
+
*
|
|
13
|
+
* | Port Type | Direction | Purpose | Becomes in Closure |
|
|
14
|
+
* |-----------|-----------|---------|-------------------|
|
|
15
|
+
* | Scoped OUTPUT | From parent to children | Parameters like `item`, `start` | Function parameters |
|
|
16
|
+
* | Scoped INPUT | From children to parent | Returns like `success`, `result` | Return object fields |
|
|
17
|
+
*
|
|
18
|
+
* **Why the inversion?**
|
|
19
|
+
* - OUTPUT ports on the parent node emit data TO children (function params)
|
|
20
|
+
* - INPUT ports on the parent node receive data FROM children (function returns)
|
|
21
|
+
* - This allows the loop to happen in imperative code, not the graph
|
|
22
|
+
*
|
|
23
|
+
* ## Generated Closure Structure:
|
|
24
|
+
* ```typescript
|
|
25
|
+
* ((ctx) => {
|
|
26
|
+
* return async (start: boolean, item: unknown) => {
|
|
27
|
+
* // 1. Create isolated scope context (cleanScope=true)
|
|
28
|
+
* const scopedCtx = ctx.createScope('parent', parentIdx, 'scopeName', true);
|
|
29
|
+
*
|
|
30
|
+
* // 2. Store scope parameters as variables (scoped OUTPUT ports)
|
|
31
|
+
* await scopedCtx.setVariable({ id: 'parent', portName: 'start', scope, side: 'start' }, start);
|
|
32
|
+
* await scopedCtx.setVariable({ id: 'parent', portName: 'item', scope, side: 'start' }, item);
|
|
33
|
+
*
|
|
34
|
+
* // 3. Execute child nodes in topological order
|
|
35
|
+
* const childIdx = scopedCtx.addExecution('childNode');
|
|
36
|
+
* const childResult = await childFunction(execute, ...args);
|
|
37
|
+
*
|
|
38
|
+
* // 4. Merge scope execution back to parent context
|
|
39
|
+
* ctx.mergeScope(scopedCtx);
|
|
40
|
+
*
|
|
41
|
+
* // 5. Collect return values from scoped INPUT ports
|
|
42
|
+
* const result = scopedCtx.getVariable({ id: 'childNode', portName: 'result' });
|
|
43
|
+
*
|
|
44
|
+
* // 6. Return collected values to parent
|
|
45
|
+
* return { success: true, failure: false, result };
|
|
46
|
+
* };
|
|
47
|
+
* })(ctx)
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* ## Execution Context Isolation:
|
|
51
|
+
* - `cleanScope=true`: Each call gets fresh variables (forEach pattern)
|
|
52
|
+
* - `cleanScope=false`: Variables inherited from parent (node-level scopes)
|
|
53
|
+
* - `mergeScope()`: Accumulates execution records back to parent after call
|
|
54
|
+
*
|
|
55
|
+
* ## Example forEach Pattern:
|
|
56
|
+
* ```
|
|
57
|
+
* forEach node declares:
|
|
58
|
+
* @scope processItem
|
|
59
|
+
* @output start scope:processItem // → function param (trigger)
|
|
60
|
+
* @output item scope:processItem // → function param (current item)
|
|
61
|
+
* @input success scope:processItem // → return value (completion signal)
|
|
62
|
+
* @input processed scope:processItem // → return value (processed item)
|
|
63
|
+
*
|
|
64
|
+
* forEach implementation calls:
|
|
65
|
+
* for (const item of items) {
|
|
66
|
+
* const result = await processItem(true, item); // Generated closure!
|
|
67
|
+
* results.push(result.processed);
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* @param scopeName - Name of the scope (e.g., "processItem", "iteration")
|
|
72
|
+
* @param parentNodeId - ID of the parent node instance declaring this scope
|
|
73
|
+
* @param parentNodeType - The parent node type definition with scoped port specs
|
|
74
|
+
* @param workflow - The workflow AST containing child instances and connections
|
|
75
|
+
* @param childInstances - Node instances nested in this scope (have parent.scope = scopeName)
|
|
76
|
+
* @param isAsync - Whether to generate async closure (adds await, async keyword)
|
|
77
|
+
* @param production - If true, omits debug instrumentation
|
|
78
|
+
* @returns Generated closure code string to be used as a function argument
|
|
79
|
+
*/
|
|
80
|
+
export function generateScopeFunctionClosure(scopeName, parentNodeId, parentNodeType, workflow, childInstances, isAsync, production) {
|
|
81
|
+
const lines = [];
|
|
82
|
+
// Extract scoped ports for this scope
|
|
83
|
+
const scopedOutputPorts = []; // Parameters to the scope function
|
|
84
|
+
const scopedInputPorts = []; // Return values from the scope function
|
|
85
|
+
Object.entries(parentNodeType.outputs).forEach(([portName, portDef]) => {
|
|
86
|
+
// Scoped OUTPUT ports become function parameters (include execute, but exclude FUNCTION type)
|
|
87
|
+
if (portDef.scope === scopeName && portDef.dataType !== 'FUNCTION') {
|
|
88
|
+
scopedOutputPorts.push(portName);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
Object.entries(parentNodeType.inputs).forEach(([portName, portDef]) => {
|
|
92
|
+
// Include ALL scoped INPUT ports in return object, including success/failure
|
|
93
|
+
// The callback type expects { success: boolean; failure: boolean; ...data }
|
|
94
|
+
if (portDef.scope === scopeName) {
|
|
95
|
+
scopedInputPorts.push(portName);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
// Generate function signature
|
|
99
|
+
// Parameters: all scoped OUTPUT ports (what the parent provides to the scope)
|
|
100
|
+
const awaitKeyword = isAsync ? 'async ' : '';
|
|
101
|
+
const params = scopedOutputPorts
|
|
102
|
+
.map((p) => {
|
|
103
|
+
const portDef = parentNodeType.outputs[p];
|
|
104
|
+
const portType = portDef ? mapToTypeScript(portDef.dataType, portDef.tsType) : 'unknown';
|
|
105
|
+
return `${p}: ${portType}`;
|
|
106
|
+
})
|
|
107
|
+
.join(', ');
|
|
108
|
+
// Start closure: ((ctx) => { ... })(ctx)
|
|
109
|
+
lines.push(`((ctx) => {`);
|
|
110
|
+
lines.push(` return ${awaitKeyword}(${params}) => {`);
|
|
111
|
+
lines.push(` // Scope function body for '${scopeName}'`);
|
|
112
|
+
lines.push(``);
|
|
113
|
+
// Create scoped execution context for isolation
|
|
114
|
+
// Pass cleanScope=true for per-port function scopes (each call gets fresh variables)
|
|
115
|
+
const safeParentId = toValidIdentifier(parentNodeId);
|
|
116
|
+
lines.push(` // Create scoped context for child nodes`);
|
|
117
|
+
lines.push(` const scopedCtx = ctx.createScope('${parentNodeId}', ${safeParentId}Idx!, '${scopeName}', true);`);
|
|
118
|
+
lines.push(``);
|
|
119
|
+
// Set scope parameter values in execution context
|
|
120
|
+
// These become available to child nodes as outputs from the parent node
|
|
121
|
+
if (scopedOutputPorts.length > 0) {
|
|
122
|
+
lines.push(` // Set scope parameters as variables for child nodes`);
|
|
123
|
+
scopedOutputPorts.forEach((portName) => {
|
|
124
|
+
// Store using parent node ID so connections from parent.port work
|
|
125
|
+
lines.push(` const scopeParamIdx_${portName} = scopedCtx.addExecution('${parentNodeId}_param_${portName}');`);
|
|
126
|
+
const setCall = isAsync ? `await scopedCtx.setVariable` : `scopedCtx.setVariable`;
|
|
127
|
+
// Include scope and side for scoped OUTPUT ports (start side of scope)
|
|
128
|
+
lines.push(` ${setCall}({ id: '${parentNodeId}', portName: '${portName}', executionIndex: scopeParamIdx_${portName}, nodeTypeName: '${parentNodeType.functionName}', scope: '${scopeName}', side: 'start' }, ${portName});`);
|
|
129
|
+
});
|
|
130
|
+
lines.push(``);
|
|
131
|
+
}
|
|
132
|
+
// Execute child nodes
|
|
133
|
+
if (childInstances.length > 0) {
|
|
134
|
+
lines.push(` // Execute child nodes in topologically sorted order`);
|
|
135
|
+
// Build control flow graph for children only
|
|
136
|
+
const childIds = childInstances.map((c) => c.id);
|
|
137
|
+
const childConnections = workflow.connections.filter((conn) => {
|
|
138
|
+
// Include child-to-child connections
|
|
139
|
+
if (childIds.includes(conn.from.node) && childIds.includes(conn.to.node)) {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
// Include connections from parent's scoped OUTPUT ports to children
|
|
143
|
+
if (conn.from.node === parentNodeId && childIds.includes(conn.to.node)) {
|
|
144
|
+
// Check if the source port is a scoped OUTPUT port for this scope
|
|
145
|
+
const sourcePort = parentNodeType.outputs[conn.from.port];
|
|
146
|
+
if (sourcePort && sourcePort.scope === scopeName) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
});
|
|
152
|
+
// Create a minimal workflow for topological sorting
|
|
153
|
+
// Include a virtual parent instance so connections from parent ports can be resolved
|
|
154
|
+
const parentVirtualInstance = {
|
|
155
|
+
type: 'NodeInstance',
|
|
156
|
+
id: parentNodeId,
|
|
157
|
+
nodeType: parentNodeType.functionName,
|
|
158
|
+
parent: undefined,
|
|
159
|
+
};
|
|
160
|
+
const scopeWorkflow = {
|
|
161
|
+
...workflow,
|
|
162
|
+
instances: [parentVirtualInstance, ...childInstances],
|
|
163
|
+
connections: childConnections,
|
|
164
|
+
};
|
|
165
|
+
// Get node types for children
|
|
166
|
+
const childNodeTypes = childInstances
|
|
167
|
+
.map((c) => {
|
|
168
|
+
return workflow.nodeTypes?.find((nt) => nt.name === c.nodeType || nt.functionName === c.nodeType);
|
|
169
|
+
})
|
|
170
|
+
.filter((nt) => nt !== undefined);
|
|
171
|
+
const cfg = buildControlFlowGraph(scopeWorkflow, childNodeTypes);
|
|
172
|
+
const sortedChildren = performKahnsTopologicalSort(cfg);
|
|
173
|
+
sortedChildren.forEach((childId) => {
|
|
174
|
+
const child = childInstances.find((c) => c.id === childId);
|
|
175
|
+
if (!child)
|
|
176
|
+
return;
|
|
177
|
+
const childNodeType = workflow.nodeTypes?.find((nt) => nt.name === child.nodeType || nt.functionName === child.nodeType);
|
|
178
|
+
if (!childNodeType) {
|
|
179
|
+
lines.push(` // WARNING: Node type '${child.nodeType}' not found for child '${child.id}'`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const safeChildId = toValidIdentifier(child.id);
|
|
183
|
+
lines.push(``);
|
|
184
|
+
lines.push(` // Execute: ${child.id} (${child.nodeType})`);
|
|
185
|
+
lines.push(` scopedCtx.checkAborted('${child.id}');`);
|
|
186
|
+
lines.push(` const ${safeChildId}Idx = scopedCtx.addExecution('${child.id}');`);
|
|
187
|
+
lines.push(` scopedCtx.sendStatusChangedEvent({`);
|
|
188
|
+
lines.push(` nodeTypeName: '${child.nodeType}',`);
|
|
189
|
+
lines.push(` id: '${child.id}',`);
|
|
190
|
+
lines.push(` executionIndex: ${safeChildId}Idx,`);
|
|
191
|
+
lines.push(` status: 'RUNNING',`);
|
|
192
|
+
lines.push(` });`);
|
|
193
|
+
lines.push(` try {`);
|
|
194
|
+
// Pre-handle connections from parent scoped OUTPUT ports with correct index variables
|
|
195
|
+
const argLines = [];
|
|
196
|
+
const getCall = isAsync ? 'await scopedCtx.getVariable' : 'scopedCtx.getVariable';
|
|
197
|
+
const childSetCall = isAsync ? `await scopedCtx.setVariable` : `scopedCtx.setVariable`;
|
|
198
|
+
const preHandledPorts = new Set();
|
|
199
|
+
// Find connections from parent scoped OUTPUT ports to this child
|
|
200
|
+
const parentConnections = workflow.connections.filter((conn) => conn.from.node === parentNodeId && conn.to.node === child.id);
|
|
201
|
+
parentConnections.forEach((conn) => {
|
|
202
|
+
const sourcePort = parentNodeType.outputs[conn.from.port];
|
|
203
|
+
if (sourcePort && sourcePort.scope === scopeName) {
|
|
204
|
+
// This is a scoped OUTPUT port - use scope parameter index
|
|
205
|
+
const targetPort = conn.to.port;
|
|
206
|
+
const varName = `${safeChildId}_${targetPort}`;
|
|
207
|
+
const scopeParamIdxVar = `scopeParamIdx_${conn.from.port}`;
|
|
208
|
+
// Get the target port type for the type cast
|
|
209
|
+
const targetPortDef = childNodeType.inputs[targetPort];
|
|
210
|
+
const portType = targetPortDef
|
|
211
|
+
? mapToTypeScript(targetPortDef.dataType, targetPortDef.tsType)
|
|
212
|
+
: 'unknown';
|
|
213
|
+
argLines.push(` const ${varName} = ${getCall}({ id: '${parentNodeId}', portName: '${conn.from.port}', executionIndex: ${scopeParamIdxVar} }) as ${portType};`);
|
|
214
|
+
// Emit VARIABLE_SET for the child's INPUT port so breakpoints and inspection work
|
|
215
|
+
argLines.push(` ${childSetCall}({ id: '${child.id}', portName: '${targetPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, ${varName});`);
|
|
216
|
+
preHandledPorts.add(targetPort);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
// Build remaining arguments using buildNodeArgumentsWithContext
|
|
220
|
+
const args = buildNodeArgumentsWithContext({
|
|
221
|
+
node: childNodeType,
|
|
222
|
+
workflow: scopeWorkflow,
|
|
223
|
+
id: child.id,
|
|
224
|
+
lines: argLines,
|
|
225
|
+
indent: ` `,
|
|
226
|
+
getCall,
|
|
227
|
+
isAsync,
|
|
228
|
+
instanceParent: child.parent ? `${child.parent.id}.${child.parent.scope}` : undefined,
|
|
229
|
+
skipPorts: preHandledPorts,
|
|
230
|
+
emitInputEvents: true,
|
|
231
|
+
setCall: childSetCall,
|
|
232
|
+
nodeTypeName: child.nodeType,
|
|
233
|
+
});
|
|
234
|
+
// Add argument building lines
|
|
235
|
+
argLines.forEach((line) => lines.push(line));
|
|
236
|
+
// Call the child node function
|
|
237
|
+
const awaitPrefix = isAsync ? 'await ' : '';
|
|
238
|
+
if (childNodeType.expression) {
|
|
239
|
+
// Expression nodes use original signature (positional args, no execute)
|
|
240
|
+
lines.push(` const ${safeChildId}Result = ${awaitPrefix}${child.nodeType}(${args.join(', ')});`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// Regular node call with positional arguments
|
|
244
|
+
lines.push(` const ${safeChildId}Result = ${awaitPrefix}${child.nodeType}(${args.join(', ')});`);
|
|
245
|
+
}
|
|
246
|
+
// Store outputs (including onSuccess/onFailure for debugging)
|
|
247
|
+
// Expression nodes don't return onSuccess/onFailure — hardcode them
|
|
248
|
+
if (childNodeType.expression) {
|
|
249
|
+
Object.keys(childNodeType.outputs || {}).forEach((outPort) => {
|
|
250
|
+
const portDef = childNodeType.outputs[outPort];
|
|
251
|
+
if (portDef.failure || isFailurePort(outPort)) {
|
|
252
|
+
// Failure ports always false on success (expression nodes always succeed)
|
|
253
|
+
lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, false);`);
|
|
254
|
+
}
|
|
255
|
+
else if (portDef.isControlFlow || isSuccessPort(outPort)) {
|
|
256
|
+
// Success control flow ports always true (expression nodes always succeed)
|
|
257
|
+
lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, true);`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Data outputs read from result object
|
|
261
|
+
lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, ${safeChildId}Result.${outPort});`);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
Object.keys(childNodeType.outputs || {}).forEach((outPort) => {
|
|
267
|
+
lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, ${safeChildId}Result.${outPort});`);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// Add SUCCEEDED status event
|
|
271
|
+
lines.push(` scopedCtx.sendStatusChangedEvent({`);
|
|
272
|
+
lines.push(` nodeTypeName: '${child.nodeType}',`);
|
|
273
|
+
lines.push(` id: '${child.id}',`);
|
|
274
|
+
lines.push(` executionIndex: ${safeChildId}Idx,`);
|
|
275
|
+
lines.push(` status: 'SUCCEEDED',`);
|
|
276
|
+
lines.push(` });`);
|
|
277
|
+
lines.push(` } catch (error: unknown) {`);
|
|
278
|
+
lines.push(` const isCancellation = CancellationError.isCancellationError(error);`);
|
|
279
|
+
lines.push(` scopedCtx.sendStatusChangedEvent({`);
|
|
280
|
+
lines.push(` nodeTypeName: '${child.nodeType}',`);
|
|
281
|
+
lines.push(` id: '${child.id}',`);
|
|
282
|
+
lines.push(` executionIndex: ${safeChildId}Idx,`);
|
|
283
|
+
lines.push(` status: isCancellation ? 'CANCELLED' : 'FAILED',`);
|
|
284
|
+
lines.push(` });`);
|
|
285
|
+
lines.push(` if (!isCancellation) {`);
|
|
286
|
+
lines.push(` scopedCtx.sendLogErrorEvent({`);
|
|
287
|
+
lines.push(` nodeTypeName: '${child.nodeType}',`);
|
|
288
|
+
lines.push(` id: '${child.id}',`);
|
|
289
|
+
lines.push(` executionIndex: ${safeChildId}Idx,`);
|
|
290
|
+
lines.push(` error: error instanceof Error ? error.message : String(error),`);
|
|
291
|
+
lines.push(` });`);
|
|
292
|
+
lines.push(` }`);
|
|
293
|
+
lines.push(` throw error;`);
|
|
294
|
+
lines.push(` }`);
|
|
295
|
+
});
|
|
296
|
+
lines.push(``);
|
|
297
|
+
}
|
|
298
|
+
// Merge scope back to parent context
|
|
299
|
+
lines.push(` // Merge scoped execution back to parent context`);
|
|
300
|
+
lines.push(` ctx.mergeScope(scopedCtx);`);
|
|
301
|
+
lines.push(``);
|
|
302
|
+
// Extract return values from scoped INPUT ports
|
|
303
|
+
// These are the outputs of child nodes that become the scope function's return value
|
|
304
|
+
lines.push(` // Extract return values from child outputs`);
|
|
305
|
+
const returnObj = [];
|
|
306
|
+
// After mergeScope, use ctx (parent context) not scopedCtx for all variable access
|
|
307
|
+
const getCallAfterMerge = isAsync ? 'await ctx.getVariable' : 'ctx.getVariable';
|
|
308
|
+
// Create per-iteration execution index for scoped exit ports (so each iteration shows separately in UI)
|
|
309
|
+
// Use ctx (parent context) not scopedCtx so indices accumulate across iterations
|
|
310
|
+
lines.push(` const scopeExitIdx = ctx.addExecution('${parentNodeId}_scope_exit');`);
|
|
311
|
+
scopedInputPorts.forEach((portName) => {
|
|
312
|
+
// Find connections TO this scoped INPUT port FROM child nodes
|
|
313
|
+
// The source of the connection tells us which child output to read
|
|
314
|
+
const connection = workflow.connections.find((conn) => {
|
|
315
|
+
return conn.to.port === portName && childInstances.some((c) => c.id === conn.from.node);
|
|
316
|
+
});
|
|
317
|
+
// Get the port definition for type casting
|
|
318
|
+
const portDef = parentNodeType.inputs[portName];
|
|
319
|
+
const portType = portDef ? mapToTypeScript(portDef.dataType, portDef.tsType) : 'unknown';
|
|
320
|
+
if (connection) {
|
|
321
|
+
const sourceNode = connection.from.node;
|
|
322
|
+
const sourcePort = connection.from.port;
|
|
323
|
+
const varName = `scopeReturn_${portName}`;
|
|
324
|
+
// Find the child instance to get its node type name
|
|
325
|
+
const childInstance = childInstances.find((c) => c.id === sourceNode);
|
|
326
|
+
const sourceNodeTypeName = childInstance?.nodeType ?? '';
|
|
327
|
+
const varAddr = `{ id: '${sourceNode}', portName: '${sourcePort}', executionIndex: ${toValidIdentifier(sourceNode)}Idx, nodeTypeName: '${sourceNodeTypeName}' }`;
|
|
328
|
+
// STEP ports (success/failure) may be undefined for expression nodes — use hasVariable with default
|
|
329
|
+
const isStepPort = portName === 'success' || portName === 'failure';
|
|
330
|
+
const defaultValue = portName === 'success' ? 'true' : portName === 'failure' ? 'false' : 'undefined';
|
|
331
|
+
if (isStepPort) {
|
|
332
|
+
lines.push(` const ${varName} = ctx.hasVariable(${varAddr}) ? ${getCallAfterMerge}(${varAddr}) as ${portType} : ${defaultValue};`);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
lines.push(` const ${varName} = ${getCallAfterMerge}(${varAddr}) as ${portType};`);
|
|
336
|
+
}
|
|
337
|
+
// Emit VARIABLE_SET for the parent's scoped INPUT port (debug mode only)
|
|
338
|
+
if (!production) {
|
|
339
|
+
const setCallAfterMerge = isAsync ? 'await ctx.setVariable' : 'ctx.setVariable';
|
|
340
|
+
lines.push(` ${setCallAfterMerge}({ id: '${parentNodeId}', portName: '${portName}', executionIndex: scopeExitIdx, scope: '${scopeName}', side: 'exit', nodeTypeName: '${parentNodeType.functionName}' }, ${varName});`);
|
|
341
|
+
}
|
|
342
|
+
returnObj.push(`${portName}: ${varName}`);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// No connection found - default STEP ports to true/false, others to undefined
|
|
346
|
+
const defaultValue = portName === 'success' ? 'true' : portName === 'failure' ? 'false' : 'undefined';
|
|
347
|
+
// Emit VARIABLE_SET for unconnected ports (debug mode only)
|
|
348
|
+
if (!production) {
|
|
349
|
+
const setCallAfterMerge = isAsync ? 'await ctx.setVariable' : 'ctx.setVariable';
|
|
350
|
+
lines.push(` ${setCallAfterMerge}({ id: '${parentNodeId}', portName: '${portName}', executionIndex: scopeExitIdx, scope: '${scopeName}', side: 'exit', nodeTypeName: '${parentNodeType.functionName}' }, ${defaultValue});`);
|
|
351
|
+
}
|
|
352
|
+
returnObj.push(`${portName}: ${defaultValue}`);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
lines.push(` return { ${returnObj.join(', ')} };`);
|
|
356
|
+
lines.push(` };`);
|
|
357
|
+
lines.push(`})(ctx)`);
|
|
358
|
+
return lines.join('\n ');
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=scope-function-generator.js.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { TNodeTypeAST, TWorkflowAST } from '../ast/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates executable TypeScript code from a workflow AST using ExecutionContext for state management.
|
|
4
|
+
*
|
|
5
|
+
* This is the main code generation function that transforms a visual workflow into runnable code.
|
|
6
|
+
*
|
|
7
|
+
* ## Algorithm Overview:
|
|
8
|
+
* 1. **Setup Phase**: Initialize ExecutionContext, set recursion depth protection
|
|
9
|
+
* 2. **Start Node**: Store workflow parameters as Start node outputs
|
|
10
|
+
* 3. **Control Flow Graph**: Build CFG from connections, perform topological sort
|
|
11
|
+
* 4. **Branch Detection**: Identify branching nodes (with onSuccess/onFailure) and their regions
|
|
12
|
+
* 5. **Code Generation**: For each node in execution order:
|
|
13
|
+
* - Regular nodes: Generate direct execution with variable storage
|
|
14
|
+
* - Branching nodes: Generate if/else blocks for success/failure paths
|
|
15
|
+
* - Scoped children: Generate scope function closures (for forEach, etc.)
|
|
16
|
+
* - Pull nodes: Generate lazy executors registered with context
|
|
17
|
+
* 6. **Exit Node**: Collect outputs and return result object
|
|
18
|
+
*
|
|
19
|
+
* ## Key Concepts:
|
|
20
|
+
* - **Branching Nodes**: Nodes with both onSuccess and onFailure ports create conditional branches
|
|
21
|
+
* - **Per-Port Scoped Children**: Children of forEach-like nodes execute via closure functions
|
|
22
|
+
* - **Pull Execution**: Nodes marked for lazy evaluation only run when outputs are consumed
|
|
23
|
+
* - **Execution Index**: Each node execution gets a unique index for variable tracking
|
|
24
|
+
*
|
|
25
|
+
* ## Generated Code Structure:
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const ctx = new GeneratedExecutionContext(isAsync, debugger?);
|
|
28
|
+
* const startIdx = ctx.addExecution('Start');
|
|
29
|
+
* ctx.setVariable({ id: 'Start', portName: 'param', ... }, value);
|
|
30
|
+
* // ... node executions in topological order ...
|
|
31
|
+
* const exitIdx = ctx.addExecution('Exit');
|
|
32
|
+
* return { onSuccess: ..., onFailure: ..., ...outputs };
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @param workflow - The workflow AST to generate code for
|
|
36
|
+
* @param nodeTypes - Available node type definitions (includes workflow's nodeTypes + imports)
|
|
37
|
+
* @param isAsync - Whether to generate async code (adds await, returns Promise)
|
|
38
|
+
* @param production - If true, omits debug instrumentation for smaller output
|
|
39
|
+
* @returns Generated TypeScript function body (without function signature)
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateControlFlowWithExecutionContext(workflow: TWorkflowAST, nodeTypes: TNodeTypeAST[], isAsync: boolean, production?: boolean, bundleMode?: boolean): string;
|
|
42
|
+
//# sourceMappingURL=unified.d.ts.map
|