@claude-flow/cli 3.32.3 → 3.32.5
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/.claude/helpers/helpers.manifest.json +2 -2
- package/catalog-manifest.json +2 -2
- package/dist/src/agenticow/speculative-exploration.d.ts +148 -0
- package/dist/src/agenticow/speculative-exploration.js +218 -0
- package/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.js +425 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.js +292 -0
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.js +329 -0
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.js +370 -0
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.js +393 -0
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.js +237 -0
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.js +347 -0
- package/dist/src/auth/client.d.ts +89 -0
- package/dist/src/auth/client.js +242 -0
- package/dist/src/auth/constants.d.ts +7 -0
- package/dist/src/auth/constants.js +7 -0
- package/dist/src/auth/scopes.d.ts +14 -0
- package/dist/src/auth/scopes.js +21 -0
- package/dist/src/auth/security-bridge.d.ts +36 -0
- package/dist/src/auth/security-bridge.js +42 -0
- package/dist/src/auth/session.d.ts +20 -0
- package/dist/src/auth/session.js +32 -0
- package/dist/src/auth/state.d.ts +19 -0
- package/dist/src/auth/state.js +53 -0
- package/dist/src/auth/types.d.ts +27 -0
- package/dist/src/auth/types.js +11 -0
- package/dist/src/autopilot-state.d.ts +77 -0
- package/dist/src/autopilot-state.js +271 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
- package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
- package/dist/src/benchmarks/gaia-agent.js +651 -0
- package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
- package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
- package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
- package/dist/src/benchmarks/gaia-convergence.js +260 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
- package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
- package/dist/src/benchmarks/gaia-critic.js +312 -0
- package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
- package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
- package/dist/src/benchmarks/gaia-decomposer.js +350 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
- package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
- package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
- package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
- package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
- package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
- package/dist/src/benchmarks/gaia-judge.js +437 -0
- package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
- package/dist/src/benchmarks/gaia-loader.js +326 -0
- package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
- package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
- package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
- package/dist/src/benchmarks/gaia-tools/index.js +36 -0
- package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
- package/dist/src/benchmarks/gaia-tools/types.js +12 -0
- package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
- package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
- package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
- package/dist/src/benchmarks/gaia-voting.js +297 -0
- package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
- package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
- package/dist/src/benchmarks/pretrain/index.js +404 -0
- package/dist/src/business-pods/bbs-budget-tracker.d.ts +139 -0
- package/dist/src/business-pods/bbs-budget-tracker.js +358 -0
- package/dist/src/business-pods/domain-affinity-policy.d.ts +47 -0
- package/dist/src/business-pods/domain-affinity-policy.js +65 -0
- package/dist/src/business-pods/pod-schema.d.ts +96 -0
- package/dist/src/business-pods/pod-schema.js +225 -0
- package/dist/src/commands/advisor.d.ts +15 -0
- package/dist/src/commands/advisor.js +94 -0
- package/dist/src/commands/agent-wasm.d.ts +14 -0
- package/dist/src/commands/agent-wasm.js +333 -0
- package/dist/src/commands/agent.d.ts +8 -0
- package/dist/src/commands/agent.js +927 -0
- package/dist/src/commands/analyze.d.ts +19 -0
- package/dist/src/commands/analyze.js +2047 -0
- package/dist/src/commands/announcements.d.ts +17 -0
- package/dist/src/commands/announcements.js +0 -0
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.js +215 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.js +404 -0
- package/dist/src/commands/auth.d.ts +15 -0
- package/dist/src/commands/auth.js +244 -0
- package/dist/src/commands/autopilot.d.ts +15 -0
- package/dist/src/commands/autopilot.js +407 -0
- package/dist/src/commands/benchmark.d.ts +10 -0
- package/dist/src/commands/benchmark.js +460 -0
- package/dist/src/commands/claims.d.ts +10 -0
- package/dist/src/commands/claims.js +620 -0
- package/dist/src/commands/cleanup.d.ts +13 -0
- package/dist/src/commands/cleanup.js +250 -0
- package/dist/src/commands/completions.d.ts +10 -0
- package/dist/src/commands/completions.js +539 -0
- package/dist/src/commands/config.d.ts +8 -0
- package/dist/src/commands/config.js +428 -0
- package/dist/src/commands/daemon.d.ts +59 -0
- package/dist/src/commands/daemon.js +1733 -0
- package/dist/src/commands/deployment.d.ts +10 -0
- package/dist/src/commands/deployment.js +672 -0
- package/dist/src/commands/doctor.d.ts +10 -0
- package/dist/src/commands/doctor.js +1902 -0
- package/dist/src/commands/eject.d.ts +33 -0
- package/dist/src/commands/eject.js +195 -0
- package/dist/src/commands/embeddings.d.ts +18 -0
- package/dist/src/commands/embeddings.js +1623 -0
- package/dist/src/commands/funnel.d.ts +18 -0
- package/dist/src/commands/funnel.js +302 -0
- package/dist/src/commands/gaia-bench.d.ts +40 -0
- package/dist/src/commands/gaia-bench.js +597 -0
- package/dist/src/commands/guidance.d.ts +8 -0
- package/dist/src/commands/guidance.js +556 -0
- package/dist/src/commands/hive-mind.d.ts +11 -0
- package/dist/src/commands/hive-mind.js +1319 -0
- package/dist/src/commands/hooks.d.ts +8 -0
- package/dist/src/commands/hooks.js +4606 -0
- package/dist/src/commands/index.d.ts +118 -0
- package/dist/src/commands/index.js +366 -0
- package/dist/src/commands/init.d.ts +13 -0
- package/dist/src/commands/init.js +1297 -0
- package/dist/src/commands/issues.d.ts +21 -0
- package/dist/src/commands/issues.js +567 -0
- package/dist/src/commands/mcp.d.ts +11 -0
- package/dist/src/commands/mcp.js +732 -0
- package/dist/src/commands/memory-backup.d.ts +11 -0
- package/dist/src/commands/memory-backup.js +46 -0
- package/dist/src/commands/memory-distill.d.ts +27 -0
- package/dist/src/commands/memory-distill.js +374 -0
- package/dist/src/commands/memory.d.ts +8 -0
- package/dist/src/commands/memory.js +1596 -0
- package/dist/src/commands/metaharness.d.ts +39 -0
- package/dist/src/commands/metaharness.js +215 -0
- package/dist/src/commands/migrate.d.ts +8 -0
- package/dist/src/commands/migrate.js +742 -0
- package/dist/src/commands/neural.d.ts +10 -0
- package/dist/src/commands/neural.js +4331 -0
- package/dist/src/commands/performance.d.ts +10 -0
- package/dist/src/commands/performance.js +583 -0
- package/dist/src/commands/plugins.d.ts +11 -0
- package/dist/src/commands/plugins.js +826 -0
- package/dist/src/commands/process.d.ts +10 -0
- package/dist/src/commands/process.js +694 -0
- package/dist/src/commands/progress.d.ts +11 -0
- package/dist/src/commands/progress.js +259 -0
- package/dist/src/commands/providers.d.ts +10 -0
- package/dist/src/commands/providers.js +502 -0
- package/dist/src/commands/proxy-lifecycle.d.ts +20 -0
- package/dist/src/commands/proxy-lifecycle.js +277 -0
- package/dist/src/commands/proxy.d.ts +21 -0
- package/dist/src/commands/proxy.js +403 -0
- package/dist/src/commands/route.d.ts +16 -0
- package/dist/src/commands/route.js +822 -0
- package/dist/src/commands/ruvector/backup.d.ts +11 -0
- package/dist/src/commands/ruvector/backup.js +747 -0
- package/dist/src/commands/ruvector/benchmark.d.ts +11 -0
- package/dist/src/commands/ruvector/benchmark.js +490 -0
- package/dist/src/commands/ruvector/import.d.ts +18 -0
- package/dist/src/commands/ruvector/import.js +373 -0
- package/dist/src/commands/ruvector/index.d.ts +29 -0
- package/dist/src/commands/ruvector/index.js +129 -0
- package/dist/src/commands/ruvector/init.d.ts +11 -0
- package/dist/src/commands/ruvector/init.js +467 -0
- package/dist/src/commands/ruvector/migrate.d.ts +11 -0
- package/dist/src/commands/ruvector/migrate.js +498 -0
- package/dist/src/commands/ruvector/optimize.d.ts +11 -0
- package/dist/src/commands/ruvector/optimize.js +505 -0
- package/dist/src/commands/ruvector/pg-utils.d.ts +14 -0
- package/dist/src/commands/ruvector/pg-utils.js +41 -0
- package/dist/src/commands/ruvector/setup.d.ts +18 -0
- package/dist/src/commands/ruvector/setup.js +765 -0
- package/dist/src/commands/ruvector/status.d.ts +11 -0
- package/dist/src/commands/ruvector/status.js +479 -0
- package/dist/src/commands/security.d.ts +10 -0
- package/dist/src/commands/security.js +1012 -0
- package/dist/src/commands/session.d.ts +8 -0
- package/dist/src/commands/session.js +757 -0
- package/dist/src/commands/settings.d.ts +19 -0
- package/dist/src/commands/settings.js +180 -0
- package/dist/src/commands/spinner.d.ts +16 -0
- package/dist/src/commands/spinner.js +329 -0
- package/dist/src/commands/start.d.ts +8 -0
- package/dist/src/commands/start.js +418 -0
- package/dist/src/commands/status.d.ts +8 -0
- package/dist/src/commands/status.js +608 -0
- package/dist/src/commands/swarm.d.ts +8 -0
- package/dist/src/commands/swarm.js +891 -0
- package/dist/src/commands/task.d.ts +8 -0
- package/dist/src/commands/task.js +675 -0
- package/dist/src/commands/transfer-store.d.ts +13 -0
- package/dist/src/commands/transfer-store.js +428 -0
- package/dist/src/commands/update.d.ts +8 -0
- package/dist/src/commands/update.js +276 -0
- package/dist/src/commands/verify.d.ts +19 -0
- package/dist/src/commands/verify.js +261 -0
- package/dist/src/commands/version.d.ts +42 -0
- package/dist/src/commands/version.js +106 -0
- package/dist/src/commands/workflow.d.ts +8 -0
- package/dist/src/commands/workflow.js +617 -0
- package/dist/src/config/harness-feedback-applier.d.ts +50 -0
- package/dist/src/config/harness-feedback-applier.js +122 -0
- package/dist/src/config/proven-config-refresh.d.ts +39 -0
- package/dist/src/config/proven-config-refresh.js +154 -0
- package/dist/src/config/proven-config-rvfa.d.ts +23 -0
- package/dist/src/config/proven-config-rvfa.js +73 -0
- package/dist/src/config/proven-config.d.ts +86 -0
- package/dist/src/config/proven-config.js +176 -0
- package/dist/src/config-adapter.d.ts +15 -0
- package/dist/src/config-adapter.js +186 -0
- package/dist/src/encryption/vault.d.ts +94 -0
- package/dist/src/encryption/vault.js +172 -0
- package/dist/src/fs-secure.d.ts +86 -0
- package/dist/src/fs-secure.js +133 -0
- package/dist/src/funnel/advisor-tip.d.ts +58 -0
- package/dist/src/funnel/advisor-tip.js +92 -0
- package/dist/src/funnel/attribution.d.ts +37 -0
- package/dist/src/funnel/attribution.js +101 -0
- package/dist/src/funnel/consent.d.ts +22 -0
- package/dist/src/funnel/consent.js +58 -0
- package/dist/src/funnel/credit-errors.d.ts +31 -0
- package/dist/src/funnel/credit-errors.js +88 -0
- package/dist/src/funnel/credit-notifier.d.ts +44 -0
- package/dist/src/funnel/credit-notifier.js +74 -0
- package/dist/src/funnel/disclosure.d.ts +47 -0
- package/dist/src/funnel/disclosure.js +109 -0
- package/dist/src/funnel/enrollment.d.ts +36 -0
- package/dist/src/funnel/enrollment.js +64 -0
- package/dist/src/funnel/environment.d.ts +17 -0
- package/dist/src/funnel/environment.js +39 -0
- package/dist/src/funnel/event-transport.d.ts +51 -0
- package/dist/src/funnel/event-transport.js +199 -0
- package/dist/src/funnel/events.d.ts +42 -0
- package/dist/src/funnel/events.js +150 -0
- package/dist/src/funnel/index.d.ts +21 -0
- package/dist/src/funnel/index.js +21 -0
- package/dist/src/funnel/insights.d.ts +50 -0
- package/dist/src/funnel/insights.js +120 -0
- package/dist/src/funnel/local-signals.d.ts +20 -0
- package/dist/src/funnel/local-signals.js +77 -0
- package/dist/src/funnel/message-transport.d.ts +51 -0
- package/dist/src/funnel/message-transport.js +149 -0
- package/dist/src/funnel/messages.d.ts +55 -0
- package/dist/src/funnel/messages.js +160 -0
- package/dist/src/funnel/payout.d.ts +40 -0
- package/dist/src/funnel/payout.js +60 -0
- package/dist/src/funnel/power-saver-notifier.d.ts +44 -0
- package/dist/src/funnel/power-saver-notifier.js +92 -0
- package/dist/src/funnel/precedence.d.ts +16 -0
- package/dist/src/funnel/precedence.js +85 -0
- package/dist/src/funnel/promo.d.ts +41 -0
- package/dist/src/funnel/promo.js +144 -0
- package/dist/src/funnel/rate-limit-notifier.d.ts +55 -0
- package/dist/src/funnel/rate-limit-notifier.js +102 -0
- package/dist/src/funnel/rotation.d.ts +19 -0
- package/dist/src/funnel/rotation.js +70 -0
- package/dist/src/funnel/state.d.ts +13 -0
- package/dist/src/funnel/state.js +52 -0
- package/dist/src/funnel/toggle-cooldown.d.ts +17 -0
- package/dist/src/funnel/toggle-cooldown.js +32 -0
- package/dist/src/funnel/types.d.ts +98 -0
- package/dist/src/funnel/types.js +26 -0
- package/dist/src/index.d.ts +81 -0
- package/dist/src/index.js +609 -0
- package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
- package/dist/src/infrastructure/in-memory-repositories.js +264 -0
- package/dist/src/init/claudemd-generator.d.ts +16 -0
- package/dist/src/init/claudemd-generator.js +368 -0
- package/dist/src/init/executor.d.ts +41 -0
- package/dist/src/init/executor.js +2142 -0
- package/dist/src/init/helper-refresh.d.ts +79 -0
- package/dist/src/init/helper-refresh.js +347 -0
- package/dist/src/init/helper-signing.d.ts +37 -0
- package/dist/src/init/helper-signing.js +67 -0
- package/dist/src/init/helpers-generator.d.ts +87 -0
- package/dist/src/init/helpers-generator.js +1456 -0
- package/dist/src/init/index.d.ts +13 -0
- package/dist/src/init/index.js +15 -0
- package/dist/src/init/mcp-generator.d.ts +26 -0
- package/dist/src/init/mcp-generator.js +126 -0
- package/dist/src/init/memory-package-resolver.d.ts +53 -0
- package/dist/src/init/memory-package-resolver.js +118 -0
- package/dist/src/init/settings-generator.d.ts +14 -0
- package/dist/src/init/settings-generator.js +462 -0
- package/dist/src/init/statusline-generator.d.ts +28 -0
- package/dist/src/init/statusline-generator.js +177 -0
- package/dist/src/init/types.d.ts +331 -0
- package/dist/src/init/types.js +276 -0
- package/dist/src/log-filters.d.ts +46 -0
- package/dist/src/log-filters.js +107 -0
- package/dist/src/mcp-client.d.ts +92 -0
- package/dist/src/mcp-client.js +397 -0
- package/dist/src/mcp-server.d.ts +163 -0
- package/dist/src/mcp-server.js +751 -0
- package/dist/src/mcp-tools/agent-execute-core.d.ts +115 -0
- package/dist/src/mcp-tools/agent-execute-core.js +587 -0
- package/dist/src/mcp-tools/agent-tools.d.ts +9 -0
- package/dist/src/mcp-tools/agent-tools.js +837 -0
- package/dist/src/mcp-tools/agentbbs-tools.d.ts +28 -0
- package/dist/src/mcp-tools/agentbbs-tools.js +394 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts +35 -0
- package/dist/src/mcp-tools/agentdb-tools.js +1473 -0
- package/dist/src/mcp-tools/agenticow-loader.d.ts +59 -0
- package/dist/src/mcp-tools/agenticow-loader.js +105 -0
- package/dist/src/mcp-tools/agenticow-speculate-tools.d.ts +24 -0
- package/dist/src/mcp-tools/agenticow-speculate-tools.js +209 -0
- package/dist/src/mcp-tools/agenticow-tools.d.ts +36 -0
- package/dist/src/mcp-tools/agenticow-tools.js +360 -0
- package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
- package/dist/src/mcp-tools/analyze-tools.js +346 -0
- package/dist/src/mcp-tools/auto-install.d.ts +83 -0
- package/dist/src/mcp-tools/auto-install.js +131 -0
- package/dist/src/mcp-tools/autopilot-tools.d.ts +12 -0
- package/dist/src/mcp-tools/autopilot-tools.js +231 -0
- package/dist/src/mcp-tools/browser-intent-tools.d.ts +162 -0
- package/dist/src/mcp-tools/browser-intent-tools.js +548 -0
- package/dist/src/mcp-tools/browser-session-tools.d.ts +27 -0
- package/dist/src/mcp-tools/browser-session-tools.js +398 -0
- package/dist/src/mcp-tools/browser-tools.d.ts +21 -0
- package/dist/src/mcp-tools/browser-tools.js +760 -0
- package/dist/src/mcp-tools/business-pod-tools.d.ts +20 -0
- package/dist/src/mcp-tools/business-pod-tools.js +169 -0
- package/dist/src/mcp-tools/claims-tools.d.ts +12 -0
- package/dist/src/mcp-tools/claims-tools.js +863 -0
- package/dist/src/mcp-tools/config-tools.d.ts +8 -0
- package/dist/src/mcp-tools/config-tools.js +411 -0
- package/dist/src/mcp-tools/coordination-tools.d.ts +13 -0
- package/dist/src/mcp-tools/coordination-tools.js +729 -0
- package/dist/src/mcp-tools/daa-tools.d.ts +13 -0
- package/dist/src/mcp-tools/daa-tools.js +534 -0
- package/dist/src/mcp-tools/embeddings-tools.d.ts +9 -0
- package/dist/src/mcp-tools/embeddings-tools.js +904 -0
- package/dist/src/mcp-tools/github-tools.d.ts +9 -0
- package/dist/src/mcp-tools/github-tools.js +659 -0
- package/dist/src/mcp-tools/guidance-tools.d.ts +15 -0
- package/dist/src/mcp-tools/guidance-tools.js +639 -0
- package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
- package/dist/src/mcp-tools/hive-mind-tools.js +953 -0
- package/dist/src/mcp-tools/hooks-tools.d.ts +65 -0
- package/dist/src/mcp-tools/hooks-tools.js +4836 -0
- package/dist/src/mcp-tools/http-fetch-tools.d.ts +55 -0
- package/dist/src/mcp-tools/http-fetch-tools.js +329 -0
- package/dist/src/mcp-tools/index.d.ts +34 -0
- package/dist/src/mcp-tools/index.js +40 -0
- package/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
- package/dist/src/mcp-tools/managed-agent-tools.js +357 -0
- package/dist/src/mcp-tools/memory-tools.d.ts +14 -0
- package/dist/src/mcp-tools/memory-tools.js +1330 -0
- package/dist/src/mcp-tools/metaharness-tools.d.ts +51 -0
- package/dist/src/mcp-tools/metaharness-tools.js +684 -0
- package/dist/src/mcp-tools/neural-tools.d.ts +54 -0
- package/dist/src/mcp-tools/neural-tools.js +1168 -0
- package/dist/src/mcp-tools/performance-tools.d.ts +16 -0
- package/dist/src/mcp-tools/performance-tools.js +675 -0
- package/dist/src/mcp-tools/progress-tools.d.ts +14 -0
- package/dist/src/mcp-tools/progress-tools.js +348 -0
- package/dist/src/mcp-tools/request-tracker.d.ts +17 -0
- package/dist/src/mcp-tools/request-tracker.js +27 -0
- package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/dist/src/mcp-tools/ruvllm-tools.js +355 -0
- package/dist/src/mcp-tools/security-tools.d.ts +18 -0
- package/dist/src/mcp-tools/security-tools.js +556 -0
- package/dist/src/mcp-tools/session-tools.d.ts +8 -0
- package/dist/src/mcp-tools/session-tools.js +517 -0
- package/dist/src/mcp-tools/swarm-tools.d.ts +37 -0
- package/dist/src/mcp-tools/swarm-tools.js +390 -0
- package/dist/src/mcp-tools/system-tools.d.ts +13 -0
- package/dist/src/mcp-tools/system-tools.js +688 -0
- package/dist/src/mcp-tools/task-tools.d.ts +8 -0
- package/dist/src/mcp-tools/task-tools.js +487 -0
- package/dist/src/mcp-tools/terminal-tools.d.ts +8 -0
- package/dist/src/mcp-tools/terminal-tools.js +306 -0
- package/dist/src/mcp-tools/testgen-tools.d.ts +26 -0
- package/dist/src/mcp-tools/testgen-tools.js +168 -0
- package/dist/src/mcp-tools/tool-loop-guardrail.d.ts +31 -0
- package/dist/src/mcp-tools/tool-loop-guardrail.js +71 -0
- package/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
- package/dist/src/mcp-tools/transfer-tools.js +447 -0
- package/dist/src/mcp-tools/types.d.ts +8 -0
- package/dist/src/mcp-tools/types.js +8 -0
- package/dist/src/mcp-tools/validate-input.d.ts +9 -0
- package/dist/src/mcp-tools/validate-input.js +9 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +13 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +840 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
- package/dist/src/mcp-tools/workflow-tools.js +884 -0
- package/dist/src/memory/bge-embedder.d.ts +25 -0
- package/dist/src/memory/bge-embedder.js +121 -0
- package/dist/src/memory/cross-encoder-rerank.d.ts +33 -0
- package/dist/src/memory/cross-encoder-rerank.js +123 -0
- package/dist/src/memory/embedding-policy.d.ts +21 -0
- package/dist/src/memory/embedding-policy.js +30 -0
- package/dist/src/memory/embedding-quantization.d.ts +62 -0
- package/dist/src/memory/embedding-quantization.js +156 -0
- package/dist/src/memory/ewc-consolidation.d.ts +305 -0
- package/dist/src/memory/ewc-consolidation.js +611 -0
- package/dist/src/memory/graph-edge-writer.d.ts +95 -0
- package/dist/src/memory/graph-edge-writer.js +217 -0
- package/dist/src/memory/hybrid-retrieval.d.ts +77 -0
- package/dist/src/memory/hybrid-retrieval.js +192 -0
- package/dist/src/memory/intelligence.d.ts +405 -0
- package/dist/src/memory/intelligence.js +1316 -0
- package/dist/src/memory/lucene-bm25.d.ts +19 -0
- package/dist/src/memory/lucene-bm25.js +308 -0
- package/dist/src/memory/memory-bridge.d.ts +537 -0
- package/dist/src/memory/memory-bridge.js +2460 -0
- package/dist/src/memory/memory-initializer.d.ts +556 -0
- package/dist/src/memory/memory-initializer.js +3021 -0
- package/dist/src/memory/neural-package-bridge.d.ts +48 -0
- package/dist/src/memory/neural-package-bridge.js +87 -0
- package/dist/src/memory/rabitq-index.d.ts +60 -0
- package/dist/src/memory/rabitq-index.js +242 -0
- package/dist/src/memory/sona-optimizer.d.ts +267 -0
- package/dist/src/memory/sona-optimizer.js +779 -0
- package/dist/src/memory/structured-distill.d.ts +48 -0
- package/dist/src/memory/structured-distill.js +125 -0
- package/dist/src/output.d.ts +9 -0
- package/dist/src/output.js +9 -0
- package/dist/src/parser.d.ts +89 -0
- package/dist/src/parser.js +516 -0
- package/dist/src/plugins/manager.d.ts +133 -0
- package/dist/src/plugins/manager.js +415 -0
- package/dist/src/plugins/store/discovery.d.ts +99 -0
- package/dist/src/plugins/store/discovery.js +1224 -0
- package/dist/src/plugins/store/index.d.ts +76 -0
- package/dist/src/plugins/store/index.js +141 -0
- package/dist/src/plugins/store/search.d.ts +46 -0
- package/dist/src/plugins/store/search.js +230 -0
- package/dist/src/plugins/store/types.d.ts +279 -0
- package/dist/src/plugins/store/types.js +7 -0
- package/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
- package/dist/src/plugins/tests/demo-plugin-store.js +126 -0
- package/dist/src/plugins/tests/standalone-test.d.ts +12 -0
- package/dist/src/plugins/tests/standalone-test.js +188 -0
- package/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
- package/dist/src/plugins/tests/test-plugin-store.js +206 -0
- package/dist/src/production/circuit-breaker.d.ts +101 -0
- package/dist/src/production/circuit-breaker.js +241 -0
- package/dist/src/production/error-handler.d.ts +92 -0
- package/dist/src/production/error-handler.js +299 -0
- package/dist/src/production/index.d.ts +23 -0
- package/dist/src/production/index.js +18 -0
- package/dist/src/production/monitoring.d.ts +161 -0
- package/dist/src/production/monitoring.js +356 -0
- package/dist/src/production/rate-limiter.d.ts +80 -0
- package/dist/src/production/rate-limiter.js +201 -0
- package/dist/src/production/retry.d.ts +48 -0
- package/dist/src/production/retry.js +179 -0
- package/dist/src/prompt.d.ts +44 -0
- package/dist/src/prompt.js +501 -0
- package/dist/src/proxy/install.d.ts +29 -0
- package/dist/src/proxy/install.js +135 -0
- package/dist/src/proxy/lifecycle.d.ts +61 -0
- package/dist/src/proxy/lifecycle.js +249 -0
- package/dist/src/proxy/paths.d.ts +34 -0
- package/dist/src/proxy/paths.js +70 -0
- package/dist/src/proxy/release.d.ts +47 -0
- package/dist/src/proxy/release.js +138 -0
- package/dist/src/proxy/token-bridge.d.ts +5 -0
- package/dist/src/proxy/token-bridge.js +61 -0
- package/dist/src/proxy/verify.d.ts +44 -0
- package/dist/src/proxy/verify.js +68 -0
- package/dist/src/runtime/headless.d.ts +60 -0
- package/dist/src/runtime/headless.js +284 -0
- package/dist/src/runtime/parent-death-watchdog.d.ts +42 -0
- package/dist/src/runtime/parent-death-watchdog.js +70 -0
- package/dist/src/ruvector/agent-wasm.d.ts +228 -0
- package/dist/src/ruvector/agent-wasm.js +463 -0
- package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/dist/src/ruvector/ast-analyzer.js +277 -0
- package/dist/src/ruvector/codemods/engine.d.ts +45 -0
- package/dist/src/ruvector/codemods/engine.js +291 -0
- package/dist/src/ruvector/codemods/scope-analysis.d.ts +29 -0
- package/dist/src/ruvector/codemods/scope-analysis.js +162 -0
- package/dist/src/ruvector/coverage-router.d.ts +160 -0
- package/dist/src/ruvector/coverage-router.js +531 -0
- package/dist/src/ruvector/coverage-tools.d.ts +33 -0
- package/dist/src/ruvector/coverage-tools.js +157 -0
- package/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/dist/src/ruvector/diff-classifier.js +699 -0
- package/dist/src/ruvector/diskann-backend.d.ts +78 -0
- package/dist/src/ruvector/diskann-backend.js +310 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts +172 -0
- package/dist/src/ruvector/enhanced-model-router.js +577 -0
- package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
- package/dist/src/ruvector/graph-analyzer.js +929 -0
- package/dist/src/ruvector/graph-backend.d.ts +79 -0
- package/dist/src/ruvector/graph-backend.js +220 -0
- package/dist/src/ruvector/index.d.ts +38 -0
- package/dist/src/ruvector/index.js +86 -0
- package/dist/src/ruvector/lora-adapter.d.ts +292 -0
- package/dist/src/ruvector/lora-adapter.js +710 -0
- package/dist/src/ruvector/model-prices.d.ts +50 -0
- package/dist/src/ruvector/model-prices.js +72 -0
- package/dist/src/ruvector/model-router.d.ts +408 -0
- package/dist/src/ruvector/model-router.js +1162 -0
- package/dist/src/ruvector/neural-router.d.ts +182 -0
- package/dist/src/ruvector/neural-router.js +825 -0
- package/dist/src/ruvector/output-verifier.d.ts +83 -0
- package/dist/src/ruvector/output-verifier.js +277 -0
- package/dist/src/ruvector/q-learning-router.d.ts +227 -0
- package/dist/src/ruvector/q-learning-router.js +721 -0
- package/dist/src/ruvector/router-calibrator.d.ts +65 -0
- package/dist/src/ruvector/router-calibrator.js +120 -0
- package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
- package/dist/src/ruvector/router-parallel-recorder.js +183 -0
- package/dist/src/ruvector/router-trajectory.d.ts +194 -0
- package/dist/src/ruvector/router-trajectory.js +281 -0
- package/dist/src/ruvector/run-transcript-recorder.d.ts +154 -0
- package/dist/src/ruvector/run-transcript-recorder.js +209 -0
- package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/dist/src/ruvector/ruvllm-wasm.js +379 -0
- package/dist/src/ruvector/semantic-router.d.ts +77 -0
- package/dist/src/ruvector/semantic-router.js +178 -0
- package/dist/src/ruvector/task-embedder.d.ts +56 -0
- package/dist/src/ruvector/task-embedder.js +237 -0
- package/dist/src/ruvector/trajectory-tree.d.ts +113 -0
- package/dist/src/ruvector/trajectory-tree.js +237 -0
- package/dist/src/ruvector/vector-db.d.ts +73 -0
- package/dist/src/ruvector/vector-db.js +301 -0
- package/dist/src/ruvector/wasm-embedder.d.ts +13 -0
- package/dist/src/ruvector/wasm-embedder.js +143 -0
- package/dist/src/security/builtin-aidefence.d.ts +34 -0
- package/dist/src/security/builtin-aidefence.js +86 -0
- package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/dist/src/services/agentic-flow-bridge.js +95 -0
- package/dist/src/services/ai-job-dedup.d.ts +61 -0
- package/dist/src/services/ai-job-dedup.js +136 -0
- package/dist/src/services/checkpoint-gate.d.ts +140 -0
- package/dist/src/services/checkpoint-gate.js +223 -0
- package/dist/src/services/claim-service.d.ts +204 -0
- package/dist/src/services/claim-service.js +818 -0
- package/dist/src/services/config-file-manager.d.ts +37 -0
- package/dist/src/services/config-file-manager.js +224 -0
- package/dist/src/services/container-worker-pool.d.ts +204 -0
- package/dist/src/services/container-worker-pool.js +589 -0
- package/dist/src/services/daemon-autostart.d.ts +17 -0
- package/dist/src/services/daemon-autostart.js +102 -0
- package/dist/src/services/distill-oracle.d.ts +190 -0
- package/dist/src/services/distill-oracle.js +349 -0
- package/dist/src/services/distill-tuning.d.ts +111 -0
- package/dist/src/services/distill-tuning.js +510 -0
- package/dist/src/services/evolve-proof.d.ts +253 -0
- package/dist/src/services/evolve-proof.js +343 -0
- package/dist/src/services/fable-harness.d.ts +208 -0
- package/dist/src/services/fable-harness.js +388 -0
- package/dist/src/services/git-workspace-identity.d.ts +42 -0
- package/dist/src/services/git-workspace-identity.js +99 -0
- package/dist/src/services/global-ai-budget.d.ts +135 -0
- package/dist/src/services/global-ai-budget.js +415 -0
- package/dist/src/services/harness-benchmark.d.ts +68 -0
- package/dist/src/services/harness-benchmark.js +94 -0
- package/dist/src/services/harness-canary.d.ts +60 -0
- package/dist/src/services/harness-canary.js +69 -0
- package/dist/src/services/harness-corpus-harvester.d.ts +51 -0
- package/dist/src/services/harness-corpus-harvester.js +74 -0
- package/dist/src/services/harness-flywheel-generations.d.ts +115 -0
- package/dist/src/services/harness-flywheel-generations.js +360 -0
- package/dist/src/services/harness-flywheel-runtime.d.ts +25 -0
- package/dist/src/services/harness-flywheel-runtime.js +92 -0
- package/dist/src/services/harness-flywheel.d.ts +48 -0
- package/dist/src/services/harness-flywheel.js +207 -0
- package/dist/src/services/harness-frozen-eval.d.ts +22 -0
- package/dist/src/services/harness-frozen-eval.js +66 -0
- package/dist/src/services/harness-hosts.d.ts +40 -0
- package/dist/src/services/harness-hosts.js +88 -0
- package/dist/src/services/harness-improvement-ledger.d.ts +63 -0
- package/dist/src/services/harness-improvement-ledger.js +101 -0
- package/dist/src/services/harness-loop.d.ts +53 -0
- package/dist/src/services/harness-loop.js +85 -0
- package/dist/src/services/harness-qualification.d.ts +66 -0
- package/dist/src/services/harness-qualification.js +143 -0
- package/dist/src/services/harness-replay.d.ts +37 -0
- package/dist/src/services/harness-replay.js +92 -0
- package/dist/src/services/harness-verify.d.ts +33 -0
- package/dist/src/services/harness-verify.js +26 -0
- package/dist/src/services/harness-worker.d.ts +23 -0
- package/dist/src/services/harness-worker.js +66 -0
- package/dist/src/services/headless-worker-executor.d.ts +358 -0
- package/dist/src/services/headless-worker-executor.js +1269 -0
- package/dist/src/services/index.d.ts +13 -0
- package/dist/src/services/index.js +11 -0
- package/dist/src/services/memory-backup.d.ts +53 -0
- package/dist/src/services/memory-backup.js +198 -0
- package/dist/src/services/memory-distillation.d.ts +41 -0
- package/dist/src/services/memory-distillation.js +277 -0
- package/dist/src/services/native-training.d.ts +68 -0
- package/dist/src/services/native-training.js +141 -0
- package/dist/src/services/registry-api.d.ts +58 -0
- package/dist/src/services/registry-api.js +146 -0
- package/dist/src/services/repo-supervisor.d.ts +70 -0
- package/dist/src/services/repo-supervisor.js +228 -0
- package/dist/src/services/ruvector-training.d.ts +222 -0
- package/dist/src/services/ruvector-training.js +693 -0
- package/dist/src/services/swarm-memory-branches.d.ts +135 -0
- package/dist/src/services/swarm-memory-branches.js +213 -0
- package/dist/src/services/weight-eft.d.ts +305 -0
- package/dist/src/services/weight-eft.js +296 -0
- package/dist/src/services/worker-daemon.d.ts +439 -0
- package/dist/src/services/worker-daemon.js +1865 -0
- package/dist/src/services/worker-queue.d.ts +194 -0
- package/dist/src/services/worker-queue.js +513 -0
- package/dist/src/services/workspace-lease.d.ts +55 -0
- package/dist/src/services/workspace-lease.js +191 -0
- package/dist/src/suggest.d.ts +53 -0
- package/dist/src/suggest.js +200 -0
- package/dist/src/transfer/anonymization/index.d.ts +25 -0
- package/dist/src/transfer/anonymization/index.js +175 -0
- package/dist/src/transfer/deploy-seraphine.d.ts +13 -0
- package/dist/src/transfer/deploy-seraphine.js +205 -0
- package/dist/src/transfer/export.d.ts +25 -0
- package/dist/src/transfer/export.js +113 -0
- package/dist/src/transfer/index.d.ts +12 -0
- package/dist/src/transfer/index.js +31 -0
- package/dist/src/transfer/ipfs/client.d.ts +109 -0
- package/dist/src/transfer/ipfs/client.js +307 -0
- package/dist/src/transfer/ipfs/upload.d.ts +95 -0
- package/dist/src/transfer/ipfs/upload.js +413 -0
- package/dist/src/transfer/models/seraphine.d.ts +72 -0
- package/dist/src/transfer/models/seraphine.js +373 -0
- package/dist/src/transfer/serialization/cfp.d.ts +49 -0
- package/dist/src/transfer/serialization/cfp.js +183 -0
- package/dist/src/transfer/storage/gcs.d.ts +82 -0
- package/dist/src/transfer/storage/gcs.js +272 -0
- package/dist/src/transfer/storage/index.d.ts +6 -0
- package/dist/src/transfer/storage/index.js +6 -0
- package/dist/src/transfer/store/discovery.d.ts +84 -0
- package/dist/src/transfer/store/discovery.js +382 -0
- package/dist/src/transfer/store/download.d.ts +70 -0
- package/dist/src/transfer/store/download.js +334 -0
- package/dist/src/transfer/store/index.d.ts +84 -0
- package/dist/src/transfer/store/index.js +153 -0
- package/dist/src/transfer/store/publish.d.ts +76 -0
- package/dist/src/transfer/store/publish.js +294 -0
- package/dist/src/transfer/store/registry.d.ts +58 -0
- package/dist/src/transfer/store/registry.js +285 -0
- package/dist/src/transfer/store/search.d.ts +54 -0
- package/dist/src/transfer/store/search.js +232 -0
- package/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
- package/dist/src/transfer/store/tests/standalone-test.js +190 -0
- package/dist/src/transfer/store/types.d.ts +193 -0
- package/dist/src/transfer/store/types.js +6 -0
- package/dist/src/transfer/test-seraphine.d.ts +6 -0
- package/dist/src/transfer/test-seraphine.js +105 -0
- package/dist/src/transfer/tests/test-store.d.ts +7 -0
- package/dist/src/transfer/tests/test-store.js +214 -0
- package/dist/src/transfer/types.d.ts +245 -0
- package/dist/src/transfer/types.js +6 -0
- package/dist/src/types.d.ts +13 -0
- package/dist/src/types.js +13 -0
- package/dist/src/update/checker.d.ts +34 -0
- package/dist/src/update/checker.js +191 -0
- package/dist/src/update/executor.d.ts +33 -0
- package/dist/src/update/executor.js +217 -0
- package/dist/src/update/index.d.ts +33 -0
- package/dist/src/update/index.js +64 -0
- package/dist/src/update/rate-limiter.d.ts +20 -0
- package/dist/src/update/rate-limiter.js +96 -0
- package/dist/src/update/validator.d.ts +17 -0
- package/dist/src/update/validator.js +123 -0
- package/package.json +1 -1
|
@@ -0,0 +1,884 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow MCP Tools for CLI
|
|
3
|
+
*
|
|
4
|
+
* Tool definitions for workflow automation and orchestration.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { getProjectCwd } from './types.js';
|
|
9
|
+
import { validateIdentifier, validatePath, validateText } from './validate-input.js';
|
|
10
|
+
import { executeAgentTask } from './agent-execute-core.js';
|
|
11
|
+
// Storage paths
|
|
12
|
+
const STORAGE_DIR = '.claude-flow';
|
|
13
|
+
const WORKFLOW_DIR = 'workflows';
|
|
14
|
+
const WORKFLOW_FILE = 'store.json';
|
|
15
|
+
function getWorkflowDir() {
|
|
16
|
+
return join(getProjectCwd(), STORAGE_DIR, WORKFLOW_DIR);
|
|
17
|
+
}
|
|
18
|
+
function getWorkflowPath() {
|
|
19
|
+
return join(getWorkflowDir(), WORKFLOW_FILE);
|
|
20
|
+
}
|
|
21
|
+
function ensureWorkflowDir() {
|
|
22
|
+
const dir = getWorkflowDir();
|
|
23
|
+
if (!existsSync(dir)) {
|
|
24
|
+
mkdirSync(dir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function loadWorkflowStore() {
|
|
28
|
+
try {
|
|
29
|
+
const path = getWorkflowPath();
|
|
30
|
+
if (existsSync(path)) {
|
|
31
|
+
const data = readFileSync(path, 'utf-8');
|
|
32
|
+
return JSON.parse(data);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Return default store on error
|
|
37
|
+
}
|
|
38
|
+
return { workflows: {}, templates: {}, version: '3.0.0' };
|
|
39
|
+
}
|
|
40
|
+
function saveWorkflowStore(store) {
|
|
41
|
+
ensureWorkflowDir();
|
|
42
|
+
writeFileSync(getWorkflowPath(), JSON.stringify(store, null, 2), 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
export const workflowTools = [
|
|
45
|
+
{
|
|
46
|
+
name: 'workflow_run',
|
|
47
|
+
description: 'Run a workflow from a template or file Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
48
|
+
category: 'workflow',
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: 'object',
|
|
51
|
+
properties: {
|
|
52
|
+
template: { type: 'string', description: 'Template name to run' },
|
|
53
|
+
file: { type: 'string', description: 'Workflow file path' },
|
|
54
|
+
task: { type: 'string', description: 'Task description' },
|
|
55
|
+
options: {
|
|
56
|
+
type: 'object',
|
|
57
|
+
description: 'Workflow options',
|
|
58
|
+
properties: {
|
|
59
|
+
parallel: { type: 'boolean', description: 'Run stages in parallel' },
|
|
60
|
+
maxAgents: { type: 'number', description: 'Maximum agents to use' },
|
|
61
|
+
timeout: { type: 'number', description: 'Timeout in seconds' },
|
|
62
|
+
dryRun: { type: 'boolean', description: 'Validate without executing' },
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
handler: async (input) => {
|
|
68
|
+
// Validate user-provided input (#1425)
|
|
69
|
+
if (input.template) {
|
|
70
|
+
const v = validateIdentifier(input.template, 'template');
|
|
71
|
+
if (!v.valid)
|
|
72
|
+
return { success: false, error: v.error };
|
|
73
|
+
}
|
|
74
|
+
if (input.file) {
|
|
75
|
+
const v = validatePath(input.file, 'file');
|
|
76
|
+
if (!v.valid)
|
|
77
|
+
return { success: false, error: v.error };
|
|
78
|
+
}
|
|
79
|
+
if (input.task) {
|
|
80
|
+
const v = validateText(input.task, 'task');
|
|
81
|
+
if (!v.valid)
|
|
82
|
+
return { success: false, error: v.error };
|
|
83
|
+
}
|
|
84
|
+
const store = loadWorkflowStore();
|
|
85
|
+
const template = input.template;
|
|
86
|
+
const task = input.task;
|
|
87
|
+
const options = input.options || {};
|
|
88
|
+
const dryRun = options.dryRun;
|
|
89
|
+
// Build workflow from template or inline
|
|
90
|
+
const workflowId = `workflow-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
91
|
+
const stages = [];
|
|
92
|
+
// Generate stages based on template
|
|
93
|
+
const templateName = template || 'custom';
|
|
94
|
+
const stageNames = (() => {
|
|
95
|
+
switch (templateName) {
|
|
96
|
+
case 'feature':
|
|
97
|
+
return ['Research', 'Design', 'Implement', 'Test', 'Review'];
|
|
98
|
+
case 'bugfix':
|
|
99
|
+
return ['Investigate', 'Fix', 'Test', 'Review'];
|
|
100
|
+
case 'refactor':
|
|
101
|
+
return ['Analyze', 'Refactor', 'Test', 'Review'];
|
|
102
|
+
case 'security':
|
|
103
|
+
return ['Scan', 'Analyze', 'Report'];
|
|
104
|
+
default:
|
|
105
|
+
return ['Execute'];
|
|
106
|
+
}
|
|
107
|
+
})();
|
|
108
|
+
for (const name of stageNames) {
|
|
109
|
+
stages.push({
|
|
110
|
+
name,
|
|
111
|
+
status: dryRun ? 'validated' : 'pending',
|
|
112
|
+
agents: [],
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (!dryRun) {
|
|
116
|
+
// Create and save the workflow
|
|
117
|
+
const steps = stageNames.map((name, i) => ({
|
|
118
|
+
stepId: `step-${i + 1}`,
|
|
119
|
+
name,
|
|
120
|
+
type: 'task',
|
|
121
|
+
config: { task: task || name },
|
|
122
|
+
status: 'pending',
|
|
123
|
+
}));
|
|
124
|
+
const workflow = {
|
|
125
|
+
workflowId,
|
|
126
|
+
name: task || `${templateName} workflow`,
|
|
127
|
+
description: task,
|
|
128
|
+
steps,
|
|
129
|
+
status: 'running',
|
|
130
|
+
currentStep: 0,
|
|
131
|
+
variables: { template: templateName, ...options },
|
|
132
|
+
createdAt: new Date().toISOString(),
|
|
133
|
+
startedAt: new Date().toISOString(),
|
|
134
|
+
};
|
|
135
|
+
store.workflows[workflowId] = workflow;
|
|
136
|
+
saveWorkflowStore(store);
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
workflowId,
|
|
140
|
+
template: templateName,
|
|
141
|
+
status: dryRun ? 'validated' : 'running',
|
|
142
|
+
stages,
|
|
143
|
+
metrics: {
|
|
144
|
+
totalStages: stages.length,
|
|
145
|
+
completedStages: 0,
|
|
146
|
+
agentsSpawned: 0,
|
|
147
|
+
estimatedDuration: `${stages.length * 30}s`,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'workflow_create',
|
|
154
|
+
description: 'Create a new workflow Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
155
|
+
category: 'workflow',
|
|
156
|
+
inputSchema: {
|
|
157
|
+
type: 'object',
|
|
158
|
+
properties: {
|
|
159
|
+
name: { type: 'string', description: 'Workflow name' },
|
|
160
|
+
description: { type: 'string', description: 'Workflow description' },
|
|
161
|
+
steps: {
|
|
162
|
+
type: 'array',
|
|
163
|
+
description: 'Workflow steps',
|
|
164
|
+
items: {
|
|
165
|
+
type: 'object',
|
|
166
|
+
properties: {
|
|
167
|
+
name: { type: 'string' },
|
|
168
|
+
type: { type: 'string', enum: ['task', 'condition', 'parallel', 'loop', 'wait'] },
|
|
169
|
+
config: { type: 'object' },
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
variables: { type: 'object', description: 'Initial variables' },
|
|
174
|
+
},
|
|
175
|
+
required: ['name'],
|
|
176
|
+
},
|
|
177
|
+
handler: async (input) => {
|
|
178
|
+
// Validate user-provided input (#1425)
|
|
179
|
+
const vName = validateText(input.name, 'name', 256);
|
|
180
|
+
if (!vName.valid)
|
|
181
|
+
return { success: false, error: vName.error };
|
|
182
|
+
if (input.description) {
|
|
183
|
+
const v = validateText(input.description, 'description');
|
|
184
|
+
if (!v.valid)
|
|
185
|
+
return { success: false, error: v.error };
|
|
186
|
+
}
|
|
187
|
+
const store = loadWorkflowStore();
|
|
188
|
+
const workflowId = `workflow-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
189
|
+
const steps = (input.steps || []).map((s, i) => ({
|
|
190
|
+
stepId: `step-${i + 1}`,
|
|
191
|
+
name: s.name || `Step ${i + 1}`,
|
|
192
|
+
type: s.type || 'task',
|
|
193
|
+
config: s.config || {},
|
|
194
|
+
status: 'pending',
|
|
195
|
+
}));
|
|
196
|
+
const workflow = {
|
|
197
|
+
workflowId,
|
|
198
|
+
name: input.name,
|
|
199
|
+
description: input.description,
|
|
200
|
+
steps,
|
|
201
|
+
status: steps.length > 0 ? 'ready' : 'draft',
|
|
202
|
+
currentStep: 0,
|
|
203
|
+
variables: input.variables || {},
|
|
204
|
+
createdAt: new Date().toISOString(),
|
|
205
|
+
};
|
|
206
|
+
store.workflows[workflowId] = workflow;
|
|
207
|
+
saveWorkflowStore(store);
|
|
208
|
+
return {
|
|
209
|
+
workflowId,
|
|
210
|
+
name: workflow.name,
|
|
211
|
+
status: workflow.status,
|
|
212
|
+
stepCount: steps.length,
|
|
213
|
+
createdAt: workflow.createdAt,
|
|
214
|
+
};
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'workflow_execute',
|
|
219
|
+
description: 'Execute a workflow Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
220
|
+
category: 'workflow',
|
|
221
|
+
inputSchema: {
|
|
222
|
+
type: 'object',
|
|
223
|
+
properties: {
|
|
224
|
+
workflowId: { type: 'string', description: 'Workflow ID to execute' },
|
|
225
|
+
variables: { type: 'object', description: 'Runtime variables to inject' },
|
|
226
|
+
startFromStep: { type: 'number', description: 'Step to start from (0-indexed)' },
|
|
227
|
+
},
|
|
228
|
+
required: ['workflowId'],
|
|
229
|
+
},
|
|
230
|
+
handler: async (input) => {
|
|
231
|
+
// Validate user-provided input (#1425)
|
|
232
|
+
const vId = validateIdentifier(input.workflowId, 'workflowId');
|
|
233
|
+
if (!vId.valid)
|
|
234
|
+
return { success: false, error: vId.error };
|
|
235
|
+
const store = loadWorkflowStore();
|
|
236
|
+
const workflowId = input.workflowId;
|
|
237
|
+
const workflow = store.workflows[workflowId];
|
|
238
|
+
if (!workflow) {
|
|
239
|
+
return { workflowId, error: 'Workflow not found' };
|
|
240
|
+
}
|
|
241
|
+
if (workflow.status === 'running') {
|
|
242
|
+
return { workflowId, error: 'Workflow already running' };
|
|
243
|
+
}
|
|
244
|
+
// Inject runtime variables
|
|
245
|
+
if (input.variables) {
|
|
246
|
+
workflow.variables = { ...workflow.variables, ...input.variables };
|
|
247
|
+
}
|
|
248
|
+
workflow.status = 'running';
|
|
249
|
+
workflow.startedAt = new Date().toISOString();
|
|
250
|
+
workflow.currentStep = input.startFromStep || 0;
|
|
251
|
+
saveWorkflowStore(store);
|
|
252
|
+
// ADR-095 G3: real workflow runtime. Walk the steps in order;
|
|
253
|
+
// dispatch each by type. Persist progress after each step so a
|
|
254
|
+
// crash or pause can resume cleanly. No mock — task steps make
|
|
255
|
+
// real LLM calls via agent_execute (G1's wire).
|
|
256
|
+
const stepResults = [];
|
|
257
|
+
// Variable substitution: {{name}} → workflow.variables[name] OR steps[stepId].output
|
|
258
|
+
const interp = (text) => {
|
|
259
|
+
return text.replace(/\{\{\s*([a-zA-Z_][\w.]*)\s*\}\}/g, (_, key) => {
|
|
260
|
+
// Direct variable
|
|
261
|
+
if (key in workflow.variables)
|
|
262
|
+
return String(workflow.variables[key]);
|
|
263
|
+
// Step-output reference: stepId.output
|
|
264
|
+
const dot = key.indexOf('.');
|
|
265
|
+
if (dot > 0) {
|
|
266
|
+
const stepId = key.slice(0, dot);
|
|
267
|
+
const field = key.slice(dot + 1);
|
|
268
|
+
const prior = stepResults.find(s => s.stepId === stepId);
|
|
269
|
+
if (prior && field === 'output' && typeof prior.output === 'string')
|
|
270
|
+
return prior.output;
|
|
271
|
+
}
|
|
272
|
+
return '';
|
|
273
|
+
});
|
|
274
|
+
};
|
|
275
|
+
const startedAt = Date.now();
|
|
276
|
+
let i = workflow.currentStep;
|
|
277
|
+
while (i < workflow.steps.length) {
|
|
278
|
+
// Honor pause/cancel signals between steps.
|
|
279
|
+
const live = loadWorkflowStore().workflows[workflowId];
|
|
280
|
+
if (!live || live.status === 'paused') {
|
|
281
|
+
workflow.status = 'paused';
|
|
282
|
+
workflow.currentStep = i;
|
|
283
|
+
saveWorkflowStore(store);
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
if (live.status === 'failed') {
|
|
287
|
+
workflow.status = 'failed';
|
|
288
|
+
saveWorkflowStore(store);
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
const step = workflow.steps[i];
|
|
292
|
+
step.status = 'running';
|
|
293
|
+
step.startedAt = new Date().toISOString();
|
|
294
|
+
const stepStart = Date.now();
|
|
295
|
+
saveWorkflowStore(store);
|
|
296
|
+
let stepEntry = { stepId: step.stepId, type: step.type, status: 'running' };
|
|
297
|
+
try {
|
|
298
|
+
if (step.type === 'task') {
|
|
299
|
+
const cfg = step.config;
|
|
300
|
+
const agentId = cfg.agentId || workflow.variables.defaultAgentId;
|
|
301
|
+
const promptTpl = cfg.prompt || step.name;
|
|
302
|
+
if (!agentId)
|
|
303
|
+
throw new Error(`task step ${step.stepId} requires config.agentId or workflow.variables.defaultAgentId`);
|
|
304
|
+
const prompt = interp(promptTpl);
|
|
305
|
+
const result = await executeAgentTask({
|
|
306
|
+
agentId,
|
|
307
|
+
prompt,
|
|
308
|
+
systemPrompt: cfg.systemPrompt ? interp(String(cfg.systemPrompt)) : undefined,
|
|
309
|
+
maxTokens: cfg.maxTokens,
|
|
310
|
+
temperature: cfg.temperature,
|
|
311
|
+
timeoutMs: cfg.timeoutMs,
|
|
312
|
+
});
|
|
313
|
+
if (!result.success)
|
|
314
|
+
throw new Error(result.error || 'agent_execute failed');
|
|
315
|
+
step.result = result;
|
|
316
|
+
workflow.variables[`${step.stepId}.output`] = result.output;
|
|
317
|
+
workflow.variables.lastStepOutput = result.output;
|
|
318
|
+
stepEntry = { stepId: step.stepId, type: 'task', status: 'completed', durationMs: result.durationMs, output: result.output };
|
|
319
|
+
}
|
|
320
|
+
else if (step.type === 'wait') {
|
|
321
|
+
const cfg = step.config;
|
|
322
|
+
const ms = Math.min(Math.max(0, cfg.ms || 0), 60000);
|
|
323
|
+
await new Promise(r => setTimeout(r, ms));
|
|
324
|
+
step.result = { waitedMs: ms };
|
|
325
|
+
stepEntry = { stepId: step.stepId, type: 'wait', status: 'completed', durationMs: ms };
|
|
326
|
+
}
|
|
327
|
+
else if (step.type === 'condition') {
|
|
328
|
+
// Simple condition: config.when is a JS expression evaluated against workflow.variables.
|
|
329
|
+
// For safety, we only support `var === 'value'` or `var === number`.
|
|
330
|
+
const cfg = step.config;
|
|
331
|
+
const expr = String(cfg.when || 'true').trim();
|
|
332
|
+
const m = expr.match(/^([a-zA-Z_][\w]*)\s*===?\s*(['\"])?([^'\"]*)\2?$/);
|
|
333
|
+
let truthy = false;
|
|
334
|
+
if (m) {
|
|
335
|
+
const v = workflow.variables[m[1]];
|
|
336
|
+
const expected = m[2] ? m[3] : Number(m[3]);
|
|
337
|
+
truthy = v === expected;
|
|
338
|
+
}
|
|
339
|
+
else if (expr === 'true')
|
|
340
|
+
truthy = true;
|
|
341
|
+
step.result = { conditionExpr: expr, truthy };
|
|
342
|
+
// condition can declare a target step index to jump to via cfg.thenStep / cfg.elseStep
|
|
343
|
+
if (typeof cfg.thenStep === 'number' && truthy)
|
|
344
|
+
i = cfg.thenStep - 1;
|
|
345
|
+
if (typeof cfg.elseStep === 'number' && !truthy)
|
|
346
|
+
i = cfg.elseStep - 1;
|
|
347
|
+
stepEntry = { stepId: step.stepId, type: 'condition', status: 'completed' };
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
// parallel/loop are deferred — mark skipped honestly rather than mock-completing.
|
|
351
|
+
step.result = { _note: `step type '${step.type}' not yet implemented in runtime` };
|
|
352
|
+
stepEntry = { stepId: step.stepId, type: step.type, status: 'skipped' };
|
|
353
|
+
}
|
|
354
|
+
step.status = stepEntry.status === 'skipped' ? 'skipped' : 'completed';
|
|
355
|
+
step.completedAt = new Date().toISOString();
|
|
356
|
+
}
|
|
357
|
+
catch (err) {
|
|
358
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
359
|
+
step.status = 'failed';
|
|
360
|
+
step.result = { error: msg };
|
|
361
|
+
step.completedAt = new Date().toISOString();
|
|
362
|
+
stepEntry = { stepId: step.stepId, type: step.type, status: 'failed', durationMs: Date.now() - stepStart, error: msg };
|
|
363
|
+
stepResults.push(stepEntry);
|
|
364
|
+
workflow.status = 'failed';
|
|
365
|
+
workflow.error = msg;
|
|
366
|
+
workflow.completedAt = new Date().toISOString();
|
|
367
|
+
saveWorkflowStore(store);
|
|
368
|
+
return {
|
|
369
|
+
workflowId,
|
|
370
|
+
status: 'failed',
|
|
371
|
+
error: msg,
|
|
372
|
+
failedStep: step.stepId,
|
|
373
|
+
stepsCompleted: stepResults.filter(s => s.status === 'completed').length,
|
|
374
|
+
results: stepResults,
|
|
375
|
+
durationMs: Date.now() - startedAt,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
if (typeof stepEntry.durationMs !== 'number')
|
|
379
|
+
stepEntry.durationMs = Date.now() - stepStart;
|
|
380
|
+
stepResults.push(stepEntry);
|
|
381
|
+
workflow.currentStep = i + 1;
|
|
382
|
+
saveWorkflowStore(store);
|
|
383
|
+
i++;
|
|
384
|
+
}
|
|
385
|
+
if (workflow.status === 'running') {
|
|
386
|
+
workflow.status = 'completed';
|
|
387
|
+
workflow.completedAt = new Date().toISOString();
|
|
388
|
+
saveWorkflowStore(store);
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
workflowId,
|
|
392
|
+
status: workflow.status,
|
|
393
|
+
totalSteps: workflow.steps.length,
|
|
394
|
+
stepsCompleted: stepResults.filter(s => s.status === 'completed').length,
|
|
395
|
+
stepsSkipped: stepResults.filter(s => s.status === 'skipped').length,
|
|
396
|
+
stepsFailed: stepResults.filter(s => s.status === 'failed').length,
|
|
397
|
+
results: stepResults,
|
|
398
|
+
startedAt: workflow.startedAt,
|
|
399
|
+
completedAt: workflow.completedAt,
|
|
400
|
+
durationMs: Date.now() - startedAt,
|
|
401
|
+
};
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
name: 'workflow_status',
|
|
406
|
+
description: 'Get workflow status Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
407
|
+
category: 'workflow',
|
|
408
|
+
inputSchema: {
|
|
409
|
+
type: 'object',
|
|
410
|
+
properties: {
|
|
411
|
+
workflowId: { type: 'string', description: 'Workflow ID' },
|
|
412
|
+
verbose: { type: 'boolean', description: 'Include step details' },
|
|
413
|
+
},
|
|
414
|
+
required: ['workflowId'],
|
|
415
|
+
},
|
|
416
|
+
handler: async (input) => {
|
|
417
|
+
// Validate user-provided input (#1425)
|
|
418
|
+
const vId = validateIdentifier(input.workflowId, 'workflowId');
|
|
419
|
+
if (!vId.valid)
|
|
420
|
+
return { success: false, error: vId.error };
|
|
421
|
+
const store = loadWorkflowStore();
|
|
422
|
+
const workflowId = input.workflowId;
|
|
423
|
+
const workflow = store.workflows[workflowId];
|
|
424
|
+
if (!workflow) {
|
|
425
|
+
return { workflowId, error: 'Workflow not found' };
|
|
426
|
+
}
|
|
427
|
+
const completedSteps = workflow.steps.filter(s => s.status === 'completed').length;
|
|
428
|
+
const progress = workflow.steps.length > 0 ? (completedSteps / workflow.steps.length) * 100 : 0;
|
|
429
|
+
const status = {
|
|
430
|
+
workflowId: workflow.workflowId,
|
|
431
|
+
name: workflow.name,
|
|
432
|
+
status: workflow.status,
|
|
433
|
+
progress,
|
|
434
|
+
currentStep: workflow.currentStep,
|
|
435
|
+
totalSteps: workflow.steps.length,
|
|
436
|
+
completedSteps,
|
|
437
|
+
createdAt: workflow.createdAt,
|
|
438
|
+
startedAt: workflow.startedAt,
|
|
439
|
+
completedAt: workflow.completedAt,
|
|
440
|
+
};
|
|
441
|
+
if (input.verbose) {
|
|
442
|
+
return {
|
|
443
|
+
...status,
|
|
444
|
+
description: workflow.description,
|
|
445
|
+
variables: workflow.variables,
|
|
446
|
+
steps: workflow.steps.map(s => ({
|
|
447
|
+
stepId: s.stepId,
|
|
448
|
+
name: s.name,
|
|
449
|
+
type: s.type,
|
|
450
|
+
status: s.status,
|
|
451
|
+
startedAt: s.startedAt,
|
|
452
|
+
completedAt: s.completedAt,
|
|
453
|
+
})),
|
|
454
|
+
error: workflow.error,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
return status;
|
|
458
|
+
},
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
name: 'workflow_list',
|
|
462
|
+
description: 'List all workflows Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
463
|
+
category: 'workflow',
|
|
464
|
+
inputSchema: {
|
|
465
|
+
type: 'object',
|
|
466
|
+
properties: {
|
|
467
|
+
status: { type: 'string', description: 'Filter by status' },
|
|
468
|
+
limit: { type: 'number', description: 'Max workflows to return' },
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
handler: async (input) => {
|
|
472
|
+
// Validate user-provided input (#1425)
|
|
473
|
+
if (input.status) {
|
|
474
|
+
const v = validateIdentifier(input.status, 'status');
|
|
475
|
+
if (!v.valid)
|
|
476
|
+
return { success: false, error: v.error };
|
|
477
|
+
}
|
|
478
|
+
const store = loadWorkflowStore();
|
|
479
|
+
let workflows = Object.values(store.workflows);
|
|
480
|
+
// Apply filters
|
|
481
|
+
if (input.status) {
|
|
482
|
+
workflows = workflows.filter(w => w.status === input.status);
|
|
483
|
+
}
|
|
484
|
+
// Sort by creation date (newest first)
|
|
485
|
+
workflows.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
486
|
+
// Apply limit
|
|
487
|
+
const limit = input.limit || 20;
|
|
488
|
+
workflows = workflows.slice(0, limit);
|
|
489
|
+
return {
|
|
490
|
+
workflows: workflows.map(w => ({
|
|
491
|
+
workflowId: w.workflowId,
|
|
492
|
+
name: w.name,
|
|
493
|
+
status: w.status,
|
|
494
|
+
stepCount: w.steps.length,
|
|
495
|
+
createdAt: w.createdAt,
|
|
496
|
+
completedAt: w.completedAt,
|
|
497
|
+
})),
|
|
498
|
+
total: workflows.length,
|
|
499
|
+
filters: { status: input.status },
|
|
500
|
+
};
|
|
501
|
+
},
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
name: 'workflow_pause',
|
|
505
|
+
description: 'Pause a running workflow Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
506
|
+
category: 'workflow',
|
|
507
|
+
inputSchema: {
|
|
508
|
+
type: 'object',
|
|
509
|
+
properties: {
|
|
510
|
+
workflowId: { type: 'string', description: 'Workflow ID' },
|
|
511
|
+
},
|
|
512
|
+
required: ['workflowId'],
|
|
513
|
+
},
|
|
514
|
+
handler: async (input) => {
|
|
515
|
+
// Validate user-provided input (#1425)
|
|
516
|
+
const vId = validateIdentifier(input.workflowId, 'workflowId');
|
|
517
|
+
if (!vId.valid)
|
|
518
|
+
return { success: false, error: vId.error };
|
|
519
|
+
const store = loadWorkflowStore();
|
|
520
|
+
const workflowId = input.workflowId;
|
|
521
|
+
const workflow = store.workflows[workflowId];
|
|
522
|
+
if (!workflow) {
|
|
523
|
+
return { workflowId, error: 'Workflow not found' };
|
|
524
|
+
}
|
|
525
|
+
if (workflow.status !== 'running') {
|
|
526
|
+
return { workflowId, error: 'Workflow not running' };
|
|
527
|
+
}
|
|
528
|
+
workflow.status = 'paused';
|
|
529
|
+
saveWorkflowStore(store);
|
|
530
|
+
return {
|
|
531
|
+
workflowId,
|
|
532
|
+
status: workflow.status,
|
|
533
|
+
pausedAt: new Date().toISOString(),
|
|
534
|
+
currentStep: workflow.currentStep,
|
|
535
|
+
};
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
name: 'workflow_resume',
|
|
540
|
+
description: 'Resume a paused workflow Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
541
|
+
category: 'workflow',
|
|
542
|
+
inputSchema: {
|
|
543
|
+
type: 'object',
|
|
544
|
+
properties: {
|
|
545
|
+
workflowId: { type: 'string', description: 'Workflow ID' },
|
|
546
|
+
},
|
|
547
|
+
required: ['workflowId'],
|
|
548
|
+
},
|
|
549
|
+
handler: async (input) => {
|
|
550
|
+
// Validate user-provided input (#1425)
|
|
551
|
+
const vId = validateIdentifier(input.workflowId, 'workflowId');
|
|
552
|
+
if (!vId.valid)
|
|
553
|
+
return { success: false, error: vId.error };
|
|
554
|
+
const store = loadWorkflowStore();
|
|
555
|
+
const workflowId = input.workflowId;
|
|
556
|
+
const workflow = store.workflows[workflowId];
|
|
557
|
+
if (!workflow) {
|
|
558
|
+
return { workflowId, error: 'Workflow not found' };
|
|
559
|
+
}
|
|
560
|
+
if (workflow.status !== 'paused') {
|
|
561
|
+
return { workflowId, error: 'Workflow not paused' };
|
|
562
|
+
}
|
|
563
|
+
workflow.status = 'running';
|
|
564
|
+
saveWorkflowStore(store);
|
|
565
|
+
// Report current step states — do not auto-complete them
|
|
566
|
+
const stepStates = workflow.steps.map(step => ({
|
|
567
|
+
stepId: step.stepId,
|
|
568
|
+
name: step.name,
|
|
569
|
+
status: step.status,
|
|
570
|
+
}));
|
|
571
|
+
const remainingSteps = workflow.steps.length - workflow.currentStep;
|
|
572
|
+
return {
|
|
573
|
+
workflowId,
|
|
574
|
+
status: workflow.status,
|
|
575
|
+
resumed: true,
|
|
576
|
+
currentStep: workflow.currentStep,
|
|
577
|
+
remainingSteps,
|
|
578
|
+
steps: stepStates,
|
|
579
|
+
_note: 'Workflow resumed. Steps remain in their current state and must be executed via task tools.',
|
|
580
|
+
};
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
name: 'workflow_cancel',
|
|
585
|
+
description: 'Cancel a workflow Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
586
|
+
category: 'workflow',
|
|
587
|
+
inputSchema: {
|
|
588
|
+
type: 'object',
|
|
589
|
+
properties: {
|
|
590
|
+
workflowId: { type: 'string', description: 'Workflow ID' },
|
|
591
|
+
reason: { type: 'string', description: 'Cancellation reason' },
|
|
592
|
+
},
|
|
593
|
+
required: ['workflowId'],
|
|
594
|
+
},
|
|
595
|
+
handler: async (input) => {
|
|
596
|
+
// Validate user-provided input (#1425)
|
|
597
|
+
const vId = validateIdentifier(input.workflowId, 'workflowId');
|
|
598
|
+
if (!vId.valid)
|
|
599
|
+
return { success: false, error: vId.error };
|
|
600
|
+
if (input.reason) {
|
|
601
|
+
const v = validateText(input.reason, 'reason');
|
|
602
|
+
if (!v.valid)
|
|
603
|
+
return { success: false, error: v.error };
|
|
604
|
+
}
|
|
605
|
+
const store = loadWorkflowStore();
|
|
606
|
+
const workflowId = input.workflowId;
|
|
607
|
+
const workflow = store.workflows[workflowId];
|
|
608
|
+
if (!workflow) {
|
|
609
|
+
return { workflowId, error: 'Workflow not found' };
|
|
610
|
+
}
|
|
611
|
+
if (workflow.status === 'completed' || workflow.status === 'failed') {
|
|
612
|
+
return { workflowId, error: 'Workflow already finished' };
|
|
613
|
+
}
|
|
614
|
+
workflow.status = 'failed';
|
|
615
|
+
workflow.error = input.reason || 'Cancelled by user';
|
|
616
|
+
workflow.completedAt = new Date().toISOString();
|
|
617
|
+
// Mark remaining steps as skipped
|
|
618
|
+
for (let i = workflow.currentStep; i < workflow.steps.length; i++) {
|
|
619
|
+
workflow.steps[i].status = 'skipped';
|
|
620
|
+
}
|
|
621
|
+
saveWorkflowStore(store);
|
|
622
|
+
return {
|
|
623
|
+
workflowId,
|
|
624
|
+
status: workflow.status,
|
|
625
|
+
cancelledAt: workflow.completedAt,
|
|
626
|
+
reason: workflow.error,
|
|
627
|
+
skippedSteps: workflow.steps.length - workflow.currentStep,
|
|
628
|
+
};
|
|
629
|
+
},
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
name: 'workflow_delete',
|
|
633
|
+
description: 'Delete a workflow Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
634
|
+
category: 'workflow',
|
|
635
|
+
inputSchema: {
|
|
636
|
+
type: 'object',
|
|
637
|
+
properties: {
|
|
638
|
+
workflowId: { type: 'string', description: 'Workflow ID' },
|
|
639
|
+
},
|
|
640
|
+
required: ['workflowId'],
|
|
641
|
+
},
|
|
642
|
+
handler: async (input) => {
|
|
643
|
+
// Validate user-provided input (#1425)
|
|
644
|
+
const vId = validateIdentifier(input.workflowId, 'workflowId');
|
|
645
|
+
if (!vId.valid)
|
|
646
|
+
return { success: false, error: vId.error };
|
|
647
|
+
const store = loadWorkflowStore();
|
|
648
|
+
const workflowId = input.workflowId;
|
|
649
|
+
if (!store.workflows[workflowId]) {
|
|
650
|
+
return { workflowId, error: 'Workflow not found' };
|
|
651
|
+
}
|
|
652
|
+
const workflow = store.workflows[workflowId];
|
|
653
|
+
if (workflow.status === 'running') {
|
|
654
|
+
return { workflowId, error: 'Cannot delete running workflow' };
|
|
655
|
+
}
|
|
656
|
+
delete store.workflows[workflowId];
|
|
657
|
+
saveWorkflowStore(store);
|
|
658
|
+
return {
|
|
659
|
+
workflowId,
|
|
660
|
+
deleted: true,
|
|
661
|
+
deletedAt: new Date().toISOString(),
|
|
662
|
+
};
|
|
663
|
+
},
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
name: 'workflow_template',
|
|
667
|
+
description: 'Save workflow as template or create from template Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, retry policy, pause/resume, and step-output binding across LLM-driven steps. For a single linear todo list, native TodoWrite is fine.',
|
|
668
|
+
category: 'workflow',
|
|
669
|
+
inputSchema: {
|
|
670
|
+
type: 'object',
|
|
671
|
+
properties: {
|
|
672
|
+
action: { type: 'string', enum: ['save', 'create', 'list'], description: 'Template action' },
|
|
673
|
+
workflowId: { type: 'string', description: 'Workflow ID (for save)' },
|
|
674
|
+
templateId: { type: 'string', description: 'Template ID (for create)' },
|
|
675
|
+
templateName: { type: 'string', description: 'Template name (for save)' },
|
|
676
|
+
newName: { type: 'string', description: 'New workflow name (for create)' },
|
|
677
|
+
},
|
|
678
|
+
required: ['action'],
|
|
679
|
+
},
|
|
680
|
+
handler: async (input) => {
|
|
681
|
+
// Validate user-provided input (#1425)
|
|
682
|
+
if (input.workflowId) {
|
|
683
|
+
const v = validateIdentifier(input.workflowId, 'workflowId');
|
|
684
|
+
if (!v.valid)
|
|
685
|
+
return { success: false, error: v.error };
|
|
686
|
+
}
|
|
687
|
+
if (input.templateId) {
|
|
688
|
+
const v = validateIdentifier(input.templateId, 'templateId');
|
|
689
|
+
if (!v.valid)
|
|
690
|
+
return { success: false, error: v.error };
|
|
691
|
+
}
|
|
692
|
+
if (input.templateName) {
|
|
693
|
+
const v = validateText(input.templateName, 'templateName', 256);
|
|
694
|
+
if (!v.valid)
|
|
695
|
+
return { success: false, error: v.error };
|
|
696
|
+
}
|
|
697
|
+
if (input.newName) {
|
|
698
|
+
const v = validateText(input.newName, 'newName', 256);
|
|
699
|
+
if (!v.valid)
|
|
700
|
+
return { success: false, error: v.error };
|
|
701
|
+
}
|
|
702
|
+
const store = loadWorkflowStore();
|
|
703
|
+
const action = input.action;
|
|
704
|
+
if (action === 'save') {
|
|
705
|
+
const workflow = store.workflows[input.workflowId];
|
|
706
|
+
if (!workflow) {
|
|
707
|
+
return { action, error: 'Workflow not found' };
|
|
708
|
+
}
|
|
709
|
+
const templateId = `template-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
710
|
+
const template = {
|
|
711
|
+
...workflow,
|
|
712
|
+
workflowId: templateId,
|
|
713
|
+
name: input.templateName || `${workflow.name} Template`,
|
|
714
|
+
status: 'draft',
|
|
715
|
+
currentStep: 0,
|
|
716
|
+
createdAt: new Date().toISOString(),
|
|
717
|
+
startedAt: undefined,
|
|
718
|
+
completedAt: undefined,
|
|
719
|
+
};
|
|
720
|
+
// Reset step statuses
|
|
721
|
+
template.steps = template.steps.map(s => ({
|
|
722
|
+
...s,
|
|
723
|
+
status: 'pending',
|
|
724
|
+
result: undefined,
|
|
725
|
+
startedAt: undefined,
|
|
726
|
+
completedAt: undefined,
|
|
727
|
+
}));
|
|
728
|
+
store.templates[templateId] = template;
|
|
729
|
+
saveWorkflowStore(store);
|
|
730
|
+
return {
|
|
731
|
+
action,
|
|
732
|
+
templateId,
|
|
733
|
+
name: template.name,
|
|
734
|
+
savedAt: new Date().toISOString(),
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
if (action === 'create') {
|
|
738
|
+
const template = store.templates[input.templateId];
|
|
739
|
+
if (!template) {
|
|
740
|
+
return { action, error: 'Template not found' };
|
|
741
|
+
}
|
|
742
|
+
const workflowId = `workflow-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
743
|
+
const workflow = {
|
|
744
|
+
...template,
|
|
745
|
+
workflowId,
|
|
746
|
+
name: input.newName || template.name.replace(' Template', ''),
|
|
747
|
+
status: 'ready',
|
|
748
|
+
createdAt: new Date().toISOString(),
|
|
749
|
+
};
|
|
750
|
+
store.workflows[workflowId] = workflow;
|
|
751
|
+
saveWorkflowStore(store);
|
|
752
|
+
return {
|
|
753
|
+
action,
|
|
754
|
+
workflowId,
|
|
755
|
+
name: workflow.name,
|
|
756
|
+
fromTemplate: input.templateId,
|
|
757
|
+
createdAt: workflow.createdAt,
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
if (action === 'list') {
|
|
761
|
+
return {
|
|
762
|
+
action,
|
|
763
|
+
templates: Object.values(store.templates).map(t => ({
|
|
764
|
+
templateId: t.workflowId,
|
|
765
|
+
name: t.name,
|
|
766
|
+
stepCount: t.steps.length,
|
|
767
|
+
createdAt: t.createdAt,
|
|
768
|
+
})),
|
|
769
|
+
total: Object.keys(store.templates).length,
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
return { action, error: 'Unknown action' };
|
|
773
|
+
},
|
|
774
|
+
},
|
|
775
|
+
{
|
|
776
|
+
// #1916: `ruflo workflow stop <id>` referenced an unregistered
|
|
777
|
+
// `workflow_stop` tool. Equivalent to workflow_cancel but returns the
|
|
778
|
+
// shape the CLI expects (`{ workflowId, stopped, stoppedAt }`).
|
|
779
|
+
name: 'workflow_stop',
|
|
780
|
+
description: 'Stop a running/paused workflow and skip its remaining steps. Use when native TodoWrite + sequential Bash is wrong because the work has a real dependency graph that needs persistence, pause/resume, and step-output binding — and you need to halt it cleanly mid-run. For a single linear todo list, native TodoWrite is fine. (Same effect as workflow_cancel; this name is what the CLI `workflow stop` subcommand calls.)',
|
|
781
|
+
category: 'workflow',
|
|
782
|
+
inputSchema: {
|
|
783
|
+
type: 'object',
|
|
784
|
+
properties: {
|
|
785
|
+
workflowId: { type: 'string', description: 'Workflow ID' },
|
|
786
|
+
graceful: { type: 'boolean', description: 'Let the current step finish (advisory)' },
|
|
787
|
+
},
|
|
788
|
+
required: ['workflowId'],
|
|
789
|
+
},
|
|
790
|
+
handler: async (input) => {
|
|
791
|
+
const vId = validateIdentifier(input.workflowId, 'workflowId');
|
|
792
|
+
if (!vId.valid)
|
|
793
|
+
return { success: false, error: vId.error };
|
|
794
|
+
const store = loadWorkflowStore();
|
|
795
|
+
const workflowId = input.workflowId;
|
|
796
|
+
const workflow = store.workflows[workflowId];
|
|
797
|
+
if (!workflow)
|
|
798
|
+
return { workflowId, error: 'Workflow not found' };
|
|
799
|
+
if (workflow.status === 'completed' || workflow.status === 'failed') {
|
|
800
|
+
return { workflowId, error: 'Workflow already finished' };
|
|
801
|
+
}
|
|
802
|
+
workflow.status = 'failed';
|
|
803
|
+
workflow.error = 'Stopped by user';
|
|
804
|
+
workflow.completedAt = new Date().toISOString();
|
|
805
|
+
for (let i = workflow.currentStep; i < workflow.steps.length; i++) {
|
|
806
|
+
workflow.steps[i].status = 'skipped';
|
|
807
|
+
}
|
|
808
|
+
saveWorkflowStore(store);
|
|
809
|
+
return { workflowId, stopped: true, stoppedAt: workflow.completedAt };
|
|
810
|
+
},
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
// #1916: `ruflo workflow validate -f <file>` referenced an unregistered
|
|
814
|
+
// `workflow_validate` tool. Structural sanity check (JSON workflow files);
|
|
815
|
+
// a full schema validator is a follow-up.
|
|
816
|
+
name: 'workflow_validate',
|
|
817
|
+
description: 'Structurally validate a workflow definition file (JSON) — checks it has a steps/stages/tasks array and that each step names an agent. Use when native Read is wrong because you want a parsed, structured pass/fail with error/warning lists and step/agent counts rather than eyeballing the file. For just reading the file, native Read is fine. (Basic checks today — a full workflow-schema validator is a tracked follow-up.)',
|
|
818
|
+
category: 'workflow',
|
|
819
|
+
inputSchema: {
|
|
820
|
+
type: 'object',
|
|
821
|
+
properties: {
|
|
822
|
+
file: { type: 'string', description: 'Path to the workflow definition file' },
|
|
823
|
+
strict: { type: 'boolean', description: 'Treat warnings as errors' },
|
|
824
|
+
},
|
|
825
|
+
required: ['file'],
|
|
826
|
+
},
|
|
827
|
+
handler: async (input) => {
|
|
828
|
+
const file = String(input.file ?? '');
|
|
829
|
+
const errors = [];
|
|
830
|
+
const warnings = [];
|
|
831
|
+
let stages = 0;
|
|
832
|
+
let agents = 0;
|
|
833
|
+
try {
|
|
834
|
+
if (!file || !existsSync(file)) {
|
|
835
|
+
errors.push({ line: 0, message: `File not found: ${file || '(empty)'}`, severity: 'error' });
|
|
836
|
+
}
|
|
837
|
+
else {
|
|
838
|
+
const raw = readFileSync(file, 'utf-8');
|
|
839
|
+
let doc = null;
|
|
840
|
+
if (/\.ya?ml$/i.test(file)) {
|
|
841
|
+
warnings.push({ line: 0, message: 'YAML workflow files are not schema-validated yet — only JSON is fully checked (#1916 follow-up)' });
|
|
842
|
+
try {
|
|
843
|
+
doc = JSON.parse(raw);
|
|
844
|
+
}
|
|
845
|
+
catch { /* not JSON; leave doc null */ }
|
|
846
|
+
}
|
|
847
|
+
else {
|
|
848
|
+
doc = JSON.parse(raw);
|
|
849
|
+
}
|
|
850
|
+
const d = (doc ?? {});
|
|
851
|
+
const steps = (d.steps ?? d.stages ?? d.tasks);
|
|
852
|
+
if (!Array.isArray(steps)) {
|
|
853
|
+
errors.push({ line: 0, message: 'Workflow has no `steps` / `stages` / `tasks` array', severity: 'error' });
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
stages = steps.length;
|
|
857
|
+
const agentSet = new Set();
|
|
858
|
+
steps.forEach((s, i) => {
|
|
859
|
+
const step = (s ?? {});
|
|
860
|
+
const a = (step.agent ?? step.agentType ?? step.agent_type);
|
|
861
|
+
if (a)
|
|
862
|
+
agentSet.add(String(a));
|
|
863
|
+
else
|
|
864
|
+
warnings.push({ line: i + 1, message: `step ${i + 1} ("${step.name ?? step.id ?? i + 1}") names no agent` });
|
|
865
|
+
});
|
|
866
|
+
agents = agentSet.size;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
catch (e) {
|
|
871
|
+
errors.push({ line: 0, message: `Parse error: ${e.message}`, severity: 'error' });
|
|
872
|
+
}
|
|
873
|
+
const valid = errors.length === 0 && (!input.strict || warnings.length === 0);
|
|
874
|
+
return {
|
|
875
|
+
valid,
|
|
876
|
+
file,
|
|
877
|
+
errors,
|
|
878
|
+
warnings,
|
|
879
|
+
stats: { stages, agents, estimatedDuration: stages > 0 ? `~${stages * 30}s` : 'unknown' },
|
|
880
|
+
};
|
|
881
|
+
},
|
|
882
|
+
},
|
|
883
|
+
];
|
|
884
|
+
//# sourceMappingURL=workflow-tools.js.map
|