@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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/providers/check-provider.interface.ts","../../src/utils/env-resolver.ts","../../src/utils/issue-normalizer.ts","../../src/utils/env-exposure.ts","../../src/providers/utcp-check-provider.ts"],"sourcesContent":["import { PRInfo } from '../pr-analyzer';\nimport { ReviewSummary } from '../reviewer';\nimport { EnvConfig, HumanInputRequest } from '../types/config';\n\n/**\n * Configuration for a check provider\n */\nexport interface CheckProviderConfig {\n type: string;\n prompt?: string;\n eventContext?: Record<string, unknown>;\n focus?: string;\n command?: string; // For PR comment triggers\n exec?: string; // For command execution (supports Liquid templates)\n stdin?: string; // Optional stdin input (supports Liquid templates)\n args?: string[] | Record<string, unknown>; // string[] deprecated for command args; Record for workflow inputs\n command_args?: string[]; // MCP stdio command arguments\n interpreter?: string;\n url?: string;\n method?: string;\n headers?: Record<string, string>;\n timeout?: number;\n metadata?: Record<string, unknown>;\n workingDirectory?: string;\n env?: EnvConfig;\n ai?: import('../types/config').AIProviderConfig;\n /** AI model to use for this check - overrides global setting */\n ai_model?: string;\n /** AI provider to use for this check - overrides global setting */\n ai_provider?: 'google' | 'anthropic' | 'openai' | string;\n /** Check name for sessionID and logging purposes */\n checkName?: string;\n /** Session ID for AI session management */\n sessionId?: string;\n /** Script content for 'script' provider */\n content?: string;\n [key: string]: unknown;\n}\n\n/**\n * Execution context passed to check providers\n */\nexport interface ExecutionContext {\n /** Session information for AI session reuse */\n parentSessionId?: string;\n reuseSession?: boolean;\n /** CLI message value (from --message argument) */\n cliMessage?: string;\n /** Conversation context - unified access to user message across transports (CLI, Slack, etc.) */\n conversation?: import('../types/bot').ConversationContext;\n /**\n * Stage-local baseline of output history lengths per check name.\n * When present, providers should expose an `outputs_history_stage` object in\n * Liquid/JS contexts that slices the global history from this baseline.\n * This enables stage-scoped assertions in the YAML test runner without\n * relying on global execution history.\n */\n stageHistoryBase?: Record<string, number>;\n /** Workflow inputs - available when executing within a workflow */\n workflowInputs?: Record<string, unknown>;\n /** Custom arguments passed from on_init 'with' directive */\n args?: Record<string, unknown>;\n /** SDK hooks for human input and check completion */\n hooks?: {\n onHumanInput?: (request: HumanInputRequest) => Promise<string>;\n onPromptCaptured?: (info: { step: string; provider: string; prompt: string }) => void;\n mockForStep?: (step: string) => unknown | undefined;\n /** Returns true if the mock for a step has been consumed (for loop termination) */\n isMockExhausted?: (step: string) => boolean;\n /** Called when a check completes - useful for streaming TUI updates */\n onCheckComplete?: (info: {\n checkId: string;\n result: { output?: unknown; content?: string };\n checkConfig?: { type?: string; group?: string; criticality?: string; schema?: unknown };\n }) => void;\n };\n /**\n * Optional execution mode hints. The core engine does not read environment\n * variables directly; callers (CLI, test runner) can set these flags to\n * request certain behaviors without polluting core logic with test-specific\n * branches.\n */\n mode?: {\n /** true when running under the YAML test runner */\n test?: boolean;\n /** post review comments from grouped execution paths (used by tests) */\n postGroupedComments?: boolean;\n /** reset per-run guard state before grouped execution */\n resetPerRunState?: boolean;\n };\n /**\n * Absolute timestamp (ms since epoch) by which this execution must complete.\n * Set by the engine from `Date.now() + timeout` and inherited by sub-workflows\n * so nested steps know how much time the parent has left.\n */\n deadline?: number;\n /** Optional event bus for emitting integration events (e.g., HumanInputRequested) */\n eventBus?: import('../event-bus/event-bus').EventBus;\n /** Optional webhook context (e.g., Slack Events API payload) */\n webhookContext?: { webhookData?: Map<string, unknown>; eventType?: string };\n /**\n * Callback for capturing AI responses - used by scheduler to store previousResponse\n * for recurring reminders. The text passed is the AI response before mrkdwn formatting.\n */\n responseCapture?: (text: string) => void;\n}\n\n/**\n * Abstract base class for all check providers\n * Implementing classes provide specific check functionality (AI, tool, script, etc.)\n */\nexport abstract class CheckProvider {\n /**\n * Get the unique name/type of this provider\n */\n abstract getName(): string;\n\n /**\n * Get a human-readable description of this provider\n */\n abstract getDescription(): string;\n\n /**\n * Validate provider-specific configuration\n * @param config The configuration to validate\n * @returns true if configuration is valid, false otherwise\n */\n abstract validateConfig(config: unknown): Promise<boolean>;\n\n /**\n * Execute the check on the given PR information\n * @param prInfo Information about the pull request\n * @param config Provider-specific configuration\n * @param dependencyResults Optional results from dependency checks that this check depends on\n * @param context Optional execution context with session info, hooks, and CLI state\n * @returns Review summary with scores, issues, and comments\n */\n abstract execute(\n prInfo: PRInfo,\n config: CheckProviderConfig,\n dependencyResults?: Map<string, ReviewSummary>,\n context?: ExecutionContext\n ): Promise<ReviewSummary>;\n\n /**\n * Get the list of configuration keys this provider supports\n * Used for documentation and validation\n */\n abstract getSupportedConfigKeys(): string[];\n\n /**\n * Check if this provider is available (e.g., has required API keys)\n * @returns true if provider can be used, false otherwise\n */\n abstract isAvailable(): Promise<boolean>;\n\n /**\n * Get provider requirements (e.g., environment variables needed)\n */\n abstract getRequirements(): string[];\n\n /**\n * Set webhook context for providers that need access to webhook data\n * This is optional and only used by http_input providers\n * @param webhookContext Map of endpoint paths to webhook data\n */\n setWebhookContext?(webhookContext: Map<string, unknown>): void;\n}\n","/**\n * Environment variable resolution utilities\n * Supports GitHub Actions-like syntax for referencing environment variables\n */\n\nimport { EnvConfig } from '../types/config';\n\n/**\n * Resolves environment variables in configuration values\n * Supports the following syntaxes:\n * - ${{ env.VARIABLE_NAME }} (GitHub Actions style)\n * - ${VARIABLE_NAME} (shell style)\n * - $VARIABLE_NAME (simple shell style)\n * - Direct environment variable names\n */\nexport class EnvironmentResolver {\n /**\n * Resolves a single configuration value that may contain environment variable references\n */\n static resolveValue(value: string | number | boolean): string | number | boolean {\n if (typeof value !== 'string') {\n return value;\n }\n\n // GitHub Actions style: ${{ env.VARIABLE_NAME }}\n let resolved = value.replace(/\\$\\{\\{\\s*env\\.([A-Z_][A-Z0-9_]*)\\s*\\}\\}/g, (match, envVar) => {\n return process.env[envVar] || match;\n });\n\n // Shell style: ${VARIABLE_NAME}\n resolved = resolved.replace(/\\$\\{([A-Z_][A-Z0-9_]*)\\}/g, (match, envVar) => {\n return process.env[envVar] || match;\n });\n\n // Simple shell style: $VARIABLE_NAME\n resolved = resolved.replace(/\\$([A-Z_][A-Z0-9_]*)/g, (match, envVar) => {\n return process.env[envVar] || match;\n });\n\n return resolved;\n }\n\n /**\n * Resolves all environment variables in an EnvConfig object\n */\n static resolveEnvConfig(envConfig: EnvConfig): EnvConfig {\n const resolved: EnvConfig = {};\n\n for (const [key, value] of Object.entries(envConfig)) {\n resolved[key] = this.resolveValue(value);\n }\n\n return resolved;\n }\n\n /**\n * Applies environment configuration to the process environment\n * This allows checks to access their specific environment variables\n */\n static applyEnvConfig(envConfig: EnvConfig): void {\n const resolved = this.resolveEnvConfig(envConfig);\n\n for (const [key, value] of Object.entries(resolved)) {\n if (value !== undefined) {\n process.env[key] = String(value);\n }\n }\n }\n\n /**\n * Creates a temporary environment for a specific check execution\n * Returns a cleanup function to restore the original environment\n */\n static withTemporaryEnv<T>(envConfig: EnvConfig, callback: () => T | Promise<T>): T | Promise<T> {\n const resolved = this.resolveEnvConfig(envConfig);\n const originalValues: Record<string, string | undefined> = {};\n\n // Store original values and apply new ones\n for (const [key, value] of Object.entries(resolved)) {\n originalValues[key] = process.env[key];\n if (value !== undefined) {\n process.env[key] = String(value);\n }\n }\n\n try {\n const result = callback();\n\n // If callback returns a promise, handle cleanup after it resolves\n if (result instanceof Promise) {\n return result.finally(() => {\n // Restore original values\n for (const [key, originalValue] of Object.entries(originalValues)) {\n if (originalValue === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = originalValue;\n }\n }\n });\n }\n\n // Restore original values immediately for sync callbacks\n for (const [key, originalValue] of Object.entries(originalValues)) {\n if (originalValue === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = originalValue;\n }\n }\n\n return result;\n } catch (error) {\n // Restore original values on error\n for (const [key, originalValue] of Object.entries(originalValues)) {\n if (originalValue === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = originalValue;\n }\n }\n throw error;\n }\n }\n\n /**\n * Validates that all required environment variables are available\n */\n static validateRequiredEnvVars(envConfig: EnvConfig, requiredVars: string[]): string[] {\n const resolved = this.resolveEnvConfig(envConfig);\n const missing: string[] = [];\n\n for (const varName of requiredVars) {\n const value = resolved[varName] || process.env[varName];\n if (!value) {\n missing.push(varName);\n }\n }\n\n return missing;\n }\n\n /**\n * Resolves environment variables in HTTP headers\n * Each header value is processed through resolveValue to replace env var references\n */\n static resolveHeaders(headers: Record<string, string>): Record<string, string> {\n const resolved: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n resolved[key] = String(this.resolveValue(value));\n }\n return resolved;\n }\n\n /**\n * Sanitizes headers for logging/telemetry by redacting sensitive values\n * Headers like Authorization, API keys, and cookies are replaced with [REDACTED]\n */\n static sanitizeHeaders(headers: Record<string, string>): Record<string, string> {\n const sensitiveHeaders = ['authorization', 'x-api-key', 'cookie', 'set-cookie'];\n const sanitized: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(headers)) {\n if (sensitiveHeaders.includes(key.toLowerCase())) {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n }\n}\n","/**\n * Shared issue normalization utilities.\n *\n * Used by MCP, UTCP, and command providers to extract and normalize\n * ReviewIssue objects from tool/command output.\n */\nimport { ReviewIssue } from '../reviewer';\n\n/**\n * Extract issues from tool output.\n * Handles: JSON strings, arrays of issues, objects with `issues` property, single issue objects.\n */\nexport function extractIssuesFromOutput(\n output: unknown,\n defaultRuleId?: string\n): { issues: ReviewIssue[]; remainingOutput: unknown } | null {\n if (output === null || output === undefined) {\n return null;\n }\n\n // If output is a string, try to parse as JSON\n if (typeof output === 'string') {\n try {\n const parsed = JSON.parse(output);\n return extractIssuesFromOutput(parsed, defaultRuleId);\n } catch {\n return null;\n }\n }\n\n // If output is an array of issues\n if (Array.isArray(output)) {\n const issues = normalizeIssueArray(output, defaultRuleId);\n if (issues) {\n return { issues, remainingOutput: undefined };\n }\n return null;\n }\n\n // If output is an object with issues property\n if (typeof output === 'object') {\n const record = output as Record<string, unknown>;\n\n if (Array.isArray(record.issues)) {\n const issues = normalizeIssueArray(record.issues, defaultRuleId);\n if (!issues) {\n return null;\n }\n\n const remaining = { ...record };\n delete (remaining as { issues?: unknown }).issues;\n\n return {\n issues,\n remainingOutput: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n }\n\n // Check if output itself is a single issue\n const singleIssue = normalizeIssue(record, defaultRuleId);\n if (singleIssue) {\n return { issues: [singleIssue], remainingOutput: undefined };\n }\n }\n\n return null;\n}\n\n/**\n * Normalize an array of issues. Returns null if any element cannot be normalized.\n */\nexport function normalizeIssueArray(\n values: unknown[],\n defaultRuleId?: string\n): ReviewIssue[] | null {\n const normalized: ReviewIssue[] = [];\n for (const value of values) {\n const issue = normalizeIssue(value, defaultRuleId);\n if (!issue) {\n return null;\n }\n normalized.push(issue);\n }\n return normalized;\n}\n\n/**\n * Normalize a single issue from raw data.\n * Accepts various field aliases (message/text/description, severity/level/priority, etc.)\n */\nexport function normalizeIssue(raw: unknown, defaultRuleId = 'tool'): ReviewIssue | null {\n if (!raw || typeof raw !== 'object') {\n return null;\n }\n\n const data = raw as Record<string, unknown>;\n\n // Only accept string values for issue message fields.\n // Non-string values (e.g. Slack's `message: {text: \"...\", ...}` object)\n // must not be coerced — they are API payloads, not issue descriptions.\n const rawMessage = data.message || data.text || data.description || data.summary;\n if (typeof rawMessage !== 'string') {\n return null;\n }\n const message = rawMessage.trim();\n if (!message) {\n return null;\n }\n\n const allowedSeverities = new Set(['info', 'warning', 'error', 'critical']);\n const severityRaw = toTrimmedString(data.severity || data.level || data.priority);\n let severity: ReviewIssue['severity'] = 'warning';\n if (severityRaw) {\n const lower = severityRaw.toLowerCase();\n if (allowedSeverities.has(lower)) {\n severity = lower as ReviewIssue['severity'];\n }\n }\n\n const allowedCategories = new Set(['security', 'performance', 'style', 'logic', 'documentation']);\n const categoryRaw = toTrimmedString(data.category || data.type || data.group);\n let category: ReviewIssue['category'] = 'logic';\n if (categoryRaw && allowedCategories.has(categoryRaw.toLowerCase())) {\n category = categoryRaw.toLowerCase() as ReviewIssue['category'];\n }\n\n const file = toTrimmedString(data.file || data.path || data.filename) || 'system';\n const line = toNumber(data.line || data.startLine || data.lineNumber) ?? 0;\n const endLine = toNumber(data.endLine || data.end_line || data.stopLine);\n const suggestion = toTrimmedString(data.suggestion);\n const replacement = toTrimmedString(data.replacement);\n const ruleId =\n toTrimmedString(data.ruleId || data.rule || data.id || data.check) || defaultRuleId;\n\n return {\n file,\n line,\n endLine: endLine ?? undefined,\n ruleId,\n message,\n severity,\n category,\n suggestion: suggestion || undefined,\n replacement: replacement || undefined,\n };\n}\n\nexport function toTrimmedString(value: unknown): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (value !== null && value !== undefined && typeof value.toString === 'function') {\n const converted = String(value).trim();\n return converted.length > 0 ? converted : null;\n }\n return null;\n}\n\nexport function toNumber(value: unknown): number | null {\n if (value === null || value === undefined) {\n return null;\n }\n const num = Number(value);\n if (Number.isFinite(num)) {\n return Math.trunc(num);\n }\n return null;\n}\n","export type EnvMap = Record<string, string>;\n\n// Default: expose all env vars except a conservative denylist.\n// If VISOR_ALLOW_ENV is set and not '*', restrict to that allowlist.\n// VISOR_DENY_ENV can further mask exact keys or prefix* patterns.\nexport function buildSandboxEnv(input: NodeJS.ProcessEnv): EnvMap {\n const denyDefaults = [\n 'GITHUB_TOKEN',\n 'INPUT_GITHUB-TOKEN',\n 'ACTIONS_RUNTIME_TOKEN',\n 'ACTIONS_ID_TOKEN_REQUEST_TOKEN',\n 'AWS_ACCESS_KEY_ID',\n 'AWS_SECRET_ACCESS_KEY',\n 'AWS_SESSION_TOKEN',\n 'AZURE_CLIENT_SECRET',\n 'GOOGLE_APPLICATION_CREDENTIALS',\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'HUGGINGFACE_API_KEY',\n 'CLAUDE_CODE_API_KEY',\n 'PROBE_API_KEY',\n ];\n\n const denyExtra = (input.VISOR_DENY_ENV || '')\n .split(',')\n .map(s => s.trim())\n .filter(Boolean);\n const deny = Array.from(new Set([...denyDefaults, ...denyExtra]));\n const allowSpec = (input.VISOR_ALLOW_ENV || '*').trim();\n\n const denyMatch = (key: string): boolean => {\n for (const pat of deny) {\n if (!pat) continue;\n if (pat.endsWith('*')) {\n const prefix = pat.slice(0, -1);\n if (key.startsWith(prefix)) return true;\n } else if (key === pat) {\n return true;\n }\n }\n if (/(_TOKEN|_SECRET|_PASSWORD|_PRIVATE_KEY)$/i.test(key)) return true;\n return false;\n };\n\n const out: EnvMap = {};\n if (allowSpec !== '*') {\n const allow = allowSpec\n .split(',')\n .map(s => s.trim())\n .filter(Boolean);\n for (const key of allow) {\n const val = input[key];\n if (key && val !== undefined && !denyMatch(key)) out[key] = String(val);\n }\n return out;\n }\n\n for (const [k, v] of Object.entries(input)) {\n if (v === undefined || v === null) continue;\n if (denyMatch(k)) continue;\n out[k] = String(v);\n }\n return out;\n}\n","import { CheckProvider, CheckProviderConfig } from './check-provider.interface';\nimport { PRInfo } from '../pr-analyzer';\nimport { ReviewSummary, ReviewIssue } from '../reviewer';\nimport { logger } from '../logger';\nimport { Liquid } from 'liquidjs';\nimport { createExtendedLiquid } from '../liquid-extensions';\nimport Sandbox from '@nyariv/sandboxjs';\nimport { createSecureSandbox, compileAndRun } from '../utils/sandbox';\nimport { EnvironmentResolver } from '../utils/env-resolver';\nimport { extractIssuesFromOutput } from '../utils/issue-normalizer';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * UTCP Check Provider Configuration\n */\nexport interface UtcpCheckConfig extends CheckProviderConfig {\n /** UTCP manual source: URL string, file path string, or inline call template object */\n manual: string | Record<string, unknown>;\n /** Tool method name to call (format: manual_name.tool_name or just tool_name) */\n method: string;\n /** Arguments to pass to the UTCP tool (supports Liquid templates) */\n methodArgs?: Record<string, unknown>;\n /** Transform template for method arguments (Liquid) - overrides methodArgs */\n argsTransform?: string;\n /** UTCP variables for manual authentication/configuration */\n variables?: Record<string, string>;\n /** UTCP plugins to load (default: ['http']) */\n plugins?: string[];\n /** Transform template for output (Liquid) */\n transform?: string;\n /** Transform using JavaScript expressions */\n transform_js?: string;\n /** Timeout in seconds (default: 60) */\n timeout?: number;\n}\n\n/**\n * Check provider that calls UTCP (Universal Tool Calling Protocol) tools directly.\n * UTCP is a client-side protocol where tools publish JSON \"manuals\" describing\n * how to call them via their native protocols (HTTP, CLI, SSE, etc.).\n *\n * Supports manual discovery from:\n * - HTTP/HTTPS URLs (GET endpoint returning UTCP manual)\n * - Local JSON files\n * - Inline call template objects\n */\nexport class UtcpCheckProvider extends CheckProvider {\n private liquid: Liquid;\n private sandbox?: Sandbox;\n private sdkAvailable: boolean | null = null;\n\n constructor() {\n super();\n this.liquid = createExtendedLiquid({\n cache: false,\n strictFilters: false,\n strictVariables: false,\n });\n }\n\n getName(): string {\n return 'utcp';\n }\n\n getDescription(): string {\n return 'Call UTCP tools directly using their native protocols (HTTP, CLI, SSE)';\n }\n\n async validateConfig(config: unknown): Promise<boolean> {\n if (!config || typeof config !== 'object') {\n return false;\n }\n\n const cfg = config as UtcpCheckConfig;\n\n // Type must be utcp\n if (cfg.type !== 'utcp') {\n return false;\n }\n\n // Manual is required\n if (!cfg.manual) {\n logger.error('UTCP check requires a manual (URL, file path, or inline call template)');\n return false;\n }\n\n // Method is required\n if (!cfg.method || typeof cfg.method !== 'string') {\n logger.error('UTCP check requires a method name');\n return false;\n }\n\n // Validate manual format\n if (typeof cfg.manual === 'string') {\n // URL validation\n if (cfg.manual.startsWith('http://') || cfg.manual.startsWith('https://')) {\n try {\n const parsedUrl = new URL(cfg.manual);\n if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {\n logger.error(`Invalid URL protocol for UTCP manual: ${parsedUrl.protocol}`);\n return false;\n }\n } catch {\n logger.error(`Invalid URL format for UTCP manual: ${cfg.manual}`);\n return false;\n }\n }\n // File paths are validated at execution time\n } else if (typeof cfg.manual === 'object') {\n // Inline call template must have call_template_type\n if (!cfg.manual.call_template_type) {\n logger.error('Inline UTCP manual must have call_template_type');\n return false;\n }\n } else {\n logger.error('UTCP manual must be a URL string, file path, or inline call template object');\n return false;\n }\n\n return true;\n }\n\n async execute(\n prInfo: PRInfo,\n config: CheckProviderConfig,\n dependencyResults?: Map<string, ReviewSummary>,\n sessionInfo?: any\n ): Promise<ReviewSummary> {\n const cfg = config as UtcpCheckConfig;\n\n // Test hook: mock output for this step\n try {\n const stepName = (config as any).checkName || 'unknown';\n const mock = sessionInfo?.hooks?.mockForStep?.(String(stepName));\n if (mock !== undefined) {\n const ms = mock as any;\n const issuesArr = Array.isArray(ms?.issues) ? (ms.issues as any[]) : [];\n const out = ms && typeof ms === 'object' && 'output' in ms ? ms.output : ms;\n return {\n issues: issuesArr,\n ...(out !== undefined ? { output: out } : {}),\n } as ReviewSummary;\n }\n } catch {}\n\n try {\n // Build template context\n const templateContext = {\n pr: {\n number: prInfo.number,\n title: prInfo.title,\n author: prInfo.author,\n branch: prInfo.head,\n base: prInfo.base,\n },\n files: prInfo.files,\n fileCount: prInfo.files.length,\n outputs: this.buildOutputContext(dependencyResults),\n args: sessionInfo?.args || {},\n env: this.getSafeEnvironmentVariables(),\n inputs: (config as any).workflowInputs || sessionInfo?.workflowInputs || {},\n };\n\n // Render method arguments\n let methodArgs = cfg.methodArgs || {};\n if (cfg.argsTransform) {\n const rendered = await this.liquid.parseAndRender(cfg.argsTransform, templateContext);\n try {\n methodArgs = JSON.parse(rendered);\n } catch (error) {\n logger.error(`Failed to parse argsTransform as JSON: ${error}`);\n return {\n issues: [\n {\n file: 'utcp',\n line: 0,\n ruleId: 'utcp/args_transform_error',\n message: `Failed to parse argsTransform: ${error instanceof Error ? error.message : 'Unknown error'}`,\n severity: 'error',\n category: 'logic',\n },\n ],\n };\n }\n } else if (methodArgs && typeof methodArgs === 'object') {\n // Recursively render Liquid templates in methodArgs\n const renderValue = async (val: unknown): Promise<unknown> => {\n if (typeof val === 'string' && (val.includes('{{') || val.includes('{%'))) {\n return await this.liquid.parseAndRender(val, templateContext);\n } else if (val && typeof val === 'object' && !Array.isArray(val)) {\n const rendered: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(val)) {\n rendered[k] = await renderValue(v);\n }\n return rendered;\n } else if (Array.isArray(val)) {\n return Promise.all(val.map(item => renderValue(item)));\n }\n return val;\n };\n methodArgs = (await renderValue(methodArgs)) as Record<string, unknown>;\n }\n\n // Resolve variables through environment resolver\n const resolvedVariables: Record<string, string> = {};\n if (cfg.variables) {\n for (const [key, value] of Object.entries(cfg.variables)) {\n resolvedVariables[key] = String(EnvironmentResolver.resolveValue(value));\n }\n }\n\n // Call tool via shared static method (handles SDK import, client lifecycle, timeout)\n const result = await UtcpCheckProvider.callTool(cfg.manual, cfg.method, methodArgs, {\n variables: resolvedVariables,\n plugins: cfg.plugins || ['http'],\n timeoutMs: (cfg.timeout || 60) * 1000,\n });\n\n {\n // Apply transforms\n let finalOutput = result;\n\n // Apply Liquid transform\n if (cfg.transform) {\n try {\n const transformContext = {\n ...templateContext,\n output: result,\n };\n const rendered = await this.liquid.parseAndRender(cfg.transform, transformContext);\n try {\n finalOutput = JSON.parse(rendered.trim());\n } catch {\n finalOutput = rendered.trim();\n }\n } catch (error) {\n logger.error(`Failed to apply Liquid transform: ${error}`);\n // Throw to let the outer finally close the client before returning\n throw new Error(\n `Failed to apply transform: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Apply JavaScript transform\n if (cfg.transform_js) {\n try {\n this.sandbox = createSecureSandbox();\n const scope = {\n output: finalOutput,\n pr: templateContext.pr,\n files: templateContext.files,\n outputs: templateContext.outputs,\n env: templateContext.env,\n };\n finalOutput = compileAndRun<unknown>(\n this.sandbox,\n `return (${cfg.transform_js});`,\n scope,\n { injectLog: true, wrapFunction: false, logPrefix: '[utcp:transform_js]' }\n );\n } catch (error) {\n logger.error(`Failed to apply JavaScript transform: ${error}`);\n // Throw to let the outer finally close the client before returning\n throw new Error(\n `Failed to apply JavaScript transform: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Extract issues from output\n const extracted = extractIssuesFromOutput(finalOutput, 'utcp');\n if (extracted) {\n return {\n issues: extracted.issues,\n ...(extracted.remainingOutput ? { output: extracted.remainingOutput } : {}),\n } as ReviewSummary;\n }\n\n // Return output directly\n return {\n issues: [],\n ...(finalOutput ? { output: finalOutput } : {}),\n } as ReviewSummary;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n const isTimeout = this.isTimeoutError(error);\n const severity: ReviewIssue['severity'] = isTimeout ? 'warning' : 'error';\n const ruleId = isTimeout ? 'utcp/timeout' : 'utcp/execution_error';\n\n if (isTimeout) {\n logger.warn(`UTCP check timed out: ${errorMessage}`);\n } else {\n logger.error(`UTCP check failed: ${errorMessage}`);\n }\n\n return {\n issues: [\n {\n file: 'utcp',\n line: 0,\n ruleId,\n message: isTimeout\n ? `UTCP check timed out: ${errorMessage}`\n : `UTCP check failed: ${errorMessage}`,\n severity,\n category: 'logic',\n },\n ],\n };\n }\n }\n\n /**\n * Resolve manual config to a UTCP call template object.\n * Shared utility used by both the standalone UTCP provider and the AI check provider's UTCP-to-MCP bridge.\n */\n static async resolveManualCallTemplate(\n manual: string | Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n if (typeof manual === 'object') {\n if (!manual.call_template_type) {\n throw new Error('Inline manual must have call_template_type');\n }\n // Ensure it has a name\n if (!manual.name) {\n manual.name = 'inline';\n }\n return manual;\n }\n\n // URL-based discovery\n if (manual.startsWith('http://') || manual.startsWith('https://')) {\n return {\n name: UtcpCheckProvider.deriveManualName(manual),\n call_template_type: 'http',\n url: manual,\n http_method: 'GET',\n };\n }\n\n // File-based discovery\n\n // Security: reject null bytes that could bypass path validation\n if (manual.includes('\\0')) {\n throw new Error('Invalid UTCP manual path: null bytes are not allowed');\n }\n\n const resolvedPath = path.resolve(manual);\n\n // Security: ensure resolved path stays within cwd (prevent path traversal)\n const cwd = path.resolve(process.cwd());\n const normalizedResolved = path.normalize(resolvedPath);\n const cwdPrefix = cwd.endsWith(path.sep) ? cwd : cwd + path.sep;\n if (normalizedResolved !== cwd && !normalizedResolved.startsWith(cwdPrefix)) {\n throw new Error(\n `Path traversal detected: \"${manual}\" resolves outside the project directory. ` +\n `UTCP manual paths must be within the project directory.`\n );\n }\n\n // Security: resolve symlinks and re-validate to prevent symlink attacks\n if (fs.existsSync(resolvedPath)) {\n const realPath = fs.realpathSync(resolvedPath);\n if (realPath !== cwd && !realPath.startsWith(cwdPrefix)) {\n throw new Error(\n `Symlink traversal detected: \"${manual}\" points outside the project directory via symlink.`\n );\n }\n }\n\n // Validate file exists and is readable\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`UTCP manual file not found: ${resolvedPath}`);\n }\n\n // Read and parse the file\n let content: string;\n try {\n content = fs.readFileSync(resolvedPath, 'utf-8');\n } catch (err) {\n throw new Error(\n `Failed to read UTCP manual file: ${resolvedPath}: ${err instanceof Error ? err.message : 'Unknown error'}`\n );\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content);\n } catch (err) {\n throw new Error(\n `Failed to parse UTCP manual file as JSON: ${resolvedPath}: ${err instanceof Error ? err.message : 'Unknown error'}`\n );\n }\n\n if (parsed.call_template_type) {\n // File contains a call template directly - use as-is\n if (!parsed.name) {\n parsed.name = path.basename(resolvedPath, path.extname(resolvedPath));\n }\n return parsed;\n }\n\n // File contains a UTCP manual - use file call template to let SDK handle it\n // Load the file plugin for file-based manuals\n try {\n await import('@utcp/file');\n } catch {\n logger.debug('UTCP @utcp/file plugin not available, attempting direct parse');\n }\n\n return {\n name: parsed.name || path.basename(resolvedPath, path.extname(resolvedPath)),\n call_template_type: 'file',\n file_path: resolvedPath,\n allowed_communication_protocols: ['file', 'http', 'https'],\n };\n }\n\n /**\n * Derive a manual name from a URL.\n * Shared utility for UTCP manual name derivation.\n */\n static deriveManualName(url: string): string {\n try {\n const parsed = new URL(url);\n // Use hostname with dots replaced by underscores\n return parsed.hostname.replace(/\\./g, '_').replace(/-/g, '_');\n } catch {\n return 'utcp_manual';\n }\n }\n\n /**\n * Call a UTCP tool directly. Shared by both the standalone provider and the MCP-bridge SSE server.\n * Handles SDK import, plugin loading, client creation, tool calling, and cleanup.\n */\n static async callTool(\n manual: string | Record<string, unknown>,\n toolName: string,\n args: Record<string, unknown>,\n options?: {\n variables?: Record<string, string>;\n plugins?: string[];\n timeoutMs?: number;\n }\n ): Promise<unknown> {\n const variables = options?.variables || {};\n const plugins = options?.plugins || ['http'];\n const timeoutMs = options?.timeoutMs || 60000;\n\n // Dynamic import UTCP SDK and plugins\n const { UtcpClient } = await import('@utcp/sdk');\n for (const plugin of plugins) {\n try {\n await import(`@utcp/${plugin}`);\n } catch {\n logger.debug(`UTCP plugin @utcp/${plugin} not available`);\n }\n }\n\n // Resolve manual to call template\n const callTemplate = await UtcpCheckProvider.resolveManualCallTemplate(manual);\n\n // Create client\n const client = await UtcpClient.create(process.cwd(), {\n manual_call_templates: [callTemplate],\n variables,\n } as any);\n\n try {\n // Resolve tool name - try exact match first, then suffix match\n let resolvedToolName = toolName;\n try {\n const tools = await client.getTools();\n const toolNames = tools.map((t: any) => t.name as string);\n logger.debug(`UTCP tools available: ${JSON.stringify(toolNames)}`);\n\n if (!toolNames.includes(resolvedToolName)) {\n const suffixMatch = toolNames.find((name: string) =>\n name.endsWith(`.${resolvedToolName}`)\n );\n if (suffixMatch) {\n logger.debug(\n `UTCP method '${resolvedToolName}' resolved to '${suffixMatch}' via suffix match`\n );\n resolvedToolName = suffixMatch;\n }\n }\n } catch (err) {\n logger.debug(`Failed to list UTCP tools for name resolution: ${err}`);\n }\n\n // Call tool with timeout (clear timer on success to avoid resource leak)\n let timer: ReturnType<typeof setTimeout> | undefined;\n const result = await Promise.race([\n client.callTool(resolvedToolName, args as Record<string, any>),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`UTCP tool '${toolName}' timed out after ${timeoutMs}ms`)),\n timeoutMs\n );\n }),\n ]).finally(() => clearTimeout(timer));\n\n return result;\n } finally {\n try {\n if (typeof (client as any).close === 'function') {\n await (client as any).close();\n }\n } catch {}\n }\n }\n\n /**\n * Check if an error is a timeout error\n */\n private isTimeoutError(error: unknown): boolean {\n const err = error as { message?: unknown; code?: unknown; cause?: unknown };\n const message = typeof err?.message === 'string' ? err.message.toLowerCase() : '';\n const code = typeof err?.code === 'string' ? err.code.toLowerCase() : '';\n return message.includes('timeout') || message.includes('timed out') || code.includes('timeout');\n }\n\n /**\n * Build output context from dependency results\n */\n private buildOutputContext(\n dependencyResults?: Map<string, ReviewSummary>\n ): Record<string, unknown> {\n if (!dependencyResults) {\n return {};\n }\n const outputs: Record<string, unknown> = {};\n for (const [checkName, result] of dependencyResults) {\n const summary = result as ReviewSummary & { output?: unknown };\n outputs[checkName] = summary.output !== undefined ? summary.output : summary;\n }\n return outputs;\n }\n\n /**\n * Get safe environment variables\n */\n private getSafeEnvironmentVariables(): Record<string, string> {\n const safeVars: Record<string, string> = {};\n const { buildSandboxEnv } = require('../utils/env-exposure');\n const merged = buildSandboxEnv(process.env);\n for (const [key, value] of Object.entries(merged)) {\n safeVars[key] = String(value);\n }\n safeVars['PWD'] = process.cwd();\n return safeVars;\n }\n\n getSupportedConfigKeys(): string[] {\n return [\n 'type',\n 'manual',\n 'method',\n 'methodArgs',\n 'argsTransform',\n 'variables',\n 'plugins',\n 'transform',\n 'transform_js',\n 'timeout',\n 'depends_on',\n 'on',\n 'if',\n 'group',\n ];\n }\n\n async isAvailable(): Promise<boolean> {\n if (this.sdkAvailable !== null) {\n return this.sdkAvailable;\n }\n try {\n await import('@utcp/sdk');\n this.sdkAvailable = true;\n } catch {\n this.sdkAvailable = false;\n }\n return this.sdkAvailable;\n }\n\n getRequirements(): string[] {\n return [\n '@utcp/sdk package installed',\n 'UTCP manual source (URL, file path, or inline)',\n 'Tool method name',\n ];\n }\n}\n"],"mappings":"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","names":["buildSandboxEnv"]}
@@ -1,459 +0,0 @@
1
- import {
2
- detectLocalMode,
3
- hasMinPermission,
4
- init_author_permissions,
5
- isCollaborator,
6
- isContributor,
7
- isFirstTimer,
8
- isMember,
9
- isOwner
10
- } from "./chunk-25IC7KXZ.mjs";
11
- import {
12
- compileAndRun,
13
- createSecureSandbox,
14
- init_sandbox
15
- } from "./chunk-LW3INISN.mjs";
16
- import {
17
- MemoryStore,
18
- init_memory_store
19
- } from "./chunk-UFHOIB3R.mjs";
20
- import {
21
- __esm,
22
- __require
23
- } from "./chunk-J7LXIPZS.mjs";
24
-
25
- // src/liquid-extensions.ts
26
- import { Liquid, Tag, Value } from "liquidjs";
27
- import { AsyncLocalStorage } from "async_hooks";
28
- import path from "path";
29
- function sanitizeLabel(value) {
30
- if (value == null) return "";
31
- const s = String(value);
32
- return s.replace(/[^A-Za-z0-9:\/\- ]/g, "").replace(/\/{2,}/g, "/").trim();
33
- }
34
- function sanitizeLabelList(labels) {
35
- if (!Array.isArray(labels)) return [];
36
- return labels.map((v) => sanitizeLabel(v)).filter((s) => s.length > 0);
37
- }
38
- async function withPermissionsContext(ctx, fn) {
39
- return await permissionsALS.run(ctx, fn);
40
- }
41
- function configureLiquidWithExtensions(liquid) {
42
- liquid.registerTag("readfile", ReadFileTag);
43
- liquid.registerFilter("parse_json", (value) => {
44
- if (typeof value !== "string") {
45
- return value;
46
- }
47
- try {
48
- return JSON.parse(value);
49
- } catch {
50
- return value;
51
- }
52
- });
53
- liquid.registerFilter("to_json", (value) => {
54
- try {
55
- return JSON.stringify(value);
56
- } catch {
57
- return "[Error: Unable to serialize to JSON]";
58
- }
59
- });
60
- liquid.registerFilter("base64", (value) => {
61
- if (value == null) return "";
62
- const str = String(value);
63
- return Buffer.from(str).toString("base64");
64
- });
65
- liquid.registerFilter("base64_decode", (value) => {
66
- if (value == null) return "";
67
- const str = String(value);
68
- try {
69
- return Buffer.from(str, "base64").toString("utf-8");
70
- } catch {
71
- return "[Error: Invalid base64 string]";
72
- }
73
- });
74
- liquid.registerFilter("safe_label", (value) => sanitizeLabel(value));
75
- liquid.registerFilter("safe_label_list", (value) => sanitizeLabelList(value));
76
- liquid.registerFilter("unescape_newlines", (value) => {
77
- if (value == null) return "";
78
- const s = String(value);
79
- return s.replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, " ");
80
- });
81
- liquid.registerFilter("json_escape", (value) => {
82
- if (value == null) return "";
83
- const s = String(value);
84
- const jsonStr = JSON.stringify(s);
85
- return jsonStr.slice(1, -1);
86
- });
87
- liquid.registerFilter("shell_escape", (value) => {
88
- if (value == null) return "''";
89
- const s = String(value);
90
- return "'" + s.replace(/'/g, "'\\''") + "'";
91
- });
92
- liquid.registerFilter("escape_shell", (value) => {
93
- if (value == null) return "''";
94
- const s = String(value);
95
- return "'" + s.replace(/'/g, "'\\''") + "'";
96
- });
97
- liquid.registerFilter("shell_escape_double", (value) => {
98
- if (value == null) return '""';
99
- const s = String(value);
100
- const escaped = s.replace(/\\/g, "\\\\").replace(/\$/g, "\\$").replace(/`/g, "\\`").replace(/"/g, '\\"').replace(/!/g, "\\!");
101
- return '"' + escaped + '"';
102
- });
103
- const isLocal = detectLocalMode();
104
- const resolveAssoc = (val) => {
105
- if (typeof val === "string" && val.length > 0) return val;
106
- const store = permissionsALS.getStore();
107
- return store?.authorAssociation;
108
- };
109
- liquid.registerFilter("has_min_permission", (authorAssociation, level) => {
110
- return hasMinPermission(resolveAssoc(authorAssociation), level, isLocal);
111
- });
112
- liquid.registerFilter("is_owner", (authorAssociation) => {
113
- return isOwner(resolveAssoc(authorAssociation), isLocal);
114
- });
115
- liquid.registerFilter("is_member", (authorAssociation) => {
116
- return isMember(resolveAssoc(authorAssociation), isLocal);
117
- });
118
- liquid.registerFilter("is_collaborator", (authorAssociation) => {
119
- return isCollaborator(resolveAssoc(authorAssociation), isLocal);
120
- });
121
- liquid.registerFilter("is_contributor", (authorAssociation) => {
122
- return isContributor(resolveAssoc(authorAssociation), isLocal);
123
- });
124
- liquid.registerFilter("is_first_timer", (authorAssociation) => {
125
- return isFirstTimer(resolveAssoc(authorAssociation), isLocal);
126
- });
127
- const memoryStore = MemoryStore.getInstance();
128
- liquid.registerFilter("memory_get", (key, namespace) => {
129
- if (typeof key !== "string") {
130
- return void 0;
131
- }
132
- return memoryStore.get(key, namespace);
133
- });
134
- liquid.registerFilter("memory_has", (key, namespace) => {
135
- if (typeof key !== "string") {
136
- return false;
137
- }
138
- const has = memoryStore.has(key, namespace);
139
- try {
140
- if (process.env.VISOR_DEBUG === "true" && key === "fact_validation_issues") {
141
- console.error(
142
- `[liquid] memory_has('${key}', ns='${namespace || memoryStore.getDefaultNamespace()}') => ${String(
143
- has
144
- )}`
145
- );
146
- }
147
- } catch {
148
- }
149
- return has;
150
- });
151
- liquid.registerFilter("memory_list", (namespace) => {
152
- return memoryStore.list(namespace);
153
- });
154
- liquid.registerFilter("get", (obj, pathExpr) => {
155
- if (obj == null) return void 0;
156
- const path2 = typeof pathExpr === "string" ? pathExpr : String(pathExpr || "");
157
- if (!path2) return obj;
158
- const parts = path2.split(".");
159
- let cur = obj;
160
- for (const p of parts) {
161
- if (cur == null) return void 0;
162
- cur = cur[p];
163
- }
164
- return cur;
165
- });
166
- liquid.registerFilter("not_empty", (v) => {
167
- if (Array.isArray(v)) return v.length > 0;
168
- if (typeof v === "string") return v.length > 0;
169
- if (v && typeof v === "object") return Object.keys(v).length > 0;
170
- return false;
171
- });
172
- liquid.registerFilter("coalesce", (first, ...rest) => {
173
- const all = [first, ...rest];
174
- for (const v of all) {
175
- if (Array.isArray(v) && v.length > 0) return v;
176
- if (typeof v === "string" && v.length > 0) return v;
177
- if (v && typeof v === "object" && Object.keys(v).length > 0) return v;
178
- }
179
- return Array.isArray(first) ? [] : first ?? void 0;
180
- });
181
- liquid.registerFilter("where_exp", (items, varName, expr) => {
182
- const arr = Array.isArray(items) ? items : [];
183
- const name = typeof varName === "string" && varName.trim() ? varName.trim() : "i";
184
- const body = String(expr || "");
185
- try {
186
- const sandbox = createSecureSandbox();
187
- const out = [];
188
- for (let idx = 0; idx < arr.length; idx++) {
189
- const item = arr[idx];
190
- let ok = false;
191
- try {
192
- const scope = { [name]: item, idx, arr };
193
- ok = !!compileAndRun(sandbox, body, scope, {
194
- injectLog: false,
195
- wrapFunction: true
196
- });
197
- } catch {
198
- ok = false;
199
- }
200
- if (ok) out.push(item);
201
- }
202
- return out;
203
- } catch {
204
- return [];
205
- }
206
- });
207
- liquid.registerFilter(
208
- "chat_history",
209
- function(value, ...args) {
210
- try {
211
- const impl = this;
212
- const ctx = impl?.context;
213
- const allArgs = Array.isArray(args) ? args : [];
214
- if (allArgs.length === 0) {
215
- return [];
216
- }
217
- const positional = [];
218
- const options = {};
219
- for (const arg of allArgs) {
220
- if (Array.isArray(arg) && arg.length === 2 && typeof arg[0] === "string" && arg[0].length > 0) {
221
- options[arg[0]] = arg[1];
222
- } else {
223
- positional.push(arg);
224
- }
225
- }
226
- const stepArgs = positional;
227
- const steps = stepArgs.map((s) => String(s ?? "").trim()).filter((s) => s.length > 0);
228
- if (steps.length === 0) return [];
229
- const outputsHistoryVar = ctx?.get(["outputs_history"]) || {};
230
- const outputsVar = ctx?.get(["outputs"]) || {};
231
- const outputsHistory = outputsHistoryVar && Object.keys(outputsHistoryVar).length > 0 ? outputsHistoryVar : outputsVar?.history || {};
232
- const checksMeta = ctx?.get(["checks_meta"]) || ctx?.get(["event"])?.payload?.__checksMeta || void 0;
233
- const directionRaw = typeof options.direction === "string" ? options.direction.toLowerCase() : "";
234
- const direction = directionRaw === "desc" ? "desc" : "asc";
235
- const limit = typeof options.limit === "number" && options.limit > 0 ? Math.floor(options.limit) : void 0;
236
- const textCfg = options.text && typeof options.text === "object" ? options.text : {};
237
- const defaultField = typeof textCfg.default_field === "string" && textCfg.default_field.trim() ? textCfg.default_field.trim() : "text";
238
- const byStepText = {};
239
- if (textCfg.by_step && typeof textCfg.by_step === "object") {
240
- for (const [k, v] of Object.entries(textCfg.by_step)) {
241
- if (typeof v === "string" && v.trim()) {
242
- byStepText[k] = v.trim();
243
- }
244
- }
245
- }
246
- const rolesCfg = options.roles && typeof options.roles === "object" ? options.roles : {};
247
- const byTypeRole = {};
248
- if (rolesCfg.by_type && typeof rolesCfg.by_type === "object") {
249
- for (const [k, v] of Object.entries(rolesCfg.by_type)) {
250
- if (typeof v === "string" && v.trim()) {
251
- byTypeRole[k] = v.trim();
252
- }
253
- }
254
- }
255
- const byStepRole = {};
256
- if (rolesCfg.by_step && typeof rolesCfg.by_step === "object") {
257
- for (const [k, v] of Object.entries(rolesCfg.by_step)) {
258
- if (typeof v === "string" && v.trim()) {
259
- byStepRole[k] = v.trim();
260
- }
261
- }
262
- }
263
- if (typeof options.role_map === "string" && options.role_map.trim().length > 0) {
264
- const parts = String(options.role_map).split(",").map((p) => p.trim()).filter(Boolean);
265
- for (const part of parts) {
266
- const eqIdx = part.indexOf("=");
267
- if (eqIdx > 0) {
268
- const k = part.slice(0, eqIdx).trim();
269
- const v = part.slice(eqIdx + 1).trim();
270
- if (k && v) {
271
- byStepRole[k] = v;
272
- }
273
- }
274
- }
275
- }
276
- const defaultRole = typeof rolesCfg.default === "string" && rolesCfg.default.trim() ? rolesCfg.default.trim() : void 0;
277
- const getNested = (obj, path2) => {
278
- if (!obj || !path2) return void 0;
279
- const parts = path2.split(".");
280
- let cur = obj;
281
- for (const p of parts) {
282
- if (cur == null) return void 0;
283
- cur = cur[p];
284
- }
285
- return cur;
286
- };
287
- const normalizeText = (step, raw) => {
288
- try {
289
- const overrideField = byStepText[step];
290
- if (overrideField) {
291
- const val = getNested(raw, overrideField);
292
- if (val !== void 0 && val !== null) {
293
- const s = String(val);
294
- if (s.trim().length > 0) return s;
295
- }
296
- }
297
- if (raw && typeof raw === "object") {
298
- if (typeof raw.text === "string" && raw.text.trim().length > 0) {
299
- return raw.text;
300
- }
301
- if (typeof raw.content === "string" && raw.content.trim().length > 0) {
302
- return raw.content;
303
- }
304
- const dfVal = raw[defaultField];
305
- if (dfVal !== void 0 && dfVal !== null) {
306
- const s = String(dfVal);
307
- if (s.trim().length > 0) return s;
308
- }
309
- }
310
- if (typeof raw === "string") return raw;
311
- if (raw == null) return "";
312
- try {
313
- return JSON.stringify(raw);
314
- } catch {
315
- return String(raw);
316
- }
317
- } catch {
318
- if (typeof raw === "string") return raw;
319
- return "";
320
- }
321
- };
322
- const normalizeRole = (step) => {
323
- try {
324
- if (byStepRole[step]) return byStepRole[step];
325
- const meta = checksMeta ? checksMeta[step] : void 0;
326
- const type = meta?.type;
327
- if (type && byTypeRole[type]) return byTypeRole[type];
328
- if (type === "human-input") return "user";
329
- if (type === "ai") return "assistant";
330
- if (defaultRole) return defaultRole;
331
- if (type) {
332
- if (type === "human-input") return "user";
333
- if (type === "ai") return "assistant";
334
- }
335
- } catch {
336
- }
337
- return "assistant";
338
- };
339
- const messages = [];
340
- const tsBase = Date.now();
341
- let counter = 0;
342
- for (const step of steps) {
343
- const arr = outputsHistory?.[step];
344
- if (!Array.isArray(arr)) continue;
345
- for (const raw of arr) {
346
- let ts;
347
- if (raw && typeof raw === "object" && typeof raw.ts === "number") {
348
- ts = raw.ts;
349
- }
350
- if (!Number.isFinite(ts)) {
351
- ts = tsBase + counter++;
352
- }
353
- const text = normalizeText(step, raw);
354
- const role = normalizeRole(step);
355
- messages.push({ step, role, text, ts, raw });
356
- }
357
- }
358
- messages.sort((a, b) => a.ts - b.ts);
359
- if (direction === "desc") {
360
- messages.reverse();
361
- }
362
- if (limit && limit > 0 && messages.length > limit) {
363
- if (direction === "asc") {
364
- return messages.slice(messages.length - limit);
365
- }
366
- return messages.slice(0, limit);
367
- }
368
- return messages;
369
- } catch {
370
- return [];
371
- }
372
- }
373
- );
374
- }
375
- function createExtendedLiquid(options = {}) {
376
- const liquid = new Liquid({
377
- cache: false,
378
- strictFilters: false,
379
- strictVariables: false,
380
- ...options
381
- });
382
- configureLiquidWithExtensions(liquid);
383
- return liquid;
384
- }
385
- var ReadFileTag, permissionsALS;
386
- var init_liquid_extensions = __esm({
387
- "src/liquid-extensions.ts"() {
388
- init_author_permissions();
389
- init_memory_store();
390
- init_sandbox();
391
- ReadFileTag = class extends Tag {
392
- filepath;
393
- indentValue = null;
394
- constructor(token, remainTokens, liquid) {
395
- super(token, remainTokens, liquid);
396
- const argsStr = token.args.trim();
397
- const indentMatch = argsStr.match(/^(.+?)\s+indent:\s*(\d+)\s*$/);
398
- if (indentMatch) {
399
- this.filepath = new Value(indentMatch[1].trim(), liquid);
400
- this.indentValue = new Value(indentMatch[2], liquid);
401
- } else {
402
- this.filepath = new Value(argsStr, liquid);
403
- }
404
- }
405
- *render(ctx, emitter) {
406
- const filePath = yield this.filepath.value(ctx, false);
407
- let indent = 0;
408
- if (this.indentValue) {
409
- const indentAmount = yield this.indentValue.value(ctx, false);
410
- indent = typeof indentAmount === "number" ? indentAmount : parseInt(String(indentAmount), 10) || 0;
411
- } else {
412
- const output = emitter.buffer || "";
413
- const lastNewline = output.lastIndexOf("\n");
414
- if (lastNewline >= 0) {
415
- const lineStart = output.substring(lastNewline + 1);
416
- const match = lineStart.match(/^(\s*)/);
417
- indent = match ? match[1].length : 0;
418
- }
419
- }
420
- if (!filePath || typeof filePath !== "string") {
421
- emitter.write("[Error: Invalid file path]");
422
- return;
423
- }
424
- const basePath = ctx.globals?.basePath;
425
- const projectRoot = typeof basePath === "string" ? basePath : process.cwd();
426
- const normalizedRoot = path.normalize(projectRoot + path.sep);
427
- const resolvedPath = path.normalize(path.resolve(projectRoot, filePath.toString()));
428
- if (!resolvedPath.startsWith(normalizedRoot) && resolvedPath !== path.normalize(projectRoot)) {
429
- emitter.write("[Error: File path escapes project directory]");
430
- return;
431
- }
432
- try {
433
- let content = __require("fs").readFileSync(resolvedPath, "utf-8");
434
- if (indent > 0) {
435
- const indentStr = " ".repeat(indent);
436
- const lines = content.split("\n");
437
- content = lines.map((line, i) => i === 0 ? line : indentStr + line).join("\n");
438
- }
439
- emitter.write(content);
440
- } catch (error) {
441
- const errorMessage = error instanceof Error ? error.message : error?.code || "Unknown error";
442
- emitter.write(`[Error reading file: ${errorMessage}]`);
443
- }
444
- }
445
- };
446
- permissionsALS = new AsyncLocalStorage();
447
- }
448
- });
449
-
450
- export {
451
- sanitizeLabel,
452
- sanitizeLabelList,
453
- ReadFileTag,
454
- withPermissionsContext,
455
- configureLiquidWithExtensions,
456
- createExtendedLiquid,
457
- init_liquid_extensions
458
- };
459
- //# sourceMappingURL=chunk-PQWZ6NFL.mjs.map