@probelabs/visor 0.1.183-ee → 0.1.184-ee

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 (241) hide show
  1. package/dist/agent-protocol/task-live-update-slack.d.ts +24 -0
  2. package/dist/agent-protocol/task-live-update-slack.d.ts.map +1 -0
  3. package/dist/agent-protocol/task-live-update-teams.d.ts +25 -0
  4. package/dist/agent-protocol/task-live-update-teams.d.ts.map +1 -0
  5. package/dist/agent-protocol/task-live-update-telegram.d.ts +25 -0
  6. package/dist/agent-protocol/task-live-update-telegram.d.ts.map +1 -0
  7. package/dist/agent-protocol/task-live-updates.d.ts +102 -0
  8. package/dist/agent-protocol/task-live-updates.d.ts.map +1 -0
  9. package/dist/agent-protocol/task-progress-tool.d.ts.map +1 -1
  10. package/dist/agent-protocol/task-trace-resolution.d.ts +11 -0
  11. package/dist/agent-protocol/task-trace-resolution.d.ts.map +1 -0
  12. package/dist/agent-protocol/trace-serializer.d.ts.map +1 -1
  13. package/dist/agent-protocol/track-execution.d.ts +8 -0
  14. package/dist/agent-protocol/track-execution.d.ts.map +1 -1
  15. package/dist/cli-main.d.ts.map +1 -1
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/frontends/slack-frontend.d.ts +2 -0
  19. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  20. package/dist/frontends/teams-frontend.d.ts.map +1 -1
  21. package/dist/frontends/telegram-frontend.d.ts.map +1 -1
  22. package/dist/generated/config-schema.d.ts +110 -6
  23. package/dist/generated/config-schema.d.ts.map +1 -1
  24. package/dist/index.js +2239 -261
  25. package/dist/logger.d.ts +4 -1
  26. package/dist/logger.d.ts.map +1 -1
  27. package/dist/mcp-job-manager.d.ts +70 -0
  28. package/dist/mcp-job-manager.d.ts.map +1 -0
  29. package/dist/mcp-server.d.ts +6 -0
  30. package/dist/mcp-server.d.ts.map +1 -1
  31. package/dist/runners/mcp-server-runner.d.ts +4 -0
  32. package/dist/runners/mcp-server-runner.d.ts.map +1 -1
  33. package/dist/runners/runner-factory.d.ts.map +1 -1
  34. package/dist/sdk/{a2a-frontend-5YDHFQXD.mjs → a2a-frontend-OI4OVSKC.mjs} +4 -4
  35. package/dist/sdk/check-provider-registry-RITJW67U.mjs +32 -0
  36. package/dist/sdk/check-provider-registry-ZZ6N4GDP.mjs +32 -0
  37. package/dist/sdk/{chunk-4BN2XI4X.mjs → chunk-4HIWZA6M.mjs} +2 -2
  38. package/dist/sdk/{chunk-RI4ONH5X.mjs → chunk-4MHHELVZ.mjs} +2 -2
  39. package/dist/sdk/{chunk-J27D43HS.mjs → chunk-4ZLYHSN4.mjs} +2 -2
  40. package/dist/sdk/{chunk-ZPYODGYA.mjs → chunk-6E625R3C.mjs} +19 -4
  41. package/dist/sdk/chunk-6E625R3C.mjs.map +1 -0
  42. package/dist/sdk/{chunk-GA2TYKSR.mjs → chunk-7XKHFRPN.mjs} +4 -4
  43. package/dist/sdk/{chunk-6C3R6E42.mjs → chunk-IY5PQ5EN.mjs} +30 -6
  44. package/dist/sdk/chunk-IY5PQ5EN.mjs.map +1 -0
  45. package/dist/sdk/{chunk-MFXPJUUE.mjs → chunk-PUHU6UY6.mjs} +4 -3
  46. package/dist/sdk/chunk-PUHU6UY6.mjs.map +1 -0
  47. package/dist/sdk/{chunk-XOAEKFKB.mjs → chunk-QLT42TX7.mjs} +2 -2
  48. package/dist/sdk/chunk-SRU5TFNY.mjs +620 -0
  49. package/dist/sdk/chunk-SRU5TFNY.mjs.map +1 -0
  50. package/dist/sdk/{chunk-P2K4VOMU.mjs → chunk-TSX3YS3F.mjs} +3 -3
  51. package/dist/sdk/{chunk-WKLJ57WF.mjs → chunk-UM7LGO2P.mjs} +6 -6
  52. package/dist/sdk/{chunk-7VTZDC2X.mjs → chunk-VPPBOKBQ.mjs} +2 -2
  53. package/dist/sdk/chunk-WZQMTD7W.mjs +33 -0
  54. package/dist/sdk/chunk-WZQMTD7W.mjs.map +1 -0
  55. package/dist/sdk/{chunk-ZOF5QT6U.mjs → chunk-YBXNG75V.mjs} +118 -10
  56. package/dist/sdk/chunk-YBXNG75V.mjs.map +1 -0
  57. package/dist/sdk/{chunk-UXB4XWEE.mjs → chunk-YYFSAAD6.mjs} +53 -51
  58. package/dist/sdk/chunk-YYFSAAD6.mjs.map +1 -0
  59. package/dist/sdk/{chunk-RHKPFJLG.mjs → chunk-ZNKL6ESZ.mjs} +2 -2
  60. package/dist/sdk/{chunk-IDL3AA3G.mjs → chunk-ZYDRR6PZ.mjs} +1150 -403
  61. package/dist/sdk/chunk-ZYDRR6PZ.mjs.map +1 -0
  62. package/dist/sdk/{command-executor-YNJOS77A.mjs → command-executor-LHUW77GR.mjs} +3 -3
  63. package/dist/sdk/{config-PCP6O6Y6.mjs → config-TVU5RWR5.mjs} +3 -3
  64. package/dist/sdk/{dist-3UGGEZB3.mjs → dist-PN5UHL6A.mjs} +429 -429
  65. package/dist/sdk/dist-PN5UHL6A.mjs.map +1 -0
  66. package/dist/sdk/{email-frontend-WSNADJPI.mjs → email-frontend-ECHQCFTR.mjs} +2 -2
  67. package/dist/sdk/{failure-condition-evaluator-IRFKTYZD.mjs → failure-condition-evaluator-USY3ISVA.mjs} +6 -6
  68. package/dist/sdk/{github-auth-BJQBLK2V.mjs → github-auth-UO4DMNCC.mjs} +2 -2
  69. package/dist/sdk/{github-frontend-DECYOBRN.mjs → github-frontend-2T5PWYD5.mjs} +6 -6
  70. package/dist/sdk/{host-CFM2ASDI.mjs → host-OJSMCLKK.mjs} +6 -6
  71. package/dist/sdk/{host-T4LNVU2H.mjs → host-RM6UJEPP.mjs} +7 -7
  72. package/dist/sdk/{knex-store-OEWSZEBY.mjs → knex-store-KCMFAMH5.mjs} +2 -2
  73. package/dist/sdk/{liquid-extensions-E3AKRX7P.mjs → liquid-extensions-KZIRR4OY.mjs} +4 -4
  74. package/dist/sdk/{loader-WRGI244P.mjs → loader-35YWX5UQ.mjs} +4 -4
  75. package/dist/sdk/{memory-store-OHUIXCWJ.mjs → memory-store-3JONK7AF.mjs} +3 -3
  76. package/dist/sdk/{opa-policy-engine-IVMCGVNA.mjs → opa-policy-engine-FY5D45YS.mjs} +2 -2
  77. package/dist/sdk/{prompt-state-LN57DQF3.mjs → prompt-state-VVJMONT3.mjs} +3 -3
  78. package/dist/sdk/{renderer-schema-BT2IXMLW.mjs → renderer-schema-JZRRU5CW.mjs} +2 -2
  79. package/dist/sdk/{routing-H2PQ57OA.mjs → routing-NNQQSLWA.mjs} +8 -8
  80. package/dist/sdk/{schedule-tool-2DPNSU63.mjs → schedule-tool-ADZ2ON4I.mjs} +15 -14
  81. package/dist/sdk/schedule-tool-EMNF3FPQ.mjs +38 -0
  82. package/dist/sdk/{schedule-tool-handler-NBEO46RV.mjs → schedule-tool-handler-3R3IC6VA.mjs} +15 -14
  83. package/dist/sdk/{schedule-tool-handler-KLHE2SOW.mjs → schedule-tool-handler-F76ZD2WU.mjs} +17 -16
  84. package/dist/sdk/sdk.d.mts +40 -0
  85. package/dist/sdk/sdk.d.ts +40 -0
  86. package/dist/sdk/sdk.js +1154 -176
  87. package/dist/sdk/sdk.js.map +1 -1
  88. package/dist/sdk/sdk.mjs +14 -13
  89. package/dist/sdk/sdk.mjs.map +1 -1
  90. package/dist/sdk/{slack-frontend-DF5VL4OF.mjs → slack-frontend-K3TPGERM.mjs} +65 -9
  91. package/dist/sdk/slack-frontend-K3TPGERM.mjs.map +1 -0
  92. package/dist/sdk/{task-evaluator-OVMG7S56.mjs → task-evaluator-H3BXC7SE.mjs} +3 -3
  93. package/dist/sdk/{teams-frontend-DNW5GZP3.mjs → teams-frontend-6RRW533K.mjs} +54 -1
  94. package/dist/sdk/teams-frontend-6RRW533K.mjs.map +1 -0
  95. package/dist/sdk/{telegram-frontend-GA7OLADB.mjs → telegram-frontend-5UA77YAT.mjs} +48 -1
  96. package/dist/sdk/telegram-frontend-5UA77YAT.mjs.map +1 -0
  97. package/dist/sdk/{trace-helpers-26ZCAE2V.mjs → trace-helpers-OMF4C24T.mjs} +3 -3
  98. package/dist/sdk/{trace-serializer-KKBJHM7J.mjs → trace-serializer-EBHTHZYT.mjs} +3 -3
  99. package/dist/sdk/track-execution-3CHMGEPH.mjs +249 -0
  100. package/dist/sdk/track-execution-3CHMGEPH.mjs.map +1 -0
  101. package/dist/sdk/{utcp-check-provider-WI3QZ3W6.mjs → utcp-check-provider-Q4PD5EP2.mjs} +5 -5
  102. package/dist/sdk/workflow-check-provider-TC2G33WF.mjs +32 -0
  103. package/dist/sdk/workflow-check-provider-U4UXZ5YS.mjs +32 -0
  104. package/dist/sdk/{workflow-registry-YCZ3FCJC.mjs → workflow-registry-K56UTX36.mjs} +3 -3
  105. package/dist/slack/client.d.ts +14 -0
  106. package/dist/slack/client.d.ts.map +1 -1
  107. package/dist/slack/socket-runner.d.ts.map +1 -1
  108. package/dist/teams/client.d.ts +16 -0
  109. package/dist/teams/client.d.ts.map +1 -1
  110. package/dist/teams/webhook-runner.d.ts.map +1 -1
  111. package/dist/telegram/client.d.ts +17 -0
  112. package/dist/telegram/client.d.ts.map +1 -1
  113. package/dist/telegram/polling-runner.d.ts.map +1 -1
  114. package/dist/types/cli.d.ts +2 -0
  115. package/dist/types/cli.d.ts.map +1 -1
  116. package/dist/types/config.d.ts +40 -0
  117. package/dist/types/config.d.ts.map +1 -1
  118. package/package.json +4 -3
  119. package/dist/generated/config-schema.json +0 -4027
  120. package/dist/sdk/a2a-frontend-6LWBIPMS.mjs +0 -1734
  121. package/dist/sdk/a2a-frontend-6LWBIPMS.mjs.map +0 -1
  122. package/dist/sdk/check-provider-registry-WSEVHJEV.mjs +0 -31
  123. package/dist/sdk/check-provider-registry-YRADEEQY.mjs +0 -31
  124. package/dist/sdk/chunk-34QX63WK.mjs +0 -244
  125. package/dist/sdk/chunk-34QX63WK.mjs.map +0 -1
  126. package/dist/sdk/chunk-54KOAC4W.mjs +0 -665
  127. package/dist/sdk/chunk-6C3R6E42.mjs.map +0 -1
  128. package/dist/sdk/chunk-7W5QCO4Y.mjs +0 -5943
  129. package/dist/sdk/chunk-7W5QCO4Y.mjs.map +0 -1
  130. package/dist/sdk/chunk-7XRSCOKE.mjs +0 -825
  131. package/dist/sdk/chunk-FT3I25QV.mjs +0 -251
  132. package/dist/sdk/chunk-FT3I25QV.mjs.map +0 -1
  133. package/dist/sdk/chunk-G7GSN3SK.mjs +0 -390
  134. package/dist/sdk/chunk-G7GSN3SK.mjs.map +0 -1
  135. package/dist/sdk/chunk-IDL3AA3G.mjs.map +0 -1
  136. package/dist/sdk/chunk-J27D43HS.mjs.map +0 -1
  137. package/dist/sdk/chunk-MEB2TTIE.mjs +0 -157
  138. package/dist/sdk/chunk-MEB2TTIE.mjs.map +0 -1
  139. package/dist/sdk/chunk-MFXPJUUE.mjs.map +0 -1
  140. package/dist/sdk/chunk-NPSLGKXB.mjs +0 -1502
  141. package/dist/sdk/chunk-P2K4VOMU.mjs.map +0 -1
  142. package/dist/sdk/chunk-PQWZ6NFL.mjs +0 -459
  143. package/dist/sdk/chunk-PQWZ6NFL.mjs.map +0 -1
  144. package/dist/sdk/chunk-S5FSRHMY.mjs +0 -139
  145. package/dist/sdk/chunk-S5FSRHMY.mjs.map +0 -1
  146. package/dist/sdk/chunk-TFUQ2D5L.mjs +0 -307
  147. package/dist/sdk/chunk-TFUQ2D5L.mjs.map +0 -1
  148. package/dist/sdk/chunk-UCMJJ3IM.mjs +0 -227
  149. package/dist/sdk/chunk-UCMJJ3IM.mjs.map +0 -1
  150. package/dist/sdk/chunk-UFHOIB3R.mjs +0 -482
  151. package/dist/sdk/chunk-UFHOIB3R.mjs.map +0 -1
  152. package/dist/sdk/chunk-UXB4XWEE.mjs.map +0 -1
  153. package/dist/sdk/chunk-V45TITKX.mjs +0 -739
  154. package/dist/sdk/chunk-V45TITKX.mjs.map +0 -1
  155. package/dist/sdk/chunk-WKLJ57WF.mjs.map +0 -1
  156. package/dist/sdk/chunk-ZOF5QT6U.mjs.map +0 -1
  157. package/dist/sdk/chunk-ZPYODGYA.mjs.map +0 -1
  158. package/dist/sdk/command-executor-3AHGIYQG.mjs +0 -14
  159. package/dist/sdk/config-JE4HKTWW.mjs +0 -16
  160. package/dist/sdk/dist-3UGGEZB3.mjs.map +0 -1
  161. package/dist/sdk/failure-condition-evaluator-H3PBFBYT.mjs +0 -18
  162. package/dist/sdk/github-auth-27SZGPEC.mjs +0 -196
  163. package/dist/sdk/github-auth-BJQBLK2V.mjs.map +0 -1
  164. package/dist/sdk/github-frontend-TZRBOQCN.mjs +0 -1394
  165. package/dist/sdk/github-frontend-TZRBOQCN.mjs.map +0 -1
  166. package/dist/sdk/lazy-otel-5NH4ZJJM.mjs +0 -24
  167. package/dist/sdk/liquid-extensions-P6KDYILF.mjs +0 -25
  168. package/dist/sdk/memory-store-K5N7MC7U.mjs +0 -12
  169. package/dist/sdk/metrics-JTOG2HNO.mjs +0 -41
  170. package/dist/sdk/prompt-state-YPICX7PI.mjs +0 -16
  171. package/dist/sdk/renderer-schema-KOIH75RZ.mjs +0 -51
  172. package/dist/sdk/renderer-schema-KOIH75RZ.mjs.map +0 -1
  173. package/dist/sdk/routing-JMZ7HDCC.mjs +0 -26
  174. package/dist/sdk/schedule-tool-4M45RK3E.mjs +0 -37
  175. package/dist/sdk/schedule-tool-4M45RK3E.mjs.map +0 -1
  176. package/dist/sdk/schedule-tool-handler-KLHE2SOW.mjs.map +0 -1
  177. package/dist/sdk/schedule-tool-handler-NBEO46RV.mjs.map +0 -1
  178. package/dist/sdk/slack-frontend-BPWXNIHE.mjs +0 -929
  179. package/dist/sdk/slack-frontend-BPWXNIHE.mjs.map +0 -1
  180. package/dist/sdk/slack-frontend-DF5VL4OF.mjs.map +0 -1
  181. package/dist/sdk/task-evaluator-GQYDOSGT.mjs +0 -1392
  182. package/dist/sdk/task-evaluator-GQYDOSGT.mjs.map +0 -1
  183. package/dist/sdk/teams-frontend-DNW5GZP3.mjs.map +0 -1
  184. package/dist/sdk/telegram-frontend-GA7OLADB.mjs.map +0 -1
  185. package/dist/sdk/trace-helpers-26ZCAE2V.mjs.map +0 -1
  186. package/dist/sdk/trace-helpers-XV5GAX5L.mjs +0 -29
  187. package/dist/sdk/trace-helpers-XV5GAX5L.mjs.map +0 -1
  188. package/dist/sdk/trace-serializer-KKBJHM7J.mjs.map +0 -1
  189. package/dist/sdk/track-execution-3EC24C2X.mjs +0 -163
  190. package/dist/sdk/track-execution-3EC24C2X.mjs.map +0 -1
  191. package/dist/sdk/track-execution-66RLL6QT.mjs +0 -143
  192. package/dist/sdk/track-execution-66RLL6QT.mjs.map +0 -1
  193. package/dist/sdk/utcp-check-provider-JLIYF5HH.mjs +0 -16
  194. package/dist/sdk/utcp-check-provider-JLIYF5HH.mjs.map +0 -1
  195. package/dist/sdk/utcp-check-provider-WI3QZ3W6.mjs.map +0 -1
  196. package/dist/sdk/workflow-check-provider-X2UREEH7.mjs +0 -31
  197. package/dist/sdk/workflow-check-provider-X2UREEH7.mjs.map +0 -1
  198. package/dist/sdk/workflow-check-provider-YXALZNAQ.mjs +0 -31
  199. package/dist/sdk/workflow-check-provider-YXALZNAQ.mjs.map +0 -1
  200. package/dist/sdk/workflow-registry-X2IPY35M.mjs +0 -12
  201. package/dist/sdk/workflow-registry-X2IPY35M.mjs.map +0 -1
  202. package/dist/sdk/workflow-registry-YCZ3FCJC.mjs.map +0 -1
  203. /package/dist/sdk/{a2a-frontend-5YDHFQXD.mjs.map → a2a-frontend-OI4OVSKC.mjs.map} +0 -0
  204. /package/dist/sdk/{check-provider-registry-WSEVHJEV.mjs.map → check-provider-registry-RITJW67U.mjs.map} +0 -0
  205. /package/dist/sdk/{check-provider-registry-YRADEEQY.mjs.map → check-provider-registry-ZZ6N4GDP.mjs.map} +0 -0
  206. /package/dist/sdk/{chunk-4BN2XI4X.mjs.map → chunk-4HIWZA6M.mjs.map} +0 -0
  207. /package/dist/sdk/{chunk-RI4ONH5X.mjs.map → chunk-4MHHELVZ.mjs.map} +0 -0
  208. /package/dist/sdk/{chunk-54KOAC4W.mjs.map → chunk-4ZLYHSN4.mjs.map} +0 -0
  209. /package/dist/sdk/{chunk-GA2TYKSR.mjs.map → chunk-7XKHFRPN.mjs.map} +0 -0
  210. /package/dist/sdk/{chunk-XOAEKFKB.mjs.map → chunk-QLT42TX7.mjs.map} +0 -0
  211. /package/dist/sdk/{chunk-7XRSCOKE.mjs.map → chunk-TSX3YS3F.mjs.map} +0 -0
  212. /package/dist/sdk/{chunk-NPSLGKXB.mjs.map → chunk-UM7LGO2P.mjs.map} +0 -0
  213. /package/dist/sdk/{chunk-7VTZDC2X.mjs.map → chunk-VPPBOKBQ.mjs.map} +0 -0
  214. /package/dist/sdk/{chunk-RHKPFJLG.mjs.map → chunk-ZNKL6ESZ.mjs.map} +0 -0
  215. /package/dist/sdk/{command-executor-3AHGIYQG.mjs.map → command-executor-LHUW77GR.mjs.map} +0 -0
  216. /package/dist/sdk/{command-executor-YNJOS77A.mjs.map → config-TVU5RWR5.mjs.map} +0 -0
  217. /package/dist/sdk/{email-frontend-WSNADJPI.mjs.map → email-frontend-ECHQCFTR.mjs.map} +0 -0
  218. /package/dist/sdk/{config-JE4HKTWW.mjs.map → failure-condition-evaluator-USY3ISVA.mjs.map} +0 -0
  219. /package/dist/sdk/{github-auth-27SZGPEC.mjs.map → github-auth-UO4DMNCC.mjs.map} +0 -0
  220. /package/dist/sdk/{github-frontend-DECYOBRN.mjs.map → github-frontend-2T5PWYD5.mjs.map} +0 -0
  221. /package/dist/sdk/{host-CFM2ASDI.mjs.map → host-OJSMCLKK.mjs.map} +0 -0
  222. /package/dist/sdk/{host-T4LNVU2H.mjs.map → host-RM6UJEPP.mjs.map} +0 -0
  223. /package/dist/sdk/{knex-store-OEWSZEBY.mjs.map → knex-store-KCMFAMH5.mjs.map} +0 -0
  224. /package/dist/sdk/{config-PCP6O6Y6.mjs.map → liquid-extensions-KZIRR4OY.mjs.map} +0 -0
  225. /package/dist/sdk/{loader-WRGI244P.mjs.map → loader-35YWX5UQ.mjs.map} +0 -0
  226. /package/dist/sdk/{failure-condition-evaluator-H3PBFBYT.mjs.map → memory-store-3JONK7AF.mjs.map} +0 -0
  227. /package/dist/sdk/{opa-policy-engine-IVMCGVNA.mjs.map → opa-policy-engine-FY5D45YS.mjs.map} +0 -0
  228. /package/dist/sdk/{failure-condition-evaluator-IRFKTYZD.mjs.map → prompt-state-VVJMONT3.mjs.map} +0 -0
  229. /package/dist/sdk/{renderer-schema-BT2IXMLW.mjs.map → renderer-schema-JZRRU5CW.mjs.map} +0 -0
  230. /package/dist/sdk/{lazy-otel-5NH4ZJJM.mjs.map → routing-NNQQSLWA.mjs.map} +0 -0
  231. /package/dist/sdk/{liquid-extensions-E3AKRX7P.mjs.map → schedule-tool-ADZ2ON4I.mjs.map} +0 -0
  232. /package/dist/sdk/{liquid-extensions-P6KDYILF.mjs.map → schedule-tool-EMNF3FPQ.mjs.map} +0 -0
  233. /package/dist/sdk/{memory-store-K5N7MC7U.mjs.map → schedule-tool-handler-3R3IC6VA.mjs.map} +0 -0
  234. /package/dist/sdk/{memory-store-OHUIXCWJ.mjs.map → schedule-tool-handler-F76ZD2WU.mjs.map} +0 -0
  235. /package/dist/sdk/{task-evaluator-OVMG7S56.mjs.map → task-evaluator-H3BXC7SE.mjs.map} +0 -0
  236. /package/dist/sdk/{metrics-JTOG2HNO.mjs.map → trace-helpers-OMF4C24T.mjs.map} +0 -0
  237. /package/dist/sdk/{prompt-state-LN57DQF3.mjs.map → trace-serializer-EBHTHZYT.mjs.map} +0 -0
  238. /package/dist/sdk/{prompt-state-YPICX7PI.mjs.map → utcp-check-provider-Q4PD5EP2.mjs.map} +0 -0
  239. /package/dist/sdk/{routing-H2PQ57OA.mjs.map → workflow-check-provider-TC2G33WF.mjs.map} +0 -0
  240. /package/dist/sdk/{routing-JMZ7HDCC.mjs.map → workflow-check-provider-U4UXZ5YS.mjs.map} +0 -0
  241. /package/dist/sdk/{schedule-tool-2DPNSU63.mjs.map → workflow-registry-K56UTX36.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/agent-protocol/trace-serializer.ts"],"sourcesContent":["/**\n * Trace serializer for LLM evaluation prompts and CLI display.\n *\n * Supports multiple trace backends:\n * 1. Grafana Tempo (via Grafana datasource proxy or direct Tempo API)\n * 2. Jaeger (via Jaeger HTTP API)\n * 3. Local NDJSON files (Visor's file-span-exporter OTEL format)\n *\n * Auto-detects the backend from environment variables:\n * - OTEL_EXPORTER_OTLP_ENDPOINT + VISOR_TELEMETRY_SINK=otlp → probe Grafana/Jaeger\n * - VISOR_TRACE_BACKEND=grafana|jaeger|file (explicit override)\n * - GRAFANA_URL, GRAFANA_TEMPO_DATASOURCE_ID → Grafana Tempo\n * - JAEGER_URL → Jaeger\n * - Falls back to local file scan\n */\n\nimport * as fs from 'fs';\nimport * as readline from 'readline';\nimport * as path from 'path';\nimport { logger } from '../logger';\n\n// ---------------------------------------------------------------------------\n// Trace backend configuration\n// ---------------------------------------------------------------------------\n\nexport interface TraceBackendConfig {\n type: 'grafana' | 'jaeger' | 'file' | 'auto';\n /** Grafana base URL, e.g. http://localhost:3000 */\n grafanaUrl?: string;\n /** Grafana Tempo datasource ID (default: auto-detect) */\n grafanaDatasourceId?: string | number;\n /** Jaeger base URL, e.g. http://localhost:16686 */\n jaegerUrl?: string;\n /** Local trace directory (default: output/traces) */\n traceDir?: string;\n /** Auth token for remote APIs */\n authToken?: string;\n}\n\ntype TraceBackendKind = Exclude<TraceBackendConfig['type'], 'auto'>;\n\nfunction resolveBackendConfig(overrides?: Partial<TraceBackendConfig>): TraceBackendConfig {\n const explicit = process.env.VISOR_TRACE_BACKEND as TraceBackendConfig['type'] | undefined;\n\n return {\n type: overrides?.type || explicit || 'auto',\n grafanaUrl: overrides?.grafanaUrl || process.env.GRAFANA_URL,\n grafanaDatasourceId: overrides?.grafanaDatasourceId || process.env.GRAFANA_TEMPO_DATASOURCE_ID,\n jaegerUrl: overrides?.jaegerUrl || process.env.JAEGER_URL,\n traceDir: overrides?.traceDir || process.env.VISOR_TRACE_DIR || 'output/traces',\n authToken: overrides?.authToken || process.env.GRAFANA_TOKEN,\n };\n}\n\nfunction getAutoBackendOrder(): TraceBackendKind[] {\n const sink = (process.env.VISOR_TELEMETRY_SINK || '').trim().toLowerCase();\n const hasRemoteHints =\n !!process.env.GRAFANA_URL ||\n !!process.env.JAEGER_URL ||\n !!process.env.GRAFANA_TEMPO_DATASOURCE_ID ||\n !!process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||\n !!process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;\n\n if (sink === 'file') return ['file', 'grafana', 'jaeger'];\n if (sink === 'otlp' || hasRemoteHints) return ['grafana', 'jaeger', 'file'];\n\n return ['file', 'grafana', 'jaeger'];\n}\n\nfunction getBackendOrder(cfg: TraceBackendConfig): TraceBackendKind[] {\n if (cfg.type === 'grafana') return ['grafana'];\n if (cfg.type === 'jaeger') return ['jaeger'];\n if (cfg.type === 'file') return ['file'];\n return getAutoBackendOrder();\n}\n\nfunction isTraceFilePath(ref: string): boolean {\n return ref.includes('/') || ref.endsWith('.ndjson');\n}\n\n// ---------------------------------------------------------------------------\n// Unified span type (normalized from all backends)\n// ---------------------------------------------------------------------------\n\ninterface NormalizedSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTimeMs: number;\n endTimeMs: number;\n durationMs: number;\n attributes: Record<string, string | number | boolean>;\n events: Array<{ name: string; attributes: Record<string, string | number | boolean> }>;\n status: 'ok' | 'error';\n}\n\ninterface SpanTree {\n span: NormalizedSpan;\n children: SpanTree[];\n}\n\n// ---------------------------------------------------------------------------\n// OTLP response parsing (shared by Grafana Tempo and Jaeger)\n// ---------------------------------------------------------------------------\n\n/**\n * Parse OTLP JSON trace response (Tempo/Jaeger format) into normalized spans.\n * Format: { batches: [{ scopeSpans: [{ spans: [...] }] }] }\n * Jaeger variant: { data: [{ spans: [...] }] }\n */\nfunction parseOTLPResponse(data: any): NormalizedSpan[] {\n const spans: NormalizedSpan[] = [];\n\n // Grafana Tempo OTLP format\n if (data.batches) {\n for (const batch of data.batches) {\n for (const ss of batch.scopeSpans || []) {\n for (const s of ss.spans || []) {\n spans.push(normalizeOTLPSpan(s));\n }\n }\n }\n return spans;\n }\n\n // Jaeger native format\n if (data.data && Array.isArray(data.data)) {\n for (const trace of data.data) {\n for (const s of trace.spans || []) {\n spans.push(normalizeJaegerSpan(s, trace.traceID));\n }\n }\n return spans;\n }\n\n return spans;\n}\n\nfunction normalizeOTLPSpan(s: any): NormalizedSpan {\n const startNs = parseInt(s.startTimeUnixNano || '0', 10);\n const endNs = parseInt(s.endTimeUnixNano || '0', 10);\n\n // Decode base64 span/trace IDs if needed, or use hex strings\n const traceId = decodeOTLPId(s.traceId);\n const spanId = decodeOTLPId(s.spanId);\n const parentSpanId = s.parentSpanId ? decodeOTLPId(s.parentSpanId) : undefined;\n\n const attributes: Record<string, string | number | boolean> = {};\n for (const attr of s.attributes || []) {\n const val = attr.value;\n if (val.stringValue !== undefined) attributes[attr.key] = val.stringValue;\n else if (val.intValue !== undefined) attributes[attr.key] = parseInt(val.intValue, 10);\n else if (val.boolValue !== undefined) attributes[attr.key] = val.boolValue;\n else if (val.doubleValue !== undefined) attributes[attr.key] = val.doubleValue;\n }\n\n const events: NormalizedSpan['events'] = [];\n for (const evt of s.events || []) {\n const evtAttrs: Record<string, string | number | boolean> = {};\n for (const a of evt.attributes || []) {\n const v = a.value;\n if (v.stringValue !== undefined) evtAttrs[a.key] = v.stringValue;\n else if (v.intValue !== undefined) evtAttrs[a.key] = parseInt(v.intValue, 10);\n }\n events.push({ name: evt.name, attributes: evtAttrs });\n }\n\n return {\n traceId,\n spanId,\n parentSpanId,\n name: s.name || 'unknown',\n startTimeMs: startNs / 1e6,\n endTimeMs: endNs / 1e6,\n durationMs: (endNs - startNs) / 1e6,\n attributes,\n events,\n status: s.status?.code === 2 ? 'error' : 'ok',\n };\n}\n\nfunction normalizeJaegerSpan(s: any, traceId: string): NormalizedSpan {\n const attributes: Record<string, string | number | boolean> = {};\n for (const tag of s.tags || []) {\n attributes[tag.key] = tag.value;\n }\n\n const events: NormalizedSpan['events'] = [];\n for (const log of s.logs || []) {\n const evtAttrs: Record<string, string | number | boolean> = {};\n for (const f of log.fields || []) evtAttrs[f.key] = f.value;\n events.push({ name: (evtAttrs['event'] as string) || 'log', attributes: evtAttrs });\n }\n\n // Jaeger uses microseconds\n const startUs = s.startTime || 0;\n const durationUs = s.duration || 0;\n\n return {\n traceId,\n spanId: s.spanID,\n parentSpanId: s.references?.find((r: any) => r.refType === 'CHILD_OF')?.spanID,\n name: s.operationName || 'unknown',\n startTimeMs: startUs / 1000,\n endTimeMs: (startUs + durationUs) / 1000,\n durationMs: durationUs / 1000,\n attributes,\n events,\n status:\n attributes['otel.status_code'] === 'ERROR' || attributes['error'] === true ? 'error' : 'ok',\n };\n}\n\n/**\n * OTLP trace/span IDs may be base64-encoded. Decode to hex string.\n */\nfunction decodeOTLPId(id: string): string {\n if (!id) return '';\n // Already hex? (only hex chars)\n if (/^[0-9a-f]+$/i.test(id)) return id.toLowerCase();\n // Base64 → hex\n try {\n return Buffer.from(id, 'base64').toString('hex');\n } catch {\n return id;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Local NDJSON file parsing\n// ---------------------------------------------------------------------------\n\nfunction parseLocalNDJSONSpans(spans: any[]): NormalizedSpan[] {\n return spans.map(s => {\n const startMs = timeValueToMs(s.startTime || [0, 0]);\n const endMs = timeValueToMs(s.endTime || s.startTime || [0, 0]);\n const events: NormalizedSpan['events'] = (s.events || []).map((e: any) => ({\n name: e.name,\n attributes: e.attributes || {},\n }));\n\n return {\n traceId: s.traceId || '',\n spanId: s.spanId || '',\n parentSpanId: s.parentSpanId || undefined,\n name: s.name || 'unknown',\n startTimeMs: startMs,\n endTimeMs: endMs,\n durationMs: endMs - startMs,\n attributes: s.attributes || {},\n events,\n status: s.status?.code === 2 ? 'error' : 'ok',\n };\n });\n}\n\nfunction timeValueToMs(tv: [number, number]): number {\n return tv[0] * 1000 + tv[1] / 1e6;\n}\n\n// ---------------------------------------------------------------------------\n// Trace fetching — multi-backend\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch trace spans by trace ID. Tries backends in order:\n * 1. Explicit backend (config.type)\n * 2. Grafana Tempo (auto-detect)\n * 3. Jaeger (auto-detect)\n * 4. Local NDJSON files\n */\nexport async function fetchTraceSpans(\n traceRef: string,\n config?: Partial<TraceBackendConfig>\n): Promise<NormalizedSpan[]> {\n const cfg = resolveBackendConfig(config);\n const backendOrder = getBackendOrder(cfg);\n const traceId = isTraceFilePath(traceRef) ? await readTraceIdFromFile(traceRef) : traceRef;\n\n for (const backend of backendOrder) {\n if (backend === 'grafana' && traceId) {\n const spans = await fetchFromGrafanaTempo(traceId, cfg);\n if (spans && spans.length > 0) return spans;\n continue;\n }\n\n if (backend === 'jaeger' && traceId) {\n const spans = await fetchFromJaeger(traceId, cfg);\n if (spans && spans.length > 0) return spans;\n continue;\n }\n\n if (backend === 'file') {\n const spans = await fetchFromLocalFiles(traceRef, cfg);\n if (spans && spans.length > 0) return spans;\n continue;\n }\n }\n\n return [];\n}\n\nasync function fetchFromGrafanaTempo(\n traceId: string,\n cfg: TraceBackendConfig\n): Promise<NormalizedSpan[] | null> {\n // Auto-detect Grafana URL from OTLP endpoint\n let grafanaUrl = cfg.grafanaUrl;\n if (!grafanaUrl) {\n const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;\n if (otlpEndpoint) {\n // Common pattern: OTLP on 4318, Grafana on 3000 or mapped port\n // Try common Grafana ports on same host\n const url = new URL(otlpEndpoint);\n const host = url.hostname;\n for (const port of ['3000', '8001', '80']) {\n try {\n const testUrl = `http://${host}:${port}/api/health`;\n const resp = await httpGet(testUrl, cfg.authToken, 2000);\n if (resp && resp.includes('\"database\"')) {\n grafanaUrl = `http://${host}:${port}`;\n break;\n }\n } catch {}\n }\n }\n }\n\n if (!grafanaUrl) return null;\n\n try {\n // Auto-detect Tempo datasource ID\n let dsId = cfg.grafanaDatasourceId;\n if (!dsId) {\n const dsResp = await httpGet(`${grafanaUrl}/api/datasources`, cfg.authToken);\n if (dsResp) {\n const datasources = JSON.parse(dsResp);\n const tempo = datasources.find((d: any) => d.type === 'tempo');\n if (tempo) dsId = tempo.id;\n }\n }\n if (!dsId) return null;\n\n const traceUrl = `${grafanaUrl}/api/datasources/proxy/${dsId}/api/traces/${traceId}`;\n const resp = await httpGet(traceUrl, cfg.authToken);\n if (!resp) return null;\n\n const data = JSON.parse(resp);\n return parseOTLPResponse(data);\n } catch (err) {\n logger.debug(`[TraceSerializer] Grafana Tempo fetch failed: ${err}`);\n return null;\n }\n}\n\nasync function fetchFromJaeger(\n traceId: string,\n cfg: TraceBackendConfig\n): Promise<NormalizedSpan[] | null> {\n let jaegerUrl = cfg.jaegerUrl;\n if (!jaegerUrl) {\n // Auto-detect: try common Jaeger ports on localhost\n const otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;\n const host = otlpEndpoint ? new URL(otlpEndpoint).hostname : 'localhost';\n for (const port of ['16686']) {\n try {\n const testUrl = `http://${host}:${port}/api/services`;\n const resp = await httpGet(testUrl, undefined, 2000);\n if (resp && resp.includes('\"data\"')) {\n jaegerUrl = `http://${host}:${port}`;\n break;\n }\n } catch {}\n }\n }\n if (!jaegerUrl) return null;\n\n try {\n const traceUrl = `${jaegerUrl}/api/traces/${traceId}`;\n const resp = await httpGet(traceUrl, cfg.authToken);\n if (!resp) return null;\n\n const data = JSON.parse(resp);\n return parseOTLPResponse(data);\n } catch (err) {\n logger.debug(`[TraceSerializer] Jaeger fetch failed: ${err}`);\n return null;\n }\n}\n\nasync function fetchFromLocalFiles(\n traceRef: string,\n cfg: TraceBackendConfig\n): Promise<NormalizedSpan[] | null> {\n const traceFile = isTraceFilePath(traceRef)\n ? traceRef\n : await findTraceFile(traceRef, cfg.traceDir);\n if (!traceFile) return null;\n\n try {\n const { parseNDJSONTrace } = await import('../debug-visualizer/trace-reader');\n const trace = await parseNDJSONTrace(traceFile);\n return parseLocalNDJSONSpans(trace.spans as any[]);\n } catch (err) {\n logger.debug(`[TraceSerializer] Local file parse failed: ${err}`);\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// HTTP helper\n// ---------------------------------------------------------------------------\n\nasync function httpGet(\n url: string,\n authToken?: string,\n timeoutMs?: number\n): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs || 10000);\n\n const headers: Record<string, string> = {};\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n\n const resp = await fetch(url, {\n signal: controller.signal,\n headers,\n });\n clearTimeout(timeout);\n if (!resp.ok) return null;\n return await resp.text();\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Trace file discovery (local NDJSON files)\n// ---------------------------------------------------------------------------\n\n/**\n * Find the NDJSON trace file matching a given trace ID.\n * Scans the first line of each `.ndjson` file in the trace directory.\n */\nexport async function findTraceFile(traceId: string, traceDir?: string): Promise<string | null> {\n const dir = traceDir || process.env.VISOR_TRACE_DIR || 'output/traces';\n if (!fs.existsSync(dir)) return null;\n\n const files = fs.readdirSync(dir).filter(f => f.endsWith('.ndjson'));\n\n for (const file of files) {\n const filePath = path.join(dir, file);\n try {\n const firstLine = await readFirstLine(filePath);\n if (!firstLine) continue;\n const parsed = JSON.parse(firstLine);\n if (parsed.traceId === traceId) return filePath;\n } catch {\n // skip malformed files\n }\n }\n\n return null;\n}\n\nexport async function readTraceIdFromFile(traceFile: string): Promise<string | null> {\n try {\n const rl = readline.createInterface({\n input: fs.createReadStream(traceFile, { encoding: 'utf8' }),\n crlfDelay: Infinity,\n });\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed.traceId === 'string' && parsed.traceId) {\n rl.close();\n return parsed.traceId;\n }\n } catch {\n // skip malformed records and keep scanning\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nasync function readFirstLine(filePath: string): Promise<string | null> {\n return new Promise((resolve, reject) => {\n const stream = fs.createReadStream(filePath, { encoding: 'utf-8' });\n const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });\n let resolved = false;\n rl.on('line', (line: string) => {\n if (!resolved) {\n resolved = true;\n rl.close();\n stream.destroy();\n resolve(line.trim() || null);\n }\n });\n rl.on('close', () => {\n if (!resolved) resolve(null);\n });\n rl.on('error', reject);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Noise filtering\n// ---------------------------------------------------------------------------\n\n/** Span names that are pure infrastructure noise and should be filtered out */\nconst NOISE_SPAN_NAMES = new Set([\n 'engine.state.init',\n 'engine.state.waveplanning',\n 'engine.state.planready',\n 'visor.sandbox.stopAll',\n]);\n\n/** Span names that are redundant wrappers — lift their children up */\nconst WRAPPER_SPAN_NAMES = new Set([\n 'engine.state.leveldispatch',\n 'visor.ai_check',\n 'probe.delegation',\n]);\n\nfunction isNoiseSpan(span: NormalizedSpan): boolean {\n return NOISE_SPAN_NAMES.has(span.name);\n}\n\nfunction isWrapperSpan(span: NormalizedSpan): boolean {\n return WRAPPER_SPAN_NAMES.has(span.name);\n}\n\n// ---------------------------------------------------------------------------\n// Build span tree from flat list (with noise filtering)\n// ---------------------------------------------------------------------------\n\nfunction buildSpanTree(spans: NormalizedSpan[]): SpanTree {\n // First filter out pure noise spans\n const filtered = spans.filter(s => !isNoiseSpan(s));\n\n const nodeMap = new Map<string, SpanTree>();\n\n // Create all nodes\n for (const span of filtered) {\n nodeMap.set(span.spanId, { span, children: [] });\n }\n\n // Build parent-child relationships\n let root: SpanTree | undefined;\n const orphans: SpanTree[] = [];\n for (const span of filtered) {\n const node = nodeMap.get(span.spanId)!;\n if (!span.parentSpanId) {\n root = node;\n } else {\n // Walk up to find nearest non-filtered ancestor\n let parentId: string | undefined = span.parentSpanId;\n while (parentId && !nodeMap.has(parentId)) {\n // Parent was filtered — find grandparent from original spans\n const parentSpan = spans.find(s => s.spanId === parentId);\n parentId = parentSpan?.parentSpanId;\n }\n if (parentId) {\n const parent = nodeMap.get(parentId);\n if (parent) parent.children.push(node);\n } else if (!root) {\n root = node;\n } else {\n // Orphaned span — parent not in this trace; attach to root later\n orphans.push(node);\n }\n }\n }\n\n // If no root found, pick the span with the longest duration\n if (!root) {\n const sorted = [...nodeMap.values()].sort((a, b) => b.span.durationMs - a.span.durationMs);\n root = sorted[0] || { span: filtered[0], children: [] };\n }\n\n // Attach orphaned spans to root so they appear in the tree\n if (orphans.length > 0) {\n root.children.push(...orphans);\n }\n\n // Sort children by start time\n const sortChildren = (node: SpanTree) => {\n node.children.sort((a, b) => a.span.startTimeMs - b.span.startTimeMs);\n node.children.forEach(sortChildren);\n };\n sortChildren(root);\n\n // Unwrap wrapper spans — lift children up and discard the wrapper\n const unwrap = (node: SpanTree): SpanTree => {\n // Recursively process children first\n node.children = node.children.map(unwrap);\n\n // Flatten: replace wrapper children with their children\n const newChildren: SpanTree[] = [];\n for (const child of node.children) {\n if (isWrapperSpan(child.span)) {\n // Lift grandchildren up\n newChildren.push(...child.children);\n } else {\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n return node;\n };\n unwrap(root);\n\n // Remove redundant probe.event.tool.result spans that are siblings of\n // search.delegate spans — these are aggregate results echoed back to the\n // parent AI and duplicate info already shown inside the delegate subtree\n const removeDelegateEchos = (node: SpanTree): void => {\n const hasDelegateChild = node.children.some(c => c.span.name === 'search.delegate');\n if (hasDelegateChild) {\n node.children = node.children.filter(c => {\n if (c.span.name !== 'probe.event.tool.result') return true;\n const toolName = c.span.attributes['tool.name'];\n // Remove search echoes — their details are inside search.delegate\n return toolName !== 'search';\n });\n }\n node.children.forEach(removeDelegateEchos);\n };\n removeDelegateEchos(root);\n\n return root;\n}\n\n// ---------------------------------------------------------------------------\n// Compact tree rendering\n// ---------------------------------------------------------------------------\n\nexport interface RenderTreeOptions {\n maxDepth?: number;\n maxChars?: number;\n /** Fallback intent text for AI spans whose input is too truncated */\n fallbackIntent?: string;\n /** When true, don't truncate output/intent previews */\n fullOutput?: boolean;\n /** Final task response from the task store (full, not OTEL-truncated) */\n taskResponse?: string;\n}\n\n/**\n * Tracks displayed outputs and intents to avoid repeating the same text.\n * When a duplicate is detected, shows \"= <first-span-name>\" instead.\n */\ninterface DeduplicationContext {\n /** Map from normalized output prefix → span name that first displayed it */\n outputs: Map<string, string>;\n /** Map from normalized intent prefix → span name that first displayed it */\n intents: Map<string, string>;\n}\n\ninterface TraceRenderContext {\n realSpanNames: Set<string>;\n hasChildWorkSpans: boolean;\n}\n\ninterface LifecycleSpanInfo {\n baseName: string;\n phase: string;\n kind: 'check' | 'sandbox-child' | 'generic' | 'engineer';\n}\n\n/** Normalize text for dedup comparison: lowercase, collapse whitespace, take prefix */\nfunction dedupeKey(text: string): string {\n return text.replace(/\\s+/g, ' ').trim().slice(0, 100).toLowerCase();\n}\n\n/** Check if text was already displayed; if so return the reference name. Otherwise register it. */\nfunction dedupeOrRegister(\n ctx: DeduplicationContext,\n kind: 'outputs' | 'intents',\n text: string,\n spanName: string\n): string | null {\n if (!text || text.length < 20) return null;\n const key = dedupeKey(text);\n if (!key) return null;\n const map = ctx[kind];\n const existing = map.get(key);\n if (existing && existing !== spanName) {\n return existing;\n }\n // Cross-check: intents against outputs and vice versa\n const otherMap = kind === 'outputs' ? ctx.intents : ctx.outputs;\n const crossRef = otherMap.get(key);\n if (crossRef && crossRef !== spanName) {\n map.set(key, spanName);\n return crossRef;\n }\n map.set(key, spanName);\n return null;\n}\n\nfunction normalizeSpanName(name: string): string {\n return name.replace(/^child:\\s*/, '');\n}\n\nfunction isChildSpan(span: NormalizedSpan): boolean {\n return span.name.startsWith('child: ') || span.attributes['visor.sandbox.child_span'] === true;\n}\n\nfunction getConcreteCheckName(\n span:\n | Pick<NormalizedSpan, 'name' | 'attributes'>\n | { name: string; attributes?: Record<string, any> }\n): string | null {\n const attrs = span.attributes || {};\n const normalizedName = normalizeSpanName(span.name || '');\n const checkId = attrs['visor.check.id'];\n if (checkId) return `visor.check.${String(checkId).replace(/^visor\\.check\\./, '')}`;\n\n const lifecycle = getLifecycleSpanInfo(normalizedName);\n if (lifecycle?.kind === 'check') return lifecycle.baseName;\n\n const match = normalizedName.match(/^visor\\.check\\.([^.]+)$/);\n if (match) return `visor.check.${match[1]}`;\n return null;\n}\n\nfunction getLifecycleSpanInfo(name: string): LifecycleSpanInfo | null {\n const normalizedName = normalizeSpanName(name);\n\n const checkMatch = normalizedName.match(\n /^visor\\.check\\.([^.]+)\\.(started|completed|failed|progress)$/\n );\n if (checkMatch) {\n return {\n baseName: `visor.check.${checkMatch[1]}`,\n phase: checkMatch[2],\n kind: 'check',\n };\n }\n\n const sandboxChildMatch = normalizedName.match(\n /^visor\\.sandbox\\.child\\.(started|waiting|completed|failed)$/\n );\n if (sandboxChildMatch) {\n return {\n baseName: 'visor.sandbox.child',\n phase: sandboxChildMatch[1],\n kind: 'sandbox-child',\n };\n }\n\n const engineerMatch = normalizedName.match(\n /^visor\\.engineer\\.(started|sandbox_resolved|child_spawned|waiting_on_child|completed|failed|progress)$/\n );\n if (engineerMatch) {\n return {\n baseName: 'visor.engineer',\n phase: engineerMatch[1],\n kind: 'engineer',\n };\n }\n\n const genericMatch = normalizedName.match(\n /^(ai\\.request|search\\.delegate|visor\\.ai_check|probe\\.ai_request|probe\\.search_delegate)\\.(started|completed|failed)$/\n );\n if (genericMatch) {\n const baseName =\n genericMatch[1] === 'probe.ai_request'\n ? 'ai.request'\n : genericMatch[1] === 'probe.search_delegate'\n ? 'search.delegate'\n : genericMatch[1];\n return {\n baseName,\n phase: genericMatch[2],\n kind: 'generic',\n };\n }\n\n return null;\n}\n\nfunction buildRenderContext(allSpans: NormalizedSpan[]): TraceRenderContext {\n const realSpanNames = new Set<string>();\n let hasChildWorkSpans = false;\n\n for (const span of allSpans) {\n const normalizedName = normalizeSpanName(span.name);\n const lifecycle = getLifecycleSpanInfo(normalizedName);\n if (!lifecycle) {\n const checkName = getConcreteCheckName(span);\n if (checkName) realSpanNames.add(checkName);\n else realSpanNames.add(normalizedName);\n }\n\n if (isChildSpan(span) && !lifecycle) {\n hasChildWorkSpans = true;\n }\n }\n\n return { realSpanNames, hasChildWorkSpans };\n}\n\nfunction shouldSkipLifecycleSpan(span: NormalizedSpan, renderContext: TraceRenderContext): boolean {\n const lifecycle = getLifecycleSpanInfo(span.name);\n if (!lifecycle) return false;\n\n if (lifecycle.kind === 'sandbox-child') {\n return renderContext.hasChildWorkSpans;\n }\n\n return renderContext.realSpanNames.has(lifecycle.baseName);\n}\n\n/**\n * Serialize a trace (by ID) into a compact text tree for LLM prompts.\n * Auto-detects the backend (Grafana Tempo, Jaeger, local files).\n */\nexport async function serializeTraceForPrompt(\n traceIdOrPath: string,\n maxChars?: number,\n backendConfig?: Partial<TraceBackendConfig>,\n /** Final task response from the task store (not truncated by OTEL) */\n taskResponse?: string,\n /** Trace ID to try remote backends first (preferred over local file) */\n fallbackTraceId?: string\n): Promise<string> {\n let spans: NormalizedSpan[] = [];\n const cfg = resolveBackendConfig(backendConfig);\n const backendOrder = getBackendOrder(cfg);\n const isFilePath = isTraceFilePath(traceIdOrPath);\n const localTracePath = isFilePath ? traceIdOrPath : undefined;\n const remoteTraceId =\n fallbackTraceId ||\n (!isFilePath ? traceIdOrPath : (await readTraceIdFromFile(traceIdOrPath)) || undefined);\n const preferLocalFirst = backendOrder[0] === 'file';\n\n logger.debug(\n `[TraceSerializer] serializeTraceForPrompt ref=${traceIdOrPath} remoteTraceId=${remoteTraceId || '-'} backendOrder=${backendOrder.join('>')}`\n );\n\n if (preferLocalFirst && localTracePath) {\n logger.debug(`[TraceSerializer] Trying local trace file first: ${localTracePath}`);\n spans = await fetchTraceSpans(localTracePath, { ...cfg, type: 'file' });\n }\n\n if (spans.length === 0 && remoteTraceId) {\n logger.debug(`[TraceSerializer] Trying remote trace backends for trace_id=${remoteTraceId}`);\n spans = await fetchTraceSpans(remoteTraceId, cfg);\n }\n\n if (spans.length === 0 && localTracePath) {\n logger.debug(`[TraceSerializer] Falling back to local trace file: ${localTracePath}`);\n spans = await fetchTraceSpans(localTracePath, { ...cfg, type: 'file' });\n }\n\n if (spans.length === 0) {\n return '(no trace data available)';\n }\n\n const tree = buildSpanTree(spans);\n\n // Extract the route-intent topic as a global fallback for AI intent\n const routeIntentTopic = extractRouteIntentTopic(spans);\n\n // maxChars > 100k signals \"full\" mode (no truncation of previews)\n const fullOutput = (maxChars ?? 4000) > 100000;\n\n return renderSpanYaml(tree, spans, {\n maxChars: maxChars ?? 4000,\n fallbackIntent: routeIntentTopic,\n fullOutput,\n taskResponse,\n });\n}\n\n/**\n * Render a span tree as a compact ASCII tree with durations and details.\n */\nexport function renderSpanTree(tree: SpanTree, opts?: RenderTreeOptions): string {\n const maxChars = opts?.maxChars ?? 4000;\n const maxDepth = opts?.maxDepth ?? 20;\n const lines: string[] = [];\n\n const dedup: DeduplicationContext = { outputs: new Map(), intents: new Map() };\n renderNode(\n tree,\n '',\n true,\n 0,\n maxDepth,\n lines,\n undefined,\n opts?.fallbackIntent,\n opts?.fullOutput,\n dedup\n );\n\n let result = lines.join('\\n');\n if (result.length > maxChars) {\n result = result.slice(0, maxChars - 20) + '\\n... (truncated)';\n }\n return result;\n}\n\n// Keep backward compat — renderTraceTree delegates to renderSpanTree with adapter\nexport function renderTraceTree(\n tree: any, // ExecutionNode from trace-reader\n opts?: RenderTreeOptions\n): string {\n // Convert ExecutionNode tree to SpanTree\n const convert = (node: any): SpanTree => ({\n span: {\n traceId: node.span?.traceId || '',\n spanId: node.span?.spanId || '',\n parentSpanId: node.span?.parentSpanId,\n name: node.span?.name || node.checkId || 'unknown',\n startTimeMs: timeValueToMs(node.span?.startTime || [0, 0]),\n endTimeMs: timeValueToMs(node.span?.endTime || [0, 0]),\n durationMs: node.span?.duration || 0,\n attributes: node.span?.attributes || {},\n events: (node.span?.events || []).map((e: any) => ({\n name: e.name,\n attributes: e.attributes || {},\n })),\n status: node.status === 'error' ? 'error' : 'ok',\n },\n children: (node.children || []).map(convert),\n });\n return renderSpanTree(convert(tree), opts);\n}\n\n// ---------------------------------------------------------------------------\n// YAML-based renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Render a span tree as YAML-like structured output.\n * More readable than ASCII tree for JSON inputs/outputs.\n */\nexport function renderSpanYaml(\n tree: SpanTree,\n allSpans: NormalizedSpan[],\n opts?: RenderTreeOptions\n): string {\n const fullOutput = opts?.fullOutput ?? false;\n const maxLen = fullOutput ? 100000 : 120;\n const dedup: DeduplicationContext = { outputs: new Map(), intents: new Map() };\n const renderContext = buildRenderContext(allSpans);\n const lines: string[] = [];\n\n renderYamlNode(tree, 0, lines, dedup, renderContext, opts?.fallbackIntent, fullOutput, maxLen);\n\n // Append the final task response from the task store (not OTEL-truncated)\n if (opts?.taskResponse) {\n // Remove any trailing dedup line like \"output: = generate-response\"\n while (lines.length > 0 && /^\\s*output:\\s*=\\s*\\S+/.test(lines[lines.length - 1])) {\n lines.pop();\n }\n const ml = fullOutput ? 100000 : 500;\n const text = opts.taskResponse.replace(/\\*\\*/g, '').replace(/`/g, '').trim();\n if (fullOutput) {\n lines.push(' response: |');\n for (const line of text.split('\\n')) {\n lines.push(` ${line}`);\n }\n } else {\n const truncated = truncate(text.replace(/\\n/g, ' '), ml);\n lines.push(` response: ${truncated}`);\n if (text.length > ml) {\n lines.push(' # use --full for complete response');\n }\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction renderYamlNode(\n node: SpanTree,\n indent: number,\n lines: string[],\n dedup: DeduplicationContext,\n renderContext: TraceRenderContext,\n fallbackIntent?: string,\n fullOutput?: boolean,\n maxLen?: number,\n parentSpan?: NormalizedSpan\n): void {\n if (shouldSkipLifecycleSpan(node.span, renderContext)) {\n for (const child of node.children) {\n renderYamlNode(\n child,\n indent,\n lines,\n dedup,\n renderContext,\n fallbackIntent,\n fullOutput,\n maxLen,\n parentSpan\n );\n }\n return;\n }\n\n const pad = ' '.repeat(indent);\n const attrs = node.span.attributes;\n const duration = formatDurationMs(node.span.durationMs);\n const rawName = node.span.name;\n const name = normalizeSpanName(rawName);\n const lifecycle = getLifecycleSpanInfo(name);\n const childSuffix = isChildSpan(node.span) ? ' [child]' : '';\n const ml = maxLen ?? 120;\n\n // Helper: get display name — for AI spans, use parent check name\n const parentCheckId = parentSpan?.attributes['visor.check.id'];\n const parentCheckName = parentCheckId\n ? String(parentCheckId).replace(/^visor\\.check\\./, '')\n : undefined;\n const displayName =\n name === 'ai.request' && parentCheckName\n ? parentCheckName\n : String(attrs['visor.check.id'] || name).replace(/^visor\\.check\\./, '');\n\n if (lifecycle) {\n if (lifecycle.kind === 'check') {\n const cleanName = lifecycle.baseName.replace(/^visor\\.check\\./, '');\n lines.push(`${pad}${cleanName}${childSuffix} [${lifecycle.phase}] — ${duration}`);\n return;\n }\n if (lifecycle.kind === 'sandbox-child') {\n const checkName = attrs['visor.check.name'] ? ` ${String(attrs['visor.check.name'])}` : '';\n lines.push(\n `${pad}sandbox.child${checkName}${childSuffix} [${lifecycle.phase}] — ${duration}`\n );\n return;\n }\n if (lifecycle.kind === 'engineer') {\n const sandbox = attrs['visor.sandbox.selected'] || attrs['visor.sandbox.name'];\n const sandboxSuffix = sandbox ? ` sandbox=${String(sandbox)}` : '';\n lines.push(`${pad}engineer${childSuffix} [${lifecycle.phase}]${sandboxSuffix} — ${duration}`);\n return;\n }\n lines.push(`${pad}${lifecycle.baseName}${childSuffix} [${lifecycle.phase}] — ${duration}`);\n return;\n }\n\n // --- Tool calls ---\n const toolName = attrs['tool.name'] || attrs['visor.tool.name'];\n if (toolName) {\n const toolInput = extractToolInput(String(toolName), attrs);\n const toolResultLen = attrs['tool.result.length'] || attrs['tool.result.count'];\n const tn = String(toolName);\n // Detect \"no results\" for search tools: probe header is ~350-450 chars,\n // so result.length < 500 for search means no actual matches\n const isSearchTool = tn === 'search' || tn === 'searchCode' || tn === 'search_code';\n const numLen = toolResultLen ? Number(toolResultLen) : -1;\n const noResults = isSearchTool && numLen >= 0 && numLen < 500;\n const resultSize = noResults\n ? ' → no results'\n : toolResultLen\n ? ` → ${formatSize(numLen)}`\n : '';\n const successMark = attrs['tool.success'] === false ? ' ✗' : '';\n lines.push(`${pad}- ${tn}(${toolInput})${childSuffix}${resultSize}${successMark}`);\n return;\n }\n\n // --- Search delegate dedup decision ---\n if (name === 'search.delegate.dedup') {\n const query = attrs['dedup.query'] || '';\n const action = attrs['dedup.action'] || '?';\n const reason = attrs['dedup.reason'] || '';\n const rewritten = attrs['dedup.rewritten'] || '';\n const prevCount = attrs['dedup.previous_count'] || '0';\n let detail = `${action}`;\n if (rewritten) detail += ` → \"${truncate(String(rewritten), 60)}\"`;\n if (reason) detail += ` (${truncate(String(reason), 80)})`;\n lines.push(\n `${pad}dedup(\"${truncate(String(query), 60)}\") [${prevCount} prior]: ${detail} — ${duration}`\n );\n return;\n }\n\n // --- Search delegate ---\n if (name === 'search.delegate') {\n const query = attrs['search.query'] || '';\n const rewritten = attrs['search.query.rewritten'] || '';\n const output = attrs['search.delegate.output'] || '';\n const outputLen = attrs['search.delegate.output_length'] || '';\n\n let header = `search.delegate(\"${truncate(String(query), 80)}\")${childSuffix}`;\n if (rewritten) header += ` → rewritten: \"${truncate(String(rewritten), 60)}\"`;\n header += ` — ${duration}`;\n lines.push(`${pad}${header}:`);\n\n // Parse structured output to show confidence, searches, and groups summary\n if (output) {\n try {\n const parsed = JSON.parse(String(output));\n if (parsed.confidence) {\n let confLine = `confidence: ${parsed.confidence}`;\n if (parsed.reason) confLine += ` — ${truncate(String(parsed.reason), 100)}`;\n lines.push(`${pad} ${confLine}`);\n }\n if (parsed.searches && Array.isArray(parsed.searches) && parsed.searches.length > 0) {\n lines.push(`${pad} searches (${parsed.searches.length}):`);\n for (const s of parsed.searches) {\n const outcome = s.had_results ? '✓' : '✗';\n lines.push(\n `${pad} ${outcome} \"${truncate(String(s.query || ''), 60)}\" in ${truncate(String(s.path || '.'), 40)}`\n );\n }\n }\n if (parsed.groups && Array.isArray(parsed.groups) && parsed.groups.length > 0) {\n lines.push(`${pad} groups (${parsed.groups.length}):`);\n for (const g of parsed.groups) {\n const fileCount = g.files?.length || 0;\n lines.push(`${pad} - ${truncate(String(g.reason || ''), 80)} (${fileCount} files)`);\n }\n }\n } catch {\n // Not JSON — show raw output length\n if (outputLen) lines.push(`${pad} output: ${outputLen} chars`);\n }\n }\n\n for (const child of node.children) {\n renderYamlNode(\n child,\n indent + 1,\n lines,\n dedup,\n renderContext,\n fallbackIntent,\n fullOutput,\n maxLen,\n node.span\n );\n }\n return;\n }\n\n // --- AI request ---\n if (name === 'ai.request') {\n const model = attrs['ai.model'] || attrs['gen_ai.request.model'] || '?';\n const tokensIn = attrs['ai.input_length'] || attrs['gen_ai.usage.input_tokens'] || '';\n const tokensOut = attrs['gen_ai.usage.output_tokens'] || '';\n const tokenParts: string[] = [];\n if (tokensIn) tokenParts.push(`${tokensIn} in`);\n if (tokensOut) tokenParts.push(`${tokensOut} out`);\n const tokenStr = tokenParts.length > 0 ? ` — ${tokenParts.join(', ')}` : '';\n\n const hasChildren = node.children.length > 0;\n lines.push(\n `${pad}ai: ${model}${childSuffix} — ${duration}${tokenStr}${hasChildren ? ':' : ''}`\n );\n\n // Intent\n const aiInput = String(attrs['ai.input'] || '');\n let intent = extractAIIntent(aiInput, ml);\n if (!intent && parentSpan) {\n const promptPreview = String(\n parentSpan.attributes['visor.provider.request.prompt.preview'] || ''\n );\n if (promptPreview) intent = extractAIIntent(promptPreview, ml);\n if (!intent) {\n const inputOutputs = String(parentSpan.attributes['visor.check.input.outputs'] || '');\n if (inputOutputs) {\n try {\n const o = JSON.parse(inputOutputs);\n const t = o['route-intent']?.topic;\n if (t) intent = truncate(String(t), ml);\n } catch {}\n }\n }\n }\n if (!intent && fallbackIntent && parentSpan?.name !== 'search.delegate') {\n intent = fallbackIntent;\n }\n if (intent) {\n const intentRef = dedupeOrRegister(dedup, 'intents', intent, displayName);\n if (intentRef) {\n lines.push(`${pad} intent: = ${intentRef}`);\n } else {\n lines.push(`${pad} intent: ${intent}`);\n }\n }\n\n // Children (tool calls etc.)\n for (const child of node.children) {\n renderYamlNode(\n child,\n indent + 1,\n lines,\n dedup,\n renderContext,\n fallbackIntent,\n fullOutput,\n maxLen,\n node.span\n );\n }\n\n // Output from parent check span (AI provider stores output on the check span, not ai.request)\n if (parentSpan) {\n const checkOutput = String(parentSpan.attributes['visor.check.output'] || '');\n if (checkOutput) {\n renderYamlOutput(\n checkOutput,\n `${pad} `,\n 'output',\n displayName,\n dedup,\n lines,\n fullOutput,\n ml\n );\n }\n }\n return;\n }\n\n // --- visor.run ---\n if (name === 'visor.run') {\n const source = attrs['visor.run.source'] || '';\n const visorVersion = attrs['visor.version'] || '';\n const probeVersion = attrs['probe.version'] || '';\n const slackUser = attrs['slack.user_id'] || '';\n lines.push(`${pad}visor.run:`);\n lines.push(`${pad} trace_id: ${node.span.traceId}`);\n if (visorVersion) lines.push(`${pad} visor: ${visorVersion}`);\n if (probeVersion) lines.push(`${pad} probe: ${probeVersion}`);\n if (source) lines.push(`${pad} source: ${source}`);\n if (slackUser) lines.push(`${pad} slack_user: ${slackUser}`);\n lines.push(`${pad} duration: ${duration}`);\n for (const child of node.children) {\n renderYamlNode(\n child,\n indent + 1,\n lines,\n dedup,\n renderContext,\n fallbackIntent,\n fullOutput,\n maxLen,\n node.span\n );\n }\n return;\n }\n\n // --- Visor check ---\n const checkId = attrs['visor.check.id'];\n const checkType = attrs['visor.check.type'];\n const concreteCheckName = getConcreteCheckName({ name, attributes: attrs });\n if (checkId || concreteCheckName) {\n const cleanName = String(checkId || concreteCheckName || name).replace(/^visor\\.check\\./, '');\n const errMark = node.span.status === 'error' ? ' ✗' : '';\n lines.push(`${pad}${cleanName}${childSuffix}:${errMark}`);\n if (checkType) lines.push(`${pad} type: ${checkType}`);\n lines.push(`${pad} duration: ${duration}`);\n\n // Input — show the actual question/topic first, then dependency outputs\n const inputContext = String(attrs['visor.check.input.context'] || '');\n const inputOutputs = String(attrs['visor.check.input.outputs'] || '');\n const question = extractQuestionFromContext(inputContext, inputOutputs);\n if (question || (inputOutputs && inputOutputs !== '{}')) {\n renderYamlInput(inputOutputs, `${pad} `, lines, fullOutput, ml, question);\n }\n\n // Children\n for (const child of node.children) {\n renderYamlNode(\n child,\n indent + 1,\n lines,\n dedup,\n renderContext,\n fallbackIntent,\n fullOutput,\n maxLen,\n node.span\n );\n }\n\n // Output (after children)\n // Skip if check has a direct AI child — it already rendered this check's output\n const hasDirectAiChild = node.children.some(c => c.span.name === 'ai.request');\n if (!hasDirectAiChild) {\n const output = String(attrs['visor.check.output'] || '');\n if (output) {\n renderYamlOutput(output, `${pad} `, 'output', cleanName, dedup, lines, fullOutput, ml);\n }\n }\n return;\n }\n\n // --- Generic span ---\n const errMark = node.span.status === 'error' ? ' ✗' : '';\n const hasChildren = node.children.length > 0;\n lines.push(`${pad}${name}${childSuffix} — ${duration}${errMark}${hasChildren ? ':' : ''}`);\n for (const child of node.children) {\n renderYamlNode(\n child,\n indent + 1,\n lines,\n dedup,\n renderContext,\n fallbackIntent,\n fullOutput,\n maxLen,\n node.span\n );\n }\n}\n\n/**\n * Render a JSON output as YAML key-value pairs under a given prefix.\n * Handles deduplication — if the output was already shown, prints \"output: = <name>\".\n */\nfunction renderYamlOutput(\n rawOutput: string,\n pad: string,\n label: string,\n spanName: string,\n dedup: DeduplicationContext,\n lines: string[],\n fullOutput?: boolean,\n maxLen?: number\n): void {\n const ml = maxLen ?? 120;\n\n // Try to parse as JSON for structured display\n let obj: any;\n try {\n obj = JSON.parse(rawOutput);\n } catch {\n // Truncated JSON — use tolerant parser to extract what we can\n obj = parseTruncatedJson(rawOutput);\n }\n if (obj === null || obj === undefined || typeof obj !== 'object') return;\n\n // Unwrap single-key wrapper objects: {answer: {text: \"...\"}} → {text: \"...\"}\n // and {text: \"...\"} → render text inline\n if (typeof obj === 'object' && !Array.isArray(obj)) {\n const keys = Object.keys(obj);\n if (\n keys.length === 1 &&\n typeof obj[keys[0]] === 'object' &&\n obj[keys[0]] !== null &&\n !Array.isArray(obj[keys[0]])\n ) {\n obj = obj[keys[0]]; // unwrap {answer: {...}} → {...}\n }\n // If single text key, render inline\n const objKeys = Object.keys(obj);\n if (objKeys.length === 1 && objKeys[0] === 'text' && typeof obj.text === 'string') {\n const text = obj.text.replace(/\\*\\*/g, '').replace(/`/g, '').trim();\n const flat = text.replace(/\\n/g, ' ');\n const preview2 = fullOutput ? flat : truncate(flat, ml);\n const ref2 = dedupeOrRegister(dedup, 'outputs', truncate(flat, 100), spanName);\n if (ref2) {\n lines.push(`${pad}${label}: = ${ref2}`);\n } else {\n lines.push(`${pad}${label}: ${preview2}`);\n }\n return;\n }\n }\n\n // Get a dedup key from the formatted preview\n const preview = formatJsonPreview(obj, 200);\n if (!preview) return;\n const ref = dedupeOrRegister(dedup, 'outputs', preview, spanName);\n if (ref) {\n lines.push(`${pad}${label}: = ${ref}`);\n return;\n }\n\n // Render as YAML structure\n renderYamlValue(obj, pad, label, lines, fullOutput, ml);\n}\n\n/**\n * Render a JSON value as YAML structure.\n */\nfunction renderYamlValue(\n val: any,\n pad: string,\n key: string,\n lines: string[],\n fullOutput?: boolean,\n maxLen?: number,\n depth?: number\n): void {\n const ml = maxLen ?? 120;\n const d = depth ?? 0;\n\n if (val === null || val === undefined) return;\n\n if (typeof val === 'boolean' || typeof val === 'number') {\n lines.push(`${pad}${key}: ${val}`);\n return;\n }\n\n if (typeof val === 'string') {\n // Skip stringified JSON\n if (val.startsWith('{') || val.startsWith('[')) return;\n const clean = val.replace(/\\*\\*/g, '').replace(/`/g, '').trim();\n if (fullOutput && clean.length > 100 && clean.includes('\\n')) {\n // Multiline YAML\n lines.push(`${pad}${key}: |`);\n for (const line of clean.split('\\n').slice(0, fullOutput ? 500 : 5)) {\n lines.push(`${pad} ${line}`);\n }\n } else {\n const flat = clean.replace(/\\n/g, ' ');\n const truncVal = fullOutput ? flat : truncate(flat, ml);\n lines.push(`${pad}${key}: ${truncVal}`);\n }\n return;\n }\n\n if (Array.isArray(val)) {\n if (val.length === 0) {\n lines.push(`${pad}${key}: []`);\n return;\n }\n // Short string arrays: render inline like [a, b, c]\n if (val.every((v: any) => typeof v === 'string') && val.join(', ').length < ml) {\n lines.push(`${pad}${key}: [${val.join(', ')}]`);\n return;\n }\n // Limit array depth\n const maxItems = fullOutput ? 20 : 3;\n lines.push(`${pad}${key}:`);\n for (let i = 0; i < Math.min(val.length, maxItems); i++) {\n const item = val[i];\n if (typeof item === 'object' && item !== null) {\n const entries = Object.entries(item).filter(([k]) => k !== 'raw' && k !== 'tags');\n if (entries.length > 0) {\n // Put first key on same line as dash\n const [firstKey, firstVal] = entries[0];\n if (firstVal === null || firstVal === undefined || typeof firstVal !== 'object') {\n const sv =\n typeof firstVal === 'string'\n ? fullOutput\n ? firstVal.split('\\n')[0]\n : truncate(firstVal.split('\\n')[0], ml)\n : String(firstVal ?? '');\n lines.push(`${pad} - ${firstKey}: ${sv}`);\n } else {\n // Complex first value — render key on dash line, value below\n lines.push(`${pad} - ${firstKey}:`);\n for (const [ck, cv] of Object.entries(firstVal)) {\n if (ck === 'raw' || ck === 'skills' || ck === 'tags') continue;\n renderYamlValue(cv, `${pad} `, ck, lines, fullOutput, ml, d + 2);\n }\n }\n for (let j = 1; j < entries.length; j++) {\n const [k, v] = entries[j];\n renderYamlValue(v, `${pad} `, k, lines, fullOutput, ml, d + 1);\n }\n }\n } else {\n lines.push(`${pad} - ${truncate(String(item), ml)}`);\n }\n }\n if (val.length > maxItems) {\n lines.push(`${pad} # ... ${val.length - maxItems} more`);\n }\n return;\n }\n\n if (typeof val === 'object') {\n // Limit nesting depth\n if (d > 3) {\n const keys = Object.keys(val);\n lines.push(`${pad}${key}: {${keys.slice(0, 4).join(', ')}${keys.length > 4 ? ', ...' : ''}}`);\n return;\n }\n lines.push(`${pad}${key}:`);\n for (const [k, v] of Object.entries(val)) {\n if (k === 'raw' || k === 'tags') continue;\n renderYamlValue(v, `${pad} `, k, lines, fullOutput, ml, d + 1);\n }\n }\n}\n\n/**\n * Extract the actual user question/topic from the check's input context.\n * The context contains the full execution context including outputs from\n * dependency checks. We look for the route-intent topic, args.topic, or\n * other indicators of the user's question.\n */\nfunction extractQuestionFromContext(\n contextStr: string,\n inputOutputsStr: string\n): string | undefined {\n if (!contextStr) return undefined;\n\n try {\n const ctx = JSON.parse(contextStr);\n\n // 1. Check outputs.route-intent.topic (most common)\n const outputs = ctx.outputs || {};\n const routeIntent = outputs['route-intent'];\n if (routeIntent) {\n const topic = routeIntent.topic || routeIntent.intent || routeIntent.question;\n if (topic && typeof topic === 'string') return topic;\n // route-intent might be a string itself\n if (typeof routeIntent === 'string') return routeIntent;\n }\n\n // 2. Check args.topic or args.question\n const args = ctx.args || {};\n if (args.topic && typeof args.topic === 'string') return args.topic;\n if (args.question && typeof args.question === 'string') return args.question;\n if (args.intent && typeof args.intent === 'string') return args.intent;\n\n // 3. Check any output with a topic field not already in inputOutputs\n for (const key of Object.keys(outputs)) {\n const val = outputs[key];\n if (typeof val === 'object' && val !== null) {\n if (val.topic && typeof val.topic === 'string') {\n // Skip if this output is already shown in inputOutputs\n try {\n const depOutputs = JSON.parse(inputOutputsStr);\n if (depOutputs[key]) continue;\n } catch {}\n return val.topic;\n }\n }\n }\n } catch {\n // Truncated JSON — try regex extraction\n const topicMatch = contextStr.match(/\"topic\"\\s*:\\s*\"([^\"]+)\"/);\n if (topicMatch) return topicMatch[1];\n }\n\n return undefined;\n}\n\n/**\n * Render input dependencies as YAML.\n */\nfunction renderYamlInput(\n inputOutputsStr: string,\n pad: string,\n lines: string[],\n fullOutput?: boolean,\n maxLen?: number,\n question?: string\n): void {\n const ml = maxLen ?? 120;\n\n // Show the question/topic prominently first\n if (question) {\n lines.push(`${pad}input: ${truncate(question, fullOutput ? 100000 : ml)}`);\n }\n\n try {\n const inputs = JSON.parse(inputOutputsStr);\n if (typeof inputs !== 'object' || inputs === null) return;\n const keys = Object.keys(inputs);\n if (keys.length === 0) return;\n\n if (!question) lines.push(`${pad}input:`);\n for (const key of keys) {\n const val = inputs[key];\n if (typeof val === 'object' && val !== null) {\n renderYamlValue(val, `${pad} `, key, lines, fullOutput, ml, 0);\n } else {\n lines.push(`${pad} ${key}: ${truncate(String(val), ml)}`);\n }\n }\n } catch {\n // Can't parse — skip\n }\n}\n\n// ---------------------------------------------------------------------------\n// ASCII tree renderer (kept for backward compat / tests)\n// ---------------------------------------------------------------------------\n\nfunction renderNode(\n node: SpanTree,\n prefix: string,\n isLast: boolean,\n depth: number,\n maxDepth: number,\n lines: string[],\n parentSpan?: NormalizedSpan,\n fallbackIntent?: string,\n fullOutput?: boolean,\n dedup?: DeduplicationContext\n): void {\n if (depth > maxDepth) return;\n\n const hasChildren = node.children.length > 0;\n const connector = depth === 0 ? '' : isLast ? '└── ' : '├── ';\n const { line: formatted, output: deferredOutput } = formatSpanLine(\n node.span,\n parentSpan,\n fallbackIntent,\n fullOutput,\n dedup,\n hasChildren\n );\n\n // Skip if formatSpanLine returns empty (filtered)\n if (formatted) {\n lines.push(`${prefix}${connector}${formatted}`);\n }\n\n const childPrefix = depth === 0 ? '' : formatted ? prefix + (isLast ? ' ' : '│ ') : prefix; // no indent increase if this node was skipped\n\n for (let i = 0; i < node.children.length; i++) {\n const isChildLast = i === node.children.length - 1 && !deferredOutput;\n renderNode(\n node.children[i],\n childPrefix,\n isChildLast,\n depth + (formatted ? 1 : 0),\n maxDepth,\n lines,\n node.span,\n fallbackIntent,\n fullOutput,\n dedup\n );\n }\n\n // Show deferred output at the bottom, after all children\n if (deferredOutput) {\n lines.push(`${childPrefix}└─→ ${deferredOutput}`);\n }\n}\n\ninterface FormatResult {\n line: string;\n /** Output to show after children (deferred to bottom) */\n output?: string;\n}\n\nfunction formatSpanLine(\n span: NormalizedSpan,\n parentSpan?: NormalizedSpan,\n fallbackIntent?: string,\n fullOutput?: boolean,\n dedup?: DeduplicationContext,\n hasChildren?: boolean\n): FormatResult {\n const duration = formatDurationMs(span.durationMs);\n const attrs = span.attributes;\n const name = span.name;\n const previewLimit = fullOutput ? 10000 : 120;\n\n // Helper: get a display name for this span (used in dedup references)\n const displayName = String(attrs['visor.check.id'] || name).replace(/^visor\\.check\\./, '');\n\n // Helper: deduplicate an output string — returns the display string (without → prefix)\n const dedupeOutputStr = (rawOutput: string, label: string): string => {\n if (!rawOutput) return '';\n if (!dedup) return rawOutput;\n const ref = dedupeOrRegister(dedup, 'outputs', rawOutput, label);\n if (ref) return `(= ${ref})`;\n return rawOutput;\n };\n\n // Helper: deduplicate an intent string — returns the display string\n const dedupeIntentStr = (rawIntent: string, label: string): string => {\n if (!rawIntent || !dedup) return rawIntent ? ` 💬 ${rawIntent}` : '';\n const ref = dedupeOrRegister(dedup, 'intents', rawIntent, label);\n if (ref) return ` 💬 (= ${ref})`;\n return ` 💬 ${rawIntent}`;\n };\n\n // Helper: format output as inline or deferred depending on whether node has children\n const makeResult = (line: string, outputPreview: string): FormatResult => {\n if (!outputPreview) return { line };\n if (hasChildren) {\n // Defer output to bottom — show after children\n return { line, output: outputPreview };\n }\n // Inline for leaf nodes\n return { line: `${line} → ${outputPreview}` };\n };\n\n // --- Tool calls: extract real inputs ---\n const toolName = attrs['tool.name'] || attrs['visor.tool.name'];\n if (toolName) {\n const toolInput = extractToolInput(String(toolName), attrs);\n const toolResultLen = attrs['tool.result.length'] || attrs['tool.result.count'];\n const toolSuccess = attrs['tool.success'];\n const tn = String(toolName);\n const isSearchTool = tn === 'search' || tn === 'searchCode' || tn === 'search_code';\n const numLen = toolResultLen ? Number(toolResultLen) : -1;\n const noResults = isSearchTool && numLen >= 0 && numLen < 500;\n const resultSize = noResults ? 'no results' : toolResultLen ? formatSize(numLen) : '';\n const durStr =\n Number(attrs['tool.duration_ms']) > 0\n ? ` (${formatDurationMs(Number(attrs['tool.duration_ms']))})`\n : '';\n\n // Bash: show exit code / signal instead of generic success mark\n let successMark = toolSuccess === false ? ' ✗' : '';\n if (tn === 'bash') {\n const toolResult = String(attrs['tool.result'] || '');\n const exitMatch = toolResult.match(/Exit Code: (\\S+)/);\n const sigMatch = toolResult.match(/Signal: (\\S+)/);\n if (sigMatch && sigMatch[1] !== 'null') {\n successMark = ` [${sigMatch[1]}]`;\n } else if (exitMatch && exitMatch[1] !== '0' && exitMatch[1] !== 'null') {\n successMark = ` [exit ${exitMatch[1]}]`;\n }\n }\n\n return {\n line: `${toolName}(${toolInput})${durStr}${resultSize ? ` → ${resultSize}` : ''}${successMark}`,\n };\n }\n\n // --- Search delegate dedup ---\n if (name === 'search.delegate.dedup') {\n const query = attrs['dedup.query'] || '';\n const action = attrs['dedup.action'] || '?';\n const reason = attrs['dedup.reason'] || '';\n const rewritten = attrs['dedup.rewritten'] || '';\n let detail = `${action}`;\n if (rewritten) detail += ` → \"${truncate(String(rewritten), 50)}\"`;\n if (reason) detail += ` — ${truncate(String(reason), 60)}`;\n return { line: `dedup(\"${truncate(String(query), 50)}\") ${detail} (${duration})` };\n }\n\n // --- Search delegate: show the search query + confidence ---\n if (name === 'search.delegate') {\n const query = attrs['search.query'] || '';\n const rewritten = attrs['search.query.rewritten'] || '';\n const output = attrs['search.delegate.output'] || '';\n let suffix = '';\n // Try to extract confidence and group/search counts from output\n try {\n const parsed = JSON.parse(String(output));\n const parts: string[] = [];\n if (parsed.confidence) parts.push(parsed.confidence);\n if (parsed.groups?.length) parts.push(`${parsed.groups.length} groups`);\n if (parsed.searches?.length) parts.push(`${parsed.searches.length} searches`);\n if (parts.length > 0) suffix = ` → ${parts.join(', ')}`;\n } catch {}\n const rewriteStr = rewritten ? ` → \"${truncate(String(rewritten), 40)}\"` : '';\n return {\n line: `search.delegate(\"${truncate(String(query), 60)}\"${rewriteStr}) (${duration})${suffix}`,\n };\n }\n\n // --- AI request: show model + input summary ---\n if (name === 'ai.request') {\n const model = attrs['ai.model'] || attrs['gen_ai.request.model'] || '?';\n const tokensIn = attrs['ai.input_length'] || attrs['gen_ai.usage.input_tokens'] || '';\n const tokensOut = attrs['gen_ai.usage.output_tokens'] || '';\n const tokenParts: string[] = [];\n if (tokensIn) tokenParts.push(`${tokensIn} in`);\n if (tokensOut) tokenParts.push(`${tokensOut} out`);\n const tokenStr = tokenParts.length > 0 ? ` [${tokenParts.join(', ')}]` : '';\n\n // Extract a short intent/question from ai.input — inline on same line\n const aiInput = String(attrs['ai.input'] || '');\n let intent = extractAIIntent(aiInput, previewLimit);\n\n // Fallback: if ai.input was truncated, try parent check's attributes\n if (!intent && parentSpan) {\n // Try prompt preview first\n const promptPreview = String(\n parentSpan.attributes['visor.provider.request.prompt.preview'] || ''\n );\n if (promptPreview) {\n intent = extractAIIntent(promptPreview, previewLimit);\n }\n // Try extracting topic from parent check's input context (route-intent output)\n if (!intent) {\n const inputOutputs = String(parentSpan.attributes['visor.check.input.outputs'] || '');\n if (inputOutputs) {\n try {\n const outputs = JSON.parse(inputOutputs);\n const topic = outputs['route-intent']?.topic;\n if (topic) intent = truncate(String(topic), 150);\n } catch {}\n }\n }\n }\n // Global fallback: use the route-intent topic — but only for top-level AI,\n // not for sub-delegates whose intent is the search.delegate query\n if (!intent && fallbackIntent && parentSpan?.name !== 'search.delegate') {\n intent = fallbackIntent;\n }\n const intentStr = intent ? dedupeIntentStr(intent, displayName) : '';\n\n // Get output preview from parent check's output\n let outputPreview = '';\n if (parentSpan) {\n const checkOutput = String(parentSpan.attributes['visor.check.output'] || '');\n if (checkOutput) {\n const preview = extractOutputPreview(checkOutput, previewLimit);\n if (preview) outputPreview = dedupeOutputStr(preview, displayName);\n }\n }\n\n const mainLine = `ai ${model} (${duration})${tokenStr}${intentStr}`;\n return makeResult(mainLine, outputPreview);\n }\n\n // --- Visor check: clean name, show type, show input/output preview ---\n const checkId = attrs['visor.check.id'];\n const checkType = attrs['visor.check.type'];\n if (checkId || name.startsWith('visor.check.')) {\n const cleanName = String(checkId || name).replace(/^visor\\.check\\./, '');\n const typeStr = checkType ? ` [${checkType}]` : '';\n\n // Show input dependencies\n const inputOutputs = String(attrs['visor.check.input.outputs'] || '');\n let inputStr = '';\n if (inputOutputs && inputOutputs !== '{}') {\n inputStr = ' ' + formatInputPreview(inputOutputs, previewLimit);\n }\n\n // Get output preview for checks that produce meaningful output\n const output = String(attrs['visor.check.output'] || '');\n let outputPreview = '';\n if (output) {\n const preview = extractOutputPreview(output, previewLimit);\n if (preview) outputPreview = dedupeOutputStr(preview, cleanName);\n }\n\n const mainLine = `${cleanName}${typeStr} (${duration})${inputStr}`;\n return makeResult(mainLine, outputPreview);\n }\n\n // --- visor.run: show source info ---\n if (name === 'visor.run') {\n const source = attrs['visor.run.source'] || '';\n const sourceStr = source ? ` (${source})` : '';\n return { line: `visor.run${sourceStr} (${duration})` };\n }\n\n // --- Negotiated timeout observer: show decision details ---\n if (\n name === 'probe.event.negotiated_timeout.observer' ||\n name === 'negotiated_timeout.observer'\n ) {\n // Decision data lives in span events emitted by Probe inside the observer span.\n // Look through span.events for observer_extended, observer_declined, observer_exhausted.\n let detail = '';\n\n // First try span attributes (future Probe versions may set these directly)\n const attrDecision = attrs['observer.decision'] || attrs['decision_reason'];\n if (attrDecision) {\n const reason = attrs['observer.reason'] || attrs['decision_reason'] || '';\n if (String(attrDecision) === 'extended' || attrs['granted_ms']) {\n const grantedMin =\n attrs['observer.granted_min'] ||\n attrs['granted_min'] ||\n (attrs['granted_ms'] ? Math.round(Number(attrs['granted_ms']) / 60000) : '?');\n detail = `extended +${grantedMin}min`;\n if (reason) detail += ` (${truncate(String(reason), 60)})`;\n const used = attrs['observer.extensions_used'] || attrs['extensions_used'];\n const max = attrs['observer.max_requests'] || attrs['max_requests'];\n if (used) detail += ` [${used}/${max || '?'} used]`;\n } else if (String(attrDecision) === 'exhausted') {\n detail = 'budget exhausted';\n } else {\n detail = `declined`;\n if (reason) detail += `: ${truncate(String(reason), 60)}`;\n }\n }\n\n // Then try span events (current Probe versions emit these)\n if (!detail && span.events.length > 0) {\n for (const evt of span.events) {\n const evtName = evt.name || '';\n const ea = evt.attributes;\n if (evtName.includes('observer_extended')) {\n const grantedMin =\n ea['granted_min'] ||\n (ea['granted_ms'] ? Math.round(Number(ea['granted_ms']) / 60000) : '?');\n detail = `extended +${grantedMin}min`;\n if (ea['decision_reason']) detail += ` (${truncate(String(ea['decision_reason']), 60)})`;\n if (ea['extensions_used'])\n detail += ` [${ea['extensions_used']}/${ea['max_requests'] || '?'} used]`;\n break;\n }\n if (evtName.includes('observer_declined')) {\n detail = 'declined';\n if (ea['decision_reason']) detail += `: ${truncate(String(ea['decision_reason']), 60)}`;\n break;\n }\n if (evtName.includes('observer_exhausted')) {\n const used = ea['extensions_used'] || '?';\n const max = ea['max_requests'] || '?';\n detail = `budget exhausted [${used}/${max} extensions]`;\n break;\n }\n if (evtName.includes('observer_invoked') && !detail) {\n // Show invocation context as fallback if no decision event follows\n const elapsed = ea['elapsed_min'] || '?';\n const tools = ea['active_tools_count'] || 0;\n detail = `${elapsed}min elapsed, ${tools} active tools`;\n // Don't break — keep looking for a decision event\n }\n }\n }\n\n // Final fallback: span attributes for elapsed/active tools\n if (!detail) {\n const elapsed = attrs['elapsed_min'];\n const activeTools = attrs['active_tools_count'] || attrs['active_tools'];\n if (elapsed) detail += `${elapsed}min elapsed`;\n if (activeTools)\n detail += detail ? `, ${activeTools} active tools` : `${activeTools} active tools`;\n }\n\n const label = detail ? `timeout.observer: ${detail}` : 'timeout.observer';\n return { line: `${label} (${duration})` };\n }\n\n // --- Negotiated timeout sub-events (promoted to individual spans) ---\n if (name.includes('negotiated_timeout.observer_')) {\n const suffix = name.replace(/.*negotiated_timeout\\.observer_/, '');\n const reason = attrs['decision_reason'] || '';\n if (suffix === 'extended') {\n const grantedMin =\n attrs['granted_min'] ||\n (attrs['granted_ms'] ? Math.round(Number(attrs['granted_ms']) / 60000) : '?');\n const used = attrs['extensions_used'] || '?';\n const max = attrs['max_requests'] || '?';\n const reasonStr = reason ? ` (${truncate(String(reason), 60)})` : '';\n return { line: `timeout.extended: +${grantedMin}min${reasonStr} [${used}/${max} used]` };\n }\n if (suffix === 'declined') {\n const reasonStr = reason ? `: ${truncate(String(reason), 60)}` : '';\n return { line: `timeout.declined${reasonStr}` };\n }\n if (suffix === 'exhausted') {\n const used = attrs['extensions_used'] || '?';\n const max = attrs['max_requests'] || '?';\n return { line: `timeout.exhausted [${used}/${max} extensions, budget depleted]` };\n }\n // observer_invoked, observer_response — less important, show compact\n if (suffix === 'invoked') {\n const elapsed = attrs['elapsed_min'] || '?';\n const tools = attrs['active_tools_count'] || 0;\n return { line: `timeout.observer invoked (${elapsed}min elapsed, ${tools} active tools)` };\n }\n return { line: `timeout.${suffix} (${duration})` };\n }\n\n // --- Negotiated timeout abort summary: show that final response was generated under timeout ---\n if (name.includes('negotiated_timeout.abort_summary')) {\n const summaryLen = attrs['summary_length'] || attrs['summary.length'];\n const lenStr = summaryLen ? ` → ${formatSize(Number(summaryLen))}` : '';\n return { line: `timeout.abort_summary (${duration})${lenStr}` };\n }\n\n // --- Graceful stop events ---\n if (name.includes('graceful_stop.initiated') || name.includes('graceful_stop.invoked')) {\n const reason = attrs['graceful_stop.reason'] || attrs['reason'] || '';\n const reasonStr = reason ? `: ${truncate(String(reason), 80)}` : '';\n return { line: `graceful_stop${reasonStr} (${duration})` };\n }\n\n // --- Generic span ---\n return { line: `${name} (${duration})${span.status === 'error' ? ' ✗' : ''}` };\n}\n\n/**\n * Extract a meaningful input description for a tool call.\n * Parse a workspace path like /tmp/visor-workspaces/<session>/<repo>/path/to/file\n * into { repo, filePath } components.\n */\nfunction parseWorkspacePath(fullPath: string): { repo: string; filePath?: string } | null {\n // Match /tmp/visor-workspaces/<session-id>/<repo>/...\n const wsMatch = fullPath.match(/\\/visor-workspaces\\/[^/]+\\/([^/]+)(?:\\/(.+))?/);\n if (wsMatch) {\n return { repo: wsMatch[1], filePath: wsMatch[2] };\n }\n // Match .visor/worktrees/worktrees/<worktree-id>/<path>\n const wtMatch = fullPath.match(/\\.visor\\/worktrees\\/worktrees\\/[^/]+\\/(.+)/);\n if (wtMatch) {\n const segs = wtMatch[1].split('/');\n return { repo: segs[0], filePath: segs.length > 1 ? segs.slice(1).join('/') : undefined };\n }\n return null;\n}\n\n/**\n * Parses the Pattern/Path from tool.result for search tools,\n * and file paths for extract tools.\n */\nfunction extractToolInput(\n toolName: string,\n attrs: Record<string, string | number | boolean>\n): string {\n const result = String(attrs['tool.result'] || '');\n const explicitInput = String(attrs['tool.input'] || '');\n\n if (explicitInput) return truncate(explicitInput, 80);\n\n switch (toolName) {\n case 'search': {\n // Parse \"Pattern: ...\" and \"Path: ...\" from Probe search output\n const patMatch = result.match(/Pattern: (.+)/);\n const pathMatch = result.match(/Path: (\\S+)/);\n const pattern = patMatch ? patMatch[1].trim() : '';\n const workspace = pathMatch ? parseWorkspacePath(pathMatch[1]) : null;\n const parts: string[] = [];\n if (pattern) parts.push(`\"${truncate(pattern, 50)}\"`);\n if (workspace?.repo) parts.push(workspace.repo);\n return parts.join(', ');\n }\n case 'extract': {\n // Parse file paths from \"Files to extract:\" block\n // Full path looks like: /tmp/visor-workspaces/<session>/<repo>/path/to/file (lines N-M)\n const fileMatch = result.match(/Files to extract:\\n\\s*(\\S+)/);\n if (fileMatch) {\n const fullPath = fileMatch[1];\n const workspace = parseWorkspacePath(fullPath);\n if (workspace) {\n const parts: string[] = [];\n parts.push(workspace.filePath || workspace.repo || fullPath.split('/').pop() || '');\n if (workspace.repo) parts.push(workspace.repo);\n return parts.join(', ');\n }\n // Fallback: show last 2 segments\n const segs = fullPath.split('/');\n return segs.length > 2 ? segs.slice(-2).join('/') : segs[segs.length - 1];\n }\n return '';\n }\n case 'bash': {\n // tool.result starts with \"Command: <cmd>\\nWorking directory: ...\"\n const cmdMatch = result.match(/^Command: (.+)/);\n if (cmdMatch) {\n let cmd = cmdMatch[1].trim();\n // Strip long pipes — show first command + pipe count\n const pipes = cmd.split(/\\s*\\|\\s*/);\n if (pipes.length > 2) {\n cmd = `${pipes[0]} | ... (${pipes.length} stages)`;\n }\n return truncate(cmd, 80);\n }\n // Blocked commands: \"Permission denied: Component \"<cmd>\" not allowed: ...\"\n const deniedMatch = result.match(/^Permission denied: Component \"([^\"]+)\"/);\n if (deniedMatch) {\n return truncate(deniedMatch[1], 60) + ' [denied]';\n }\n return '';\n }\n case 'listFiles': {\n const pathMatch = result.match(/^(\\S+):/);\n if (pathMatch) {\n const parts = pathMatch[1].split('/');\n return parts[parts.length - 1] || '';\n }\n return '';\n }\n default:\n return truncate(explicitInput, 60);\n }\n}\n\n/**\n * Extract a short intent/question from an AI prompt.\n * Looks for ## Current Request, <question>, or the user message.\n */\nfunction extractAIIntent(input: string, maxLen: number = 150): string {\n if (!input || input.length < 20) return '';\n\n // Try <question>...</question>\n const qMatch = input.match(/<question>([\\s\\S]*?)<\\/question>/);\n if (qMatch) return truncate(qMatch[1].trim(), maxLen);\n\n // Try \"## Current Request\" section\n const crMatch = input.match(/## Current Request\\s*\\n(?:User: )?(.+)/);\n if (crMatch) return truncate(crMatch[1].trim(), maxLen);\n\n // Try \"User:\" pattern\n const userMatch = input.match(/(?:^|\\n)User: (.+)/);\n if (userMatch) return truncate(userMatch[1].trim(), maxLen);\n\n // Try \"Primary message\" pattern\n const pmMatch = input.match(/Primary message[^:]*:\\s*\\n(.+)/);\n if (pmMatch) return truncate(pmMatch[1].trim(), maxLen);\n\n return '';\n}\n\n/**\n * Format a JSON output as a compact structural preview.\n * Shows key names + brief values, preserving the JSON nature of the data.\n */\nfunction formatJsonPreview(obj: any, maxLen: number): string {\n if (obj === null || obj === undefined) return '';\n if (typeof obj !== 'object') return truncate(String(obj), maxLen);\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) return '[]';\n // Show array length + first item preview\n const first =\n typeof obj[0] === 'object' && obj[0] !== null\n ? obj[0].project_id || obj[0].id || obj[0].name || Object.keys(obj[0])[0] || '...'\n : String(obj[0]);\n return `[${obj.length}] ${truncate(String(first), 30)}${obj.length > 1 ? ', ...' : ''}`;\n }\n\n // Object — show key:value pairs compactly\n const parts: string[] = [];\n let len = 2; // for { }\n for (const [key, val] of Object.entries(obj)) {\n // Skip internal/verbose keys\n if (key === 'raw' || key === 'tags') continue;\n let valStr: string;\n if (val === null || val === undefined) continue;\n if (typeof val === 'boolean') valStr = String(val);\n else if (typeof val === 'number') valStr = String(val);\n else if (typeof val === 'string') {\n // Skip text fields that are stringified JSON (duplicate data)\n if (val.startsWith('{') || val.startsWith('[')) continue;\n // Clean markdown from text values\n const clean = val\n .replace(/\\*\\*/g, '')\n .replace(/^#+\\s*/gm, '')\n .replace(/`/g, '')\n .trim();\n valStr = `\"${truncate(clean.split('\\n')[0], Math.min(80, maxLen / 3))}\"`;\n } else if (Array.isArray(val)) {\n if (\n val.every(item => typeof item === 'string') &&\n val.join(', ').length < Math.min(120, maxLen / 2)\n ) {\n valStr = `[${val.join(', ')}]`;\n } else {\n valStr = `[${val.length}]`;\n }\n } else if (typeof val === 'object') valStr = `{${Object.keys(val).length} keys}`;\n else valStr = '...';\n\n const part = `${key}: ${valStr}`;\n if (len + part.length + 2 > maxLen) {\n parts.push('...');\n break;\n }\n parts.push(part);\n len += part.length + 2;\n }\n\n return `{${parts.join(', ')}}`;\n}\n\n/**\n * Extract a short preview from a check's output JSON.\n * Shows structural JSON preview preserving the data format.\n */\nfunction extractOutputPreview(output: string, maxLen: number = 120): string {\n try {\n const obj = JSON.parse(output);\n return formatJsonPreview(obj, maxLen);\n } catch {\n // JSON truncated by telemetry — extract top-level keys with regex\n return extractTruncatedJsonPreview(output, maxLen);\n }\n}\n\n/**\n * Extract a structured preview from truncated JSON (telemetry cuts at ~2048 chars).\n * Extracts top-level key:value pairs using regex.\n */\n/**\n * Tolerant JSON parser that extracts as much structure as possible from\n * truncated JSON (e.g., OTEL attribute values cut off at ~2048 chars).\n * Returns a partial JS object/array/string — whatever was parseable.\n */\nfunction parseTruncatedJson(input: string): any {\n let pos = 0;\n const len = input.length;\n\n function skipWhitespace(): void {\n while (pos < len && ' \\t\\n\\r'.includes(input[pos])) pos++;\n }\n\n function parseString(): string {\n if (input[pos] !== '\"') return '';\n pos++; // skip opening quote\n let result = '';\n while (pos < len) {\n const ch = input[pos];\n if (ch === '\\\\' && pos + 1 < len) {\n const next = input[pos + 1];\n if (next === 'n') {\n result += '\\n';\n pos += 2;\n continue;\n }\n if (next === 't') {\n result += '\\t';\n pos += 2;\n continue;\n }\n if (next === '\"') {\n result += '\"';\n pos += 2;\n continue;\n }\n if (next === '\\\\') {\n result += '\\\\';\n pos += 2;\n continue;\n }\n result += next;\n pos += 2;\n continue;\n }\n if (ch === '\"') {\n pos++;\n return result;\n }\n result += ch;\n pos++;\n }\n // Truncated — no closing quote\n return result;\n }\n\n function parseNumber(): number {\n const start = pos;\n if (input[pos] === '-') pos++;\n while (pos < len && input[pos] >= '0' && input[pos] <= '9') pos++;\n if (pos < len && input[pos] === '.') {\n pos++;\n while (pos < len && input[pos] >= '0' && input[pos] <= '9') pos++;\n }\n return Number(input.slice(start, pos));\n }\n\n function parseValue(): any {\n skipWhitespace();\n if (pos >= len) return undefined;\n const ch = input[pos];\n if (ch === '\"') return parseString();\n if (ch === '{') return parseObject();\n if (ch === '[') return parseArray();\n if (ch === 't' && input.slice(pos, pos + 4) === 'true') {\n pos += 4;\n return true;\n }\n if (ch === 'f' && input.slice(pos, pos + 5) === 'false') {\n pos += 5;\n return false;\n }\n if (ch === 'n' && input.slice(pos, pos + 4) === 'null') {\n pos += 4;\n return null;\n }\n if (ch === '-' || (ch >= '0' && ch <= '9')) return parseNumber();\n return undefined; // truncated\n }\n\n function parseObject(): Record<string, any> {\n const obj: Record<string, any> = {};\n pos++; // skip {\n skipWhitespace();\n while (pos < len && input[pos] !== '}') {\n skipWhitespace();\n if (pos >= len || input[pos] !== '\"') break; // truncated\n const key = parseString();\n skipWhitespace();\n if (pos >= len || input[pos] !== ':') {\n obj[key] = undefined;\n break;\n }\n pos++; // skip :\n const val = parseValue();\n if (val !== undefined) obj[key] = val;\n skipWhitespace();\n if (pos < len && input[pos] === ',') pos++;\n }\n if (pos < len && input[pos] === '}') pos++;\n return obj;\n }\n\n function parseArray(): any[] {\n const arr: any[] = [];\n pos++; // skip [\n skipWhitespace();\n while (pos < len && input[pos] !== ']') {\n const val = parseValue();\n if (val !== undefined) arr.push(val);\n else break; // truncated\n skipWhitespace();\n if (pos < len && input[pos] === ',') pos++;\n skipWhitespace();\n }\n if (pos < len && input[pos] === ']') pos++;\n return arr;\n }\n\n return parseValue();\n}\n\nfunction extractTruncatedJsonPreview(output: string, maxLen: number): string {\n if (!output.startsWith('{') && !output.startsWith('[')) return '';\n\n const parsed = parseTruncatedJson(output);\n if (!parsed || typeof parsed !== 'object') return '';\n\n return formatJsonPreview(parsed, maxLen);\n}\n\n/**\n * Format check inputs from visor.check.input.outputs into a compact summary.\n * Shows which checks provided data: ← {route-intent: {intent, topic}, build-config: {5 keys}}\n */\nfunction formatInputPreview(inputOutputsStr: string, maxLen: number): string {\n if (!inputOutputsStr) return '';\n try {\n const inputs = JSON.parse(inputOutputsStr);\n if (typeof inputs !== 'object' || inputs === null) return '';\n const keys = Object.keys(inputs);\n if (keys.length === 0) return '';\n\n const parts: string[] = [];\n let len = 2;\n for (const key of keys) {\n const val = inputs[key];\n let valStr: string;\n if (typeof val === 'object' && val !== null) {\n const vkeys = Object.keys(val);\n if (vkeys.length <= 3) {\n valStr = `{${vkeys.join(', ')}}`;\n } else {\n valStr = `{${vkeys.slice(0, 2).join(', ')}, ...${vkeys.length} keys}`;\n }\n } else {\n valStr = truncate(String(val), 30);\n }\n const part = `${key}: ${valStr}`;\n if (len + part.length + 2 > maxLen) {\n parts.push('...');\n break;\n }\n parts.push(part);\n len += part.length + 2;\n }\n return `← {${parts.join(', ')}}`;\n } catch {\n return '';\n }\n}\n\n/**\n * Extract the route-intent topic from the span list.\n * Looks for the route-intent check output or classify check output.\n */\nfunction extractRouteIntentTopic(spans: NormalizedSpan[]): string | undefined {\n // Try route-intent check output first\n const riSpan = spans.find(s => s.attributes['visor.check.id'] === 'route-intent');\n if (riSpan) {\n const output = String(riSpan.attributes['visor.check.output'] || '');\n if (output) {\n try {\n const obj = JSON.parse(output);\n if (obj.topic) return truncate(String(obj.topic), 150);\n } catch {}\n }\n }\n // Try classify check output\n const classifySpan = spans.find(s => s.attributes['visor.check.id'] === 'classify');\n if (classifySpan) {\n const output = String(classifySpan.attributes['visor.check.output'] || '');\n if (output) {\n try {\n const obj = JSON.parse(output);\n if (obj.topic) return truncate(String(obj.topic), 150);\n } catch {}\n }\n }\n return undefined;\n}\n\nfunction formatSize(chars: number): string {\n if (chars < 1000) return `${chars} chars`;\n return `${(chars / 1000).toFixed(1)}k chars`;\n}\n\nfunction formatDurationMs(ms: number): string {\n if (ms < 0) return '0ms';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\nfunction truncate(str: string, max: number): string {\n if (typeof str !== 'string') return '';\n if (str.length <= max) return str;\n // Show first and last portions with truncation marker in the middle\n const tail = Math.min(100, Math.floor(max / 3));\n const head = max - tail - 19; // 19 for \" ...[truncated]... \"\n if (head < 10) return str.slice(0, max - 3) + '...';\n return str.slice(0, head) + ' ...[truncated]... ' + str.slice(-tail);\n}\n"],"mappings":"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","names":["hasChildren","errMark"]}
@@ -193,7 +193,8 @@ var require_package = __commonJS({
193
193
  scripts: {
194
194
  "build:cli": "ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo '#!/usr/bin/env node' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js",
195
195
  "build:sdk": "tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk",
196
- build: "./scripts/build-oss.sh",
196
+ build: "npm run build:oss",
197
+ "build:oss": "./scripts/build-oss.sh",
197
198
  "build:ee": "npm run build:cli && npm run build:sdk",
198
199
  test: "jest && npm run test:yaml",
199
200
  "test:unit": "jest",
@@ -279,7 +280,7 @@ var require_package = __commonJS({
279
280
  "@opentelemetry/sdk-node": "^0.203.0",
280
281
  "@opentelemetry/sdk-trace-base": "^1.30.1",
281
282
  "@opentelemetry/semantic-conventions": "^1.30.1",
282
- "@probelabs/probe": "^0.6.0-rc304",
283
+ "@probelabs/probe": "^0.6.0-rc311",
283
284
  "@types/commander": "^2.12.0",
284
285
  "@types/uuid": "^10.0.0",
285
286
  "@utcp/file": "^1.1.0",
@@ -387,4 +388,4 @@ export {
387
388
  init_instance_id,
388
389
  require_package
389
390
  };
390
- //# sourceMappingURL=chunk-MFXPJUUE.mjs.map
391
+ //# sourceMappingURL=chunk-PUHU6UY6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/human-id.ts","../../src/utils/instance-id.ts","../../package.json"],"sourcesContent":["/**\n * Generate human-readable IDs like Kubernetes (e.g., \"happy-panda-7x3k\")\n */\n\nconst adjectives = [\n 'bold',\n 'calm',\n 'cool',\n 'dark',\n 'fast',\n 'gold',\n 'green',\n 'happy',\n 'kind',\n 'loud',\n 'mild',\n 'neat',\n 'nice',\n 'pink',\n 'pure',\n 'quick',\n 'rare',\n 'rich',\n 'safe',\n 'slim',\n 'soft',\n 'tall',\n 'tidy',\n 'tiny',\n 'warm',\n 'wise',\n 'young',\n 'able',\n 'blue',\n 'brave',\n 'busy',\n 'clean',\n 'crisp',\n 'eager',\n 'fair',\n 'fresh',\n 'glad',\n 'grand',\n 'keen',\n 'lush',\n 'prime',\n 'proud',\n 'sharp',\n 'sleek',\n 'smart',\n 'solid',\n 'swift',\n 'vivid',\n 'wild',\n 'witty',\n 'zesty',\n];\n\nconst nouns = [\n 'ant',\n 'bat',\n 'bear',\n 'bee',\n 'bird',\n 'bull',\n 'cat',\n 'cow',\n 'crab',\n 'crow',\n 'deer',\n 'dog',\n 'dove',\n 'duck',\n 'eagle',\n 'elk',\n 'fish',\n 'fox',\n 'frog',\n 'goat',\n 'hawk',\n 'hare',\n 'horse',\n 'jay',\n 'lark',\n 'lion',\n 'lynx',\n 'mole',\n 'moth',\n 'mouse',\n 'newt',\n 'owl',\n 'panda',\n 'pig',\n 'puma',\n 'rat',\n 'raven',\n 'seal',\n 'shark',\n 'sheep',\n 'sloth',\n 'snail',\n 'snake',\n 'spider',\n 'swan',\n 'tiger',\n 'toad',\n 'trout',\n 'viper',\n 'wasp',\n 'whale',\n 'wolf',\n 'wren',\n 'yak',\n 'zebra',\n];\n\n/**\n * Generate a random alphanumeric suffix (4 chars)\n */\nfunction randomSuffix(): string {\n const chars = 'abcdefghjkmnpqrstuvwxyz23456789'; // no i,l,o,0,1 to avoid confusion\n let result = '';\n for (let i = 0; i < 4; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n}\n\n/**\n * Generate a human-readable ID like \"happy-panda-7x3k\"\n */\nexport function generateHumanId(): string {\n const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n const suffix = randomSuffix();\n return `${adj}-${noun}-${suffix}`;\n}\n\n/**\n * Generate a short human-readable ID like \"happy-panda\" (no suffix)\n */\nexport function generateShortHumanId(): string {\n const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n return `${adj}-${noun}`;\n}\n","/**\n * Visor instance ID — unique per process lifetime.\n *\n * Used to identify which visor instance created/owns a task,\n * especially in multi-node environments.\n */\n\nimport { generateHumanId } from './human-id';\n\nlet _instanceId: string | undefined;\n\n/** Get or generate the visor instance ID for this process. */\nexport function getInstanceId(): string {\n if (!_instanceId) {\n _instanceId = generateHumanId();\n }\n return _instanceId;\n}\n","{\n \"name\": \"@probelabs/visor\",\n \"version\": \"0.1.42\",\n \"main\": \"dist/index.js\",\n \"bin\": {\n \"visor\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\"\n },\n \"./sdk\": {\n \"types\": \"./dist/sdk/sdk.d.ts\",\n \"import\": \"./dist/sdk/sdk.mjs\",\n \"require\": \"./dist/sdk/sdk.js\"\n },\n \"./cli\": {\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist/\",\n \"defaults/\",\n \"action.yml\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"scripts\": {\n \"build:cli\": \"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo '#!/usr/bin/env node' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js\",\n \"build:sdk\": \"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk\",\n \"build\": \"npm run build:oss\",\n \"build:oss\": \"./scripts/build-oss.sh\",\n \"build:ee\": \"npm run build:cli && npm run build:sdk\",\n \"test\": \"jest && npm run test:yaml\",\n \"test:unit\": \"jest\",\n \"prepublishOnly\": \"npm run build\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"test:ee\": \"jest --testPathPatterns='tests/ee' --testPathIgnorePatterns='/node_modules/' --no-coverage\",\n \"test:manual:bash\": \"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts\",\n \"lint\": \"eslint src tests --ext .ts\",\n \"lint:fix\": \"eslint src tests --ext .ts --fix\",\n \"format\": \"prettier --write src tests\",\n \"format:check\": \"prettier --check src tests\",\n \"clean\": \"\",\n \"clean:traces\": \"node scripts/clean-traces.js\",\n \"prebuild\": \"npm run clean && node scripts/generate-config-schema.js\",\n \"pretest\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"pretest:unit\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"test:with-build\": \"npm run build:cli && jest\",\n \"test:yaml\": \"node dist/index.js test --progress compact\",\n \"test:yaml:parallel\": \"node dist/index.js test --progress compact --max-parallel 4\",\n \"prepare\": \"husky\",\n \"pre-commit\": \"lint-staged\",\n \"deploy:site\": \"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true\",\n \"deploy:worker\": \"npx wrangler deploy\",\n \"deploy\": \"npm run deploy:site && npm run deploy:worker\",\n \"publish:ee\": \"./scripts/publish-ee.sh\",\n \"release\": \"./scripts/release.sh\",\n \"release:patch\": \"./scripts/release.sh patch\",\n \"release:minor\": \"./scripts/release.sh minor\",\n \"release:major\": \"./scripts/release.sh major\",\n \"release:prerelease\": \"./scripts/release.sh prerelease\",\n \"docs:validate\": \"node scripts/validate-readme-links.js\",\n \"workshop:setup\": \"npm install -D reveal-md@6.1.2\",\n \"workshop:serve\": \"cd workshop && reveal-md slides.md -w\",\n \"workshop:export\": \"reveal-md workshop/slides.md --static workshop/build\",\n \"workshop:pdf\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter\",\n \"workshop:pdf:ci\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\\"--no-sandbox --disable-dev-shm-usage\\\"\",\n \"workshop:pdf:a4\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4\",\n \"workshop:build\": \"npm run workshop:export && npm run workshop:pdf\",\n \"simulate:issue\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug\",\n \"simulate:comment\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug\"\n },\n \"keywords\": [\n \"code-review\",\n \"ai\",\n \"github-action\",\n \"cli\",\n \"pr-review\",\n \"visor\"\n ],\n \"author\": \"Probe Labs\",\n \"license\": \"MIT\",\n \"description\": \"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/probelabs/visor.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/probelabs/visor/issues\"\n },\n \"homepage\": \"https://github.com/probelabs/visor#readme\",\n \"dependencies\": {\n \"@actions/core\": \"^1.11.1\",\n \"@apidevtools/swagger-parser\": \"^12.1.0\",\n \"@grammyjs/runner\": \"^2.0.3\",\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n \"@nyariv/sandboxjs\": \"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108\",\n \"@octokit/action\": \"^8.0.2\",\n \"@octokit/auth-app\": \"^8.1.0\",\n \"@octokit/core\": \"^7.0.3\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.203.0\",\n \"@opentelemetry/core\": \"^1.30.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/instrumentation\": \"^0.203.0\",\n \"@opentelemetry/resources\": \"^1.30.1\",\n \"@opentelemetry/sdk-logs\": \"^0.203.0\",\n \"@opentelemetry/sdk-metrics\": \"^1.30.1\",\n \"@opentelemetry/sdk-node\": \"^0.203.0\",\n \"@opentelemetry/sdk-trace-base\": \"^1.30.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.30.1\",\n \"@probelabs/probe\": \"^0.6.0-rc311\",\n \"@types/commander\": \"^2.12.0\",\n \"@types/uuid\": \"^10.0.0\",\n \"@utcp/file\": \"^1.1.0\",\n \"@utcp/http\": \"^1.1.0\",\n \"@utcp/sdk\": \"^1.1.0\",\n \"@utcp/text\": \"^1.1.0\",\n \"acorn\": \"^8.16.0\",\n \"acorn-walk\": \"^8.3.5\",\n \"ajv\": \"^8.17.1\",\n \"ajv-formats\": \"^3.0.1\",\n \"better-sqlite3\": \"^11.0.0\",\n \"blessed\": \"^0.1.81\",\n \"botbuilder\": \"^4.23.3\",\n \"botframework-connector\": \"^4.23.3\",\n \"cli-table3\": \"^0.6.5\",\n \"commander\": \"^14.0.0\",\n \"deepmerge\": \"^4.3.1\",\n \"dotenv\": \"^17.2.3\",\n \"grammy\": \"^1.41.1\",\n \"ignore\": \"^7.0.5\",\n \"imapflow\": \"^1.2.12\",\n \"js-yaml\": \"^4.1.0\",\n \"jsonpath-plus\": \"^10.4.0\",\n \"liquidjs\": \"^10.21.1\",\n \"mailparser\": \"^3.9.3\",\n \"minimatch\": \"^10.2.2\",\n \"node-cron\": \"^3.0.3\",\n \"nodemailer\": \"^8.0.1\",\n \"open\": \"^9.1.0\",\n \"resend\": \"^6.9.3\",\n \"simple-git\": \"^3.28.0\",\n \"uuid\": \"^11.1.0\",\n \"ws\": \"^8.18.3\"\n },\n \"optionalDependencies\": {\n \"@anthropic/claude-code-sdk\": \"npm:null@*\",\n \"@open-policy-agent/opa-wasm\": \"^1.10.0\",\n \"knex\": \"^3.1.0\",\n \"mysql2\": \"^3.11.0\",\n \"pg\": \"^8.13.0\",\n \"tedious\": \"^19.0.0\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.34.0\",\n \"@kie/act-js\": \"^2.6.2\",\n \"@kie/mock-github\": \"^2.0.1\",\n \"@swc/core\": \"^1.13.2\",\n \"@swc/jest\": \"^0.2.37\",\n \"@types/better-sqlite3\": \"^7.6.0\",\n \"@types/blessed\": \"^0.1.27\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/mailparser\": \"^3.4.6\",\n \"@types/node\": \"^24.3.0\",\n \"@types/node-cron\": \"^3.0.11\",\n \"@types/nodemailer\": \"^7.0.11\",\n \"@types/ws\": \"^8.18.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.42.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@vercel/ncc\": \"^0.38.4\",\n \"eslint\": \"^9.34.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^30.1.3\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"reveal-md\": \"^6.1.2\",\n \"ts-json-schema-generator\": \"^1.5.1\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.2\",\n \"wrangler\": \"^3.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic/claude-code-sdk\": {\n \"optional\": true\n }\n },\n \"directories\": {\n \"test\": \"tests\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"tests/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"*.{json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n }\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  getInstanceId,
3
3
  init_instance_id,
4
4
  require_package
5
- } from "./chunk-G7GSN3SK.mjs";
5
+ } from "./chunk-PUHU6UY6.mjs";
6
6
  import {
7
7
  init_metrics,
8
8
  metrics_exports
@@ -1147,4 +1147,4 @@ export {
1147
1147
  trace_helpers_exports,
1148
1148
  init_trace_helpers
1149
1149
  };
1150
- //# sourceMappingURL=chunk-XOAEKFKB.mjs.map
1150
+ //# sourceMappingURL=chunk-QLT42TX7.mjs.map