@probelabs/visor 0.1.107 → 0.1.112

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 (235) hide show
  1. package/README.md +6 -0
  2. package/defaults/task-refinement.yaml +7 -3
  3. package/defaults/visor.tests.yaml +13 -2
  4. package/defaults/visor.yaml +1 -0
  5. package/dist/663.index.js +3 -2
  6. package/dist/80.index.js +3 -2
  7. package/dist/ai-review-service.d.ts +13 -9
  8. package/dist/ai-review-service.d.ts.map +1 -1
  9. package/dist/cli-main.d.ts.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/debug-visualizer/ws-server.d.ts +7 -1
  13. package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
  14. package/dist/defaults/task-refinement.yaml +7 -3
  15. package/dist/defaults/visor.tests.yaml +13 -2
  16. package/dist/defaults/visor.yaml +1 -0
  17. package/dist/docs/advanced-ai.md +60 -1
  18. package/dist/docs/ai-configuration.md +67 -0
  19. package/dist/docs/ai-custom-tools-usage.md +261 -0
  20. package/dist/docs/ai-custom-tools.md +392 -0
  21. package/dist/docs/bot-transports-rfc.md +23 -0
  22. package/dist/docs/configuration.md +21 -0
  23. package/dist/docs/engine-pause-resume-rfc.md +192 -0
  24. package/dist/docs/lifecycle-hooks.md +253 -0
  25. package/dist/docs/liquid-templates.md +143 -0
  26. package/dist/docs/providers/git-checkout.md +589 -0
  27. package/dist/docs/recipes.md +458 -5
  28. package/dist/docs/rfc/git-checkout-step.md +601 -0
  29. package/dist/docs/rfc/on_init-hook.md +1294 -0
  30. package/dist/docs/rfc/workspace-isolation.md +216 -0
  31. package/dist/docs/router-patterns.md +339 -0
  32. package/dist/event-bus/types.d.ts +14 -0
  33. package/dist/event-bus/types.d.ts.map +1 -1
  34. package/dist/examples/ai-custom-tools-example.yaml +206 -0
  35. package/dist/examples/ai-custom-tools-simple.yaml +76 -0
  36. package/dist/examples/git-checkout-basic.yaml +32 -0
  37. package/dist/examples/git-checkout-compare.yaml +59 -0
  38. package/dist/examples/git-checkout-cross-repo.yaml +76 -0
  39. package/dist/examples/on-init-import-demo.yaml +179 -0
  40. package/dist/examples/reusable-tools.yaml +92 -0
  41. package/dist/examples/reusable-workflows.yaml +88 -0
  42. package/dist/examples/session-reuse-self.yaml +81 -0
  43. package/dist/examples/slack-simple-chat.yaml +775 -0
  44. package/dist/failure-condition-evaluator.d.ts +2 -0
  45. package/dist/failure-condition-evaluator.d.ts.map +1 -1
  46. package/dist/frontends/github-frontend.d.ts +20 -0
  47. package/dist/frontends/github-frontend.d.ts.map +1 -1
  48. package/dist/frontends/host.d.ts +4 -0
  49. package/dist/frontends/host.d.ts.map +1 -1
  50. package/dist/frontends/slack-frontend.d.ts +58 -0
  51. package/dist/frontends/slack-frontend.d.ts.map +1 -0
  52. package/dist/generated/config-schema.d.ts +409 -41
  53. package/dist/generated/config-schema.d.ts.map +1 -1
  54. package/dist/generated/config-schema.json +436 -47
  55. package/dist/github-comments.d.ts +2 -0
  56. package/dist/github-comments.d.ts.map +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +83587 -56085
  59. package/dist/liquid-extensions.d.ts.map +1 -1
  60. package/dist/logger.d.ts +1 -0
  61. package/dist/logger.d.ts.map +1 -1
  62. package/dist/output/traces/{run-2025-11-21T11-50-46-505Z.ndjson → run-2026-01-21T05-37-24-446Z.ndjson} +91 -91
  63. package/dist/output/traces/run-2026-01-21T05-38-18-580Z.ndjson +1067 -0
  64. package/dist/output-formatters.d.ts.map +1 -1
  65. package/dist/providers/ai-check-provider.d.ts +12 -0
  66. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  67. package/dist/providers/check-provider-registry.d.ts.map +1 -1
  68. package/dist/providers/check-provider.interface.d.ts +9 -0
  69. package/dist/providers/check-provider.interface.d.ts.map +1 -1
  70. package/dist/providers/command-check-provider.d.ts.map +1 -1
  71. package/dist/providers/custom-tool-executor.d.ts.map +1 -1
  72. package/dist/providers/git-checkout-provider.d.ts +25 -0
  73. package/dist/providers/git-checkout-provider.d.ts.map +1 -0
  74. package/dist/providers/http-client-provider.d.ts +3 -0
  75. package/dist/providers/http-client-provider.d.ts.map +1 -1
  76. package/dist/providers/human-input-check-provider.d.ts +2 -0
  77. package/dist/providers/human-input-check-provider.d.ts.map +1 -1
  78. package/dist/providers/log-check-provider.d.ts.map +1 -1
  79. package/dist/providers/mcp-check-provider.d.ts +1 -1
  80. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  81. package/dist/providers/mcp-custom-sse-server.d.ts +66 -0
  82. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -0
  83. package/dist/providers/memory-check-provider.d.ts.map +1 -1
  84. package/dist/providers/script-check-provider.d.ts.map +1 -1
  85. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  86. package/dist/reviewer.d.ts.map +1 -1
  87. package/dist/sdk/check-provider-registry-534KL5HT.mjs +27 -0
  88. package/dist/sdk/chunk-23L3QRYX.mjs +16872 -0
  89. package/dist/sdk/chunk-23L3QRYX.mjs.map +1 -0
  90. package/dist/sdk/{chunk-OOZITMRU.mjs → chunk-3OMWVM6J.mjs} +11 -1
  91. package/dist/sdk/{chunk-OOZITMRU.mjs.map → chunk-3OMWVM6J.mjs.map} +1 -1
  92. package/dist/sdk/{chunk-37ZSCMFC.mjs → chunk-7UK3NIIT.mjs} +2 -2
  93. package/dist/sdk/{chunk-VMPLF6FT.mjs → chunk-AGIZJ4UZ.mjs} +50 -4
  94. package/dist/sdk/chunk-AGIZJ4UZ.mjs.map +1 -0
  95. package/dist/sdk/{chunk-IEO6CFLG.mjs → chunk-AIVFBIS4.mjs} +161 -5
  96. package/dist/sdk/chunk-AIVFBIS4.mjs.map +1 -0
  97. package/dist/sdk/chunk-AK6BVWIT.mjs +426 -0
  98. package/dist/sdk/chunk-AK6BVWIT.mjs.map +1 -0
  99. package/dist/sdk/chunk-AUT26LHW.mjs +139 -0
  100. package/dist/sdk/chunk-AUT26LHW.mjs.map +1 -0
  101. package/dist/sdk/chunk-BOVFH3LI.mjs +232 -0
  102. package/dist/sdk/chunk-BOVFH3LI.mjs.map +1 -0
  103. package/dist/sdk/chunk-HTOKWMPO.mjs +157 -0
  104. package/dist/sdk/chunk-HTOKWMPO.mjs.map +1 -0
  105. package/dist/sdk/{chunk-6Y4YTKCF.mjs → chunk-NAW3DB3I.mjs} +2 -2
  106. package/dist/sdk/{chunk-OWUVOILT.mjs → chunk-QR7MOMJH.mjs} +4 -3
  107. package/dist/sdk/{chunk-OWUVOILT.mjs.map → chunk-QR7MOMJH.mjs.map} +1 -1
  108. package/dist/sdk/{chunk-PTL3K3PN.mjs → chunk-QY2XYPEV.mjs} +488 -60
  109. package/dist/sdk/chunk-QY2XYPEV.mjs.map +1 -0
  110. package/dist/sdk/{chunk-OZJ263FM.mjs → chunk-SIWNBRTK.mjs} +29 -215
  111. package/dist/sdk/chunk-SIWNBRTK.mjs.map +1 -0
  112. package/dist/sdk/command-executor-TYUV6HUS.mjs +14 -0
  113. package/dist/sdk/{config-M4ZNO6NU.mjs → config-YNC2EOOT.mjs} +5 -3
  114. package/dist/sdk/{failure-condition-evaluator-NBO5YRXW.mjs → failure-condition-evaluator-YGTF2GHG.mjs} +6 -5
  115. package/dist/sdk/{github-frontend-4AWRJT7D.mjs → github-frontend-SIAEOCON.mjs} +190 -12
  116. package/dist/sdk/github-frontend-SIAEOCON.mjs.map +1 -0
  117. package/dist/sdk/{host-7GBC3S7L.mjs → host-DXUYTNMU.mjs} +5 -2
  118. package/dist/sdk/host-DXUYTNMU.mjs.map +1 -0
  119. package/dist/sdk/{liquid-extensions-C7EG3YKH.mjs → liquid-extensions-PKWCKK7E.mjs} +5 -4
  120. package/dist/sdk/memory-store-XGBB7LX7.mjs +12 -0
  121. package/dist/sdk/prompt-state-YRJY6QAL.mjs +16 -0
  122. package/dist/sdk/{renderer-schema-6RF26VUS.mjs → renderer-schema-LPKN5UJS.mjs} +3 -2
  123. package/dist/sdk/{renderer-schema-6RF26VUS.mjs.map → renderer-schema-LPKN5UJS.mjs.map} +1 -1
  124. package/dist/sdk/{routing-RP56JTV2.mjs → routing-6N45MJ4F.mjs} +7 -6
  125. package/dist/sdk/sdk.d.mts +219 -5
  126. package/dist/sdk/sdk.d.ts +219 -5
  127. package/dist/sdk/sdk.js +21329 -14908
  128. package/dist/sdk/sdk.js.map +1 -1
  129. package/dist/sdk/sdk.mjs +407 -12874
  130. package/dist/sdk/sdk.mjs.map +1 -1
  131. package/dist/sdk/{session-registry-N5FFYFTM.mjs → session-registry-4E6YRQ77.mjs} +2 -2
  132. package/dist/sdk/session-registry-4E6YRQ77.mjs.map +1 -0
  133. package/dist/sdk/slack-frontend-BVKW3GD5.mjs +735 -0
  134. package/dist/sdk/slack-frontend-BVKW3GD5.mjs.map +1 -0
  135. package/dist/sdk/{tracer-init-WP4X46IF.mjs → tracer-init-GSLPPLCD.mjs} +2 -2
  136. package/dist/sdk/tracer-init-GSLPPLCD.mjs.map +1 -0
  137. package/dist/sdk/workflow-registry-R6KSACFR.mjs +12 -0
  138. package/dist/sdk/workflow-registry-R6KSACFR.mjs.map +1 -0
  139. package/dist/slack/adapter.d.ts +36 -0
  140. package/dist/slack/adapter.d.ts.map +1 -0
  141. package/dist/slack/cache-prewarmer.d.ts +31 -0
  142. package/dist/slack/cache-prewarmer.d.ts.map +1 -0
  143. package/dist/slack/client.d.ts +77 -0
  144. package/dist/slack/client.d.ts.map +1 -0
  145. package/dist/slack/markdown.d.ts +45 -0
  146. package/dist/slack/markdown.d.ts.map +1 -0
  147. package/dist/slack/prompt-state.d.ts +33 -0
  148. package/dist/slack/prompt-state.d.ts.map +1 -0
  149. package/dist/slack/rate-limiter.d.ts +56 -0
  150. package/dist/slack/rate-limiter.d.ts.map +1 -0
  151. package/dist/slack/signature.d.ts +2 -0
  152. package/dist/slack/signature.d.ts.map +1 -0
  153. package/dist/slack/socket-runner.d.ts +42 -0
  154. package/dist/slack/socket-runner.d.ts.map +1 -0
  155. package/dist/slack/thread-cache.d.ts +51 -0
  156. package/dist/slack/thread-cache.d.ts.map +1 -0
  157. package/dist/state-machine/context/build-engine-context.d.ts +8 -0
  158. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -1
  159. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
  160. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -1
  161. package/dist/state-machine/dispatch/on-init-handlers.d.ts +43 -0
  162. package/dist/state-machine/dispatch/on-init-handlers.d.ts.map +1 -0
  163. package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -1
  164. package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -1
  165. package/dist/state-machine/runner.d.ts +6 -0
  166. package/dist/state-machine/runner.d.ts.map +1 -1
  167. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
  168. package/dist/state-machine/states/plan-ready.d.ts.map +1 -1
  169. package/dist/state-machine/states/routing.d.ts.map +1 -1
  170. package/dist/state-machine/states/wave-planning.d.ts.map +1 -1
  171. package/dist/state-machine/workflow-projection.d.ts.map +1 -1
  172. package/dist/state-machine-execution-engine.d.ts +21 -9
  173. package/dist/state-machine-execution-engine.d.ts.map +1 -1
  174. package/dist/telemetry/state-capture.d.ts +5 -0
  175. package/dist/telemetry/state-capture.d.ts.map +1 -1
  176. package/dist/test-runner/core/flow-stage.d.ts.map +1 -1
  177. package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -1
  178. package/dist/test-runner/evaluators.d.ts +37 -4
  179. package/dist/test-runner/evaluators.d.ts.map +1 -1
  180. package/dist/test-runner/index.d.ts +7 -0
  181. package/dist/test-runner/index.d.ts.map +1 -1
  182. package/dist/test-runner/recorders/slack-recorder.d.ts +17 -0
  183. package/dist/test-runner/recorders/slack-recorder.d.ts.map +1 -0
  184. package/dist/test-runner/validator.d.ts.map +1 -1
  185. package/dist/traces/{run-2025-11-21T11-50-46-505Z.ndjson → run-2026-01-21T05-37-24-446Z.ndjson} +91 -91
  186. package/dist/traces/run-2026-01-21T05-38-18-580Z.ndjson +1067 -0
  187. package/dist/types/bot.d.ts +109 -0
  188. package/dist/types/bot.d.ts.map +1 -0
  189. package/dist/types/cli.d.ts +4 -0
  190. package/dist/types/cli.d.ts.map +1 -1
  191. package/dist/types/config.d.ts +182 -5
  192. package/dist/types/config.d.ts.map +1 -1
  193. package/dist/types/engine.d.ts +5 -0
  194. package/dist/types/engine.d.ts.map +1 -1
  195. package/dist/types/git-checkout.d.ts +76 -0
  196. package/dist/types/git-checkout.d.ts.map +1 -0
  197. package/dist/utils/json-text-extractor.d.ts +17 -0
  198. package/dist/utils/json-text-extractor.d.ts.map +1 -0
  199. package/dist/utils/sandbox.d.ts +10 -0
  200. package/dist/utils/sandbox.d.ts.map +1 -1
  201. package/dist/utils/template-context.d.ts +1 -0
  202. package/dist/utils/template-context.d.ts.map +1 -1
  203. package/dist/utils/tracer-init.d.ts.map +1 -1
  204. package/dist/utils/workspace-manager.d.ts +118 -0
  205. package/dist/utils/workspace-manager.d.ts.map +1 -0
  206. package/dist/utils/worktree-cleanup.d.ts +33 -0
  207. package/dist/utils/worktree-cleanup.d.ts.map +1 -0
  208. package/dist/utils/worktree-manager.d.ts +153 -0
  209. package/dist/utils/worktree-manager.d.ts.map +1 -0
  210. package/dist/webhook-server.d.ts.map +1 -1
  211. package/dist/workflow-executor.d.ts.map +1 -1
  212. package/dist/workflow-registry.d.ts.map +1 -1
  213. package/package.json +5 -4
  214. package/dist/output/traces/run-2025-11-21T11-51-33-674Z.ndjson +0 -839
  215. package/dist/sdk/chunk-IEO6CFLG.mjs.map +0 -1
  216. package/dist/sdk/chunk-JEHPDJIF.mjs +0 -223
  217. package/dist/sdk/chunk-JEHPDJIF.mjs.map +0 -1
  218. package/dist/sdk/chunk-OZJ263FM.mjs.map +0 -1
  219. package/dist/sdk/chunk-PTL3K3PN.mjs.map +0 -1
  220. package/dist/sdk/chunk-VMPLF6FT.mjs.map +0 -1
  221. package/dist/sdk/github-frontend-4AWRJT7D.mjs.map +0 -1
  222. package/dist/sdk/host-7GBC3S7L.mjs.map +0 -1
  223. package/dist/sdk/memory-store-GJACZC2A.mjs +0 -11
  224. package/dist/sdk/workflow-registry-2YIIXQCK.mjs +0 -11
  225. package/dist/traces/run-2025-11-21T11-51-33-674Z.ndjson +0 -839
  226. /package/dist/sdk/{config-M4ZNO6NU.mjs.map → check-provider-registry-534KL5HT.mjs.map} +0 -0
  227. /package/dist/sdk/{chunk-37ZSCMFC.mjs.map → chunk-7UK3NIIT.mjs.map} +0 -0
  228. /package/dist/sdk/{chunk-6Y4YTKCF.mjs.map → chunk-NAW3DB3I.mjs.map} +0 -0
  229. /package/dist/sdk/{failure-condition-evaluator-NBO5YRXW.mjs.map → command-executor-TYUV6HUS.mjs.map} +0 -0
  230. /package/dist/sdk/{liquid-extensions-C7EG3YKH.mjs.map → config-YNC2EOOT.mjs.map} +0 -0
  231. /package/dist/sdk/{memory-store-GJACZC2A.mjs.map → failure-condition-evaluator-YGTF2GHG.mjs.map} +0 -0
  232. /package/dist/sdk/{routing-RP56JTV2.mjs.map → liquid-extensions-PKWCKK7E.mjs.map} +0 -0
  233. /package/dist/sdk/{session-registry-N5FFYFTM.mjs.map → memory-store-XGBB7LX7.mjs.map} +0 -0
  234. /package/dist/sdk/{tracer-init-WP4X46IF.mjs.map → prompt-state-YRJY6QAL.mjs.map} +0 -0
  235. /package/dist/sdk/{workflow-registry-2YIIXQCK.mjs.map → routing-6N45MJ4F.mjs.map} +0 -0
@@ -42,6 +42,16 @@ async function initializeTracer(sessionId, checkName) {
42
42
  enableConsole: false
43
43
  });
44
44
  const tracer = new SimpleAppTracer(telemetry, sessionId);
45
+ if (typeof tracer.recordEvent !== "function") {
46
+ tracer.recordEvent = (name, attributes) => {
47
+ try {
48
+ if (telemetry.record) {
49
+ telemetry.record({ event: name, ...attributes });
50
+ }
51
+ } catch {
52
+ }
53
+ };
54
+ }
45
55
  console.error(`\u{1F4CA} Simple tracing enabled, will save to: ${traceFilePath}`);
46
56
  if (process.env.GITHUB_ACTIONS) {
47
57
  console.log(`::notice title=AI Trace::Trace will be saved to ${traceFilePath}`);
@@ -69,4 +79,4 @@ export {
69
79
  initializeTracer,
70
80
  init_tracer_init
71
81
  };
72
- //# sourceMappingURL=chunk-OOZITMRU.mjs.map
82
+ //# sourceMappingURL=chunk-3OMWVM6J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/tracer-init.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Safely initialize a tracer for ProbeAgent with proper path sanitization\n * Uses SimpleTelemetry for lightweight tracing\n * This prevents path traversal vulnerabilities by sanitizing the checkName\n */\ntype ProbeModule =\n | {\n SimpleTelemetry?: new (opts: {\n enableFile: boolean;\n filePath: string;\n enableConsole?: boolean;\n }) => unknown;\n SimpleAppTracer?: new (telemetry: unknown, sessionId: string) => unknown;\n }\n | undefined;\n\nexport async function initializeTracer(\n sessionId: string,\n checkName?: string\n): Promise<{ tracer: unknown; telemetryConfig: unknown; filePath: string } | null> {\n try {\n // Load Probe lib in a way that works in both ESM and CJS bundles\n let ProbeLib: ProbeModule;\n try {\n ProbeLib = (await import('@probelabs/probe')) as ProbeModule;\n } catch {\n try {\n // Fallback to CJS require if available\n\n ProbeLib = require('@probelabs/probe') as ProbeModule;\n } catch {\n ProbeLib = {} as unknown as ProbeModule;\n }\n }\n\n // Use SimpleTelemetry (probe no longer exports full OpenTelemetry classes)\n const SimpleTelemetry = ProbeLib?.SimpleTelemetry;\n const SimpleAppTracer = ProbeLib?.SimpleAppTracer;\n if (SimpleTelemetry && SimpleAppTracer) {\n // SECURITY: Sanitize checkName to prevent path traversal attacks\n const sanitizedCheckName = checkName ? path.basename(checkName) : 'check';\n\n // Create trace file path in debug-artifacts directory\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const traceDir = process.env.GITHUB_WORKSPACE\n ? path.join(process.env.GITHUB_WORKSPACE, 'debug-artifacts')\n : path.join(process.cwd(), 'debug-artifacts');\n\n // Create traces directory if it doesn't exist\n if (!fs.existsSync(traceDir)) {\n fs.mkdirSync(traceDir, { recursive: true });\n }\n\n // SECURITY: Use path.join to safely construct the path\n const traceFilePath = path.join(traceDir, `trace-${sanitizedCheckName}-${timestamp}.jsonl`);\n\n // SECURITY: Verify the resolved path is within the intended directory\n const resolvedTracePath = path.resolve(traceFilePath);\n const resolvedTraceDir = path.resolve(traceDir);\n if (!resolvedTracePath.startsWith(resolvedTraceDir)) {\n console.error(\n `⚠️ Security: Attempted path traversal detected. Check name: ${checkName}, resolved path: ${resolvedTracePath}`\n );\n return null;\n }\n\n // Initialize simple telemetry\n const telemetry = new SimpleTelemetry({\n enableFile: true,\n filePath: traceFilePath,\n enableConsole: false,\n });\n\n const tracer = new SimpleAppTracer(telemetry, sessionId);\n\n console.error(`📊 Simple tracing enabled, will save to: ${traceFilePath}`);\n\n // If in GitHub Actions, log the path for artifact upload\n if (process.env.GITHUB_ACTIONS) {\n console.log(`::notice title=AI Trace::Trace will be saved to ${traceFilePath}`);\n console.log(`::set-output name=trace-path::${traceFilePath}`);\n }\n\n // Return with SimpleTelemetry\n return {\n tracer,\n telemetryConfig: telemetry,\n filePath: traceFilePath,\n };\n }\n\n console.error('⚠️ Telemetry classes not available in ProbeAgent, skipping tracing');\n return null;\n } catch (error) {\n console.error('⚠️ Warning: Failed to initialize tracing:', error);\n return null;\n }\n}\n"],"mappings":";;;;;;AAAA,YAAY,UAAU;AACtB,YAAY,QAAQ;AAkBpB,eAAsB,iBACpB,WACA,WACiF;AACjF,MAAI;AAEF,QAAI;AACJ,QAAI;AACF,iBAAY,MAAM,OAAO,kBAAkB;AAAA,IAC7C,QAAQ;AACN,UAAI;AAGF,mBAAW,UAAQ,kBAAkB;AAAA,MACvC,QAAQ;AACN,mBAAW,CAAC;AAAA,MACd;AAAA,IACF;AAGA,UAAM,kBAAkB,UAAU;AAClC,UAAM,kBAAkB,UAAU;AAClC,QAAI,mBAAmB,iBAAiB;AAEtC,YAAM,qBAAqB,YAAiB,cAAS,SAAS,IAAI;AAGlE,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,YAAM,WAAW,QAAQ,IAAI,mBACpB,UAAK,QAAQ,IAAI,kBAAkB,iBAAiB,IACpD,UAAK,QAAQ,IAAI,GAAG,iBAAiB;AAG9C,UAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,QAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MAC5C;AAGA,YAAM,gBAAqB,UAAK,UAAU,SAAS,kBAAkB,IAAI,SAAS,QAAQ;AAG1F,YAAM,oBAAyB,aAAQ,aAAa;AACpD,YAAM,mBAAwB,aAAQ,QAAQ;AAC9C,UAAI,CAAC,kBAAkB,WAAW,gBAAgB,GAAG;AACnD,gBAAQ;AAAA,UACN,yEAA+D,SAAS,oBAAoB,iBAAiB;AAAA,QAC/G;AACA,eAAO;AAAA,MACT;AAGA,YAAM,YAAY,IAAI,gBAAgB;AAAA,QACpC,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,SAAS,IAAI,gBAAgB,WAAW,SAAS;AAEvD,cAAQ,MAAM,mDAA4C,aAAa,EAAE;AAGzE,UAAI,QAAQ,IAAI,gBAAgB;AAC9B,gBAAQ,IAAI,mDAAmD,aAAa,EAAE;AAC9E,gBAAQ,IAAI,iCAAiC,aAAa,EAAE;AAAA,MAC9D;AAGA,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,YAAQ,MAAM,8EAAoE;AAClF,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,uDAA6C,KAAK;AAChE,WAAO;AAAA,EACT;AACF;AApGA;AAAA;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/tracer-init.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Safely initialize a tracer for ProbeAgent with proper path sanitization\n * Uses SimpleTelemetry for lightweight tracing\n * This prevents path traversal vulnerabilities by sanitizing the checkName\n */\ntype ProbeModule =\n | {\n SimpleTelemetry?: new (opts: {\n enableFile: boolean;\n filePath: string;\n enableConsole?: boolean;\n }) => unknown;\n SimpleAppTracer?: new (telemetry: unknown, sessionId: string) => unknown;\n }\n | undefined;\n\nexport async function initializeTracer(\n sessionId: string,\n checkName?: string\n): Promise<{ tracer: unknown; telemetryConfig: unknown; filePath: string } | null> {\n try {\n // Load Probe lib in a way that works in both ESM and CJS bundles\n let ProbeLib: ProbeModule;\n try {\n ProbeLib = (await import('@probelabs/probe')) as ProbeModule;\n } catch {\n try {\n // Fallback to CJS require if available\n\n ProbeLib = require('@probelabs/probe') as ProbeModule;\n } catch {\n ProbeLib = {} as unknown as ProbeModule;\n }\n }\n\n // Use SimpleTelemetry (probe no longer exports full OpenTelemetry classes)\n const SimpleTelemetry = ProbeLib?.SimpleTelemetry;\n const SimpleAppTracer = ProbeLib?.SimpleAppTracer;\n if (SimpleTelemetry && SimpleAppTracer) {\n // SECURITY: Sanitize checkName to prevent path traversal attacks\n const sanitizedCheckName = checkName ? path.basename(checkName) : 'check';\n\n // Create trace file path in debug-artifacts directory\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const traceDir = process.env.GITHUB_WORKSPACE\n ? path.join(process.env.GITHUB_WORKSPACE, 'debug-artifacts')\n : path.join(process.cwd(), 'debug-artifacts');\n\n // Create traces directory if it doesn't exist\n if (!fs.existsSync(traceDir)) {\n fs.mkdirSync(traceDir, { recursive: true });\n }\n\n // SECURITY: Use path.join to safely construct the path\n const traceFilePath = path.join(traceDir, `trace-${sanitizedCheckName}-${timestamp}.jsonl`);\n\n // SECURITY: Verify the resolved path is within the intended directory\n const resolvedTracePath = path.resolve(traceFilePath);\n const resolvedTraceDir = path.resolve(traceDir);\n if (!resolvedTracePath.startsWith(resolvedTraceDir)) {\n console.error(\n `⚠️ Security: Attempted path traversal detected. Check name: ${checkName}, resolved path: ${resolvedTracePath}`\n );\n return null;\n }\n\n // Initialize simple telemetry\n const telemetry = new SimpleTelemetry({\n enableFile: true,\n filePath: traceFilePath,\n enableConsole: false,\n });\n\n const tracer = new SimpleAppTracer(telemetry, sessionId);\n\n // WORKAROUND: Add missing recordEvent method for completionPrompt feature (probe #321)\n // SimpleAppTracer doesn't have recordEvent but completionPrompt requires it\n if (typeof (tracer as any).recordEvent !== 'function') {\n (tracer as any).recordEvent = (name: string, attributes?: Record<string, unknown>) => {\n // Log completion events to telemetry for debugging\n try {\n if ((telemetry as any).record) {\n (telemetry as any).record({ event: name, ...attributes });\n }\n } catch {\n // Best-effort only\n }\n };\n }\n\n console.error(`📊 Simple tracing enabled, will save to: ${traceFilePath}`);\n\n // If in GitHub Actions, log the path for artifact upload\n if (process.env.GITHUB_ACTIONS) {\n console.log(`::notice title=AI Trace::Trace will be saved to ${traceFilePath}`);\n console.log(`::set-output name=trace-path::${traceFilePath}`);\n }\n\n // Return with SimpleTelemetry\n return {\n tracer,\n telemetryConfig: telemetry,\n filePath: traceFilePath,\n };\n }\n\n console.error('⚠️ Telemetry classes not available in ProbeAgent, skipping tracing');\n return null;\n } catch (error) {\n console.error('⚠️ Warning: Failed to initialize tracing:', error);\n return null;\n }\n}\n"],"mappings":";;;;;;AAAA,YAAY,UAAU;AACtB,YAAY,QAAQ;AAkBpB,eAAsB,iBACpB,WACA,WACiF;AACjF,MAAI;AAEF,QAAI;AACJ,QAAI;AACF,iBAAY,MAAM,OAAO,kBAAkB;AAAA,IAC7C,QAAQ;AACN,UAAI;AAGF,mBAAW,UAAQ,kBAAkB;AAAA,MACvC,QAAQ;AACN,mBAAW,CAAC;AAAA,MACd;AAAA,IACF;AAGA,UAAM,kBAAkB,UAAU;AAClC,UAAM,kBAAkB,UAAU;AAClC,QAAI,mBAAmB,iBAAiB;AAEtC,YAAM,qBAAqB,YAAiB,cAAS,SAAS,IAAI;AAGlE,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,YAAM,WAAW,QAAQ,IAAI,mBACpB,UAAK,QAAQ,IAAI,kBAAkB,iBAAiB,IACpD,UAAK,QAAQ,IAAI,GAAG,iBAAiB;AAG9C,UAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,QAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MAC5C;AAGA,YAAM,gBAAqB,UAAK,UAAU,SAAS,kBAAkB,IAAI,SAAS,QAAQ;AAG1F,YAAM,oBAAyB,aAAQ,aAAa;AACpD,YAAM,mBAAwB,aAAQ,QAAQ;AAC9C,UAAI,CAAC,kBAAkB,WAAW,gBAAgB,GAAG;AACnD,gBAAQ;AAAA,UACN,yEAA+D,SAAS,oBAAoB,iBAAiB;AAAA,QAC/G;AACA,eAAO;AAAA,MACT;AAGA,YAAM,YAAY,IAAI,gBAAgB;AAAA,QACpC,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,SAAS,IAAI,gBAAgB,WAAW,SAAS;AAIvD,UAAI,OAAQ,OAAe,gBAAgB,YAAY;AACrD,QAAC,OAAe,cAAc,CAAC,MAAc,eAAyC;AAEpF,cAAI;AACF,gBAAK,UAAkB,QAAQ;AAC7B,cAAC,UAAkB,OAAO,EAAE,OAAO,MAAM,GAAG,WAAW,CAAC;AAAA,YAC1D;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,MAAM,mDAA4C,aAAa,EAAE;AAGzE,UAAI,QAAQ,IAAI,gBAAgB;AAC9B,gBAAQ,IAAI,mDAAmD,aAAa,EAAE;AAC9E,gBAAQ,IAAI,iCAAiC,aAAa,EAAE;AAAA,MAC9D;AAGA,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,YAAQ,MAAM,8EAAoE;AAClF,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,uDAA6C,KAAK;AAChE,WAAO;AAAA,EACT;AACF;AAnHA;AAAA;AAAA;AAAA;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_logger,
3
3
  logger
4
- } from "./chunk-VMPLF6FT.mjs";
4
+ } from "./chunk-AGIZJ4UZ.mjs";
5
5
  import {
6
6
  __esm,
7
7
  __export
@@ -479,4 +479,4 @@ export {
479
479
  memory_store_exports,
480
480
  init_memory_store
481
481
  };
482
- //# sourceMappingURL=chunk-37ZSCMFC.mjs.map
482
+ //# sourceMappingURL=chunk-7UK3NIIT.mjs.map
@@ -1,3 +1,8 @@
1
+ import {
2
+ context,
3
+ init_lazy_otel,
4
+ trace
5
+ } from "./chunk-YSN4G6CI.mjs";
1
6
  import {
2
7
  __esm,
3
8
  __export
@@ -44,6 +49,7 @@ var Logger, logger;
44
49
  var init_logger = __esm({
45
50
  "src/logger.ts"() {
46
51
  "use strict";
52
+ init_lazy_otel();
47
53
  Logger = class {
48
54
  level = "info";
49
55
  isJsonLike = false;
@@ -79,16 +85,56 @@ var init_logger = __esm({
79
85
  }
80
86
  return true;
81
87
  }
88
+ getTraceSuffix(msg) {
89
+ if (!msg) return "";
90
+ if (msg.includes("trace_id=") || msg.includes("trace_id:")) return "";
91
+ try {
92
+ const span = trace.getSpan(context.active()) || trace.getActiveSpan();
93
+ const ctx = span?.spanContext?.();
94
+ if (!ctx?.traceId) return "";
95
+ return ` [trace_id=${ctx.traceId} span_id=${ctx.spanId}]`;
96
+ } catch {
97
+ return "";
98
+ }
99
+ }
82
100
  write(msg, level) {
83
101
  try {
102
+ const suffix = this.getTraceSuffix(msg);
103
+ const decoratedMsg = suffix ? `${msg}${suffix}` : msg;
84
104
  if (this.showTimestamps) {
85
105
  const ts = (/* @__PURE__ */ new Date()).toISOString();
86
106
  const lvl = level ? level : void 0;
87
- const prefix = lvl ? `[${ts}] [${lvl}]` : `[${ts}]`;
88
- process.stderr.write(`${prefix} ${msg}
107
+ let tsToken = `[${ts}]`;
108
+ let lvlToken = lvl ? `[${lvl}]` : "";
109
+ if (this.isTTY && !this.isJsonLike) {
110
+ const reset = "\x1B[0m";
111
+ const dim = "\x1B[2m";
112
+ const colours = {
113
+ silent: "",
114
+ error: "\x1B[31m",
115
+ // red
116
+ warn: "\x1B[33m",
117
+ // yellow
118
+ info: "\x1B[36m",
119
+ // cyan
120
+ verbose: "\x1B[35m",
121
+ // magenta
122
+ debug: "\x1B[90m"
123
+ // bright black / gray
124
+ };
125
+ tsToken = `${dim}${tsToken}${reset}`;
126
+ if (lvl) {
127
+ const colour = colours[lvl] || "";
128
+ if (colour) {
129
+ lvlToken = `${colour}${lvlToken}${reset}`;
130
+ }
131
+ }
132
+ }
133
+ const prefix = lvl ? `${tsToken} ${lvlToken}` : tsToken;
134
+ process.stderr.write(`${prefix} ${decoratedMsg}
89
135
  `);
90
136
  } else {
91
- process.stderr.write(msg + "\n");
137
+ process.stderr.write(decoratedMsg + "\n");
92
138
  }
93
139
  } catch {
94
140
  }
@@ -124,4 +170,4 @@ export {
124
170
  logger_exports,
125
171
  init_logger
126
172
  };
127
- //# sourceMappingURL=chunk-VMPLF6FT.mjs.map
173
+ //# sourceMappingURL=chunk-AGIZJ4UZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/logger.ts"],"sourcesContent":["/*\n * Centralized logger for Visor CLI and Action modes.\n * - Respects output format (suppresses info in JSON/SARIF unless debug)\n * - Supports levels: silent < error < warn < info < verbose < debug\n * - Routes logs to stderr to keep stdout clean for machine-readable output\n */\nimport { context as otContext, trace } from './telemetry/lazy-otel';\n\nexport type LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'verbose' | 'debug';\n\nfunction levelToNumber(level: LogLevel): number {\n switch (level) {\n case 'silent':\n return 0;\n case 'error':\n return 10;\n case 'warn':\n return 20;\n case 'info':\n return 30;\n case 'verbose':\n return 40;\n case 'debug':\n return 50;\n }\n}\n\nclass Logger {\n private level: LogLevel = 'info';\n private isJsonLike: boolean = false;\n private isTTY: boolean = typeof process !== 'undefined' ? !!process.stderr.isTTY : false;\n private showTimestamps: boolean = true; // default: always show timestamps\n\n configure(\n opts: {\n outputFormat?: string;\n level?: LogLevel;\n debug?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n } = {}\n ): void {\n // Determine base level\n let lvl: LogLevel = 'info';\n\n if (opts.debug || process.env.VISOR_DEBUG === 'true') {\n lvl = 'debug';\n } else if (opts.verbose || process.env.VISOR_LOG_LEVEL === 'verbose') {\n lvl = 'verbose';\n } else if (opts.quiet || process.env.VISOR_LOG_LEVEL === 'quiet') {\n lvl = 'warn';\n } else if (opts.level) {\n lvl = opts.level;\n } else if (process.env.VISOR_LOG_LEVEL) {\n const envLvl = process.env.VISOR_LOG_LEVEL as LogLevel;\n if (['silent', 'error', 'warn', 'info', 'verbose', 'debug'].includes(envLvl)) {\n lvl = envLvl as LogLevel;\n }\n }\n\n this.level = lvl;\n const output = opts.outputFormat || process.env.VISOR_OUTPUT_FORMAT || 'table';\n // In JSON/SARIF we suppress non-error logs unless explicitly verbose/debug\n this.isJsonLike = output === 'json' || output === 'sarif';\n }\n\n private shouldLog(level: LogLevel): boolean {\n const desired = levelToNumber(level);\n const current = levelToNumber(this.level);\n if (desired > current) return false;\n if (\n this.isJsonLike &&\n desired < levelToNumber('error') &&\n this.level !== 'debug' &&\n this.level !== 'verbose'\n ) {\n // In JSON/SARIF, hide info/warn unless explicitly verbose/debug\n return false;\n }\n return true;\n }\n\n private getTraceSuffix(msg: string): string {\n if (!msg) return '';\n if (msg.includes('trace_id=') || msg.includes('trace_id:')) return '';\n try {\n const span = trace.getSpan(otContext.active()) || trace.getActiveSpan();\n const ctx = span?.spanContext?.();\n if (!ctx?.traceId) return '';\n return ` [trace_id=${ctx.traceId} span_id=${ctx.spanId}]`;\n } catch {\n return '';\n }\n }\n\n private write(msg: string, level?: LogLevel): void {\n // Always route to stderr to keep stdout clean for results\n try {\n const suffix = this.getTraceSuffix(msg);\n const decoratedMsg = suffix ? `${msg}${suffix}` : msg;\n if (this.showTimestamps) {\n const ts = new Date().toISOString();\n const lvl = level ? level : undefined;\n\n let tsToken = `[${ts}]`;\n let lvlToken = lvl ? `[${lvl}]` : '';\n\n // Add simple ANSI colour when running in a TTY and not emitting\n // JSON/SARIF. Colours are intentionally minimal and only applied\n // to the prefix markers, not the full line.\n if (this.isTTY && !this.isJsonLike) {\n const reset = '\\x1b[0m';\n const dim = '\\x1b[2m';\n const colours: Record<LogLevel, string> = {\n silent: '',\n error: '\\x1b[31m', // red\n warn: '\\x1b[33m', // yellow\n info: '\\x1b[36m', // cyan\n verbose: '\\x1b[35m', // magenta\n debug: '\\x1b[90m', // bright black / gray\n };\n\n tsToken = `${dim}${tsToken}${reset}`;\n\n if (lvl) {\n const colour = colours[lvl] || '';\n if (colour) {\n lvlToken = `${colour}${lvlToken}${reset}`;\n }\n }\n }\n\n const prefix = lvl ? `${tsToken} ${lvlToken}` : tsToken;\n process.stderr.write(`${prefix} ${decoratedMsg}\\n`);\n } else {\n process.stderr.write(decoratedMsg + '\\n');\n }\n } catch {\n // Ignore write errors\n }\n }\n\n info(msg: string): void {\n if (this.shouldLog('info')) this.write(msg, 'info');\n }\n\n warn(msg: string): void {\n if (this.shouldLog('warn')) this.write(msg, 'warn');\n }\n\n error(msg: string): void {\n if (this.shouldLog('error')) this.write(msg, 'error');\n }\n\n verbose(msg: string): void {\n if (this.shouldLog('verbose')) this.write(msg, 'verbose');\n }\n\n debug(msg: string): void {\n if (this.shouldLog('debug')) this.write(msg, 'debug');\n }\n\n step(msg: string): void {\n // High-level phase indicator\n if (this.shouldLog('info')) this.write(`▶ ${msg}`, 'info');\n }\n\n success(msg: string): void {\n if (this.shouldLog('info')) this.write(`✔ ${msg}`, 'info');\n }\n}\n\n// Singleton instance\nexport const logger = new Logger();\n\n// Helper to configure from CLI options in a single place\nexport function configureLoggerFromCli(options: {\n output?: string;\n debug?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n}): void {\n logger.configure({\n outputFormat: options.output,\n debug: options.debug,\n verbose: options.verbose,\n quiet: options.quiet,\n });\n\n // Expose output format and debug to process env for modules that need to gate\n // stdout emissions without plumbing the value through every call site.\n try {\n if (options.output) process.env.VISOR_OUTPUT_FORMAT = String(options.output);\n if (typeof options.debug === 'boolean') {\n process.env.VISOR_DEBUG = options.debug ? 'true' : 'false';\n }\n } catch {\n // ignore\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,18 +1,24 @@
1
1
  import {
2
2
  FailureConditionEvaluator,
3
+ init_failure_condition_evaluator
4
+ } from "./chunk-SIWNBRTK.mjs";
5
+ import {
3
6
  compileAndRun,
4
7
  createSecureSandbox,
5
- init_failure_condition_evaluator,
6
8
  init_sandbox
7
- } from "./chunk-OZJ263FM.mjs";
9
+ } from "./chunk-BOVFH3LI.mjs";
10
+ import {
11
+ addEvent,
12
+ init_trace_helpers
13
+ } from "./chunk-ZYAUYXSW.mjs";
8
14
  import {
9
15
  MemoryStore,
10
16
  init_memory_store
11
- } from "./chunk-37ZSCMFC.mjs";
17
+ } from "./chunk-7UK3NIIT.mjs";
12
18
  import {
13
19
  init_logger,
14
20
  logger
15
- } from "./chunk-VMPLF6FT.mjs";
21
+ } from "./chunk-AGIZJ4UZ.mjs";
16
22
  import {
17
23
  __esm,
18
24
  __export,
@@ -204,6 +210,23 @@ function createMemoryHelpers() {
204
210
  }
205
211
  };
206
212
  }
213
+ function formatScopeLabel(scope) {
214
+ if (!scope || scope.length === 0) return "";
215
+ return scope.map((item) => `${item.check}:${item.index}`).join("|");
216
+ }
217
+ function recordRoutingEvent(args) {
218
+ const attrs = {
219
+ check_id: args.checkId,
220
+ trigger: args.trigger,
221
+ action: args.action
222
+ };
223
+ if (args.target) attrs.target = args.target;
224
+ if (args.source) attrs.source = args.source;
225
+ const scopeLabel = formatScopeLabel(args.scope);
226
+ if (scopeLabel) attrs.scope = scopeLabel;
227
+ if (args.gotoEvent) attrs.goto_event = args.gotoEvent;
228
+ addEvent("visor.routing", attrs);
229
+ }
207
230
  async function handleRouting(context, state, transition, emitEvent, routingContext) {
208
231
  const { checkId, scope, result, checkConfig, success } = routingContext;
209
232
  logger.info(`[Routing] Evaluating routing for check: ${checkId}, success: ${success}`);
@@ -266,6 +289,14 @@ async function processOnFinish(checkId, scope, result, checkConfig, context, sta
266
289
  const itemScope = [
267
290
  { check: checkId, index: itemIndex }
268
291
  ];
292
+ recordRoutingEvent({
293
+ checkId,
294
+ trigger: "on_finish",
295
+ action: "run",
296
+ target: targetCheck,
297
+ source: "run",
298
+ scope: itemScope
299
+ });
269
300
  emitEvent({
270
301
  type: "ForwardRunRequested",
271
302
  target: targetCheck,
@@ -276,6 +307,14 @@ async function processOnFinish(checkId, scope, result, checkConfig, context, sta
276
307
  }
277
308
  } else {
278
309
  state.routingLoopCount++;
310
+ recordRoutingEvent({
311
+ checkId,
312
+ trigger: "on_finish",
313
+ action: "run",
314
+ target: targetCheck,
315
+ source: "run",
316
+ scope: []
317
+ });
279
318
  emitEvent({
280
319
  type: "ForwardRunRequested",
281
320
  target: targetCheck,
@@ -312,6 +351,14 @@ async function processOnFinish(checkId, scope, result, checkConfig, context, sta
312
351
  logger.info(`[Routing] on_finish.run_js: scheduling ${targetCheck}`);
313
352
  }
314
353
  state.routingLoopCount++;
354
+ recordRoutingEvent({
355
+ checkId,
356
+ trigger: "on_finish",
357
+ action: "run",
358
+ target: targetCheck,
359
+ source: "run_js",
360
+ scope
361
+ });
315
362
  emitEvent({
316
363
  type: "ForwardRunRequested",
317
364
  target: targetCheck,
@@ -344,6 +391,15 @@ async function processOnFinish(checkId, scope, result, checkConfig, context, sta
344
391
  return;
345
392
  }
346
393
  state.routingLoopCount++;
394
+ recordRoutingEvent({
395
+ checkId,
396
+ trigger: "on_finish",
397
+ action: "goto",
398
+ target: finishTransTarget.to,
399
+ source: "transitions",
400
+ scope,
401
+ gotoEvent: finishTransTarget.goto_event
402
+ });
347
403
  emitEvent({
348
404
  type: "ForwardRunRequested",
349
405
  target: finishTransTarget.to,
@@ -380,6 +436,14 @@ async function processOnFinish(checkId, scope, result, checkConfig, context, sta
380
436
  logger.info(`[Routing] on_finish.goto: ${gotoTarget}`);
381
437
  }
382
438
  state.routingLoopCount++;
439
+ recordRoutingEvent({
440
+ checkId,
441
+ trigger: "on_finish",
442
+ action: "goto",
443
+ target: gotoTarget,
444
+ source: onFinish.goto_js ? "goto_js" : "goto",
445
+ scope
446
+ });
383
447
  emitEvent({
384
448
  type: "ForwardRunRequested",
385
449
  target: gotoTarget,
@@ -528,6 +592,14 @@ async function processOnSuccess(checkId, scope, result, checkConfig, context, st
528
592
  const itemScope = [
529
593
  { check: checkId, index: itemIndex }
530
594
  ];
595
+ recordRoutingEvent({
596
+ checkId,
597
+ trigger: "on_success",
598
+ action: "run",
599
+ target: targetCheck,
600
+ source: "run",
601
+ scope: itemScope
602
+ });
531
603
  emitEvent({
532
604
  type: "ForwardRunRequested",
533
605
  target: targetCheck,
@@ -537,6 +609,14 @@ async function processOnSuccess(checkId, scope, result, checkConfig, context, st
537
609
  }
538
610
  } else {
539
611
  state.routingLoopCount++;
612
+ recordRoutingEvent({
613
+ checkId,
614
+ trigger: "on_success",
615
+ action: "run",
616
+ target: targetCheck,
617
+ source: "run",
618
+ scope
619
+ });
540
620
  emitEvent({
541
621
  type: "ForwardRunRequested",
542
622
  target: targetCheck,
@@ -572,6 +652,14 @@ async function processOnSuccess(checkId, scope, result, checkConfig, context, st
572
652
  logger.info(`[Routing] on_success.run_js: scheduling ${targetCheck}`);
573
653
  }
574
654
  state.routingLoopCount++;
655
+ recordRoutingEvent({
656
+ checkId,
657
+ trigger: "on_success",
658
+ action: "run",
659
+ target: targetCheck,
660
+ source: "run_js",
661
+ scope
662
+ });
575
663
  emitEvent({
576
664
  type: "ForwardRunRequested",
577
665
  target: targetCheck,
@@ -603,6 +691,15 @@ async function processOnSuccess(checkId, scope, result, checkConfig, context, st
603
691
  return;
604
692
  }
605
693
  state.routingLoopCount++;
694
+ recordRoutingEvent({
695
+ checkId,
696
+ trigger: "on_success",
697
+ action: "goto",
698
+ target: successTransTarget.to,
699
+ source: "transitions",
700
+ scope,
701
+ gotoEvent: successTransTarget.goto_event
702
+ });
606
703
  emitEvent({
607
704
  type: "ForwardRunRequested",
608
705
  target: successTransTarget.to,
@@ -640,6 +737,15 @@ async function processOnSuccess(checkId, scope, result, checkConfig, context, st
640
737
  logger.info(`[Routing] on_success.goto: ${gotoTarget}`);
641
738
  }
642
739
  state.routingLoopCount++;
740
+ recordRoutingEvent({
741
+ checkId,
742
+ trigger: "on_success",
743
+ action: "goto",
744
+ target: gotoTarget,
745
+ source: onSuccess.goto_js ? "goto_js" : "goto",
746
+ scope,
747
+ gotoEvent: onSuccess.goto_event
748
+ });
643
749
  emitEvent({
644
750
  type: "ForwardRunRequested",
645
751
  target: gotoTarget,
@@ -692,6 +798,14 @@ async function processOnFail(checkId, scope, result, checkConfig, context, state
692
798
  const itemScope = [
693
799
  { check: checkId, index: itemIndex }
694
800
  ];
801
+ recordRoutingEvent({
802
+ checkId,
803
+ trigger: "on_fail",
804
+ action: "run",
805
+ target: targetCheck,
806
+ source: "run",
807
+ scope: itemScope
808
+ });
695
809
  emitEvent({
696
810
  type: "ForwardRunRequested",
697
811
  target: targetCheck,
@@ -701,6 +815,14 @@ async function processOnFail(checkId, scope, result, checkConfig, context, state
701
815
  }
702
816
  } else {
703
817
  state.routingLoopCount++;
818
+ recordRoutingEvent({
819
+ checkId,
820
+ trigger: "on_fail",
821
+ action: "run",
822
+ target: targetCheck,
823
+ source: "run",
824
+ scope
825
+ });
704
826
  emitEvent({
705
827
  type: "ForwardRunRequested",
706
828
  target: targetCheck,
@@ -736,6 +858,14 @@ async function processOnFail(checkId, scope, result, checkConfig, context, state
736
858
  logger.info(`[Routing] on_fail.run_js: scheduling ${targetCheck}`);
737
859
  }
738
860
  state.routingLoopCount++;
861
+ recordRoutingEvent({
862
+ checkId,
863
+ trigger: "on_fail",
864
+ action: "run",
865
+ target: targetCheck,
866
+ source: "run_js",
867
+ scope
868
+ });
739
869
  emitEvent({
740
870
  type: "ForwardRunRequested",
741
871
  target: targetCheck,
@@ -767,6 +897,13 @@ async function processOnFail(checkId, scope, result, checkConfig, context, state
767
897
  if (used >= max) return;
768
898
  attemptsMap.set(key, used + 1);
769
899
  state.routingLoopCount++;
900
+ recordRoutingEvent({
901
+ checkId,
902
+ trigger: "on_fail",
903
+ action: "retry",
904
+ source: "retry",
905
+ scope: sc || []
906
+ });
770
907
  emitEvent({
771
908
  type: "ForwardRunRequested",
772
909
  target: checkId,
@@ -812,6 +949,15 @@ async function processOnFail(checkId, scope, result, checkConfig, context, state
812
949
  return;
813
950
  }
814
951
  state.routingLoopCount++;
952
+ recordRoutingEvent({
953
+ checkId,
954
+ trigger: "on_fail",
955
+ action: "goto",
956
+ target: failTransTarget.to,
957
+ source: "transitions",
958
+ scope,
959
+ gotoEvent: failTransTarget.goto_event
960
+ });
815
961
  emitEvent({
816
962
  type: "ForwardRunRequested",
817
963
  target: failTransTarget.to,
@@ -849,6 +995,15 @@ async function processOnFail(checkId, scope, result, checkConfig, context, state
849
995
  logger.info(`[Routing] on_fail.goto: ${gotoTarget}`);
850
996
  }
851
997
  state.routingLoopCount++;
998
+ recordRoutingEvent({
999
+ checkId,
1000
+ trigger: "on_fail",
1001
+ action: "goto",
1002
+ target: gotoTarget,
1003
+ source: onFail.goto_js ? "goto_js" : "goto",
1004
+ scope,
1005
+ gotoEvent: onFail.goto_event
1006
+ });
852
1007
  emitEvent({
853
1008
  type: "ForwardRunRequested",
854
1009
  target: gotoTarget,
@@ -1195,6 +1350,7 @@ var DEFAULT_MAX_LOOPS;
1195
1350
  var init_routing = __esm({
1196
1351
  "src/state-machine/states/routing.ts"() {
1197
1352
  init_logger();
1353
+ init_trace_helpers();
1198
1354
  init_failure_condition_evaluator();
1199
1355
  init_sandbox();
1200
1356
  init_memory_store();
@@ -1212,4 +1368,4 @@ export {
1212
1368
  evaluateTransitions,
1213
1369
  init_routing
1214
1370
  };
1215
- //# sourceMappingURL=chunk-IEO6CFLG.mjs.map
1371
+ //# sourceMappingURL=chunk-AIVFBIS4.mjs.map