@ai-setting/roy-agent-core 1.0.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/dist/index.js +99145 -0
- package/package.json +114 -0
- package/src/config/config-component.test.ts +627 -0
- package/src/config/config-component.ts +906 -0
- package/src/config/config-parser.test.ts +319 -0
- package/src/config/config-parser.ts +203 -0
- package/src/config/decentralized-config.test.ts +740 -0
- package/src/config/env-key.ts +210 -0
- package/src/config/env-source.test.ts +252 -0
- package/src/config/env-source.ts +301 -0
- package/src/config/file-source.test.ts +357 -0
- package/src/config/file-source.ts +421 -0
- package/src/config/index.ts +24 -0
- package/src/config/protocol-resolver.test.ts +217 -0
- package/src/config/protocol-resolver.ts +228 -0
- package/src/env/agent/agent-component.abort.test.ts +511 -0
- package/src/env/agent/agent-component.record-session.test.ts +349 -0
- package/src/env/agent/agent-component.test.ts +1389 -0
- package/src/env/agent/agent-component.tool-error.test.ts +327 -0
- package/src/env/agent/agent-component.ts +1711 -0
- package/src/env/agent/agent-config-registration.test.ts +226 -0
- package/src/env/agent/agent-config-registration.ts +46 -0
- package/src/env/agent/agent-reminder-plugin.integration.test.ts +243 -0
- package/src/env/agent/index.ts +10 -0
- package/src/env/agent/summary-agent.parse-hint.test.ts +360 -0
- package/src/env/agent/summary-agent.ts +508 -0
- package/src/env/agent/types.ts +536 -0
- package/src/env/commands/commands-component.test.ts +364 -0
- package/src/env/commands/commands-component.ts +604 -0
- package/src/env/commands/commands-config-registration.test.ts +198 -0
- package/src/env/commands/commands-config-registration.ts +38 -0
- package/src/env/commands/index.ts +21 -0
- package/src/env/commands/parser.test.ts +203 -0
- package/src/env/commands/parser.ts +115 -0
- package/src/env/commands/types.ts +184 -0
- package/src/env/commands-prompt-integration.test.ts +243 -0
- package/src/env/component-env.test.ts +119 -0
- package/src/env/component.ts +335 -0
- package/src/env/constants.test.ts +72 -0
- package/src/env/constants.ts +123 -0
- package/src/env/debug/debug-component.test.ts +114 -0
- package/src/env/debug/debug-component.ts +547 -0
- package/src/env/debug/formatters/index.ts +9 -0
- package/src/env/debug/formatters/repl-formatter.test.ts +139 -0
- package/src/env/debug/formatters/repl-formatter.ts +358 -0
- package/src/env/debug/formatters/trace-formatter.test.ts +119 -0
- package/src/env/debug/formatters/trace-formatter.ts +191 -0
- package/src/env/debug/formatters/tree-formatter.test.ts +107 -0
- package/src/env/debug/formatters/tree-formatter.ts +325 -0
- package/src/env/debug/index.ts +38 -0
- package/src/env/debug/parser/regex-parser.test.ts +201 -0
- package/src/env/debug/parser/regex-parser.ts +196 -0
- package/src/env/debug/parser/span-builder.test.ts +241 -0
- package/src/env/debug/parser/span-builder.ts +386 -0
- package/src/env/debug/reader/log-reader.test.ts +170 -0
- package/src/env/debug/reader/log-reader.ts +186 -0
- package/src/env/debug/reader/span-db-reader.test.ts +118 -0
- package/src/env/debug/reader/span-db-reader.ts +201 -0
- package/src/env/debug/types.test.ts +187 -0
- package/src/env/debug/types.ts +171 -0
- package/src/env/environment-init.test.ts +183 -0
- package/src/env/environment-lifecycle.test.ts +516 -0
- package/src/env/environment-service.test.ts +332 -0
- package/src/env/environment.handle-query.test.ts +96 -0
- package/src/env/environment.test.ts +232 -0
- package/src/env/environment.ts +708 -0
- package/src/env/errors.test.ts +165 -0
- package/src/env/errors.ts +157 -0
- package/src/env/event-source/event-source-agent-handler.test.ts +193 -0
- package/src/env/event-source/event-source-agent-handler.ts +111 -0
- package/src/env/event-source/event-source-component.process-cleanup.test.ts +236 -0
- package/src/env/event-source/event-source-component.stop.test.ts +346 -0
- package/src/env/event-source/event-source-component.test.ts +1207 -0
- package/src/env/event-source/event-source-component.ts +1379 -0
- package/src/env/event-source/event-source-config-registration.test.ts +242 -0
- package/src/env/event-source/event-source-config-registration.ts +37 -0
- package/src/env/event-source/event-source-integration.test.ts +320 -0
- package/src/env/event-source/event-source-platform.test.ts +630 -0
- package/src/env/event-source/types.ts +298 -0
- package/src/env/hook/global-hook-manager.ts +162 -0
- package/src/env/hook/hook-manager.test.ts +374 -0
- package/src/env/hook/hook-manager.ts +309 -0
- package/src/env/hook/index.ts +38 -0
- package/src/env/hook/types.ts +138 -0
- package/src/env/index.ts +144 -0
- package/src/env/interface.ts +203 -0
- package/src/env/llm/hooks.test.ts +293 -0
- package/src/env/llm/hooks.ts +316 -0
- package/src/env/llm/index.ts +61 -0
- package/src/env/llm/invoke-threshold-check.test.ts +88 -0
- package/src/env/llm/invoke-timeout.test.ts +54 -0
- package/src/env/llm/invoke.test.ts +71 -0
- package/src/env/llm/invoke.ts +1039 -0
- package/src/env/llm/llm-config.test.ts +523 -0
- package/src/env/llm/llm.test.ts +233 -0
- package/src/env/llm/llm.ts +568 -0
- package/src/env/llm/provider.test.ts +182 -0
- package/src/env/llm/provider.ts +108 -0
- package/src/env/llm/transform.test.ts +251 -0
- package/src/env/llm/transform.ts +286 -0
- package/src/env/llm/types.test.ts +580 -0
- package/src/env/llm/types.ts +424 -0
- package/src/env/log-trace/decorator-otel.test.ts +182 -0
- package/src/env/log-trace/decorator.ts +230 -0
- package/src/env/log-trace/index.ts +79 -0
- package/src/env/log-trace/log-trace-component.test.ts +242 -0
- package/src/env/log-trace/log-trace-component.ts +497 -0
- package/src/env/log-trace/log-trace-config-registration.test.ts +348 -0
- package/src/env/log-trace/log-trace-config-registration.ts +45 -0
- package/src/env/log-trace/logger.test.ts +149 -0
- package/src/env/log-trace/logger.ts +522 -0
- package/src/env/log-trace/opentelemetry/cli-propagation.test.ts +147 -0
- package/src/env/log-trace/opentelemetry/cli-propagation.ts +194 -0
- package/src/env/log-trace/opentelemetry/integration.test.ts +668 -0
- package/src/env/log-trace/opentelemetry/mod.ts +25 -0
- package/src/env/log-trace/opentelemetry/propagation-env.test.ts +181 -0
- package/src/env/log-trace/opentelemetry/propagation-env.ts +136 -0
- package/src/env/log-trace/opentelemetry/propagation.test.ts +259 -0
- package/src/env/log-trace/opentelemetry/propagation.ts +215 -0
- package/src/env/log-trace/opentelemetry/tracer-provider-context.test.ts +166 -0
- package/src/env/log-trace/opentelemetry/tracer-provider.test.ts +379 -0
- package/src/env/log-trace/opentelemetry/tracer-provider.ts +612 -0
- package/src/env/log-trace/span-storage.test.ts +145 -0
- package/src/env/log-trace/span-storage.ts +230 -0
- package/src/env/log-trace/trace-context.test.ts +187 -0
- package/src/env/log-trace/trace-context.ts +162 -0
- package/src/env/log-trace/types.test.ts +63 -0
- package/src/env/log-trace/types.ts +172 -0
- package/src/env/mcp/README.md +244 -0
- package/src/env/mcp/__integration__/mcp-component.integration.test.ts +373 -0
- package/src/env/mcp/config.test.ts +74 -0
- package/src/env/mcp/config.ts +116 -0
- package/src/env/mcp/index.ts +41 -0
- package/src/env/mcp/loader.test.ts +161 -0
- package/src/env/mcp/loader.ts +209 -0
- package/src/env/mcp/mcp-component.test.ts +111 -0
- package/src/env/mcp/mcp-component.ts +358 -0
- package/src/env/mcp/mcp-config-registration.test.ts +304 -0
- package/src/env/mcp/mcp-config-registration.ts +50 -0
- package/src/env/mcp/scanner.test.ts +170 -0
- package/src/env/mcp/scanner.ts +246 -0
- package/src/env/mcp/tool/adapter.test.ts +520 -0
- package/src/env/mcp/tool/adapter.ts +521 -0
- package/src/env/mcp/tool/index.ts +5 -0
- package/src/env/mcp/types.test.ts +171 -0
- package/src/env/mcp/types.ts +79 -0
- package/src/env/memory/README.md +177 -0
- package/src/env/memory/built-in/index.ts +59 -0
- package/src/env/memory/built-in/recall-memory.ts +103 -0
- package/src/env/memory/built-in/record-memory.ts +148 -0
- package/src/env/memory/index.ts +20 -0
- package/src/env/memory/memory-component.test.ts +239 -0
- package/src/env/memory/memory-component.ts +503 -0
- package/src/env/memory/memory-config-registration.test.ts +67 -0
- package/src/env/memory/memory-config-registration.ts +48 -0
- package/src/env/memory/memory-config.ts +45 -0
- package/src/env/memory/memory-file.test.ts +268 -0
- package/src/env/memory/plugin/index.ts +48 -0
- package/src/env/memory/plugin/memory-agent.test.ts +249 -0
- package/src/env/memory/plugin/memory-agent.ts +365 -0
- package/src/env/memory/plugin/memory-manager.ts +198 -0
- package/src/env/memory/plugin/memory-plugin-agent.test.ts +145 -0
- package/src/env/memory/plugin/memory-plugin.ts +210 -0
- package/src/env/memory/plugin/plugin-simplified.test.ts +51 -0
- package/src/env/memory/plugin/recall-memory.test.ts +106 -0
- package/src/env/memory/plugin/recall-memory.ts +53 -0
- package/src/env/memory/plugin/types.ts +101 -0
- package/src/env/memory/tools/memory-agent-tools.ts +228 -0
- package/src/env/memory/types.ts +85 -0
- package/src/env/paths.ts +118 -0
- package/src/env/prompt/index.ts +18 -0
- package/src/env/prompt/memory-prompts.test.ts +91 -0
- package/src/env/prompt/prompt-component.test.ts +491 -0
- package/src/env/prompt/prompt-component.ts +619 -0
- package/src/env/prompt/prompt-config-registration.test.ts +213 -0
- package/src/env/prompt/prompt-config-registration.ts +39 -0
- package/src/env/prompt/prompts-index.ts +504 -0
- package/src/env/prompt/renderer.ts +67 -0
- package/src/env/prompt/types.ts +136 -0
- package/src/env/session/hooks.ts +18 -0
- package/src/env/session/index.ts +37 -0
- package/src/env/session/search-query-parser.test.ts +425 -0
- package/src/env/session/search-query-parser.ts +171 -0
- package/src/env/session/session-checkpoint.test.ts +523 -0
- package/src/env/session/session-component.extract-recent-messages.test.ts +209 -0
- package/src/env/session/session-component.test.ts +132 -0
- package/src/env/session/session-component.ts +1249 -0
- package/src/env/session/session-config-registration.test.ts +138 -0
- package/src/env/session/session-config-registration.ts +52 -0
- package/src/env/session/session-message-converter.test.ts +763 -0
- package/src/env/session/session-message-converter.ts +415 -0
- package/src/env/session/session-message-e2e.test.ts +448 -0
- package/src/env/session/session-search.test.ts +391 -0
- package/src/env/session/session-store.test.ts +362 -0
- package/src/env/session/session-store.ts +141 -0
- package/src/env/session/storage/index.ts +6 -0
- package/src/env/session/storage/memory.ts +502 -0
- package/src/env/session/storage/sqlite.ts +794 -0
- package/src/env/session/types.ts +742 -0
- package/src/env/skill/config.ts +39 -0
- package/src/env/skill/index.ts +6 -0
- package/src/env/skill/parser.test.ts +116 -0
- package/src/env/skill/parser.ts +77 -0
- package/src/env/skill/scanner.test.ts +211 -0
- package/src/env/skill/scanner.ts +119 -0
- package/src/env/skill/skill-component.test.ts +234 -0
- package/src/env/skill/skill-component.ts +352 -0
- package/src/env/skill/skill-config-registration.test.ts +60 -0
- package/src/env/skill/skill-config-registration.ts +43 -0
- package/src/env/skill/tool/index.ts +1 -0
- package/src/env/skill/tool/skill-tool.test.ts +100 -0
- package/src/env/skill/tool/skill-tool.ts +72 -0
- package/src/env/skill/types.ts +64 -0
- package/src/env/task/delegate/delegate-tool.test.ts +498 -0
- package/src/env/task/delegate/delegate-tool.ts +1014 -0
- package/src/env/task/delegate/index.ts +18 -0
- package/src/env/task/delegate/stop-tool.test.ts +140 -0
- package/src/env/task/delegate/stop-tool.ts +119 -0
- package/src/env/task/delegate/task-events.test.ts +178 -0
- package/src/env/task/delegate/task-events.ts +143 -0
- package/src/env/task/hooks/contexts.test.ts +92 -0
- package/src/env/task/hooks/contexts.ts +192 -0
- package/src/env/task/hooks/index.ts +23 -0
- package/src/env/task/hooks/task-hook-points.test.ts +32 -0
- package/src/env/task/hooks/task-hook-points.ts +54 -0
- package/src/env/task/index.ts +7 -0
- package/src/env/task/plugins/index.ts +13 -0
- package/src/env/task/plugins/task-plugin.test.ts +74 -0
- package/src/env/task/plugins/task-plugin.ts +89 -0
- package/src/env/task/plugins/task-tag-plugin.test.ts +377 -0
- package/src/env/task/plugins/task-tag-plugin.ts +319 -0
- package/src/env/task/plugins/task-workflow-extractor.integration.test.ts +226 -0
- package/src/env/task/plugins/workflow-extractor-agent.test.ts +107 -0
- package/src/env/task/plugins/workflow-extractor-agent.ts +225 -0
- package/src/env/task/storage/index.ts +6 -0
- package/src/env/task/storage/sqlite-task-store.test.ts +283 -0
- package/src/env/task/storage/sqlite-task-store.ts +903 -0
- package/src/env/task/storage/task-search.test.ts +291 -0
- package/src/env/task/tag-service.test.ts +198 -0
- package/src/env/task/tag-service.ts +264 -0
- package/src/env/task/task-component.test.ts +193 -0
- package/src/env/task/task-component.ts +658 -0
- package/src/env/task/task-config-registration.test.ts +57 -0
- package/src/env/task/task-config-registration.ts +37 -0
- package/src/env/task/task-types.test.ts +137 -0
- package/src/env/task/tools/complete-tool.ts +44 -0
- package/src/env/task/tools/create-tool.ts +49 -0
- package/src/env/task/tools/delete-tool.ts +43 -0
- package/src/env/task/tools/get-tool.ts +59 -0
- package/src/env/task/tools/index.ts +10 -0
- package/src/env/task/tools/list-tool.ts +40 -0
- package/src/env/task/tools/operation/create-tool.ts +48 -0
- package/src/env/task/tools/operation/delete-tool.ts +43 -0
- package/src/env/task/tools/operation/get-tool.ts +43 -0
- package/src/env/task/tools/operation/index.ts +9 -0
- package/src/env/task/tools/operation/list-tool.ts +40 -0
- package/src/env/task/tools/operation/operation-tools.test.ts +274 -0
- package/src/env/task/tools/operation/operation-types.ts +75 -0
- package/src/env/task/tools/operation/update-tool.ts +47 -0
- package/src/env/task/tools/task-tools.test.ts +203 -0
- package/src/env/task/tools/task-types.test.ts +75 -0
- package/src/env/task/tools/task-types.ts +68 -0
- package/src/env/task/tools/update-tool.ts +70 -0
- package/src/env/task/types.ts +160 -0
- package/src/env/tool/built-in/bash.ts +201 -0
- package/src/env/tool/built-in/echo.ts +29 -0
- package/src/env/tool/built-in/edit-file.test.ts +136 -0
- package/src/env/tool/built-in/edit-file.ts +92 -0
- package/src/env/tool/built-in/glob.test.ts +94 -0
- package/src/env/tool/built-in/glob.ts +65 -0
- package/src/env/tool/built-in/grep.test.ts +122 -0
- package/src/env/tool/built-in/grep.ts +108 -0
- package/src/env/tool/built-in/index.ts +44 -0
- package/src/env/tool/built-in/read-file.test.ts +84 -0
- package/src/env/tool/built-in/read-file.ts +75 -0
- package/src/env/tool/built-in/write-file.test.ts +119 -0
- package/src/env/tool/built-in/write-file.ts +68 -0
- package/src/env/tool/index.ts +24 -0
- package/src/env/tool/registry.test.ts +257 -0
- package/src/env/tool/registry.ts +167 -0
- package/src/env/tool/tool-component.test.ts +559 -0
- package/src/env/tool/tool-component.ts +563 -0
- package/src/env/tool/tool-config-registration.test.ts +249 -0
- package/src/env/tool/tool-config-registration.ts +46 -0
- package/src/env/tool/types.ts +267 -0
- package/src/env/tool/validator.test.ts +143 -0
- package/src/env/tool/validator.ts +44 -0
- package/src/env/types.ts +180 -0
- package/src/env/workflow/ask-user-tool-registration.test.ts +216 -0
- package/src/env/workflow/complex-workflow.integration.test.ts +1900 -0
- package/src/env/workflow/decorators/decorator-node.ts +229 -0
- package/src/env/workflow/decorators/decorator.test.ts +196 -0
- package/src/env/workflow/decorators/edge.ts +82 -0
- package/src/env/workflow/decorators/index.ts +31 -0
- package/src/env/workflow/decorators/node-as.ts +98 -0
- package/src/env/workflow/decorators/workflow.ts +54 -0
- package/src/env/workflow/engine/dag-manager.test.ts +570 -0
- package/src/env/workflow/engine/dag-manager.ts +594 -0
- package/src/env/workflow/engine/engine.ts +1422 -0
- package/src/env/workflow/engine/event-bus.test.ts +359 -0
- package/src/env/workflow/engine/event-bus.ts +156 -0
- package/src/env/workflow/engine/executor-agent-session.test.ts +84 -0
- package/src/env/workflow/engine/executor.test.ts +619 -0
- package/src/env/workflow/engine/executor.ts +593 -0
- package/src/env/workflow/engine/index.ts +24 -0
- package/src/env/workflow/engine/node-registry.test.ts +560 -0
- package/src/env/workflow/engine/node-registry.ts +289 -0
- package/src/env/workflow/engine/resume-removed.test.ts +22 -0
- package/src/env/workflow/engine/scheduler.test.ts +715 -0
- package/src/env/workflow/engine/scheduler.ts +318 -0
- package/src/env/workflow/engine/workflow-engine.test.ts +815 -0
- package/src/env/workflow/extractor/workflow-converter.ts +306 -0
- package/src/env/workflow/fixtures.ts +380 -0
- package/src/env/workflow/index.ts +38 -0
- package/src/env/workflow/integration/run-resume-unified.test.ts +186 -0
- package/src/env/workflow/integration/service-integration.test.ts +267 -0
- package/src/env/workflow/metadata/keys.ts +12 -0
- package/src/env/workflow/nodes/agent-component-adapter.test.ts +318 -0
- package/src/env/workflow/nodes/agent-component-adapter.ts +448 -0
- package/src/env/workflow/nodes/agent-node.test.ts +371 -0
- package/src/env/workflow/nodes/agent-node.ts +598 -0
- package/src/env/workflow/nodes/ask-user-node.ts +113 -0
- package/src/env/workflow/nodes/condition-node.ts +200 -0
- package/src/env/workflow/nodes/index.ts +9 -0
- package/src/env/workflow/nodes/merge-node.ts +141 -0
- package/src/env/workflow/nodes/skill-node.test.ts +253 -0
- package/src/env/workflow/nodes/skill-node.ts +393 -0
- package/src/env/workflow/nodes/tool-node.test.ts +251 -0
- package/src/env/workflow/nodes/tool-node.ts +493 -0
- package/src/env/workflow/nodes/workflow-llm-history.test.ts +455 -0
- package/src/env/workflow/nodes/workflow-node.test.ts +315 -0
- package/src/env/workflow/nodes/workflow-node.ts +311 -0
- package/src/env/workflow/service/index.ts +27 -0
- package/src/env/workflow/service/registry.test.ts +133 -0
- package/src/env/workflow/service/registry.ts +71 -0
- package/src/env/workflow/service/workflow-service.test.ts +310 -0
- package/src/env/workflow/service/workflow-service.ts +393 -0
- package/src/env/workflow/storage/index.ts +28 -0
- package/src/env/workflow/storage/mock-repositories.ts +385 -0
- package/src/env/workflow/storage/sqlite.test.ts +179 -0
- package/src/env/workflow/storage/sqlite.ts +163 -0
- package/src/env/workflow/storage/workflow-repo.test.ts +780 -0
- package/src/env/workflow/storage/workflow-repo.ts +342 -0
- package/src/env/workflow/tools/ask-user-tool.ts +82 -0
- package/src/env/workflow/tools/index.ts +26 -0
- package/src/env/workflow/tools/run-workflow.test.ts +352 -0
- package/src/env/workflow/tools/run-workflow.ts +214 -0
- package/src/env/workflow/types/context.ts +18 -0
- package/src/env/workflow/types/decorators-types.ts +198 -0
- package/src/env/workflow/types/event.test.ts +515 -0
- package/src/env/workflow/types/event.ts +193 -0
- package/src/env/workflow/types/index.ts +49 -0
- package/src/env/workflow/types/run.test.ts +437 -0
- package/src/env/workflow/types/run.ts +173 -0
- package/src/env/workflow/types/workflow-hil.ts +114 -0
- package/src/env/workflow/types/workflow-message.test.ts +138 -0
- package/src/env/workflow/types/workflow-message.ts +196 -0
- package/src/env/workflow/types/workflow-session.test.ts +95 -0
- package/src/env/workflow/types/workflow-session.ts +59 -0
- package/src/env/workflow/types/workflow.test.ts +495 -0
- package/src/env/workflow/types/workflow.ts +195 -0
- package/src/env/workflow/types_compat.ts +51 -0
- package/src/env/workflow/utils/create-workflow.ts +47 -0
- package/src/env/workflow/utils/execution-state.ts +245 -0
- package/src/env/workflow/utils/index.ts +18 -0
- package/src/env/workflow/utils/node-registry-helper.ts +58 -0
- package/src/env/workflow/utils/recovery-validator.test.ts +460 -0
- package/src/env/workflow/utils/recovery-validator.ts +377 -0
- package/src/env/workflow/utils/session-parser.test.ts +111 -0
- package/src/env/workflow/utils/session-parser.ts +94 -0
- package/src/env/workflow/utils/session-recovery.test.ts +334 -0
- package/src/env/workflow/utils/session-recovery.ts +188 -0
- package/src/env/workflow/utils/template-resolver.test.ts +258 -0
- package/src/env/workflow/utils/template-resolver.ts +436 -0
- package/src/env/workflow/utils/validation-rules.ts +149 -0
- package/src/env/workflow/workflow-component.ts +544 -0
- package/src/index.ts +422 -0
- package/src/utils/id.ts +21 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Workflow Tool Tests - Phase 7
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "bun:test";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { createRunWorkflowTool, resetRunWorkflowTool } from "./run-workflow";
|
|
8
|
+
import type { WorkflowService } from "../service/workflow-service";
|
|
9
|
+
import type { ToolContext } from "../../../env/tool/types";
|
|
10
|
+
|
|
11
|
+
// Mock logger
|
|
12
|
+
vi.mock("../../../env/log-trace/logger", () => ({
|
|
13
|
+
createLogger: () => ({
|
|
14
|
+
info: vi.fn(),
|
|
15
|
+
warn: vi.fn(),
|
|
16
|
+
error: vi.fn(),
|
|
17
|
+
debug: vi.fn(),
|
|
18
|
+
}),
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
describe("RunWorkflowTool", () => {
|
|
22
|
+
let mockWorkflowService: Partial<WorkflowService>;
|
|
23
|
+
let tool: ReturnType<typeof createRunWorkflowTool>;
|
|
24
|
+
let mockContext: ToolContext;
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
// Reset state
|
|
28
|
+
resetRunWorkflowTool();
|
|
29
|
+
|
|
30
|
+
// Create mock WorkflowService
|
|
31
|
+
mockWorkflowService = {
|
|
32
|
+
runWorkflow: vi.fn(),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// Create the tool
|
|
36
|
+
tool = createRunWorkflowTool(mockWorkflowService as WorkflowService);
|
|
37
|
+
|
|
38
|
+
// Create mock context
|
|
39
|
+
mockContext = {
|
|
40
|
+
workdir: "/tmp",
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
vi.clearAllMocks();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("Tool Definition", () => {
|
|
49
|
+
it("should have correct name", () => {
|
|
50
|
+
expect(tool.name).toBe("run-workflow");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("should have correct description", () => {
|
|
54
|
+
expect(tool.description).toBe(
|
|
55
|
+
"Run a workflow by name with optional input. Returns run_id, status, output, error, and duration_ms."
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("should have correct category in metadata", () => {
|
|
60
|
+
expect(tool.metadata?.category).toBe("workflow");
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should have workflow tags", () => {
|
|
64
|
+
expect(tool.metadata?.tags).toEqual(["workflow", "execute", "run"]);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("should have sandbox disabled", () => {
|
|
68
|
+
expect(tool.sandbox?.enabled).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("should have safe permission level", () => {
|
|
72
|
+
expect(tool.permission?.level).toBe("safe");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe("Parameter Schema", () => {
|
|
77
|
+
it("should handle missing workflow_name gracefully", async () => {
|
|
78
|
+
// When called directly (without ToolComponent validation),
|
|
79
|
+
// the tool should handle missing required params
|
|
80
|
+
const result = await tool.execute({}, mockContext);
|
|
81
|
+
// The tool receives undefined as workflow_name and fails when trying to use it
|
|
82
|
+
expect(result.success).toBe(false);
|
|
83
|
+
expect(result.error).toContain("Failed to run workflow");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should accept valid workflow_name", async () => {
|
|
87
|
+
// Mock the service to avoid actual execution
|
|
88
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
89
|
+
runId: "run-123",
|
|
90
|
+
status: "completed",
|
|
91
|
+
output: { result: "success" },
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const result = await tool.execute(
|
|
95
|
+
{ workflow_name: "test-workflow" },
|
|
96
|
+
mockContext
|
|
97
|
+
);
|
|
98
|
+
expect(result.success).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("should accept optional input parameter", async () => {
|
|
102
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
103
|
+
runId: "run-123",
|
|
104
|
+
status: "completed",
|
|
105
|
+
output: { result: "success" },
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const result = await tool.execute(
|
|
109
|
+
{ workflow_name: "test-workflow", input: { key: "value" } },
|
|
110
|
+
mockContext
|
|
111
|
+
);
|
|
112
|
+
expect(result.success).toBe(true);
|
|
113
|
+
expect(mockWorkflowService.runWorkflow).toHaveBeenCalledWith(
|
|
114
|
+
"test-workflow",
|
|
115
|
+
{ key: "value" },
|
|
116
|
+
{ sync: true }
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("should accept sync parameter", async () => {
|
|
121
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
122
|
+
runId: "run-123",
|
|
123
|
+
status: "completed",
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
await tool.execute(
|
|
127
|
+
{ workflow_name: "test-workflow", sync: false },
|
|
128
|
+
mockContext
|
|
129
|
+
);
|
|
130
|
+
expect(mockWorkflowService.runWorkflow).toHaveBeenCalledWith(
|
|
131
|
+
"test-workflow",
|
|
132
|
+
undefined,
|
|
133
|
+
{ sync: false }
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("should accept timeout parameter", async () => {
|
|
138
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
139
|
+
runId: "run-123",
|
|
140
|
+
status: "completed",
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
await tool.execute(
|
|
144
|
+
{ workflow_name: "test-workflow", timeout: 5000 },
|
|
145
|
+
mockContext
|
|
146
|
+
);
|
|
147
|
+
expect(mockWorkflowService.runWorkflow).toHaveBeenCalledWith(
|
|
148
|
+
"test-workflow",
|
|
149
|
+
undefined,
|
|
150
|
+
{ sync: true }
|
|
151
|
+
);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe("Sync Execution", () => {
|
|
156
|
+
it("should return completed status for successful sync execution", async () => {
|
|
157
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
158
|
+
runId: "run-123",
|
|
159
|
+
status: "completed",
|
|
160
|
+
output: { result: "success" },
|
|
161
|
+
durationMs: 100,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
const result = await tool.execute(
|
|
165
|
+
{ workflow_name: "test-workflow", sync: true },
|
|
166
|
+
mockContext
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
expect(result.success).toBe(true);
|
|
170
|
+
expect(result.output).toEqual({
|
|
171
|
+
run_id: "run-123",
|
|
172
|
+
status: "completed",
|
|
173
|
+
output: { result: "success" },
|
|
174
|
+
error: undefined,
|
|
175
|
+
duration_ms: 100,
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("should return failed status for failed sync execution", async () => {
|
|
180
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
181
|
+
runId: "run-123",
|
|
182
|
+
status: "failed",
|
|
183
|
+
error: "Something went wrong",
|
|
184
|
+
durationMs: 50,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const result = await tool.execute(
|
|
188
|
+
{ workflow_name: "test-workflow", sync: true },
|
|
189
|
+
mockContext
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
expect(result.success).toBe(false);
|
|
193
|
+
expect(result.output).toEqual({
|
|
194
|
+
run_id: "run-123",
|
|
195
|
+
status: "failed",
|
|
196
|
+
output: undefined,
|
|
197
|
+
error: "Something went wrong",
|
|
198
|
+
duration_ms: 50,
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it("should include execution_time_ms in metadata", async () => {
|
|
203
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
204
|
+
runId: "run-123",
|
|
205
|
+
status: "completed",
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
const result = await tool.execute(
|
|
209
|
+
{ workflow_name: "test-workflow" },
|
|
210
|
+
mockContext
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
expect(result.metadata?.execution_time_ms).toBeDefined();
|
|
214
|
+
expect(typeof result.metadata?.execution_time_ms).toBe("number");
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
describe("Async Execution", () => {
|
|
219
|
+
it("should return immediately with run_id for async execution", async () => {
|
|
220
|
+
(mockWorkflowService.runWorkflow as any).mockResolvedValue({
|
|
221
|
+
runId: "run-456",
|
|
222
|
+
status: "running",
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const result = await tool.execute(
|
|
226
|
+
{ workflow_name: "test-workflow", sync: false },
|
|
227
|
+
mockContext
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
expect(result.success).toBe(true);
|
|
231
|
+
expect(result.output).toEqual({
|
|
232
|
+
run_id: "run-456",
|
|
233
|
+
status: "running",
|
|
234
|
+
duration_ms: expect.any(Number),
|
|
235
|
+
});
|
|
236
|
+
// Should not include full output for async
|
|
237
|
+
expect((result.output as any).output).toBeUndefined();
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
describe("Error Handling", () => {
|
|
242
|
+
it("should handle workflow not found error", async () => {
|
|
243
|
+
(mockWorkflowService.runWorkflow as any).mockRejectedValue(
|
|
244
|
+
new Error("Workflow not found: non-existent-workflow")
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
const result = await tool.execute(
|
|
248
|
+
{ workflow_name: "non-existent-workflow" },
|
|
249
|
+
mockContext
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
expect(result.success).toBe(false);
|
|
253
|
+
expect(result.error).toBe(
|
|
254
|
+
"Workflow not found: non-existent-workflow"
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it("should handle execution errors", async () => {
|
|
259
|
+
(mockWorkflowService.runWorkflow as any).mockRejectedValue(
|
|
260
|
+
new Error("Internal error")
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
const result = await tool.execute(
|
|
264
|
+
{ workflow_name: "test-workflow" },
|
|
265
|
+
mockContext
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
expect(result.success).toBe(false);
|
|
269
|
+
expect(result.error).toContain("Failed to run workflow");
|
|
270
|
+
expect(result.error).toContain("Internal error");
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it("should handle timeout errors", async () => {
|
|
274
|
+
// Create a tool with a short timeout
|
|
275
|
+
const slowTool = createRunWorkflowTool(mockWorkflowService as WorkflowService);
|
|
276
|
+
|
|
277
|
+
// Mock a slow-running workflow
|
|
278
|
+
(mockWorkflowService.runWorkflow as any).mockImplementation(
|
|
279
|
+
() => new Promise((resolve) => setTimeout(resolve, 1000))
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
const result = await slowTool.execute(
|
|
283
|
+
{ workflow_name: "slow-workflow", timeout: 100 },
|
|
284
|
+
mockContext
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
expect(result.success).toBe(false);
|
|
288
|
+
expect(result.error).toContain("timed out");
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
describe("External Abort Signal", () => {
|
|
293
|
+
it("should handle external abort signal", async () => {
|
|
294
|
+
const abortController = new AbortController();
|
|
295
|
+
|
|
296
|
+
(mockWorkflowService.runWorkflow as any).mockImplementation(
|
|
297
|
+
() =>
|
|
298
|
+
new Promise((_, reject) => {
|
|
299
|
+
abortController.signal.addEventListener("abort", () => {
|
|
300
|
+
reject(new Error("The operation was aborted"));
|
|
301
|
+
});
|
|
302
|
+
})
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
const contextWithAbort: ToolContext = {
|
|
306
|
+
...mockContext,
|
|
307
|
+
abort: abortController.signal,
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// Abort after a short delay
|
|
311
|
+
setTimeout(() => abortController.abort(), 50);
|
|
312
|
+
|
|
313
|
+
const result = await tool.execute(
|
|
314
|
+
{ workflow_name: "test-workflow" },
|
|
315
|
+
contextWithAbort
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
expect(result.success).toBe(false);
|
|
319
|
+
// Should handle abort-related errors
|
|
320
|
+
expect(result.error).toMatch(/aborted|timed out/i);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
describe("RunWorkflowInputSchema", () => {
|
|
326
|
+
it("should validate correct input", () => {
|
|
327
|
+
const { RunWorkflowInputSchema } = require("./run-workflow");
|
|
328
|
+
const result = RunWorkflowInputSchema.safeParse({
|
|
329
|
+
workflow_name: "test",
|
|
330
|
+
input: { key: "value" },
|
|
331
|
+
sync: true,
|
|
332
|
+
timeout: 5000,
|
|
333
|
+
});
|
|
334
|
+
expect(result.success).toBe(true);
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
it("should require workflow_name", () => {
|
|
338
|
+
const { RunWorkflowInputSchema } = require("./run-workflow");
|
|
339
|
+
const result = RunWorkflowInputSchema.safeParse({});
|
|
340
|
+
expect(result.success).toBe(false);
|
|
341
|
+
expect(result.error?.issues[0].path).toContain("workflow_name");
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it("should have default sync=true", () => {
|
|
345
|
+
const { RunWorkflowInputSchema } = require("./run-workflow");
|
|
346
|
+
const result = RunWorkflowInputSchema.safeParse({
|
|
347
|
+
workflow_name: "test",
|
|
348
|
+
});
|
|
349
|
+
expect(result.success).toBe(true);
|
|
350
|
+
expect(result.data?.sync).toBe(true);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Workflow Tool - Phase 7
|
|
3
|
+
*
|
|
4
|
+
* A Tool for executing workflows by name from within other workflows or agents.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import type { Tool, ToolContext, ToolResult } from "../../../env/tool/types";
|
|
9
|
+
import type { WorkflowService } from "../service/workflow-service";
|
|
10
|
+
import { createLogger } from "../../../env/log-trace/logger";
|
|
11
|
+
|
|
12
|
+
// 创建日志器
|
|
13
|
+
const logger = createLogger("run-workflow-tool");
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Input schema for run-workflow tool
|
|
17
|
+
*/
|
|
18
|
+
export const RunWorkflowInputSchema = z.object({
|
|
19
|
+
workflow_name: z.string().describe("Name of the workflow to run"),
|
|
20
|
+
input: z.record(z.any()).optional().describe("Input to pass to the workflow"),
|
|
21
|
+
sync: z.boolean().default(true).describe("Wait for completion (default: true)"),
|
|
22
|
+
timeout: z.number().positive().optional().describe("Timeout in milliseconds"),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export type RunWorkflowInput = z.infer<typeof RunWorkflowInputSchema>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Run Workflow Tool interface for type-safe access
|
|
29
|
+
*/
|
|
30
|
+
export interface RunWorkflowToolInterface {
|
|
31
|
+
name: "run-workflow";
|
|
32
|
+
description: string;
|
|
33
|
+
inputSchema: typeof RunWorkflowInputSchema;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Create a run-workflow tool with the given WorkflowService
|
|
38
|
+
*
|
|
39
|
+
* @param workflowService - The WorkflowService instance for executing workflows
|
|
40
|
+
* @returns A Tool instance for running workflows
|
|
41
|
+
*/
|
|
42
|
+
export function createRunWorkflowTool(workflowService: WorkflowService): Tool {
|
|
43
|
+
return {
|
|
44
|
+
name: "run-workflow",
|
|
45
|
+
description: "Run a workflow by name with optional input. Returns run_id, status, output, error, and duration_ms.",
|
|
46
|
+
parameters: RunWorkflowInputSchema,
|
|
47
|
+
sandbox: {
|
|
48
|
+
enabled: false, // Workflow execution doesn't need sandbox
|
|
49
|
+
},
|
|
50
|
+
permission: {
|
|
51
|
+
level: "safe",
|
|
52
|
+
},
|
|
53
|
+
metadata: {
|
|
54
|
+
category: "workflow",
|
|
55
|
+
tags: ["workflow", "execute", "run"],
|
|
56
|
+
version: "1.0.0",
|
|
57
|
+
experimental: false,
|
|
58
|
+
},
|
|
59
|
+
execute: async (args, ctx: ToolContext): Promise<ToolResult> => {
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
const { workflow_name, input, sync = true, timeout } = args;
|
|
62
|
+
|
|
63
|
+
logger.info(`Running workflow: ${workflow_name}`, { input, sync, timeout });
|
|
64
|
+
|
|
65
|
+
let timeoutHandle: NodeJS.Timeout | undefined;
|
|
66
|
+
let durationMs: number;
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
let result;
|
|
70
|
+
|
|
71
|
+
if (timeout) {
|
|
72
|
+
// Execute workflow with timeout wrapper
|
|
73
|
+
result = await Promise.race([
|
|
74
|
+
workflowService.runWorkflow(workflow_name, input, { sync }),
|
|
75
|
+
new Promise<never>((_, reject) => {
|
|
76
|
+
timeoutHandle = setTimeout(() => {
|
|
77
|
+
reject(new Error("Workflow execution timed out"));
|
|
78
|
+
}, timeout);
|
|
79
|
+
}),
|
|
80
|
+
]);
|
|
81
|
+
} else {
|
|
82
|
+
// No timeout - execute directly
|
|
83
|
+
result = await workflowService.runWorkflow(workflow_name, input, { sync });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Clear timeout
|
|
87
|
+
if (timeoutHandle) {
|
|
88
|
+
clearTimeout(timeoutHandle);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
durationMs = Date.now() - startTime;
|
|
92
|
+
|
|
93
|
+
// Handle the result based on execution mode
|
|
94
|
+
if (sync) {
|
|
95
|
+
// Synchronous execution - return full result
|
|
96
|
+
return {
|
|
97
|
+
success: result.status === "completed",
|
|
98
|
+
output: {
|
|
99
|
+
run_id: result.runId,
|
|
100
|
+
status: result.status,
|
|
101
|
+
output: result.output,
|
|
102
|
+
error: result.error,
|
|
103
|
+
duration_ms: result.durationMs || durationMs,
|
|
104
|
+
},
|
|
105
|
+
metadata: {
|
|
106
|
+
execution_time_ms: durationMs,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
} else {
|
|
110
|
+
// Asynchronous execution - return run_id immediately
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
output: {
|
|
114
|
+
run_id: result.runId,
|
|
115
|
+
status: result.status,
|
|
116
|
+
duration_ms: durationMs,
|
|
117
|
+
},
|
|
118
|
+
metadata: {
|
|
119
|
+
execution_time_ms: durationMs,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
} catch (error) {
|
|
124
|
+
// Clear timeout on error
|
|
125
|
+
if (timeoutHandle) {
|
|
126
|
+
clearTimeout(timeoutHandle);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
durationMs = Date.now() - startTime;
|
|
130
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
131
|
+
|
|
132
|
+
// Handle specific error types
|
|
133
|
+
if (errorMessage.includes("Workflow not found")) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
output: "",
|
|
137
|
+
error: `Workflow not found: ${workflow_name}`,
|
|
138
|
+
metadata: {
|
|
139
|
+
execution_time_ms: durationMs,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (errorMessage.includes("abort") || errorMessage.includes("timed out")) {
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
output: "",
|
|
148
|
+
error: `Workflow execution timed out or was aborted: ${workflow_name}`,
|
|
149
|
+
metadata: {
|
|
150
|
+
execution_time_ms: durationMs,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Safe logging - don't throw if logger is not available
|
|
156
|
+
if (logger?.error) {
|
|
157
|
+
logger.error(`Failed to run workflow: ${workflow_name}`, { error: errorMessage });
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
output: "",
|
|
163
|
+
error: `Failed to run workflow ${workflow_name}: ${errorMessage}`,
|
|
164
|
+
metadata: {
|
|
165
|
+
execution_time_ms: durationMs,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Default run-workflow tool instance (lazy initialization)
|
|
175
|
+
* This is a placeholder that should be replaced with the actual tool
|
|
176
|
+
* created via createRunWorkflowTool(workflowService) in the application
|
|
177
|
+
*/
|
|
178
|
+
let _runWorkflowTool: Tool | null = null;
|
|
179
|
+
let _workflowService: WorkflowService | null = null;
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Initialize the run-workflow tool with a WorkflowService
|
|
183
|
+
*
|
|
184
|
+
* @param workflowService - The WorkflowService instance
|
|
185
|
+
*/
|
|
186
|
+
export function initRunWorkflowTool(workflowService: WorkflowService): void {
|
|
187
|
+
_workflowService = workflowService;
|
|
188
|
+
_runWorkflowTool = createRunWorkflowTool(workflowService);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Get the run-workflow tool instance
|
|
193
|
+
*
|
|
194
|
+
* @throws Error if the tool has not been initialized
|
|
195
|
+
*/
|
|
196
|
+
export function getRunWorkflowTool(): Tool {
|
|
197
|
+
if (!_runWorkflowTool || !_workflowService) {
|
|
198
|
+
throw new Error(
|
|
199
|
+
"run-workflow tool not initialized. Call initRunWorkflowTool(workflowService) first."
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
return _runWorkflowTool;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Reset the run-workflow tool (for testing)
|
|
207
|
+
*/
|
|
208
|
+
export function resetRunWorkflowTool(): void {
|
|
209
|
+
_runWorkflowTool = null;
|
|
210
|
+
_workflowService = null;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Re-export the tool interface for type checking
|
|
214
|
+
export type RunWorkflowTool = ReturnType<typeof createRunWorkflowTool>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* askUser 选项
|
|
3
|
+
*/
|
|
4
|
+
export interface AskUserOptions {
|
|
5
|
+
options?: string[];
|
|
6
|
+
required_confirm?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 从 Session 恢复的运行时状态
|
|
11
|
+
*/
|
|
12
|
+
export interface RuntimeState {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
nodeOutputs: Map<string, unknown>;
|
|
15
|
+
pendingNodeId: string | null;
|
|
16
|
+
waitingForUser: boolean;
|
|
17
|
+
agentSessionId?: string;
|
|
18
|
+
}
|