@probelabs/visor 0.1.186 → 0.1.187

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 (395) hide show
  1. package/defaults/assistant.yaml +31 -0
  2. package/defaults/code-talk.yaml +32 -0
  3. package/defaults/skills/code-explorer.yaml +6 -0
  4. package/dist/action-cli-bridge.d.ts.map +1 -1
  5. package/dist/agent-protocol/a2a-frontend.d.ts.map +1 -1
  6. package/dist/agent-protocol/index.d.ts.map +1 -1
  7. package/dist/agent-protocol/push-notification-manager.d.ts.map +1 -1
  8. package/dist/agent-protocol/state-transitions.d.ts.map +1 -1
  9. package/dist/agent-protocol/task-evaluator.d.ts.map +1 -1
  10. package/dist/agent-protocol/task-live-update-slack.d.ts +10 -0
  11. package/dist/agent-protocol/task-live-update-slack.d.ts.map +1 -1
  12. package/dist/agent-protocol/task-live-update-teams.d.ts.map +1 -1
  13. package/dist/agent-protocol/task-live-update-telegram.d.ts.map +1 -1
  14. package/dist/agent-protocol/task-live-updates.d.ts +10 -0
  15. package/dist/agent-protocol/task-live-updates.d.ts.map +1 -1
  16. package/dist/agent-protocol/task-progress-tool.d.ts.map +1 -1
  17. package/dist/agent-protocol/task-queue.d.ts.map +1 -1
  18. package/dist/agent-protocol/task-store.d.ts.map +1 -1
  19. package/dist/agent-protocol/task-stream-manager.d.ts.map +1 -1
  20. package/dist/agent-protocol/task-trace-resolution.d.ts.map +1 -1
  21. package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
  22. package/dist/agent-protocol/tasks-tui.d.ts.map +1 -1
  23. package/dist/agent-protocol/trace-serializer.d.ts +43 -1
  24. package/dist/agent-protocol/trace-serializer.d.ts.map +1 -1
  25. package/dist/agent-protocol/track-execution.d.ts.map +1 -1
  26. package/dist/agent-protocol/types.d.ts.map +1 -1
  27. package/dist/ai-review-service.d.ts +22 -1
  28. package/dist/ai-review-service.d.ts.map +1 -1
  29. package/dist/check-execution-engine.d.ts.map +1 -1
  30. package/dist/cli-main.d.ts +1 -0
  31. package/dist/cli-main.d.ts.map +1 -1
  32. package/dist/cli.d.ts.map +1 -1
  33. package/dist/commands.d.ts.map +1 -1
  34. package/dist/config/cli-handler.d.ts.map +1 -1
  35. package/dist/config/config-reloader.d.ts.map +1 -1
  36. package/dist/config/config-snapshot-store.d.ts.map +1 -1
  37. package/dist/config/config-watcher.d.ts.map +1 -1
  38. package/dist/config/types.d.ts.map +1 -1
  39. package/dist/config.d.ts.map +1 -1
  40. package/dist/cron-scheduler.d.ts.map +1 -1
  41. package/dist/debug-visualizer/debug-span-exporter.d.ts.map +1 -1
  42. package/dist/debug-visualizer/trace-reader.d.ts.map +1 -1
  43. package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
  44. package/dist/defaults/assistant.yaml +31 -0
  45. package/dist/defaults/code-talk.yaml +32 -0
  46. package/dist/defaults/skills/code-explorer.yaml +6 -0
  47. package/dist/dependency-resolver.d.ts.map +1 -1
  48. package/dist/docs/telemetry-setup.md +18 -2
  49. package/dist/email/adapter.d.ts.map +1 -1
  50. package/dist/email/client.d.ts.map +1 -1
  51. package/dist/email/markdown.d.ts.map +1 -1
  52. package/dist/email/polling-runner.d.ts +1 -0
  53. package/dist/email/polling-runner.d.ts.map +1 -1
  54. package/dist/engine/on-finish/orchestrator.d.ts.map +1 -1
  55. package/dist/engine/on-finish/utils.d.ts.map +1 -1
  56. package/dist/event-bus/event-bus.d.ts.map +1 -1
  57. package/dist/event-bus/types.d.ts.map +1 -1
  58. package/dist/event-mapper.d.ts.map +1 -1
  59. package/dist/failure-condition-evaluator.d.ts.map +1 -1
  60. package/dist/footer.d.ts.map +1 -1
  61. package/dist/frontends/email-frontend.d.ts.map +1 -1
  62. package/dist/frontends/github-frontend.d.ts.map +1 -1
  63. package/dist/frontends/host.d.ts.map +1 -1
  64. package/dist/frontends/ndjson-sink.d.ts.map +1 -1
  65. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  66. package/dist/frontends/teams-frontend.d.ts.map +1 -1
  67. package/dist/frontends/telegram-frontend.d.ts.map +1 -1
  68. package/dist/frontends/whatsapp-frontend.d.ts.map +1 -1
  69. package/dist/generated/config-schema.d.ts +16 -8
  70. package/dist/generated/config-schema.d.ts.map +1 -1
  71. package/dist/git-repository-analyzer.d.ts.map +1 -1
  72. package/dist/github-auth.d.ts.map +1 -1
  73. package/dist/github-check-service.d.ts.map +1 -1
  74. package/dist/github-comments.d.ts.map +1 -1
  75. package/dist/github-reactions.d.ts.map +1 -1
  76. package/dist/index.d.ts +1 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +7656 -1458
  79. package/dist/issue-filter.d.ts.map +1 -1
  80. package/dist/liquid-extensions.d.ts.map +1 -1
  81. package/dist/logger.d.ts.map +1 -1
  82. package/dist/mcp-job-manager.d.ts.map +1 -1
  83. package/dist/mcp-server.d.ts.map +1 -1
  84. package/dist/memory-store.d.ts.map +1 -1
  85. package/dist/output/traces/{run-2026-05-05T12-31-47-571Z.ndjson → run-2026-08-20T13-50-06-218Z.ndjson} +2699 -2699
  86. package/dist/output-formatters.d.ts.map +1 -1
  87. package/dist/policy/default-engine.d.ts.map +1 -1
  88. package/dist/policy/index.d.ts.map +1 -1
  89. package/dist/policy/policy-check-command.d.ts.map +1 -1
  90. package/dist/policy/types.d.ts.map +1 -1
  91. package/dist/pr-analyzer.d.ts.map +1 -1
  92. package/dist/pr-detector.d.ts.map +1 -1
  93. package/dist/providers/a2a-check-provider.d.ts.map +1 -1
  94. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  95. package/dist/providers/api-tool-executor.d.ts.map +1 -1
  96. package/dist/providers/check-provider-registry.d.ts.map +1 -1
  97. package/dist/providers/check-provider.interface.d.ts.map +1 -1
  98. package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
  99. package/dist/providers/claude-code-types.d.ts.map +1 -1
  100. package/dist/providers/command-check-provider.d.ts.map +1 -1
  101. package/dist/providers/custom-tool-executor.d.ts.map +1 -1
  102. package/dist/providers/git-checkout-provider.d.ts.map +1 -1
  103. package/dist/providers/github-ops-provider.d.ts.map +1 -1
  104. package/dist/providers/http-check-provider.d.ts.map +1 -1
  105. package/dist/providers/http-client-provider.d.ts.map +1 -1
  106. package/dist/providers/http-input-provider.d.ts.map +1 -1
  107. package/dist/providers/human-input-check-provider.d.ts.map +1 -1
  108. package/dist/providers/index.d.ts.map +1 -1
  109. package/dist/providers/log-check-provider.d.ts.map +1 -1
  110. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  111. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  112. package/dist/providers/mcp-tools.d.ts.map +1 -1
  113. package/dist/providers/memory-check-provider.d.ts.map +1 -1
  114. package/dist/providers/noop-check-provider.d.ts.map +1 -1
  115. package/dist/providers/script-check-provider.d.ts.map +1 -1
  116. package/dist/providers/utcp-check-provider.d.ts.map +1 -1
  117. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  118. package/dist/providers/workflow-tool-executor.d.ts.map +1 -1
  119. package/dist/reviewer.d.ts.map +1 -1
  120. package/dist/runners/config-reload-runtime.d.ts.map +1 -1
  121. package/dist/runners/graceful-restart.d.ts.map +1 -1
  122. package/dist/runners/mcp-server-runner.d.ts.map +1 -1
  123. package/dist/runners/process-cli-handler.d.ts.map +1 -1
  124. package/dist/runners/process-discovery.d.ts.map +1 -1
  125. package/dist/runners/runner-factory.d.ts.map +1 -1
  126. package/dist/runners/runner-host.d.ts.map +1 -1
  127. package/dist/runners/runner.d.ts.map +1 -1
  128. package/dist/runners/telemetry-init.d.ts.map +1 -1
  129. package/dist/sandbox/bubblewrap-sandbox.d.ts.map +1 -1
  130. package/dist/sandbox/cache-volume-manager.d.ts.map +1 -1
  131. package/dist/sandbox/check-runner.d.ts.map +1 -1
  132. package/dist/sandbox/compose-generator.d.ts.map +1 -1
  133. package/dist/sandbox/docker-compose-sandbox.d.ts.map +1 -1
  134. package/dist/sandbox/docker-image-sandbox.d.ts.map +1 -1
  135. package/dist/sandbox/env-filter.d.ts.map +1 -1
  136. package/dist/sandbox/index.d.ts.map +1 -1
  137. package/dist/sandbox/sandbox-manager.d.ts.map +1 -1
  138. package/dist/sandbox/sandbox-telemetry.d.ts.map +1 -1
  139. package/dist/sandbox/seatbelt-sandbox.d.ts.map +1 -1
  140. package/dist/sandbox/trace-ingester.d.ts.map +1 -1
  141. package/dist/sandbox/types.d.ts.map +1 -1
  142. package/dist/scheduler/cli-handler.d.ts.map +1 -1
  143. package/dist/scheduler/index.d.ts.map +1 -1
  144. package/dist/scheduler/message-trigger.d.ts.map +1 -1
  145. package/dist/scheduler/schedule-parser.d.ts.map +1 -1
  146. package/dist/scheduler/schedule-store.d.ts.map +1 -1
  147. package/dist/scheduler/schedule-tool.d.ts.map +1 -1
  148. package/dist/scheduler/scheduler.d.ts.map +1 -1
  149. package/dist/scheduler/store/index.d.ts.map +1 -1
  150. package/dist/scheduler/store/json-migrator.d.ts.map +1 -1
  151. package/dist/scheduler/store/sqlite-store.d.ts.map +1 -1
  152. package/dist/scheduler/store/types.d.ts.map +1 -1
  153. package/dist/sdk/{a2a-frontend-L3TQ7QQ6.mjs → a2a-frontend-XCQ4CQUF.mjs} +3 -3
  154. package/dist/sdk/{check-provider-registry-RQYIEQLJ.mjs → check-provider-registry-2D3MCWP3.mjs} +14 -11
  155. package/dist/sdk/{chunk-WZQMTD7W.mjs → chunk-2LLKENYD.mjs} +3 -3
  156. package/dist/sdk/{chunk-WZQMTD7W.mjs.map → chunk-2LLKENYD.mjs.map} +1 -1
  157. package/dist/sdk/{chunk-XXAEN5KU.mjs → chunk-77AKSSW2.mjs} +43 -65
  158. package/dist/sdk/chunk-77AKSSW2.mjs.map +1 -0
  159. package/dist/sdk/chunk-7QI6F66G.mjs +145 -0
  160. package/dist/sdk/chunk-7QI6F66G.mjs.map +1 -0
  161. package/dist/sdk/{chunk-NEZY2MXM.mjs → chunk-B2LQT6QU.mjs} +4 -4
  162. package/dist/sdk/{chunk-NEZY2MXM.mjs.map → chunk-B2LQT6QU.mjs.map} +1 -1
  163. package/dist/sdk/{chunk-IY5PQ5EN.mjs → chunk-BVEATT5V.mjs} +822 -51
  164. package/dist/sdk/chunk-BVEATT5V.mjs.map +1 -0
  165. package/dist/sdk/{chunk-TSX3YS3F.mjs → chunk-HW4MPCOW.mjs} +5 -139
  166. package/dist/sdk/chunk-HW4MPCOW.mjs.map +1 -0
  167. package/dist/sdk/chunk-PGBV3VZB.mjs +122 -0
  168. package/dist/sdk/chunk-PGBV3VZB.mjs.map +1 -0
  169. package/dist/sdk/{chunk-PDQTEBOJ.mjs → chunk-QT766ZLD.mjs} +5 -1
  170. package/dist/sdk/chunk-QT766ZLD.mjs.map +1 -0
  171. package/dist/sdk/{chunk-5TXIAPRA.mjs → chunk-S3GSZRYC.mjs} +2 -2
  172. package/dist/sdk/{chunk-NPOVLLKH.mjs → chunk-TGQBEM3Y.mjs} +570 -259
  173. package/dist/sdk/chunk-TGQBEM3Y.mjs.map +1 -0
  174. package/dist/sdk/chunk-TL3ZTYFY.mjs +141 -0
  175. package/dist/sdk/chunk-TL3ZTYFY.mjs.map +1 -0
  176. package/dist/sdk/{chunk-4UMDSYC7.mjs → chunk-VS3JE2DL.mjs} +3 -3
  177. package/dist/sdk/{chunk-A4WHMRK2.mjs → chunk-YETG675X.mjs} +2 -2
  178. package/dist/sdk/{chunk-XX6WT332.mjs → chunk-YTG5DN72.mjs} +17 -9
  179. package/dist/sdk/chunk-YTG5DN72.mjs.map +1 -0
  180. package/dist/sdk/{chunk-SRU5TFNY.mjs → chunk-YU3VR5SZ.mjs} +145 -16
  181. package/dist/sdk/chunk-YU3VR5SZ.mjs.map +1 -0
  182. package/dist/sdk/{config-BCYAVJ5S.mjs → config-H5IOLBFA.mjs} +2 -2
  183. package/dist/sdk/{email-frontend-P7QE4UUJ.mjs → email-frontend-AE5TYWNC.mjs} +18 -3
  184. package/dist/sdk/{email-frontend-P7QE4UUJ.mjs.map → email-frontend-AE5TYWNC.mjs.map} +1 -1
  185. package/dist/sdk/{failure-condition-evaluator-ZBOSD574.mjs → failure-condition-evaluator-66PWLV3D.mjs} +4 -4
  186. package/dist/sdk/{github-frontend-4WHT5JEU.mjs → github-frontend-BBFKCY4M.mjs} +4 -4
  187. package/dist/sdk/{host-FKR7H26C.mjs → host-UQRZDLT7.mjs} +8 -8
  188. package/dist/sdk/oauth2-token-cache-OS7WHLDI.mjs +13 -0
  189. package/dist/sdk/{routing-IB2PXYFC.mjs → routing-Q647KUMO.mjs} +5 -5
  190. package/dist/sdk/{schedule-tool-LB33KL2W.mjs → schedule-tool-WMGSM6IT.mjs} +14 -11
  191. package/dist/sdk/{schedule-tool-handler-KYWZHKSS.mjs → schedule-tool-handler-JMDHCGZ2.mjs} +14 -11
  192. package/dist/sdk/sdk.d.mts +14 -2
  193. package/dist/sdk/sdk.d.ts +14 -2
  194. package/dist/sdk/sdk.js +1927 -643
  195. package/dist/sdk/sdk.js.map +1 -1
  196. package/dist/sdk/sdk.mjs +13 -10
  197. package/dist/sdk/sdk.mjs.map +1 -1
  198. package/dist/sdk/session-registry-CENXWIFR.mjs +12 -0
  199. package/dist/sdk/{slack-frontend-K3TPGERM.mjs → slack-frontend-JMX5MUVZ.mjs} +42 -12
  200. package/dist/sdk/slack-frontend-JMX5MUVZ.mjs.map +1 -0
  201. package/dist/sdk/{task-evaluator-H3BXC7SE.mjs → task-evaluator-4QG4CYQA.mjs} +7 -6
  202. package/dist/sdk/task-evaluator-4QG4CYQA.mjs.map +1 -0
  203. package/dist/sdk/{teams-frontend-6RRW533K.mjs → teams-frontend-6MDAN7OR.mjs} +17 -4
  204. package/dist/sdk/teams-frontend-6MDAN7OR.mjs.map +1 -0
  205. package/dist/sdk/{telegram-frontend-5UA77YAT.mjs → telegram-frontend-NLX2ZHS4.mjs} +17 -4
  206. package/dist/sdk/telegram-frontend-NLX2ZHS4.mjs.map +1 -0
  207. package/dist/sdk/{trace-helpers-AMZ2524G.mjs → trace-helpers-AIUGQLK5.mjs} +3 -3
  208. package/dist/sdk/{trace-serializer-EBHTHZYT.mjs → trace-serializer-4TOIAVQL.mjs} +10 -2
  209. package/dist/sdk/{track-execution-VW6P3OYO.mjs → track-execution-CFRZXMEC.mjs} +91 -20
  210. package/dist/sdk/track-execution-CFRZXMEC.mjs.map +1 -0
  211. package/dist/sdk/{utcp-check-provider-Q4PD5EP2.mjs → utcp-check-provider-WDTSQ7DZ.mjs} +3 -2
  212. package/dist/sdk/{whatsapp-frontend-72XEIUIR.mjs → whatsapp-frontend-3EMMNC7R.mjs} +15 -2
  213. package/dist/sdk/whatsapp-frontend-3EMMNC7R.mjs.map +1 -0
  214. package/dist/sdk/{workflow-check-provider-N6KSDPWU.mjs → workflow-check-provider-G7A67EPP.mjs} +14 -11
  215. package/dist/sdk/workflow-check-provider-G7A67EPP.mjs.map +1 -0
  216. package/dist/sdk.d.ts.map +1 -1
  217. package/dist/session-registry.d.ts +2 -7
  218. package/dist/session-registry.d.ts.map +1 -1
  219. package/dist/slack/adapter.d.ts.map +1 -1
  220. package/dist/slack/cache-prewarmer.d.ts.map +1 -1
  221. package/dist/slack/client.d.ts +8 -0
  222. package/dist/slack/client.d.ts.map +1 -1
  223. package/dist/slack/markdown.d.ts.map +1 -1
  224. package/dist/slack/prompt-state.d.ts.map +1 -1
  225. package/dist/slack/rate-limiter.d.ts.map +1 -1
  226. package/dist/slack/schedule-tool-handler.d.ts.map +1 -1
  227. package/dist/slack/signature.d.ts.map +1 -1
  228. package/dist/slack/slack-output-adapter.d.ts.map +1 -1
  229. package/dist/slack/socket-runner.d.ts +1 -0
  230. package/dist/slack/socket-runner.d.ts.map +1 -1
  231. package/dist/slack/thread-cache.d.ts.map +1 -1
  232. package/dist/snapshot-store.d.ts.map +1 -1
  233. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -1
  234. package/dist/state-machine/context/workflow-inputs.d.ts.map +1 -1
  235. package/dist/state-machine/dispatch/debounce-manager.d.ts +44 -0
  236. package/dist/state-machine/dispatch/debounce-manager.d.ts.map +1 -0
  237. package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -1
  238. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
  239. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -1
  240. package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -1
  241. package/dist/state-machine/dispatch/on-init-handlers.d.ts.map +1 -1
  242. package/dist/state-machine/dispatch/policy-gate.d.ts.map +1 -1
  243. package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -1
  244. package/dist/state-machine/dispatch/sandbox-routing.d.ts.map +1 -1
  245. package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -1
  246. package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -1
  247. package/dist/state-machine/execution/summary.d.ts.map +1 -1
  248. package/dist/state-machine/runner.d.ts.map +1 -1
  249. package/dist/state-machine/states/check-running.d.ts.map +1 -1
  250. package/dist/state-machine/states/completed.d.ts.map +1 -1
  251. package/dist/state-machine/states/error.d.ts.map +1 -1
  252. package/dist/state-machine/states/init.d.ts.map +1 -1
  253. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
  254. package/dist/state-machine/states/plan-ready.d.ts.map +1 -1
  255. package/dist/state-machine/states/routing.d.ts.map +1 -1
  256. package/dist/state-machine/states/wave-planning.d.ts.map +1 -1
  257. package/dist/state-machine/workflow-projection.d.ts.map +1 -1
  258. package/dist/state-machine-execution-engine.d.ts +1 -0
  259. package/dist/state-machine-execution-engine.d.ts.map +1 -1
  260. package/dist/teams/adapter.d.ts.map +1 -1
  261. package/dist/teams/client.d.ts.map +1 -1
  262. package/dist/teams/markdown.d.ts.map +1 -1
  263. package/dist/teams/webhook-runner.d.ts +1 -0
  264. package/dist/teams/webhook-runner.d.ts.map +1 -1
  265. package/dist/telegram/adapter.d.ts.map +1 -1
  266. package/dist/telegram/client.d.ts.map +1 -1
  267. package/dist/telegram/markdown.d.ts.map +1 -1
  268. package/dist/telegram/polling-runner.d.ts +1 -0
  269. package/dist/telegram/polling-runner.d.ts.map +1 -1
  270. package/dist/telemetry/fallback-ndjson.d.ts.map +1 -1
  271. package/dist/telemetry/file-span-exporter.d.ts.map +1 -1
  272. package/dist/telemetry/lazy-otel.d.ts.map +1 -1
  273. package/dist/telemetry/metrics.d.ts.map +1 -1
  274. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  275. package/dist/telemetry/state-capture.d.ts.map +1 -1
  276. package/dist/telemetry/trace-helpers.d.ts.map +1 -1
  277. package/dist/telemetry/trace-report-exporter.d.ts.map +1 -1
  278. package/dist/test-runner/assertions.d.ts.map +1 -1
  279. package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
  280. package/dist/test-runner/core/environment.d.ts.map +1 -1
  281. package/dist/test-runner/core/fixture.d.ts.map +1 -1
  282. package/dist/test-runner/core/flow-stage.d.ts.map +1 -1
  283. package/dist/test-runner/core/mocks.d.ts.map +1 -1
  284. package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -1
  285. package/dist/test-runner/evaluators.d.ts.map +1 -1
  286. package/dist/test-runner/fixture-loader.d.ts.map +1 -1
  287. package/dist/test-runner/index.d.ts.map +1 -1
  288. package/dist/test-runner/llm-judge.d.ts.map +1 -1
  289. package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -1
  290. package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -1
  291. package/dist/test-runner/recorders/slack-recorder.d.ts.map +1 -1
  292. package/dist/test-runner/utils/selectors.d.ts.map +1 -1
  293. package/dist/test-runner/validator.d.ts.map +1 -1
  294. package/dist/traces/{run-2026-05-05T12-31-47-571Z.ndjson → run-2026-08-20T13-50-06-218Z.ndjson} +2699 -2699
  295. package/dist/tui/chat-runner.d.ts.map +1 -1
  296. package/dist/tui/chat-state.d.ts.map +1 -1
  297. package/dist/tui/chat-tui.d.ts.map +1 -1
  298. package/dist/tui/components/chat-box.d.ts.map +1 -1
  299. package/dist/tui/components/input-bar.d.ts.map +1 -1
  300. package/dist/tui/components/status-bar.d.ts.map +1 -1
  301. package/dist/tui/components/trace-viewer.d.ts.map +1 -1
  302. package/dist/tui/index.d.ts.map +1 -1
  303. package/dist/tui/tui-frontend.d.ts.map +1 -1
  304. package/dist/types/bot.d.ts.map +1 -1
  305. package/dist/types/cli.d.ts.map +1 -1
  306. package/dist/types/config.d.ts +14 -2
  307. package/dist/types/config.d.ts.map +1 -1
  308. package/dist/types/engine.d.ts.map +1 -1
  309. package/dist/types/execution.d.ts.map +1 -1
  310. package/dist/types/git-checkout.d.ts.map +1 -1
  311. package/dist/types/github.d.ts.map +1 -1
  312. package/dist/types/workflow.d.ts.map +1 -1
  313. package/dist/utils/author-permissions.d.ts.map +1 -1
  314. package/dist/utils/child-process-error-handler.d.ts +19 -0
  315. package/dist/utils/child-process-error-handler.d.ts.map +1 -0
  316. package/dist/utils/command-executor.d.ts.map +1 -1
  317. package/dist/utils/comment-metadata.d.ts.map +1 -1
  318. package/dist/utils/config-loader.d.ts.map +1 -1
  319. package/dist/utils/config-merger.d.ts.map +1 -1
  320. package/dist/utils/diff-processor.d.ts.map +1 -1
  321. package/dist/utils/env-exposure.d.ts.map +1 -1
  322. package/dist/utils/env-resolver.d.ts.map +1 -1
  323. package/dist/utils/fair-concurrency-limiter.d.ts.map +1 -1
  324. package/dist/utils/file-exclusion.d.ts.map +1 -1
  325. package/dist/utils/head-sha.d.ts.map +1 -1
  326. package/dist/utils/human-id.d.ts.map +1 -1
  327. package/dist/utils/instance-id.d.ts.map +1 -1
  328. package/dist/utils/interactive-prompt.d.ts.map +1 -1
  329. package/dist/utils/issue-normalizer.d.ts.map +1 -1
  330. package/dist/utils/json-text-extractor.d.ts.map +1 -1
  331. package/dist/utils/mermaid-telemetry.d.ts.map +1 -1
  332. package/dist/utils/oauth2-token-cache.d.ts.map +1 -1
  333. package/dist/utils/rate-limiter.d.ts.map +1 -1
  334. package/dist/utils/sandbox.d.ts.map +1 -1
  335. package/dist/utils/script-memory-ops.d.ts.map +1 -1
  336. package/dist/utils/script-tool-environment.d.ts.map +1 -1
  337. package/dist/utils/stdin-reader.d.ts.map +1 -1
  338. package/dist/utils/template-context.d.ts.map +1 -1
  339. package/dist/utils/tool-resolver.d.ts.map +1 -1
  340. package/dist/utils/toolkit-expander.d.ts.map +1 -1
  341. package/dist/utils/tracer-init.d.ts.map +1 -1
  342. package/dist/utils/ui-helpers.d.ts.map +1 -1
  343. package/dist/utils/user-facing-error.d.ts +4 -0
  344. package/dist/utils/user-facing-error.d.ts.map +1 -0
  345. package/dist/utils/workspace-manager.d.ts +5 -0
  346. package/dist/utils/workspace-manager.d.ts.map +1 -1
  347. package/dist/utils/worktree-cleanup.d.ts +28 -0
  348. package/dist/utils/worktree-cleanup.d.ts.map +1 -1
  349. package/dist/utils/worktree-manager.d.ts +6 -0
  350. package/dist/utils/worktree-manager.d.ts.map +1 -1
  351. package/dist/webhook-server.d.ts.map +1 -1
  352. package/dist/whatsapp/adapter.d.ts.map +1 -1
  353. package/dist/whatsapp/client.d.ts.map +1 -1
  354. package/dist/whatsapp/markdown.d.ts.map +1 -1
  355. package/dist/whatsapp/webhook-runner.d.ts +1 -0
  356. package/dist/whatsapp/webhook-runner.d.ts.map +1 -1
  357. package/dist/workflow-executor.d.ts +7 -0
  358. package/dist/workflow-executor.d.ts.map +1 -1
  359. package/dist/workflow-registry.d.ts.map +1 -1
  360. package/package.json +3 -3
  361. package/dist/output/traces/run-2026-05-05T12-31-09-587Z.ndjson +0 -252
  362. package/dist/sdk/chunk-IY5PQ5EN.mjs.map +0 -1
  363. package/dist/sdk/chunk-NPOVLLKH.mjs.map +0 -1
  364. package/dist/sdk/chunk-PDQTEBOJ.mjs.map +0 -1
  365. package/dist/sdk/chunk-SRU5TFNY.mjs.map +0 -1
  366. package/dist/sdk/chunk-TSX3YS3F.mjs.map +0 -1
  367. package/dist/sdk/chunk-XX6WT332.mjs.map +0 -1
  368. package/dist/sdk/chunk-XXAEN5KU.mjs.map +0 -1
  369. package/dist/sdk/session-registry-6PV6SGEJ.mjs +0 -10
  370. package/dist/sdk/slack-frontend-K3TPGERM.mjs.map +0 -1
  371. package/dist/sdk/task-evaluator-H3BXC7SE.mjs.map +0 -1
  372. package/dist/sdk/teams-frontend-6RRW533K.mjs.map +0 -1
  373. package/dist/sdk/telegram-frontend-5UA77YAT.mjs.map +0 -1
  374. package/dist/sdk/trace-reader-OVE4DL2D.mjs +0 -270
  375. package/dist/sdk/trace-reader-OVE4DL2D.mjs.map +0 -1
  376. package/dist/sdk/track-execution-VW6P3OYO.mjs.map +0 -1
  377. package/dist/sdk/whatsapp-frontend-72XEIUIR.mjs.map +0 -1
  378. package/dist/traces/run-2026-05-05T12-31-09-587Z.ndjson +0 -252
  379. /package/dist/sdk/{a2a-frontend-L3TQ7QQ6.mjs.map → a2a-frontend-XCQ4CQUF.mjs.map} +0 -0
  380. /package/dist/sdk/{check-provider-registry-RQYIEQLJ.mjs.map → check-provider-registry-2D3MCWP3.mjs.map} +0 -0
  381. /package/dist/sdk/{chunk-5TXIAPRA.mjs.map → chunk-S3GSZRYC.mjs.map} +0 -0
  382. /package/dist/sdk/{chunk-4UMDSYC7.mjs.map → chunk-VS3JE2DL.mjs.map} +0 -0
  383. /package/dist/sdk/{chunk-A4WHMRK2.mjs.map → chunk-YETG675X.mjs.map} +0 -0
  384. /package/dist/sdk/{config-BCYAVJ5S.mjs.map → config-H5IOLBFA.mjs.map} +0 -0
  385. /package/dist/sdk/{failure-condition-evaluator-ZBOSD574.mjs.map → failure-condition-evaluator-66PWLV3D.mjs.map} +0 -0
  386. /package/dist/sdk/{github-frontend-4WHT5JEU.mjs.map → github-frontend-BBFKCY4M.mjs.map} +0 -0
  387. /package/dist/sdk/{host-FKR7H26C.mjs.map → host-UQRZDLT7.mjs.map} +0 -0
  388. /package/dist/sdk/{routing-IB2PXYFC.mjs.map → oauth2-token-cache-OS7WHLDI.mjs.map} +0 -0
  389. /package/dist/sdk/{schedule-tool-LB33KL2W.mjs.map → routing-Q647KUMO.mjs.map} +0 -0
  390. /package/dist/sdk/{schedule-tool-handler-KYWZHKSS.mjs.map → schedule-tool-WMGSM6IT.mjs.map} +0 -0
  391. /package/dist/sdk/{session-registry-6PV6SGEJ.mjs.map → schedule-tool-handler-JMDHCGZ2.mjs.map} +0 -0
  392. /package/dist/sdk/{trace-helpers-AMZ2524G.mjs.map → session-registry-CENXWIFR.mjs.map} +0 -0
  393. /package/dist/sdk/{trace-serializer-EBHTHZYT.mjs.map → trace-helpers-AIUGQLK5.mjs.map} +0 -0
  394. /package/dist/sdk/{utcp-check-provider-Q4PD5EP2.mjs.map → trace-serializer-4TOIAVQL.mjs.map} +0 -0
  395. /package/dist/sdk/{workflow-check-provider-N6KSDPWU.mjs.map → utcp-check-provider-WDTSQ7DZ.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/telegram/markdown.ts","../../src/telegram/client.ts","../../src/frontends/telegram-frontend.ts"],"sourcesContent":["// Lightweight Markdown → Telegram HTML formatter.\n// Converts common Markdown output from AI steps to Telegram-compatible HTML.\n//\n// Supported conversions:\n// - # Header / ## Header → <b>Header</b>\n// - **bold** / __bold__ → <b>bold</b>\n// - *italic* → <i>italic</i>\n// - ~~strike~~ → <s>strike</s>\n// - `code` → <code>code</code>\n// - ```block``` → <pre>block</pre>\n// - [label](url) → <a href=\"url\">label</a>\n// - > blockquote → <blockquote>text</blockquote>\n// - HTML entities escaped: & < >\n//\n// Code blocks are passed through with entity escaping only (no other transforms).\n\n/** Escape HTML entities in text */\nexport function escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/**\n * Convert Markdown text to Telegram-compatible HTML.\n * Processes line-by-line, respecting fenced code blocks.\n */\nexport function markdownToTelegramHtml(text: string): string {\n if (!text || typeof text !== 'string') return '';\n\n const lines = text.split(/\\r?\\n/);\n const result: string[] = [];\n let inCodeBlock = false;\n let codeBlockLang = '';\n let codeLines: string[] = [];\n let inBlockquote = false;\n let blockquoteLines: string[] = [];\n\n const flushBlockquote = () => {\n if (blockquoteLines.length > 0) {\n result.push(`<blockquote>${blockquoteLines.join('\\n')}</blockquote>`);\n blockquoteLines = [];\n inBlockquote = false;\n }\n };\n\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimStart();\n\n // Track fenced code blocks\n if (/^```/.test(trimmed)) {\n if (!inCodeBlock) {\n flushBlockquote();\n inCodeBlock = true;\n codeBlockLang = trimmed.slice(3).trim();\n codeLines = [];\n } else {\n // Close code block\n const escaped = codeLines.map(l => escapeHtml(l)).join('\\n');\n if (codeBlockLang && codeBlockLang !== 'mermaid') {\n result.push(\n `<pre><code class=\"language-${escapeHtml(codeBlockLang)}\">${escaped}</code></pre>`\n );\n } else {\n result.push(`<pre>${escaped}</pre>`);\n }\n inCodeBlock = false;\n codeBlockLang = '';\n codeLines = [];\n }\n continue;\n }\n if (inCodeBlock) {\n codeLines.push(lines[i]);\n continue;\n }\n\n // Blockquotes: > text\n const bqMatch = /^>\\s?(.*)$/.exec(trimmed);\n if (bqMatch) {\n inBlockquote = true;\n blockquoteLines.push(convertInline(bqMatch[1]));\n continue;\n } else if (inBlockquote) {\n flushBlockquote();\n }\n\n const line = lines[i];\n\n // Headers: # Header → <b>Header</b>\n const headerMatch = /^(#{1,6})\\s+(.+)$/.exec(line.trimStart());\n if (headerMatch) {\n result.push(`<b>${convertInline(headerMatch[2].trim())}</b>`);\n continue;\n }\n\n // Horizontal rules\n if (/^[-*_]{3,}\\s*$/.test(trimmed)) {\n result.push('———');\n continue;\n }\n\n // Bullet lists: \"- item\" or \"* item\" → \"• item\"\n const bulletMatch = /^(\\s*)([-*])\\s+(.+)$/.exec(line);\n if (bulletMatch) {\n const indent = bulletMatch[1];\n result.push(`${indent}• ${convertInline(bulletMatch[3])}`);\n continue;\n }\n\n // Numbered lists: preserve as-is but convert inline\n const numMatch = /^(\\s*)(\\d+\\.)\\s+(.+)$/.exec(line);\n if (numMatch) {\n result.push(`${numMatch[1]}${numMatch[2]} ${convertInline(numMatch[3])}`);\n continue;\n }\n\n // Regular line: apply inline conversions\n result.push(convertInline(line));\n }\n\n // Close any unclosed code block\n if (inCodeBlock && codeLines.length > 0) {\n const escaped = codeLines.map(l => escapeHtml(l)).join('\\n');\n result.push(`<pre>${escaped}</pre>`);\n }\n flushBlockquote();\n\n return result.join('\\n');\n}\n\n/**\n * Apply inline Markdown conversions to a single line.\n * Order matters: escape HTML first, then apply formatting.\n */\nfunction convertInline(line: string): string {\n // First, identify and protect inline code spans\n const codeSpans: string[] = [];\n let processed = line.replace(/`([^`]+)`/g, (_m, code: string) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `\\x00CODE${idx}\\x00`;\n });\n\n // Escape HTML in non-code portions\n processed = escapeHtml(processed);\n\n // Images: ![alt](url) → (just show as link)\n processed = processed.replace(\n /!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+&quot;[^&]*&quot;)?\\)/g,\n (_m, alt: string, url: string) => `<a href=\"${url}\">${alt || 'image'}</a>`\n );\n\n // Links: [label](url) → <a href=\"url\">label</a>\n processed = processed.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+&quot;[^&]*&quot;)?\\)/g,\n (_m, label: string, url: string) => `<a href=\"${url}\">${label}</a>`\n );\n\n // Bold: **text** or __text__ → <b>text</b>\n processed = processed.replace(/\\*\\*([^*]+)\\*\\*/g, '<b>$1</b>');\n processed = processed.replace(/__([^_]+)__/g, '<b>$1</b>');\n\n // Italic: *text* → <i>text</i> (but not inside bold)\n processed = processed.replace(/(?<!\\*)\\*([^*]+)\\*(?!\\*)/g, '<i>$1</i>');\n\n // Strikethrough: ~~text~~ → <s>text</s>\n processed = processed.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n\n // Restore code spans\n processed = processed.replace(\n /\\x00CODE(\\d+)\\x00/g,\n (_m, idx: string) => codeSpans[parseInt(idx)]\n );\n\n return processed;\n}\n\n/**\n * Chunk text into segments no larger than limit, splitting at newlines.\n * Respects code block boundaries where possible.\n */\nexport function chunkText(text: string, limit: number = 4096): string[] {\n if (text.length <= limit) return [text];\n\n const chunks: string[] = [];\n const lines = text.split('\\n');\n let current = '';\n\n for (const line of lines) {\n const candidate = current ? current + '\\n' + line : line;\n if (candidate.length > limit) {\n if (current) {\n chunks.push(current);\n current = line;\n } else {\n // Single line exceeds limit — force split\n let remaining = line;\n while (remaining.length > limit) {\n chunks.push(remaining.slice(0, limit));\n remaining = remaining.slice(limit);\n }\n current = remaining;\n }\n } else {\n current = candidate;\n }\n }\n if (current) chunks.push(current);\n\n return chunks;\n}\n\n/**\n * Main entry point: convert Markdown to Telegram HTML.\n */\nexport function formatTelegramText(text: string): string {\n return markdownToTelegramHtml(text);\n}\n","// Telegram Bot API wrapper built on grammy.\n// Exposes Visor-friendly methods matching the SlackClient pattern\n// while leveraging grammy for transport, rate limiting, and middleware.\n\nimport { Bot, type Api } from 'grammy';\nimport { chunkText } from './markdown';\n\nexport interface TelegramUser {\n id: number;\n is_bot: boolean;\n first_name: string;\n username?: string;\n}\n\nexport interface TelegramSendResult {\n ok: boolean;\n message_id?: number;\n error?: string;\n}\n\nexport class TelegramClient {\n private bot: Bot;\n private _botInfo: TelegramUser | null = null;\n\n constructor(botToken: string) {\n if (!botToken || typeof botToken !== 'string') {\n throw new Error('TelegramClient: botToken is required');\n }\n this.bot = new Bot(botToken);\n }\n\n /** Get the underlying grammy Bot instance (for polling runner) */\n getBot(): Bot {\n return this.bot;\n }\n\n /** Get the underlying grammy API instance */\n get api(): Api {\n return this.bot.api;\n }\n\n /** Initialize bot info (call before using) */\n async init(): Promise<TelegramUser> {\n const me = await this.bot.api.getMe();\n this._botInfo = {\n id: me.id,\n is_bot: me.is_bot,\n first_name: me.first_name,\n username: me.username,\n };\n return this._botInfo;\n }\n\n /** Get cached bot info */\n getBotInfo(): TelegramUser | null {\n return this._botInfo;\n }\n\n /**\n * Send a text message with optional HTML parse mode.\n * Auto-chunks messages exceeding 4096 characters.\n * Falls back to plain text if HTML parsing fails.\n */\n async sendMessage(opts: {\n chat_id: number | string;\n text: string;\n parse_mode?: 'HTML';\n reply_to_message_id?: number;\n message_thread_id?: number;\n }): Promise<TelegramSendResult> {\n try {\n const { chat_id, text, parse_mode, reply_to_message_id, message_thread_id } = opts;\n const chunks = chunkText(text, 4096);\n let firstMessageId: number | undefined;\n\n for (let i = 0; i < chunks.length; i++) {\n const params: Record<string, unknown> = {\n // disable_web_page_preview is deprecated, use link_preview_options\n link_preview_options: { is_disabled: true },\n };\n if (parse_mode) params.parse_mode = parse_mode;\n if (i === 0 && reply_to_message_id)\n params.reply_parameters = { message_id: reply_to_message_id };\n if (message_thread_id) params.message_thread_id = message_thread_id;\n\n try {\n const msg = await this.bot.api.sendMessage(chat_id, chunks[i], params as any);\n if (i === 0) firstMessageId = msg.message_id;\n } catch (err: any) {\n // If HTML parse fails, retry without parse_mode\n if (parse_mode === 'HTML' && err?.description?.includes(\"can't parse entities\")) {\n const plainParams = { ...params };\n delete plainParams.parse_mode;\n const msg = await this.bot.api.sendMessage(chat_id, chunks[i], plainParams as any);\n if (i === 0) firstMessageId = msg.message_id;\n } else {\n throw err;\n }\n }\n }\n\n return { ok: true, message_id: firstMessageId };\n } catch (err: any) {\n const errMsg = err?.description || err?.message || String(err);\n console.warn(`Telegram sendMessage failed (non-fatal): ${errMsg}`);\n return { ok: false, error: errMsg };\n }\n }\n\n /**\n * Edit an existing text message.\n * Returns ok=false if Telegram rejects the edit (e.g. message too old or unchanged).\n */\n async editMessageText(opts: {\n chat_id: number | string;\n message_id: number;\n text: string;\n parse_mode?: 'HTML';\n }): Promise<TelegramSendResult> {\n try {\n const params: Record<string, unknown> = {\n link_preview_options: { is_disabled: true },\n };\n if (opts.parse_mode) params.parse_mode = opts.parse_mode;\n const msg = await this.bot.api.editMessageText(\n opts.chat_id,\n opts.message_id,\n opts.text,\n params as any\n );\n const messageId = (msg as any)?.message_id || opts.message_id;\n return { ok: true, message_id: messageId };\n } catch (err: any) {\n const errMsg = err?.description || err?.message || String(err);\n console.warn(`Telegram editMessageText failed (non-fatal): ${errMsg}`);\n return { ok: false, error: errMsg };\n }\n }\n\n /**\n * Delete a message.\n */\n async deleteMessage(opts: { chat_id: number | string; message_id: number }): Promise<boolean> {\n try {\n await this.bot.api.deleteMessage(opts.chat_id, opts.message_id);\n return true;\n } catch (err: any) {\n console.warn(\n `Telegram deleteMessage failed (non-fatal): ${err?.description || err?.message || String(err)}`\n );\n return false;\n }\n }\n\n /**\n * Send a document/file.\n */\n async sendDocument(opts: {\n chat_id: number | string;\n document: Buffer;\n filename: string;\n caption?: string;\n parse_mode?: 'HTML';\n reply_to_message_id?: number;\n message_thread_id?: number;\n }): Promise<TelegramSendResult> {\n try {\n const {\n chat_id,\n document,\n filename,\n caption,\n parse_mode,\n reply_to_message_id,\n message_thread_id,\n } = opts;\n const params: Record<string, unknown> = {};\n if (caption) params.caption = caption.slice(0, 1024); // Telegram caption limit\n if (parse_mode) params.parse_mode = parse_mode;\n if (reply_to_message_id) params.reply_parameters = { message_id: reply_to_message_id };\n if (message_thread_id) params.message_thread_id = message_thread_id;\n\n const file = new (await import('grammy')).InputFile(document, filename);\n const msg = await this.bot.api.sendDocument(chat_id, file, params as any);\n return { ok: true, message_id: msg.message_id };\n } catch (err: any) {\n const errMsg = err?.description || err?.message || String(err);\n console.warn(`Telegram sendDocument failed (non-fatal): ${errMsg}`);\n return { ok: false, error: errMsg };\n }\n }\n\n /**\n * Add an emoji reaction to a message.\n * Note: Bot must be admin in groups to set reactions.\n */\n async setMessageReaction(opts: {\n chat_id: number | string;\n message_id: number;\n emoji: string;\n }): Promise<boolean> {\n try {\n await this.bot.api.setMessageReaction(opts.chat_id, opts.message_id, [\n { type: 'emoji', emoji: opts.emoji as any },\n ]);\n return true;\n } catch (err: any) {\n // Non-fatal: reactions may fail if bot lacks permissions\n console.warn(\n `Telegram setMessageReaction failed (non-fatal): ${err?.description || err?.message || String(err)}`\n );\n return false;\n }\n }\n}\n","/**\n * Telegram Frontend for Visor workflows.\n *\n * Mirrors the SlackFrontend pattern:\n * - Posts AI replies to Telegram chats\n * - Converts Markdown to Telegram HTML format\n * - Manages emoji reactions for acknowledgement (👀 → 👍)\n */\nimport type { Frontend, FrontendContext } from './host';\nimport { TelegramClient } from '../telegram/client';\nimport { formatTelegramText } from '../telegram/markdown';\nimport { isFrontendLiveUpdatesEnabled } from '../agent-protocol/task-live-updates';\nimport {\n formatUserFacingExecutionMessage,\n summarizeUserFacingIssues,\n} from '../utils/user-facing-error';\n\ntype TelegramFrontendConfig = {\n defaultChatId?: string | number;\n botToken?: string;\n};\n\nexport class TelegramFrontend implements Frontend {\n public readonly name = 'telegram';\n private subs: Array<{ unsubscribe(): void }> = [];\n private cfg: TelegramFrontendConfig;\n private acked: boolean = false;\n private ackRef: { chatId: number | string; messageId: number } | null = null;\n private errorNotified: boolean = false;\n\n constructor(config?: TelegramFrontendConfig) {\n this.cfg = config || {};\n }\n\n start(ctx: FrontendContext): void {\n const bus = ctx.eventBus;\n\n try {\n ctx.logger.info(`[telegram-frontend] started`);\n } catch {}\n\n // Log inbound event if triggered from Telegram\n try {\n const payload = this.getInboundTelegramPayload(ctx);\n if (payload) {\n const ev: any = payload.event || {};\n const chatId = String(ev.chat_id || '-');\n const msgId = String(ev.message_id || '-');\n ctx.logger.info(`[telegram-frontend] inbound event: chat_id=${chatId} message_id=${msgId}`);\n }\n } catch {}\n\n // CheckCompleted: post AI replies\n this.subs.push(\n bus.on('CheckCompleted', async (env: any) => {\n const ev = (env && env.payload) || env;\n await this.maybePostDirectReply(ctx, ev.checkId, ev.result).catch(() => {});\n })\n );\n\n // CheckErrored: post error notice\n this.subs.push(\n bus.on('CheckErrored', async (env: any) => {\n const ev = (env && env.payload) || env;\n const message = ev?.error?.message || 'Execution error';\n await this.maybePostError(ctx, 'Check failed', message, ev?.checkId).catch(() => {});\n })\n );\n\n // StateTransition: finalize reactions on terminal state\n this.subs.push(\n bus.on('StateTransition', async (env: any) => {\n const ev = (env && env.payload) || env;\n if (ev && (ev.to === 'Completed' || ev.to === 'Error')) {\n await this.finalizeReactions(ctx).catch(() => {});\n }\n })\n );\n\n // Shutdown: post error\n this.subs.push(\n bus.on('Shutdown', async (env: any) => {\n const ev = (env && env.payload) || env;\n const message = ev?.error?.message || 'Fatal error';\n await this.maybePostError(ctx, 'Run failed', message).catch(() => {});\n })\n );\n\n // CheckScheduled: add acknowledgement reaction\n this.subs.push(\n bus.on('CheckScheduled', async () => {\n await this.ensureAcknowledgement(ctx).catch(() => {});\n })\n );\n }\n\n stop(): void {\n for (const s of this.subs) s.unsubscribe();\n this.subs = [];\n }\n\n private getTelegram(ctx: FrontendContext): TelegramClient | undefined {\n // Prefer injected client (for tests or shared runner context)\n const injected = (ctx as any).telegram || (ctx as any).telegramClient;\n if (injected) return injected;\n // Lazy-create from env or frontend config\n try {\n const token = this.cfg.botToken || process.env.TELEGRAM_BOT_TOKEN;\n if (typeof token === 'string' && token.trim()) {\n return new TelegramClient(token.trim());\n }\n } catch {}\n return undefined;\n }\n\n private getInboundTelegramPayload(ctx: FrontendContext): any | null {\n try {\n const endpoint = '/bots/telegram/message';\n return (ctx as any).webhookContext?.webhookData?.get(endpoint) || null;\n } catch {\n return null;\n }\n }\n\n private getInboundTelegramEvent(\n ctx: FrontendContext\n ): { chatId: number | string; messageId: number } | null {\n try {\n const payload = this.getInboundTelegramPayload(ctx);\n const ev: any = payload?.event;\n const chatId = ev?.chat_id;\n const messageId = ev?.message_id;\n if (chatId !== undefined && messageId !== undefined) {\n return { chatId, messageId };\n }\n } catch {}\n return null;\n }\n\n private async ensureAcknowledgement(ctx: FrontendContext): Promise<void> {\n if (this.acked) return;\n const ref = this.getInboundTelegramEvent(ctx);\n if (!ref) return;\n const telegram = this.getTelegram(ctx);\n if (!telegram) return;\n\n // Skip ack for own bot messages\n try {\n const payload = this.getInboundTelegramPayload(ctx);\n const ev: any = payload?.event;\n const botInfo = telegram.getBotInfo();\n if (botInfo && ev?.from?.id === botInfo.id) return;\n } catch {}\n\n await telegram.setMessageReaction({\n chat_id: ref.chatId,\n message_id: ref.messageId,\n emoji: '👀',\n });\n try {\n ctx.logger.info(\n `[telegram-frontend] added ack reaction chat_id=${ref.chatId} message_id=${ref.messageId}`\n );\n } catch {}\n this.acked = true;\n this.ackRef = ref;\n }\n\n private async finalizeReactions(ctx: FrontendContext): Promise<void> {\n if (!this.acked || !this.ackRef) return;\n const telegram = this.getTelegram(ctx);\n if (!telegram) return;\n try {\n await telegram.setMessageReaction({\n chat_id: this.ackRef.chatId,\n message_id: this.ackRef.messageId,\n emoji: '👍',\n });\n try {\n ctx.logger.info(\n `[telegram-frontend] finalized reaction chat_id=${this.ackRef.chatId} message_id=${this.ackRef.messageId}`\n );\n } catch {}\n } finally {\n this.acked = false;\n this.ackRef = null;\n }\n }\n\n private async maybePostError(\n ctx: FrontendContext,\n title: string,\n message: string,\n checkId?: string\n ): Promise<void> {\n if (this.errorNotified) return;\n const telegram = this.getTelegram(ctx);\n if (!telegram) return;\n const payload = this.getInboundTelegramPayload(ctx);\n const ev: any = payload?.event;\n const chatId = ev?.chat_id;\n const messageId = ev?.message_id;\n if (chatId === undefined) return;\n\n let text = `❌ ${title}`;\n if (checkId) text += `\\nCheck: ${checkId}`;\n if (message) text += `\\n${formatUserFacingExecutionMessage(message)}`;\n\n await telegram.sendMessage({\n chat_id: chatId,\n text,\n reply_to_message_id: messageId,\n });\n this.errorNotified = true;\n }\n\n private async maybePostDirectReply(\n ctx: FrontendContext,\n checkId: string,\n result: { output?: any; content?: string }\n ): Promise<void> {\n try {\n const cfg: any = ctx.config || {};\n const checkCfg: any = cfg.checks?.[checkId];\n if (!checkCfg) return;\n\n const providerType = (checkCfg.type as string) || '';\n const isAi = providerType === 'ai';\n const isLogChat = providerType === 'log' && checkCfg.group === 'chat';\n const isWorkflow = providerType === 'workflow';\n if (!isAi && !isLogChat && !isWorkflow) return;\n if (checkCfg.criticality === 'internal') return;\n if (isFrontendLiveUpdatesEnabled((cfg as any).task_live_updates, 'telegram')) return;\n\n // For AI checks, only post simple schemas\n if (isAi) {\n const schema = checkCfg.schema;\n if (typeof schema === 'string') {\n const simpleSchemas = ['code-review', 'markdown', 'text', 'plain'];\n if (!simpleSchemas.includes(schema)) return;\n }\n }\n\n const telegram = this.getTelegram(ctx);\n if (!telegram) return;\n\n const payload = this.getInboundTelegramPayload(ctx);\n const ev: any = payload?.event;\n const chatId = ev?.chat_id;\n const messageId = ev?.message_id;\n if (chatId === undefined) {\n ctx.logger.warn(`[telegram-frontend] skip posting reply for ${checkId}: missing chat_id`);\n return;\n }\n\n // Extract text (same logic as SlackFrontend)\n const out: any = (result as any)?.output;\n let text: string | undefined;\n if (out && typeof out.text === 'string' && out.text.trim().length > 0) {\n text = out.text.trim();\n } else if (isAi && typeof checkCfg.schema === 'string') {\n if (\n typeof (result as any)?.content === 'string' &&\n (result as any).content.trim().length > 0\n ) {\n text = (result as any).content.trim();\n }\n } else if (isLogChat && typeof (result as any)?.logOutput === 'string') {\n const raw = (result as any).logOutput;\n if (raw.trim().length > 0) text = raw.trim();\n }\n\n // Append raw output\n if (out && typeof out._rawOutput === 'string' && out._rawOutput.trim().length > 0) {\n text = (text || '') + '\\n\\n' + out._rawOutput.trim();\n }\n\n if (!text) {\n const issueSummary = summarizeUserFacingIssues((result as any)?.issues || []);\n if (issueSummary) {\n text = issueSummary;\n this.errorNotified = true;\n }\n }\n\n if (!text) {\n ctx.logger.info(\n `[telegram-frontend] skip posting reply for ${checkId}: no renderable text`\n );\n return;\n }\n\n // Normalize literal \\n escape sequences\n text = text.replace(/\\\\n/g, '\\n');\n\n const formattedText = formatTelegramText(text);\n const postResult = await telegram.sendMessage({\n chat_id: chatId,\n text: formattedText,\n parse_mode: 'HTML',\n reply_to_message_id: messageId,\n message_thread_id: ev?.message_thread_id,\n });\n\n if (!postResult.ok) {\n ctx.logger.warn(\n `[telegram-frontend] failed to post reply for ${checkId}: ${postResult.error}`\n );\n return;\n }\n ctx.logger.info(\n `[telegram-frontend] posted reply for ${checkId} to chat_id=${chatId} message_id=${postResult.message_id}`\n );\n } catch (err) {\n try {\n ctx.logger.warn(\n `[telegram-frontend] maybePostDirectReply failed for ${checkId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n } catch {}\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -10,8 +10,8 @@ import {
10
10
  setSpanError,
11
11
  withActiveSpan,
12
12
  withVisorRun
13
- } from "./chunk-A4WHMRK2.mjs";
14
- import "./chunk-NEZY2MXM.mjs";
13
+ } from "./chunk-YETG675X.mjs";
14
+ import "./chunk-B2LQT6QU.mjs";
15
15
  import "./chunk-FWWLD555.mjs";
16
16
  import "./chunk-B2OUZAWY.mjs";
17
17
  import "./chunk-J7LXIPZS.mjs";
@@ -28,4 +28,4 @@ export {
28
28
  withActiveSpan,
29
29
  withVisorRun
30
30
  };
31
- //# sourceMappingURL=trace-helpers-AMZ2524G.mjs.map
31
+ //# sourceMappingURL=trace-helpers-AIUGQLK5.mjs.map
@@ -1,4 +1,7 @@
1
1
  import {
2
+ buildTraceHeaderLines,
3
+ buildTraceReport,
4
+ extractProbeTaskSummary,
2
5
  fetchTraceSpans,
3
6
  findTraceFile,
4
7
  init_trace_serializer,
@@ -6,19 +9,24 @@ import {
6
9
  renderSpanTree,
7
10
  renderSpanYaml,
8
11
  renderTraceTree,
12
+ resolveTraceSpans,
9
13
  serializeTraceForPrompt
10
- } from "./chunk-IY5PQ5EN.mjs";
14
+ } from "./chunk-BVEATT5V.mjs";
11
15
  import "./chunk-6E625R3C.mjs";
12
16
  import "./chunk-B2OUZAWY.mjs";
13
17
  import "./chunk-J7LXIPZS.mjs";
14
18
  init_trace_serializer();
15
19
  export {
20
+ buildTraceHeaderLines,
21
+ buildTraceReport,
22
+ extractProbeTaskSummary,
16
23
  fetchTraceSpans,
17
24
  findTraceFile,
18
25
  readTraceIdFromFile,
19
26
  renderSpanTree,
20
27
  renderSpanYaml,
21
28
  renderTraceTree,
29
+ resolveTraceSpans,
22
30
  serializeTraceForPrompt
23
31
  };
24
- //# sourceMappingURL=trace-serializer-EBHTHZYT.mjs.map
32
+ //# sourceMappingURL=trace-serializer-4TOIAVQL.mjs.map
@@ -2,17 +2,21 @@ import {
2
2
  TaskLiveUpdateManager,
3
3
  init_task_live_updates,
4
4
  resolveTaskLiveUpdatesConfig
5
- } from "./chunk-SRU5TFNY.mjs";
6
- import "./chunk-IY5PQ5EN.mjs";
5
+ } from "./chunk-YU3VR5SZ.mjs";
6
+ import "./chunk-BVEATT5V.mjs";
7
7
  import {
8
8
  init_task_trace_resolution,
9
9
  resolveTaskTraceReference
10
- } from "./chunk-WZQMTD7W.mjs";
10
+ } from "./chunk-2LLKENYD.mjs";
11
+ import {
12
+ init_user_facing_error,
13
+ summarizeUserFacingIssues
14
+ } from "./chunk-TL3ZTYFY.mjs";
11
15
  import {
12
16
  getInstanceId,
13
17
  init_instance_id,
14
18
  require_package
15
- } from "./chunk-NEZY2MXM.mjs";
19
+ } from "./chunk-B2LQT6QU.mjs";
16
20
  import {
17
21
  init_logger,
18
22
  logger
@@ -29,6 +33,77 @@ import {
29
33
  import crypto from "crypto";
30
34
  import fs from "fs";
31
35
  import path from "path";
36
+ function unwrapJsonText(text) {
37
+ if (text.startsWith("{") && text.includes('"text"')) {
38
+ try {
39
+ const parsed = JSON.parse(text);
40
+ if (typeof parsed?.text === "string" && parsed.text.trim().length > 0) {
41
+ return parsed.text.trim();
42
+ }
43
+ } catch {
44
+ try {
45
+ const sanitized = text.replace(
46
+ /[\x00-\x1F\x7F]/g,
47
+ (ch) => "\\u" + ch.charCodeAt(0).toString(16).padStart(4, "0")
48
+ );
49
+ const parsed = JSON.parse(sanitized);
50
+ if (typeof parsed?.text === "string" && parsed.text.trim().length > 0) {
51
+ return parsed.text.trim();
52
+ }
53
+ } catch {
54
+ }
55
+ }
56
+ }
57
+ return text;
58
+ }
59
+ function isToolOutput(text) {
60
+ if (/^[├│└─┬┘┤┼]{1,3}/.test(text)) return true;
61
+ if (text.startsWith("[task:")) return true;
62
+ return false;
63
+ }
64
+ function extractTextFromEntries(entries) {
65
+ for (let i = entries.length - 1; i >= 0; i--) {
66
+ const outputs = entries[i];
67
+ if (!Array.isArray(outputs)) continue;
68
+ for (let j = outputs.length - 1; j >= 0; j--) {
69
+ const text = outputs[j]?.text;
70
+ if (typeof text === "string" && text.trim().length > 0) {
71
+ return unwrapJsonText(text.trim());
72
+ }
73
+ }
74
+ }
75
+ return void 0;
76
+ }
77
+ function extractBestResponseText(history, allKeys) {
78
+ const topLevelEntries = Object.entries(history).filter(([key]) => !key.includes(".")).map(([, v]) => v);
79
+ const topLevelText = extractTextFromEntries(topLevelEntries);
80
+ if (topLevelText && !isToolOutput(topLevelText)) {
81
+ logger.info(
82
+ `[TaskTracking] Extracted responseText (${topLevelText.length} chars): "${topLevelText.substring(0, 100)}..."`
83
+ );
84
+ return topLevelText;
85
+ }
86
+ const genResponseKeys = allKeys.filter(
87
+ (k) => k.endsWith(".generate-response") || k === "generate-response"
88
+ );
89
+ if (genResponseKeys.length > 0) {
90
+ const genEntries = genResponseKeys.map((k) => history[k]);
91
+ const genText = extractTextFromEntries(genEntries);
92
+ if (genText && !isToolOutput(genText)) {
93
+ logger.info(
94
+ `[TaskTracking] Fallback to generate-response entry (${genText.length} chars): "${genText.substring(0, 100)}..."`
95
+ );
96
+ return genText;
97
+ }
98
+ }
99
+ if (topLevelText) {
100
+ logger.warn(
101
+ `[TaskTracking] Using tool output as responseText (${topLevelText.length} chars) \u2014 no better candidate found`
102
+ );
103
+ return topLevelText;
104
+ }
105
+ return "Execution completed";
106
+ }
32
107
  function getPackageVersion() {
33
108
  try {
34
109
  return require_package()?.version || "dev";
@@ -39,7 +114,7 @@ function getPackageVersion() {
39
114
  async function readTraceIdFromFallbackFile(traceFile) {
40
115
  if (!traceFile || !fs.existsSync(traceFile)) return void 0;
41
116
  try {
42
- const { readTraceIdFromFile } = await import("./trace-serializer-EBHTHZYT.mjs");
117
+ const { readTraceIdFromFile } = await import("./trace-serializer-4TOIAVQL.mjs");
43
118
  return await readTraceIdFromFile(traceFile) || void 0;
44
119
  } catch {
45
120
  return void 0;
@@ -107,7 +182,7 @@ async function trackExecution(opts, executor) {
107
182
  };
108
183
  }
109
184
  return {
110
- traceRef: current?.metadata?.trace_id || current?.metadata?.trace_file || initialResolvedTrace.primaryRef,
185
+ traceRef: current?.metadata?.trace_file || current?.metadata?.trace_id || initialResolvedTrace.primaryRef,
111
186
  traceId: current?.metadata?.trace_id
112
187
  };
113
188
  },
@@ -160,18 +235,13 @@ async function trackExecution(opts, executor) {
160
235
  try {
161
236
  const history = result?.reviewSummary?.history;
162
237
  if (history) {
163
- const entries = Object.values(history);
164
- for (let i = entries.length - 1; i >= 0; i--) {
165
- const outputs = entries[i];
166
- if (!Array.isArray(outputs)) continue;
167
- for (let j = outputs.length - 1; j >= 0; j--) {
168
- const text = outputs[j]?.text;
169
- if (typeof text === "string" && text.trim().length > 0) {
170
- responseText = text.trim();
171
- break;
172
- }
173
- }
174
- if (responseText !== "Execution completed") break;
238
+ const allKeys = Object.keys(history);
239
+ responseText = extractBestResponseText(history, allKeys);
240
+ }
241
+ if (responseText === "Execution completed") {
242
+ const issueSummary = summarizeUserFacingIssues(result?.reviewSummary?.issues);
243
+ if (issueSummary) {
244
+ responseText = issueSummary;
175
245
  }
176
246
  }
177
247
  } catch {
@@ -222,7 +292,7 @@ function scheduleEvaluation(taskId, taskStore) {
222
292
  setTimeout(async () => {
223
293
  await logger.withTaskContext(taskId, async () => {
224
294
  try {
225
- const { evaluateAndStore } = await import("./task-evaluator-H3BXC7SE.mjs");
295
+ const { evaluateAndStore } = await import("./task-evaluator-4QG4CYQA.mjs");
226
296
  await evaluateAndStore(taskId, taskStore);
227
297
  logger.info(`[TaskEvaluator] Auto-evaluation completed for task ${taskId}`);
228
298
  } catch (err) {
@@ -240,10 +310,11 @@ var init_track_execution = __esm({
240
310
  init_instance_id();
241
311
  init_task_live_updates();
242
312
  init_task_trace_resolution();
313
+ init_user_facing_error();
243
314
  }
244
315
  });
245
316
  init_track_execution();
246
317
  export {
247
318
  trackExecution
248
319
  };
249
- //# sourceMappingURL=track-execution-VW6P3OYO.mjs.map
320
+ //# sourceMappingURL=track-execution-CFRZXMEC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/agent-protocol/track-execution.ts"],"sourcesContent":["/**\n * Shared execution tracking helper.\n *\n * Wraps any engine execution call with task lifecycle management:\n * creates a task in 'submitted' state, transitions to 'working',\n * runs the executor, then sets terminal state (completed/failed).\n *\n * Used by CLI, Slack, TUI, and Scheduler frontends when task_tracking is enabled.\n */\n\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { logger } from '../logger';\nimport { trace } from '../telemetry/lazy-otel';\nimport { getInstanceId } from '../utils/instance-id';\nimport type { TaskLiveUpdatesConfig } from '../types/config';\nimport type { TaskStore } from './task-store';\nimport type { AgentMessage, AgentTask } from './types';\nimport {\n resolveTaskLiveUpdatesConfig,\n TaskLiveUpdateManager,\n type TaskLiveUpdateSink,\n} from './task-live-updates';\nimport { resolveTaskTraceReference } from './task-trace-resolution';\nimport { summarizeUserFacingIssues } from '../utils/user-facing-error';\n\n/**\n * If `text` looks like a JSON object with a `.text` field, extract it.\n * Handles the edge case where the AI double-wraps its response as\n * `{\"text\":\"actual content\"}` instead of returning the string directly.\n */\nfunction unwrapJsonText(text: string): string {\n if (text.startsWith('{') && text.includes('\"text\"')) {\n try {\n const parsed = JSON.parse(text);\n if (typeof parsed?.text === 'string' && parsed.text.trim().length > 0) {\n return parsed.text.trim();\n }\n } catch {\n // JSON.parse fails when the string contains unescaped control characters\n // (newlines, tabs) inside JSON string values — common with markdown content.\n // Escape them and retry.\n try {\n const sanitized = text.replace(\n /[\\x00-\\x1F\\x7F]/g,\n ch => '\\\\u' + ch.charCodeAt(0).toString(16).padStart(4, '0')\n );\n const parsed = JSON.parse(sanitized);\n if (typeof parsed?.text === 'string' && parsed.text.trim().length > 0) {\n return parsed.text.trim();\n }\n } catch {\n // genuine malformed JSON — give up\n }\n }\n }\n return text;\n}\n\n/**\n * Detect text that is ProbeAgent tool/task management output rather than\n * the AI's actual response. This output leaks into .text when answer()\n * concatenates tool output with the response.\n */\nfunction isToolOutput(text: string): boolean {\n // ProbeAgent task tool tree output (├─┬, │, └─)\n if (/^[├│└─┬┘┤┼]{1,3}/.test(text)) return true;\n // Task tool markers\n if (text.startsWith('[task:')) return true;\n return false;\n}\n\n/**\n * Extract the last .text from a set of history entries (array of output arrays).\n * Returns undefined if no text found.\n */\nfunction extractTextFromEntries(entries: unknown[][]): string | undefined {\n for (let i = entries.length - 1; i >= 0; i--) {\n const outputs = entries[i];\n if (!Array.isArray(outputs)) continue;\n for (let j = outputs.length - 1; j >= 0; j--) {\n const text = (outputs[j] as any)?.text;\n if (typeof text === 'string' && text.trim().length > 0) {\n return unwrapJsonText(text.trim());\n }\n }\n }\n return undefined;\n}\n\n/**\n * Multi-pass extraction: prefer top-level entries, but fall back to\n * generate-response entries if the top-level text is tool output.\n */\nfunction extractBestResponseText(history: Record<string, unknown[]>, allKeys: string[]): string {\n // Pass 1: top-level entries (no dots) — the workflow's computed output\n const topLevelEntries = Object.entries(history)\n .filter(([key]) => !key.includes('.'))\n .map(([, v]) => v);\n const topLevelText = extractTextFromEntries(topLevelEntries);\n\n if (topLevelText && !isToolOutput(topLevelText)) {\n logger.info(\n `[TaskTracking] Extracted responseText (${topLevelText.length} chars): \"${topLevelText.substring(0, 100)}...\"`\n );\n return topLevelText;\n }\n\n // Pass 2: look for generate-response entries specifically — the AI step\n // that produces the final user-facing response in assistant workflows.\n const genResponseKeys = allKeys.filter(\n k => k.endsWith('.generate-response') || k === 'generate-response'\n );\n if (genResponseKeys.length > 0) {\n const genEntries = genResponseKeys.map(k => history[k]);\n const genText = extractTextFromEntries(genEntries);\n if (genText && !isToolOutput(genText)) {\n logger.info(\n `[TaskTracking] Fallback to generate-response entry (${genText.length} chars): \"${genText.substring(0, 100)}...\"`\n );\n return genText;\n }\n }\n\n // Pass 3: if top-level text exists but was tool output, use it anyway\n // as a last resort — better than \"Execution completed\"\n if (topLevelText) {\n logger.warn(\n `[TaskTracking] Using tool output as responseText (${topLevelText.length} chars) — no better candidate found`\n );\n return topLevelText;\n }\n\n return 'Execution completed';\n}\n\nfunction getPackageVersion(): string {\n try {\n return require('../../package.json')?.version || 'dev';\n } catch {\n return 'dev';\n }\n}\n\nasync function readTraceIdFromFallbackFile(traceFile?: string): Promise<string | undefined> {\n if (!traceFile || !fs.existsSync(traceFile)) return undefined;\n\n try {\n const { readTraceIdFromFile } = await import('./trace-serializer');\n return (await readTraceIdFromFile(traceFile)) || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport type TaskSource =\n | 'cli'\n | 'slack'\n | 'telegram'\n | 'email'\n | 'whatsapp'\n | 'teams'\n | 'a2a'\n | 'mcp'\n | 'tui'\n | 'scheduler'\n | 'webhook'\n | 'test';\n\nexport interface TrackExecutionOptions {\n taskStore: TaskStore;\n source: TaskSource;\n workflowId?: string;\n /** Config file path — used to prefix workflowId as \"config.yaml#workflow\" */\n configPath?: string;\n metadata?: Record<string, unknown>;\n /** Human-readable description of what's being executed */\n messageText: string;\n /** Run LLM evaluation after task completion (non-blocking). */\n autoEvaluate?: boolean;\n /** Optional live progress updates for supported interactive frontends. */\n liveUpdates?: {\n config?: boolean | TaskLiveUpdatesConfig;\n sink?: TaskLiveUpdateSink;\n includeTraceId?: boolean;\n };\n}\n\n/**\n * Wrap an engine execution call with task lifecycle tracking.\n *\n * Creates a task, transitions to 'working', runs the executor,\n * then sets terminal state. Returns both the task and the original result.\n * Re-throws any executor error after marking the task as failed.\n */\nexport async function trackExecution<T>(\n opts: TrackExecutionOptions,\n executor: () => Promise<T>\n): Promise<{ task: AgentTask; result: T }> {\n const { taskStore, source, configPath, metadata, messageText } = opts;\n const configName = configPath ? path.basename(configPath, path.extname(configPath)) : undefined;\n const workflowId =\n configName && opts.workflowId ? `${configName}#${opts.workflowId}` : opts.workflowId;\n\n const requestMessage: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'user',\n parts: [{ text: messageText }],\n };\n\n // Capture trace file path if telemetry is writing to a file\n const traceFile = process.env.VISOR_FALLBACK_TRACE_FILE || undefined;\n\n const task = taskStore.createTask({\n contextId: crypto.randomUUID(),\n requestMessage,\n workflowId,\n requestMetadata: {\n source,\n instance_id: getInstanceId(),\n visor_version: process.env.VISOR_VERSION || getPackageVersion(),\n ...(process.env.VISOR_COMMIT_SHORT ? { visor_commit: process.env.VISOR_COMMIT_SHORT } : {}),\n trace_id: trace.getActiveSpan()?.spanContext().traceId || undefined,\n ...(traceFile ? { trace_file: traceFile } : {}),\n ...metadata,\n },\n });\n\n const instanceId = getInstanceId();\n return await logger.withTaskContext(task.id, async () => {\n taskStore.updateTaskState(task.id, 'working');\n taskStore.claimTask(task.id, instanceId);\n logger.info(\n `[TaskTracking] Task ${task.id} started (source=${source}, workflow=${workflowId || '-'}, instance=${instanceId})`\n );\n\n const liveUpdateConfig = resolveTaskLiveUpdatesConfig(opts.liveUpdates?.config);\n const initialTraceId =\n trace.getActiveSpan()?.spanContext().traceId ||\n (task.metadata?.trace_id as string | undefined);\n if (initialTraceId && !task.metadata?.trace_id) {\n try {\n taskStore.updateMetadata(task.id, { trace_id: initialTraceId });\n } catch {\n // best-effort only\n }\n }\n const initialResolvedTrace = await resolveTaskTraceReference({\n trace_id: initialTraceId || (task.metadata?.trace_id as string | undefined),\n trace_file: task.metadata?.trace_file as string | undefined,\n });\n const liveUpdateManager =\n liveUpdateConfig && opts.liveUpdates?.sink\n ? new TaskLiveUpdateManager({\n taskId: task.id,\n requestText: messageText,\n traceRef: initialResolvedTrace.primaryRef,\n traceId: initialResolvedTrace.traceId,\n includeTraceId: opts.liveUpdates?.includeTraceId === true,\n sink: opts.liveUpdates.sink,\n config: liveUpdateConfig,\n resolveTraceState: () => {\n let current;\n try {\n current = taskStore.getTask(task.id);\n } catch {\n return {\n traceRef: initialResolvedTrace.primaryRef,\n traceId: initialResolvedTrace.traceId,\n };\n }\n return {\n traceRef:\n (current?.metadata?.trace_file as string | undefined) ||\n (current?.metadata?.trace_id as string | undefined) ||\n initialResolvedTrace.primaryRef,\n traceId: current?.metadata?.trace_id as string | undefined,\n };\n },\n onPostedRef: ref => {\n try {\n taskStore.updateMetadata(task.id, ref);\n } catch {\n // best-effort only\n }\n },\n appendHistory: (text, stage) => {\n try {\n taskStore.appendHistory(task.id, {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text }],\n metadata: { kind: 'task_live_update', stage, source },\n });\n } catch {\n // best-effort only\n }\n },\n })\n : null;\n if (liveUpdateConfig && !opts.liveUpdates?.sink) {\n logger.debug(\n `[TaskTracking] Live updates requested for task ${task.id} but no sink is available for source=${source}`\n );\n } else if (liveUpdateManager) {\n logger.info(`[TaskTracking] Live updates enabled for task ${task.id} (source=${source})`);\n }\n\n // Heartbeat: periodically touch updated_at so stale-task detection\n // can distinguish live tasks from orphans (works across nodes).\n const HEARTBEAT_INTERVAL = 60_000; // 1 minute\n const heartbeatTimer = setInterval(() => {\n try {\n taskStore.heartbeat(task.id);\n } catch {\n // best-effort — don't crash the task over a heartbeat failure\n }\n }, HEARTBEAT_INTERVAL);\n\n try {\n if (liveUpdateManager) {\n await liveUpdateManager.start();\n }\n const result = await executor();\n\n // Now that execution is done, capture the trace ID from the active span.\n // At task creation time the span may not have been active yet, so we\n // update metadata post-execution to ensure trace_id is stored.\n try {\n const activeTraceId = trace.getActiveSpan()?.spanContext().traceId;\n const persistedTraceId =\n (activeTraceId && activeTraceId !== '' ? activeTraceId : undefined) ||\n (await readTraceIdFromFallbackFile(traceFile));\n if (persistedTraceId && !task.metadata?.trace_id) {\n taskStore.updateMetadata(task.id, { trace_id: persistedTraceId });\n }\n } catch {\n // best-effort — don't fail the task over metadata\n }\n\n // Extract response text via multi-pass extraction.\n let responseText = 'Execution completed';\n try {\n const history = (result as any)?.reviewSummary?.history as\n | Record<string, unknown[]>\n | undefined;\n if (history) {\n const allKeys = Object.keys(history);\n responseText = extractBestResponseText(history, allKeys);\n }\n if (responseText === 'Execution completed') {\n const issueSummary = summarizeUserFacingIssues((result as any)?.reviewSummary?.issues);\n if (issueSummary) {\n responseText = issueSummary;\n }\n }\n } catch {\n // ignore extraction errors\n }\n\n const completedMsg: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: responseText }],\n };\n try {\n taskStore.updateTaskState(task.id, 'completed', completedMsg);\n logger.info(`[TaskTracking] Task ${task.id} completed`);\n } catch (stateErr) {\n // Another process (e.g. stale sweep) may have already marked this task as failed.\n // Log a warning but do NOT re-throw — the execution itself succeeded.\n logger.warn(\n `[TaskTracking] Task ${task.id} completed but state transition failed: ${stateErr instanceof Error ? stateErr.message : stateErr}`\n );\n }\n\n // Fire-and-forget LLM evaluation (non-blocking)\n // Enabled via opts.autoEvaluate (from config.task_evaluate) or VISOR_TASK_EVALUATE env var\n if (opts.autoEvaluate || process.env.VISOR_TASK_EVALUATE === 'true') {\n scheduleEvaluation(task.id, taskStore);\n }\n\n if (liveUpdateManager) {\n await liveUpdateManager.complete(responseText);\n }\n\n return { task, result };\n } catch (err) {\n const errorText = err instanceof Error ? err.message : String(err);\n const failMessage: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: errorText }],\n };\n try {\n taskStore.updateTaskState(task.id, 'failed', failMessage);\n logger.info(`[TaskTracking] Task ${task.id} failed: ${errorText}`);\n } catch {\n // ignore double-failure\n }\n if (liveUpdateManager) {\n await liveUpdateManager.fail(`:warning: ${errorText}`);\n }\n throw err; // re-throw to preserve original behavior\n } finally {\n clearInterval(heartbeatTimer);\n liveUpdateManager?.stop();\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Non-blocking auto-evaluation\n// ---------------------------------------------------------------------------\n\nfunction scheduleEvaluation(taskId: string, taskStore: TaskStore): void {\n // Delay slightly to let OTEL spans flush before we try to read the trace\n setTimeout(async () => {\n await logger.withTaskContext(taskId, async () => {\n try {\n const { evaluateAndStore } = await import('./task-evaluator');\n await evaluateAndStore(taskId, taskStore as any);\n logger.info(`[TaskEvaluator] Auto-evaluation completed for task ${taskId}`);\n } catch (err) {\n logger.warn(\n `[TaskEvaluator] Auto-evaluation failed for task ${taskId}: ${err instanceof Error ? err.message : err}`\n );\n }\n });\n }, 5000);\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  UtcpCheckProvider,
3
3
  init_utcp_check_provider
4
- } from "./chunk-TSX3YS3F.mjs";
4
+ } from "./chunk-HW4MPCOW.mjs";
5
+ import "./chunk-7QI6F66G.mjs";
5
6
  import "./chunk-4HIWZA6M.mjs";
6
7
  import "./chunk-25IC7KXZ.mjs";
7
8
  import "./chunk-LW3INISN.mjs";
@@ -13,4 +14,4 @@ init_utcp_check_provider();
13
14
  export {
14
15
  UtcpCheckProvider
15
16
  };
16
- //# sourceMappingURL=utcp-check-provider-Q4PD5EP2.mjs.map
17
+ //# sourceMappingURL=utcp-check-provider-WDTSQ7DZ.mjs.map
@@ -1,3 +1,8 @@
1
+ import {
2
+ formatUserFacingExecutionMessage,
3
+ init_user_facing_error,
4
+ summarizeUserFacingIssues
5
+ } from "./chunk-TL3ZTYFY.mjs";
1
6
  import {
2
7
  __esm
3
8
  } from "./chunk-J7LXIPZS.mjs";
@@ -267,6 +272,7 @@ var init_whatsapp_frontend = __esm({
267
272
  "src/frontends/whatsapp-frontend.ts"() {
268
273
  init_client();
269
274
  init_markdown();
275
+ init_user_facing_error();
270
276
  WhatsAppFrontend = class {
271
277
  name = "whatsapp";
272
278
  subs = [];
@@ -345,7 +351,7 @@ var init_whatsapp_frontend = __esm({
345
351
  if (checkId) text += `
346
352
  Check: ${checkId}`;
347
353
  if (message) text += `
348
- ${message}`;
354
+ ${formatUserFacingExecutionMessage(message)}`;
349
355
  await whatsapp.sendMessage({
350
356
  to: from,
351
357
  text,
@@ -397,6 +403,13 @@ ${message}`;
397
403
  if (out && typeof out._rawOutput === "string" && out._rawOutput.trim().length > 0) {
398
404
  text = (text || "") + "\n\n" + out._rawOutput.trim();
399
405
  }
406
+ if (!text) {
407
+ const issueSummary = summarizeUserFacingIssues(result?.issues || []);
408
+ if (issueSummary) {
409
+ text = issueSummary;
410
+ this.errorNotified = true;
411
+ }
412
+ }
400
413
  if (!text) {
401
414
  ctx.logger.info(
402
415
  `[whatsapp-frontend] skip posting reply for ${checkId}: no renderable text`
@@ -435,4 +448,4 @@ init_whatsapp_frontend();
435
448
  export {
436
449
  WhatsAppFrontend
437
450
  };
438
- //# sourceMappingURL=whatsapp-frontend-72XEIUIR.mjs.map
451
+ //# sourceMappingURL=whatsapp-frontend-3EMMNC7R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/whatsapp/markdown.ts","../../src/whatsapp/client.ts","../../src/frontends/whatsapp-frontend.ts"],"sourcesContent":["// Lightweight Markdown → WhatsApp formatter.\n// Converts common Markdown output from AI steps to WhatsApp-compatible text.\n//\n// Supported conversions:\n// - # Header / ## Header → *Header* (bold, no header support)\n// - **bold** / __bold__ → *bold*\n// - *italic* → _italic_\n// - ~~strike~~ → ~strike~\n// - `code` → ```code```\n// - ```block``` → ```block``` (preserved)\n// - [label](url) → label (url)\n// - > blockquote → > blockquote (preserved, WhatsApp renders this)\n//\n// WhatsApp text messages have a 4096 character limit.\n\n/**\n * Convert Markdown text to WhatsApp-compatible format.\n * Processes line-by-line, respecting fenced code blocks.\n */\nexport function markdownToWhatsApp(text: string): string {\n if (!text || typeof text !== 'string') return '';\n\n const lines = text.split(/\\r?\\n/);\n const result: string[] = [];\n let inCodeBlock = false;\n let codeLines: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimStart();\n\n // Track fenced code blocks\n if (/^```/.test(trimmed)) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeLines = [];\n } else {\n // Close code block\n result.push('```' + codeLines.join('\\n') + '```');\n inCodeBlock = false;\n codeLines = [];\n }\n continue;\n }\n if (inCodeBlock) {\n codeLines.push(lines[i]);\n continue;\n }\n\n const line = lines[i];\n\n // Headers: # Header → *Header* (bold)\n const headerMatch = /^(#{1,6})\\s+(.+)$/.exec(line.trimStart());\n if (headerMatch) {\n result.push(`*${convertInline(headerMatch[2].trim())}*`);\n continue;\n }\n\n // Horizontal rules\n if (/^[-*_]{3,}\\s*$/.test(trimmed)) {\n result.push('---');\n continue;\n }\n\n // Bullet lists: \"- item\" or \"* item\" preserved\n const bulletMatch = /^(\\s*)([-*])\\s+(.+)$/.exec(line);\n if (bulletMatch) {\n result.push(`${bulletMatch[1]}- ${convertInline(bulletMatch[3])}`);\n continue;\n }\n\n // Numbered lists: preserve as-is but convert inline\n const numMatch = /^(\\s*)(\\d+\\.)\\s+(.+)$/.exec(line);\n if (numMatch) {\n result.push(`${numMatch[1]}${numMatch[2]} ${convertInline(numMatch[3])}`);\n continue;\n }\n\n // Blockquotes: > text — preserved (WhatsApp renders these)\n const bqMatch = /^>\\s?(.*)$/.exec(trimmed);\n if (bqMatch) {\n result.push(`> ${convertInline(bqMatch[1])}`);\n continue;\n }\n\n // Regular line: apply inline conversions\n result.push(convertInline(line));\n }\n\n // Close any unclosed code block\n if (inCodeBlock && codeLines.length > 0) {\n result.push('```' + codeLines.join('\\n') + '```');\n }\n\n return result.join('\\n');\n}\n\n/**\n * Apply inline Markdown conversions to a single line.\n */\nfunction convertInline(line: string): string {\n // First, identify and protect inline code spans\n const codeSpans: string[] = [];\n let processed = line.replace(/`([^`]+)`/g, (_m, code: string) => {\n const idx = codeSpans.length;\n codeSpans.push('```' + code + '```');\n return `\\x00CODE${idx}\\x00`;\n });\n\n // Images: ![alt](url) → alt (url)\n processed = processed.replace(\n /!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)/g,\n (_m, alt: string, url: string) => `${alt || 'image'} (${url})`\n );\n\n // Links: [label](url) → label (url)\n processed = processed.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)/g,\n (_m, label: string, url: string) => `${label} (${url})`\n );\n\n // Bold: **text** or __text__ → *text* (protect with placeholders first)\n const boldSpans: string[] = [];\n processed = processed.replace(/\\*\\*([^*]+)\\*\\*/g, (_m, content: string) => {\n const idx = boldSpans.length;\n boldSpans.push(`*${content}*`);\n return `\\x00BOLD${idx}\\x00`;\n });\n processed = processed.replace(/__([^_]+)__/g, (_m, content: string) => {\n const idx = boldSpans.length;\n boldSpans.push(`*${content}*`);\n return `\\x00BOLD${idx}\\x00`;\n });\n\n // Italic: *text* → _text_ (bold already protected)\n processed = processed.replace(/(?<!\\*)\\*([^*]+)\\*(?!\\*)/g, '_$1_');\n\n // Strikethrough: ~~text~~ → ~text~\n processed = processed.replace(/~~([^~]+)~~/g, '~$1~');\n\n // Restore bold spans\n processed = processed.replace(\n /\\x00BOLD(\\d+)\\x00/g,\n (_m, idx: string) => boldSpans[parseInt(idx)]\n );\n\n // Restore code spans\n processed = processed.replace(\n /\\x00CODE(\\d+)\\x00/g,\n (_m, idx: string) => codeSpans[parseInt(idx)]\n );\n\n return processed;\n}\n\n/**\n * Chunk text into segments no larger than limit, splitting at newlines.\n */\nexport function chunkText(text: string, limit: number = 4096): string[] {\n if (text.length <= limit) return [text];\n\n const chunks: string[] = [];\n const lines = text.split('\\n');\n let current = '';\n\n for (const line of lines) {\n const candidate = current ? current + '\\n' + line : line;\n if (candidate.length > limit) {\n if (current) {\n chunks.push(current);\n current = line;\n } else {\n // Single line exceeds limit — force split\n let remaining = line;\n while (remaining.length > limit) {\n chunks.push(remaining.slice(0, limit));\n remaining = remaining.slice(limit);\n }\n current = remaining;\n }\n } else {\n current = candidate;\n }\n }\n if (current) chunks.push(current);\n\n return chunks;\n}\n\n/**\n * Main entry point: convert Markdown to WhatsApp format.\n */\nexport function formatWhatsAppText(text: string): string {\n return markdownToWhatsApp(text);\n}\n","// WhatsApp Cloud API client.\n// Wraps Graph API calls behind a clean interface.\n// Uses fetch directly (no npm dependency — Meta's official SDK is archived).\n\nimport { createHmac } from 'crypto';\nimport { chunkText } from './markdown';\n\nexport interface WhatsAppSendResult {\n ok: boolean;\n messageId?: string; // wamid.* format\n error?: string;\n}\n\nexport interface WhatsAppMessageStatus {\n ok: boolean;\n error?: string;\n}\n\nexport interface WhatsAppClientOptions {\n accessToken: string;\n phoneNumberId: string;\n appSecret?: string;\n verifyToken?: string;\n apiVersion?: string; // default 'v21.0'\n}\n\nexport class WhatsAppClient {\n private accessToken: string;\n private phoneNumberId: string;\n private appSecret?: string;\n private verifyToken?: string;\n private baseUrl: string;\n\n constructor(opts: WhatsAppClientOptions) {\n if (!opts.accessToken || typeof opts.accessToken !== 'string') {\n throw new Error('WhatsAppClient: accessToken is required');\n }\n if (!opts.phoneNumberId || typeof opts.phoneNumberId !== 'string') {\n throw new Error('WhatsAppClient: phoneNumberId is required');\n }\n this.accessToken = opts.accessToken;\n this.phoneNumberId = opts.phoneNumberId;\n this.appSecret = opts.appSecret;\n this.verifyToken = opts.verifyToken;\n const version = opts.apiVersion || 'v21.0';\n this.baseUrl = `https://graph.facebook.com/${version}/${this.phoneNumberId}`;\n }\n\n /** Get the Phone Number ID */\n getPhoneNumberId(): string {\n return this.phoneNumberId;\n }\n\n /**\n * Send a text message. Auto-chunks at 4096 characters.\n */\n async sendMessage(opts: {\n to: string;\n text: string;\n replyToMessageId?: string;\n }): Promise<WhatsAppSendResult> {\n const chunks = chunkText(opts.text, 4096);\n let lastResult: WhatsAppSendResult = { ok: false, error: 'No chunks to send' };\n\n for (const chunk of chunks) {\n const body: any = {\n messaging_product: 'whatsapp',\n to: opts.to,\n type: 'text',\n text: { body: chunk },\n };\n\n // Add quoted reply context\n if (opts.replyToMessageId) {\n body.context = { message_id: opts.replyToMessageId };\n }\n\n try {\n const resp = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.accessToken}`,\n },\n body: JSON.stringify(body),\n });\n\n const data = await resp.json();\n\n if (!resp.ok) {\n const errMsg = (data as any)?.error?.message || `HTTP ${resp.status}`;\n return { ok: false, error: errMsg };\n }\n\n const msgId = (data as any)?.messages?.[0]?.id;\n lastResult = { ok: true, messageId: msgId };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n return lastResult;\n }\n\n /**\n * Mark a message as read (send read receipt).\n */\n async markAsRead(messageId: string): Promise<WhatsAppMessageStatus> {\n try {\n const resp = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.accessToken}`,\n },\n body: JSON.stringify({\n messaging_product: 'whatsapp',\n status: 'read',\n message_id: messageId,\n }),\n });\n\n if (!resp.ok) {\n const data = await resp.json();\n return {\n ok: false,\n error: (data as any)?.error?.message || `HTTP ${resp.status}`,\n };\n }\n\n return { ok: true };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /**\n * Verify webhook signature (HMAC-SHA256 with X-Hub-Signature-256).\n * Returns true if valid or if no appSecret is configured (skip verification).\n */\n verifyWebhookSignature(rawBody: string, signatureHeader: string): boolean {\n if (!this.appSecret) return true; // no secret = skip verification\n if (!signatureHeader) return false;\n\n const expected = 'sha256=' + createHmac('sha256', this.appSecret).update(rawBody).digest('hex');\n\n return signatureHeader === expected;\n }\n\n /**\n * Verify GET challenge-response for webhook subscription.\n */\n verifyChallenge(params: Record<string, string>): {\n ok: boolean;\n challenge?: string;\n } {\n const mode = params['hub.mode'];\n const token = params['hub.verify_token'];\n const challenge = params['hub.challenge'];\n\n if (mode === 'subscribe' && token === this.verifyToken) {\n return { ok: true, challenge };\n }\n\n return { ok: false };\n }\n}\n","/**\n * WhatsApp Frontend for Visor workflows.\n *\n * Mirrors the TelegramFrontend pattern:\n * - Sends AI replies as WhatsApp text messages\n * - Converts Markdown to WhatsApp format\n * - No reaction equivalent (CheckScheduled is a no-op)\n */\nimport type { Frontend, FrontendContext } from './host';\nimport { WhatsAppClient } from '../whatsapp/client';\nimport { formatWhatsAppText } from '../whatsapp/markdown';\nimport {\n formatUserFacingExecutionMessage,\n summarizeUserFacingIssues,\n} from '../utils/user-facing-error';\n\ntype WhatsAppFrontendConfig = {\n accessToken?: string;\n phoneNumberId?: string;\n};\n\nexport class WhatsAppFrontend implements Frontend {\n public readonly name = 'whatsapp';\n private subs: Array<{ unsubscribe(): void }> = [];\n private cfg: WhatsAppFrontendConfig;\n private errorNotified: boolean = false;\n\n constructor(config?: WhatsAppFrontendConfig) {\n this.cfg = config || {};\n }\n\n start(ctx: FrontendContext): void {\n const bus = ctx.eventBus;\n\n try {\n ctx.logger.info(`[whatsapp-frontend] started`);\n } catch {}\n\n // CheckCompleted: post AI replies\n this.subs.push(\n bus.on('CheckCompleted', async (env: any) => {\n const ev = (env && env.payload) || env;\n await this.maybePostDirectReply(ctx, ev.checkId, ev.result).catch(() => {});\n })\n );\n\n // CheckErrored: post error notice\n this.subs.push(\n bus.on('CheckErrored', async (env: any) => {\n const ev = (env && env.payload) || env;\n const message = ev?.error?.message || 'Execution error';\n await this.maybePostError(ctx, 'Check failed', message, ev?.checkId).catch(() => {});\n })\n );\n\n // Shutdown: post error\n this.subs.push(\n bus.on('Shutdown', async (env: any) => {\n const ev = (env && env.payload) || env;\n const message = ev?.error?.message || 'Fatal error';\n await this.maybePostError(ctx, 'Run failed', message).catch(() => {});\n })\n );\n\n // CheckScheduled: no-op (WhatsApp has no reaction equivalent)\n // StateTransition: no-op\n }\n\n stop(): void {\n for (const s of this.subs) s.unsubscribe();\n this.subs = [];\n }\n\n private getWhatsApp(ctx: FrontendContext): WhatsAppClient | undefined {\n // Prefer injected client (for tests or shared runner context)\n const injected = (ctx as any).whatsapp || (ctx as any).whatsappClient;\n if (injected) return injected;\n // Lazy-create from env or frontend config\n try {\n const token = this.cfg.accessToken || process.env.WHATSAPP_ACCESS_TOKEN;\n const phoneId = this.cfg.phoneNumberId || process.env.WHATSAPP_PHONE_NUMBER_ID;\n if (\n typeof token === 'string' &&\n token.trim() &&\n typeof phoneId === 'string' &&\n phoneId.trim()\n ) {\n return new WhatsAppClient({\n accessToken: token.trim(),\n phoneNumberId: phoneId.trim(),\n });\n }\n } catch {}\n return undefined;\n }\n\n private getInboundWhatsAppPayload(ctx: FrontendContext): any | null {\n try {\n const endpoint = '/bots/whatsapp/message';\n return (ctx as any).webhookContext?.webhookData?.get(endpoint) || null;\n } catch {\n return null;\n }\n }\n\n private async maybePostError(\n ctx: FrontendContext,\n title: string,\n message: string,\n checkId?: string\n ): Promise<void> {\n if (this.errorNotified) return;\n const whatsapp = this.getWhatsApp(ctx);\n if (!whatsapp) return;\n const payload = this.getInboundWhatsAppPayload(ctx);\n const ev: any = payload?.event;\n const from = ev?.from;\n if (!from) return;\n\n let text = `${title}`;\n if (checkId) text += `\\nCheck: ${checkId}`;\n if (message) text += `\\n${formatUserFacingExecutionMessage(message)}`;\n\n await whatsapp.sendMessage({\n to: from,\n text,\n replyToMessageId: ev?.message_id,\n });\n this.errorNotified = true;\n }\n\n private async maybePostDirectReply(\n ctx: FrontendContext,\n checkId: string,\n result: { output?: any; content?: string }\n ): Promise<void> {\n try {\n const cfg: any = ctx.config || {};\n const checkCfg: any = cfg.checks?.[checkId];\n if (!checkCfg) return;\n\n const providerType = (checkCfg.type as string) || '';\n const isAi = providerType === 'ai';\n const isLogChat = providerType === 'log' && checkCfg.group === 'chat';\n const isWorkflow = providerType === 'workflow';\n if (!isAi && !isLogChat && !isWorkflow) return;\n if (checkCfg.criticality === 'internal') return;\n\n // For AI checks, only post simple schemas\n if (isAi) {\n const schema = checkCfg.schema;\n if (typeof schema === 'string') {\n const simpleSchemas = ['code-review', 'markdown', 'text', 'plain'];\n if (!simpleSchemas.includes(schema)) return;\n }\n }\n\n const whatsapp = this.getWhatsApp(ctx);\n if (!whatsapp) return;\n\n const payload = this.getInboundWhatsAppPayload(ctx);\n const ev: any = payload?.event;\n const from = ev?.from;\n if (!from) {\n ctx.logger.warn(\n `[whatsapp-frontend] skip posting reply for ${checkId}: missing from number`\n );\n return;\n }\n\n // Extract text (same logic as Telegram/Email/Slack frontends)\n const out: any = (result as any)?.output;\n let text: string | undefined;\n if (out && typeof out.text === 'string' && out.text.trim().length > 0) {\n text = out.text.trim();\n } else if (isAi && typeof checkCfg.schema === 'string') {\n if (\n typeof (result as any)?.content === 'string' &&\n (result as any).content.trim().length > 0\n ) {\n text = (result as any).content.trim();\n }\n } else if (isLogChat && typeof (result as any)?.logOutput === 'string') {\n const raw = (result as any).logOutput;\n if (raw.trim().length > 0) text = raw.trim();\n }\n\n // Append raw output\n if (out && typeof out._rawOutput === 'string' && out._rawOutput.trim().length > 0) {\n text = (text || '') + '\\n\\n' + out._rawOutput.trim();\n }\n\n if (!text) {\n const issueSummary = summarizeUserFacingIssues((result as any)?.issues || []);\n if (issueSummary) {\n text = issueSummary;\n this.errorNotified = true;\n }\n }\n\n if (!text) {\n ctx.logger.info(\n `[whatsapp-frontend] skip posting reply for ${checkId}: no renderable text`\n );\n return;\n }\n\n // Normalize literal \\n escape sequences\n text = text.replace(/\\\\n/g, '\\n');\n\n const formattedText = formatWhatsAppText(text);\n const postResult = await whatsapp.sendMessage({\n to: from,\n text: formattedText,\n replyToMessageId: ev?.message_id,\n });\n\n if (!postResult.ok) {\n ctx.logger.warn(\n `[whatsapp-frontend] failed to post reply for ${checkId}: ${postResult.error}`\n );\n return;\n }\n ctx.logger.info(\n `[whatsapp-frontend] posted reply for ${checkId} to ${from} (messageId=${postResult.messageId})`\n );\n } catch (err) {\n try {\n ctx.logger.warn(\n `[whatsapp-frontend] maybePostDirectReply failed for ${checkId}: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n } catch {}\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,22 +1,25 @@
1
1
  import {
2
2
  WorkflowCheckProvider,
3
3
  init_workflow_check_provider
4
- } from "./chunk-NPOVLLKH.mjs";
4
+ } from "./chunk-TGQBEM3Y.mjs";
5
5
  import "./chunk-YSOIR46P.mjs";
6
- import "./chunk-PDQTEBOJ.mjs";
7
- import "./chunk-WZQMTD7W.mjs";
8
- import "./chunk-TSX3YS3F.mjs";
6
+ import "./chunk-QT766ZLD.mjs";
7
+ import "./chunk-2LLKENYD.mjs";
8
+ import "./chunk-TL3ZTYFY.mjs";
9
+ import "./chunk-PGBV3VZB.mjs";
10
+ import "./chunk-HW4MPCOW.mjs";
11
+ import "./chunk-7QI6F66G.mjs";
9
12
  import "./chunk-VPPBOKBQ.mjs";
10
13
  import "./chunk-B7BVQM5K.mjs";
11
- import "./chunk-XXAEN5KU.mjs";
14
+ import "./chunk-77AKSSW2.mjs";
12
15
  import "./chunk-ZNKL6ESZ.mjs";
13
16
  import "./chunk-4ZLYHSN4.mjs";
14
- import "./chunk-XX6WT332.mjs";
17
+ import "./chunk-YTG5DN72.mjs";
15
18
  import "./chunk-KWTCTEFT.mjs";
16
- import "./chunk-4UMDSYC7.mjs";
17
- import "./chunk-5TXIAPRA.mjs";
18
- import "./chunk-A4WHMRK2.mjs";
19
- import "./chunk-NEZY2MXM.mjs";
19
+ import "./chunk-VS3JE2DL.mjs";
20
+ import "./chunk-S3GSZRYC.mjs";
21
+ import "./chunk-YETG675X.mjs";
22
+ import "./chunk-B2LQT6QU.mjs";
20
23
  import "./chunk-FWWLD555.mjs";
21
24
  import "./chunk-4HIWZA6M.mjs";
22
25
  import "./chunk-25IC7KXZ.mjs";
@@ -29,4 +32,4 @@ init_workflow_check_provider();
29
32
  export {
30
33
  WorkflowCheckProvider
31
34
  };
32
- //# sourceMappingURL=workflow-check-provider-N6KSDPWU.mjs.map
35
+ //# sourceMappingURL=workflow-check-provider-G7A67EPP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/sdk.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///tmp/visor-oss-build-VjMnUA/src/sdk.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;KAAE,CAAC;IAC9D,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,EAC5C,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,WAAW,CAAC,CA6BtB;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,EAAE,CAsB3F;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAyC9E"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///tmp/visor-oss-build-RaGKkd/src/sdk.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAA;KAAE,CAAC;IAC9D,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,EAC5C,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,WAAW,CAAC,CA6BtB;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,EAAE,CAsB3F;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAyC9E"}
@@ -13,7 +13,6 @@ interface TracedProbeAgent extends ProbeAgent {
13
13
  export declare class SessionRegistry {
14
14
  private static instance;
15
15
  private sessions;
16
- private exitHandlerRegistered;
17
16
  private constructor();
18
17
  /**
19
18
  * Get the singleton instance of SessionRegistry
@@ -30,11 +29,11 @@ export declare class SessionRegistry {
30
29
  /**
31
30
  * Remove a session from the registry
32
31
  */
33
- unregisterSession(sessionId: string): void;
32
+ unregisterSession(sessionId: string): Promise<void>;
34
33
  /**
35
34
  * Clear all sessions (useful for cleanup)
36
35
  */
37
- clearAllSessions(): void;
36
+ clearAllSessions(): Promise<void>;
38
37
  /**
39
38
  * Get all active session IDs
40
39
  */
@@ -52,9 +51,5 @@ export declare class SessionRegistry {
52
51
  * - Copying agent configuration
53
52
  */
54
53
  cloneSession(sourceSessionId: string, newSessionId: string, checkName?: string): Promise<ProbeAgent | undefined>;
55
- /**
56
- * Register process exit handlers to cleanup sessions on exit
57
- */
58
- private registerExitHandlers;
59
54
  }
60
55
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///tmp/visor-oss-build-VjMnUA/src/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,UAAU,gBAAiB,SAAQ,UAAU;IAC3C,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,qBAAqB,CAAS;IAEtC,OAAO;IAKP;;OAEG;WACW,WAAW,IAAI,eAAe;IAO5C;;OAEG;IACI,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAKxE;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQlE;;OAEG;IACI,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAmBjD;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAmB/B;;OAEG;IACI,mBAAmB,IAAI,MAAM,EAAE;IAItC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;;;;;;OAOG;IACU,YAAY,CACvB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAkElC;;OAEG;IACH,OAAO,CAAC,oBAAoB;CA8C7B"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///tmp/visor-oss-build-RaGKkd/src/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;GAEG;AACH,UAAU,gBAAiB,SAAQ,UAAU;IAC3C,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAA4C;IAE5D,OAAO;IAEP;;OAEG;WACW,WAAW,IAAI,eAAe;IAO5C;;OAEG;IACI,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAKxE;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQlE;;OAEG;IACU,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhE;;OAEG;IACU,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B9C;;OAEG;IACI,mBAAmB,IAAI,MAAM,EAAE;IAItC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;;;;;;OAOG;IACU,YAAY,CACvB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;CAoEnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["file:///tmp/visor-oss-build-VjMnUA/src/slack/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EAEf,MAAM,cAAc,CAAC;AAEtB,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,KAAK,SAAY;YAYjF,YAAY;IAKpB,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACd,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;KACrB,GACA,OAAO,CAAC,mBAAmB,CAAC;YA0BjB,kBAAkB;IAiBhC;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAoB7B,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB;IAuC3D,OAAO,CAAC,wBAAwB;IAuBhC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAOnF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxD,aAAa;IAGb,QAAQ,IAAI,WAAW;IAGvB,SAAS,IAAI,WAAW;IAGxB,SAAS,IAAI,cAAc;CAG5B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["file:///tmp/visor-oss-build-RaGKkd/src/slack/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EAEf,MAAM,cAAc,CAAC;AAEtB,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,KAAK,SAAY;YAYjF,YAAY;IAKpB,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACd,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;KACrB,GACA,OAAO,CAAC,mBAAmB,CAAC;YA0BjB,kBAAkB;IAiBhC;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAoB7B,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB;IAuC3D,OAAO,CAAC,wBAAwB;IAuBhC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAOnF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxD,aAAa;IAGb,QAAQ,IAAI,WAAW;IAGvB,SAAS,IAAI,WAAW;IAGxB,SAAS,IAAI,cAAc;CAG5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"cache-prewarmer.d.ts","sourceRoot":"","sources":["file:///tmp/visor-oss-build-VjMnUA/src/slack/cache-prewarmer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjF,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,GAAG,CAAuC;gBACtC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,0BAA0B;IAYpF,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAyB5B,eAAe;YAUf,YAAY;YAUZ,cAAc;YAwBd,WAAW;IA2BzB,OAAO,CAAC,KAAK;CAGd"}
1
+ {"version":3,"file":"cache-prewarmer.d.ts","sourceRoot":"","sources":["file:///tmp/visor-oss-build-RaGKkd/src/slack/cache-prewarmer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjF,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,GAAG,CAAuC;gBACtC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,0BAA0B;IAYpF,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAyB5B,eAAe;YAUf,YAAY;YAUZ,cAAc;YAwBd,WAAW;IA2BzB,OAAO,CAAC,KAAK;CAGd"}