@probelabs/visor 0.1.106 → 0.1.107
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/README.md +65 -2
- package/action.yml +1 -1
- package/defaults/code-refiner.yaml +114 -0
- package/defaults/{.visor.yaml → code-review.yaml} +35 -226
- package/defaults/override.yaml +52 -0
- package/defaults/task-refinement.yaml +620 -0
- package/defaults/visor.tests.yaml +674 -0
- package/defaults/visor.yaml +482 -0
- package/dist/663.index.js +2 -3
- package/dist/80.index.js +2 -3
- package/dist/action-cli-bridge.d.ts +11 -82
- package/dist/action-cli-bridge.d.ts.map +1 -1
- package/dist/ai-review-service.d.ts +15 -0
- package/dist/ai-review-service.d.ts.map +1 -1
- package/dist/check-execution-engine.d.ts +19 -331
- package/dist/check-execution-engine.d.ts.map +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/cron-scheduler.d.ts +3 -3
- package/dist/cron-scheduler.d.ts.map +1 -1
- package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
- package/dist/defaults/code-refiner.yaml +114 -0
- package/dist/defaults/{.visor.yaml → code-review.yaml} +35 -226
- package/dist/defaults/override.yaml +52 -0
- package/dist/defaults/task-refinement.yaml +620 -0
- package/dist/defaults/visor.tests.yaml +674 -0
- package/dist/defaults/visor.yaml +482 -0
- package/dist/docs/DEPLOYMENT.md +118 -0
- package/dist/docs/GITHUB_CHECKS.md +280 -0
- package/dist/docs/NPM_USAGE.md +208 -0
- package/dist/docs/action-reference.md +19 -0
- package/dist/docs/advanced-ai.md +178 -0
- package/dist/docs/ai-configuration.md +468 -0
- package/dist/docs/author-permissions.md +610 -0
- package/dist/docs/ci-cli-mode.md +34 -0
- package/dist/docs/claude-code.md +74 -0
- package/dist/docs/command-provider.md +559 -0
- package/dist/docs/commands.md +8 -0
- package/dist/docs/configuration.md +303 -0
- package/dist/docs/custom-tools.md +424 -0
- package/dist/docs/dashboards/README.md +23 -0
- package/dist/docs/dashboards/grafana-visor-diagrams.json +20 -0
- package/dist/docs/dashboards/grafana-visor-overview.json +33 -0
- package/dist/docs/debug-visualizer-progress.md +572 -0
- package/dist/docs/debug-visualizer-rfc.md +691 -0
- package/dist/docs/debug-visualizer.md +114 -0
- package/dist/docs/debugging.md +636 -0
- package/dist/docs/default-output-schema.md +28 -0
- package/dist/docs/dependencies.md +369 -0
- package/dist/docs/dev-playbook.md +9 -0
- package/dist/docs/engine-state-machine-plan.md +333 -0
- package/dist/docs/event-driven-github-integration-rfc.md +743 -0
- package/dist/docs/event-triggers.md +292 -0
- package/dist/docs/execution-statistics-rfc.md +290 -0
- package/dist/docs/fact-validator-gap-analysis.md +178 -0
- package/dist/docs/fact-validator-implementation-plan.md +1235 -0
- package/dist/docs/fail-if.md +95 -0
- package/dist/docs/failure-conditions-implementation.md +271 -0
- package/dist/docs/failure-conditions-schema.md +173 -0
- package/dist/docs/failure-routing-rfc.md +193 -0
- package/dist/docs/failure-routing.md +507 -0
- package/dist/docs/foreach-dependency-propagation.md +473 -0
- package/dist/docs/github-ops.md +89 -0
- package/dist/docs/goto-forward-run-plan.md +113 -0
- package/dist/docs/guides/criticality-modes.md +332 -0
- package/dist/docs/guides/fault-management-and-contracts.md +738 -0
- package/dist/docs/guides/workflow-style-guide.md +224 -0
- package/dist/docs/http.md +299 -0
- package/dist/docs/human-input-provider.md +372 -0
- package/dist/docs/limits.md +64 -0
- package/dist/docs/liquid-templates.md +347 -0
- package/dist/docs/loop-routing-refactor.md +89 -0
- package/dist/docs/mcp-provider.md +557 -0
- package/dist/docs/mcp.md +124 -0
- package/dist/docs/memory.md +903 -0
- package/dist/docs/observability.md +12 -0
- package/dist/docs/output-formats.md +20 -0
- package/dist/docs/output-formatting.md +29 -0
- package/dist/docs/output-history.md +383 -0
- package/dist/docs/performance.md +6 -0
- package/dist/docs/pluggable.md +124 -0
- package/dist/docs/proposals/snapshot-scope-execution.md +236 -0
- package/dist/docs/recipes.md +21 -0
- package/dist/docs/roadmap/criticality-implementation-tasks.md +92 -0
- package/dist/docs/schema-next-pr.md +10 -0
- package/dist/docs/schema-templates.md +68 -0
- package/dist/docs/script.md +34 -0
- package/dist/docs/sdk.md +222 -0
- package/dist/docs/security.md +7 -0
- package/dist/docs/suppressions.md +89 -0
- package/dist/docs/tag-filtering.md +258 -0
- package/dist/docs/telemetry-setup.md +119 -0
- package/dist/docs/telemetry-tracing-rfc.md +275 -0
- package/dist/docs/test-framework-rfc.md +680 -0
- package/dist/docs/testing/assertions.md +85 -0
- package/dist/docs/testing/ci.md +44 -0
- package/dist/docs/testing/cli.md +41 -0
- package/dist/docs/testing/cookbook.md +172 -0
- package/dist/docs/testing/dsl-reference.md +199 -0
- package/dist/docs/testing/fixtures-and-mocks.md +91 -0
- package/dist/docs/testing/flows.md +92 -0
- package/dist/docs/testing/getting-started.md +93 -0
- package/dist/docs/testing/troubleshooting.md +55 -0
- package/dist/docs/timeouts.md +50 -0
- package/dist/docs/troubleshooting.md +7 -0
- package/dist/docs/visor-sdk-rfc.md +186 -0
- package/dist/docs/workflows.md +569 -0
- package/dist/engine/on-finish/orchestrator.d.ts +19 -0
- package/dist/engine/on-finish/orchestrator.d.ts.map +1 -0
- package/dist/engine/on-finish/utils.d.ts +44 -0
- package/dist/engine/on-finish/utils.d.ts.map +1 -0
- package/dist/event-bus/event-bus.d.ts +13 -0
- package/dist/event-bus/event-bus.d.ts.map +1 -0
- package/dist/event-bus/types.d.ts +57 -0
- package/dist/event-bus/types.d.ts.map +1 -0
- package/dist/examples/.claude/agents/code-reviewer.md +69 -0
- package/dist/examples/.mcp.json +34 -0
- package/dist/examples/CALCULATOR-SDK.md +364 -0
- package/dist/examples/README.md +384 -0
- package/dist/examples/ai-retry-fallback-config.yaml +180 -0
- package/dist/examples/ai-with-bash.yaml +126 -0
- package/dist/examples/ai-with-mcp.yaml +82 -0
- package/dist/examples/basic-human-input.yaml +15 -0
- package/dist/examples/bedrock-config.yaml +77 -0
- package/dist/examples/calculator-config.yaml +133 -0
- package/dist/examples/calculator-json-output-guide.md +311 -0
- package/dist/examples/calculator-sdk-automated.ts +340 -0
- package/dist/examples/calculator-sdk-example.ts +275 -0
- package/dist/examples/calculator-sdk-json.ts +331 -0
- package/dist/examples/calculator-sdk-real.ts +374 -0
- package/dist/examples/calculator-sdk-test.ts +148 -0
- package/dist/examples/claude-code-config.yaml +191 -0
- package/dist/examples/cron-webhook-config.yaml +215 -0
- package/dist/examples/custom-template.liquid +57 -0
- package/dist/examples/custom-tools-example.yaml +281 -0
- package/dist/examples/enhanced-config.yaml +165 -0
- package/dist/examples/environments/visor.base.yaml +92 -0
- package/dist/examples/environments/visor.dev.yaml +33 -0
- package/dist/examples/environments/visor.prod.yaml +95 -0
- package/dist/examples/environments/visor.staging.yaml +46 -0
- package/dist/examples/fact-validator.yaml +361 -0
- package/dist/examples/fail-if-simple.yaml +90 -0
- package/dist/examples/failure-conditions-advanced.yaml +136 -0
- package/dist/examples/failure-conditions-basic.yaml +48 -0
- package/dist/examples/failure-conditions-github-style.yaml +119 -0
- package/dist/examples/failure-conditions-migration.yaml +74 -0
- package/dist/examples/for-loop-example.yaml +176 -0
- package/dist/examples/forEach-example.yaml +120 -0
- package/dist/examples/github-workflow-with-tags.yml +163 -0
- package/dist/examples/http-integration-config.yaml +240 -0
- package/dist/examples/https-server-config.yaml +209 -0
- package/dist/examples/human-input-example.yaml +63 -0
- package/dist/examples/if-conditions.yaml +173 -0
- package/dist/examples/jira-simple-example.yaml +56 -0
- package/dist/examples/jira-single-issue-workflow.yaml +166 -0
- package/dist/examples/jira-workflow-mcp.yaml +182 -0
- package/dist/examples/mcp/analyzer.py +119 -0
- package/dist/examples/mcp-provider-example.yaml +301 -0
- package/dist/examples/memory-counter.yaml +99 -0
- package/dist/examples/memory-error-collection.yaml +104 -0
- package/dist/examples/memory-exec-js.yaml +247 -0
- package/dist/examples/memory-namespace-isolation.yaml +184 -0
- package/dist/examples/memory-retry-counter.yaml +65 -0
- package/dist/examples/memory-state-machine.yaml +170 -0
- package/dist/examples/outputs-raw-basic.yaml +26 -0
- package/dist/examples/project-with-tools.yaml +174 -0
- package/dist/examples/prompts/architecture-analysis.liquid +116 -0
- package/dist/examples/prompts/security-comprehensive.liquid +107 -0
- package/dist/examples/quick-start-tags.yaml +53 -0
- package/dist/examples/routing-basic.yaml +35 -0
- package/dist/examples/routing-dynamic-js.yaml +46 -0
- package/dist/examples/routing-foreach.yaml +34 -0
- package/dist/examples/routing-goto-event.yaml +34 -0
- package/dist/examples/routing-on-success.yaml +25 -0
- package/dist/examples/run-calculator-demo.sh +71 -0
- package/dist/examples/sdk-basic.mjs +10 -0
- package/dist/examples/sdk-cjs.cjs +10 -0
- package/dist/examples/sdk-comprehensive.mjs +175 -0
- package/dist/examples/sdk-manual-config.mjs +65 -0
- package/dist/examples/sdk-typescript.js +81 -0
- package/dist/examples/sdk-typescript.ts +92 -0
- package/dist/examples/session-reuse-config.yaml +151 -0
- package/dist/examples/templates/security-report.liquid +137 -0
- package/dist/examples/tools-library.yaml +281 -0
- package/dist/examples/transform-example.yaml +199 -0
- package/dist/examples/visor-with-tags.yaml +198 -0
- package/dist/examples/webhook-pipeline-config.yaml +218 -0
- package/dist/examples/workflows/calculator-workflow.yaml +163 -0
- package/dist/examples/workflows/code-quality.yaml +222 -0
- package/dist/examples/workflows/quick-pr-check.yaml +90 -0
- package/dist/examples/workflows/workflow-composition-example.yaml +130 -0
- package/dist/failure-condition-evaluator.d.ts +1 -0
- package/dist/failure-condition-evaluator.d.ts.map +1 -1
- package/dist/frontends/github-frontend.d.ts +38 -0
- package/dist/frontends/github-frontend.d.ts.map +1 -0
- package/dist/frontends/host.d.ts +43 -0
- package/dist/frontends/host.d.ts.map +1 -0
- package/dist/frontends/ndjson-sink.d.ts +12 -0
- package/dist/frontends/ndjson-sink.d.ts.map +1 -0
- package/dist/generated/config-schema.d.ts +564 -22
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +612 -24
- package/dist/github-check-service.d.ts +4 -6
- package/dist/github-check-service.d.ts.map +1 -1
- package/dist/github-comments.d.ts +0 -4
- package/dist/github-comments.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70335 -62514
- package/dist/liquid-extensions.d.ts.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/memory-store.d.ts +6 -0
- package/dist/memory-store.d.ts.map +1 -1
- package/dist/output/assistant-json/template.liquid +0 -0
- package/dist/output/traces/run-2025-11-21T11-50-46-505Z.ndjson +138 -0
- package/dist/output/traces/run-2025-11-21T11-51-33-674Z.ndjson +839 -0
- package/dist/output-formatters.d.ts +1 -1
- package/dist/output-formatters.d.ts.map +1 -1
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/check-provider-registry.d.ts +6 -0
- package/dist/providers/check-provider-registry.d.ts.map +1 -1
- package/dist/providers/check-provider.interface.d.ts +34 -1
- package/dist/providers/check-provider.interface.d.ts.map +1 -1
- package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
- package/dist/providers/command-check-provider.d.ts +1 -1
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/providers/custom-tool-executor.d.ts +61 -0
- package/dist/providers/custom-tool-executor.d.ts.map +1 -0
- package/dist/providers/github-ops-provider.d.ts.map +1 -1
- package/dist/providers/http-client-provider.d.ts +1 -4
- package/dist/providers/http-client-provider.d.ts.map +1 -1
- package/dist/providers/human-input-check-provider.d.ts +3 -0
- package/dist/providers/human-input-check-provider.d.ts.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/log-check-provider.d.ts +2 -5
- package/dist/providers/log-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-check-provider.d.ts +9 -3
- package/dist/providers/mcp-check-provider.d.ts.map +1 -1
- package/dist/providers/memory-check-provider.d.ts +2 -8
- package/dist/providers/memory-check-provider.d.ts.map +1 -1
- package/dist/providers/script-check-provider.d.ts +25 -0
- package/dist/providers/script-check-provider.d.ts.map +1 -0
- package/dist/providers/workflow-check-provider.d.ts +56 -0
- package/dist/providers/workflow-check-provider.d.ts.map +1 -0
- package/dist/reviewer.d.ts +2 -1
- package/dist/reviewer.d.ts.map +1 -1
- package/dist/sdk/chunk-37ZSCMFC.mjs +482 -0
- package/dist/sdk/chunk-37ZSCMFC.mjs.map +1 -0
- package/dist/sdk/chunk-6Y4YTKCF.mjs +197 -0
- package/dist/sdk/chunk-6Y4YTKCF.mjs.map +1 -0
- package/dist/sdk/chunk-CNX7V5JK.mjs +89 -0
- package/dist/sdk/chunk-CNX7V5JK.mjs.map +1 -0
- package/dist/sdk/chunk-IEO6CFLG.mjs +1215 -0
- package/dist/sdk/chunk-IEO6CFLG.mjs.map +1 -0
- package/dist/sdk/chunk-JEHPDJIF.mjs +223 -0
- package/dist/sdk/chunk-JEHPDJIF.mjs.map +1 -0
- package/dist/sdk/chunk-O5EZDNYL.mjs +274 -0
- package/dist/sdk/chunk-O5EZDNYL.mjs.map +1 -0
- package/dist/sdk/{chunk-TUTOLSFV.mjs → chunk-OOZITMRU.mjs} +1 -1
- package/dist/sdk/chunk-OOZITMRU.mjs.map +1 -0
- package/dist/sdk/chunk-OWUVOILT.mjs +557 -0
- package/dist/sdk/chunk-OWUVOILT.mjs.map +1 -0
- package/dist/sdk/chunk-OZJ263FM.mjs +986 -0
- package/dist/sdk/chunk-OZJ263FM.mjs.map +1 -0
- package/dist/sdk/chunk-PTL3K3PN.mjs +3128 -0
- package/dist/sdk/chunk-PTL3K3PN.mjs.map +1 -0
- package/dist/sdk/chunk-S2RUE2RG.mjs +145 -0
- package/dist/sdk/chunk-S2RUE2RG.mjs.map +1 -0
- package/dist/sdk/chunk-VMPLF6FT.mjs +127 -0
- package/dist/sdk/chunk-VMPLF6FT.mjs.map +1 -0
- package/dist/sdk/chunk-YSN4G6CI.mjs +146 -0
- package/dist/sdk/chunk-YSN4G6CI.mjs.map +1 -0
- package/dist/sdk/chunk-ZYAUYXSW.mjs +206 -0
- package/dist/sdk/chunk-ZYAUYXSW.mjs.map +1 -0
- package/dist/sdk/config-M4ZNO6NU.mjs +14 -0
- package/dist/sdk/config-merger-PX3WIT57.mjs +10 -0
- package/dist/sdk/event-bus-5BEVPQ6T.mjs +35 -0
- package/dist/sdk/event-bus-5BEVPQ6T.mjs.map +1 -0
- package/dist/sdk/failure-condition-evaluator-NBO5YRXW.mjs +16 -0
- package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs +458 -0
- package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs.map +1 -0
- package/dist/sdk/github-frontend-4AWRJT7D.mjs +1242 -0
- package/dist/sdk/github-frontend-4AWRJT7D.mjs.map +1 -0
- package/dist/sdk/host-7GBC3S7L.mjs +49 -0
- package/dist/sdk/host-7GBC3S7L.mjs.map +1 -0
- package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs → liquid-extensions-C7EG3YKH.mjs} +7 -2
- package/dist/sdk/memory-store-GJACZC2A.mjs +11 -0
- package/dist/sdk/metrics-7PP3EJUH.mjs +29 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +44 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs.map +1 -0
- package/dist/sdk/renderer-schema-6RF26VUS.mjs +50 -0
- package/dist/sdk/renderer-schema-6RF26VUS.mjs.map +1 -0
- package/dist/sdk/routing-RP56JTV2.mjs +23 -0
- package/dist/sdk/routing-RP56JTV2.mjs.map +1 -0
- package/dist/sdk/sdk.d.mts +326 -21
- package/dist/sdk/sdk.d.ts +326 -21
- package/dist/sdk/sdk.js +21403 -16366
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +13510 -2096
- package/dist/sdk/sdk.mjs.map +1 -1
- package/dist/sdk/session-registry-N5FFYFTM.mjs +10 -0
- package/dist/sdk/session-registry-N5FFYFTM.mjs.map +1 -0
- package/dist/sdk/trace-helpers-VP6QYVBX.mjs +23 -0
- package/dist/sdk/trace-helpers-VP6QYVBX.mjs.map +1 -0
- package/dist/sdk/{tracer-init-WC75N5NW.mjs → tracer-init-WP4X46IF.mjs} +2 -2
- package/dist/sdk/tracer-init-WP4X46IF.mjs.map +1 -0
- package/dist/sdk/workflow-registry-2YIIXQCK.mjs +11 -0
- package/dist/sdk/workflow-registry-2YIIXQCK.mjs.map +1 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/snapshot-store.d.ts +59 -0
- package/dist/snapshot-store.d.ts.map +1 -0
- package/dist/state-machine/context/build-engine-context.d.ts +9 -0
- package/dist/state-machine/context/build-engine-context.d.ts.map +1 -0
- package/dist/state-machine/dispatch/dependency-gating.d.ts +12 -0
- package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts +14 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -0
- package/dist/state-machine/dispatch/foreach-processor.d.ts +8 -0
- package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -0
- package/dist/state-machine/dispatch/history-snapshot.d.ts +8 -0
- package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -0
- package/dist/state-machine/dispatch/renderer-schema.d.ts +8 -0
- package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -0
- package/dist/state-machine/dispatch/stats-manager.d.ts +15 -0
- package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -0
- package/dist/state-machine/dispatch/template-renderer.d.ts +7 -0
- package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -0
- package/dist/state-machine/execution/summary.d.ts +8 -0
- package/dist/state-machine/execution/summary.d.ts.map +1 -0
- package/dist/state-machine/runner.d.ts +73 -0
- package/dist/state-machine/runner.d.ts.map +1 -0
- package/dist/state-machine/states/check-running.d.ts +14 -0
- package/dist/state-machine/states/check-running.d.ts.map +1 -0
- package/dist/state-machine/states/completed.d.ts +12 -0
- package/dist/state-machine/states/completed.d.ts.map +1 -0
- package/dist/state-machine/states/error.d.ts +11 -0
- package/dist/state-machine/states/error.d.ts.map +1 -0
- package/dist/state-machine/states/init.d.ts +11 -0
- package/dist/state-machine/states/init.d.ts.map +1 -0
- package/dist/state-machine/states/level-dispatch.d.ts +17 -0
- package/dist/state-machine/states/level-dispatch.d.ts.map +1 -0
- package/dist/state-machine/states/plan-ready.d.ts +12 -0
- package/dist/state-machine/states/plan-ready.d.ts.map +1 -0
- package/dist/state-machine/states/routing.d.ts +52 -0
- package/dist/state-machine/states/routing.d.ts.map +1 -0
- package/dist/state-machine/states/wave-planning.d.ts +14 -0
- package/dist/state-machine/states/wave-planning.d.ts.map +1 -0
- package/dist/state-machine/workflow-projection.d.ts +47 -0
- package/dist/state-machine/workflow-projection.d.ts.map +1 -0
- package/dist/state-machine-execution-engine.d.ts +147 -0
- package/dist/state-machine-execution-engine.d.ts.map +1 -0
- package/dist/telemetry/opentelemetry.d.ts.map +1 -1
- package/dist/test-runner/assertions.d.ts +59 -0
- package/dist/test-runner/assertions.d.ts.map +1 -0
- package/dist/test-runner/core/environment.d.ts +8 -0
- package/dist/test-runner/core/environment.d.ts.map +1 -0
- package/dist/test-runner/core/fixture.d.ts +3 -0
- package/dist/test-runner/core/fixture.d.ts.map +1 -0
- package/dist/test-runner/core/flow-stage.d.ts +32 -0
- package/dist/test-runner/core/flow-stage.d.ts.map +1 -0
- package/dist/test-runner/core/mocks.d.ts +8 -0
- package/dist/test-runner/core/mocks.d.ts.map +1 -0
- package/dist/test-runner/core/test-execution-wrapper.d.ts +18 -0
- package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -0
- package/dist/test-runner/evaluators.d.ts +12 -0
- package/dist/test-runner/evaluators.d.ts.map +1 -0
- package/dist/test-runner/fixture-loader.d.ts +30 -0
- package/dist/test-runner/fixture-loader.d.ts.map +1 -0
- package/dist/test-runner/index.d.ts +120 -0
- package/dist/test-runner/index.d.ts.map +1 -0
- package/dist/test-runner/recorders/github-recorder.d.ts +23 -0
- package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -0
- package/dist/test-runner/recorders/global-recorder.d.ts +4 -0
- package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -0
- package/dist/test-runner/utils/selectors.d.ts +2 -0
- package/dist/test-runner/utils/selectors.d.ts.map +1 -0
- package/dist/test-runner/validator.d.ts +8 -0
- package/dist/test-runner/validator.d.ts.map +1 -0
- package/dist/traces/run-2025-11-21T11-50-46-505Z.ndjson +138 -0
- package/dist/traces/run-2025-11-21T11-51-33-674Z.ndjson +839 -0
- package/dist/types/cli.d.ts +4 -1
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/config.d.ts +278 -5
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/engine.d.ts +172 -0
- package/dist/types/engine.d.ts.map +1 -0
- package/dist/types/execution.d.ts +73 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/github.d.ts +51 -0
- package/dist/types/github.d.ts.map +1 -0
- package/dist/types/workflow.d.ts +237 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/utils/command-executor.d.ts +43 -0
- package/dist/utils/command-executor.d.ts.map +1 -0
- package/dist/utils/comment-metadata.d.ts +21 -0
- package/dist/utils/comment-metadata.d.ts.map +1 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-merger.d.ts.map +1 -1
- package/dist/utils/env-exposure.d.ts +3 -0
- package/dist/utils/env-exposure.d.ts.map +1 -0
- package/dist/utils/file-exclusion.d.ts.map +1 -1
- package/dist/utils/interactive-prompt.d.ts +1 -1
- package/dist/utils/interactive-prompt.d.ts.map +1 -1
- package/dist/utils/sandbox.d.ts.map +1 -1
- package/dist/utils/script-memory-ops.d.ts +21 -0
- package/dist/utils/script-memory-ops.d.ts.map +1 -0
- package/dist/utils/template-context.d.ts +7 -0
- package/dist/utils/template-context.d.ts.map +1 -0
- package/dist/webhook-server.d.ts +3 -3
- package/dist/webhook-server.d.ts.map +1 -1
- package/dist/workflow-executor.d.ts +81 -0
- package/dist/workflow-executor.d.ts.map +1 -0
- package/dist/workflow-registry.d.ts +79 -0
- package/dist/workflow-registry.d.ts.map +1 -0
- package/package.json +10 -5
- package/dist/output/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
- package/dist/sdk/check-execution-engine-2YYKUUSH.mjs +0 -11
- package/dist/sdk/check-execution-engine-6QJXYYON.mjs +0 -11
- package/dist/sdk/check-execution-engine-PJZ4ZOKG.mjs +0 -11
- package/dist/sdk/chunk-33QVZ2D4.mjs +0 -316
- package/dist/sdk/chunk-33QVZ2D4.mjs.map +0 -1
- package/dist/sdk/chunk-B5QBV2QJ.mjs +0 -752
- package/dist/sdk/chunk-B5QBV2QJ.mjs.map +0 -1
- package/dist/sdk/chunk-BVFNRCHT.mjs +0 -14129
- package/dist/sdk/chunk-BVFNRCHT.mjs.map +0 -1
- package/dist/sdk/chunk-KWZW23FG.mjs +0 -14129
- package/dist/sdk/chunk-KWZW23FG.mjs.map +0 -1
- package/dist/sdk/chunk-O4RP4BRH.mjs +0 -14092
- package/dist/sdk/chunk-O4RP4BRH.mjs.map +0 -1
- package/dist/sdk/chunk-TUTOLSFV.mjs.map +0 -1
- package/dist/sdk/chunk-U5D2LY66.mjs +0 -245
- package/dist/sdk/chunk-U5D2LY66.mjs.map +0 -1
- package/dist/sdk/chunk-U7X54EMV.mjs +0 -331
- package/dist/sdk/chunk-U7X54EMV.mjs.map +0 -1
- package/dist/sdk/config-merger-TWUBWFC2.mjs +0 -8
- package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs +0 -61
- package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs.map +0 -1
- package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs +0 -61
- package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs.map +0 -1
- package/dist/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
- /package/dist/sdk/{check-execution-engine-2YYKUUSH.mjs.map → config-M4ZNO6NU.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-6QJXYYON.mjs.map → config-merger-PX3WIT57.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-PJZ4ZOKG.mjs.map → failure-condition-evaluator-NBO5YRXW.mjs.map} +0 -0
- /package/dist/sdk/{config-merger-TWUBWFC2.mjs.map → liquid-extensions-C7EG3YKH.mjs.map} +0 -0
- /package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs.map → memory-store-GJACZC2A.mjs.map} +0 -0
- /package/dist/sdk/{tracer-init-WC75N5NW.mjs.map → metrics-7PP3EJUH.mjs.map} +0 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
# Human Input Provider
|
|
2
|
+
|
|
3
|
+
The human-input provider pauses workflow execution to request input from a human user. This enables interactive workflows, approval gates, and dynamic parameter collection.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
- [Overview](#overview)
|
|
7
|
+
- [Configuration](#configuration)
|
|
8
|
+
- [Input Methods](#input-methods)
|
|
9
|
+
- [Examples](#examples)
|
|
10
|
+
- [SDK Usage](#sdk-usage)
|
|
11
|
+
- [Security](#security)
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
The human-input provider supports four input methods, prioritized as follows:
|
|
16
|
+
|
|
17
|
+
1. **CLI with `--message` argument** - Inline text or file path
|
|
18
|
+
2. **Piped stdin** - Input from pipe or file redirect
|
|
19
|
+
3. **SDK hook** - Custom `onHumanInput` callback
|
|
20
|
+
4. **Interactive prompt** - Beautiful terminal UI (when TTY available)
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
### Basic Configuration
|
|
25
|
+
|
|
26
|
+
```yaml
|
|
27
|
+
checks:
|
|
28
|
+
approval:
|
|
29
|
+
type: human-input
|
|
30
|
+
prompt: "Do you approve this deployment? (yes/no)"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Full Configuration Options
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
checks:
|
|
37
|
+
approval:
|
|
38
|
+
type: human-input
|
|
39
|
+
prompt: "Enter approval decision" # Required: prompt text
|
|
40
|
+
placeholder: "Type yes or no..." # Optional: placeholder text
|
|
41
|
+
allow_empty: false # Optional: allow empty input (default: false)
|
|
42
|
+
multiline: false # Optional: enable multiline input (default: false)
|
|
43
|
+
timeout: 300 # Optional: timeout in seconds
|
|
44
|
+
default: "no" # Optional: default value
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Using Input in Dependent Checks
|
|
48
|
+
|
|
49
|
+
The user's input is available to dependent checks via the `outputs` variable. By default (no schema), human-input returns an object `{ text: string, ts: number }` where `ts` is the timestamp (milliseconds since epoch):
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
checks:
|
|
53
|
+
get-version:
|
|
54
|
+
type: human-input
|
|
55
|
+
prompt: "Enter version number"
|
|
56
|
+
|
|
57
|
+
tag-release:
|
|
58
|
+
type: command
|
|
59
|
+
depends_on: [get-version]
|
|
60
|
+
exec: |
|
|
61
|
+
# Prefer .text to read the string payload
|
|
62
|
+
git tag v{{ outputs['get-version'].text | default: outputs['get-version'] }}
|
|
63
|
+
git push origin v{{ outputs['get-version'].text | default: outputs['get-version'] }}
|
|
64
|
+
|
|
65
|
+
> See also: [Default Output Schema](./default-output-schema.md)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Input Methods
|
|
69
|
+
|
|
70
|
+
### 1. CLI with --message
|
|
71
|
+
|
|
72
|
+
Provide input directly via command line:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Inline message
|
|
76
|
+
visor --check approval --message "yes"
|
|
77
|
+
|
|
78
|
+
# From file
|
|
79
|
+
visor --check approval --message ./approval.txt
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 2. Piped stdin
|
|
83
|
+
|
|
84
|
+
Pipe input from another command or file:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# From echo
|
|
88
|
+
echo "yes" | visor --check approval
|
|
89
|
+
|
|
90
|
+
# From file
|
|
91
|
+
visor --check approval < approval.txt
|
|
92
|
+
|
|
93
|
+
# From command
|
|
94
|
+
curl https://api.example.com/approval | visor --check approval
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 3. SDK Hook
|
|
98
|
+
|
|
99
|
+
Use a custom hook for programmatic input:
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { runChecks, HumanInputCheckProvider } from '@probelabs/visor';
|
|
103
|
+
|
|
104
|
+
// Option 1: Using deprecated static method (backward compatible)
|
|
105
|
+
HumanInputCheckProvider.setHooks({
|
|
106
|
+
onHumanInput: async (request) => {
|
|
107
|
+
console.log(`Prompt: ${request.prompt}`);
|
|
108
|
+
return 'yes';
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
await runChecks({ config });
|
|
113
|
+
|
|
114
|
+
// Option 2: Using new ExecutionContext (recommended)
|
|
115
|
+
await runChecks({
|
|
116
|
+
config,
|
|
117
|
+
executionContext: {
|
|
118
|
+
hooks: {
|
|
119
|
+
onHumanInput: async (request) => {
|
|
120
|
+
console.log(`Prompt: ${request.prompt}`);
|
|
121
|
+
return 'yes';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The `HumanInputRequest` interface:
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
interface HumanInputRequest {
|
|
132
|
+
checkId: string; // Check name/ID
|
|
133
|
+
prompt: string; // Prompt text
|
|
134
|
+
placeholder?: string; // Placeholder text
|
|
135
|
+
allowEmpty?: boolean; // Allow empty input
|
|
136
|
+
multiline?: boolean; // Multiline mode
|
|
137
|
+
timeout?: number; // Timeout in milliseconds
|
|
138
|
+
default?: string; // Default value
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 4. Interactive Terminal Prompt
|
|
143
|
+
|
|
144
|
+
When running in a TTY (interactive terminal), a beautiful prompt appears:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
┌─────────────────────────────────────────────┐
|
|
148
|
+
│ Enter approval decision │
|
|
149
|
+
├─────────────────────────────────────────────┤
|
|
150
|
+
│ Type yes or no... │
|
|
151
|
+
│ │
|
|
152
|
+
│ Press Ctrl+D when done (or Ctrl+C to exit) │
|
|
153
|
+
└─────────────────────────────────────────────┘
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Examples
|
|
157
|
+
|
|
158
|
+
### Simple Approval Gate
|
|
159
|
+
|
|
160
|
+
```yaml
|
|
161
|
+
checks:
|
|
162
|
+
manual-approval:
|
|
163
|
+
type: human-input
|
|
164
|
+
prompt: "Approve deployment to production? (yes/no)"
|
|
165
|
+
allow_empty: false
|
|
166
|
+
|
|
167
|
+
deploy:
|
|
168
|
+
type: command
|
|
169
|
+
depends_on: [manual-approval]
|
|
170
|
+
fail_if: |
|
|
171
|
+
outputs['manual-approval'].toLowerCase() !== 'yes'
|
|
172
|
+
exec: ./deploy.sh production
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Version Input
|
|
176
|
+
|
|
177
|
+
```yaml
|
|
178
|
+
checks:
|
|
179
|
+
get-version:
|
|
180
|
+
type: human-input
|
|
181
|
+
prompt: "Enter version number (e.g., 1.2.3)"
|
|
182
|
+
|
|
183
|
+
validate-version:
|
|
184
|
+
type: javascript
|
|
185
|
+
depends_on: [get-version]
|
|
186
|
+
exec: |
|
|
187
|
+
const version = outputs['get-version'];
|
|
188
|
+
const valid = /^\d+\.\d+\.\d+$/.test(version);
|
|
189
|
+
if (!valid) throw new Error('Invalid version format');
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Multi-step Input
|
|
193
|
+
|
|
194
|
+
```yaml
|
|
195
|
+
checks:
|
|
196
|
+
get-feature:
|
|
197
|
+
type: human-input
|
|
198
|
+
prompt: "Enter feature name"
|
|
199
|
+
|
|
200
|
+
get-description:
|
|
201
|
+
type: human-input
|
|
202
|
+
prompt: "Enter feature description"
|
|
203
|
+
multiline: true
|
|
204
|
+
depends_on: [get-feature]
|
|
205
|
+
|
|
206
|
+
create-issue:
|
|
207
|
+
type: command
|
|
208
|
+
depends_on: [get-feature, get-description]
|
|
209
|
+
exec: |
|
|
210
|
+
gh issue create \
|
|
211
|
+
--title "{{ outputs['get-feature'] }}" \
|
|
212
|
+
--body "{{ outputs['get-description'] }}"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Calculator Example
|
|
216
|
+
|
|
217
|
+
See [examples/calculator-sdk-real.ts](../examples/calculator-sdk-real.ts) for a complete working example with:
|
|
218
|
+
- Multiple human-input checks in sequence
|
|
219
|
+
- Output passing between checks
|
|
220
|
+
- JavaScript execution with user input
|
|
221
|
+
- Memory storage
|
|
222
|
+
|
|
223
|
+
## SDK Usage
|
|
224
|
+
|
|
225
|
+
### Basic SDK Usage
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
import { runChecks } from '@probelabs/visor';
|
|
229
|
+
|
|
230
|
+
const config = {
|
|
231
|
+
version: '1.0',
|
|
232
|
+
checks: {
|
|
233
|
+
approval: {
|
|
234
|
+
type: 'human-input',
|
|
235
|
+
prompt: 'Approve? (yes/no)'
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
// Run with execution context (recommended)
|
|
241
|
+
const result = await runChecks({
|
|
242
|
+
config,
|
|
243
|
+
executionContext: {
|
|
244
|
+
hooks: {
|
|
245
|
+
onHumanInput: async (request) => {
|
|
246
|
+
// Your custom input logic
|
|
247
|
+
return await getUserInput(request.prompt);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### With CLI Message
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
import { CheckExecutionEngine } from '@probelabs/visor';
|
|
258
|
+
|
|
259
|
+
const engine = new CheckExecutionEngine();
|
|
260
|
+
|
|
261
|
+
// Set execution context
|
|
262
|
+
engine.setExecutionContext({
|
|
263
|
+
cliMessage: 'yes' // Simulates --message flag
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
const result = await engine.executeChecks({
|
|
267
|
+
checks: ['approval'],
|
|
268
|
+
config
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Automated Testing
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
const testInputs = {
|
|
276
|
+
'get-number1': '42',
|
|
277
|
+
'get-number2': '7',
|
|
278
|
+
'get-operation': '+'
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
await runChecks({
|
|
282
|
+
config,
|
|
283
|
+
executionContext: {
|
|
284
|
+
hooks: {
|
|
285
|
+
onHumanInput: async (request) => {
|
|
286
|
+
return testInputs[request.checkId] || '';
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Security
|
|
294
|
+
|
|
295
|
+
The human-input provider includes several security features:
|
|
296
|
+
|
|
297
|
+
### Input Sanitization
|
|
298
|
+
|
|
299
|
+
All user input is automatically sanitized before being passed to dependent checks:
|
|
300
|
+
|
|
301
|
+
- **Null bytes removed** - Prevents C-string injection
|
|
302
|
+
- **Control characters removed** - Except newlines and tabs
|
|
303
|
+
- **Size limit** - Maximum 100KB per input
|
|
304
|
+
|
|
305
|
+
### Path Traversal Protection
|
|
306
|
+
|
|
307
|
+
When using `--message` with file paths:
|
|
308
|
+
|
|
309
|
+
- **Path normalization** - Resolves `..` components
|
|
310
|
+
- **Directory restriction** - Only reads files within current working directory
|
|
311
|
+
- **File type validation** - Only reads regular files
|
|
312
|
+
- **Async operations** - Non-blocking file I/O
|
|
313
|
+
|
|
314
|
+
### DoS Prevention
|
|
315
|
+
|
|
316
|
+
Stdin input has protection against denial-of-service:
|
|
317
|
+
|
|
318
|
+
- **Size limit** - Default 1MB maximum
|
|
319
|
+
- **Timeout support** - Configurable timeout
|
|
320
|
+
- **Resource cleanup** - Proper cleanup with `stdin.pause()`
|
|
321
|
+
|
|
322
|
+
### Execution Context Isolation
|
|
323
|
+
|
|
324
|
+
The new ExecutionContext pattern eliminates global state:
|
|
325
|
+
|
|
326
|
+
- **Thread-safe** - No global mutable state
|
|
327
|
+
- **Test isolation** - Each execution has isolated context
|
|
328
|
+
- **Concurrent safe** - Safe for parallel execution
|
|
329
|
+
|
|
330
|
+
## Migration Guide
|
|
331
|
+
|
|
332
|
+
### From Static API to ExecutionContext
|
|
333
|
+
|
|
334
|
+
**Old way (still works but deprecated):**
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
import { HumanInputCheckProvider, runChecks } from '@probelabs/visor';
|
|
338
|
+
|
|
339
|
+
HumanInputCheckProvider.setHooks({
|
|
340
|
+
onHumanInput: async (request) => 'yes'
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
await runChecks({ config });
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**New way (recommended):**
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
import { runChecks } from '@probelabs/visor';
|
|
350
|
+
|
|
351
|
+
await runChecks({
|
|
352
|
+
config,
|
|
353
|
+
executionContext: {
|
|
354
|
+
hooks: {
|
|
355
|
+
onHumanInput: async (request) => 'yes'
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Benefits of the new approach:
|
|
362
|
+
- Thread-safe (no global state)
|
|
363
|
+
- Better for concurrent executions
|
|
364
|
+
- Easier to test
|
|
365
|
+
- More flexible
|
|
366
|
+
|
|
367
|
+
## See Also
|
|
368
|
+
|
|
369
|
+
- [Calculator SDK Example](../examples/calculator-sdk-real.ts) - Complete working example
|
|
370
|
+
- [Debugging Guide](./debugging.md) - Debugging techniques
|
|
371
|
+
- [Command Provider](./command-provider.md) - Executing shell commands
|
|
372
|
+
- [MCP Provider](./mcp-provider.md) - MCP integration
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
## 🚦 Execution Limits (Run Caps)
|
|
2
|
+
|
|
3
|
+
This feature protects workflows from accidental infinite loops by capping how many times a step may execute in a single engine run. It complements (but is different from) routing loop budgets.
|
|
4
|
+
|
|
5
|
+
### Why this exists
|
|
6
|
+
|
|
7
|
+
- Complex `on_fail`/`on_success` routing can create feedback loops when a remediation step immediately routes back to its source.
|
|
8
|
+
- The cap provides a hard stop with a clear error if a step keeps re-running without converging.
|
|
9
|
+
|
|
10
|
+
### Configuration
|
|
11
|
+
|
|
12
|
+
Global (default is 50 if omitted):
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
version: "1.0"
|
|
16
|
+
|
|
17
|
+
limits:
|
|
18
|
+
max_runs_per_check: 50 # Applies to every step unless overridden
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Per-step override:
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
steps:
|
|
25
|
+
refine:
|
|
26
|
+
type: ai
|
|
27
|
+
max_runs: 10 # Hard cap for this step within one engine run
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Disable cap for a specific step (not recommended unless you know it converges quickly):
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
steps:
|
|
34
|
+
extract:
|
|
35
|
+
type: command
|
|
36
|
+
max_runs: 0 # or any negative value
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Behavior
|
|
40
|
+
|
|
41
|
+
- The engine counts executions per step. For `forEach` children, the counter is tracked per item scope (each item has its own budget).
|
|
42
|
+
- When the cap is exceeded, the step fails immediately with a single error issue:
|
|
43
|
+
- `ruleId`: `<step-id>/limits/max_runs_exceeded`
|
|
44
|
+
- `severity`: `error`
|
|
45
|
+
- `message` includes the scope and attempt number
|
|
46
|
+
- Dependents are gated as with any error unless the dependency declares `continue_on_failure: true`.
|
|
47
|
+
|
|
48
|
+
### How this differs from `routing.max_loops`
|
|
49
|
+
|
|
50
|
+
- `routing.max_loops` caps routing transitions (e.g., goto/retry waves) per scope.
|
|
51
|
+
- `limits.max_runs_per_check` caps actual step executions per step (also per scope for `forEach`).
|
|
52
|
+
- Both guard rails can be used together: set a modest routing budget (e.g., 5–10) and leave the execution cap at the default (50) or tailor per step.
|
|
53
|
+
|
|
54
|
+
### Recommendations
|
|
55
|
+
|
|
56
|
+
- Keep `routing.max_loops` small for fast feedback (5–10).
|
|
57
|
+
- Use per-step `max_runs` on chat-like loops or known retryers if you need tighter control.
|
|
58
|
+
- Prefer fixing the loop logic (conditions/routing) over raising the caps.
|
|
59
|
+
|
|
60
|
+
### Troubleshooting
|
|
61
|
+
|
|
62
|
+
- If you hit `.../limits/max_runs_exceeded` immediately, check if a step is routed back without changing state.
|
|
63
|
+
- For `forEach` flows, confirm whether the error is tied to a specific item scope; fix that item’s remediation path.
|
|
64
|
+
|