@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,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Approval Provider for deterministic human-approval workflow testing.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the mock LLM provider pattern — pattern matching on prompts,
|
|
5
|
+
* call recording, and configurable responses.
|
|
6
|
+
*
|
|
7
|
+
* Usage in vitest/jest tests:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockApprovalProvider } from 'flow-weaver/testing';
|
|
10
|
+
*
|
|
11
|
+
* const mockApproval = createMockApprovalProvider([
|
|
12
|
+
* { match: /expense/, response: { approved: true, reviewer: 'alice' } },
|
|
13
|
+
* { match: /delete/, response: { approved: false, response: 'Too risky' } },
|
|
14
|
+
* { match: /./, response: { approved: true } },
|
|
15
|
+
* ]);
|
|
16
|
+
*
|
|
17
|
+
* // Inject globally for compiled workflows
|
|
18
|
+
* (globalThis as unknown as { __fw_approval_provider__?: ApprovalProvider })
|
|
19
|
+
* .__fw_approval_provider__ = mockApproval;
|
|
20
|
+
*
|
|
21
|
+
* // After test
|
|
22
|
+
* expect(mockApproval.getCallCount()).toBe(2);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export interface ApprovalRequest {
|
|
26
|
+
id: string;
|
|
27
|
+
prompt: string;
|
|
28
|
+
context?: Record<string, unknown>;
|
|
29
|
+
timeout?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ApprovalResult {
|
|
32
|
+
approved: boolean;
|
|
33
|
+
response?: string;
|
|
34
|
+
reviewer?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ApprovalProvider {
|
|
37
|
+
requestApproval(request: ApprovalRequest): Promise<ApprovalResult>;
|
|
38
|
+
}
|
|
39
|
+
export interface MockApprovalResponse {
|
|
40
|
+
/** Pattern to match against the approval prompt. String = includes check, RegExp = test. */
|
|
41
|
+
match: string | RegExp;
|
|
42
|
+
/** The result to return when matched */
|
|
43
|
+
response: ApprovalResult;
|
|
44
|
+
/** Maximum number of times this response can be used (default: unlimited) */
|
|
45
|
+
maxUses?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface MockApprovalCall {
|
|
48
|
+
/** The approval request that was made */
|
|
49
|
+
request: ApprovalRequest;
|
|
50
|
+
/** Which response definition matched (-1 if fallback) */
|
|
51
|
+
matchedIndex: number;
|
|
52
|
+
/** The result that was returned */
|
|
53
|
+
result: ApprovalResult;
|
|
54
|
+
/** Timestamp of the call */
|
|
55
|
+
timestamp: number;
|
|
56
|
+
}
|
|
57
|
+
export interface MockApprovalProvider extends ApprovalProvider {
|
|
58
|
+
/** Get all recorded calls */
|
|
59
|
+
getCalls(): MockApprovalCall[];
|
|
60
|
+
/** Get total number of calls */
|
|
61
|
+
getCallCount(): number;
|
|
62
|
+
/** Reset call history and usage counters */
|
|
63
|
+
reset(): void;
|
|
64
|
+
/** Get calls that matched a specific response index */
|
|
65
|
+
getCallsForResponse(index: number): MockApprovalCall[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates a mock approval provider with deterministic response matching.
|
|
69
|
+
*
|
|
70
|
+
* Responses are matched in order against the approval request prompt.
|
|
71
|
+
* First match wins. If no response matches, a fallback result is returned.
|
|
72
|
+
*
|
|
73
|
+
* @param responses - Array of match/response pairs, checked in order
|
|
74
|
+
* @param options - Configuration options
|
|
75
|
+
* @returns A mock provider with call recording
|
|
76
|
+
*/
|
|
77
|
+
export declare function createMockApprovalProvider(responses?: MockApprovalResponse[], options?: {
|
|
78
|
+
/** Response to return when no match is found */
|
|
79
|
+
fallbackResponse?: ApprovalResult;
|
|
80
|
+
}): MockApprovalProvider;
|
|
81
|
+
//# sourceMappingURL=mock-approval.d.ts.map
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Approval Provider for deterministic human-approval workflow testing.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the mock LLM provider pattern — pattern matching on prompts,
|
|
5
|
+
* call recording, and configurable responses.
|
|
6
|
+
*
|
|
7
|
+
* Usage in vitest/jest tests:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockApprovalProvider } from 'flow-weaver/testing';
|
|
10
|
+
*
|
|
11
|
+
* const mockApproval = createMockApprovalProvider([
|
|
12
|
+
* { match: /expense/, response: { approved: true, reviewer: 'alice' } },
|
|
13
|
+
* { match: /delete/, response: { approved: false, response: 'Too risky' } },
|
|
14
|
+
* { match: /./, response: { approved: true } },
|
|
15
|
+
* ]);
|
|
16
|
+
*
|
|
17
|
+
* // Inject globally for compiled workflows
|
|
18
|
+
* (globalThis as unknown as { __fw_approval_provider__?: ApprovalProvider })
|
|
19
|
+
* .__fw_approval_provider__ = mockApproval;
|
|
20
|
+
*
|
|
21
|
+
* // After test
|
|
22
|
+
* expect(mockApproval.getCallCount()).toBe(2);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
const FALLBACK_RESULT = {
|
|
26
|
+
approved: false,
|
|
27
|
+
response: '[Mock: no matching approval response configured]',
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Creates a mock approval provider with deterministic response matching.
|
|
31
|
+
*
|
|
32
|
+
* Responses are matched in order against the approval request prompt.
|
|
33
|
+
* First match wins. If no response matches, a fallback result is returned.
|
|
34
|
+
*
|
|
35
|
+
* @param responses - Array of match/response pairs, checked in order
|
|
36
|
+
* @param options - Configuration options
|
|
37
|
+
* @returns A mock provider with call recording
|
|
38
|
+
*/
|
|
39
|
+
export function createMockApprovalProvider(responses = [], options) {
|
|
40
|
+
const calls = [];
|
|
41
|
+
const useCounts = new Map();
|
|
42
|
+
const fallback = options?.fallbackResponse ?? FALLBACK_RESULT;
|
|
43
|
+
function findMatch(prompt) {
|
|
44
|
+
for (let i = 0; i < responses.length; i++) {
|
|
45
|
+
const def = responses[i];
|
|
46
|
+
// Check max uses
|
|
47
|
+
if (def.maxUses !== undefined) {
|
|
48
|
+
const used = useCounts.get(i) ?? 0;
|
|
49
|
+
if (used >= def.maxUses)
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const matches = typeof def.match === 'string'
|
|
53
|
+
? prompt.includes(def.match)
|
|
54
|
+
: def.match.test(prompt);
|
|
55
|
+
if (matches) {
|
|
56
|
+
return { index: i, response: def };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
async requestApproval(request) {
|
|
63
|
+
const match = findMatch(request.prompt);
|
|
64
|
+
let result;
|
|
65
|
+
let matchedIndex;
|
|
66
|
+
if (match) {
|
|
67
|
+
matchedIndex = match.index;
|
|
68
|
+
useCounts.set(matchedIndex, (useCounts.get(matchedIndex) ?? 0) + 1);
|
|
69
|
+
result = { ...match.response.response };
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
matchedIndex = -1;
|
|
73
|
+
result = { ...fallback };
|
|
74
|
+
}
|
|
75
|
+
calls.push({
|
|
76
|
+
request: { ...request },
|
|
77
|
+
matchedIndex,
|
|
78
|
+
result,
|
|
79
|
+
timestamp: Date.now(),
|
|
80
|
+
});
|
|
81
|
+
return result;
|
|
82
|
+
},
|
|
83
|
+
getCalls() {
|
|
84
|
+
return [...calls];
|
|
85
|
+
},
|
|
86
|
+
getCallCount() {
|
|
87
|
+
return calls.length;
|
|
88
|
+
},
|
|
89
|
+
reset() {
|
|
90
|
+
calls.length = 0;
|
|
91
|
+
useCounts.clear();
|
|
92
|
+
},
|
|
93
|
+
getCallsForResponse(index) {
|
|
94
|
+
return calls.filter((c) => c.matchedIndex === index);
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=mock-approval.js.map
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock LLM Provider for deterministic agent workflow testing.
|
|
3
|
+
*
|
|
4
|
+
* Usage in vitest/jest tests:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { createMockLlmProvider } from 'flow-weaver/testing';
|
|
7
|
+
*
|
|
8
|
+
* const mockLlm = createMockLlmProvider([
|
|
9
|
+
* { match: /search/, response: { content: null, toolCalls: [{ id: '1', name: 'search', arguments: { q: 'test' } }], finishReason: 'tool_calls' } },
|
|
10
|
+
* { match: /./, response: { content: 'Default answer', toolCalls: [], finishReason: 'stop' } },
|
|
11
|
+
* ]);
|
|
12
|
+
*
|
|
13
|
+
* // Inject globally for compiled workflows
|
|
14
|
+
* (globalThis as unknown as { __fw_llm_provider__?: LLMProvider }).__fw_llm_provider__ = mockLlm;
|
|
15
|
+
*
|
|
16
|
+
* // After test
|
|
17
|
+
* expect(mockLlm.getCallCount()).toBe(2);
|
|
18
|
+
* expect(mockLlm.getTotalTokens()).toBe(150);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export interface LLMMessage {
|
|
22
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
23
|
+
content: string;
|
|
24
|
+
toolCallId?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface LLMToolCall {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
arguments: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface LLMResponse {
|
|
32
|
+
content: string | null;
|
|
33
|
+
toolCalls: LLMToolCall[];
|
|
34
|
+
finishReason: 'stop' | 'tool_calls' | 'length' | 'error';
|
|
35
|
+
usage?: LLMTokenUsage;
|
|
36
|
+
}
|
|
37
|
+
export interface LLMTokenUsage {
|
|
38
|
+
promptTokens: number;
|
|
39
|
+
completionTokens: number;
|
|
40
|
+
totalTokens: number;
|
|
41
|
+
}
|
|
42
|
+
export interface LLMTool {
|
|
43
|
+
name: string;
|
|
44
|
+
description: string;
|
|
45
|
+
parameters: {
|
|
46
|
+
type: 'object';
|
|
47
|
+
properties: Record<string, {
|
|
48
|
+
type: string;
|
|
49
|
+
}>;
|
|
50
|
+
required?: string[];
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export interface LLMProvider {
|
|
54
|
+
chat(messages: LLMMessage[], options?: {
|
|
55
|
+
tools?: LLMTool[];
|
|
56
|
+
systemPrompt?: string;
|
|
57
|
+
model?: string;
|
|
58
|
+
temperature?: number;
|
|
59
|
+
maxTokens?: number;
|
|
60
|
+
}): Promise<LLMResponse>;
|
|
61
|
+
}
|
|
62
|
+
export interface MockLlmResponse {
|
|
63
|
+
/** Pattern to match against the last user message content. String = includes check, RegExp = test. */
|
|
64
|
+
match: string | RegExp;
|
|
65
|
+
/** The response to return when matched */
|
|
66
|
+
response: {
|
|
67
|
+
content?: string | null;
|
|
68
|
+
toolCalls?: LLMToolCall[];
|
|
69
|
+
finishReason?: LLMResponse['finishReason'];
|
|
70
|
+
};
|
|
71
|
+
/** Simulated token usage for this response */
|
|
72
|
+
usage?: LLMTokenUsage;
|
|
73
|
+
/** Maximum number of times this response can be used (default: unlimited) */
|
|
74
|
+
maxUses?: number;
|
|
75
|
+
}
|
|
76
|
+
export interface MockLlmCall {
|
|
77
|
+
/** Messages sent to the provider */
|
|
78
|
+
messages: LLMMessage[];
|
|
79
|
+
/** Options passed to the provider */
|
|
80
|
+
options?: {
|
|
81
|
+
tools?: LLMTool[];
|
|
82
|
+
systemPrompt?: string;
|
|
83
|
+
model?: string;
|
|
84
|
+
temperature?: number;
|
|
85
|
+
maxTokens?: number;
|
|
86
|
+
};
|
|
87
|
+
/** Which response definition matched (-1 if fallback) */
|
|
88
|
+
matchedIndex: number;
|
|
89
|
+
/** The response that was returned */
|
|
90
|
+
response: LLMResponse;
|
|
91
|
+
/** Timestamp of the call */
|
|
92
|
+
timestamp: number;
|
|
93
|
+
}
|
|
94
|
+
export interface MockLlmProvider extends LLMProvider {
|
|
95
|
+
/** Get all recorded calls */
|
|
96
|
+
getCalls(): MockLlmCall[];
|
|
97
|
+
/** Get total number of calls */
|
|
98
|
+
getCallCount(): number;
|
|
99
|
+
/** Get total simulated tokens across all calls */
|
|
100
|
+
getTotalTokens(): number;
|
|
101
|
+
/** Get token usage breakdown per call */
|
|
102
|
+
getTokenUsage(): LLMTokenUsage[];
|
|
103
|
+
/** Reset call history and usage counters */
|
|
104
|
+
reset(): void;
|
|
105
|
+
/** Get calls that matched a specific response index */
|
|
106
|
+
getCallsForResponse(index: number): MockLlmCall[];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Creates a mock LLM provider with deterministic response matching.
|
|
110
|
+
*
|
|
111
|
+
* Responses are matched in order against the last user message content.
|
|
112
|
+
* First match wins. If no response matches, a fallback response is returned.
|
|
113
|
+
*
|
|
114
|
+
* @param responses - Array of match/response pairs, checked in order
|
|
115
|
+
* @param options - Configuration options
|
|
116
|
+
* @returns A mock provider with call recording and token tracking
|
|
117
|
+
*/
|
|
118
|
+
export declare function createMockLlmProvider(responses?: MockLlmResponse[], options?: {
|
|
119
|
+
/** Default token usage when a response doesn't specify usage */
|
|
120
|
+
defaultUsage?: LLMTokenUsage;
|
|
121
|
+
/** Response to return when no match is found (default: generic mock message) */
|
|
122
|
+
fallbackResponse?: Partial<LLMResponse>;
|
|
123
|
+
}): MockLlmProvider;
|
|
124
|
+
//# sourceMappingURL=mock-llm.d.ts.map
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock LLM Provider for deterministic agent workflow testing.
|
|
3
|
+
*
|
|
4
|
+
* Usage in vitest/jest tests:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { createMockLlmProvider } from 'flow-weaver/testing';
|
|
7
|
+
*
|
|
8
|
+
* const mockLlm = createMockLlmProvider([
|
|
9
|
+
* { match: /search/, response: { content: null, toolCalls: [{ id: '1', name: 'search', arguments: { q: 'test' } }], finishReason: 'tool_calls' } },
|
|
10
|
+
* { match: /./, response: { content: 'Default answer', toolCalls: [], finishReason: 'stop' } },
|
|
11
|
+
* ]);
|
|
12
|
+
*
|
|
13
|
+
* // Inject globally for compiled workflows
|
|
14
|
+
* (globalThis as unknown as { __fw_llm_provider__?: LLMProvider }).__fw_llm_provider__ = mockLlm;
|
|
15
|
+
*
|
|
16
|
+
* // After test
|
|
17
|
+
* expect(mockLlm.getCallCount()).toBe(2);
|
|
18
|
+
* expect(mockLlm.getTotalTokens()).toBe(150);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_USAGE = {
|
|
22
|
+
promptTokens: 50,
|
|
23
|
+
completionTokens: 25,
|
|
24
|
+
totalTokens: 75,
|
|
25
|
+
};
|
|
26
|
+
const FALLBACK_RESPONSE = {
|
|
27
|
+
content: '[Mock: no matching response configured]',
|
|
28
|
+
toolCalls: [],
|
|
29
|
+
finishReason: 'stop',
|
|
30
|
+
usage: DEFAULT_USAGE,
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Creates a mock LLM provider with deterministic response matching.
|
|
34
|
+
*
|
|
35
|
+
* Responses are matched in order against the last user message content.
|
|
36
|
+
* First match wins. If no response matches, a fallback response is returned.
|
|
37
|
+
*
|
|
38
|
+
* @param responses - Array of match/response pairs, checked in order
|
|
39
|
+
* @param options - Configuration options
|
|
40
|
+
* @returns A mock provider with call recording and token tracking
|
|
41
|
+
*/
|
|
42
|
+
export function createMockLlmProvider(responses = [], options) {
|
|
43
|
+
const calls = [];
|
|
44
|
+
const useCounts = new Map();
|
|
45
|
+
const defaultUsage = options?.defaultUsage ?? DEFAULT_USAGE;
|
|
46
|
+
const fallback = {
|
|
47
|
+
...FALLBACK_RESPONSE,
|
|
48
|
+
...(options?.fallbackResponse ?? {}),
|
|
49
|
+
usage: options?.fallbackResponse?.usage ?? defaultUsage,
|
|
50
|
+
};
|
|
51
|
+
function findMatch(lastMessage) {
|
|
52
|
+
for (let i = 0; i < responses.length; i++) {
|
|
53
|
+
const def = responses[i];
|
|
54
|
+
// Check max uses
|
|
55
|
+
if (def.maxUses !== undefined) {
|
|
56
|
+
const used = useCounts.get(i) ?? 0;
|
|
57
|
+
if (used >= def.maxUses)
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const matches = typeof def.match === 'string'
|
|
61
|
+
? lastMessage.includes(def.match)
|
|
62
|
+
: def.match.test(lastMessage);
|
|
63
|
+
if (matches) {
|
|
64
|
+
return { index: i, response: def };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
async chat(messages, chatOptions) {
|
|
71
|
+
const lastUserMessage = [...messages].reverse().find((m) => m.role === 'user')?.content ?? '';
|
|
72
|
+
const match = findMatch(lastUserMessage);
|
|
73
|
+
let response;
|
|
74
|
+
let matchedIndex;
|
|
75
|
+
if (match) {
|
|
76
|
+
matchedIndex = match.index;
|
|
77
|
+
useCounts.set(matchedIndex, (useCounts.get(matchedIndex) ?? 0) + 1);
|
|
78
|
+
response = {
|
|
79
|
+
content: match.response.response.content ?? null,
|
|
80
|
+
toolCalls: match.response.response.toolCalls ?? [],
|
|
81
|
+
finishReason: match.response.response.finishReason ?? 'stop',
|
|
82
|
+
usage: match.response.usage ?? defaultUsage,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
matchedIndex = -1;
|
|
87
|
+
response = { ...fallback };
|
|
88
|
+
}
|
|
89
|
+
calls.push({
|
|
90
|
+
messages: [...messages],
|
|
91
|
+
options: chatOptions,
|
|
92
|
+
matchedIndex,
|
|
93
|
+
response,
|
|
94
|
+
timestamp: Date.now(),
|
|
95
|
+
});
|
|
96
|
+
return response;
|
|
97
|
+
},
|
|
98
|
+
getCalls() {
|
|
99
|
+
return [...calls];
|
|
100
|
+
},
|
|
101
|
+
getCallCount() {
|
|
102
|
+
return calls.length;
|
|
103
|
+
},
|
|
104
|
+
getTotalTokens() {
|
|
105
|
+
return calls.reduce((sum, call) => sum + (call.response.usage?.totalTokens ?? 0), 0);
|
|
106
|
+
},
|
|
107
|
+
getTokenUsage() {
|
|
108
|
+
return calls.map((call) => call.response.usage ?? defaultUsage);
|
|
109
|
+
},
|
|
110
|
+
reset() {
|
|
111
|
+
calls.length = 0;
|
|
112
|
+
useCounts.clear();
|
|
113
|
+
},
|
|
114
|
+
getCallsForResponse(index) {
|
|
115
|
+
return calls.filter((c) => c.matchedIndex === index);
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=mock-llm.js.map
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recording LLM Provider — wraps a real provider and records all interactions.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { createRecordingProvider } from 'flow-weaver/testing';
|
|
7
|
+
*
|
|
8
|
+
* const recorder = createRecordingProvider(realLlmProvider);
|
|
9
|
+
*
|
|
10
|
+
* // Use recorder.provider as the LLM provider in your workflow
|
|
11
|
+
* (globalThis as unknown as { __fw_llm_provider__?: LLMProvider }).__fw_llm_provider__ = recorder.provider;
|
|
12
|
+
*
|
|
13
|
+
* // Run workflow...
|
|
14
|
+
*
|
|
15
|
+
* // Get the recording for later replay
|
|
16
|
+
* const recording = recorder.getRecording();
|
|
17
|
+
* const json = JSON.stringify(recording, null, 2);
|
|
18
|
+
* // Save to disk, fixture file, etc.
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import type { LLMMessage, LLMProvider, LLMResponse, LLMTool } from './mock-llm.js';
|
|
22
|
+
export interface LlmRecordingStep {
|
|
23
|
+
/** Sequential index of this call */
|
|
24
|
+
index: number;
|
|
25
|
+
/** Input sent to the LLM */
|
|
26
|
+
input: {
|
|
27
|
+
messages: LLMMessage[];
|
|
28
|
+
options?: {
|
|
29
|
+
tools?: LLMTool[];
|
|
30
|
+
systemPrompt?: string;
|
|
31
|
+
model?: string;
|
|
32
|
+
temperature?: number;
|
|
33
|
+
maxTokens?: number;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
/** Response from the LLM */
|
|
37
|
+
output: LLMResponse;
|
|
38
|
+
/** ISO timestamp when the call started */
|
|
39
|
+
timestamp: string;
|
|
40
|
+
/** Wall-clock duration in milliseconds */
|
|
41
|
+
durationMs: number;
|
|
42
|
+
}
|
|
43
|
+
export interface LlmRecording {
|
|
44
|
+
/** Recorded LLM interactions in order */
|
|
45
|
+
steps: LlmRecordingStep[];
|
|
46
|
+
/** Optional metadata (test name, workflow name, etc.) */
|
|
47
|
+
metadata: Record<string, unknown>;
|
|
48
|
+
/** ISO timestamp when recording started */
|
|
49
|
+
createdAt: string;
|
|
50
|
+
}
|
|
51
|
+
export interface RecordingLlmProvider {
|
|
52
|
+
/** The wrapped provider — use this as your LLMProvider */
|
|
53
|
+
provider: LLMProvider;
|
|
54
|
+
/** Get the current recording */
|
|
55
|
+
getRecording(): LlmRecording;
|
|
56
|
+
/** Get the number of recorded calls */
|
|
57
|
+
getCallCount(): number;
|
|
58
|
+
/** Clear all recorded data */
|
|
59
|
+
reset(): void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Creates a recording LLM provider that wraps a real provider.
|
|
63
|
+
*
|
|
64
|
+
* Every call to `chat()` is passed through to the real provider,
|
|
65
|
+
* and the input/output/timing is recorded for later replay.
|
|
66
|
+
*
|
|
67
|
+
* @param realProvider - The real LLM provider to wrap
|
|
68
|
+
* @param metadata - Optional metadata to include in the recording
|
|
69
|
+
* @returns A recording provider with access to the recorded data
|
|
70
|
+
*/
|
|
71
|
+
export declare function createRecordingProvider(realProvider: LLMProvider, metadata?: Record<string, unknown>): RecordingLlmProvider;
|
|
72
|
+
//# sourceMappingURL=recorder.d.ts.map
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recording LLM Provider — wraps a real provider and records all interactions.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { createRecordingProvider } from 'flow-weaver/testing';
|
|
7
|
+
*
|
|
8
|
+
* const recorder = createRecordingProvider(realLlmProvider);
|
|
9
|
+
*
|
|
10
|
+
* // Use recorder.provider as the LLM provider in your workflow
|
|
11
|
+
* (globalThis as unknown as { __fw_llm_provider__?: LLMProvider }).__fw_llm_provider__ = recorder.provider;
|
|
12
|
+
*
|
|
13
|
+
* // Run workflow...
|
|
14
|
+
*
|
|
15
|
+
* // Get the recording for later replay
|
|
16
|
+
* const recording = recorder.getRecording();
|
|
17
|
+
* const json = JSON.stringify(recording, null, 2);
|
|
18
|
+
* // Save to disk, fixture file, etc.
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Creates a recording LLM provider that wraps a real provider.
|
|
23
|
+
*
|
|
24
|
+
* Every call to `chat()` is passed through to the real provider,
|
|
25
|
+
* and the input/output/timing is recorded for later replay.
|
|
26
|
+
*
|
|
27
|
+
* @param realProvider - The real LLM provider to wrap
|
|
28
|
+
* @param metadata - Optional metadata to include in the recording
|
|
29
|
+
* @returns A recording provider with access to the recorded data
|
|
30
|
+
*/
|
|
31
|
+
export function createRecordingProvider(realProvider, metadata) {
|
|
32
|
+
const steps = [];
|
|
33
|
+
const createdAt = new Date().toISOString();
|
|
34
|
+
const provider = {
|
|
35
|
+
async chat(messages, options) {
|
|
36
|
+
const startTime = Date.now();
|
|
37
|
+
const timestamp = new Date(startTime).toISOString();
|
|
38
|
+
const response = await realProvider.chat(messages, options);
|
|
39
|
+
const durationMs = Date.now() - startTime;
|
|
40
|
+
steps.push({
|
|
41
|
+
index: steps.length,
|
|
42
|
+
input: {
|
|
43
|
+
messages: [...messages],
|
|
44
|
+
...(options ? { options: { ...options } } : {}),
|
|
45
|
+
},
|
|
46
|
+
output: { ...response },
|
|
47
|
+
timestamp,
|
|
48
|
+
durationMs,
|
|
49
|
+
});
|
|
50
|
+
return response;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
provider,
|
|
55
|
+
getRecording() {
|
|
56
|
+
return {
|
|
57
|
+
steps: steps.map((s) => ({ ...s })),
|
|
58
|
+
metadata: { ...(metadata ?? {}) },
|
|
59
|
+
createdAt,
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
getCallCount() {
|
|
63
|
+
return steps.length;
|
|
64
|
+
},
|
|
65
|
+
reset() {
|
|
66
|
+
steps.length = 0;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=recorder.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
import type { LLMTokenUsage, MockLlmProvider } from './mock-llm.js';
|
|
21
|
+
import type { LlmRecording } from './recorder.js';
|
|
22
|
+
export interface ReplayOptions {
|
|
23
|
+
/**
|
|
24
|
+
* In strict mode, throws an error if more calls are made than were recorded.
|
|
25
|
+
* Default: true
|
|
26
|
+
*/
|
|
27
|
+
strict?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Default token usage when a recorded step has no usage data.
|
|
30
|
+
* Default: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }
|
|
31
|
+
*/
|
|
32
|
+
defaultUsage?: LLMTokenUsage;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a MockLlmProvider that replays recorded LLM interactions in order.
|
|
36
|
+
*
|
|
37
|
+
* Each `chat()` call returns the next recorded response sequentially.
|
|
38
|
+
* The returned provider implements the full MockLlmProvider interface,
|
|
39
|
+
* so all existing assertion helpers and TokenTracker work out of the box.
|
|
40
|
+
*
|
|
41
|
+
* @param recording - The recording to replay (from createRecordingProvider or loadRecording)
|
|
42
|
+
* @param options - Replay configuration
|
|
43
|
+
* @returns A MockLlmProvider that replays recorded responses
|
|
44
|
+
*/
|
|
45
|
+
export declare function createReplayProvider(recording: LlmRecording, options?: ReplayOptions): MockLlmProvider;
|
|
46
|
+
/**
|
|
47
|
+
* Parse a recording from JSON data.
|
|
48
|
+
*
|
|
49
|
+
* Accepts either a parsed object or a JSON string.
|
|
50
|
+
* Validates the structure and returns a typed LlmRecording.
|
|
51
|
+
*
|
|
52
|
+
* @param data - JSON string or parsed object
|
|
53
|
+
* @returns A validated LlmRecording
|
|
54
|
+
*/
|
|
55
|
+
export declare function loadRecording(data: string | LlmRecording): LlmRecording;
|
|
56
|
+
//# sourceMappingURL=replayer.d.ts.map
|