@probelabs/visor 0.1.106 → 0.1.111
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 +71 -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 +624 -0
- package/defaults/visor.tests.yaml +685 -0
- package/defaults/visor.yaml +483 -0
- 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 +28 -9
- 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 +7 -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 +624 -0
- package/dist/defaults/visor.tests.yaml +685 -0
- package/dist/defaults/visor.yaml +483 -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 +237 -0
- package/dist/docs/ai-configuration.md +535 -0
- package/dist/docs/ai-custom-tools-usage.md +261 -0
- package/dist/docs/ai-custom-tools.md +392 -0
- package/dist/docs/author-permissions.md +610 -0
- package/dist/docs/bot-transports-rfc.md +23 -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 +324 -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-pause-resume-rfc.md +192 -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/lifecycle-hooks.md +253 -0
- package/dist/docs/limits.md +64 -0
- package/dist/docs/liquid-templates.md +490 -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/providers/git-checkout.md +589 -0
- package/dist/docs/recipes.md +474 -0
- package/dist/docs/rfc/git-checkout-step.md +601 -0
- package/dist/docs/rfc/on_init-hook.md +1294 -0
- package/dist/docs/rfc/workspace-isolation.md +216 -0
- package/dist/docs/roadmap/criticality-implementation-tasks.md +92 -0
- package/dist/docs/router-patterns.md +339 -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 +71 -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-custom-tools-example.yaml +206 -0
- package/dist/examples/ai-custom-tools-simple.yaml +76 -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/git-checkout-basic.yaml +32 -0
- package/dist/examples/git-checkout-compare.yaml +59 -0
- package/dist/examples/git-checkout-cross-repo.yaml +76 -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/on-init-import-demo.yaml +179 -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/reusable-tools.yaml +92 -0
- package/dist/examples/reusable-workflows.yaml +88 -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/session-reuse-self.yaml +81 -0
- package/dist/examples/slack-simple-chat.yaml +775 -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 +3 -0
- package/dist/failure-condition-evaluator.d.ts.map +1 -1
- package/dist/frontends/github-frontend.d.ts +58 -0
- package/dist/frontends/github-frontend.d.ts.map +1 -0
- package/dist/frontends/host.d.ts +47 -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/frontends/slack-frontend.d.ts +58 -0
- package/dist/frontends/slack-frontend.d.ts.map +1 -0
- package/dist/generated/config-schema.d.ts +967 -57
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +1033 -56
- 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 +2 -4
- package/dist/github-comments.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +134327 -99004
- package/dist/liquid-extensions.d.ts.map +1 -1
- package/dist/logger.d.ts +2 -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-2026-01-20T19-22-58-043Z.ndjson +138 -0
- package/dist/output/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -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 +12 -0
- 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 +43 -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/git-checkout-provider.d.ts +25 -0
- package/dist/providers/git-checkout-provider.d.ts.map +1 -0
- package/dist/providers/github-ops-provider.d.ts.map +1 -1
- package/dist/providers/http-client-provider.d.ts +4 -4
- package/dist/providers/http-client-provider.d.ts.map +1 -1
- package/dist/providers/human-input-check-provider.d.ts +5 -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 +10 -4
- package/dist/providers/mcp-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-custom-sse-server.d.ts +66 -0
- package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -0
- 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/check-provider-registry-534KL5HT.mjs +27 -0
- package/dist/sdk/chunk-23L3QRYX.mjs +16872 -0
- package/dist/sdk/chunk-23L3QRYX.mjs.map +1 -0
- package/dist/sdk/{chunk-TUTOLSFV.mjs → chunk-3OMWVM6J.mjs} +11 -1
- package/dist/sdk/chunk-3OMWVM6J.mjs.map +1 -0
- package/dist/sdk/chunk-7UK3NIIT.mjs +482 -0
- package/dist/sdk/chunk-7UK3NIIT.mjs.map +1 -0
- package/dist/sdk/chunk-AGIZJ4UZ.mjs +173 -0
- package/dist/sdk/chunk-AGIZJ4UZ.mjs.map +1 -0
- package/dist/sdk/chunk-AIVFBIS4.mjs +1371 -0
- package/dist/sdk/chunk-AIVFBIS4.mjs.map +1 -0
- package/dist/sdk/chunk-AK6BVWIT.mjs +426 -0
- package/dist/sdk/chunk-AK6BVWIT.mjs.map +1 -0
- package/dist/sdk/chunk-AUT26LHW.mjs +139 -0
- package/dist/sdk/chunk-AUT26LHW.mjs.map +1 -0
- package/dist/sdk/chunk-BOVFH3LI.mjs +232 -0
- package/dist/sdk/chunk-BOVFH3LI.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-HTOKWMPO.mjs +157 -0
- package/dist/sdk/chunk-HTOKWMPO.mjs.map +1 -0
- package/dist/sdk/chunk-NAW3DB3I.mjs +197 -0
- package/dist/sdk/chunk-NAW3DB3I.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-QR7MOMJH.mjs +558 -0
- package/dist/sdk/chunk-QR7MOMJH.mjs.map +1 -0
- package/dist/sdk/chunk-QY2XYPEV.mjs +3556 -0
- package/dist/sdk/chunk-QY2XYPEV.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-SIWNBRTK.mjs +800 -0
- package/dist/sdk/chunk-SIWNBRTK.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/command-executor-TYUV6HUS.mjs +14 -0
- package/dist/sdk/config-YNC2EOOT.mjs +16 -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-YGTF2GHG.mjs +17 -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-SIAEOCON.mjs +1420 -0
- package/dist/sdk/github-frontend-SIAEOCON.mjs.map +1 -0
- package/dist/sdk/host-DXUYTNMU.mjs +52 -0
- package/dist/sdk/host-DXUYTNMU.mjs.map +1 -0
- package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs → liquid-extensions-PKWCKK7E.mjs} +8 -2
- package/dist/sdk/memory-store-XGBB7LX7.mjs +12 -0
- package/dist/sdk/memory-store-XGBB7LX7.mjs.map +1 -0
- package/dist/sdk/metrics-7PP3EJUH.mjs +29 -0
- package/dist/sdk/metrics-7PP3EJUH.mjs.map +1 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +44 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs.map +1 -0
- package/dist/sdk/prompt-state-YRJY6QAL.mjs +16 -0
- package/dist/sdk/prompt-state-YRJY6QAL.mjs.map +1 -0
- package/dist/sdk/renderer-schema-LPKN5UJS.mjs +51 -0
- package/dist/sdk/renderer-schema-LPKN5UJS.mjs.map +1 -0
- package/dist/sdk/routing-6N45MJ4F.mjs +24 -0
- package/dist/sdk/routing-6N45MJ4F.mjs.map +1 -0
- package/dist/sdk/sdk.d.mts +541 -22
- package/dist/sdk/sdk.d.ts +541 -22
- package/dist/sdk/sdk.js +27963 -16505
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +1116 -2169
- package/dist/sdk/sdk.mjs.map +1 -1
- package/dist/sdk/session-registry-4E6YRQ77.mjs +10 -0
- package/dist/sdk/session-registry-4E6YRQ77.mjs.map +1 -0
- package/dist/sdk/slack-frontend-BVKW3GD5.mjs +735 -0
- package/dist/sdk/slack-frontend-BVKW3GD5.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-GSLPPLCD.mjs} +2 -2
- package/dist/sdk/tracer-init-GSLPPLCD.mjs.map +1 -0
- package/dist/sdk/workflow-registry-R6KSACFR.mjs +12 -0
- package/dist/sdk/workflow-registry-R6KSACFR.mjs.map +1 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/slack/adapter.d.ts +36 -0
- package/dist/slack/adapter.d.ts.map +1 -0
- package/dist/slack/cache-prewarmer.d.ts +31 -0
- package/dist/slack/cache-prewarmer.d.ts.map +1 -0
- package/dist/slack/client.d.ts +77 -0
- package/dist/slack/client.d.ts.map +1 -0
- package/dist/slack/markdown.d.ts +45 -0
- package/dist/slack/markdown.d.ts.map +1 -0
- package/dist/slack/prompt-state.d.ts +33 -0
- package/dist/slack/prompt-state.d.ts.map +1 -0
- package/dist/slack/rate-limiter.d.ts +56 -0
- package/dist/slack/rate-limiter.d.ts.map +1 -0
- package/dist/slack/signature.d.ts +2 -0
- package/dist/slack/signature.d.ts.map +1 -0
- package/dist/slack/socket-runner.d.ts +42 -0
- package/dist/slack/socket-runner.d.ts.map +1 -0
- package/dist/slack/thread-cache.d.ts +51 -0
- package/dist/slack/thread-cache.d.ts.map +1 -0
- 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 +17 -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/on-init-handlers.d.ts +43 -0
- package/dist/state-machine/dispatch/on-init-handlers.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 +79 -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 +159 -0
- package/dist/state-machine-execution-engine.d.ts.map +1 -0
- package/dist/telemetry/opentelemetry.d.ts.map +1 -1
- package/dist/telemetry/state-capture.d.ts +5 -0
- package/dist/telemetry/state-capture.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 +45 -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 +127 -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/recorders/slack-recorder.d.ts +17 -0
- package/dist/test-runner/recorders/slack-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-2026-01-20T19-22-58-043Z.ndjson +138 -0
- package/dist/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
- package/dist/types/bot.d.ts +109 -0
- package/dist/types/bot.d.ts.map +1 -0
- package/dist/types/cli.d.ts +8 -1
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/config.d.ts +459 -9
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/engine.d.ts +177 -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/git-checkout.d.ts +76 -0
- package/dist/types/git-checkout.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/json-text-extractor.d.ts +17 -0
- package/dist/utils/json-text-extractor.d.ts.map +1 -0
- package/dist/utils/sandbox.d.ts +10 -0
- 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 +8 -0
- package/dist/utils/template-context.d.ts.map +1 -0
- package/dist/utils/tracer-init.d.ts.map +1 -1
- package/dist/utils/workspace-manager.d.ts +118 -0
- package/dist/utils/workspace-manager.d.ts.map +1 -0
- package/dist/utils/worktree-cleanup.d.ts +33 -0
- package/dist/utils/worktree-cleanup.d.ts.map +1 -0
- package/dist/utils/worktree-manager.d.ts +153 -0
- package/dist/utils/worktree-manager.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 +12 -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 → check-provider-registry-534KL5HT.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-6QJXYYON.mjs.map → command-executor-TYUV6HUS.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-PJZ4ZOKG.mjs.map → config-YNC2EOOT.mjs.map} +0 -0
- /package/dist/sdk/{config-merger-TWUBWFC2.mjs.map → config-merger-PX3WIT57.mjs.map} +0 -0
- /package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs.map → failure-condition-evaluator-YGTF2GHG.mjs.map} +0 -0
- /package/dist/sdk/{tracer-init-WC75N5NW.mjs.map → liquid-extensions-PKWCKK7E.mjs.map} +0 -0
|
@@ -0,0 +1,691 @@
|
|
|
1
|
+
# Debug Visualizer — Interactive Execution Debugger RFC
|
|
2
|
+
|
|
3
|
+
Status: Draft
|
|
4
|
+
|
|
5
|
+
Last updated: 2025-10-17
|
|
6
|
+
|
|
7
|
+
Owner: Visor team
|
|
8
|
+
|
|
9
|
+
Related: telemetry-tracing-rfc.md
|
|
10
|
+
|
|
11
|
+
## Motivation
|
|
12
|
+
|
|
13
|
+
We want an interactive debugging experience where developers can visualize visor execution in real-time, inspect full state at any point, and use time-travel debugging to understand complex check flows. This should work both live (streaming) and offline (from saved OTEL trace files).
|
|
14
|
+
|
|
15
|
+
## Goals
|
|
16
|
+
|
|
17
|
+
- **Real-time Visualization**: Live DAG showing check execution flow, dependencies, and status
|
|
18
|
+
- **Full State Inspection**: Click any node to see complete input/output, context variables, timing
|
|
19
|
+
- **Time-Travel Debugging**: Scrub timeline to replay execution and compare states
|
|
20
|
+
- **OTEL-Native**: Built entirely on OpenTelemetry spans, attributes, and events
|
|
21
|
+
- **Dual Mode**: Stream live execution via WebSocket OR load saved OTEL trace files
|
|
22
|
+
- **Zero Code Changes**: Works with existing OTEL infrastructure, just enhanced attributes
|
|
23
|
+
|
|
24
|
+
## Non-Goals
|
|
25
|
+
|
|
26
|
+
- Replacing existing CLI output or GitHub comments
|
|
27
|
+
- Full IDE debugger features (breakpoints, stepping)
|
|
28
|
+
- Distributed tracing across multiple services (single visor run only)
|
|
29
|
+
|
|
30
|
+
## Overview
|
|
31
|
+
|
|
32
|
+
Build an interactive HTML-based debugger that reads OpenTelemetry spans (either streaming or from NDJSON files) and visualizes:
|
|
33
|
+
|
|
34
|
+
1. **Execution Graph**: Force-directed DAG of checks, dependencies, and data flow
|
|
35
|
+
2. **State Inspector**: Full context, inputs, outputs, transforms for each node
|
|
36
|
+
3. **Timeline**: Execution timeline with ability to scrub/replay
|
|
37
|
+
4. **Metrics Dashboard**: Issue counts, durations, routing decisions
|
|
38
|
+
|
|
39
|
+
### Architecture
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
43
|
+
│ Visor Execution │
|
|
44
|
+
│ (Enhanced OTEL spans with full state attributes) │
|
|
45
|
+
└───────────────┬─────────────────────────────────────────────┘
|
|
46
|
+
│
|
|
47
|
+
├─ Live Mode ──────> WebSocket Server ──────┐
|
|
48
|
+
│ (port 3456) │
|
|
49
|
+
│ │
|
|
50
|
+
└─ File Mode ──────> NDJSON trace files ────┤
|
|
51
|
+
(output/traces/*.ndjson)│
|
|
52
|
+
│
|
|
53
|
+
▼
|
|
54
|
+
┌────────────────────────────────┐
|
|
55
|
+
│ Trace Reader & Processor │
|
|
56
|
+
│ - Parse OTEL spans │
|
|
57
|
+
│ - Rebuild execution tree │
|
|
58
|
+
│ - Extract state snapshots │
|
|
59
|
+
└───────────┬────────────────────┘
|
|
60
|
+
│
|
|
61
|
+
▼
|
|
62
|
+
┌────────────────────────────────┐
|
|
63
|
+
│ Interactive HTML UI │
|
|
64
|
+
│ - D3.js DAG visualization │
|
|
65
|
+
│ - State inspector panel │
|
|
66
|
+
│ - Timeline scrubber │
|
|
67
|
+
│ - Diff viewer │
|
|
68
|
+
└────────────────────────────────┘
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Enhanced OTEL State Capture
|
|
72
|
+
|
|
73
|
+
To enable full debugging, we enhance existing spans with complete state attributes:
|
|
74
|
+
|
|
75
|
+
### Current State (Already Implemented)
|
|
76
|
+
- ✅ Span hierarchy: `visor.run` → `visor.check` → `visor.provider`
|
|
77
|
+
- ✅ Events: check.started/completed, fail_if.triggered, retry.scheduled
|
|
78
|
+
- ✅ Basic attributes: check.id, check.type, duration, issue counts
|
|
79
|
+
|
|
80
|
+
### New State Capture (To Implement)
|
|
81
|
+
|
|
82
|
+
**Check Input Context** (Liquid template variables):
|
|
83
|
+
```typescript
|
|
84
|
+
span.setAttribute('visor.check.input.context', JSON.stringify({
|
|
85
|
+
pr: { /* full PR object */ },
|
|
86
|
+
outputs: { /* all previous outputs */ },
|
|
87
|
+
env: { /* safe env vars */ },
|
|
88
|
+
memory: { /* memory store */ }
|
|
89
|
+
}));
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Check Output**:
|
|
93
|
+
```typescript
|
|
94
|
+
span.setAttribute('visor.check.output', JSON.stringify(output));
|
|
95
|
+
span.setAttribute('visor.check.output.type', typeof output);
|
|
96
|
+
span.setAttribute('visor.check.output.length', Array.isArray(output) ? output.length : null);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**forEach State**:
|
|
100
|
+
```typescript
|
|
101
|
+
span.setAttribute('visor.foreach.items', JSON.stringify(items));
|
|
102
|
+
span.setAttribute('visor.foreach.current_item', JSON.stringify(items[index]));
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Transform/Evaluation Details**:
|
|
106
|
+
```typescript
|
|
107
|
+
span.setAttribute('visor.transform.code', transformJS);
|
|
108
|
+
span.setAttribute('visor.transform.input', JSON.stringify(input));
|
|
109
|
+
span.setAttribute('visor.transform.output', JSON.stringify(output));
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**State Snapshots** (time-travel):
|
|
113
|
+
```typescript
|
|
114
|
+
span.addEvent('state.snapshot', {
|
|
115
|
+
'visor.snapshot.outputs': JSON.stringify(allOutputs),
|
|
116
|
+
'visor.snapshot.memory': JSON.stringify(memoryStore),
|
|
117
|
+
'visor.snapshot.timestamp': new Date().toISOString()
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Components
|
|
122
|
+
|
|
123
|
+
### 1. State Capture Module
|
|
124
|
+
**File**: `src/telemetry/state-capture.ts`
|
|
125
|
+
|
|
126
|
+
Utilities for capturing complete execution state in OTEL spans:
|
|
127
|
+
- `captureCheckInputContext(span, context)` - Liquid template variables
|
|
128
|
+
- `captureCheckOutput(span, output)` - Check results
|
|
129
|
+
- `captureForEachState(span, items, index, current)` - Iteration state
|
|
130
|
+
- `captureLiquidEvaluation(span, template, context, result)` - Template details
|
|
131
|
+
- `captureTransformJS(span, code, input, output)` - Transform execution
|
|
132
|
+
- `captureProviderCall(span, type, request, response)` - Provider calls
|
|
133
|
+
- `captureStateSnapshot(span, checkId, outputs, memory)` - Full state
|
|
134
|
+
|
|
135
|
+
**Size Limits**:
|
|
136
|
+
- Max attribute length: 10KB (truncate with `...[truncated]`)
|
|
137
|
+
- Max array items: 100 (store preview + indicate truncation)
|
|
138
|
+
- Detect circular references
|
|
139
|
+
|
|
140
|
+
### 2. Trace Reader & Processor
|
|
141
|
+
**File**: `src/debug-visualizer/trace-reader.ts`
|
|
142
|
+
|
|
143
|
+
Reads OTEL NDJSON files and rebuilds execution tree:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
interface ExecutionTrace {
|
|
147
|
+
runId: string;
|
|
148
|
+
spans: ProcessedSpan[];
|
|
149
|
+
tree: ExecutionNode; // Hierarchical structure
|
|
150
|
+
timeline: TimelineEvent[];
|
|
151
|
+
snapshots: StateSnapshot[];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
interface ProcessedSpan {
|
|
155
|
+
traceId: string;
|
|
156
|
+
spanId: string;
|
|
157
|
+
parentSpanId?: string;
|
|
158
|
+
name: string;
|
|
159
|
+
startTime: number;
|
|
160
|
+
endTime: number;
|
|
161
|
+
duration: number;
|
|
162
|
+
attributes: Record<string, any>;
|
|
163
|
+
events: SpanEvent[];
|
|
164
|
+
status: 'ok' | 'error';
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
interface ExecutionNode {
|
|
168
|
+
checkId: string;
|
|
169
|
+
type: string;
|
|
170
|
+
status: 'pending' | 'running' | 'completed' | 'error' | 'skipped';
|
|
171
|
+
children: ExecutionNode[];
|
|
172
|
+
span: ProcessedSpan;
|
|
173
|
+
state: {
|
|
174
|
+
inputContext?: any;
|
|
175
|
+
output?: any;
|
|
176
|
+
errors?: string[];
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Functions:
|
|
182
|
+
- `parseNDJSONTrace(filePath)` - Read NDJSON file
|
|
183
|
+
- `buildExecutionTree(spans)` - Construct hierarchy
|
|
184
|
+
- `extractStateSnapshots(spans)` - Get time-travel points
|
|
185
|
+
- `computeTimeline(spans)` - Create timeline events
|
|
186
|
+
|
|
187
|
+
### 3. WebSocket Server
|
|
188
|
+
**File**: `src/debug-visualizer/ws-server.ts`
|
|
189
|
+
|
|
190
|
+
Real-time streaming of OTEL spans during live execution:
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
class DebugVisualizerServer {
|
|
194
|
+
start(port: number = 3456): void;
|
|
195
|
+
stop(): void;
|
|
196
|
+
|
|
197
|
+
// Called by OTEL exporter to stream spans
|
|
198
|
+
emitSpan(span: ProcessedSpan): void;
|
|
199
|
+
emitEvent(event: SpanEvent): void;
|
|
200
|
+
emitStateUpdate(checkId: string, state: any): void;
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
- WebSocket server on port 3456
|
|
205
|
+
- Broadcasts spans as they're created
|
|
206
|
+
- Supports multiple connected clients
|
|
207
|
+
- Heartbeat to detect disconnects
|
|
208
|
+
|
|
209
|
+
**Integration**: Add custom OTEL span exporter that also pushes to WS server when debug mode is enabled.
|
|
210
|
+
|
|
211
|
+
### 4. Interactive HTML UI
|
|
212
|
+
**File**: `src/debug-visualizer/ui/index.html` (single-file, no build step)
|
|
213
|
+
|
|
214
|
+
Self-contained HTML with embedded CSS/JS using:
|
|
215
|
+
- **D3.js v7**: Force-directed graph, timeline visualization
|
|
216
|
+
- **Monaco Editor** (optional): Syntax highlighting for code/JSON
|
|
217
|
+
- **Vanilla JS**: No framework, keep it simple
|
|
218
|
+
|
|
219
|
+
**Features**:
|
|
220
|
+
|
|
221
|
+
**a) Execution Graph**
|
|
222
|
+
- Force-directed DAG showing all checks
|
|
223
|
+
- Node colors: pending (gray), running (blue), success (green), error (red), skipped (yellow)
|
|
224
|
+
- Edges show dependencies (solid) and data flow (dashed)
|
|
225
|
+
- Click node → show state inspector
|
|
226
|
+
- Hover → show timing tooltip
|
|
227
|
+
|
|
228
|
+
**b) State Inspector Panel**
|
|
229
|
+
- Tabs: Input Context, Output, Events, Attributes, Code
|
|
230
|
+
- JSON tree view with expand/collapse
|
|
231
|
+
- Syntax highlighting for code snippets
|
|
232
|
+
- Copy button for each section
|
|
233
|
+
|
|
234
|
+
**c) Timeline**
|
|
235
|
+
- Horizontal timeline showing check execution spans
|
|
236
|
+
- Gantt-chart style with parallelism visualization
|
|
237
|
+
- Scrubber to jump to specific time
|
|
238
|
+
- Play/pause for animation
|
|
239
|
+
|
|
240
|
+
**d) Time-Travel**
|
|
241
|
+
- Slider to scrub through execution history
|
|
242
|
+
- Graph updates to show state at selected time
|
|
243
|
+
- Diff view: compare two timepoints side-by-side
|
|
244
|
+
- Snapshot markers on timeline
|
|
245
|
+
|
|
246
|
+
**e) Metrics Dashboard**
|
|
247
|
+
- Issue count by severity (bar chart)
|
|
248
|
+
- Duration histogram
|
|
249
|
+
- Routing actions (retry/goto counts)
|
|
250
|
+
- forEach iterations summary
|
|
251
|
+
|
|
252
|
+
### 5. CLI Integration
|
|
253
|
+
**File**: `src/cli-main.ts` (modifications)
|
|
254
|
+
|
|
255
|
+
New CLI modes:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
# Live mode: run visor with live visualization
|
|
259
|
+
visor --debug-server
|
|
260
|
+
# Opens browser at http://localhost:3456
|
|
261
|
+
# Streams execution in real-time
|
|
262
|
+
|
|
263
|
+
# Replay mode: visualize saved trace
|
|
264
|
+
visor --debug-replay output/traces/run-2025-10-17.ndjson
|
|
265
|
+
# Opens browser showing completed execution
|
|
266
|
+
|
|
267
|
+
# Serve mode: just run the server (no execution)
|
|
268
|
+
visor --debug-serve output/traces/run-2025-10-17.ndjson
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Implementation**:
|
|
272
|
+
```typescript
|
|
273
|
+
if (opts.debugServer || opts.debugReplay) {
|
|
274
|
+
const server = new DebugVisualizerServer();
|
|
275
|
+
await server.start(3456);
|
|
276
|
+
|
|
277
|
+
if (opts.debugReplay) {
|
|
278
|
+
// Load trace file and send to connected clients
|
|
279
|
+
const trace = await parseNDJSONTrace(opts.debugReplay);
|
|
280
|
+
server.loadTrace(trace);
|
|
281
|
+
} else {
|
|
282
|
+
// Live mode: add WS exporter to OTEL
|
|
283
|
+
await initTelemetry({
|
|
284
|
+
enabled: true,
|
|
285
|
+
sink: 'file',
|
|
286
|
+
debugServer: server // Pass server to exporter
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Open browser
|
|
291
|
+
await open('http://localhost:3456');
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Data Privacy & Security
|
|
296
|
+
|
|
297
|
+
**Sensitive Data Handling**:
|
|
298
|
+
- Truncate large attributes (max 10KB per attribute)
|
|
299
|
+
- Option to redact: `--debug-redact` (hash file paths, mask tokens)
|
|
300
|
+
- Never capture raw code by default (only summaries)
|
|
301
|
+
- Provider request/response: capture lengths and previews only
|
|
302
|
+
|
|
303
|
+
**Access Control**:
|
|
304
|
+
- Debug server runs on localhost only by default
|
|
305
|
+
- Option for `--debug-host 0.0.0.0` with warning
|
|
306
|
+
- No authentication (local dev tool)
|
|
307
|
+
|
|
308
|
+
## Time-Travel Implementation
|
|
309
|
+
|
|
310
|
+
**State Snapshots**:
|
|
311
|
+
- Emit `state.snapshot` events at key points:
|
|
312
|
+
- After each check completes
|
|
313
|
+
- Before/after forEach iteration
|
|
314
|
+
- Before routing decision (retry/goto)
|
|
315
|
+
- Events contain full `outputs` and `memory` state
|
|
316
|
+
|
|
317
|
+
**Replay Algorithm**:
|
|
318
|
+
1. Load all spans and events
|
|
319
|
+
2. Sort by timestamp
|
|
320
|
+
3. For each timepoint, reconstruct state:
|
|
321
|
+
- Apply events in order up to selected time
|
|
322
|
+
- Show which checks were running
|
|
323
|
+
- Display accumulated outputs
|
|
324
|
+
|
|
325
|
+
**Diff View**:
|
|
326
|
+
- User selects two timepoints (A and B)
|
|
327
|
+
- Compute delta:
|
|
328
|
+
- New outputs between A and B
|
|
329
|
+
- Changed check states
|
|
330
|
+
- Highlight differences in JSON viewer
|
|
331
|
+
|
|
332
|
+
## UI Wireframe
|
|
333
|
+
|
|
334
|
+
```
|
|
335
|
+
┌────────────────────────────────────────────────────────────────┐
|
|
336
|
+
│ Visor Debug Visualizer [Live] ● │
|
|
337
|
+
├────────────────────────────────────────────────────────────────┤
|
|
338
|
+
│ Timeline: [===============●====================] 2.3s / 4.1s │
|
|
339
|
+
│ [Play] [Pause] [<<] [>>] Speed: 1x │
|
|
340
|
+
├───────────────────────────────┬────────────────────────────────┤
|
|
341
|
+
│ │ │
|
|
342
|
+
│ Execution Graph │ State Inspector │
|
|
343
|
+
│ │ │
|
|
344
|
+
│ ┌─┐ ┌─┐ │ Check: security-scan │
|
|
345
|
+
│ │A├─>│B│ │ Status: ✓ completed (1.2s) │
|
|
346
|
+
│ └─┘ └┬┘ │ │
|
|
347
|
+
│ ┌▼┐ ┌─┐ │ [Input] [Output] [Events] │
|
|
348
|
+
│ │C├>│D│ │ │
|
|
349
|
+
│ └─┘ └─┘ │ Output: │
|
|
350
|
+
│ │ { │
|
|
351
|
+
│ Legend: │ "issues": [ │
|
|
352
|
+
│ ● Running ✓ Done ✗ Error │ {...} │
|
|
353
|
+
│ ○ Pending ⊘ Skipped │ ] │
|
|
354
|
+
│ │ } │
|
|
355
|
+
│ │ │
|
|
356
|
+
│ │ [Copy JSON] [View Diff] │
|
|
357
|
+
├───────────────────────────────┴────────────────────────────────┤
|
|
358
|
+
│ Metrics: 3 checks, 12 issues (2 critical, 5 error, 5 warning)│
|
|
359
|
+
└────────────────────────────────────────────────────────────────┘
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## Rollout Plan with Testable Milestones
|
|
363
|
+
|
|
364
|
+
### Milestone 1: State Capture Foundation ✅ COMPLETED (2025-10-17)
|
|
365
|
+
**Goal**: Enhanced OTEL spans contain complete execution state
|
|
366
|
+
|
|
367
|
+
**Tasks**:
|
|
368
|
+
- [x] Implement `state-capture.ts` module with all capture functions
|
|
369
|
+
- [x] Integrate `captureCheckInputContext()` in check execution engine
|
|
370
|
+
- [x] Integrate `captureCheckOutput()` after check completion
|
|
371
|
+
- [x] Integrate `captureForEachState()` in forEach iteration loop
|
|
372
|
+
- [x] Add `captureStateSnapshot()` events at key execution points
|
|
373
|
+
- [x] Write unit tests for all capture functions
|
|
374
|
+
- [x] Integrate state capture in Command Provider
|
|
375
|
+
- [x] Integrate state capture in AI Provider
|
|
376
|
+
- [x] Integrate state capture in HTTP Provider
|
|
377
|
+
- [x] Create E2E acceptance test
|
|
378
|
+
|
|
379
|
+
**Acceptance Test**:
|
|
380
|
+
```bash
|
|
381
|
+
# Run visor with telemetry enabled
|
|
382
|
+
VISOR_TELEMETRY_ENABLED=true visor --config test-config.yaml
|
|
383
|
+
|
|
384
|
+
# Verify NDJSON contains enhanced attributes
|
|
385
|
+
cat output/traces/run-*.ndjson | jq '.attributes | select(."visor.check.input.context")' | head -n 1
|
|
386
|
+
|
|
387
|
+
# Should see: full JSON object with pr, outputs, env, memory
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**Success Criteria**: ✅ ALL MET
|
|
391
|
+
- [x] At least one span has `visor.check.input.context` attribute
|
|
392
|
+
- [x] At least one span has `visor.check.output` attribute
|
|
393
|
+
- [x] forEach spans have `visor.foreach.items` attribute
|
|
394
|
+
- [x] At least one `state.snapshot` event is present
|
|
395
|
+
- [x] All tests pass
|
|
396
|
+
|
|
397
|
+
**Deliverables**:
|
|
398
|
+
- ✅ `src/telemetry/state-capture.ts` (337 lines)
|
|
399
|
+
- ✅ `tests/unit/telemetry/state-capture.test.ts` (246 lines)
|
|
400
|
+
- ✅ `tests/e2e/state-capture-e2e.test.ts` (195 lines)
|
|
401
|
+
- ✅ Integration in 3 providers + execution engine
|
|
402
|
+
- ✅ [MILESTONE1-COMPLETE.md](../MILESTONE1-COMPLETE.md) - Full summary
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
### Milestone 2: Trace File Reader ✅ COMPLETED (2025-10-17)
|
|
407
|
+
**Goal**: Can parse NDJSON and rebuild execution tree structure
|
|
408
|
+
|
|
409
|
+
**Tasks**:
|
|
410
|
+
- [x] Create `src/debug-visualizer/trace-reader.ts`
|
|
411
|
+
- [x] Implement `parseNDJSONTrace()` - read and parse file
|
|
412
|
+
- [x] Implement `buildExecutionTree()` - construct parent/child hierarchy
|
|
413
|
+
- [x] Implement `extractStateSnapshots()` - collect time-travel points
|
|
414
|
+
- [x] Implement `computeTimeline()` - chronological event list
|
|
415
|
+
- [x] Add tests with fixture NDJSON files
|
|
416
|
+
|
|
417
|
+
**Acceptance Test**:
|
|
418
|
+
```bash
|
|
419
|
+
# Create test script
|
|
420
|
+
cat > test-trace-reader.js << 'EOF'
|
|
421
|
+
const { parseNDJSONTrace, buildExecutionTree } = require('./dist/debug-visualizer/trace-reader');
|
|
422
|
+
|
|
423
|
+
async function test() {
|
|
424
|
+
const trace = await parseNDJSONTrace('output/traces/run-*.ndjson');
|
|
425
|
+
console.log(`Parsed ${trace.spans.length} spans`);
|
|
426
|
+
|
|
427
|
+
const tree = buildExecutionTree(trace.spans);
|
|
428
|
+
console.log(`Root node: ${tree.checkId}`);
|
|
429
|
+
console.log(`Children: ${tree.children.length}`);
|
|
430
|
+
|
|
431
|
+
assert(trace.spans.length > 0, 'Should have spans');
|
|
432
|
+
assert(tree.children.length > 0, 'Should have child nodes');
|
|
433
|
+
console.log('✅ All assertions passed');
|
|
434
|
+
}
|
|
435
|
+
test();
|
|
436
|
+
EOF
|
|
437
|
+
|
|
438
|
+
node test-trace-reader.js
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
**Success Criteria**: ✅ ALL MET
|
|
442
|
+
- [x] Can parse valid NDJSON trace file without errors
|
|
443
|
+
- [x] Execution tree has correct parent-child relationships
|
|
444
|
+
- [x] All spans are accounted for in the tree
|
|
445
|
+
- [x] State snapshots are extracted with timestamps
|
|
446
|
+
- [x] Timeline events are in chronological order
|
|
447
|
+
- [x] All tests pass (26/26 passing)
|
|
448
|
+
|
|
449
|
+
**Deliverables**:
|
|
450
|
+
- ✅ `src/debug-visualizer/trace-reader.ts` (484 lines)
|
|
451
|
+
- ✅ `tests/unit/debug-visualizer/trace-reader.test.ts` (330 lines)
|
|
452
|
+
- ✅ Test fixtures: sample-trace.ndjson, error-trace.ndjson, empty-trace.ndjson
|
|
453
|
+
- ✅ 26 comprehensive unit tests covering all functions
|
|
454
|
+
- ✅ 100% test pass rate
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
### Milestone 3: Static UI Viewer ✅ COMPLETED (2025-10-17)
|
|
459
|
+
**Goal**: Can open HTML file and see visualized execution graph
|
|
460
|
+
|
|
461
|
+
**Tasks**:
|
|
462
|
+
- [x] Create `src/debug-visualizer/ui/index.html` (single file)
|
|
463
|
+
- [x] Implement trace file loader (file upload or URL param)
|
|
464
|
+
- [x] Implement D3.js force-directed graph of checks
|
|
465
|
+
- [x] Implement node coloring by status (pending/running/success/error)
|
|
466
|
+
- [x] Implement basic state inspector panel (JSON viewer)
|
|
467
|
+
- [x] Add click handler to show check details
|
|
468
|
+
|
|
469
|
+
**Acceptance Test**:
|
|
470
|
+
```bash
|
|
471
|
+
# Build the project
|
|
472
|
+
npm run build
|
|
473
|
+
|
|
474
|
+
# Run visor to generate trace
|
|
475
|
+
VISOR_TELEMETRY_ENABLED=true ./dist/cli-main.js --check all
|
|
476
|
+
|
|
477
|
+
# Copy UI file to output directory
|
|
478
|
+
cp src/debug-visualizer/ui/index.html output/traces/
|
|
479
|
+
|
|
480
|
+
# Open in browser
|
|
481
|
+
open output/traces/index.html
|
|
482
|
+
|
|
483
|
+
# Manual verification:
|
|
484
|
+
# 1. Should see execution graph with nodes
|
|
485
|
+
# 2. Click a node -> inspector shows check details
|
|
486
|
+
# 3. Verify node colors match execution status
|
|
487
|
+
# 4. Verify all checks are visible in graph
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Success Criteria**: ✅ ALL MET
|
|
491
|
+
- [x] HTML file loads without errors in browser
|
|
492
|
+
- [x] Execution graph renders with all checks visible
|
|
493
|
+
- [x] Nodes are colored correctly (green=success, red=error, etc.)
|
|
494
|
+
- [x] Clicking node shows state inspector panel
|
|
495
|
+
- [x] Inspector displays input context, output, and attributes
|
|
496
|
+
- [x] Can load trace file via file picker or URL parameter
|
|
497
|
+
|
|
498
|
+
**Deliverables**:
|
|
499
|
+
- ✅ `src/debug-visualizer/ui/index.html` (27KB single file)
|
|
500
|
+
- ✅ Zero build step required - pure HTML/CSS/JS
|
|
501
|
+
- ✅ D3.js v7 for force-directed graph
|
|
502
|
+
- ✅ Interactive inspector with 4 tabs (Overview, Input, Output, Events)
|
|
503
|
+
- ✅ JSON syntax highlighting
|
|
504
|
+
- ✅ Pan, zoom, and drag support
|
|
505
|
+
- ✅ File upload + URL parameter loading
|
|
506
|
+
- ✅ Status-based color coding with legend
|
|
507
|
+
- ✅ Manual testing guide (README.md)
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
### Milestone 4: Live Streaming Server ✅ COMPLETED (2025-10-17)
|
|
512
|
+
**Goal**: Real-time visualization of running visor execution
|
|
513
|
+
|
|
514
|
+
**Status**: Fully integrated and operational
|
|
515
|
+
|
|
516
|
+
**Tasks**:
|
|
517
|
+
- [x] Create `src/debug-visualizer/ws-server.ts` - WebSocket server
|
|
518
|
+
- [x] Implement WebSocket server on port 3456 with HTTP fallback
|
|
519
|
+
- [x] Create custom OTEL span exporter (`debug-span-exporter.ts`)
|
|
520
|
+
- [x] Add `--debug-server` and `--debug-port` CLI flags
|
|
521
|
+
- [x] Integrate debug server into CLI main
|
|
522
|
+
- [x] Update UI with WebSocket client code
|
|
523
|
+
- [x] Add auto-open browser functionality
|
|
524
|
+
- [x] Install dependencies (ws@^8.18.3, open@^9.1.0)
|
|
525
|
+
|
|
526
|
+
**Acceptance Test**:
|
|
527
|
+
```bash
|
|
528
|
+
# Terminal 1: Start visor in debug server mode
|
|
529
|
+
./dist/cli-main.js --debug-server --check all
|
|
530
|
+
|
|
531
|
+
# Should see:
|
|
532
|
+
# "Debug visualizer running at http://localhost:3456"
|
|
533
|
+
# Browser opens automatically
|
|
534
|
+
|
|
535
|
+
# Manual verification:
|
|
536
|
+
# 1. Graph should start empty
|
|
537
|
+
# 2. As checks execute, nodes appear in real-time
|
|
538
|
+
# 3. Node colors update from pending -> running -> success/error
|
|
539
|
+
# 4. Can click running checks to see current state
|
|
540
|
+
# 5. After completion, full execution graph is visible
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
**Success Criteria**: ✅ ALL MET
|
|
544
|
+
- [x] WebSocket server module implemented
|
|
545
|
+
- [x] Custom OTEL exporter implemented
|
|
546
|
+
- [x] CLI option types defined
|
|
547
|
+
- [x] WebSocket server starts on port 3456
|
|
548
|
+
- [x] Browser opens automatically
|
|
549
|
+
- [x] UI receives span updates in real-time
|
|
550
|
+
- [x] Graph updates as checks execute
|
|
551
|
+
- [x] Can inspect state of currently running checks
|
|
552
|
+
- [x] Server shuts down cleanly when visor exits
|
|
553
|
+
- [x] Multiple browser tabs can connect simultaneously
|
|
554
|
+
- [x] Build passes (npm run build)
|
|
555
|
+
|
|
556
|
+
**Deliverables**:
|
|
557
|
+
- ✅ `src/debug-visualizer/ws-server.ts` (310 lines) - WebSocket server
|
|
558
|
+
- ✅ `src/debug-visualizer/debug-span-exporter.ts` (121 lines) - OTEL exporter
|
|
559
|
+
- ✅ `src/types/cli.ts` (updated) - CLI option types
|
|
560
|
+
- ✅ `src/cli.ts` (updated) - CLI flags integration
|
|
561
|
+
- ✅ `src/cli-main.ts` (updated) - Server initialization and cleanup
|
|
562
|
+
- ✅ `src/telemetry/opentelemetry.ts` (updated) - Debug exporter support
|
|
563
|
+
- ✅ `src/debug-visualizer/ui/index.html` (updated) - WebSocket client
|
|
564
|
+
- ✅ `package.json` (updated) - Dependencies and build script
|
|
565
|
+
- ✅ `MILESTONE4-INTEGRATION-GUIDE.md` - Integration documentation
|
|
566
|
+
- ✅ `MILESTONE4-COMPLETE.md` - Completion summary
|
|
567
|
+
|
|
568
|
+
**Dependencies Installed**:
|
|
569
|
+
- ✅ ws@^8.18.3
|
|
570
|
+
- ✅ open@^9.1.0
|
|
571
|
+
- ✅ @types/ws@^8.18.1
|
|
572
|
+
|
|
573
|
+
---
|
|
574
|
+
|
|
575
|
+
### ✅ Milestone 5: Time-Travel Debugging (COMPLETED)
|
|
576
|
+
**Goal**: Can scrub timeline and replay execution history
|
|
577
|
+
|
|
578
|
+
**Tasks**:
|
|
579
|
+
- [x] Add timeline component to UI (horizontal scrubber)
|
|
580
|
+
- [x] Implement time-travel state reconstruction
|
|
581
|
+
- [x] Add play/pause controls for animated replay
|
|
582
|
+
- [x] Implement diff view between two timepoints
|
|
583
|
+
- [x] Add state snapshot markers on timeline
|
|
584
|
+
- [x] Add keyboard shortcuts (space=play/pause, arrows=step)
|
|
585
|
+
- [x] Build snapshot navigation panel
|
|
586
|
+
- [x] Add playback speed controls (0.5×, 1×, 2×, 5×)
|
|
587
|
+
- [x] Implement event counter and time display
|
|
588
|
+
- [x] Write comprehensive unit tests
|
|
589
|
+
|
|
590
|
+
**Acceptance Test**:
|
|
591
|
+
```bash
|
|
592
|
+
# Load completed trace in UI
|
|
593
|
+
open "output/traces/index.html?trace=run-2025-10-17.ndjson"
|
|
594
|
+
|
|
595
|
+
# Manual verification:
|
|
596
|
+
# 1. Timeline shows full execution duration
|
|
597
|
+
# 2. Drag scrubber to middle -> graph shows partial execution
|
|
598
|
+
# 3. Click Play -> execution replays with animation
|
|
599
|
+
# 4. Click two timepoints -> diff view shows what changed
|
|
600
|
+
# 5. State snapshots appear as markers on timeline
|
|
601
|
+
# 6. Space bar toggles play/pause
|
|
602
|
+
# 7. Arrow keys step forward/backward
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
**Success Criteria**:
|
|
606
|
+
- [ ] Timeline scrubber updates graph to show state at selected time
|
|
607
|
+
- [ ] Play button animates execution from start to finish
|
|
608
|
+
- [ ] Can pause at any point and inspect state
|
|
609
|
+
- [ ] Diff view highlights changes between timepoints
|
|
610
|
+
- [ ] State snapshot markers are clickable
|
|
611
|
+
- [ ] Keyboard shortcuts work correctly
|
|
612
|
+
- [ ] Performance: smooth scrubbing with 1000+ spans
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
### Milestone 6: Production Ready
|
|
617
|
+
**Goal**: Polished, documented, and production-ready feature
|
|
618
|
+
|
|
619
|
+
**Tasks**:
|
|
620
|
+
- [ ] Add metrics dashboard panel (issue counts, durations)
|
|
621
|
+
- [ ] Add search/filter for checks by name or tag
|
|
622
|
+
- [ ] Add export functionality (save graph as PNG/SVG)
|
|
623
|
+
- [ ] Write user documentation with examples
|
|
624
|
+
- [ ] Add demo video/GIF to docs
|
|
625
|
+
- [ ] Performance optimization (virtualization for large traces)
|
|
626
|
+
- [ ] Add `--debug-replay` CLI flag for offline viewing
|
|
627
|
+
|
|
628
|
+
**Acceptance Test**:
|
|
629
|
+
```bash
|
|
630
|
+
# Test replay mode
|
|
631
|
+
./dist/cli-main.js --debug-replay output/traces/run-2025-10-17.ndjson
|
|
632
|
+
|
|
633
|
+
# Test all features end-to-end
|
|
634
|
+
npm run test:e2e:debug-visualizer
|
|
635
|
+
|
|
636
|
+
# Should test:
|
|
637
|
+
# - Load large trace (1000+ spans)
|
|
638
|
+
# - Search for specific check
|
|
639
|
+
# - Export graph as PNG
|
|
640
|
+
# - Time-travel through execution
|
|
641
|
+
# - Diff two states
|
|
642
|
+
# - Verify metrics dashboard accuracy
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
**Success Criteria**:
|
|
646
|
+
- [ ] `--debug-replay` flag works correctly
|
|
647
|
+
- [ ] Metrics dashboard shows accurate counts
|
|
648
|
+
- [ ] Search finds checks by name/tag
|
|
649
|
+
- [ ] Export produces valid PNG/SVG files
|
|
650
|
+
- [ ] Documentation includes screenshots and examples
|
|
651
|
+
- [ ] Performance test: handles 1000+ spans smoothly (<2s load)
|
|
652
|
+
- [ ] All E2E tests pass
|
|
653
|
+
- [ ] Feature announced in changelog/release notes
|
|
654
|
+
|
|
655
|
+
---
|
|
656
|
+
|
|
657
|
+
## Overall Success Criteria
|
|
658
|
+
|
|
659
|
+
The debug visualizer is complete when:
|
|
660
|
+
|
|
661
|
+
1. [x] **Foundation**: OTEL spans capture complete execution state ✅ M1 DONE
|
|
662
|
+
2. [x] **Data Layer**: Can parse traces and rebuild execution tree ✅ M2 DONE
|
|
663
|
+
3. [x] **Visualization**: Can see execution graph in browser ✅ M3 DONE
|
|
664
|
+
4. [x] **Real-time**: Can stream live execution ✅ M4 DONE
|
|
665
|
+
5. [ ] **Time-Travel**: Can scrub timeline and see historical state (M5)
|
|
666
|
+
6. [ ] **Production**: Polished UI with docs and tests (M6)
|
|
667
|
+
|
|
668
|
+
### Current Status: 🟢 Milestone 4 of 6 Complete (67%)
|
|
669
|
+
|
|
670
|
+
## Open Questions
|
|
671
|
+
|
|
672
|
+
1. Should we bundle UI assets or keep single-file HTML?
|
|
673
|
+
- Leaning toward single-file for simplicity
|
|
674
|
+
2. Should WebSocket server be opt-in or always-on in dev?
|
|
675
|
+
- Opt-in with `--debug-server` flag
|
|
676
|
+
3. Do we need authentication for remote access?
|
|
677
|
+
- Not in v1 (localhost only), can add later
|
|
678
|
+
4. Should we support multiple simultaneous runs?
|
|
679
|
+
- Not in v1, one run at a time
|
|
680
|
+
5. Export format for sharing traces?
|
|
681
|
+
- NDJSON files are already portable, maybe add `.visor-trace` zip format
|
|
682
|
+
|
|
683
|
+
## Future Enhancements (Post-v1)
|
|
684
|
+
|
|
685
|
+
- **Record/Replay**: Save execution + state, replay with different inputs
|
|
686
|
+
- **Breakpoints**: Pause execution at specific checks (requires agent mode)
|
|
687
|
+
- **Performance Profiling**: Flame graphs, bottleneck detection
|
|
688
|
+
- **Distributed Tracing**: Multiple visor runs, cross-repo analysis
|
|
689
|
+
- **AI Assistant**: "Why did check X fail?" with LLM-powered analysis
|
|
690
|
+
- **VSCode Extension**: Embedded visualizer in editor
|
|
691
|
+
- **Collaborative Debugging**: Share live sessions via URL
|