@browserbasehq/orca 3.5.0-vertex-test → 3.6.0-gemini-cua

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 (290) hide show
  1. package/README.md +7 -15
  2. package/dist/cjs/lib/utils.d.ts +8 -0
  3. package/dist/cjs/lib/utils.js +31 -0
  4. package/dist/cjs/lib/utils.js.map +1 -1
  5. package/dist/cjs/lib/v3/agent/AgentProvider.js +5 -3
  6. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  7. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +10 -8
  8. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  9. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +124 -28
  10. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  11. package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
  12. package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js +38 -0
  13. package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
  14. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +10 -1
  15. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  16. package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
  17. package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js +54 -0
  18. package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
  19. package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
  20. package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js +62 -0
  21. package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
  22. package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
  23. package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js +25 -0
  24. package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
  25. package/dist/cjs/lib/v3/api.d.ts +1 -0
  26. package/dist/cjs/lib/v3/api.js +37 -16
  27. package/dist/cjs/lib/v3/api.js.map +1 -1
  28. package/dist/cjs/lib/v3/cache/ActCache.js +1 -1
  29. package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
  30. package/dist/cjs/lib/v3/cache/utils.d.ts +7 -0
  31. package/dist/cjs/lib/v3/cache/utils.js +19 -0
  32. package/dist/cjs/lib/v3/cache/utils.js.map +1 -1
  33. package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.d.ts +24 -24
  34. package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js +24 -24
  35. package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
  36. package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.js +79 -10
  37. package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.js.map +1 -1
  38. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +3 -1
  39. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +108 -16
  40. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  41. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
  42. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
  43. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  44. package/dist/cjs/lib/v3/index.d.ts +13 -1
  45. package/dist/cjs/lib/v3/index.js +19 -1
  46. package/dist/cjs/lib/v3/index.js.map +1 -1
  47. package/dist/cjs/lib/v3/launch/local.js +1 -0
  48. package/dist/cjs/lib/v3/launch/local.js.map +1 -1
  49. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +3 -0
  50. package/dist/cjs/lib/v3/llm/LLMProvider.js +45 -3
  51. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  52. package/dist/cjs/lib/v3/llm/aisdk.js +4 -0
  53. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  54. package/dist/cjs/lib/v3/llm/anthropicOptions.d.ts +57 -0
  55. package/dist/cjs/lib/v3/llm/anthropicOptions.js +115 -0
  56. package/dist/cjs/lib/v3/llm/anthropicOptions.js.map +1 -0
  57. package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -2
  58. package/dist/cjs/lib/v3/types/public/agent.js +3 -0
  59. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  60. package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
  61. package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js +15 -0
  62. package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
  63. package/dist/cjs/lib/v3/types/public/api.d.ts +925 -182
  64. package/dist/cjs/lib/v3/types/public/api.js +138 -20
  65. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  66. package/dist/cjs/lib/v3/types/public/clipboard.d.ts +15 -0
  67. package/dist/cjs/lib/v3/types/public/clipboard.js +3 -0
  68. package/dist/cjs/lib/v3/types/public/clipboard.js.map +1 -0
  69. package/dist/cjs/lib/v3/types/public/index.d.ts +2 -0
  70. package/dist/cjs/lib/v3/types/public/index.js +2 -0
  71. package/dist/cjs/lib/v3/types/public/index.js.map +1 -1
  72. package/dist/cjs/lib/v3/types/public/model.d.ts +33 -8
  73. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  74. package/dist/cjs/lib/v3/types/public/page.d.ts +29 -0
  75. package/dist/cjs/lib/v3/types/public/page.js.map +1 -1
  76. package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +3 -0
  77. package/dist/cjs/lib/v3/types/public/sdkErrors.js +8 -2
  78. package/dist/cjs/lib/v3/types/public/sdkErrors.js.map +1 -1
  79. package/dist/cjs/lib/v3/understudy/clipboard.d.ts +24 -0
  80. package/dist/cjs/lib/v3/understudy/clipboard.js +166 -0
  81. package/dist/cjs/lib/v3/understudy/clipboard.js.map +1 -0
  82. package/dist/cjs/lib/v3/understudy/context.d.ts +3 -0
  83. package/dist/cjs/lib/v3/understudy/context.js +15 -0
  84. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  85. package/dist/cjs/lib/v3/understudy/page.d.ts +23 -1
  86. package/dist/cjs/lib/v3/understudy/page.js +283 -0
  87. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  88. package/dist/cjs/lib/v3/v3.js +19 -7
  89. package/dist/cjs/lib/v3/v3.js.map +1 -1
  90. package/dist/cjs/lib/v3/verifier/errorTaxonomy.d.ts +35 -0
  91. package/dist/cjs/lib/v3/verifier/errorTaxonomy.js +291 -0
  92. package/dist/cjs/lib/v3/verifier/errorTaxonomy.js.map +1 -0
  93. package/dist/cjs/lib/v3/verifier/evidence.d.ts +44 -0
  94. package/dist/cjs/lib/v3/verifier/evidence.js +432 -0
  95. package/dist/cjs/lib/v3/verifier/evidence.js.map +1 -0
  96. package/dist/cjs/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
  97. package/dist/cjs/lib/v3/verifier/evidenceNormalization.js +100 -0
  98. package/dist/cjs/lib/v3/verifier/evidenceNormalization.js.map +1 -0
  99. package/dist/cjs/lib/v3/verifier/index.d.ts +6 -0
  100. package/dist/cjs/lib/v3/verifier/index.js +16 -0
  101. package/dist/cjs/lib/v3/verifier/index.js.map +1 -0
  102. package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.d.ts +21 -0
  103. package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.js +71 -0
  104. package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.js.map +1 -0
  105. package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.d.ts +3 -0
  106. package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.js +166 -0
  107. package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.js.map +1 -0
  108. package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.d.ts +35 -0
  109. package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.js +158 -0
  110. package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.js.map +1 -0
  111. package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.d.ts +26 -0
  112. package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.js +137 -0
  113. package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.js.map +1 -0
  114. package/dist/cjs/lib/v3/verifier/prompts/index.d.ts +8 -0
  115. package/dist/cjs/lib/v3/verifier/prompts/index.js +22 -0
  116. package/dist/cjs/lib/v3/verifier/prompts/index.js.map +1 -0
  117. package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.d.ts +23 -0
  118. package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.js +77 -0
  119. package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.js.map +1 -0
  120. package/dist/cjs/lib/v3/verifier/prompts/render.d.ts +23 -0
  121. package/dist/cjs/lib/v3/verifier/prompts/render.js +45 -0
  122. package/dist/cjs/lib/v3/verifier/prompts/render.js.map +1 -0
  123. package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.d.ts +16 -0
  124. package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.js +321 -0
  125. package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.js.map +1 -0
  126. package/dist/cjs/lib/v3/verifier/prompts/taskValidity.d.ts +1 -0
  127. package/dist/cjs/lib/v3/verifier/prompts/taskValidity.js +116 -0
  128. package/dist/cjs/lib/v3/verifier/prompts/taskValidity.js.map +1 -0
  129. package/dist/cjs/lib/v3/verifier/rubricVerifier.d.ts +91 -0
  130. package/dist/cjs/lib/v3/verifier/rubricVerifier.js +1645 -0
  131. package/dist/cjs/lib/v3/verifier/rubricVerifier.js.map +1 -0
  132. package/dist/cjs/lib/v3/verifier/trajectory.d.ts +50 -0
  133. package/dist/cjs/lib/v3/verifier/trajectory.js +316 -0
  134. package/dist/cjs/lib/v3/verifier/trajectory.js.map +1 -0
  135. package/dist/cjs/lib/v3/verifier/types.d.ts +429 -0
  136. package/dist/cjs/lib/v3/verifier/types.js +3 -0
  137. package/dist/cjs/lib/v3/verifier/types.js.map +1 -0
  138. package/dist/cjs/lib/v3Evaluator.d.ts +14 -4
  139. package/dist/cjs/lib/v3Evaluator.js +189 -1
  140. package/dist/cjs/lib/v3Evaluator.js.map +1 -1
  141. package/dist/cjs/lib/v3LegacyEvaluator.js +5 -1
  142. package/dist/cjs/lib/v3LegacyEvaluator.js.map +1 -1
  143. package/dist/cjs/lib/version.d.ts +1 -1
  144. package/dist/cjs/lib/version.js +1 -1
  145. package/dist/cjs/lib/version.js.map +1 -1
  146. package/dist/esm/lib/utils.d.ts +8 -0
  147. package/dist/esm/lib/utils.js +28 -0
  148. package/dist/esm/lib/utils.js.map +1 -1
  149. package/dist/esm/lib/v3/agent/AgentProvider.js +5 -3
  150. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  151. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +10 -8
  152. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  153. package/dist/esm/lib/v3/agent/GoogleCUAClient.js +124 -28
  154. package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  155. package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
  156. package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js +35 -0
  157. package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
  158. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +10 -1
  159. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  160. package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
  161. package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js +50 -0
  162. package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
  163. package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
  164. package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js +59 -0
  165. package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
  166. package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
  167. package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js +22 -0
  168. package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
  169. package/dist/esm/lib/v3/api.d.ts +1 -0
  170. package/dist/esm/lib/v3/api.js +38 -17
  171. package/dist/esm/lib/v3/api.js.map +1 -1
  172. package/dist/esm/lib/v3/cache/ActCache.js +2 -2
  173. package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
  174. package/dist/esm/lib/v3/cache/utils.d.ts +7 -0
  175. package/dist/esm/lib/v3/cache/utils.js +18 -0
  176. package/dist/esm/lib/v3/cache/utils.js.map +1 -1
  177. package/dist/esm/lib/v3/dom/build/locatorScripts.generated.d.ts +24 -24
  178. package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js +24 -24
  179. package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
  180. package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js +79 -10
  181. package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js.map +1 -1
  182. package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +3 -1
  183. package/dist/esm/lib/v3/handlers/v3AgentHandler.js +108 -16
  184. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  185. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
  186. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
  187. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  188. package/dist/esm/lib/v3/index.d.ts +13 -1
  189. package/dist/esm/lib/v3/index.js +10 -0
  190. package/dist/esm/lib/v3/index.js.map +1 -1
  191. package/dist/esm/lib/v3/launch/local.js +1 -0
  192. package/dist/esm/lib/v3/launch/local.js.map +1 -1
  193. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +3 -0
  194. package/dist/esm/lib/v3/llm/LLMProvider.js +44 -3
  195. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  196. package/dist/esm/lib/v3/llm/aisdk.js +4 -0
  197. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  198. package/dist/esm/lib/v3/llm/anthropicOptions.d.ts +57 -0
  199. package/dist/esm/lib/v3/llm/anthropicOptions.js +106 -0
  200. package/dist/esm/lib/v3/llm/anthropicOptions.js.map +1 -0
  201. package/dist/esm/lib/v3/types/public/agent.d.ts +8 -2
  202. package/dist/esm/lib/v3/types/public/agent.js +3 -0
  203. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  204. package/dist/esm/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
  205. package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js +14 -0
  206. package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
  207. package/dist/esm/lib/v3/types/public/api.d.ts +925 -182
  208. package/dist/esm/lib/v3/types/public/api.js +136 -18
  209. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  210. package/dist/esm/lib/v3/types/public/clipboard.d.ts +15 -0
  211. package/dist/esm/lib/v3/types/public/clipboard.js +2 -0
  212. package/dist/esm/lib/v3/types/public/clipboard.js.map +1 -0
  213. package/dist/esm/lib/v3/types/public/index.d.ts +2 -0
  214. package/dist/esm/lib/v3/types/public/index.js +2 -0
  215. package/dist/esm/lib/v3/types/public/index.js.map +1 -1
  216. package/dist/esm/lib/v3/types/public/model.d.ts +33 -8
  217. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  218. package/dist/esm/lib/v3/types/public/page.d.ts +29 -0
  219. package/dist/esm/lib/v3/types/public/page.js.map +1 -1
  220. package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +3 -0
  221. package/dist/esm/lib/v3/types/public/sdkErrors.js +5 -0
  222. package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
  223. package/dist/esm/lib/v3/understudy/clipboard.d.ts +24 -0
  224. package/dist/esm/lib/v3/understudy/clipboard.js +163 -0
  225. package/dist/esm/lib/v3/understudy/clipboard.js.map +1 -0
  226. package/dist/esm/lib/v3/understudy/context.d.ts +3 -0
  227. package/dist/esm/lib/v3/understudy/context.js +15 -0
  228. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  229. package/dist/esm/lib/v3/understudy/page.d.ts +23 -1
  230. package/dist/esm/lib/v3/understudy/page.js +284 -1
  231. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  232. package/dist/esm/lib/v3/v3.js +20 -8
  233. package/dist/esm/lib/v3/v3.js.map +1 -1
  234. package/dist/esm/lib/v3/verifier/errorTaxonomy.d.ts +35 -0
  235. package/dist/esm/lib/v3/verifier/errorTaxonomy.js +285 -0
  236. package/dist/esm/lib/v3/verifier/errorTaxonomy.js.map +1 -0
  237. package/dist/esm/lib/v3/verifier/evidence.d.ts +44 -0
  238. package/dist/esm/lib/v3/verifier/evidence.js +393 -0
  239. package/dist/esm/lib/v3/verifier/evidence.js.map +1 -0
  240. package/dist/esm/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
  241. package/dist/esm/lib/v3/verifier/evidenceNormalization.js +93 -0
  242. package/dist/esm/lib/v3/verifier/evidenceNormalization.js.map +1 -0
  243. package/dist/esm/lib/v3/verifier/index.d.ts +6 -0
  244. package/dist/esm/lib/v3/verifier/index.js +3 -0
  245. package/dist/esm/lib/v3/verifier/index.js.map +1 -0
  246. package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.d.ts +21 -0
  247. package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.js +68 -0
  248. package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.js.map +1 -0
  249. package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.d.ts +3 -0
  250. package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.js +162 -0
  251. package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.js.map +1 -0
  252. package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.d.ts +35 -0
  253. package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.js +155 -0
  254. package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.js.map +1 -0
  255. package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.d.ts +26 -0
  256. package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.js +134 -0
  257. package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.js.map +1 -0
  258. package/dist/esm/lib/v3/verifier/prompts/index.d.ts +8 -0
  259. package/dist/esm/lib/v3/verifier/prompts/index.js +9 -0
  260. package/dist/esm/lib/v3/verifier/prompts/index.js.map +1 -0
  261. package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.d.ts +23 -0
  262. package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.js +74 -0
  263. package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.js.map +1 -0
  264. package/dist/esm/lib/v3/verifier/prompts/render.d.ts +23 -0
  265. package/dist/esm/lib/v3/verifier/prompts/render.js +41 -0
  266. package/dist/esm/lib/v3/verifier/prompts/render.js.map +1 -0
  267. package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.d.ts +16 -0
  268. package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.js +318 -0
  269. package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.js.map +1 -0
  270. package/dist/esm/lib/v3/verifier/prompts/taskValidity.d.ts +1 -0
  271. package/dist/esm/lib/v3/verifier/prompts/taskValidity.js +113 -0
  272. package/dist/esm/lib/v3/verifier/prompts/taskValidity.js.map +1 -0
  273. package/dist/esm/lib/v3/verifier/rubricVerifier.d.ts +91 -0
  274. package/dist/esm/lib/v3/verifier/rubricVerifier.js +1640 -0
  275. package/dist/esm/lib/v3/verifier/rubricVerifier.js.map +1 -0
  276. package/dist/esm/lib/v3/verifier/trajectory.d.ts +50 -0
  277. package/dist/esm/lib/v3/verifier/trajectory.js +273 -0
  278. package/dist/esm/lib/v3/verifier/trajectory.js.map +1 -0
  279. package/dist/esm/lib/v3/verifier/types.d.ts +429 -0
  280. package/dist/esm/lib/v3/verifier/types.js +2 -0
  281. package/dist/esm/lib/v3/verifier/types.js.map +1 -0
  282. package/dist/esm/lib/v3Evaluator.d.ts +14 -4
  283. package/dist/esm/lib/v3Evaluator.js +189 -1
  284. package/dist/esm/lib/v3Evaluator.js.map +1 -1
  285. package/dist/esm/lib/v3LegacyEvaluator.js +5 -1
  286. package/dist/esm/lib/v3LegacyEvaluator.js.map +1 -1
  287. package/dist/esm/lib/version.d.ts +1 -1
  288. package/dist/esm/lib/version.js +1 -1
  289. package/dist/esm/lib/version.js.map +1 -1
  290. package/package.json +18 -12
@@ -0,0 +1,432 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isImageEvidence = isImageEvidence;
37
+ exports.isTextEvidence = isTextEvidence;
38
+ exports.loadAndReduceScreenshots = loadAndReduceScreenshots;
39
+ exports.collectCanonicalEvidence = collectCanonicalEvidence;
40
+ let sharpPromise = null;
41
+ async function loadSharp() {
42
+ if (sharpPromise)
43
+ return sharpPromise;
44
+ sharpPromise = (async () => {
45
+ try {
46
+ // Dynamic specifier hides sharp from TypeScript's module resolver:
47
+ // sharp is an optional runtime dep (evals/server installs it; core
48
+ // consumers don't have to). try/catch handles missing-at-runtime.
49
+ const specifier = "sharp";
50
+ const mod = (await Promise.resolve(`${specifier}`).then(s => __importStar(require(s))));
51
+ return (mod.default ?? mod);
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ })();
57
+ return sharpPromise;
58
+ }
59
+ const DEFAULT_SSIM_THRESHOLD = 0.75;
60
+ const DEFAULT_MSE_THRESHOLD = 30;
61
+ const DEFAULT_IMAGE_RESIZE = 0.7;
62
+ /** Discriminator helpers — kind === "image" for screenshots. */
63
+ function isImageEvidence(e) {
64
+ return "bytes" in e && e.bytes instanceof Buffer;
65
+ }
66
+ function isTextEvidence(e) {
67
+ return ("content" in e && typeof e.content === "string");
68
+ }
69
+ /**
70
+ * Step 1 — load trajectory screenshots from disk (or memory), deduplicate,
71
+ * and downsize.
72
+ *
73
+ * Returns an array of canonical screenshots ready to feed into Step 2.
74
+ * Steps without a captured probe screenshot are skipped silently — they
75
+ * never reach the canonical array, but their action context still appears
76
+ * in the prompt's action history.
77
+ */
78
+ async function loadAndReduceScreenshots(trajectory, opts = {}) {
79
+ const ssimThreshold = opts.ssimThreshold ?? DEFAULT_SSIM_THRESHOLD;
80
+ const mseThreshold = opts.mseThreshold ?? DEFAULT_MSE_THRESHOLD;
81
+ const imageResize = opts.imageResize ?? DEFAULT_IMAGE_RESIZE;
82
+ // Collect raw frames in chronological order. Per step we take tier-1
83
+ // agent-mirrored screenshots first (the exact bytes a CUA provider saw, plus
84
+ // any inline act() screenshots lifted into image modalities), then the
85
+ // tier-2 post-action probe. Buffers are populated either live or after
86
+ // loadTrajectoryFromDisk(); absent/empty buffers are skipped. Dedup collapses
87
+ // near-identical frames downstream, so including both tiers is safe.
88
+ const rawFrames = [];
89
+ for (let i = 0; i < trajectory.steps.length; i++) {
90
+ const step = trajectory.steps[i];
91
+ // tier-1: agent screenshots, in modality order, before the probe.
92
+ for (const m of step.agentEvidence?.modalities ?? []) {
93
+ if (m.type === "image" && m.bytes && m.bytes.length > 0) {
94
+ rawFrames.push({
95
+ bytes: m.bytes,
96
+ originalStepIndex: i,
97
+ });
98
+ }
99
+ }
100
+ // tier-2: post-action probe screenshot.
101
+ const buf = step.probeEvidence?.screenshot;
102
+ if (buf && buf.length > 0) {
103
+ rawFrames.push({
104
+ bytes: buf,
105
+ originalStepIndex: i,
106
+ });
107
+ }
108
+ }
109
+ // Terminal page observation captured after the agent finished. Preserves the
110
+ // legacy final-screenshot verification behavior; positioned after every step
111
+ // so it anchors as the trajectory's closing frame (always kept as "last").
112
+ const finalShot = trajectory.finalObservation?.screenshot;
113
+ if (finalShot && finalShot.length > 0) {
114
+ rawFrames.push({
115
+ bytes: finalShot,
116
+ originalStepIndex: trajectory.steps.length,
117
+ });
118
+ }
119
+ const sharp = await loadSharp();
120
+ const stepIndexToCanonical = new Map();
121
+ if (rawFrames.length === 0) {
122
+ return {
123
+ screenshots: [],
124
+ stepIndexToCanonical,
125
+ originalCount: 0,
126
+ keptCount: 0,
127
+ thresholds: {
128
+ ssim: ssimThreshold,
129
+ mse: mseThreshold,
130
+ resize: imageResize,
131
+ },
132
+ };
133
+ }
134
+ // ── Dedup ──────────────────────────────────────────────────────────────
135
+ // First + last always kept. Middle frames kept iff they're sufficiently
136
+ // dissimilar to the previously kept frame. Dissimilarity check mirrors
137
+ // ScreenshotCollector: quick MSE pass, escalate to SSIM only if MSE
138
+ // suggests the frames differ. If sharp is unavailable, keep everything.
139
+ const keptRaw = [];
140
+ // Track which raw-frame index each step maps to. Pre-fill with "the last
141
+ // kept frame so far" so dropped frames fall back to their surviving peer.
142
+ const rawIdxByStep = new Map();
143
+ let lastKeptIdx = 0;
144
+ for (let i = 0; i < rawFrames.length; i++) {
145
+ const frame = rawFrames[i];
146
+ const isFirst = i === 0;
147
+ const isLast = i === rawFrames.length - 1;
148
+ let keep = true;
149
+ let reason = sharp
150
+ ? "diverges"
151
+ : "no-dedup";
152
+ if (sharp && !isFirst && !isLast) {
153
+ const prev = keptRaw[keptRaw.length - 1];
154
+ try {
155
+ const mse = await calculateMSE(sharp, prev.bytes, frame.bytes);
156
+ if (mse < mseThreshold) {
157
+ keep = false;
158
+ }
159
+ else {
160
+ const ssim = await calculateSSIM(sharp, prev.bytes, frame.bytes);
161
+ // Drop when "too similar" (SSIM at or above threshold). Mirrors
162
+ // ScreenshotCollector.shouldKeep = ssim < threshold.
163
+ if (ssim >= ssimThreshold)
164
+ keep = false;
165
+ }
166
+ }
167
+ catch {
168
+ // Comparison error → keep the frame (safer to err on inclusion).
169
+ keep = true;
170
+ }
171
+ }
172
+ else if (isFirst) {
173
+ reason = "first";
174
+ }
175
+ else if (isLast) {
176
+ reason = "last";
177
+ }
178
+ if (keep) {
179
+ keptRaw.push({
180
+ bytes: frame.bytes,
181
+ originalStepIndex: frame.originalStepIndex,
182
+ keptReason: reason,
183
+ });
184
+ lastKeptIdx = keptRaw.length - 1;
185
+ }
186
+ rawIdxByStep.set(frame.originalStepIndex, lastKeptIdx);
187
+ }
188
+ // ── Resize ─────────────────────────────────────────────────────────────
189
+ const screenshots = await Promise.all(keptRaw.map(async (raw, canonicalIndex) => {
190
+ const resized = sharp
191
+ ? await resizePng(sharp, raw.bytes, imageResize)
192
+ : raw.bytes;
193
+ return {
194
+ canonicalIndex,
195
+ originalStepIndex: raw.originalStepIndex,
196
+ bytes: resized,
197
+ mediaType: "image/png",
198
+ keptReason: raw.keptReason,
199
+ };
200
+ }));
201
+ // Build step → canonical index lookup from the dropped-fallback table.
202
+ for (const [stepIdx, rawIdx] of rawIdxByStep.entries()) {
203
+ stepIndexToCanonical.set(stepIdx, rawIdx);
204
+ }
205
+ return {
206
+ screenshots,
207
+ stepIndexToCanonical,
208
+ originalCount: rawFrames.length,
209
+ keptCount: screenshots.length,
210
+ thresholds: {
211
+ ssim: ssimThreshold,
212
+ mse: mseThreshold,
213
+ resize: imageResize,
214
+ },
215
+ };
216
+ }
217
+ /**
218
+ * Collect a combined evidence-point list (images + ariaTree text snippets).
219
+ *
220
+ * Images (tier-1 agent screenshots + tier-2 probes + the final observation)
221
+ * go through {@link loadAndReduceScreenshots} (dedup + downscale).
222
+ * Text evidence is sourced from:
223
+ * - tier-2 `probeEvidence.ariaTree` (and `finalObservation.ariaTree`)
224
+ * - tier-1 text/json modalities in `agentEvidence`
225
+ * - native `toolOutput.result`
226
+ *
227
+ * Text snippets are deduplicated on their full normalized content so a "stuck
228
+ * on the same page" agent doesn't produce a flood of identical snippets.
229
+ *
230
+ * `canonicalIndex` is unified across both kinds: the first image gets 0,
231
+ * the next image or text snippet gets 1, etc. The returned `loaded`
232
+ * (`screenshots[].canonicalIndex` and `stepIndexToCanonical`) is re-stamped
233
+ * into this same combined index space so every canonicalIndex in the result
234
+ * references one array.
235
+ */
236
+ async function collectCanonicalEvidence(trajectory, opts = {}) {
237
+ const loaded = await loadAndReduceScreenshots(trajectory, opts);
238
+ const evidence = [];
239
+ const pending = [];
240
+ for (const shot of loaded.screenshots) {
241
+ pending.push({ kind: "image", shot });
242
+ }
243
+ const seenText = new Set();
244
+ const addTextEvidence = (stepIdx, source, text) => {
245
+ // Runtime guard, not just the type: trajectory JSON loaded from disk is
246
+ // unvalidated, so a malformed non-string field must not crash collection.
247
+ if (typeof text !== "string" || text.length === 0)
248
+ return;
249
+ const trimmed = text.length > 4000 ? text.slice(0, 4000) : text;
250
+ const normalized = trimmed.replace(/\s+/g, " ").trim();
251
+ if (normalized.length === 0)
252
+ return;
253
+ // Dedupe on the full normalized text — a length+prefix key would collapse
254
+ // distinct snippets that share a prefix. The 4k cap bounds key size.
255
+ if (seenText.has(normalized))
256
+ return;
257
+ seenText.add(normalized);
258
+ pending.push({
259
+ kind: "text",
260
+ stepIdx,
261
+ source,
262
+ content: trimmed,
263
+ });
264
+ };
265
+ for (let i = 0; i < trajectory.steps.length; i++) {
266
+ const step = trajectory.steps[i];
267
+ addTextEvidence(i, "probe-aria", step.probeEvidence?.ariaTree);
268
+ for (const modality of step.agentEvidence?.modalities ?? []) {
269
+ if (modality.type === "text") {
270
+ addTextEvidence(i, "agent-text", modality.content);
271
+ }
272
+ else if (modality.type === "json") {
273
+ addTextEvidence(i, "agent-json", safeStringifyEvidence(modality.content));
274
+ }
275
+ }
276
+ // Defensive: agentEvidence is derived from toolOutput today, but keeping
277
+ // the native result as a fallback preserves evidence if that mapping
278
+ // changes or an adapter omits modalities.
279
+ addTextEvidence(i, "tool-output", safeStringifyEvidence(step.toolOutput?.result));
280
+ }
281
+ // Terminal aria observation — mirrors the final screenshot frame so the
282
+ // closing page state is scoreable even when the last step had no probe.
283
+ addTextEvidence(trajectory.steps.length, "probe-aria", trajectory.finalObservation?.ariaTree);
284
+ // Sort by step position asc; ties → image before text so the
285
+ // "page state before the harness probed text" reads naturally.
286
+ pending.sort((a, b) => {
287
+ const pa = a.kind === "image" ? a.shot.originalStepIndex : a.stepIdx;
288
+ const pb = b.kind === "image" ? b.shot.originalStepIndex : b.stepIdx;
289
+ if (pa !== pb)
290
+ return pa - pb;
291
+ return a.kind === "image" ? -1 : 1;
292
+ });
293
+ // Stamp canonical indices in the combined ordering. Track the screenshot
294
+ // array-index → combined-index translation so the returned `loaded` can be
295
+ // re-mapped onto the same space (previously screenshots[].canonicalIndex and
296
+ // stepIndexToCanonical pointed into the images-only array and disagreed with
297
+ // `evidence` once text was interleaved).
298
+ const screenshotIdxToCombined = new Map();
299
+ for (const p of pending) {
300
+ if (p.kind === "image") {
301
+ const combinedIndex = evidence.length;
302
+ screenshotIdxToCombined.set(p.shot.canonicalIndex, combinedIndex);
303
+ evidence.push({ ...p.shot, canonicalIndex: combinedIndex });
304
+ }
305
+ else {
306
+ evidence.push({
307
+ canonicalIndex: evidence.length,
308
+ originalStepIndex: p.stepIdx,
309
+ source: p.source,
310
+ content: p.content,
311
+ });
312
+ }
313
+ }
314
+ const remappedScreenshots = loaded.screenshots.map((shot) => {
315
+ const combined = screenshotIdxToCombined.get(shot.canonicalIndex);
316
+ return combined === undefined
317
+ ? shot
318
+ : { ...shot, canonicalIndex: combined };
319
+ });
320
+ const remappedStepIndex = new Map();
321
+ for (const [stepIdx, screenshotIdx] of loaded.stepIndexToCanonical) {
322
+ const combined = screenshotIdxToCombined.get(screenshotIdx);
323
+ if (combined !== undefined)
324
+ remappedStepIndex.set(stepIdx, combined);
325
+ }
326
+ return {
327
+ evidence,
328
+ loaded: {
329
+ ...loaded,
330
+ screenshots: remappedScreenshots,
331
+ stepIndexToCanonical: remappedStepIndex,
332
+ },
333
+ };
334
+ }
335
+ // ─── Internals ────────────────────────────────────────────────────────────
336
+ function safeStringifyEvidence(value) {
337
+ if (value === undefined || value === null)
338
+ return undefined;
339
+ // Strings pass through verbatim — JSON.stringify would wrap them in quotes.
340
+ if (typeof value === "string")
341
+ return value;
342
+ try {
343
+ return JSON.stringify(value);
344
+ }
345
+ catch {
346
+ return String(value);
347
+ }
348
+ }
349
+ /**
350
+ * Port of `imageResize` from packages/evals/utils. Re-encodes as PNG with
351
+ * palette + max compression so the downstream LLM call sees smaller bytes.
352
+ * No-op when sharp can't read the buffer dimensions.
353
+ */
354
+ async function resizePng(sharp, bytes, scaleFactor) {
355
+ if (scaleFactor >= 0.999 && scaleFactor <= 1.001)
356
+ return bytes;
357
+ try {
358
+ const metadata = await sharp(bytes).metadata();
359
+ if (!metadata.width || !metadata.height)
360
+ return bytes;
361
+ const width = Math.max(1, Math.round(metadata.width * scaleFactor));
362
+ const height = Math.max(1, Math.round(metadata.height * scaleFactor));
363
+ return await sharp(bytes)
364
+ .resize(width, height, {
365
+ fit: "inside",
366
+ kernel: sharp.kernel.lanczos3,
367
+ })
368
+ .png({
369
+ compressionLevel: 9,
370
+ adaptiveFiltering: true,
371
+ palette: true,
372
+ })
373
+ .toBuffer();
374
+ }
375
+ catch {
376
+ return bytes;
377
+ }
378
+ }
379
+ /**
380
+ * Port of `ScreenshotCollector.calculateMSE`. Resamples both images to a
381
+ * fixed small size and computes the per-byte squared error mean. Lower
382
+ * means more similar.
383
+ */
384
+ async function calculateMSE(sharp, img1, img2) {
385
+ const size = { width: 400, height: 300 };
386
+ const data1 = await sharp(img1).resize(size).raw().toBuffer();
387
+ const data2 = await sharp(img2).resize(size).raw().toBuffer();
388
+ if (data1.length !== data2.length)
389
+ return Number.MAX_SAFE_INTEGER;
390
+ let sum = 0;
391
+ for (let i = 0; i < data1.length; i++) {
392
+ const diff = data1[i] - data2[i];
393
+ sum += diff * diff;
394
+ }
395
+ return sum / data1.length;
396
+ }
397
+ /**
398
+ * Port of `ScreenshotCollector.calculateSSIM`. Simplified single-window
399
+ * SSIM on grayscale at 400×300. Returns a value in [0, 1] where 1 ==
400
+ * identical (after grayscale downsample).
401
+ */
402
+ async function calculateSSIM(sharp, img1, img2) {
403
+ const size = { width: 400, height: 300 };
404
+ const gray1 = await sharp(img1).resize(size).grayscale().raw().toBuffer();
405
+ const gray2 = await sharp(img2).resize(size).grayscale().raw().toBuffer();
406
+ if (gray1.length !== gray2.length)
407
+ return 0;
408
+ const c1 = 0.01 * 0.01;
409
+ const c2 = 0.03 * 0.03;
410
+ let sum1 = 0;
411
+ let sum2 = 0;
412
+ let sum1Sq = 0;
413
+ let sum2Sq = 0;
414
+ let sum12 = 0;
415
+ const N = gray1.length;
416
+ for (let i = 0; i < N; i++) {
417
+ sum1 += gray1[i];
418
+ sum2 += gray2[i];
419
+ sum1Sq += gray1[i] * gray1[i];
420
+ sum2Sq += gray2[i] * gray2[i];
421
+ sum12 += gray1[i] * gray2[i];
422
+ }
423
+ const mean1 = sum1 / N;
424
+ const mean2 = sum2 / N;
425
+ const var1 = sum1Sq / N - mean1 * mean1;
426
+ const var2 = sum2Sq / N - mean2 * mean2;
427
+ const cov12 = sum12 / N - mean1 * mean2;
428
+ const numerator = (2 * mean1 * mean2 + c1) * (2 * cov12 + c2);
429
+ const denominator = (mean1 * mean1 + mean2 * mean2 + c1) * (var1 + var2 + c2);
430
+ return numerator / denominator;
431
+ }
432
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../../../lib/v3/verifier/evidence.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA,0CAIC;AAED,wCAMC;AAWD,4DAgKC;AAqBD,4DAuIC;AA7WD,IAAI,YAAY,GAAiC,IAAI,CAAC;AAEtD,KAAK,UAAU,SAAS;IACtB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,YAAY,GAAG,CAAC,KAAK,IAA2B,EAAE;QAChD,IAAI,CAAC;YACH,mEAAmE;YACnE,mEAAmE;YACnE,kEAAkE;YAClE,MAAM,SAAS,GAAG,OAAO,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,yBAAa,SAAS,uCAAC,CAE3B,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAU,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,gEAAgE;AAChE,SAAgB,eAAe,CAC7B,CAAoB;IAEpB,OAAO,OAAO,IAAI,CAAC,IAAK,CAAyB,CAAC,KAAK,YAAY,MAAM,CAAC;AAC5E,CAAC;AAED,SAAgB,cAAc,CAC5B,CAAoB;IAEpB,OAAO,CACL,SAAS,IAAI,CAAC,IAAI,OAAQ,CAA2B,CAAC,OAAO,KAAK,QAAQ,CAC3E,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,wBAAwB,CAC5C,UAAsB,EACtB,OAA4B,EAAE;IAE9B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACnE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,qBAAqB,CAAC;IAChE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAE7D,qEAAqE;IACrE,6EAA6E;IAC7E,uEAAuE;IACvE,uEAAuE;IACvE,8EAA8E;IAC9E,qEAAqE;IACrE,MAAM,SAAS,GAGV,EAAE,CAAC;IAER,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,kEAAkE;QAClE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxD,SAAS,CAAC,IAAI,CAAC;oBACb,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,iBAAiB,EAAE,CAAC;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,wCAAwC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;QAC3C,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,GAAG;gBACV,iBAAiB,EAAE,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,EAAE,UAAU,CAAC;IAC1D,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC;YACb,KAAK,EAAE,SAAS;YAChB,iBAAiB,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,WAAW,EAAE,EAAE;YACf,oBAAoB;YACpB,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE;gBACV,IAAI,EAAE,aAAa;gBACnB,GAAG,EAAE,YAAY;gBACjB,MAAM,EAAE,WAAW;aACpB;SACF,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,uEAAuE;IACvE,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,OAAO,GAIR,EAAE,CAAC;IAER,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAE1C,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,MAAM,GAAsC,KAAK;YACnD,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,CAAC;QAEf,IAAI,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC/D,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;oBACvB,IAAI,GAAG,KAAK,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBACjE,gEAAgE;oBAChE,qDAAqD;oBACrD,IAAI,IAAI,IAAI,aAAa;wBAAE,IAAI,GAAG,KAAK,CAAC;gBAC1C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;gBACjE,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YACH,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED,0EAA0E;IAC1E,MAAM,WAAW,GAA0B,MAAM,OAAO,CAAC,GAAG,CAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,EAAgC,EAAE;QACtE,MAAM,OAAO,GAAG,KAAK;YACnB,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;YAChD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QACd,OAAO;YACL,cAAc;YACd,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,uEAAuE;IACvE,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACvD,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,WAAW;QACX,oBAAoB;QACpB,aAAa,EAAE,SAAS,CAAC,MAAM;QAC/B,SAAS,EAAE,WAAW,CAAC,MAAM;QAC7B,UAAU,EAAE;YACV,IAAI,EAAE,aAAa;YACnB,GAAG,EAAE,YAAY;YACjB,MAAM,EAAE,WAAW;SACpB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,wBAAwB,CAC5C,UAAsB,EACtB,OAA4B,EAAE;IAK9B,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAazC,MAAM,OAAO,GAAc,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,eAAe,GAAG,CACtB,OAAe,EACf,MAAuC,EACvC,IAAwB,EACxB,EAAE;QACF,wEAAwE;QACxE,0EAA0E;QAC1E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,0EAA0E;QAC1E,qEAAqE;QACrE,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO;QACrC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,MAAM;YACN,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAE/D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;YAC5D,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC7B,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpC,eAAe,CACb,CAAC,EACD,YAAY,EACZ,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,CACxC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,qEAAqE;QACrE,0CAA0C;QAC1C,eAAe,CACb,CAAC,EACD,aAAa,EACb,qBAAqB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAC/C,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,wEAAwE;IACxE,eAAe,CACb,UAAU,CAAC,KAAK,CAAC,MAAM,EACvB,YAAY,EACZ,UAAU,CAAC,gBAAgB,EAAE,QAAQ,CACtC,CAAC;IAEF,6DAA6D;IAC7D,+DAA+D;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrE,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrE,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,yEAAyE;IACzE,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,yCAAyC;IACzC,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;YACtC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC;gBACZ,cAAc,EAAE,QAAQ,CAAC,MAAM;gBAC/B,iBAAiB,EAAE,CAAC,CAAC,OAAO;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,OAAO,QAAQ,KAAK,SAAS;YAC3B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpD,KAAK,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5D,IAAI,QAAQ,KAAK,SAAS;YAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,QAAQ;QACR,MAAM,EAAE;YACN,GAAG,MAAM;YACT,WAAW,EAAE,mBAAmB;YAChC,oBAAoB,EAAE,iBAAiB;SACxC;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,4EAA4E;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,SAAS,CACtB,KAAY,EACZ,KAAa,EACb,WAAmB;IAEnB,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;QACtE,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC;aACtB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YACrB,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;SAC9B,CAAC;aACD,GAAG,CAAC;YACH,gBAAgB,EAAE,CAAC;YACnB,iBAAiB,EAAE,IAAI;YACvB,OAAO,EAAE,IAAI;SACd,CAAC;aACD,QAAQ,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,YAAY,CACzB,KAAY,EACZ,IAAY,EACZ,IAAY;IAEZ,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,gBAAgB,CAAC;IAClE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAC1B,KAAY,EACZ,IAAY,EACZ,IAAY;IAEZ,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC1E,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAE5C,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;IACvB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IACxC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAC9E,OAAO,SAAS,GAAG,WAAW,CAAC;AACjC,CAAC","sourcesContent":["/**\n * Evidence loader: hydrate tier-1 agent screenshots, tier-2 probe screenshots,\n * and the terminal final observation from a trajectory; dedup near-identical\n * frames with MSE + SSIM; and downsize for the relevance LLM call. The first\n * and last frames are always kept so the verifier can cite the trajectory's\n * bookends. `sharp` is loaded dynamically; if unavailable, dedup/resize no-op.\n */\nimport type {\n CanonicalEvidence,\n CanonicalScreenshot,\n CanonicalTextEvidence,\n EvidenceLoadOptions,\n EvidenceLoadResult,\n Trajectory,\n} from \"./types.js\";\n\n// Lazy-loaded `sharp` namespace. When `sharp` is not installed, we fall back\n// to keep-everything-at-native-size. Keep this structural so core does not\n// need to publish sharp as a runtime dependency.\ninterface SharpImage {\n metadata(): Promise<{ width?: number; height?: number }>;\n resize(\n width: number,\n height?: number,\n options?: { fit?: string; kernel?: unknown },\n ): SharpImage;\n resize(options: { width: number; height: number }): SharpImage;\n raw(): SharpImage;\n grayscale(): SharpImage;\n png(options?: {\n compressionLevel?: number;\n adaptiveFiltering?: boolean;\n palette?: boolean;\n }): SharpImage;\n toBuffer(): Promise<Buffer>;\n}\n\ntype Sharp = ((input: Buffer) => SharpImage) & {\n kernel: { lanczos3: unknown };\n};\nlet sharpPromise: Promise<Sharp | null> | null = null;\n\nasync function loadSharp(): Promise<Sharp | null> {\n if (sharpPromise) return sharpPromise;\n sharpPromise = (async (): Promise<Sharp | null> => {\n try {\n // Dynamic specifier hides sharp from TypeScript's module resolver:\n // sharp is an optional runtime dep (evals/server installs it; core\n // consumers don't have to). try/catch handles missing-at-runtime.\n const specifier = \"sharp\";\n const mod = (await import(specifier)) as unknown as {\n default?: Sharp;\n } & Sharp;\n return (mod.default ?? mod) as Sharp;\n } catch {\n return null;\n }\n })();\n return sharpPromise;\n}\n\nconst DEFAULT_SSIM_THRESHOLD = 0.75;\nconst DEFAULT_MSE_THRESHOLD = 30;\nconst DEFAULT_IMAGE_RESIZE = 0.7;\n\n/** Discriminator helpers — kind === \"image\" for screenshots. */\nexport function isImageEvidence(\n e: CanonicalEvidence,\n): e is CanonicalScreenshot {\n return \"bytes\" in e && (e as CanonicalScreenshot).bytes instanceof Buffer;\n}\n\nexport function isTextEvidence(\n e: CanonicalEvidence,\n): e is CanonicalTextEvidence {\n return (\n \"content\" in e && typeof (e as CanonicalTextEvidence).content === \"string\"\n );\n}\n\n/**\n * Step 1 — load trajectory screenshots from disk (or memory), deduplicate,\n * and downsize.\n *\n * Returns an array of canonical screenshots ready to feed into Step 2.\n * Steps without a captured probe screenshot are skipped silently — they\n * never reach the canonical array, but their action context still appears\n * in the prompt's action history.\n */\nexport async function loadAndReduceScreenshots(\n trajectory: Trajectory,\n opts: EvidenceLoadOptions = {},\n): Promise<EvidenceLoadResult> {\n const ssimThreshold = opts.ssimThreshold ?? DEFAULT_SSIM_THRESHOLD;\n const mseThreshold = opts.mseThreshold ?? DEFAULT_MSE_THRESHOLD;\n const imageResize = opts.imageResize ?? DEFAULT_IMAGE_RESIZE;\n\n // Collect raw frames in chronological order. Per step we take tier-1\n // agent-mirrored screenshots first (the exact bytes a CUA provider saw, plus\n // any inline act() screenshots lifted into image modalities), then the\n // tier-2 post-action probe. Buffers are populated either live or after\n // loadTrajectoryFromDisk(); absent/empty buffers are skipped. Dedup collapses\n // near-identical frames downstream, so including both tiers is safe.\n const rawFrames: Array<{\n bytes: Buffer;\n originalStepIndex: number;\n }> = [];\n\n for (let i = 0; i < trajectory.steps.length; i++) {\n const step = trajectory.steps[i];\n // tier-1: agent screenshots, in modality order, before the probe.\n for (const m of step.agentEvidence?.modalities ?? []) {\n if (m.type === \"image\" && m.bytes && m.bytes.length > 0) {\n rawFrames.push({\n bytes: m.bytes,\n originalStepIndex: i,\n });\n }\n }\n // tier-2: post-action probe screenshot.\n const buf = step.probeEvidence?.screenshot;\n if (buf && buf.length > 0) {\n rawFrames.push({\n bytes: buf,\n originalStepIndex: i,\n });\n }\n }\n\n // Terminal page observation captured after the agent finished. Preserves the\n // legacy final-screenshot verification behavior; positioned after every step\n // so it anchors as the trajectory's closing frame (always kept as \"last\").\n const finalShot = trajectory.finalObservation?.screenshot;\n if (finalShot && finalShot.length > 0) {\n rawFrames.push({\n bytes: finalShot,\n originalStepIndex: trajectory.steps.length,\n });\n }\n\n const sharp = await loadSharp();\n const stepIndexToCanonical = new Map<number, number>();\n\n if (rawFrames.length === 0) {\n return {\n screenshots: [],\n stepIndexToCanonical,\n originalCount: 0,\n keptCount: 0,\n thresholds: {\n ssim: ssimThreshold,\n mse: mseThreshold,\n resize: imageResize,\n },\n };\n }\n\n // ── Dedup ──────────────────────────────────────────────────────────────\n // First + last always kept. Middle frames kept iff they're sufficiently\n // dissimilar to the previously kept frame. Dissimilarity check mirrors\n // ScreenshotCollector: quick MSE pass, escalate to SSIM only if MSE\n // suggests the frames differ. If sharp is unavailable, keep everything.\n const keptRaw: Array<{\n bytes: Buffer;\n originalStepIndex: number;\n keptReason: CanonicalScreenshot[\"keptReason\"];\n }> = [];\n\n // Track which raw-frame index each step maps to. Pre-fill with \"the last\n // kept frame so far\" so dropped frames fall back to their surviving peer.\n const rawIdxByStep = new Map<number, number>();\n\n let lastKeptIdx = 0;\n\n for (let i = 0; i < rawFrames.length; i++) {\n const frame = rawFrames[i];\n const isFirst = i === 0;\n const isLast = i === rawFrames.length - 1;\n\n let keep = true;\n let reason: CanonicalScreenshot[\"keptReason\"] = sharp\n ? \"diverges\"\n : \"no-dedup\";\n\n if (sharp && !isFirst && !isLast) {\n const prev = keptRaw[keptRaw.length - 1];\n try {\n const mse = await calculateMSE(sharp, prev.bytes, frame.bytes);\n if (mse < mseThreshold) {\n keep = false;\n } else {\n const ssim = await calculateSSIM(sharp, prev.bytes, frame.bytes);\n // Drop when \"too similar\" (SSIM at or above threshold). Mirrors\n // ScreenshotCollector.shouldKeep = ssim < threshold.\n if (ssim >= ssimThreshold) keep = false;\n }\n } catch {\n // Comparison error → keep the frame (safer to err on inclusion).\n keep = true;\n }\n } else if (isFirst) {\n reason = \"first\";\n } else if (isLast) {\n reason = \"last\";\n }\n\n if (keep) {\n keptRaw.push({\n bytes: frame.bytes,\n originalStepIndex: frame.originalStepIndex,\n keptReason: reason,\n });\n lastKeptIdx = keptRaw.length - 1;\n }\n rawIdxByStep.set(frame.originalStepIndex, lastKeptIdx);\n }\n\n // ── Resize ─────────────────────────────────────────────────────────────\n const screenshots: CanonicalScreenshot[] = await Promise.all(\n keptRaw.map(async (raw, canonicalIndex): Promise<CanonicalScreenshot> => {\n const resized = sharp\n ? await resizePng(sharp, raw.bytes, imageResize)\n : raw.bytes;\n return {\n canonicalIndex,\n originalStepIndex: raw.originalStepIndex,\n bytes: resized,\n mediaType: \"image/png\",\n keptReason: raw.keptReason,\n };\n }),\n );\n\n // Build step → canonical index lookup from the dropped-fallback table.\n for (const [stepIdx, rawIdx] of rawIdxByStep.entries()) {\n stepIndexToCanonical.set(stepIdx, rawIdx);\n }\n\n return {\n screenshots,\n stepIndexToCanonical,\n originalCount: rawFrames.length,\n keptCount: screenshots.length,\n thresholds: {\n ssim: ssimThreshold,\n mse: mseThreshold,\n resize: imageResize,\n },\n };\n}\n\n/**\n * Collect a combined evidence-point list (images + ariaTree text snippets).\n *\n * Images (tier-1 agent screenshots + tier-2 probes + the final observation)\n * go through {@link loadAndReduceScreenshots} (dedup + downscale).\n * Text evidence is sourced from:\n * - tier-2 `probeEvidence.ariaTree` (and `finalObservation.ariaTree`)\n * - tier-1 text/json modalities in `agentEvidence`\n * - native `toolOutput.result`\n *\n * Text snippets are deduplicated on their full normalized content so a \"stuck\n * on the same page\" agent doesn't produce a flood of identical snippets.\n *\n * `canonicalIndex` is unified across both kinds: the first image gets 0,\n * the next image or text snippet gets 1, etc. The returned `loaded`\n * (`screenshots[].canonicalIndex` and `stepIndexToCanonical`) is re-stamped\n * into this same combined index space so every canonicalIndex in the result\n * references one array.\n */\nexport async function collectCanonicalEvidence(\n trajectory: Trajectory,\n opts: EvidenceLoadOptions = {},\n): Promise<{\n evidence: CanonicalEvidence[];\n loaded: EvidenceLoadResult;\n}> {\n const loaded = await loadAndReduceScreenshots(trajectory, opts);\n const evidence: CanonicalEvidence[] = [];\n\n // Interleave images and text by step position so the resulting array is\n // (roughly) chronological. We collect texts per step, then merge by\n // step position with images.\n type Pending =\n | { kind: \"image\"; shot: CanonicalScreenshot }\n | {\n kind: \"text\";\n stepIdx: number;\n source: CanonicalTextEvidence[\"source\"];\n content: string;\n };\n const pending: Pending[] = [];\n\n for (const shot of loaded.screenshots) {\n pending.push({ kind: \"image\", shot });\n }\n\n const seenText = new Set<string>();\n const addTextEvidence = (\n stepIdx: number,\n source: CanonicalTextEvidence[\"source\"],\n text: string | undefined,\n ) => {\n // Runtime guard, not just the type: trajectory JSON loaded from disk is\n // unvalidated, so a malformed non-string field must not crash collection.\n if (typeof text !== \"string\" || text.length === 0) return;\n const trimmed = text.length > 4000 ? text.slice(0, 4000) : text;\n const normalized = trimmed.replace(/\\s+/g, \" \").trim();\n if (normalized.length === 0) return;\n // Dedupe on the full normalized text — a length+prefix key would collapse\n // distinct snippets that share a prefix. The 4k cap bounds key size.\n if (seenText.has(normalized)) return;\n seenText.add(normalized);\n pending.push({\n kind: \"text\",\n stepIdx,\n source,\n content: trimmed,\n });\n };\n\n for (let i = 0; i < trajectory.steps.length; i++) {\n const step = trajectory.steps[i];\n addTextEvidence(i, \"probe-aria\", step.probeEvidence?.ariaTree);\n\n for (const modality of step.agentEvidence?.modalities ?? []) {\n if (modality.type === \"text\") {\n addTextEvidence(i, \"agent-text\", modality.content);\n } else if (modality.type === \"json\") {\n addTextEvidence(\n i,\n \"agent-json\",\n safeStringifyEvidence(modality.content),\n );\n }\n }\n\n // Defensive: agentEvidence is derived from toolOutput today, but keeping\n // the native result as a fallback preserves evidence if that mapping\n // changes or an adapter omits modalities.\n addTextEvidence(\n i,\n \"tool-output\",\n safeStringifyEvidence(step.toolOutput?.result),\n );\n }\n\n // Terminal aria observation — mirrors the final screenshot frame so the\n // closing page state is scoreable even when the last step had no probe.\n addTextEvidence(\n trajectory.steps.length,\n \"probe-aria\",\n trajectory.finalObservation?.ariaTree,\n );\n\n // Sort by step position asc; ties → image before text so the\n // \"page state before the harness probed text\" reads naturally.\n pending.sort((a, b) => {\n const pa = a.kind === \"image\" ? a.shot.originalStepIndex : a.stepIdx;\n const pb = b.kind === \"image\" ? b.shot.originalStepIndex : b.stepIdx;\n if (pa !== pb) return pa - pb;\n return a.kind === \"image\" ? -1 : 1;\n });\n\n // Stamp canonical indices in the combined ordering. Track the screenshot\n // array-index → combined-index translation so the returned `loaded` can be\n // re-mapped onto the same space (previously screenshots[].canonicalIndex and\n // stepIndexToCanonical pointed into the images-only array and disagreed with\n // `evidence` once text was interleaved).\n const screenshotIdxToCombined = new Map<number, number>();\n for (const p of pending) {\n if (p.kind === \"image\") {\n const combinedIndex = evidence.length;\n screenshotIdxToCombined.set(p.shot.canonicalIndex, combinedIndex);\n evidence.push({ ...p.shot, canonicalIndex: combinedIndex });\n } else {\n evidence.push({\n canonicalIndex: evidence.length,\n originalStepIndex: p.stepIdx,\n source: p.source,\n content: p.content,\n });\n }\n }\n\n const remappedScreenshots = loaded.screenshots.map((shot) => {\n const combined = screenshotIdxToCombined.get(shot.canonicalIndex);\n return combined === undefined\n ? shot\n : { ...shot, canonicalIndex: combined };\n });\n const remappedStepIndex = new Map<number, number>();\n for (const [stepIdx, screenshotIdx] of loaded.stepIndexToCanonical) {\n const combined = screenshotIdxToCombined.get(screenshotIdx);\n if (combined !== undefined) remappedStepIndex.set(stepIdx, combined);\n }\n\n return {\n evidence,\n loaded: {\n ...loaded,\n screenshots: remappedScreenshots,\n stepIndexToCanonical: remappedStepIndex,\n },\n };\n}\n\n// ─── Internals ────────────────────────────────────────────────────────────\n\nfunction safeStringifyEvidence(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n // Strings pass through verbatim — JSON.stringify would wrap them in quotes.\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Port of `imageResize` from packages/evals/utils. Re-encodes as PNG with\n * palette + max compression so the downstream LLM call sees smaller bytes.\n * No-op when sharp can't read the buffer dimensions.\n */\nasync function resizePng(\n sharp: Sharp,\n bytes: Buffer,\n scaleFactor: number,\n): Promise<Buffer> {\n if (scaleFactor >= 0.999 && scaleFactor <= 1.001) return bytes;\n try {\n const metadata = await sharp(bytes).metadata();\n if (!metadata.width || !metadata.height) return bytes;\n const width = Math.max(1, Math.round(metadata.width * scaleFactor));\n const height = Math.max(1, Math.round(metadata.height * scaleFactor));\n return await sharp(bytes)\n .resize(width, height, {\n fit: \"inside\",\n kernel: sharp.kernel.lanczos3,\n })\n .png({\n compressionLevel: 9,\n adaptiveFiltering: true,\n palette: true,\n })\n .toBuffer();\n } catch {\n return bytes;\n }\n}\n\n/**\n * Port of `ScreenshotCollector.calculateMSE`. Resamples both images to a\n * fixed small size and computes the per-byte squared error mean. Lower\n * means more similar.\n */\nasync function calculateMSE(\n sharp: Sharp,\n img1: Buffer,\n img2: Buffer,\n): Promise<number> {\n const size = { width: 400, height: 300 };\n const data1 = await sharp(img1).resize(size).raw().toBuffer();\n const data2 = await sharp(img2).resize(size).raw().toBuffer();\n if (data1.length !== data2.length) return Number.MAX_SAFE_INTEGER;\n let sum = 0;\n for (let i = 0; i < data1.length; i++) {\n const diff = data1[i] - data2[i];\n sum += diff * diff;\n }\n return sum / data1.length;\n}\n\n/**\n * Port of `ScreenshotCollector.calculateSSIM`. Simplified single-window\n * SSIM on grayscale at 400×300. Returns a value in [0, 1] where 1 ==\n * identical (after grayscale downsample).\n */\nasync function calculateSSIM(\n sharp: Sharp,\n img1: Buffer,\n img2: Buffer,\n): Promise<number> {\n const size = { width: 400, height: 300 };\n const gray1 = await sharp(img1).resize(size).grayscale().raw().toBuffer();\n const gray2 = await sharp(img2).resize(size).grayscale().raw().toBuffer();\n if (gray1.length !== gray2.length) return 0;\n\n const c1 = 0.01 * 0.01;\n const c2 = 0.03 * 0.03;\n let sum1 = 0;\n let sum2 = 0;\n let sum1Sq = 0;\n let sum2Sq = 0;\n let sum12 = 0;\n const N = gray1.length;\n for (let i = 0; i < N; i++) {\n sum1 += gray1[i];\n sum2 += gray2[i];\n sum1Sq += gray1[i] * gray1[i];\n sum2Sq += gray2[i] * gray2[i];\n sum12 += gray1[i] * gray2[i];\n }\n const mean1 = sum1 / N;\n const mean2 = sum2 / N;\n const var1 = sum1Sq / N - mean1 * mean1;\n const var2 = sum2Sq / N - mean2 * mean2;\n const cov12 = sum12 / N - mean1 * mean2;\n const numerator = (2 * mean1 * mean2 + c1) * (2 * cov12 + c2);\n const denominator = (mean1 * mean1 + mean2 * mean2 + c1) * (var1 + var2 + c2);\n return numerator / denominator;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { AgentStepFinishedEvent } from "../types/public/agentEvidenceEvents.js";
2
+ import type { AgentEvidence } from "./types.js";
3
+ export declare const REDACTED_INLINE_IMAGE = "[redacted inline image payload]";
4
+ export declare function collectInlineImagePayloads(value: unknown, actionName?: string, out?: string[]): string[];
5
+ export declare function redactInlineImagePayloads(value: unknown, actionName?: string): unknown;
6
+ export declare function mergeAgentEvidence(...parts: Array<AgentEvidence | undefined>): AgentEvidence;
7
+ export declare function buildAgentEvidenceFromStepFinished(event: AgentStepFinishedEvent): AgentEvidence;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REDACTED_INLINE_IMAGE = void 0;
4
+ exports.collectInlineImagePayloads = collectInlineImagePayloads;
5
+ exports.redactInlineImagePayloads = redactInlineImagePayloads;
6
+ exports.mergeAgentEvidence = mergeAgentEvidence;
7
+ exports.buildAgentEvidenceFromStepFinished = buildAgentEvidenceFromStepFinished;
8
+ exports.REDACTED_INLINE_IMAGE = "[redacted inline image payload]";
9
+ const INLINE_IMAGE_KEYS = new Set(["screenshotBase64"]);
10
+ function shouldRedactBase64Key(key, actionName) {
11
+ return (INLINE_IMAGE_KEYS.has(key) ||
12
+ (actionName === "screenshot" && key === "base64"));
13
+ }
14
+ function collectInlineImagePayloads(value, actionName, out = []) {
15
+ if (!value || typeof value !== "object")
16
+ return out;
17
+ if (Buffer.isBuffer(value))
18
+ return out;
19
+ if (Array.isArray(value)) {
20
+ for (const item of value) {
21
+ collectInlineImagePayloads(item, actionName, out);
22
+ }
23
+ return out;
24
+ }
25
+ for (const [key, nested] of Object.entries(value)) {
26
+ if (shouldRedactBase64Key(key, actionName) && typeof nested === "string") {
27
+ out.push(nested);
28
+ continue;
29
+ }
30
+ collectInlineImagePayloads(nested, actionName, out);
31
+ }
32
+ return out;
33
+ }
34
+ function redactInlineImagePayloads(value, actionName) {
35
+ if (!value || typeof value !== "object")
36
+ return value;
37
+ if (Buffer.isBuffer(value))
38
+ return value;
39
+ if (Array.isArray(value)) {
40
+ return value.map((item) => redactInlineImagePayloads(item, actionName));
41
+ }
42
+ const out = {};
43
+ for (const [key, nested] of Object.entries(value)) {
44
+ out[key] =
45
+ shouldRedactBase64Key(key, actionName) && typeof nested === "string"
46
+ ? exports.REDACTED_INLINE_IMAGE
47
+ : redactInlineImagePayloads(nested, actionName);
48
+ }
49
+ return out;
50
+ }
51
+ function mergeAgentEvidence(...parts) {
52
+ return {
53
+ modalities: parts.flatMap((p) => p?.modalities ?? []),
54
+ };
55
+ }
56
+ function buildAgentEvidenceFromStepFinished(event) {
57
+ const modalities = [];
58
+ if (event.reasoning) {
59
+ modalities.push({ type: "text", content: event.reasoning });
60
+ }
61
+ const result = event.toolOutput.result;
62
+ if (result === undefined || result === null) {
63
+ return { modalities };
64
+ }
65
+ if (typeof result === "string") {
66
+ modalities.push({ type: "text", content: result });
67
+ }
68
+ else if (typeof result === "number" ||
69
+ typeof result === "boolean" ||
70
+ typeof result === "bigint") {
71
+ modalities.push({ type: "text", content: String(result) });
72
+ }
73
+ else if (Buffer.isBuffer(result)) {
74
+ modalities.push({
75
+ type: "image",
76
+ bytes: result,
77
+ mediaType: "image/png",
78
+ });
79
+ }
80
+ else if (typeof result === "object") {
81
+ for (const imageBase64 of collectInlineImagePayloads(result, event.actionName)) {
82
+ try {
83
+ modalities.push({
84
+ type: "image",
85
+ bytes: Buffer.from(imageBase64, "base64"),
86
+ mediaType: "image/png",
87
+ });
88
+ }
89
+ catch {
90
+ // Malformed base64; skip the image and keep the JSON modality.
91
+ }
92
+ }
93
+ modalities.push({
94
+ type: "json",
95
+ content: redactInlineImagePayloads(result, event.actionName),
96
+ });
97
+ }
98
+ return { modalities };
99
+ }
100
+ //# sourceMappingURL=evidenceNormalization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidenceNormalization.js","sourceRoot":"","sources":["../../../../../lib/v3/verifier/evidenceNormalization.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentStepFinishedEvent } from \"../types/public/agentEvidenceEvents.js\";\nimport type { AgentEvidence } from \"./types.js\";\n\nexport const REDACTED_INLINE_IMAGE = \"[redacted inline image payload]\";\n\nconst INLINE_IMAGE_KEYS = new Set([\"screenshotBase64\"]);\n\nfunction shouldRedactBase64Key(key: string, actionName?: string): boolean {\n return (\n INLINE_IMAGE_KEYS.has(key) ||\n (actionName === \"screenshot\" && key === \"base64\")\n );\n}\n\nexport function collectInlineImagePayloads(\n value: unknown,\n actionName?: string,\n out: string[] = [],\n): string[] {\n if (!value || typeof value !== \"object\") return out;\n if (Buffer.isBuffer(value)) return out;\n\n if (Array.isArray(value)) {\n for (const item of value) {\n collectInlineImagePayloads(item, actionName, out);\n }\n return out;\n }\n\n for (const [key, nested] of Object.entries(value)) {\n if (shouldRedactBase64Key(key, actionName) && typeof nested === \"string\") {\n out.push(nested);\n continue;\n }\n collectInlineImagePayloads(nested, actionName, out);\n }\n return out;\n}\n\nexport function redactInlineImagePayloads(\n value: unknown,\n actionName?: string,\n): unknown {\n if (!value || typeof value !== \"object\") return value;\n if (Buffer.isBuffer(value)) return value;\n\n if (Array.isArray(value)) {\n return value.map((item) => redactInlineImagePayloads(item, actionName));\n }\n\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) {\n out[key] =\n shouldRedactBase64Key(key, actionName) && typeof nested === \"string\"\n ? REDACTED_INLINE_IMAGE\n : redactInlineImagePayloads(nested, actionName);\n }\n return out;\n}\n\nexport function mergeAgentEvidence(\n ...parts: Array<AgentEvidence | undefined>\n): AgentEvidence {\n return {\n modalities: parts.flatMap((p) => p?.modalities ?? []),\n };\n}\n\nexport function buildAgentEvidenceFromStepFinished(\n event: AgentStepFinishedEvent,\n): AgentEvidence {\n const modalities: AgentEvidence[\"modalities\"] = [];\n if (event.reasoning) {\n modalities.push({ type: \"text\", content: event.reasoning });\n }\n\n const result = event.toolOutput.result;\n if (result === undefined || result === null) {\n return { modalities };\n }\n\n if (typeof result === \"string\") {\n modalities.push({ type: \"text\", content: result });\n } else if (\n typeof result === \"number\" ||\n typeof result === \"boolean\" ||\n typeof result === \"bigint\"\n ) {\n modalities.push({ type: \"text\", content: String(result) });\n } else if (Buffer.isBuffer(result)) {\n modalities.push({\n type: \"image\",\n bytes: result,\n mediaType: \"image/png\",\n });\n } else if (typeof result === \"object\") {\n for (const imageBase64 of collectInlineImagePayloads(\n result,\n event.actionName,\n )) {\n try {\n modalities.push({\n type: \"image\",\n bytes: Buffer.from(imageBase64, \"base64\"),\n mediaType: \"image/png\",\n });\n } catch {\n // Malformed base64; skip the image and keep the JSON modality.\n }\n }\n modalities.push({\n type: \"json\",\n content: redactInlineImagePayloads(result, event.actionName),\n });\n }\n\n return { modalities };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Public re-exports for the verifier subsystem.
3
+ */
4
+ export type { AgentEvidence, AgentEvidenceModality, CanonicalEvidence, CanonicalScreenshot, CanonicalTextEvidence, CriterionScore, EvaluationResult, ErrorTaxonomyCategory, ErrorTaxonomySubCategory, EvidenceLoadOptions, EvidenceLoadResult, FirstPointOfFailure, ParseFailureStepNumbersOptions, ProbeEvidence, Rubric, RubricCriterion, RubricVerifierOptions, TaskSpec, TaskValidity, ToolOutput, Trajectory, TrajectoryStatus, TrajectoryStep, TrajectoryUsage, Verifier, VerifierConfig, VerifierFinding, VerifierRawSteps, } from "./types.js";
5
+ export { buildAgentEvidenceFromStepFinished, collectInlineImagePayloads, mergeAgentEvidence, redactInlineImagePayloads, REDACTED_INLINE_IMAGE, } from "./evidenceNormalization.js";
6
+ export { loadTrajectoryFromDisk, nextResultFilename, normalizeRubric, shouldPersistTrajectory, writeTrajectoryDir, } from "./trajectory.js";
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.writeTrajectoryDir = exports.shouldPersistTrajectory = exports.normalizeRubric = exports.nextResultFilename = exports.loadTrajectoryFromDisk = exports.REDACTED_INLINE_IMAGE = exports.redactInlineImagePayloads = exports.mergeAgentEvidence = exports.collectInlineImagePayloads = exports.buildAgentEvidenceFromStepFinished = void 0;
4
+ var evidenceNormalization_js_1 = require("./evidenceNormalization.js");
5
+ Object.defineProperty(exports, "buildAgentEvidenceFromStepFinished", { enumerable: true, get: function () { return evidenceNormalization_js_1.buildAgentEvidenceFromStepFinished; } });
6
+ Object.defineProperty(exports, "collectInlineImagePayloads", { enumerable: true, get: function () { return evidenceNormalization_js_1.collectInlineImagePayloads; } });
7
+ Object.defineProperty(exports, "mergeAgentEvidence", { enumerable: true, get: function () { return evidenceNormalization_js_1.mergeAgentEvidence; } });
8
+ Object.defineProperty(exports, "redactInlineImagePayloads", { enumerable: true, get: function () { return evidenceNormalization_js_1.redactInlineImagePayloads; } });
9
+ Object.defineProperty(exports, "REDACTED_INLINE_IMAGE", { enumerable: true, get: function () { return evidenceNormalization_js_1.REDACTED_INLINE_IMAGE; } });
10
+ var trajectory_js_1 = require("./trajectory.js");
11
+ Object.defineProperty(exports, "loadTrajectoryFromDisk", { enumerable: true, get: function () { return trajectory_js_1.loadTrajectoryFromDisk; } });
12
+ Object.defineProperty(exports, "nextResultFilename", { enumerable: true, get: function () { return trajectory_js_1.nextResultFilename; } });
13
+ Object.defineProperty(exports, "normalizeRubric", { enumerable: true, get: function () { return trajectory_js_1.normalizeRubric; } });
14
+ Object.defineProperty(exports, "shouldPersistTrajectory", { enumerable: true, get: function () { return trajectory_js_1.shouldPersistTrajectory; } });
15
+ Object.defineProperty(exports, "writeTrajectoryDir", { enumerable: true, get: function () { return trajectory_js_1.writeTrajectoryDir; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../lib/v3/verifier/index.ts"],"names":[],"mappings":";;;AAiCA,uEAMoC;AALlC,8IAAA,kCAAkC,OAAA;AAClC,sIAAA,0BAA0B,OAAA;AAC1B,8HAAA,kBAAkB,OAAA;AAClB,qIAAA,yBAAyB,OAAA;AACzB,iIAAA,qBAAqB,OAAA;AAEvB,iDAMyB;AALvB,uHAAA,sBAAsB,OAAA;AACtB,mHAAA,kBAAkB,OAAA;AAClB,gHAAA,eAAe,OAAA;AACf,wHAAA,uBAAuB,OAAA;AACvB,mHAAA,kBAAkB,OAAA","sourcesContent":["/**\n * Public re-exports for the verifier subsystem.\n */\nexport type {\n AgentEvidence,\n AgentEvidenceModality,\n CanonicalEvidence,\n CanonicalScreenshot,\n CanonicalTextEvidence,\n CriterionScore,\n EvaluationResult,\n ErrorTaxonomyCategory,\n ErrorTaxonomySubCategory,\n EvidenceLoadOptions,\n EvidenceLoadResult,\n FirstPointOfFailure,\n ParseFailureStepNumbersOptions,\n ProbeEvidence,\n Rubric,\n RubricCriterion,\n RubricVerifierOptions,\n TaskSpec,\n TaskValidity,\n ToolOutput,\n Trajectory,\n TrajectoryStatus,\n TrajectoryStep,\n TrajectoryUsage,\n Verifier,\n VerifierConfig,\n VerifierFinding,\n VerifierRawSteps,\n} from \"./types.js\";\nexport {\n buildAgentEvidenceFromStepFinished,\n collectInlineImagePayloads,\n mergeAgentEvidence,\n redactInlineImagePayloads,\n REDACTED_INLINE_IMAGE,\n} from \"./evidenceNormalization.js\";\nexport {\n loadTrajectoryFromDisk,\n nextResultFilename,\n normalizeRubric,\n shouldPersistTrajectory,\n writeTrajectoryDir,\n} from \"./trajectory.js\";\n"]}