@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,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow executor for MCP-side compilation and execution.
|
|
3
|
+
* Copies source to a temp file, compiles all workflows in-place, then dynamically imports and executes.
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
import ts from 'typescript';
|
|
9
|
+
import { compileWorkflow } from '../api/index.js';
|
|
10
|
+
import { getAvailableWorkflows } from '../api/workflow-file-operations.js';
|
|
11
|
+
/**
|
|
12
|
+
* Compiles and executes a workflow from a TypeScript source file.
|
|
13
|
+
* Copies the source to a temp file, compiles all workflows in-place (preserving sibling
|
|
14
|
+
* functions for workflow composition), injects a trace-capturing debugger, and dynamically
|
|
15
|
+
* imports and runs the target workflow function.
|
|
16
|
+
* @param filePath - Path to the workflow `.ts` source file.
|
|
17
|
+
* @param params - Parameters to pass to the workflow function.
|
|
18
|
+
* @param options - Execution options.
|
|
19
|
+
* @param options.workflowName - Name of a specific exported workflow function to execute.
|
|
20
|
+
* If omitted, the first exported function is used.
|
|
21
|
+
* @param options.production - Enable production mode (no debug events). Defaults to `!includeTrace`.
|
|
22
|
+
* @param options.includeTrace - Whether to capture and return execution trace events. Defaults to `true`.
|
|
23
|
+
* @returns The workflow result, function name, execution time, and optional trace.
|
|
24
|
+
* @throws If no exported workflow function is found in the compiled module.
|
|
25
|
+
*/
|
|
26
|
+
export async function executeWorkflowFromFile(filePath, params, options) {
|
|
27
|
+
const resolvedPath = path.resolve(filePath);
|
|
28
|
+
const includeTrace = options?.includeTrace !== false;
|
|
29
|
+
// Copy source to temp file and compile ALL workflows in-place there.
|
|
30
|
+
// In-place compilation preserves all functions in the module (node types,
|
|
31
|
+
// sibling workflows), which is required for workflow composition where one
|
|
32
|
+
// workflow calls another as a node type.
|
|
33
|
+
const tmpBase = path.join(os.tmpdir(), `fw-exec-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
34
|
+
const tmpTsFile = `${tmpBase}.ts`;
|
|
35
|
+
const tmpFile = `${tmpBase}.mjs`;
|
|
36
|
+
try {
|
|
37
|
+
fs.copyFileSync(resolvedPath, tmpTsFile);
|
|
38
|
+
// Discover all workflows in the file
|
|
39
|
+
const source = fs.readFileSync(resolvedPath, 'utf8');
|
|
40
|
+
const allWorkflows = getAvailableWorkflows(source);
|
|
41
|
+
// Compile each workflow in-place so all function bodies are generated
|
|
42
|
+
for (const wf of allWorkflows) {
|
|
43
|
+
await compileWorkflow(tmpTsFile, {
|
|
44
|
+
write: true,
|
|
45
|
+
inPlace: true,
|
|
46
|
+
parse: { workflowName: wf.functionName },
|
|
47
|
+
generate: { production: options?.production ?? !includeTrace },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Inject debugger binding: replace the TypeScript-only `declare const`
|
|
51
|
+
// with an actual assignment from globalThis so the executor can pass
|
|
52
|
+
// a trace-capturing debugger at runtime.
|
|
53
|
+
let compiledCode = fs.readFileSync(tmpTsFile, 'utf8');
|
|
54
|
+
compiledCode = compiledCode.replace('declare const __flowWeaverDebugger__: TDebugger | undefined;', 'const __flowWeaverDebugger__ = (globalThis as any).__fw_debugger__;');
|
|
55
|
+
// Transpile TypeScript to JavaScript so Node.js can import it directly
|
|
56
|
+
const jsOutput = ts.transpileModule(compiledCode, {
|
|
57
|
+
compilerOptions: {
|
|
58
|
+
module: ts.ModuleKind.ESNext,
|
|
59
|
+
target: ts.ScriptTarget.ESNext,
|
|
60
|
+
esModuleInterop: true,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
fs.writeFileSync(tmpFile, jsOutput.outputText, 'utf8');
|
|
64
|
+
// Create debugger to capture trace events
|
|
65
|
+
const trace = [];
|
|
66
|
+
const debugger_ = includeTrace
|
|
67
|
+
? {
|
|
68
|
+
sendEvent: (event) => {
|
|
69
|
+
trace.push({
|
|
70
|
+
type: event.type || 'UNKNOWN',
|
|
71
|
+
timestamp: Date.now(),
|
|
72
|
+
data: event,
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
innerFlowInvocation: false,
|
|
76
|
+
}
|
|
77
|
+
: undefined;
|
|
78
|
+
// Set global debugger before import so compiled code picks it up
|
|
79
|
+
globalThis.__fw_debugger__ = debugger_;
|
|
80
|
+
// Set mock config for built-in nodes (delay, waitForEvent, invokeWorkflow)
|
|
81
|
+
if (options?.mocks) {
|
|
82
|
+
globalThis.__fw_mocks__ = options.mocks;
|
|
83
|
+
}
|
|
84
|
+
// Dynamic import (tsx runtime supports .ts imports)
|
|
85
|
+
const mod = await import(tmpFile);
|
|
86
|
+
// Find the target exported function
|
|
87
|
+
const exportedFn = findExportedFunction(mod, options?.workflowName);
|
|
88
|
+
if (!exportedFn) {
|
|
89
|
+
throw new Error(`No exported workflow function found${options?.workflowName ? ` named "${options.workflowName}"` : ''}`);
|
|
90
|
+
}
|
|
91
|
+
const startTime = Date.now();
|
|
92
|
+
// Execute the workflow function: (execute, params, abortSignal?)
|
|
93
|
+
// In-place compiled functions use the module-level debugger, not a parameter.
|
|
94
|
+
const result = await exportedFn.fn(true, params ?? {});
|
|
95
|
+
const executionTime = Date.now() - startTime;
|
|
96
|
+
return {
|
|
97
|
+
result,
|
|
98
|
+
functionName: exportedFn.name,
|
|
99
|
+
executionTime,
|
|
100
|
+
...(includeTrace && { trace }),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
// Clean up globals
|
|
105
|
+
delete globalThis.__fw_debugger__;
|
|
106
|
+
delete globalThis.__fw_mocks__;
|
|
107
|
+
// Clean up temp files
|
|
108
|
+
try {
|
|
109
|
+
fs.unlinkSync(tmpFile);
|
|
110
|
+
}
|
|
111
|
+
catch { /* ignore */ }
|
|
112
|
+
try {
|
|
113
|
+
fs.unlinkSync(tmpTsFile);
|
|
114
|
+
}
|
|
115
|
+
catch { /* ignore */ }
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function findExportedFunction(mod, preferredName) {
|
|
119
|
+
// If a preferred name is specified, try it first
|
|
120
|
+
if (preferredName && typeof mod[preferredName] === 'function') {
|
|
121
|
+
return { name: preferredName, fn: mod[preferredName] };
|
|
122
|
+
}
|
|
123
|
+
// Find first exported function (skip default if it's not a function)
|
|
124
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
125
|
+
if (key === '__esModule')
|
|
126
|
+
continue;
|
|
127
|
+
if (typeof value === 'function') {
|
|
128
|
+
return { name: key, fn: value };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=workflow-executor.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge-Case Migration Registry
|
|
3
|
+
*
|
|
4
|
+
* The parse → generate round-trip handles ~95% of migrations automatically:
|
|
5
|
+
* the parser adds defaults for missing fields, and the generator writes
|
|
6
|
+
* current syntax. This registry is only for rare cases where that
|
|
7
|
+
* round-trip can't handle a change (e.g., semantic renames, removed features).
|
|
8
|
+
*
|
|
9
|
+
* Expected growth: ~1-2 entries per year.
|
|
10
|
+
*/
|
|
11
|
+
import type { TWorkflowAST } from '../ast/types.js';
|
|
12
|
+
export type MigrationFn = (ast: TWorkflowAST) => TWorkflowAST;
|
|
13
|
+
export interface Migration {
|
|
14
|
+
/** Short descriptive name (e.g., "rename-executeWhen-to-branchingStrategy") */
|
|
15
|
+
name: string;
|
|
16
|
+
/** The migration transform */
|
|
17
|
+
apply: MigrationFn;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Apply all registered edge-case migrations to a workflow AST.
|
|
21
|
+
* Called after parsing, before regeneration.
|
|
22
|
+
*/
|
|
23
|
+
export declare function applyMigrations(ast: TWorkflowAST): TWorkflowAST;
|
|
24
|
+
/**
|
|
25
|
+
* Get the list of registered migrations (for diagnostics/logging).
|
|
26
|
+
*/
|
|
27
|
+
export declare function getRegisteredMigrations(): ReadonlyArray<{
|
|
28
|
+
name: string;
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge-Case Migration Registry
|
|
3
|
+
*
|
|
4
|
+
* The parse → generate round-trip handles ~95% of migrations automatically:
|
|
5
|
+
* the parser adds defaults for missing fields, and the generator writes
|
|
6
|
+
* current syntax. This registry is only for rare cases where that
|
|
7
|
+
* round-trip can't handle a change (e.g., semantic renames, removed features).
|
|
8
|
+
*
|
|
9
|
+
* Expected growth: ~1-2 entries per year.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Registry of edge-case migrations. Starts empty.
|
|
13
|
+
* Add entries only when the parse→generate round-trip can't handle a change.
|
|
14
|
+
*/
|
|
15
|
+
const migrations = [];
|
|
16
|
+
/**
|
|
17
|
+
* Apply all registered edge-case migrations to a workflow AST.
|
|
18
|
+
* Called after parsing, before regeneration.
|
|
19
|
+
*/
|
|
20
|
+
export function applyMigrations(ast) {
|
|
21
|
+
return migrations.reduce((current, migration) => migration.apply(current), ast);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the list of registered migrations (for diagnostics/logging).
|
|
25
|
+
*/
|
|
26
|
+
export function getRegisteredMigrations() {
|
|
27
|
+
return migrations.map((m) => ({ name: m.name }));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { TNodeTypeAST } from "./ast/types.js";
|
|
2
|
+
export interface TNodeTypePort {
|
|
3
|
+
name: string;
|
|
4
|
+
defaultLabel: string;
|
|
5
|
+
reference: string;
|
|
6
|
+
type: string;
|
|
7
|
+
direction: "INPUT" | "OUTPUT";
|
|
8
|
+
defaultOrder: number;
|
|
9
|
+
defaultHidden?: boolean;
|
|
10
|
+
failure?: boolean;
|
|
11
|
+
defaultPlacement?: "TOP" | "BOTTOM" | "LEFT" | "RIGHT";
|
|
12
|
+
scope?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TPortConfig {
|
|
15
|
+
portName: string;
|
|
16
|
+
direction: "INPUT" | "OUTPUT";
|
|
17
|
+
order?: number;
|
|
18
|
+
label?: string;
|
|
19
|
+
expression?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TLocalFunctionNodeType {
|
|
22
|
+
name: string;
|
|
23
|
+
variant: "LOCAL_FUNCTION";
|
|
24
|
+
synchronicity: "SYNC" | "ASYNC" | "BOTH" | "UNKNOWN";
|
|
25
|
+
defaultLabel: string;
|
|
26
|
+
description: string;
|
|
27
|
+
category: string;
|
|
28
|
+
scopes: string[];
|
|
29
|
+
portConfigs: TPortConfig[];
|
|
30
|
+
ports: TNodeTypePort[];
|
|
31
|
+
defaultPullExecutionConfig?: {
|
|
32
|
+
method: string;
|
|
33
|
+
};
|
|
34
|
+
path: string;
|
|
35
|
+
projectPath: string;
|
|
36
|
+
function: string;
|
|
37
|
+
parameters: string[];
|
|
38
|
+
}
|
|
39
|
+
export declare class NodeTypesGenerator {
|
|
40
|
+
generateNodeType(node: TNodeTypeAST, filePath: string, projectPath: string): TLocalFunctionNodeType;
|
|
41
|
+
generateAllNodeTypes(nodes: TNodeTypeAST[], filePath: string, projectPath: string): TLocalFunctionNodeType[];
|
|
42
|
+
generateNodeTypesModule(nodes: TNodeTypeAST[], filePath: string, projectPath: string): string;
|
|
43
|
+
private formatLabel;
|
|
44
|
+
private extractDescription;
|
|
45
|
+
private extractParameters;
|
|
46
|
+
private determineSynchronicity;
|
|
47
|
+
}
|
|
48
|
+
export declare const nodeTypesGenerator: NodeTypesGenerator;
|
|
49
|
+
//# sourceMappingURL=node-types-generator.d.ts.map
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { RESERVED_PORT_NAMES, isExecutePort, isSuccessPort, isFailurePort, } from "./constants.js";
|
|
2
|
+
export class NodeTypesGenerator {
|
|
3
|
+
generateNodeType(node, filePath, projectPath) {
|
|
4
|
+
const ports = [];
|
|
5
|
+
let portOrder = 0;
|
|
6
|
+
ports.push({
|
|
7
|
+
name: RESERVED_PORT_NAMES.EXECUTE,
|
|
8
|
+
defaultLabel: "Execute",
|
|
9
|
+
reference: RESERVED_PORT_NAMES.EXECUTE,
|
|
10
|
+
type: "STEP",
|
|
11
|
+
direction: "INPUT",
|
|
12
|
+
defaultOrder: portOrder++,
|
|
13
|
+
});
|
|
14
|
+
ports.push({
|
|
15
|
+
name: RESERVED_PORT_NAMES.ON_SUCCESS,
|
|
16
|
+
defaultLabel: "On Success",
|
|
17
|
+
reference: RESERVED_PORT_NAMES.ON_SUCCESS,
|
|
18
|
+
type: "STEP",
|
|
19
|
+
direction: "OUTPUT",
|
|
20
|
+
defaultOrder: portOrder++,
|
|
21
|
+
});
|
|
22
|
+
ports.push({
|
|
23
|
+
name: RESERVED_PORT_NAMES.ON_FAILURE,
|
|
24
|
+
defaultLabel: "On Failure",
|
|
25
|
+
reference: RESERVED_PORT_NAMES.ON_FAILURE,
|
|
26
|
+
type: "STEP",
|
|
27
|
+
direction: "OUTPUT",
|
|
28
|
+
failure: true,
|
|
29
|
+
defaultPlacement: "BOTTOM",
|
|
30
|
+
defaultOrder: portOrder++,
|
|
31
|
+
});
|
|
32
|
+
Object.entries(node.inputs).forEach(([portName, portConfig]) => {
|
|
33
|
+
if (isExecutePort(portName))
|
|
34
|
+
return;
|
|
35
|
+
ports.push({
|
|
36
|
+
name: portName,
|
|
37
|
+
defaultLabel: portConfig.label || this.formatLabel(portName),
|
|
38
|
+
reference: portName,
|
|
39
|
+
type: portConfig.dataType,
|
|
40
|
+
direction: "INPUT",
|
|
41
|
+
defaultOrder: portOrder++,
|
|
42
|
+
defaultHidden: portConfig.hidden,
|
|
43
|
+
...(portConfig.scope && { scope: portConfig.scope }),
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
Object.entries(node.outputs).forEach(([portName, portConfig]) => {
|
|
47
|
+
if (isSuccessPort(portName) || isFailurePort(portName))
|
|
48
|
+
return;
|
|
49
|
+
ports.push({
|
|
50
|
+
name: portName,
|
|
51
|
+
defaultLabel: portConfig.label || this.formatLabel(portName),
|
|
52
|
+
reference: portName,
|
|
53
|
+
type: portConfig.dataType,
|
|
54
|
+
direction: "OUTPUT",
|
|
55
|
+
defaultOrder: portOrder++,
|
|
56
|
+
defaultHidden: portConfig.hidden,
|
|
57
|
+
...(portConfig.scope && { scope: portConfig.scope }),
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
const functionText = node.functionText || '';
|
|
61
|
+
const parameters = this.extractParameters(functionText);
|
|
62
|
+
const synchronicity = this.determineSynchronicity(functionText);
|
|
63
|
+
const label = node.label || this.formatLabel(node.functionName);
|
|
64
|
+
const description = node.description ||
|
|
65
|
+
this.extractDescription(functionText) ||
|
|
66
|
+
`Node: ${label}`;
|
|
67
|
+
const category = "Custom";
|
|
68
|
+
return {
|
|
69
|
+
name: node.functionName,
|
|
70
|
+
variant: "LOCAL_FUNCTION",
|
|
71
|
+
synchronicity,
|
|
72
|
+
defaultLabel: label,
|
|
73
|
+
description,
|
|
74
|
+
category,
|
|
75
|
+
scopes: node.scope ? [node.scope] : node.scopes || [],
|
|
76
|
+
portConfigs: [],
|
|
77
|
+
ports,
|
|
78
|
+
defaultPullExecutionConfig: {
|
|
79
|
+
method: RESERVED_PORT_NAMES.EXECUTE,
|
|
80
|
+
},
|
|
81
|
+
path: filePath,
|
|
82
|
+
projectPath,
|
|
83
|
+
function: node.functionName,
|
|
84
|
+
parameters,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
generateAllNodeTypes(nodes, filePath, projectPath) {
|
|
88
|
+
return nodes.map((node) => this.generateNodeType(node, filePath, projectPath));
|
|
89
|
+
}
|
|
90
|
+
generateNodeTypesModule(nodes, filePath, projectPath) {
|
|
91
|
+
const nodeTypes = this.generateAllNodeTypes(nodes, filePath, projectPath);
|
|
92
|
+
const lines = [];
|
|
93
|
+
lines.push("");
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("");
|
|
96
|
+
lines.push("import type { TLocalFunctionNodeType } from '@synergenius/flow-weaver';");
|
|
97
|
+
lines.push("");
|
|
98
|
+
lines.push("export const nodeTypes: TLocalFunctionNodeType[] = [");
|
|
99
|
+
nodeTypes.forEach((nodeType, idx) => {
|
|
100
|
+
lines.push(` ${JSON.stringify(nodeType, null, 2)}${idx < nodeTypes.length - 1 ? "," : ""}`);
|
|
101
|
+
});
|
|
102
|
+
lines.push("];");
|
|
103
|
+
lines.push("");
|
|
104
|
+
nodeTypes.forEach((nodeType) => {
|
|
105
|
+
lines.push(`export const ${nodeType.name}NodeType = nodeTypes.find(n => n.name === '${nodeType.name}')!;`);
|
|
106
|
+
});
|
|
107
|
+
return lines.join("\n");
|
|
108
|
+
}
|
|
109
|
+
formatLabel(name) {
|
|
110
|
+
return name
|
|
111
|
+
.replace(/([A-Z])/g, " $1")
|
|
112
|
+
.replace(/^./, (str) => str.toUpperCase())
|
|
113
|
+
.trim();
|
|
114
|
+
}
|
|
115
|
+
extractDescription(functionText) {
|
|
116
|
+
const match = functionText.match(/\/\*\*\s*\n\s*\*\s*(.+?)\s*\n/);
|
|
117
|
+
return match ? match[1] : null;
|
|
118
|
+
}
|
|
119
|
+
extractParameters(functionText) {
|
|
120
|
+
const match = functionText.match(/function\s+\w+\s*\(([^)]*)\)/);
|
|
121
|
+
if (!match || !match[1])
|
|
122
|
+
return [];
|
|
123
|
+
return match[1]
|
|
124
|
+
.split(",")
|
|
125
|
+
.map((param) => param.trim().split(":")[0].trim())
|
|
126
|
+
.filter((p) => p.length > 0);
|
|
127
|
+
}
|
|
128
|
+
determineSynchronicity(functionText) {
|
|
129
|
+
if (functionText.includes("async function")) {
|
|
130
|
+
return "ASYNC";
|
|
131
|
+
}
|
|
132
|
+
if (!functionText.includes("await") && !functionText.includes("Promise")) {
|
|
133
|
+
return "SYNC";
|
|
134
|
+
}
|
|
135
|
+
return "BOTH";
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export const nodeTypesGenerator = new NodeTypesGenerator();
|
|
139
|
+
//# sourceMappingURL=node-types-generator.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPM Package Type Resolution
|
|
3
|
+
*
|
|
4
|
+
* Functions for discovering and extracting type information from npm packages
|
|
5
|
+
* that have TypeScript declaration files (.d.ts).
|
|
6
|
+
*/
|
|
7
|
+
import type { TDataType } from './ast/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Port definition compatible with TNodeType.ports
|
|
10
|
+
*/
|
|
11
|
+
export type TNpmPackagePort = {
|
|
12
|
+
name: string;
|
|
13
|
+
defaultLabel?: string;
|
|
14
|
+
reference?: string;
|
|
15
|
+
type: TDataType;
|
|
16
|
+
direction: 'INPUT' | 'OUTPUT';
|
|
17
|
+
scope?: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Node type for npm package functions
|
|
21
|
+
*/
|
|
22
|
+
export type TNpmNodeType = {
|
|
23
|
+
name: string;
|
|
24
|
+
variant: 'FUNCTION';
|
|
25
|
+
category: string;
|
|
26
|
+
function: string;
|
|
27
|
+
label: string;
|
|
28
|
+
importSource: string;
|
|
29
|
+
ports: TNpmPackagePort[];
|
|
30
|
+
synchronicity: 'SYNC' | 'ASYNC';
|
|
31
|
+
description: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Get list of packages that have TypeScript declarations (.d.ts files).
|
|
35
|
+
* Excludes @types/* packages as they are type augmentations.
|
|
36
|
+
*
|
|
37
|
+
* @param workdir - Directory to start searching from
|
|
38
|
+
* @param nodeModulesOverride - Optional explicit node_modules path (for testing)
|
|
39
|
+
* @returns Object with packages array, each containing name and typesPath
|
|
40
|
+
*/
|
|
41
|
+
export declare function getTypedPackages(workdir: string, nodeModulesOverride?: string): {
|
|
42
|
+
packages: Array<{
|
|
43
|
+
name: string;
|
|
44
|
+
typesPath: string | null;
|
|
45
|
+
}>;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Get function exports from a package's .d.ts file and return as TNodeType[].
|
|
49
|
+
*
|
|
50
|
+
* @param packageName - The npm package name
|
|
51
|
+
* @param workdir - Directory to start searching from
|
|
52
|
+
* @param nodeModulesOverride - Optional explicit node_modules path (for testing)
|
|
53
|
+
* @returns Array of node types for the package's exported functions
|
|
54
|
+
*/
|
|
55
|
+
export declare function getPackageExports(packageName: string, workdir: string, nodeModulesOverride?: string): TNpmNodeType[];
|
|
56
|
+
//# sourceMappingURL=npm-packages.d.ts.map
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPM Package Type Resolution
|
|
3
|
+
*
|
|
4
|
+
* Functions for discovering and extracting type information from npm packages
|
|
5
|
+
* that have TypeScript declaration files (.d.ts).
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import { resolvePackageTypesPath } from './resolve-package-types.js';
|
|
10
|
+
import { extractFunctionLikes } from './function-like.js';
|
|
11
|
+
import { inferDataTypeFromTS } from './type-mappings.js';
|
|
12
|
+
import { getSharedProject } from './shared-project.js';
|
|
13
|
+
/**
|
|
14
|
+
* Find all node_modules directories starting from fromDir and walking up.
|
|
15
|
+
*/
|
|
16
|
+
function findNodeModulesDirs(fromDir) {
|
|
17
|
+
const dirs = [];
|
|
18
|
+
let current = path.resolve(fromDir);
|
|
19
|
+
const root = path.parse(current).root;
|
|
20
|
+
while (current !== root) {
|
|
21
|
+
const candidate = path.join(current, 'node_modules');
|
|
22
|
+
if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
|
|
23
|
+
dirs.push(candidate);
|
|
24
|
+
}
|
|
25
|
+
const parent = path.dirname(current);
|
|
26
|
+
if (parent === current)
|
|
27
|
+
break;
|
|
28
|
+
current = parent;
|
|
29
|
+
}
|
|
30
|
+
return dirs;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* List all packages in a node_modules directory (including scoped packages).
|
|
34
|
+
*/
|
|
35
|
+
function listPackagesInNodeModules(nmDir) {
|
|
36
|
+
const packages = [];
|
|
37
|
+
if (!fs.existsSync(nmDir))
|
|
38
|
+
return packages;
|
|
39
|
+
try {
|
|
40
|
+
const entries = fs.readdirSync(nmDir, { withFileTypes: true });
|
|
41
|
+
for (const entry of entries) {
|
|
42
|
+
if (!entry.isDirectory())
|
|
43
|
+
continue;
|
|
44
|
+
// Handle scoped packages (@scope/pkg)
|
|
45
|
+
if (entry.name.startsWith('@')) {
|
|
46
|
+
const scopeDir = path.join(nmDir, entry.name);
|
|
47
|
+
try {
|
|
48
|
+
const scopedEntries = fs.readdirSync(scopeDir, { withFileTypes: true });
|
|
49
|
+
for (const scopedEntry of scopedEntries) {
|
|
50
|
+
if (scopedEntry.isDirectory()) {
|
|
51
|
+
packages.push(`${entry.name}/${scopedEntry.name}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Ignore permission errors
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// Regular package
|
|
61
|
+
packages.push(entry.name);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Ignore permission errors
|
|
67
|
+
}
|
|
68
|
+
return packages;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get list of packages that have TypeScript declarations (.d.ts files).
|
|
72
|
+
* Excludes @types/* packages as they are type augmentations.
|
|
73
|
+
*
|
|
74
|
+
* @param workdir - Directory to start searching from
|
|
75
|
+
* @param nodeModulesOverride - Optional explicit node_modules path (for testing)
|
|
76
|
+
* @returns Object with packages array, each containing name and typesPath
|
|
77
|
+
*/
|
|
78
|
+
export function getTypedPackages(workdir, nodeModulesOverride) {
|
|
79
|
+
const nodeModulesDirs = nodeModulesOverride
|
|
80
|
+
? [nodeModulesOverride]
|
|
81
|
+
: findNodeModulesDirs(workdir);
|
|
82
|
+
const typed = [];
|
|
83
|
+
const seenPackages = new Set();
|
|
84
|
+
for (const nmDir of nodeModulesDirs) {
|
|
85
|
+
const packages = listPackagesInNodeModules(nmDir);
|
|
86
|
+
for (const pkg of packages) {
|
|
87
|
+
// Skip @types/* packages - they are type augmentations, not actual packages
|
|
88
|
+
if (pkg.startsWith('@types/'))
|
|
89
|
+
continue;
|
|
90
|
+
// Skip if already seen (from a closer node_modules)
|
|
91
|
+
if (seenPackages.has(pkg))
|
|
92
|
+
continue;
|
|
93
|
+
seenPackages.add(pkg);
|
|
94
|
+
// Check if package has types
|
|
95
|
+
const typesPath = resolvePackageTypesPath(pkg, workdir, nodeModulesOverride);
|
|
96
|
+
if (typesPath) {
|
|
97
|
+
typed.push({ name: pkg, typesPath });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { packages: typed };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Capitalize first letter of a string.
|
|
105
|
+
*/
|
|
106
|
+
function capitalize(str) {
|
|
107
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Infer node type from a function declaration in a .d.ts file.
|
|
111
|
+
*/
|
|
112
|
+
function inferNodeTypeFromDtsFunction(fn, packageName, _dtsPath) {
|
|
113
|
+
const fnName = fn.getName();
|
|
114
|
+
if (!fnName)
|
|
115
|
+
return null;
|
|
116
|
+
const ports = [];
|
|
117
|
+
// Add execute input port (mandatory)
|
|
118
|
+
ports.push({
|
|
119
|
+
name: 'execute',
|
|
120
|
+
defaultLabel: 'Execute',
|
|
121
|
+
reference: 'execute',
|
|
122
|
+
type: 'STEP',
|
|
123
|
+
direction: 'INPUT',
|
|
124
|
+
});
|
|
125
|
+
// Infer inputs from parameters
|
|
126
|
+
for (const param of fn.getParameters()) {
|
|
127
|
+
const paramName = param.getName();
|
|
128
|
+
const tsType = param.getType().getText(param);
|
|
129
|
+
const dataType = inferDataTypeFromTS(tsType);
|
|
130
|
+
ports.push({
|
|
131
|
+
name: paramName,
|
|
132
|
+
defaultLabel: capitalize(paramName),
|
|
133
|
+
reference: paramName,
|
|
134
|
+
type: dataType,
|
|
135
|
+
direction: 'INPUT',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Infer outputs from return type
|
|
139
|
+
let returnType = fn.getReturnType();
|
|
140
|
+
const returnTypeText = returnType.getText();
|
|
141
|
+
let isAsync = false;
|
|
142
|
+
// Unwrap Promise<T>
|
|
143
|
+
if (returnTypeText.startsWith('Promise<')) {
|
|
144
|
+
isAsync = true;
|
|
145
|
+
const typeArgs = returnType.getTypeArguments();
|
|
146
|
+
if (typeArgs && typeArgs.length > 0) {
|
|
147
|
+
returnType = typeArgs[0];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const unwrappedText = returnType.getText();
|
|
151
|
+
if (unwrappedText !== 'void' && unwrappedText !== 'undefined') {
|
|
152
|
+
const primitiveTypes = new Set(['string', 'number', 'boolean', 'any', 'unknown', 'never']);
|
|
153
|
+
const isPrimitive = primitiveTypes.has(unwrappedText);
|
|
154
|
+
const isArray = unwrappedText.endsWith('[]') || unwrappedText.startsWith('Array<');
|
|
155
|
+
const properties = returnType.getProperties();
|
|
156
|
+
const isObjectLike = !isPrimitive && !isArray && returnType.isObject() && properties.length > 0;
|
|
157
|
+
if (isObjectLike) {
|
|
158
|
+
// Multiple output ports from object properties
|
|
159
|
+
for (const prop of properties) {
|
|
160
|
+
const propName = prop.getName();
|
|
161
|
+
if (propName === 'onSuccess' || propName === 'onFailure')
|
|
162
|
+
continue;
|
|
163
|
+
const propType = prop.getTypeAtLocation(fn.getTypeResolutionNode());
|
|
164
|
+
const propTypeText = propType.getText();
|
|
165
|
+
const dataType = inferDataTypeFromTS(propTypeText);
|
|
166
|
+
ports.push({
|
|
167
|
+
name: propName,
|
|
168
|
+
defaultLabel: capitalize(propName),
|
|
169
|
+
reference: propName,
|
|
170
|
+
type: dataType,
|
|
171
|
+
direction: 'OUTPUT',
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Single result output port
|
|
177
|
+
const dataType = inferDataTypeFromTS(unwrappedText);
|
|
178
|
+
ports.push({
|
|
179
|
+
name: 'result',
|
|
180
|
+
defaultLabel: 'Result',
|
|
181
|
+
reference: 'result',
|
|
182
|
+
type: dataType,
|
|
183
|
+
direction: 'OUTPUT',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Add mandatory control flow output ports
|
|
188
|
+
ports.push({
|
|
189
|
+
name: 'onSuccess',
|
|
190
|
+
defaultLabel: 'On Success',
|
|
191
|
+
reference: 'onSuccess',
|
|
192
|
+
type: 'STEP',
|
|
193
|
+
direction: 'OUTPUT',
|
|
194
|
+
});
|
|
195
|
+
ports.push({
|
|
196
|
+
name: 'onFailure',
|
|
197
|
+
defaultLabel: 'On Failure',
|
|
198
|
+
reference: 'onFailure',
|
|
199
|
+
type: 'STEP',
|
|
200
|
+
direction: 'OUTPUT',
|
|
201
|
+
});
|
|
202
|
+
return {
|
|
203
|
+
name: `npm/${packageName}/${fnName}`,
|
|
204
|
+
variant: 'FUNCTION',
|
|
205
|
+
category: 'NPM Packages',
|
|
206
|
+
function: fnName,
|
|
207
|
+
label: fnName,
|
|
208
|
+
importSource: packageName,
|
|
209
|
+
ports,
|
|
210
|
+
synchronicity: isAsync ? 'ASYNC' : 'SYNC',
|
|
211
|
+
description: `${fnName} from ${packageName}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get function exports from a package's .d.ts file and return as TNodeType[].
|
|
216
|
+
*
|
|
217
|
+
* @param packageName - The npm package name
|
|
218
|
+
* @param workdir - Directory to start searching from
|
|
219
|
+
* @param nodeModulesOverride - Optional explicit node_modules path (for testing)
|
|
220
|
+
* @returns Array of node types for the package's exported functions
|
|
221
|
+
*/
|
|
222
|
+
export function getPackageExports(packageName, workdir, nodeModulesOverride) {
|
|
223
|
+
const typesPath = resolvePackageTypesPath(packageName, workdir, nodeModulesOverride);
|
|
224
|
+
if (!typesPath) {
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const project = getSharedProject();
|
|
229
|
+
const dtsContent = fs.readFileSync(typesPath, 'utf-8');
|
|
230
|
+
// Create source file with unique path to avoid conflicts
|
|
231
|
+
const virtualPath = `__npm_exports__/${packageName}/${Date.now()}.d.ts`;
|
|
232
|
+
const dtsFile = project.createSourceFile(virtualPath, dtsContent, { overwrite: true });
|
|
233
|
+
const functions = extractFunctionLikes(dtsFile);
|
|
234
|
+
const nodeTypes = [];
|
|
235
|
+
const seenFunctionNames = new Set();
|
|
236
|
+
for (const fn of functions) {
|
|
237
|
+
const fnName = fn.getName();
|
|
238
|
+
// Skip duplicates (can happen with re-exports or declaration merging)
|
|
239
|
+
if (!fnName || seenFunctionNames.has(fnName))
|
|
240
|
+
continue;
|
|
241
|
+
seenFunctionNames.add(fnName);
|
|
242
|
+
const nodeType = inferNodeTypeFromDtsFunction(fn, packageName, typesPath);
|
|
243
|
+
if (nodeType) {
|
|
244
|
+
nodeTypes.push(nodeType);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Clean up the temporary source file
|
|
248
|
+
project.removeSourceFile(dtsFile);
|
|
249
|
+
return nodeTypes;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return [];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=npm-packages.js.map
|