@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.
Files changed (530) hide show
  1. package/README.md +71 -2
  2. package/action.yml +1 -1
  3. package/defaults/code-refiner.yaml +114 -0
  4. package/defaults/{.visor.yaml → code-review.yaml} +35 -226
  5. package/defaults/override.yaml +52 -0
  6. package/defaults/task-refinement.yaml +624 -0
  7. package/defaults/visor.tests.yaml +685 -0
  8. package/defaults/visor.yaml +483 -0
  9. package/dist/action-cli-bridge.d.ts +11 -82
  10. package/dist/action-cli-bridge.d.ts.map +1 -1
  11. package/dist/ai-review-service.d.ts +28 -9
  12. package/dist/ai-review-service.d.ts.map +1 -1
  13. package/dist/check-execution-engine.d.ts +19 -331
  14. package/dist/check-execution-engine.d.ts.map +1 -1
  15. package/dist/cli-main.d.ts.map +1 -1
  16. package/dist/cli.d.ts +0 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/config.d.ts +16 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/cron-scheduler.d.ts +3 -3
  21. package/dist/cron-scheduler.d.ts.map +1 -1
  22. package/dist/debug-visualizer/ws-server.d.ts +7 -1
  23. package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
  24. package/dist/defaults/code-refiner.yaml +114 -0
  25. package/dist/defaults/{.visor.yaml → code-review.yaml} +35 -226
  26. package/dist/defaults/override.yaml +52 -0
  27. package/dist/defaults/task-refinement.yaml +624 -0
  28. package/dist/defaults/visor.tests.yaml +685 -0
  29. package/dist/defaults/visor.yaml +483 -0
  30. package/dist/docs/DEPLOYMENT.md +118 -0
  31. package/dist/docs/GITHUB_CHECKS.md +280 -0
  32. package/dist/docs/NPM_USAGE.md +208 -0
  33. package/dist/docs/action-reference.md +19 -0
  34. package/dist/docs/advanced-ai.md +237 -0
  35. package/dist/docs/ai-configuration.md +535 -0
  36. package/dist/docs/ai-custom-tools-usage.md +261 -0
  37. package/dist/docs/ai-custom-tools.md +392 -0
  38. package/dist/docs/author-permissions.md +610 -0
  39. package/dist/docs/bot-transports-rfc.md +23 -0
  40. package/dist/docs/ci-cli-mode.md +34 -0
  41. package/dist/docs/claude-code.md +74 -0
  42. package/dist/docs/command-provider.md +559 -0
  43. package/dist/docs/commands.md +8 -0
  44. package/dist/docs/configuration.md +324 -0
  45. package/dist/docs/custom-tools.md +424 -0
  46. package/dist/docs/dashboards/README.md +23 -0
  47. package/dist/docs/dashboards/grafana-visor-diagrams.json +20 -0
  48. package/dist/docs/dashboards/grafana-visor-overview.json +33 -0
  49. package/dist/docs/debug-visualizer-progress.md +572 -0
  50. package/dist/docs/debug-visualizer-rfc.md +691 -0
  51. package/dist/docs/debug-visualizer.md +114 -0
  52. package/dist/docs/debugging.md +636 -0
  53. package/dist/docs/default-output-schema.md +28 -0
  54. package/dist/docs/dependencies.md +369 -0
  55. package/dist/docs/dev-playbook.md +9 -0
  56. package/dist/docs/engine-pause-resume-rfc.md +192 -0
  57. package/dist/docs/engine-state-machine-plan.md +333 -0
  58. package/dist/docs/event-driven-github-integration-rfc.md +743 -0
  59. package/dist/docs/event-triggers.md +292 -0
  60. package/dist/docs/execution-statistics-rfc.md +290 -0
  61. package/dist/docs/fact-validator-gap-analysis.md +178 -0
  62. package/dist/docs/fact-validator-implementation-plan.md +1235 -0
  63. package/dist/docs/fail-if.md +95 -0
  64. package/dist/docs/failure-conditions-implementation.md +271 -0
  65. package/dist/docs/failure-conditions-schema.md +173 -0
  66. package/dist/docs/failure-routing-rfc.md +193 -0
  67. package/dist/docs/failure-routing.md +507 -0
  68. package/dist/docs/foreach-dependency-propagation.md +473 -0
  69. package/dist/docs/github-ops.md +89 -0
  70. package/dist/docs/goto-forward-run-plan.md +113 -0
  71. package/dist/docs/guides/criticality-modes.md +332 -0
  72. package/dist/docs/guides/fault-management-and-contracts.md +738 -0
  73. package/dist/docs/guides/workflow-style-guide.md +224 -0
  74. package/dist/docs/http.md +299 -0
  75. package/dist/docs/human-input-provider.md +372 -0
  76. package/dist/docs/lifecycle-hooks.md +253 -0
  77. package/dist/docs/limits.md +64 -0
  78. package/dist/docs/liquid-templates.md +490 -0
  79. package/dist/docs/loop-routing-refactor.md +89 -0
  80. package/dist/docs/mcp-provider.md +557 -0
  81. package/dist/docs/mcp.md +124 -0
  82. package/dist/docs/memory.md +903 -0
  83. package/dist/docs/observability.md +12 -0
  84. package/dist/docs/output-formats.md +20 -0
  85. package/dist/docs/output-formatting.md +29 -0
  86. package/dist/docs/output-history.md +383 -0
  87. package/dist/docs/performance.md +6 -0
  88. package/dist/docs/pluggable.md +124 -0
  89. package/dist/docs/proposals/snapshot-scope-execution.md +236 -0
  90. package/dist/docs/providers/git-checkout.md +589 -0
  91. package/dist/docs/recipes.md +474 -0
  92. package/dist/docs/rfc/git-checkout-step.md +601 -0
  93. package/dist/docs/rfc/on_init-hook.md +1294 -0
  94. package/dist/docs/rfc/workspace-isolation.md +216 -0
  95. package/dist/docs/roadmap/criticality-implementation-tasks.md +92 -0
  96. package/dist/docs/router-patterns.md +339 -0
  97. package/dist/docs/schema-next-pr.md +10 -0
  98. package/dist/docs/schema-templates.md +68 -0
  99. package/dist/docs/script.md +34 -0
  100. package/dist/docs/sdk.md +222 -0
  101. package/dist/docs/security.md +7 -0
  102. package/dist/docs/suppressions.md +89 -0
  103. package/dist/docs/tag-filtering.md +258 -0
  104. package/dist/docs/telemetry-setup.md +119 -0
  105. package/dist/docs/telemetry-tracing-rfc.md +275 -0
  106. package/dist/docs/test-framework-rfc.md +680 -0
  107. package/dist/docs/testing/assertions.md +85 -0
  108. package/dist/docs/testing/ci.md +44 -0
  109. package/dist/docs/testing/cli.md +41 -0
  110. package/dist/docs/testing/cookbook.md +172 -0
  111. package/dist/docs/testing/dsl-reference.md +199 -0
  112. package/dist/docs/testing/fixtures-and-mocks.md +91 -0
  113. package/dist/docs/testing/flows.md +92 -0
  114. package/dist/docs/testing/getting-started.md +93 -0
  115. package/dist/docs/testing/troubleshooting.md +55 -0
  116. package/dist/docs/timeouts.md +50 -0
  117. package/dist/docs/troubleshooting.md +7 -0
  118. package/dist/docs/visor-sdk-rfc.md +186 -0
  119. package/dist/docs/workflows.md +569 -0
  120. package/dist/engine/on-finish/orchestrator.d.ts +19 -0
  121. package/dist/engine/on-finish/orchestrator.d.ts.map +1 -0
  122. package/dist/engine/on-finish/utils.d.ts +44 -0
  123. package/dist/engine/on-finish/utils.d.ts.map +1 -0
  124. package/dist/event-bus/event-bus.d.ts +13 -0
  125. package/dist/event-bus/event-bus.d.ts.map +1 -0
  126. package/dist/event-bus/types.d.ts +71 -0
  127. package/dist/event-bus/types.d.ts.map +1 -0
  128. package/dist/examples/.claude/agents/code-reviewer.md +69 -0
  129. package/dist/examples/.mcp.json +34 -0
  130. package/dist/examples/CALCULATOR-SDK.md +364 -0
  131. package/dist/examples/README.md +384 -0
  132. package/dist/examples/ai-custom-tools-example.yaml +206 -0
  133. package/dist/examples/ai-custom-tools-simple.yaml +76 -0
  134. package/dist/examples/ai-retry-fallback-config.yaml +180 -0
  135. package/dist/examples/ai-with-bash.yaml +126 -0
  136. package/dist/examples/ai-with-mcp.yaml +82 -0
  137. package/dist/examples/basic-human-input.yaml +15 -0
  138. package/dist/examples/bedrock-config.yaml +77 -0
  139. package/dist/examples/calculator-config.yaml +133 -0
  140. package/dist/examples/calculator-json-output-guide.md +311 -0
  141. package/dist/examples/calculator-sdk-automated.ts +340 -0
  142. package/dist/examples/calculator-sdk-example.ts +275 -0
  143. package/dist/examples/calculator-sdk-json.ts +331 -0
  144. package/dist/examples/calculator-sdk-real.ts +374 -0
  145. package/dist/examples/calculator-sdk-test.ts +148 -0
  146. package/dist/examples/claude-code-config.yaml +191 -0
  147. package/dist/examples/cron-webhook-config.yaml +215 -0
  148. package/dist/examples/custom-template.liquid +57 -0
  149. package/dist/examples/custom-tools-example.yaml +281 -0
  150. package/dist/examples/enhanced-config.yaml +165 -0
  151. package/dist/examples/environments/visor.base.yaml +92 -0
  152. package/dist/examples/environments/visor.dev.yaml +33 -0
  153. package/dist/examples/environments/visor.prod.yaml +95 -0
  154. package/dist/examples/environments/visor.staging.yaml +46 -0
  155. package/dist/examples/fact-validator.yaml +361 -0
  156. package/dist/examples/fail-if-simple.yaml +90 -0
  157. package/dist/examples/failure-conditions-advanced.yaml +136 -0
  158. package/dist/examples/failure-conditions-basic.yaml +48 -0
  159. package/dist/examples/failure-conditions-github-style.yaml +119 -0
  160. package/dist/examples/failure-conditions-migration.yaml +74 -0
  161. package/dist/examples/for-loop-example.yaml +176 -0
  162. package/dist/examples/forEach-example.yaml +120 -0
  163. package/dist/examples/git-checkout-basic.yaml +32 -0
  164. package/dist/examples/git-checkout-compare.yaml +59 -0
  165. package/dist/examples/git-checkout-cross-repo.yaml +76 -0
  166. package/dist/examples/github-workflow-with-tags.yml +163 -0
  167. package/dist/examples/http-integration-config.yaml +240 -0
  168. package/dist/examples/https-server-config.yaml +209 -0
  169. package/dist/examples/human-input-example.yaml +63 -0
  170. package/dist/examples/if-conditions.yaml +173 -0
  171. package/dist/examples/jira-simple-example.yaml +56 -0
  172. package/dist/examples/jira-single-issue-workflow.yaml +166 -0
  173. package/dist/examples/jira-workflow-mcp.yaml +182 -0
  174. package/dist/examples/mcp/analyzer.py +119 -0
  175. package/dist/examples/mcp-provider-example.yaml +301 -0
  176. package/dist/examples/memory-counter.yaml +99 -0
  177. package/dist/examples/memory-error-collection.yaml +104 -0
  178. package/dist/examples/memory-exec-js.yaml +247 -0
  179. package/dist/examples/memory-namespace-isolation.yaml +184 -0
  180. package/dist/examples/memory-retry-counter.yaml +65 -0
  181. package/dist/examples/memory-state-machine.yaml +170 -0
  182. package/dist/examples/on-init-import-demo.yaml +179 -0
  183. package/dist/examples/outputs-raw-basic.yaml +26 -0
  184. package/dist/examples/project-with-tools.yaml +174 -0
  185. package/dist/examples/prompts/architecture-analysis.liquid +116 -0
  186. package/dist/examples/prompts/security-comprehensive.liquid +107 -0
  187. package/dist/examples/quick-start-tags.yaml +53 -0
  188. package/dist/examples/reusable-tools.yaml +92 -0
  189. package/dist/examples/reusable-workflows.yaml +88 -0
  190. package/dist/examples/routing-basic.yaml +35 -0
  191. package/dist/examples/routing-dynamic-js.yaml +46 -0
  192. package/dist/examples/routing-foreach.yaml +34 -0
  193. package/dist/examples/routing-goto-event.yaml +34 -0
  194. package/dist/examples/routing-on-success.yaml +25 -0
  195. package/dist/examples/run-calculator-demo.sh +71 -0
  196. package/dist/examples/sdk-basic.mjs +10 -0
  197. package/dist/examples/sdk-cjs.cjs +10 -0
  198. package/dist/examples/sdk-comprehensive.mjs +175 -0
  199. package/dist/examples/sdk-manual-config.mjs +65 -0
  200. package/dist/examples/sdk-typescript.js +81 -0
  201. package/dist/examples/sdk-typescript.ts +92 -0
  202. package/dist/examples/session-reuse-config.yaml +151 -0
  203. package/dist/examples/session-reuse-self.yaml +81 -0
  204. package/dist/examples/slack-simple-chat.yaml +775 -0
  205. package/dist/examples/templates/security-report.liquid +137 -0
  206. package/dist/examples/tools-library.yaml +281 -0
  207. package/dist/examples/transform-example.yaml +199 -0
  208. package/dist/examples/visor-with-tags.yaml +198 -0
  209. package/dist/examples/webhook-pipeline-config.yaml +218 -0
  210. package/dist/examples/workflows/calculator-workflow.yaml +163 -0
  211. package/dist/examples/workflows/code-quality.yaml +222 -0
  212. package/dist/examples/workflows/quick-pr-check.yaml +90 -0
  213. package/dist/examples/workflows/workflow-composition-example.yaml +130 -0
  214. package/dist/failure-condition-evaluator.d.ts +3 -0
  215. package/dist/failure-condition-evaluator.d.ts.map +1 -1
  216. package/dist/frontends/github-frontend.d.ts +58 -0
  217. package/dist/frontends/github-frontend.d.ts.map +1 -0
  218. package/dist/frontends/host.d.ts +47 -0
  219. package/dist/frontends/host.d.ts.map +1 -0
  220. package/dist/frontends/ndjson-sink.d.ts +12 -0
  221. package/dist/frontends/ndjson-sink.d.ts.map +1 -0
  222. package/dist/frontends/slack-frontend.d.ts +58 -0
  223. package/dist/frontends/slack-frontend.d.ts.map +1 -0
  224. package/dist/generated/config-schema.d.ts +967 -57
  225. package/dist/generated/config-schema.d.ts.map +1 -1
  226. package/dist/generated/config-schema.json +1033 -56
  227. package/dist/github-check-service.d.ts +4 -6
  228. package/dist/github-check-service.d.ts.map +1 -1
  229. package/dist/github-comments.d.ts +2 -4
  230. package/dist/github-comments.d.ts.map +1 -1
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +134327 -99004
  233. package/dist/liquid-extensions.d.ts.map +1 -1
  234. package/dist/logger.d.ts +2 -0
  235. package/dist/logger.d.ts.map +1 -1
  236. package/dist/memory-store.d.ts +6 -0
  237. package/dist/memory-store.d.ts.map +1 -1
  238. package/dist/output/assistant-json/template.liquid +0 -0
  239. package/dist/output/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
  240. package/dist/output/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
  241. package/dist/output-formatters.d.ts +1 -1
  242. package/dist/output-formatters.d.ts.map +1 -1
  243. package/dist/providers/ai-check-provider.d.ts +12 -0
  244. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  245. package/dist/providers/check-provider-registry.d.ts +6 -0
  246. package/dist/providers/check-provider-registry.d.ts.map +1 -1
  247. package/dist/providers/check-provider.interface.d.ts +43 -1
  248. package/dist/providers/check-provider.interface.d.ts.map +1 -1
  249. package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
  250. package/dist/providers/command-check-provider.d.ts +1 -1
  251. package/dist/providers/command-check-provider.d.ts.map +1 -1
  252. package/dist/providers/custom-tool-executor.d.ts +61 -0
  253. package/dist/providers/custom-tool-executor.d.ts.map +1 -0
  254. package/dist/providers/git-checkout-provider.d.ts +25 -0
  255. package/dist/providers/git-checkout-provider.d.ts.map +1 -0
  256. package/dist/providers/github-ops-provider.d.ts.map +1 -1
  257. package/dist/providers/http-client-provider.d.ts +4 -4
  258. package/dist/providers/http-client-provider.d.ts.map +1 -1
  259. package/dist/providers/human-input-check-provider.d.ts +5 -0
  260. package/dist/providers/human-input-check-provider.d.ts.map +1 -1
  261. package/dist/providers/index.d.ts +1 -0
  262. package/dist/providers/index.d.ts.map +1 -1
  263. package/dist/providers/log-check-provider.d.ts +2 -5
  264. package/dist/providers/log-check-provider.d.ts.map +1 -1
  265. package/dist/providers/mcp-check-provider.d.ts +10 -4
  266. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  267. package/dist/providers/mcp-custom-sse-server.d.ts +66 -0
  268. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -0
  269. package/dist/providers/memory-check-provider.d.ts +2 -8
  270. package/dist/providers/memory-check-provider.d.ts.map +1 -1
  271. package/dist/providers/script-check-provider.d.ts +25 -0
  272. package/dist/providers/script-check-provider.d.ts.map +1 -0
  273. package/dist/providers/workflow-check-provider.d.ts +56 -0
  274. package/dist/providers/workflow-check-provider.d.ts.map +1 -0
  275. package/dist/reviewer.d.ts +2 -1
  276. package/dist/reviewer.d.ts.map +1 -1
  277. package/dist/sdk/check-provider-registry-534KL5HT.mjs +27 -0
  278. package/dist/sdk/chunk-23L3QRYX.mjs +16872 -0
  279. package/dist/sdk/chunk-23L3QRYX.mjs.map +1 -0
  280. package/dist/sdk/{chunk-TUTOLSFV.mjs → chunk-3OMWVM6J.mjs} +11 -1
  281. package/dist/sdk/chunk-3OMWVM6J.mjs.map +1 -0
  282. package/dist/sdk/chunk-7UK3NIIT.mjs +482 -0
  283. package/dist/sdk/chunk-7UK3NIIT.mjs.map +1 -0
  284. package/dist/sdk/chunk-AGIZJ4UZ.mjs +173 -0
  285. package/dist/sdk/chunk-AGIZJ4UZ.mjs.map +1 -0
  286. package/dist/sdk/chunk-AIVFBIS4.mjs +1371 -0
  287. package/dist/sdk/chunk-AIVFBIS4.mjs.map +1 -0
  288. package/dist/sdk/chunk-AK6BVWIT.mjs +426 -0
  289. package/dist/sdk/chunk-AK6BVWIT.mjs.map +1 -0
  290. package/dist/sdk/chunk-AUT26LHW.mjs +139 -0
  291. package/dist/sdk/chunk-AUT26LHW.mjs.map +1 -0
  292. package/dist/sdk/chunk-BOVFH3LI.mjs +232 -0
  293. package/dist/sdk/chunk-BOVFH3LI.mjs.map +1 -0
  294. package/dist/sdk/chunk-CNX7V5JK.mjs +89 -0
  295. package/dist/sdk/chunk-CNX7V5JK.mjs.map +1 -0
  296. package/dist/sdk/chunk-HTOKWMPO.mjs +157 -0
  297. package/dist/sdk/chunk-HTOKWMPO.mjs.map +1 -0
  298. package/dist/sdk/chunk-NAW3DB3I.mjs +197 -0
  299. package/dist/sdk/chunk-NAW3DB3I.mjs.map +1 -0
  300. package/dist/sdk/chunk-O5EZDNYL.mjs +274 -0
  301. package/dist/sdk/chunk-O5EZDNYL.mjs.map +1 -0
  302. package/dist/sdk/chunk-QR7MOMJH.mjs +558 -0
  303. package/dist/sdk/chunk-QR7MOMJH.mjs.map +1 -0
  304. package/dist/sdk/chunk-QY2XYPEV.mjs +3556 -0
  305. package/dist/sdk/chunk-QY2XYPEV.mjs.map +1 -0
  306. package/dist/sdk/chunk-S2RUE2RG.mjs +145 -0
  307. package/dist/sdk/chunk-S2RUE2RG.mjs.map +1 -0
  308. package/dist/sdk/chunk-SIWNBRTK.mjs +800 -0
  309. package/dist/sdk/chunk-SIWNBRTK.mjs.map +1 -0
  310. package/dist/sdk/chunk-YSN4G6CI.mjs +146 -0
  311. package/dist/sdk/chunk-YSN4G6CI.mjs.map +1 -0
  312. package/dist/sdk/chunk-ZYAUYXSW.mjs +206 -0
  313. package/dist/sdk/chunk-ZYAUYXSW.mjs.map +1 -0
  314. package/dist/sdk/command-executor-TYUV6HUS.mjs +14 -0
  315. package/dist/sdk/config-YNC2EOOT.mjs +16 -0
  316. package/dist/sdk/config-merger-PX3WIT57.mjs +10 -0
  317. package/dist/sdk/event-bus-5BEVPQ6T.mjs +35 -0
  318. package/dist/sdk/event-bus-5BEVPQ6T.mjs.map +1 -0
  319. package/dist/sdk/failure-condition-evaluator-YGTF2GHG.mjs +17 -0
  320. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs +458 -0
  321. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs.map +1 -0
  322. package/dist/sdk/github-frontend-SIAEOCON.mjs +1420 -0
  323. package/dist/sdk/github-frontend-SIAEOCON.mjs.map +1 -0
  324. package/dist/sdk/host-DXUYTNMU.mjs +52 -0
  325. package/dist/sdk/host-DXUYTNMU.mjs.map +1 -0
  326. package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs → liquid-extensions-PKWCKK7E.mjs} +8 -2
  327. package/dist/sdk/memory-store-XGBB7LX7.mjs +12 -0
  328. package/dist/sdk/memory-store-XGBB7LX7.mjs.map +1 -0
  329. package/dist/sdk/metrics-7PP3EJUH.mjs +29 -0
  330. package/dist/sdk/metrics-7PP3EJUH.mjs.map +1 -0
  331. package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +44 -0
  332. package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs.map +1 -0
  333. package/dist/sdk/prompt-state-YRJY6QAL.mjs +16 -0
  334. package/dist/sdk/prompt-state-YRJY6QAL.mjs.map +1 -0
  335. package/dist/sdk/renderer-schema-LPKN5UJS.mjs +51 -0
  336. package/dist/sdk/renderer-schema-LPKN5UJS.mjs.map +1 -0
  337. package/dist/sdk/routing-6N45MJ4F.mjs +24 -0
  338. package/dist/sdk/routing-6N45MJ4F.mjs.map +1 -0
  339. package/dist/sdk/sdk.d.mts +541 -22
  340. package/dist/sdk/sdk.d.ts +541 -22
  341. package/dist/sdk/sdk.js +27963 -16505
  342. package/dist/sdk/sdk.js.map +1 -1
  343. package/dist/sdk/sdk.mjs +1116 -2169
  344. package/dist/sdk/sdk.mjs.map +1 -1
  345. package/dist/sdk/session-registry-4E6YRQ77.mjs +10 -0
  346. package/dist/sdk/session-registry-4E6YRQ77.mjs.map +1 -0
  347. package/dist/sdk/slack-frontend-BVKW3GD5.mjs +735 -0
  348. package/dist/sdk/slack-frontend-BVKW3GD5.mjs.map +1 -0
  349. package/dist/sdk/trace-helpers-VP6QYVBX.mjs +23 -0
  350. package/dist/sdk/trace-helpers-VP6QYVBX.mjs.map +1 -0
  351. package/dist/sdk/{tracer-init-WC75N5NW.mjs → tracer-init-GSLPPLCD.mjs} +2 -2
  352. package/dist/sdk/tracer-init-GSLPPLCD.mjs.map +1 -0
  353. package/dist/sdk/workflow-registry-R6KSACFR.mjs +12 -0
  354. package/dist/sdk/workflow-registry-R6KSACFR.mjs.map +1 -0
  355. package/dist/sdk.d.ts.map +1 -1
  356. package/dist/slack/adapter.d.ts +36 -0
  357. package/dist/slack/adapter.d.ts.map +1 -0
  358. package/dist/slack/cache-prewarmer.d.ts +31 -0
  359. package/dist/slack/cache-prewarmer.d.ts.map +1 -0
  360. package/dist/slack/client.d.ts +77 -0
  361. package/dist/slack/client.d.ts.map +1 -0
  362. package/dist/slack/markdown.d.ts +45 -0
  363. package/dist/slack/markdown.d.ts.map +1 -0
  364. package/dist/slack/prompt-state.d.ts +33 -0
  365. package/dist/slack/prompt-state.d.ts.map +1 -0
  366. package/dist/slack/rate-limiter.d.ts +56 -0
  367. package/dist/slack/rate-limiter.d.ts.map +1 -0
  368. package/dist/slack/signature.d.ts +2 -0
  369. package/dist/slack/signature.d.ts.map +1 -0
  370. package/dist/slack/socket-runner.d.ts +42 -0
  371. package/dist/slack/socket-runner.d.ts.map +1 -0
  372. package/dist/slack/thread-cache.d.ts +51 -0
  373. package/dist/slack/thread-cache.d.ts.map +1 -0
  374. package/dist/snapshot-store.d.ts +59 -0
  375. package/dist/snapshot-store.d.ts.map +1 -0
  376. package/dist/state-machine/context/build-engine-context.d.ts +17 -0
  377. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -0
  378. package/dist/state-machine/dispatch/dependency-gating.d.ts +12 -0
  379. package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -0
  380. package/dist/state-machine/dispatch/execution-invoker.d.ts +14 -0
  381. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -0
  382. package/dist/state-machine/dispatch/foreach-processor.d.ts +8 -0
  383. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -0
  384. package/dist/state-machine/dispatch/history-snapshot.d.ts +8 -0
  385. package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -0
  386. package/dist/state-machine/dispatch/on-init-handlers.d.ts +43 -0
  387. package/dist/state-machine/dispatch/on-init-handlers.d.ts.map +1 -0
  388. package/dist/state-machine/dispatch/renderer-schema.d.ts +8 -0
  389. package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -0
  390. package/dist/state-machine/dispatch/stats-manager.d.ts +15 -0
  391. package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -0
  392. package/dist/state-machine/dispatch/template-renderer.d.ts +7 -0
  393. package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -0
  394. package/dist/state-machine/execution/summary.d.ts +8 -0
  395. package/dist/state-machine/execution/summary.d.ts.map +1 -0
  396. package/dist/state-machine/runner.d.ts +79 -0
  397. package/dist/state-machine/runner.d.ts.map +1 -0
  398. package/dist/state-machine/states/check-running.d.ts +14 -0
  399. package/dist/state-machine/states/check-running.d.ts.map +1 -0
  400. package/dist/state-machine/states/completed.d.ts +12 -0
  401. package/dist/state-machine/states/completed.d.ts.map +1 -0
  402. package/dist/state-machine/states/error.d.ts +11 -0
  403. package/dist/state-machine/states/error.d.ts.map +1 -0
  404. package/dist/state-machine/states/init.d.ts +11 -0
  405. package/dist/state-machine/states/init.d.ts.map +1 -0
  406. package/dist/state-machine/states/level-dispatch.d.ts +17 -0
  407. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -0
  408. package/dist/state-machine/states/plan-ready.d.ts +12 -0
  409. package/dist/state-machine/states/plan-ready.d.ts.map +1 -0
  410. package/dist/state-machine/states/routing.d.ts +52 -0
  411. package/dist/state-machine/states/routing.d.ts.map +1 -0
  412. package/dist/state-machine/states/wave-planning.d.ts +14 -0
  413. package/dist/state-machine/states/wave-planning.d.ts.map +1 -0
  414. package/dist/state-machine/workflow-projection.d.ts +47 -0
  415. package/dist/state-machine/workflow-projection.d.ts.map +1 -0
  416. package/dist/state-machine-execution-engine.d.ts +159 -0
  417. package/dist/state-machine-execution-engine.d.ts.map +1 -0
  418. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  419. package/dist/telemetry/state-capture.d.ts +5 -0
  420. package/dist/telemetry/state-capture.d.ts.map +1 -1
  421. package/dist/test-runner/assertions.d.ts +59 -0
  422. package/dist/test-runner/assertions.d.ts.map +1 -0
  423. package/dist/test-runner/core/environment.d.ts +8 -0
  424. package/dist/test-runner/core/environment.d.ts.map +1 -0
  425. package/dist/test-runner/core/fixture.d.ts +3 -0
  426. package/dist/test-runner/core/fixture.d.ts.map +1 -0
  427. package/dist/test-runner/core/flow-stage.d.ts +32 -0
  428. package/dist/test-runner/core/flow-stage.d.ts.map +1 -0
  429. package/dist/test-runner/core/mocks.d.ts +8 -0
  430. package/dist/test-runner/core/mocks.d.ts.map +1 -0
  431. package/dist/test-runner/core/test-execution-wrapper.d.ts +18 -0
  432. package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -0
  433. package/dist/test-runner/evaluators.d.ts +45 -0
  434. package/dist/test-runner/evaluators.d.ts.map +1 -0
  435. package/dist/test-runner/fixture-loader.d.ts +30 -0
  436. package/dist/test-runner/fixture-loader.d.ts.map +1 -0
  437. package/dist/test-runner/index.d.ts +127 -0
  438. package/dist/test-runner/index.d.ts.map +1 -0
  439. package/dist/test-runner/recorders/github-recorder.d.ts +23 -0
  440. package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -0
  441. package/dist/test-runner/recorders/global-recorder.d.ts +4 -0
  442. package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -0
  443. package/dist/test-runner/recorders/slack-recorder.d.ts +17 -0
  444. package/dist/test-runner/recorders/slack-recorder.d.ts.map +1 -0
  445. package/dist/test-runner/utils/selectors.d.ts +2 -0
  446. package/dist/test-runner/utils/selectors.d.ts.map +1 -0
  447. package/dist/test-runner/validator.d.ts +8 -0
  448. package/dist/test-runner/validator.d.ts.map +1 -0
  449. package/dist/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
  450. package/dist/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
  451. package/dist/types/bot.d.ts +109 -0
  452. package/dist/types/bot.d.ts.map +1 -0
  453. package/dist/types/cli.d.ts +8 -1
  454. package/dist/types/cli.d.ts.map +1 -1
  455. package/dist/types/config.d.ts +459 -9
  456. package/dist/types/config.d.ts.map +1 -1
  457. package/dist/types/engine.d.ts +177 -0
  458. package/dist/types/engine.d.ts.map +1 -0
  459. package/dist/types/execution.d.ts +73 -0
  460. package/dist/types/execution.d.ts.map +1 -0
  461. package/dist/types/git-checkout.d.ts +76 -0
  462. package/dist/types/git-checkout.d.ts.map +1 -0
  463. package/dist/types/github.d.ts +51 -0
  464. package/dist/types/github.d.ts.map +1 -0
  465. package/dist/types/workflow.d.ts +237 -0
  466. package/dist/types/workflow.d.ts.map +1 -0
  467. package/dist/utils/command-executor.d.ts +43 -0
  468. package/dist/utils/command-executor.d.ts.map +1 -0
  469. package/dist/utils/comment-metadata.d.ts +21 -0
  470. package/dist/utils/comment-metadata.d.ts.map +1 -0
  471. package/dist/utils/config-loader.d.ts.map +1 -1
  472. package/dist/utils/config-merger.d.ts.map +1 -1
  473. package/dist/utils/env-exposure.d.ts +3 -0
  474. package/dist/utils/env-exposure.d.ts.map +1 -0
  475. package/dist/utils/file-exclusion.d.ts.map +1 -1
  476. package/dist/utils/interactive-prompt.d.ts +1 -1
  477. package/dist/utils/interactive-prompt.d.ts.map +1 -1
  478. package/dist/utils/json-text-extractor.d.ts +17 -0
  479. package/dist/utils/json-text-extractor.d.ts.map +1 -0
  480. package/dist/utils/sandbox.d.ts +10 -0
  481. package/dist/utils/sandbox.d.ts.map +1 -1
  482. package/dist/utils/script-memory-ops.d.ts +21 -0
  483. package/dist/utils/script-memory-ops.d.ts.map +1 -0
  484. package/dist/utils/template-context.d.ts +8 -0
  485. package/dist/utils/template-context.d.ts.map +1 -0
  486. package/dist/utils/tracer-init.d.ts.map +1 -1
  487. package/dist/utils/workspace-manager.d.ts +118 -0
  488. package/dist/utils/workspace-manager.d.ts.map +1 -0
  489. package/dist/utils/worktree-cleanup.d.ts +33 -0
  490. package/dist/utils/worktree-cleanup.d.ts.map +1 -0
  491. package/dist/utils/worktree-manager.d.ts +153 -0
  492. package/dist/utils/worktree-manager.d.ts.map +1 -0
  493. package/dist/webhook-server.d.ts +3 -3
  494. package/dist/webhook-server.d.ts.map +1 -1
  495. package/dist/workflow-executor.d.ts +81 -0
  496. package/dist/workflow-executor.d.ts.map +1 -0
  497. package/dist/workflow-registry.d.ts +79 -0
  498. package/dist/workflow-registry.d.ts.map +1 -0
  499. package/package.json +12 -5
  500. package/dist/output/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
  501. package/dist/sdk/check-execution-engine-2YYKUUSH.mjs +0 -11
  502. package/dist/sdk/check-execution-engine-6QJXYYON.mjs +0 -11
  503. package/dist/sdk/check-execution-engine-PJZ4ZOKG.mjs +0 -11
  504. package/dist/sdk/chunk-33QVZ2D4.mjs +0 -316
  505. package/dist/sdk/chunk-33QVZ2D4.mjs.map +0 -1
  506. package/dist/sdk/chunk-B5QBV2QJ.mjs +0 -752
  507. package/dist/sdk/chunk-B5QBV2QJ.mjs.map +0 -1
  508. package/dist/sdk/chunk-BVFNRCHT.mjs +0 -14129
  509. package/dist/sdk/chunk-BVFNRCHT.mjs.map +0 -1
  510. package/dist/sdk/chunk-KWZW23FG.mjs +0 -14129
  511. package/dist/sdk/chunk-KWZW23FG.mjs.map +0 -1
  512. package/dist/sdk/chunk-O4RP4BRH.mjs +0 -14092
  513. package/dist/sdk/chunk-O4RP4BRH.mjs.map +0 -1
  514. package/dist/sdk/chunk-TUTOLSFV.mjs.map +0 -1
  515. package/dist/sdk/chunk-U5D2LY66.mjs +0 -245
  516. package/dist/sdk/chunk-U5D2LY66.mjs.map +0 -1
  517. package/dist/sdk/chunk-U7X54EMV.mjs +0 -331
  518. package/dist/sdk/chunk-U7X54EMV.mjs.map +0 -1
  519. package/dist/sdk/config-merger-TWUBWFC2.mjs +0 -8
  520. package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs +0 -61
  521. package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs.map +0 -1
  522. package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs +0 -61
  523. package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs.map +0 -1
  524. package/dist/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
  525. /package/dist/sdk/{check-execution-engine-2YYKUUSH.mjs.map → check-provider-registry-534KL5HT.mjs.map} +0 -0
  526. /package/dist/sdk/{check-execution-engine-6QJXYYON.mjs.map → command-executor-TYUV6HUS.mjs.map} +0 -0
  527. /package/dist/sdk/{check-execution-engine-PJZ4ZOKG.mjs.map → config-YNC2EOOT.mjs.map} +0 -0
  528. /package/dist/sdk/{config-merger-TWUBWFC2.mjs.map → config-merger-PX3WIT57.mjs.map} +0 -0
  529. /package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs.map → failure-condition-evaluator-YGTF2GHG.mjs.map} +0 -0
  530. /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