@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,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replay LLM Provider — creates a mock provider from a recorded session.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { createReplayProvider, loadRecording } from 'flow-weaver/testing';
|
|
7
|
+
*
|
|
8
|
+
* const recording = loadRecording(jsonFixture);
|
|
9
|
+
* const replay = createReplayProvider(recording);
|
|
10
|
+
*
|
|
11
|
+
* // Use as LLM provider — calls are replayed in order
|
|
12
|
+
* (globalThis as unknown as { __fw_llm_provider__?: LLMProvider }).__fw_llm_provider__ = replay;
|
|
13
|
+
*
|
|
14
|
+
* // Run workflow — LLM calls return recorded responses, no network calls
|
|
15
|
+
*
|
|
16
|
+
* // All MockLlmProvider methods work: getCalls(), getTotalTokens(), etc.
|
|
17
|
+
* expect(replay.getCallCount()).toBe(3);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Replay provider factory
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const ZERO_USAGE = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
24
|
+
/**
|
|
25
|
+
* Creates a MockLlmProvider that replays recorded LLM interactions in order.
|
|
26
|
+
*
|
|
27
|
+
* Each `chat()` call returns the next recorded response sequentially.
|
|
28
|
+
* The returned provider implements the full MockLlmProvider interface,
|
|
29
|
+
* so all existing assertion helpers and TokenTracker work out of the box.
|
|
30
|
+
*
|
|
31
|
+
* @param recording - The recording to replay (from createRecordingProvider or loadRecording)
|
|
32
|
+
* @param options - Replay configuration
|
|
33
|
+
* @returns A MockLlmProvider that replays recorded responses
|
|
34
|
+
*/
|
|
35
|
+
export function createReplayProvider(recording, options) {
|
|
36
|
+
const strict = options?.strict ?? true;
|
|
37
|
+
const defaultUsage = options?.defaultUsage ?? ZERO_USAGE;
|
|
38
|
+
const steps = [...recording.steps];
|
|
39
|
+
let callIndex = 0;
|
|
40
|
+
const calls = [];
|
|
41
|
+
return {
|
|
42
|
+
async chat(messages, chatOptions) {
|
|
43
|
+
if (callIndex >= steps.length) {
|
|
44
|
+
if (strict) {
|
|
45
|
+
throw new Error(`Replay exhausted: recording has ${steps.length} step(s) but call #${callIndex} was attempted. ` +
|
|
46
|
+
`Set strict: false to return a fallback response instead.`);
|
|
47
|
+
}
|
|
48
|
+
// Non-strict: return an empty response
|
|
49
|
+
const fallback = {
|
|
50
|
+
content: `[Replay exhausted at call #${callIndex}]`,
|
|
51
|
+
toolCalls: [],
|
|
52
|
+
finishReason: 'stop',
|
|
53
|
+
usage: defaultUsage,
|
|
54
|
+
};
|
|
55
|
+
calls.push({
|
|
56
|
+
messages: [...messages],
|
|
57
|
+
options: chatOptions,
|
|
58
|
+
matchedIndex: -1,
|
|
59
|
+
response: fallback,
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
});
|
|
62
|
+
callIndex++;
|
|
63
|
+
return fallback;
|
|
64
|
+
}
|
|
65
|
+
const step = steps[callIndex];
|
|
66
|
+
const response = {
|
|
67
|
+
content: step.output.content,
|
|
68
|
+
toolCalls: step.output.toolCalls ?? [],
|
|
69
|
+
finishReason: step.output.finishReason ?? 'stop',
|
|
70
|
+
usage: step.output.usage ?? defaultUsage,
|
|
71
|
+
};
|
|
72
|
+
calls.push({
|
|
73
|
+
messages: [...messages],
|
|
74
|
+
options: chatOptions,
|
|
75
|
+
matchedIndex: callIndex,
|
|
76
|
+
response,
|
|
77
|
+
timestamp: Date.now(),
|
|
78
|
+
});
|
|
79
|
+
callIndex++;
|
|
80
|
+
return response;
|
|
81
|
+
},
|
|
82
|
+
getCalls() {
|
|
83
|
+
return [...calls];
|
|
84
|
+
},
|
|
85
|
+
getCallCount() {
|
|
86
|
+
return calls.length;
|
|
87
|
+
},
|
|
88
|
+
getTotalTokens() {
|
|
89
|
+
return calls.reduce((sum, call) => sum + (call.response.usage?.totalTokens ?? 0), 0);
|
|
90
|
+
},
|
|
91
|
+
getTokenUsage() {
|
|
92
|
+
return calls.map((call) => call.response.usage ?? defaultUsage);
|
|
93
|
+
},
|
|
94
|
+
reset() {
|
|
95
|
+
calls.length = 0;
|
|
96
|
+
callIndex = 0;
|
|
97
|
+
},
|
|
98
|
+
getCallsForResponse(index) {
|
|
99
|
+
return calls.filter((c) => c.matchedIndex === index);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Loading helpers
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Parse a recording from JSON data.
|
|
108
|
+
*
|
|
109
|
+
* Accepts either a parsed object or a JSON string.
|
|
110
|
+
* Validates the structure and returns a typed LlmRecording.
|
|
111
|
+
*
|
|
112
|
+
* @param data - JSON string or parsed object
|
|
113
|
+
* @returns A validated LlmRecording
|
|
114
|
+
*/
|
|
115
|
+
export function loadRecording(data) {
|
|
116
|
+
const parsed = typeof data === 'string' ? JSON.parse(data) : data;
|
|
117
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
118
|
+
throw new Error('Invalid recording: expected an object');
|
|
119
|
+
}
|
|
120
|
+
const rec = parsed;
|
|
121
|
+
if (!Array.isArray(rec.steps)) {
|
|
122
|
+
throw new Error('Invalid recording: missing or invalid "steps" array');
|
|
123
|
+
}
|
|
124
|
+
// Validate each step has minimum required fields
|
|
125
|
+
for (let i = 0; i < rec.steps.length; i++) {
|
|
126
|
+
const step = rec.steps[i];
|
|
127
|
+
if (!step.output || typeof step.output !== 'object') {
|
|
128
|
+
throw new Error(`Invalid recording step ${i}: missing "output" object`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
steps: rec.steps.map((step, i) => ({
|
|
133
|
+
index: step.index ?? i,
|
|
134
|
+
input: step.input ?? { messages: [] },
|
|
135
|
+
output: step.output,
|
|
136
|
+
timestamp: step.timestamp ?? '',
|
|
137
|
+
durationMs: step.durationMs ?? 0,
|
|
138
|
+
})),
|
|
139
|
+
metadata: rec.metadata ?? {},
|
|
140
|
+
createdAt: rec.createdAt ?? '',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=replayer.js.map
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage tracker for agent workflow tests.
|
|
3
|
+
*
|
|
4
|
+
* Accumulates token usage across LLM calls and provides
|
|
5
|
+
* budget assertions for cost control testing.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { TokenTracker, createMockLlmProvider } from 'flow-weaver/testing';
|
|
10
|
+
*
|
|
11
|
+
* const tracker = new TokenTracker();
|
|
12
|
+
* const mockLlm = createMockLlmProvider([...]);
|
|
13
|
+
*
|
|
14
|
+
* // After running workflow
|
|
15
|
+
* mockLlm.getCalls().forEach((call, i) => {
|
|
16
|
+
* tracker.track(`step-${i}`, call.response.usage);
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* tracker.assertBelow(10000); // Fail if total exceeds budget
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import type { LLMTokenUsage } from './mock-llm.js';
|
|
23
|
+
export interface TrackedStep {
|
|
24
|
+
/** Identifier for this step (e.g., node name, call index) */
|
|
25
|
+
step: string;
|
|
26
|
+
/** Token usage for this step */
|
|
27
|
+
usage: LLMTokenUsage;
|
|
28
|
+
/** Timestamp when tracked */
|
|
29
|
+
timestamp: number;
|
|
30
|
+
}
|
|
31
|
+
export declare class TokenTracker {
|
|
32
|
+
private steps;
|
|
33
|
+
/** Track token usage for a step */
|
|
34
|
+
track(step: string, usage?: LLMTokenUsage | {
|
|
35
|
+
totalTokens: number;
|
|
36
|
+
}): void;
|
|
37
|
+
/** Total tokens across all tracked steps */
|
|
38
|
+
get total(): number;
|
|
39
|
+
/** Total prompt tokens */
|
|
40
|
+
get promptTokens(): number;
|
|
41
|
+
/** Total completion tokens */
|
|
42
|
+
get completionTokens(): number;
|
|
43
|
+
/** Number of tracked steps */
|
|
44
|
+
get stepCount(): number;
|
|
45
|
+
/** Get all tracked steps */
|
|
46
|
+
getSteps(): TrackedStep[];
|
|
47
|
+
/** Get usage for a specific step by name */
|
|
48
|
+
getStep(step: string): TrackedStep | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Assert total tokens are below a budget.
|
|
51
|
+
* Throws with a descriptive message if exceeded.
|
|
52
|
+
*/
|
|
53
|
+
assertBelow(maxTokens: number): void;
|
|
54
|
+
/**
|
|
55
|
+
* Assert total tokens are above a minimum.
|
|
56
|
+
* Useful to verify the LLM was actually called.
|
|
57
|
+
*/
|
|
58
|
+
assertAbove(minTokens: number): void;
|
|
59
|
+
/** Reset all tracking data */
|
|
60
|
+
reset(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Convenience: track all calls from a mock LLM provider.
|
|
63
|
+
* Uses call index as step name unless a nameResolver is provided.
|
|
64
|
+
*/
|
|
65
|
+
trackFromCalls(calls: Array<{
|
|
66
|
+
response: {
|
|
67
|
+
usage?: LLMTokenUsage;
|
|
68
|
+
};
|
|
69
|
+
}>, nameResolver?: (index: number) => string): void;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=token-tracker.d.ts.map
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token usage tracker for agent workflow tests.
|
|
3
|
+
*
|
|
4
|
+
* Accumulates token usage across LLM calls and provides
|
|
5
|
+
* budget assertions for cost control testing.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { TokenTracker, createMockLlmProvider } from 'flow-weaver/testing';
|
|
10
|
+
*
|
|
11
|
+
* const tracker = new TokenTracker();
|
|
12
|
+
* const mockLlm = createMockLlmProvider([...]);
|
|
13
|
+
*
|
|
14
|
+
* // After running workflow
|
|
15
|
+
* mockLlm.getCalls().forEach((call, i) => {
|
|
16
|
+
* tracker.track(`step-${i}`, call.response.usage);
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* tracker.assertBelow(10000); // Fail if total exceeds budget
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export class TokenTracker {
|
|
23
|
+
steps = [];
|
|
24
|
+
/** Track token usage for a step */
|
|
25
|
+
track(step, usage) {
|
|
26
|
+
const normalized = {
|
|
27
|
+
promptTokens: usage?.promptTokens ?? 0,
|
|
28
|
+
completionTokens: usage?.completionTokens ?? 0,
|
|
29
|
+
totalTokens: usage?.totalTokens ?? 0,
|
|
30
|
+
};
|
|
31
|
+
this.steps.push({ step, usage: normalized, timestamp: Date.now() });
|
|
32
|
+
}
|
|
33
|
+
/** Total tokens across all tracked steps */
|
|
34
|
+
get total() {
|
|
35
|
+
return this.steps.reduce((sum, s) => sum + s.usage.totalTokens, 0);
|
|
36
|
+
}
|
|
37
|
+
/** Total prompt tokens */
|
|
38
|
+
get promptTokens() {
|
|
39
|
+
return this.steps.reduce((sum, s) => sum + s.usage.promptTokens, 0);
|
|
40
|
+
}
|
|
41
|
+
/** Total completion tokens */
|
|
42
|
+
get completionTokens() {
|
|
43
|
+
return this.steps.reduce((sum, s) => sum + s.usage.completionTokens, 0);
|
|
44
|
+
}
|
|
45
|
+
/** Number of tracked steps */
|
|
46
|
+
get stepCount() {
|
|
47
|
+
return this.steps.length;
|
|
48
|
+
}
|
|
49
|
+
/** Get all tracked steps */
|
|
50
|
+
getSteps() {
|
|
51
|
+
return [...this.steps];
|
|
52
|
+
}
|
|
53
|
+
/** Get usage for a specific step by name */
|
|
54
|
+
getStep(step) {
|
|
55
|
+
return this.steps.find((s) => s.step === step);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Assert total tokens are below a budget.
|
|
59
|
+
* Throws with a descriptive message if exceeded.
|
|
60
|
+
*/
|
|
61
|
+
assertBelow(maxTokens) {
|
|
62
|
+
if (this.total > maxTokens) {
|
|
63
|
+
const breakdown = this.steps
|
|
64
|
+
.map((s) => ` ${s.step}: ${s.usage.totalTokens} tokens`)
|
|
65
|
+
.join('\n');
|
|
66
|
+
throw new Error(`Token budget exceeded: ${this.total} > ${maxTokens}\n` +
|
|
67
|
+
`Breakdown (${this.steps.length} steps):\n${breakdown}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Assert total tokens are above a minimum.
|
|
72
|
+
* Useful to verify the LLM was actually called.
|
|
73
|
+
*/
|
|
74
|
+
assertAbove(minTokens) {
|
|
75
|
+
if (this.total < minTokens) {
|
|
76
|
+
throw new Error(`Token usage too low: ${this.total} < ${minTokens}. Was the LLM actually called?`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Reset all tracking data */
|
|
80
|
+
reset() {
|
|
81
|
+
this.steps.length = 0;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Convenience: track all calls from a mock LLM provider.
|
|
85
|
+
* Uses call index as step name unless a nameResolver is provided.
|
|
86
|
+
*/
|
|
87
|
+
trackFromCalls(calls, nameResolver) {
|
|
88
|
+
calls.forEach((call, i) => {
|
|
89
|
+
const step = nameResolver ? nameResolver(i) : `call-${i}`;
|
|
90
|
+
this.track(step, call.response.usage);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=token-tracker.js.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Checker Module
|
|
3
|
+
*
|
|
4
|
+
* Provides TypeScript-level type compatibility checking using ts-morph and TypeScript's compiler API.
|
|
5
|
+
* This enables proper structural typing and subtype checking beyond simple string comparison.
|
|
6
|
+
*/
|
|
7
|
+
import type { Type, TypeChecker } from "ts-morph";
|
|
8
|
+
import type { TTypeCompatibility } from "./ast/types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Check if a source type can be safely coerced to a target type at runtime.
|
|
11
|
+
*
|
|
12
|
+
* @param sourceText - The source type as a string
|
|
13
|
+
* @param targetText - The target type as a string
|
|
14
|
+
* @returns true if the coercion is safe
|
|
15
|
+
*/
|
|
16
|
+
export declare function isRuntimeCoercible(sourceText: string, targetText: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Check type compatibility between two ts-morph Type objects.
|
|
19
|
+
*
|
|
20
|
+
* This uses TypeScript's actual type system for proper structural typing:
|
|
21
|
+
* - Structural typing (duck typing)
|
|
22
|
+
* - Inheritance (Admin extends User)
|
|
23
|
+
* - Generics (Array<T>, Promise<T>)
|
|
24
|
+
* - Union/Intersection types
|
|
25
|
+
* - Type narrowing
|
|
26
|
+
*
|
|
27
|
+
* @param sourceType - The source type (from output port)
|
|
28
|
+
* @param targetType - The target type (from input port)
|
|
29
|
+
* @param typeChecker - Optional ts-morph TypeChecker for advanced assignability checks
|
|
30
|
+
* @returns TTypeCompatibility result
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkTypeCompatibility(sourceType: Type, targetType: Type, typeChecker?: TypeChecker): TTypeCompatibility;
|
|
33
|
+
/**
|
|
34
|
+
* Check type compatibility using string representations.
|
|
35
|
+
* Fallback for JSON-loaded workflows without ts-morph Type objects.
|
|
36
|
+
*
|
|
37
|
+
* @param sourceText - The source type as a string
|
|
38
|
+
* @param targetText - The target type as a string
|
|
39
|
+
* @returns TTypeCompatibility result
|
|
40
|
+
*/
|
|
41
|
+
export declare function checkTypeCompatibilityFromStrings(sourceText: string, targetText: string): TTypeCompatibility;
|
|
42
|
+
//# sourceMappingURL=type-checker.d.ts.map
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Checker Module
|
|
3
|
+
*
|
|
4
|
+
* Provides TypeScript-level type compatibility checking using ts-morph and TypeScript's compiler API.
|
|
5
|
+
* This enables proper structural typing and subtype checking beyond simple string comparison.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Safe runtime coercions that JavaScript handles automatically.
|
|
9
|
+
* These are source -> target pairs where coercion is safe and predictable.
|
|
10
|
+
*/
|
|
11
|
+
const SAFE_COERCIONS = [
|
|
12
|
+
["number", "string"], // Number.toString()
|
|
13
|
+
["boolean", "string"], // Boolean.toString()
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Check if a source type can be safely coerced to a target type at runtime.
|
|
17
|
+
*
|
|
18
|
+
* @param sourceText - The source type as a string
|
|
19
|
+
* @param targetText - The target type as a string
|
|
20
|
+
* @returns true if the coercion is safe
|
|
21
|
+
*/
|
|
22
|
+
export function isRuntimeCoercible(sourceText, targetText) {
|
|
23
|
+
const sourceLower = sourceText.toLowerCase();
|
|
24
|
+
const targetLower = targetText.toLowerCase();
|
|
25
|
+
for (const [from, to] of SAFE_COERCIONS) {
|
|
26
|
+
if (sourceLower === from && targetLower === to) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check type compatibility between two ts-morph Type objects.
|
|
34
|
+
*
|
|
35
|
+
* This uses TypeScript's actual type system for proper structural typing:
|
|
36
|
+
* - Structural typing (duck typing)
|
|
37
|
+
* - Inheritance (Admin extends User)
|
|
38
|
+
* - Generics (Array<T>, Promise<T>)
|
|
39
|
+
* - Union/Intersection types
|
|
40
|
+
* - Type narrowing
|
|
41
|
+
*
|
|
42
|
+
* @param sourceType - The source type (from output port)
|
|
43
|
+
* @param targetType - The target type (from input port)
|
|
44
|
+
* @param typeChecker - Optional ts-morph TypeChecker for advanced assignability checks
|
|
45
|
+
* @returns TTypeCompatibility result
|
|
46
|
+
*/
|
|
47
|
+
export function checkTypeCompatibility(sourceType, targetType, typeChecker) {
|
|
48
|
+
const sourceText = sourceType.getText();
|
|
49
|
+
const targetText = targetType.getText();
|
|
50
|
+
// Exact string match - fastest path
|
|
51
|
+
if (sourceText === targetText) {
|
|
52
|
+
return {
|
|
53
|
+
isCompatible: true,
|
|
54
|
+
reason: "exact",
|
|
55
|
+
sourceType: sourceText,
|
|
56
|
+
targetType: targetText,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Try TypeScript's native assignability check if typeChecker is available
|
|
60
|
+
if (typeChecker) {
|
|
61
|
+
// Access the internal TypeScript compiler's type checker
|
|
62
|
+
const tsTypeChecker = typeChecker.compilerObject;
|
|
63
|
+
if (tsTypeChecker.isTypeAssignableTo) {
|
|
64
|
+
const isAssignable = tsTypeChecker.isTypeAssignableTo(sourceType.compilerType, targetType.compilerType);
|
|
65
|
+
if (isAssignable) {
|
|
66
|
+
return {
|
|
67
|
+
isCompatible: true,
|
|
68
|
+
reason: "assignable",
|
|
69
|
+
sourceType: sourceText,
|
|
70
|
+
targetType: targetText,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Fallback: Check inheritance via base types
|
|
76
|
+
if (isSubtypeViaBaseTypes(sourceType, targetType)) {
|
|
77
|
+
return {
|
|
78
|
+
isCompatible: true,
|
|
79
|
+
reason: "assignable",
|
|
80
|
+
sourceType: sourceText,
|
|
81
|
+
targetType: targetText,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Check for safe runtime coercions (NUMBER→STRING, BOOLEAN→STRING)
|
|
85
|
+
if (isRuntimeCoercible(sourceText, targetText)) {
|
|
86
|
+
return {
|
|
87
|
+
isCompatible: true,
|
|
88
|
+
reason: "coercible",
|
|
89
|
+
sourceType: sourceText,
|
|
90
|
+
targetType: targetText,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Types are incompatible
|
|
94
|
+
return {
|
|
95
|
+
isCompatible: false,
|
|
96
|
+
reason: "incompatible",
|
|
97
|
+
sourceType: sourceText,
|
|
98
|
+
targetType: targetText,
|
|
99
|
+
errorMessage: `Type '${sourceText}' is not assignable to type '${targetText}'`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if sourceType is a subtype of targetType via inheritance chain.
|
|
104
|
+
* Uses getBaseTypes() to traverse the type hierarchy.
|
|
105
|
+
*/
|
|
106
|
+
function isSubtypeViaBaseTypes(sourceType, targetType) {
|
|
107
|
+
const targetText = targetType.getText();
|
|
108
|
+
const visited = new Set();
|
|
109
|
+
function checkBaseTypes(type) {
|
|
110
|
+
const typeText = type.getText();
|
|
111
|
+
// Avoid infinite loops
|
|
112
|
+
if (visited.has(typeText))
|
|
113
|
+
return false;
|
|
114
|
+
visited.add(typeText);
|
|
115
|
+
// Check if this type matches target
|
|
116
|
+
if (typeText === targetText)
|
|
117
|
+
return true;
|
|
118
|
+
// Check base types recursively
|
|
119
|
+
try {
|
|
120
|
+
const baseTypes = type.getBaseTypes();
|
|
121
|
+
for (const baseType of baseTypes) {
|
|
122
|
+
if (checkBaseTypes(baseType))
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Some types don't have base types
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
// Check if source's base types include target
|
|
132
|
+
try {
|
|
133
|
+
const baseTypes = sourceType.getBaseTypes();
|
|
134
|
+
for (const baseType of baseTypes) {
|
|
135
|
+
if (checkBaseTypes(baseType))
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Some types don't have base types
|
|
141
|
+
}
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check type compatibility using string representations.
|
|
146
|
+
* Fallback for JSON-loaded workflows without ts-morph Type objects.
|
|
147
|
+
*
|
|
148
|
+
* @param sourceText - The source type as a string
|
|
149
|
+
* @param targetText - The target type as a string
|
|
150
|
+
* @returns TTypeCompatibility result
|
|
151
|
+
*/
|
|
152
|
+
export function checkTypeCompatibilityFromStrings(sourceText, targetText) {
|
|
153
|
+
// Exact string match
|
|
154
|
+
if (sourceText === targetText) {
|
|
155
|
+
return {
|
|
156
|
+
isCompatible: true,
|
|
157
|
+
reason: "exact",
|
|
158
|
+
sourceType: sourceText,
|
|
159
|
+
targetType: targetText,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// any is compatible with everything
|
|
163
|
+
if (sourceText === "any" || targetText === "any") {
|
|
164
|
+
return {
|
|
165
|
+
isCompatible: true,
|
|
166
|
+
reason: "assignable",
|
|
167
|
+
sourceType: sourceText,
|
|
168
|
+
targetType: targetText,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Check for safe runtime coercions
|
|
172
|
+
if (isRuntimeCoercible(sourceText, targetText)) {
|
|
173
|
+
return {
|
|
174
|
+
isCompatible: true,
|
|
175
|
+
reason: "coercible",
|
|
176
|
+
sourceType: sourceText,
|
|
177
|
+
targetType: targetText,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// String comparison can't determine structural compatibility
|
|
181
|
+
// Mark as incompatible, but the validator may want to be lenient
|
|
182
|
+
return {
|
|
183
|
+
isCompatible: false,
|
|
184
|
+
reason: "incompatible",
|
|
185
|
+
sourceType: sourceText,
|
|
186
|
+
targetType: targetText,
|
|
187
|
+
errorMessage: `Type '${sourceText}' is not assignable to type '${targetText}'`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=type-checker.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TDataType } from './ast/types.js';
|
|
2
|
+
export type TypeScriptType = 'string' | 'number' | 'boolean' | 'unknown' | 'unknown[]' | 'void' | 'Function' | 'Record<string, unknown>' | '(...args: unknown[]) => unknown';
|
|
3
|
+
export interface PortTypeMapping {
|
|
4
|
+
readonly typescript: TypeScriptType;
|
|
5
|
+
readonly description?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const PORT_TYPE_MAPPINGS: Record<TDataType, PortTypeMapping>;
|
|
8
|
+
export declare function mapToTypeScript(portType: TDataType, tsType?: string): TypeScriptType | string;
|
|
9
|
+
export declare function isValidPortType(type: string): type is TDataType;
|
|
10
|
+
export declare function getAllPortTypes(): ReadonlyArray<TDataType>;
|
|
11
|
+
export declare function getPortTypeDescription(portType: TDataType): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Infer TDataType from a TypeScript type string.
|
|
14
|
+
* This is the reverse mapping: TypeScript type → Flow Weaver semantic type.
|
|
15
|
+
*
|
|
16
|
+
* @param tsType - The TypeScript type string (e.g., "string", "number[]", "User")
|
|
17
|
+
* @returns The corresponding TDataType for color/category mapping
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* inferDataTypeFromTS("string") // → "STRING"
|
|
21
|
+
* inferDataTypeFromTS("number") // → "NUMBER"
|
|
22
|
+
* inferDataTypeFromTS("boolean") // → "BOOLEAN"
|
|
23
|
+
* inferDataTypeFromTS("User[]") // → "ARRAY"
|
|
24
|
+
* inferDataTypeFromTS("Array<number>") // → "ARRAY"
|
|
25
|
+
* inferDataTypeFromTS("Map<string, User>") // → "OBJECT"
|
|
26
|
+
* inferDataTypeFromTS("(x: number) => string") // → "FUNCTION"
|
|
27
|
+
*/
|
|
28
|
+
export declare function inferDataTypeFromTS(tsType: string): TDataType;
|
|
29
|
+
//# sourceMappingURL=type-mappings.d.ts.map
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export const PORT_TYPE_MAPPINGS = {
|
|
2
|
+
STRING: {
|
|
3
|
+
typescript: 'string',
|
|
4
|
+
description: 'Text value',
|
|
5
|
+
},
|
|
6
|
+
NUMBER: {
|
|
7
|
+
typescript: 'number',
|
|
8
|
+
description: 'Numeric value',
|
|
9
|
+
},
|
|
10
|
+
BOOLEAN: {
|
|
11
|
+
typescript: 'boolean',
|
|
12
|
+
description: 'True or false value',
|
|
13
|
+
},
|
|
14
|
+
ARRAY: {
|
|
15
|
+
typescript: 'unknown[]',
|
|
16
|
+
description: 'Array of values',
|
|
17
|
+
},
|
|
18
|
+
OBJECT: {
|
|
19
|
+
typescript: 'Record<string, unknown>',
|
|
20
|
+
description: 'Object with properties',
|
|
21
|
+
},
|
|
22
|
+
FUNCTION: {
|
|
23
|
+
typescript: '(...args: unknown[]) => unknown',
|
|
24
|
+
description: 'Function or callback',
|
|
25
|
+
},
|
|
26
|
+
ANY: {
|
|
27
|
+
typescript: 'unknown',
|
|
28
|
+
description: 'Any type of value',
|
|
29
|
+
},
|
|
30
|
+
STEP: {
|
|
31
|
+
typescript: 'boolean',
|
|
32
|
+
description: 'Control flow signal (boolean in public API)',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
export function mapToTypeScript(portType, tsType) {
|
|
36
|
+
const mapping = PORT_TYPE_MAPPINGS[portType];
|
|
37
|
+
if (!mapping) {
|
|
38
|
+
console.warn(`Unknown port type: ${portType}, defaulting to 'unknown'`);
|
|
39
|
+
return 'unknown';
|
|
40
|
+
}
|
|
41
|
+
// For non-primitive types, use tsType if provided
|
|
42
|
+
if (tsType &&
|
|
43
|
+
(portType === 'OBJECT' || portType === 'ANY' || portType === 'ARRAY' || portType === 'FUNCTION')) {
|
|
44
|
+
return tsType;
|
|
45
|
+
}
|
|
46
|
+
return mapping.typescript;
|
|
47
|
+
}
|
|
48
|
+
export function isValidPortType(type) {
|
|
49
|
+
return type in PORT_TYPE_MAPPINGS;
|
|
50
|
+
}
|
|
51
|
+
export function getAllPortTypes() {
|
|
52
|
+
return Object.keys(PORT_TYPE_MAPPINGS);
|
|
53
|
+
}
|
|
54
|
+
export function getPortTypeDescription(portType) {
|
|
55
|
+
return PORT_TYPE_MAPPINGS[portType]?.description;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Infer TDataType from a TypeScript type string.
|
|
59
|
+
* This is the reverse mapping: TypeScript type → Flow Weaver semantic type.
|
|
60
|
+
*
|
|
61
|
+
* @param tsType - The TypeScript type string (e.g., "string", "number[]", "User")
|
|
62
|
+
* @returns The corresponding TDataType for color/category mapping
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* inferDataTypeFromTS("string") // → "STRING"
|
|
66
|
+
* inferDataTypeFromTS("number") // → "NUMBER"
|
|
67
|
+
* inferDataTypeFromTS("boolean") // → "BOOLEAN"
|
|
68
|
+
* inferDataTypeFromTS("User[]") // → "ARRAY"
|
|
69
|
+
* inferDataTypeFromTS("Array<number>") // → "ARRAY"
|
|
70
|
+
* inferDataTypeFromTS("Map<string, User>") // → "OBJECT"
|
|
71
|
+
* inferDataTypeFromTS("(x: number) => string") // → "FUNCTION"
|
|
72
|
+
*/
|
|
73
|
+
export function inferDataTypeFromTS(tsType) {
|
|
74
|
+
const normalized = tsType.trim();
|
|
75
|
+
// Exact primitive matches
|
|
76
|
+
if (normalized === 'string')
|
|
77
|
+
return 'STRING';
|
|
78
|
+
if (normalized === 'number')
|
|
79
|
+
return 'NUMBER';
|
|
80
|
+
if (normalized === 'boolean')
|
|
81
|
+
return 'BOOLEAN';
|
|
82
|
+
// Any/unknown fallback
|
|
83
|
+
if (normalized === 'any' || normalized === 'unknown' || normalized === 'never') {
|
|
84
|
+
return 'ANY';
|
|
85
|
+
}
|
|
86
|
+
// Void (rare, but handle it)
|
|
87
|
+
if (normalized === 'void' || normalized === 'undefined' || normalized === 'null') {
|
|
88
|
+
return 'ANY';
|
|
89
|
+
}
|
|
90
|
+
// Array patterns: T[], Array<T>, ReadonlyArray<T>
|
|
91
|
+
if (normalized.endsWith('[]') ||
|
|
92
|
+
normalized.startsWith('Array<') ||
|
|
93
|
+
normalized.startsWith('ReadonlyArray<')) {
|
|
94
|
+
return 'ARRAY';
|
|
95
|
+
}
|
|
96
|
+
// Function patterns: () => T, (args) => T, Function
|
|
97
|
+
if (normalized.includes('=>') || normalized === 'Function' || normalized.startsWith('(')) {
|
|
98
|
+
return 'FUNCTION';
|
|
99
|
+
}
|
|
100
|
+
// Promise unwrapping: Promise<T> → infer from T
|
|
101
|
+
if (normalized.startsWith('Promise<') && normalized.endsWith('>')) {
|
|
102
|
+
const inner = normalized.slice(8, -1);
|
|
103
|
+
return inferDataTypeFromTS(inner);
|
|
104
|
+
}
|
|
105
|
+
// Union types: handle T | undefined and T | null as optional types
|
|
106
|
+
if (normalized.includes('|')) {
|
|
107
|
+
// Split by | and filter out undefined/null
|
|
108
|
+
const parts = normalized.split('|').map((p) => p.trim());
|
|
109
|
+
const nonNullParts = parts.filter((p) => p !== 'undefined' && p !== 'null');
|
|
110
|
+
if (nonNullParts.length === 1) {
|
|
111
|
+
// This is an optional type (T | undefined or T | null) - infer from T
|
|
112
|
+
return inferDataTypeFromTS(nonNullParts[0]);
|
|
113
|
+
}
|
|
114
|
+
// True union type - default to ANY
|
|
115
|
+
return 'ANY';
|
|
116
|
+
}
|
|
117
|
+
// Intersection types: if contains &, default to OBJECT
|
|
118
|
+
if (normalized.includes('&')) {
|
|
119
|
+
return 'OBJECT';
|
|
120
|
+
}
|
|
121
|
+
// Generic object types (Map, Set, Record, etc.) → OBJECT
|
|
122
|
+
// Any remaining complex type → OBJECT
|
|
123
|
+
return 'OBJECT';
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=type-mappings.js.map
|