@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,557 @@
|
|
|
1
|
+
import { mapToTypeScript } from "./type-mappings.js";
|
|
2
|
+
import { isExecutePort, isSuccessPort, isFailurePort, isControlFlowPort } from "./constants.js";
|
|
3
|
+
import { shouldUseStepTag } from "./utils/port-tag-utils.js";
|
|
4
|
+
import { detectSugarPatterns, filterStaleMacros } from "./sugar-optimizer.js";
|
|
5
|
+
export class AnnotationGenerator {
|
|
6
|
+
generate(workflow, options = {}) {
|
|
7
|
+
const { includeComments = true, includeMetadata = true, indentSize = 2, skipParamReturns = false, } = options;
|
|
8
|
+
const indent = " ".repeat(indentSize);
|
|
9
|
+
const lines = [];
|
|
10
|
+
if (includeComments) {
|
|
11
|
+
lines.push("");
|
|
12
|
+
lines.push("");
|
|
13
|
+
}
|
|
14
|
+
workflow.nodeTypes.forEach((nodeType) => {
|
|
15
|
+
// Skip the workflow's own IMPORTED_WORKFLOW entry (would create duplicate)
|
|
16
|
+
if (nodeType.variant === 'IMPORTED_WORKFLOW' && nodeType.functionName === workflow.functionName) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Skip synthetic MAP_ITERATOR node types — they're generated from @map macros
|
|
20
|
+
if (nodeType.variant === 'MAP_ITERATOR') {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
lines.push(...this.generateNodeTypeAnnotation(nodeType, indent, includeComments, includeMetadata));
|
|
24
|
+
lines.push("");
|
|
25
|
+
});
|
|
26
|
+
lines.push(...this.generateWorkflowAnnotation(workflow, indent, includeComments, skipParamReturns));
|
|
27
|
+
lines.push("");
|
|
28
|
+
return lines.join("\n");
|
|
29
|
+
}
|
|
30
|
+
generateNodeTypeAnnotation(nodeType, indent, includeComments, includeMetadata) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
// If functionText exists, it already includes the JSDoc - use it directly
|
|
33
|
+
if (nodeType.functionText) {
|
|
34
|
+
lines.push(nodeType.functionText);
|
|
35
|
+
return lines;
|
|
36
|
+
}
|
|
37
|
+
// Generate JSDoc comment block (only when no functionText)
|
|
38
|
+
lines.push("/**");
|
|
39
|
+
// Add description if present
|
|
40
|
+
if (includeComments && nodeType.description) {
|
|
41
|
+
lines.push(` * ${nodeType.description}`);
|
|
42
|
+
lines.push(` *`);
|
|
43
|
+
}
|
|
44
|
+
// @flowWeaver nodeType marker
|
|
45
|
+
lines.push(" * @flowWeaver nodeType");
|
|
46
|
+
// Add label if present
|
|
47
|
+
if (includeMetadata && nodeType.label) {
|
|
48
|
+
lines.push(` * @label ${nodeType.label}`);
|
|
49
|
+
}
|
|
50
|
+
// Add name if different from function name (preserves display name across save/reload)
|
|
51
|
+
if (includeMetadata && nodeType.name && nodeType.name !== nodeType.functionName) {
|
|
52
|
+
lines.push(` * @name ${nodeType.name}`);
|
|
53
|
+
}
|
|
54
|
+
// Add scope if present
|
|
55
|
+
if (nodeType.scope) {
|
|
56
|
+
lines.push(` * @scope ${nodeType.scope}`);
|
|
57
|
+
}
|
|
58
|
+
// Add pullExecution if present
|
|
59
|
+
if (nodeType.defaultConfig?.pullExecution) {
|
|
60
|
+
lines.push(` * @pullExecution ${nodeType.defaultConfig.pullExecution.triggerPort}`);
|
|
61
|
+
}
|
|
62
|
+
// Add input ports (with automatic ordering)
|
|
63
|
+
const inputEntries = this.assignPortOrders(Object.entries(nodeType.inputs), 'input');
|
|
64
|
+
inputEntries.forEach(([name, port]) => {
|
|
65
|
+
const portTag = this.generateJSDocPortTag(name, port, 'input');
|
|
66
|
+
lines.push(` * ${portTag}`);
|
|
67
|
+
});
|
|
68
|
+
// Add output ports (with automatic ordering)
|
|
69
|
+
const outputEntries = this.assignPortOrders(Object.entries(nodeType.outputs), 'output');
|
|
70
|
+
outputEntries.forEach(([name, port]) => {
|
|
71
|
+
const portTag = this.generateJSDocPortTag(name, port, 'output');
|
|
72
|
+
lines.push(` * ${portTag}`);
|
|
73
|
+
});
|
|
74
|
+
lines.push(" */");
|
|
75
|
+
// Generate function signature
|
|
76
|
+
lines.push(...this.generateFunctionSignature(nodeType));
|
|
77
|
+
return lines;
|
|
78
|
+
}
|
|
79
|
+
generateJSDocPortTag(name, port, direction, implicitOrder) {
|
|
80
|
+
return generateJSDocPortTag(name, port, direction, implicitOrder);
|
|
81
|
+
}
|
|
82
|
+
generateTPortDefinition(port, _indent) {
|
|
83
|
+
if (!port.optional &&
|
|
84
|
+
port.default === undefined &&
|
|
85
|
+
!port.expression &&
|
|
86
|
+
!port.label &&
|
|
87
|
+
!port.hidden &&
|
|
88
|
+
!port.failure) {
|
|
89
|
+
return `'${port.dataType}'`;
|
|
90
|
+
}
|
|
91
|
+
const props = [];
|
|
92
|
+
props.push(`type: '${port.dataType}'`);
|
|
93
|
+
if (port.optional) {
|
|
94
|
+
props.push(`optional: true`);
|
|
95
|
+
}
|
|
96
|
+
if (port.default !== undefined) {
|
|
97
|
+
props.push(`defaultValue: ${JSON.stringify(port.default)}`);
|
|
98
|
+
}
|
|
99
|
+
if (port.expression) {
|
|
100
|
+
props.push(`expression: \`${port.expression}\``);
|
|
101
|
+
}
|
|
102
|
+
if (port.label) {
|
|
103
|
+
props.push(`label: '${port.label}'`);
|
|
104
|
+
}
|
|
105
|
+
if (port.hidden) {
|
|
106
|
+
props.push(`hidden: true`);
|
|
107
|
+
}
|
|
108
|
+
if (port.failure) {
|
|
109
|
+
props.push(`failure: true`);
|
|
110
|
+
}
|
|
111
|
+
return `{ ${props.join(", ")} }`;
|
|
112
|
+
}
|
|
113
|
+
generateFunctionSignature(nodeType) {
|
|
114
|
+
const lines = [];
|
|
115
|
+
// Build parameters (excluding execute which will be first)
|
|
116
|
+
const params = ["execute: boolean"];
|
|
117
|
+
Object.entries(nodeType.inputs).forEach(([name, port]) => {
|
|
118
|
+
if (isExecutePort(name))
|
|
119
|
+
return;
|
|
120
|
+
const optional = port.optional ? "?" : "";
|
|
121
|
+
const defaultVal = port.default !== undefined ? ` = ${JSON.stringify(port.default)}` : "";
|
|
122
|
+
params.push(`${name}${optional}: ${this.mapDataTypeToTS(port.dataType)}${defaultVal}`);
|
|
123
|
+
});
|
|
124
|
+
// Build return type (including onSuccess/onFailure)
|
|
125
|
+
const returns = ["onSuccess: boolean", "onFailure: boolean"];
|
|
126
|
+
Object.entries(nodeType.outputs).forEach(([name, port]) => {
|
|
127
|
+
if (isSuccessPort(name) || isFailurePort(name))
|
|
128
|
+
return;
|
|
129
|
+
returns.push(`${name}: ${this.mapDataTypeToTS(port.dataType)}`);
|
|
130
|
+
});
|
|
131
|
+
lines.push(`function ${nodeType.functionName}(${params.join(", ")}) {`);
|
|
132
|
+
lines.push(` if (!execute) return { onSuccess: false, onFailure: false };`);
|
|
133
|
+
lines.push(` return { onSuccess: true, onFailure: false };`);
|
|
134
|
+
lines.push(`}`);
|
|
135
|
+
return lines;
|
|
136
|
+
}
|
|
137
|
+
generateWorkflowAnnotation(workflow, indent, includeComments, skipParamReturns = false) {
|
|
138
|
+
const lines = [];
|
|
139
|
+
// Build macro coverage sets for filtering (@map-specific)
|
|
140
|
+
const macroInstanceIds = new Set();
|
|
141
|
+
const macroChildIds = new Set();
|
|
142
|
+
const macroScopeNames = new Set();
|
|
143
|
+
if (workflow.macros && workflow.macros.length > 0) {
|
|
144
|
+
for (const macro of workflow.macros) {
|
|
145
|
+
if (macro.type === 'map') {
|
|
146
|
+
macroInstanceIds.add(macro.instanceId);
|
|
147
|
+
macroChildIds.add(macro.childId);
|
|
148
|
+
macroScopeNames.add(`${macro.instanceId}.iterate`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Generate JSDoc comment block
|
|
153
|
+
lines.push("/**");
|
|
154
|
+
// Add description if present
|
|
155
|
+
if (includeComments && workflow.description) {
|
|
156
|
+
lines.push(` * ${workflow.description}`);
|
|
157
|
+
lines.push(` *`);
|
|
158
|
+
}
|
|
159
|
+
// @flowWeaver workflow marker
|
|
160
|
+
lines.push(" * @flowWeaver workflow");
|
|
161
|
+
// Add strictTypes option if enabled
|
|
162
|
+
if (workflow.options?.strictTypes) {
|
|
163
|
+
lines.push(" * @strictTypes");
|
|
164
|
+
}
|
|
165
|
+
// Add autoConnect option if enabled
|
|
166
|
+
if (workflow.options?.autoConnect) {
|
|
167
|
+
lines.push(" * @autoConnect");
|
|
168
|
+
}
|
|
169
|
+
// @trigger round-trip
|
|
170
|
+
if (workflow.options?.trigger) {
|
|
171
|
+
const t = workflow.options.trigger;
|
|
172
|
+
const parts = [];
|
|
173
|
+
if (t.event)
|
|
174
|
+
parts.push(`event="${t.event}"`);
|
|
175
|
+
if (t.cron)
|
|
176
|
+
parts.push(`cron="${t.cron}"`);
|
|
177
|
+
if (parts.length > 0)
|
|
178
|
+
lines.push(` * @trigger ${parts.join(' ')}`);
|
|
179
|
+
}
|
|
180
|
+
// @cancelOn round-trip
|
|
181
|
+
if (workflow.options?.cancelOn) {
|
|
182
|
+
const c = workflow.options.cancelOn;
|
|
183
|
+
let line = ` * @cancelOn event="${c.event}"`;
|
|
184
|
+
if (c.match)
|
|
185
|
+
line += ` match="${c.match}"`;
|
|
186
|
+
if (c.timeout)
|
|
187
|
+
line += ` timeout="${c.timeout}"`;
|
|
188
|
+
lines.push(line);
|
|
189
|
+
}
|
|
190
|
+
// @retries round-trip
|
|
191
|
+
if (workflow.options?.retries !== undefined) {
|
|
192
|
+
lines.push(` * @retries ${workflow.options.retries}`);
|
|
193
|
+
}
|
|
194
|
+
// @timeout round-trip
|
|
195
|
+
if (workflow.options?.timeout) {
|
|
196
|
+
lines.push(` * @timeout "${workflow.options.timeout}"`);
|
|
197
|
+
}
|
|
198
|
+
// @throttle round-trip
|
|
199
|
+
if (workflow.options?.throttle) {
|
|
200
|
+
const t = workflow.options.throttle;
|
|
201
|
+
let line = ` * @throttle limit=${t.limit}`;
|
|
202
|
+
if (t.period)
|
|
203
|
+
line += ` period="${t.period}"`;
|
|
204
|
+
lines.push(line);
|
|
205
|
+
}
|
|
206
|
+
// Add name if different from export name
|
|
207
|
+
if (workflow.name && workflow.name !== workflow.functionName) {
|
|
208
|
+
lines.push(` * @name ${workflow.name}`);
|
|
209
|
+
}
|
|
210
|
+
// Add description tag
|
|
211
|
+
if (workflow.description && includeComments) {
|
|
212
|
+
lines.push(` * @description ${workflow.description}`);
|
|
213
|
+
}
|
|
214
|
+
// Add node instances — skip synthetic MAP_ITERATOR instances, strip parent from macro children
|
|
215
|
+
workflow.instances.forEach((instance) => {
|
|
216
|
+
if (macroInstanceIds.has(instance.id))
|
|
217
|
+
return;
|
|
218
|
+
if (macroChildIds.has(instance.id) && instance.parent) {
|
|
219
|
+
const stripped = { ...instance, parent: undefined };
|
|
220
|
+
lines.push(generateNodeInstanceTag(stripped));
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
lines.push(generateNodeInstanceTag(instance));
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
// Filter stale macros (e.g. paths whose connections were deleted)
|
|
227
|
+
const existingMacros = filterStaleMacros(workflow.macros || [], workflow.connections, workflow.instances);
|
|
228
|
+
// Auto-detect @path sugar patterns from connections
|
|
229
|
+
const detected = detectSugarPatterns(workflow.connections, workflow.instances, existingMacros, workflow.nodeTypes, workflow.startPorts, workflow.exitPorts);
|
|
230
|
+
// Merge detected macros with existing ones
|
|
231
|
+
const allMacros = [
|
|
232
|
+
...existingMacros,
|
|
233
|
+
...detected.paths,
|
|
234
|
+
];
|
|
235
|
+
// Add @map and @path macros
|
|
236
|
+
if (allMacros.length > 0) {
|
|
237
|
+
for (const macro of allMacros) {
|
|
238
|
+
if (macro.type === 'map') {
|
|
239
|
+
let mapLine = ` * @map ${macro.instanceId} ${macro.childId}`;
|
|
240
|
+
if (macro.inputPort || macro.outputPort) {
|
|
241
|
+
mapLine += `(${macro.inputPort} -> ${macro.outputPort})`;
|
|
242
|
+
}
|
|
243
|
+
mapLine += ` over ${macro.sourcePort}`;
|
|
244
|
+
lines.push(mapLine);
|
|
245
|
+
}
|
|
246
|
+
else if (macro.type === 'path') {
|
|
247
|
+
const stepsStr = macro.steps.map(s => s.route ? `${s.node}:${s.route}` : s.node).join(' -> ');
|
|
248
|
+
lines.push(` * @path ${stepsStr}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Add node positions (if they exist)
|
|
253
|
+
// Start with Start node position if present
|
|
254
|
+
if (workflow.ui?.startNode?.x !== undefined && workflow.ui?.startNode?.y !== undefined) {
|
|
255
|
+
lines.push(` * @position Start ${Math.round(workflow.ui.startNode.x)} ${Math.round(workflow.ui.startNode.y)}`);
|
|
256
|
+
}
|
|
257
|
+
// Add instance positions
|
|
258
|
+
workflow.instances.forEach((instance) => {
|
|
259
|
+
if (instance.config?.x !== undefined && instance.config?.y !== undefined) {
|
|
260
|
+
lines.push(` * @position ${instance.id} ${Math.round(instance.config.x)} ${Math.round(instance.config.y)}`);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
// Add Exit node position if present
|
|
264
|
+
if (workflow.ui?.exitNode?.x !== undefined && workflow.ui?.exitNode?.y !== undefined) {
|
|
265
|
+
lines.push(` * @position Exit ${Math.round(workflow.ui.exitNode.x)} ${Math.round(workflow.ui.exitNode.y)}`);
|
|
266
|
+
}
|
|
267
|
+
// Add connections — skip connections covered by macros
|
|
268
|
+
if (!workflow.options?.autoConnect) {
|
|
269
|
+
workflow.connections.forEach((conn) => {
|
|
270
|
+
if (allMacros.length > 0 && isConnectionCoveredByMacroStatic(conn, allMacros))
|
|
271
|
+
return;
|
|
272
|
+
const fromScope = conn.from.scope ? `:${conn.from.scope}` : '';
|
|
273
|
+
const toScope = conn.to.scope ? `:${conn.to.scope}` : '';
|
|
274
|
+
lines.push(` * @connect ${conn.from.node}.${conn.from.port}${fromScope} -> ${conn.to.node}.${conn.to.port}${toScope}`);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
// Add @param annotations for start ports (workflow inputs)
|
|
278
|
+
if (!skipParamReturns && workflow.startPorts && Object.keys(workflow.startPorts).length > 0) {
|
|
279
|
+
const startPortEntries = this.assignPortOrders(Object.entries(workflow.startPorts), 'input');
|
|
280
|
+
startPortEntries.forEach(([name, port], index) => {
|
|
281
|
+
const paramTag = this.generateJSDocPortTag(name, port, 'input', index);
|
|
282
|
+
// Replace @input with @param for workflow-level JSDoc
|
|
283
|
+
lines.push(` * ${paramTag.replace('@input', '@param')}`);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
// Add @returns annotations for exit ports (workflow outputs)
|
|
287
|
+
if (!skipParamReturns && workflow.exitPorts && Object.keys(workflow.exitPorts).length > 0) {
|
|
288
|
+
const exitPortEntries = this.assignPortOrders(Object.entries(workflow.exitPorts), 'output');
|
|
289
|
+
exitPortEntries.forEach(([name, port], index) => {
|
|
290
|
+
const returnTag = this.generateJSDocPortTag(name, port, 'output', index);
|
|
291
|
+
// Replace @output with @returns for workflow-level JSDoc
|
|
292
|
+
lines.push(` * ${returnTag.replace('@output', '@returns')}`);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
// Add scopes — skip scopes covered by @map macros
|
|
296
|
+
if (workflow.scopes) {
|
|
297
|
+
Object.entries(workflow.scopes).forEach(([scopeName, children]) => {
|
|
298
|
+
if (macroScopeNames.has(scopeName))
|
|
299
|
+
return;
|
|
300
|
+
lines.push(` * @scope ${scopeName} [${children.join(', ')}]`);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
lines.push(" */");
|
|
304
|
+
// Add workflow function signature
|
|
305
|
+
lines.push(...this.generateWorkflowFunctionSignature(workflow));
|
|
306
|
+
return lines;
|
|
307
|
+
}
|
|
308
|
+
generateWorkflowFunctionSignature(workflow) {
|
|
309
|
+
const lines = [];
|
|
310
|
+
const startPorts = workflow.startPorts || {};
|
|
311
|
+
const exitPorts = workflow.exitPorts || {};
|
|
312
|
+
// Build parameter types (excluding execute)
|
|
313
|
+
const params = [];
|
|
314
|
+
Object.entries(startPorts).forEach(([name, port]) => {
|
|
315
|
+
if (isExecutePort(name))
|
|
316
|
+
return;
|
|
317
|
+
const optional = port.optional ? "?" : "";
|
|
318
|
+
params.push(`${name}${optional}: ${this.mapDataTypeToTS(port.dataType)}`);
|
|
319
|
+
});
|
|
320
|
+
// Build return types (including onSuccess/onFailure)
|
|
321
|
+
const returns = [];
|
|
322
|
+
Object.entries(exitPorts).forEach(([name, port]) => {
|
|
323
|
+
const optional = port.optional ? "?" : "";
|
|
324
|
+
returns.push(`${name}${optional}: ${this.mapDataTypeToTS(port.dataType)}`);
|
|
325
|
+
});
|
|
326
|
+
// Generate async function signature with execute parameter
|
|
327
|
+
lines.push(`export async function ${workflow.functionName}(`);
|
|
328
|
+
lines.push(` execute: boolean,`);
|
|
329
|
+
lines.push(` params: { ${params.join("; ")} }`);
|
|
330
|
+
lines.push(`): Promise<{ ${returns.join("; ")} }> {`);
|
|
331
|
+
lines.push(` throw new Error('Not implemented');`);
|
|
332
|
+
lines.push("}");
|
|
333
|
+
return lines;
|
|
334
|
+
}
|
|
335
|
+
assignPortOrders(ports, direction) {
|
|
336
|
+
return assignPortOrders(ports, direction);
|
|
337
|
+
}
|
|
338
|
+
mapDataTypeToTS(dataType) {
|
|
339
|
+
return mapToTypeScript(dataType);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Generate JSDoc port tag (e.g., @input name - Description)
|
|
344
|
+
* Exported for reuse in generate-in-place.ts to maintain DRY principle
|
|
345
|
+
*
|
|
346
|
+
* New format (types derived from signature):
|
|
347
|
+
* - @input name - Description
|
|
348
|
+
* - @output name - Description
|
|
349
|
+
* - @step name - Description (for explicit STEP/control-flow ports)
|
|
350
|
+
*
|
|
351
|
+
* Reserved STEP ports (execute, onSuccess, onFailure) use @input/@output.
|
|
352
|
+
* Custom STEP ports use @step.
|
|
353
|
+
*/
|
|
354
|
+
export function generateJSDocPortTag(name, port, direction, _implicitOrder) {
|
|
355
|
+
// Determine tag: @step for explicit control flow, @input/@output for data
|
|
356
|
+
// Reserved STEP ports (execute, onSuccess, onFailure) stay as @input/@output
|
|
357
|
+
// Scoped mandatory ports (start, success, failure) with scope attribute also stay as @input/@output
|
|
358
|
+
const tag = shouldUseStepTag(name, port) ? 'step' : direction;
|
|
359
|
+
// Format: @input [name=default] - Description
|
|
360
|
+
// or: @input name - Expression: (ctx) => ...
|
|
361
|
+
let portStr = `@${tag} `;
|
|
362
|
+
// Handle optional with default value: [name=value]
|
|
363
|
+
if (port.optional && port.default !== undefined) {
|
|
364
|
+
portStr += `[${name}=${JSON.stringify(port.default)}]`;
|
|
365
|
+
}
|
|
366
|
+
// Handle optional without default: [name]
|
|
367
|
+
else if (port.optional) {
|
|
368
|
+
portStr += `[${name}]`;
|
|
369
|
+
}
|
|
370
|
+
// Handle required with default: name=value (though rare)
|
|
371
|
+
else if (port.default !== undefined) {
|
|
372
|
+
portStr += `${name}=${JSON.stringify(port.default)}`;
|
|
373
|
+
}
|
|
374
|
+
// Regular required port
|
|
375
|
+
else {
|
|
376
|
+
portStr += name;
|
|
377
|
+
}
|
|
378
|
+
// Add scope attribute if present (for per-port scoped architecture)
|
|
379
|
+
if (port.scope) {
|
|
380
|
+
portStr += ` scope:${port.scope}`;
|
|
381
|
+
}
|
|
382
|
+
// Add order metadata whenever it's explicitly set to preserve round-trip fidelity
|
|
383
|
+
// Even if order matches position, we must write it to avoid losing metadata on re-parse
|
|
384
|
+
if (port.metadata?.order !== undefined) {
|
|
385
|
+
portStr += ` [order:${port.metadata.order}]`;
|
|
386
|
+
}
|
|
387
|
+
// Add placement metadata when explicitly set
|
|
388
|
+
if (port.metadata?.placement !== undefined) {
|
|
389
|
+
portStr += ` [placement:${port.metadata.placement}]`;
|
|
390
|
+
}
|
|
391
|
+
if (port.expression) {
|
|
392
|
+
portStr += ` - Expression: ${port.expression}`;
|
|
393
|
+
}
|
|
394
|
+
else if (port.label && port.label !== name) {
|
|
395
|
+
// Only add label if it differs from the port name
|
|
396
|
+
portStr += ` - ${port.label}`;
|
|
397
|
+
}
|
|
398
|
+
return portStr;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Check if a connection is covered by a macro (and should not be written as @connect).
|
|
402
|
+
* Handles both @map and @path macros.
|
|
403
|
+
*/
|
|
404
|
+
function isConnectionCoveredByMacroStatic(conn, macros) {
|
|
405
|
+
for (const macro of macros) {
|
|
406
|
+
if (macro.type === 'map') {
|
|
407
|
+
const [sourceNode, sourcePort] = macro.sourcePort.split('.');
|
|
408
|
+
// Scoped connections between the map instance and its child
|
|
409
|
+
if ((conn.from.node === macro.instanceId || conn.from.node === macro.childId) &&
|
|
410
|
+
(conn.to.node === macro.instanceId || conn.to.node === macro.childId) &&
|
|
411
|
+
(conn.from.scope === 'iterate' || conn.to.scope === 'iterate')) {
|
|
412
|
+
return true;
|
|
413
|
+
}
|
|
414
|
+
// Upstream connection: source.port -> mapInstance.items
|
|
415
|
+
if (conn.from.node === sourceNode &&
|
|
416
|
+
conn.from.port === sourcePort &&
|
|
417
|
+
!conn.from.scope &&
|
|
418
|
+
conn.to.node === macro.instanceId &&
|
|
419
|
+
conn.to.port === 'items' &&
|
|
420
|
+
!conn.to.scope) {
|
|
421
|
+
return true;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
else if (macro.type === 'path') {
|
|
425
|
+
if (conn.from.scope || conn.to.scope)
|
|
426
|
+
continue;
|
|
427
|
+
const steps = macro.steps;
|
|
428
|
+
const fromIdx = steps.findIndex(s => s.node === conn.from.node);
|
|
429
|
+
const toIdx = steps.findIndex(s => s.node === conn.to.node);
|
|
430
|
+
if (fromIdx === -1 || toIdx === -1 || fromIdx >= toIdx)
|
|
431
|
+
continue;
|
|
432
|
+
// Control flow: check consecutive pairs
|
|
433
|
+
if (toIdx === fromIdx + 1) {
|
|
434
|
+
const route = steps[fromIdx].route || 'ok';
|
|
435
|
+
// Start.execute -> next.execute
|
|
436
|
+
if (conn.from.node === 'Start' && conn.from.port === 'execute' && conn.to.port === 'execute')
|
|
437
|
+
return true;
|
|
438
|
+
// To Exit: route determines which Exit port
|
|
439
|
+
if (conn.to.node === 'Exit') {
|
|
440
|
+
if (route === 'fail' && conn.from.port === 'onFailure' && conn.to.port === 'onFailure')
|
|
441
|
+
return true;
|
|
442
|
+
if (route === 'ok' && conn.from.port === 'onSuccess' && conn.to.port === 'onSuccess')
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
// Normal: onSuccess/onFailure -> execute
|
|
446
|
+
if (route === 'fail' && conn.from.port === 'onFailure' && conn.to.port === 'execute')
|
|
447
|
+
return true;
|
|
448
|
+
if (route === 'ok' && conn.from.port === 'onSuccess' && conn.to.port === 'execute')
|
|
449
|
+
return true;
|
|
450
|
+
}
|
|
451
|
+
// Data: same-name non-control-flow, from before to, to is not Exit
|
|
452
|
+
if (conn.to.node !== 'Exit' &&
|
|
453
|
+
!isControlFlowPort(conn.from.port) &&
|
|
454
|
+
!isControlFlowPort(conn.to.port) &&
|
|
455
|
+
conn.from.port === conn.to.port) {
|
|
456
|
+
return true;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Simply return ports as-is to preserve exact order from the AST
|
|
464
|
+
* Don't compute or add any new metadata - only preserve what's already there
|
|
465
|
+
* This ensures perfect round-trip fidelity
|
|
466
|
+
* Exported for reuse in generate-in-place.ts to maintain DRY principle
|
|
467
|
+
*/
|
|
468
|
+
export function assignPortOrders(ports, _direction) {
|
|
469
|
+
return ports;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Generate @node tag for a single instance
|
|
473
|
+
* Exported for reuse in generate-in-place.ts to maintain DRY principle
|
|
474
|
+
*/
|
|
475
|
+
export function generateNodeInstanceTag(instance) {
|
|
476
|
+
const parent = instance.parent ? ` ${instance.parent.id}.${instance.parent.scope}` : '';
|
|
477
|
+
// Generate [label: ...] attribute if present and different from id
|
|
478
|
+
let labelAttr = '';
|
|
479
|
+
if (instance.config?.label && instance.config.label !== instance.id) {
|
|
480
|
+
// Escape quotes in the label
|
|
481
|
+
const escapedLabel = instance.config.label.replace(/"/g, '\\"');
|
|
482
|
+
labelAttr = ` [label: "${escapedLabel}"]`;
|
|
483
|
+
}
|
|
484
|
+
// Generate [portOrder: ...] attribute if present
|
|
485
|
+
let portOrderAttr = '';
|
|
486
|
+
if (instance.config?.portConfigs && instance.config.portConfigs.length > 0) {
|
|
487
|
+
const orderConfigs = instance.config.portConfigs
|
|
488
|
+
.filter(pc => pc.order !== undefined)
|
|
489
|
+
.map(pc => `${pc.portName}=${pc.order}`)
|
|
490
|
+
.join(',');
|
|
491
|
+
if (orderConfigs) {
|
|
492
|
+
portOrderAttr = ` [portOrder: ${orderConfigs}]`;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// Generate [portLabel: ...] attribute if present
|
|
496
|
+
let portLabelAttr = '';
|
|
497
|
+
if (instance.config?.portConfigs && instance.config.portConfigs.length > 0) {
|
|
498
|
+
const labelConfigs = instance.config.portConfigs
|
|
499
|
+
.filter(pc => pc.label !== undefined && pc.label !== '')
|
|
500
|
+
.map(pc => {
|
|
501
|
+
const escapedLabel = String(pc.label).replace(/"/g, '\\"');
|
|
502
|
+
return `${pc.portName}="${escapedLabel}"`;
|
|
503
|
+
})
|
|
504
|
+
.join(', ');
|
|
505
|
+
if (labelConfigs) {
|
|
506
|
+
portLabelAttr = ` [portLabel: ${labelConfigs}]`;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
// Generate [expr: ...] attribute if any port has an expression
|
|
510
|
+
let exprAttr = '';
|
|
511
|
+
if (instance.config?.portConfigs && instance.config.portConfigs.length > 0) {
|
|
512
|
+
const exprConfigs = instance.config.portConfigs
|
|
513
|
+
.filter(pc => pc.expression !== undefined)
|
|
514
|
+
.map(pc => {
|
|
515
|
+
// Escape quotes and */ (which would close the JSDoc comment)
|
|
516
|
+
const escapedExpr = String(pc.expression)
|
|
517
|
+
.replace(/"/g, '\\"')
|
|
518
|
+
.replace(/\*\//g, '*\\/');
|
|
519
|
+
return `${pc.portName}="${escapedExpr}"`;
|
|
520
|
+
})
|
|
521
|
+
.join(', ');
|
|
522
|
+
if (exprConfigs) {
|
|
523
|
+
exprAttr = ` [expr: ${exprConfigs}]`;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
// Generate [pullExecution: ...] attribute if present
|
|
527
|
+
let pullExecutionAttr = '';
|
|
528
|
+
if (instance.config?.pullExecution) {
|
|
529
|
+
pullExecutionAttr = ` [pullExecution: ${instance.config.pullExecution.triggerPort}]`;
|
|
530
|
+
}
|
|
531
|
+
// Generate [minimized] attribute if present
|
|
532
|
+
const minimizedAttr = instance.config?.minimized ? ' [minimized]' : '';
|
|
533
|
+
// Generate [color: "value"] attribute if present
|
|
534
|
+
let colorAttr = '';
|
|
535
|
+
if (instance.config?.color) {
|
|
536
|
+
colorAttr = ` [color: "${instance.config.color}"]`;
|
|
537
|
+
}
|
|
538
|
+
// Generate [icon: "value"] attribute if present
|
|
539
|
+
let iconAttr = '';
|
|
540
|
+
if (instance.config?.icon) {
|
|
541
|
+
iconAttr = ` [icon: "${instance.config.icon}"]`;
|
|
542
|
+
}
|
|
543
|
+
// Generate [tags: "label" "tooltip", "label2"] attribute if present
|
|
544
|
+
let tagsAttr = '';
|
|
545
|
+
if (instance.config?.tags?.length) {
|
|
546
|
+
const tagEntries = instance.config.tags.map(t => t.tooltip ? `"${t.label}" "${t.tooltip}"` : `"${t.label}"`).join(', ');
|
|
547
|
+
tagsAttr = ` [tags: ${tagEntries}]`;
|
|
548
|
+
}
|
|
549
|
+
// Generate [size: width height] attribute if present
|
|
550
|
+
let sizeAttr = '';
|
|
551
|
+
if (instance.config?.width !== undefined && instance.config?.height !== undefined) {
|
|
552
|
+
sizeAttr = ` [size: ${Math.round(instance.config.width)} ${Math.round(instance.config.height)}]`;
|
|
553
|
+
}
|
|
554
|
+
return ` * @node ${instance.id} ${instance.nodeType}${parent}${labelAttr}${portOrderAttr}${portLabelAttr}${exprAttr}${pullExecutionAttr}${minimizedAttr}${colorAttr}${iconAttr}${tagsAttr}${sizeAttr}`;
|
|
555
|
+
}
|
|
556
|
+
export const annotationGenerator = new AnnotationGenerator();
|
|
557
|
+
//# sourceMappingURL=annotation-generator.js.map
|