@cursor/bdk 0.2.9 → 0.2.10

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 (570) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.js +803 -812
  3. package/dist/channels/bitbucket/api.js +305 -321
  4. package/dist/channels/bitbucket/binding.js +97 -61
  5. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  6. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  7. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  8. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  9. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  10. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  11. package/dist/channels/bitbucket/checks.js +9 -21
  12. package/dist/channels/bitbucket/cursor-account.js +1 -1
  13. package/dist/channels/bitbucket/defaults.js +14 -4
  14. package/dist/channels/bitbucket/events.js +1 -2
  15. package/dist/channels/bitbucket/index.d.ts +6 -2
  16. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  17. package/dist/channels/bitbucket/index.js +6 -2
  18. package/dist/channels/bitbucket/replay.js +80 -56
  19. package/dist/channels/bitbucket/state.js +16 -7
  20. package/dist/channels/bitbucket/types.d.ts +11 -2
  21. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  22. package/dist/channels/checks.js +18 -28
  23. package/dist/channels/deployments/deployments-channel.js +26 -34
  24. package/dist/channels/github/api.js +216 -210
  25. package/dist/channels/github/auth.d.ts +5 -1
  26. package/dist/channels/github/auth.d.ts.map +1 -1
  27. package/dist/channels/github/auth.js +157 -174
  28. package/dist/channels/github/binding.js +48 -39
  29. package/dist/channels/github/checks.js +9 -14
  30. package/dist/channels/github/cursor-account.js +6 -11
  31. package/dist/channels/github/defaults.js +105 -130
  32. package/dist/channels/github/forward.js +13 -17
  33. package/dist/channels/github/github-channel.d.ts +43 -2
  34. package/dist/channels/github/github-channel.d.ts.map +1 -1
  35. package/dist/channels/github/github-channel.js +1228 -958
  36. package/dist/channels/github/progress.js +145 -146
  37. package/dist/channels/github/replay.js +30 -39
  38. package/dist/channels/github/state.js +40 -16
  39. package/dist/channels/github/types.d.ts +30 -6
  40. package/dist/channels/github/types.d.ts.map +1 -1
  41. package/dist/channels/gitlab/api.js +100 -114
  42. package/dist/channels/gitlab/binding.js +52 -33
  43. package/dist/channels/gitlab/checks.js +28 -29
  44. package/dist/channels/gitlab/cursor-account.js +1 -1
  45. package/dist/channels/gitlab/defaults.js +9 -3
  46. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  47. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  48. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  49. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  50. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  51. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  52. package/dist/channels/gitlab/index.d.ts +6 -2
  53. package/dist/channels/gitlab/index.d.ts.map +1 -1
  54. package/dist/channels/gitlab/index.js +6 -2
  55. package/dist/channels/gitlab/replay.js +50 -27
  56. package/dist/channels/gitlab/state.js +14 -6
  57. package/dist/channels/gitlab/types.d.ts +13 -2
  58. package/dist/channels/gitlab/types.d.ts.map +1 -1
  59. package/dist/channels/origin/api.js +100 -116
  60. package/dist/channels/origin/binding.js +15 -16
  61. package/dist/channels/origin/checks.js +30 -28
  62. package/dist/channels/origin/defaults.js +50 -65
  63. package/dist/channels/origin/origin-channel.js +266 -272
  64. package/dist/channels/origin/origin-webhook.js +70 -88
  65. package/dist/channels/origin/reactions.js +9 -21
  66. package/dist/channels/origin/state.js +13 -5
  67. package/dist/channels/slack/agentic-delivery.js +426 -478
  68. package/dist/channels/slack/agentic-posted.js +9 -10
  69. package/dist/channels/slack/agentic-signals.js +2 -3
  70. package/dist/channels/slack/api.js +417 -427
  71. package/dist/channels/slack/approvals.js +1 -1
  72. package/dist/channels/slack/assistant.js +37 -47
  73. package/dist/channels/slack/attachments.js +188 -206
  74. package/dist/channels/slack/auth.js +8 -6
  75. package/dist/channels/slack/bot-mentions.js +31 -45
  76. package/dist/channels/slack/channel-watch.js +42 -48
  77. package/dist/channels/slack/cli-project.js +112 -137
  78. package/dist/channels/slack/code-fences.js +3 -5
  79. package/dist/channels/slack/constants.js +2 -2
  80. package/dist/channels/slack/credentials.js +23 -38
  81. package/dist/channels/slack/defaults.js +292 -331
  82. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  83. package/dist/channels/slack/dispatch.js +533 -460
  84. package/dist/channels/slack/doctor.js +200 -214
  85. package/dist/channels/slack/eval-directive.js +79 -96
  86. package/dist/channels/slack/event-id-dedupe.js +1 -1
  87. package/dist/channels/slack/external-policy.js +26 -39
  88. package/dist/channels/slack/footer.js +28 -41
  89. package/dist/channels/slack/inbound.d.ts +1 -0
  90. package/dist/channels/slack/inbound.d.ts.map +1 -1
  91. package/dist/channels/slack/inbound.js +50 -31
  92. package/dist/channels/slack/init.d.ts +1 -5
  93. package/dist/channels/slack/init.d.ts.map +1 -1
  94. package/dist/channels/slack/init.js +42 -59
  95. package/dist/channels/slack/interactive.d.ts +9 -3
  96. package/dist/channels/slack/interactive.d.ts.map +1 -1
  97. package/dist/channels/slack/interactive.js +160 -162
  98. package/dist/channels/slack/links.js +1 -2
  99. package/dist/channels/slack/live-delivery.js +172 -190
  100. package/dist/channels/slack/manifest.d.ts.map +1 -1
  101. package/dist/channels/slack/manifest.js +44 -23
  102. package/dist/channels/slack/message-body.js +2 -2
  103. package/dist/channels/slack/nudge-carrier.js +30 -42
  104. package/dist/channels/slack/nudge-store.js +164 -191
  105. package/dist/channels/slack/paint-start.js +66 -81
  106. package/dist/channels/slack/placeholder.js +123 -152
  107. package/dist/channels/slack/pr-ref.js +1 -1
  108. package/dist/channels/slack/progress-delivery.js +65 -78
  109. package/dist/channels/slack/reasoning-card.js +36 -49
  110. package/dist/channels/slack/recording-sink.js +12 -24
  111. package/dist/channels/slack/reply-options.js +7 -12
  112. package/dist/channels/slack/self-identity.js +27 -35
  113. package/dist/channels/slack/sender-name.d.ts +12 -3
  114. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  115. package/dist/channels/slack/sender-name.js +57 -61
  116. package/dist/channels/slack/setup.js +2 -4
  117. package/dist/channels/slack/slack-channel.d.ts +6 -4
  118. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  119. package/dist/channels/slack/slack-channel.js +441 -308
  120. package/dist/channels/slack/socket-mode.js +38 -52
  121. package/dist/channels/slack/thread-context.js +143 -160
  122. package/dist/channels/slack/tool-approval-events.js +149 -166
  123. package/dist/channels/slack/tool-cards.js +6 -11
  124. package/dist/channels/slack/tool-chip.js +1 -2
  125. package/dist/channels/slack/types.d.ts +15 -17
  126. package/dist/channels/slack/types.d.ts.map +1 -1
  127. package/dist/channels/slack/upload.js +84 -97
  128. package/dist/channels/slack/user-info.js +27 -41
  129. package/dist/channels.js +9 -20
  130. package/dist/dashboard-session-url.js +3 -4
  131. package/dist/docs/404.html +2 -2
  132. package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
  133. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  134. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  135. package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  136. package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
  137. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  138. package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
  139. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  140. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  141. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  142. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  143. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  144. package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  150. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  151. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  152. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  153. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  154. package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  155. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  156. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  159. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  160. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  161. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  162. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  163. package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
  164. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  165. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  166. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  167. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  168. package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
  169. package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
  170. package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
  171. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  172. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  173. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  174. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  175. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  176. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  177. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  178. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  179. package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
  180. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  181. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  182. package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
  183. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  184. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  185. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  186. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  187. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  188. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  189. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  191. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  192. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  193. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  194. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  195. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  196. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  197. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  198. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  199. package/dist/docs/building-with-agents.html +37 -37
  200. package/dist/docs/building-with-agents.md +2 -0
  201. package/dist/docs/deployment.html +38 -38
  202. package/dist/docs/deployment.md +7 -0
  203. package/dist/docs/evals.html +36 -36
  204. package/dist/docs/guides/agent-to-agent.html +35 -35
  205. package/dist/docs/guides/bitbucket.html +38 -38
  206. package/dist/docs/guides/bitbucket.md +9 -1
  207. package/dist/docs/guides/cloud-agents.html +35 -35
  208. package/dist/docs/guides/convert-automation.html +35 -35
  209. package/dist/docs/guides/github.html +39 -39
  210. package/dist/docs/guides/github.md +20 -4
  211. package/dist/docs/guides/gitlab.html +38 -38
  212. package/dist/docs/guides/gitlab.md +9 -1
  213. package/dist/docs/guides/grokbot-agents.html +35 -35
  214. package/dist/docs/guides/hooks.html +35 -35
  215. package/dist/docs/guides/improve.html +35 -35
  216. package/dist/docs/guides/jev.html +35 -35
  217. package/dist/docs/guides/mcp-oauth.html +35 -35
  218. package/dist/docs/guides/migrate.html +66 -0
  219. package/dist/docs/guides/migrate.md +122 -0
  220. package/dist/docs/guides/opentelemetry.html +35 -35
  221. package/dist/docs/guides/slack.html +35 -35
  222. package/dist/docs/guides/webhooks.html +35 -35
  223. package/dist/docs/hashmap.json +1 -1
  224. package/dist/docs/hillclimbing.html +35 -35
  225. package/dist/docs/index.html +35 -35
  226. package/dist/docs/llms-full.txt +214 -6
  227. package/dist/docs/llms.txt +1 -0
  228. package/dist/docs/quickstart.html +35 -35
  229. package/dist/docs/reference/agent-config.html +35 -35
  230. package/dist/docs/reference/artifacts.html +35 -35
  231. package/dist/docs/reference/channels.html +35 -35
  232. package/dist/docs/reference/cli.html +39 -38
  233. package/dist/docs/reference/cli.md +39 -0
  234. package/dist/docs/reference/connections.html +35 -35
  235. package/dist/docs/reference/evals.html +35 -35
  236. package/dist/docs/reference/extensions.html +35 -35
  237. package/dist/docs/reference/hooks.html +35 -35
  238. package/dist/docs/reference/http-api.html +35 -35
  239. package/dist/docs/reference/instructions.html +35 -35
  240. package/dist/docs/reference/playground.html +35 -35
  241. package/dist/docs/reference/project-layout.html +35 -35
  242. package/dist/docs/reference/prompt.html +35 -35
  243. package/dist/docs/reference/schedules.html +35 -35
  244. package/dist/docs/reference/sessions.html +35 -35
  245. package/dist/docs/reference/skills.html +38 -38
  246. package/dist/docs/reference/subagents.html +35 -35
  247. package/dist/docs/reference/tools.html +35 -35
  248. package/dist/docs/templates/agentic-owners.html +35 -35
  249. package/dist/docs/templates/grokbot-agents.html +35 -35
  250. package/dist/docs/templates/security-reviewer.html +35 -35
  251. package/dist/docs/templates/thermo-quality-review.html +35 -35
  252. package/dist/docs/templates/thermo-review.html +35 -35
  253. package/dist/docs/templates/triage.html +35 -35
  254. package/dist/docs/troubleshooting.html +36 -36
  255. package/dist/docs/troubleshooting.md +1 -0
  256. package/dist/evals/assertions.js +20 -34
  257. package/dist/evals/expect.js +3 -6
  258. package/dist/evals/judge.js +5 -8
  259. package/dist/evals/loaders.js +45 -62
  260. package/dist/evals/matchers.js +2 -3
  261. package/dist/evals/reporters.js +43 -67
  262. package/dist/evals/results.js +1 -1
  263. package/dist/evals/run-facts.js +5 -6
  264. package/dist/evals.js +27 -15
  265. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  266. package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
  267. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  268. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  269. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  270. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  271. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  272. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  273. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  274. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  275. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  276. package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
  277. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  278. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  279. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  280. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  281. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  282. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  283. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  284. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  285. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  286. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  287. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  288. package/dist/extensions/jev/extension.js +3 -3
  289. package/dist/extensions/jev/lib/evaluate.js +43 -60
  290. package/dist/extensions/jev/tools/evaluate.js +6 -17
  291. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  292. package/dist/extensions.js +3 -5
  293. package/dist/files-backends/cursor-hosted.js +504 -523
  294. package/dist/files-backends/local-fs.js +72 -134
  295. package/dist/files.js +3 -3
  296. package/dist/filesystem.js +562 -861
  297. package/dist/index.js +16 -35
  298. package/dist/internal/advertise-tools.js +74 -86
  299. package/dist/internal/artifacts-store.js +298 -361
  300. package/dist/internal/as-of.js +2 -4
  301. package/dist/internal/authored-alias-hooks.js +6 -4
  302. package/dist/internal/authored-loaders.js +37 -52
  303. package/dist/internal/bounded-int.js +1 -2
  304. package/dist/internal/bounded.js +13 -24
  305. package/dist/internal/brand.js +1 -1
  306. package/dist/internal/browser-origin-guard.js +4 -4
  307. package/dist/internal/builtin-tools/artifacts.js +15 -27
  308. package/dist/internal/builtin-tools/index.js +2 -3
  309. package/dist/internal/builtin-tools/reminders.js +33 -52
  310. package/dist/internal/channel-architecture.d.ts +21 -0
  311. package/dist/internal/channel-architecture.d.ts.map +1 -0
  312. package/dist/internal/channel-architecture.js +41 -0
  313. package/dist/internal/channel-dispatch.js +3 -4
  314. package/dist/internal/channel-route-dispatch.js +40 -51
  315. package/dist/internal/channel-state.js +1 -1
  316. package/dist/internal/chat-client.js +319 -340
  317. package/dist/internal/cli-ax.js +1262 -1294
  318. package/dist/internal/cli-bitbucket.js +244 -272
  319. package/dist/internal/cli-convert-automation.js +137 -151
  320. package/dist/internal/cli-cursor.js +126 -147
  321. package/dist/internal/cli-deploy.d.ts.map +1 -1
  322. package/dist/internal/cli-deploy.js +1457 -1507
  323. package/dist/internal/cli-docs.js +130 -147
  324. package/dist/internal/cli-github.js +437 -476
  325. package/dist/internal/cli-gitlab.js +259 -288
  326. package/dist/internal/cli-images.js +266 -334
  327. package/dist/internal/cli-manifest.js +25 -37
  328. package/dist/internal/cli-mcp-oauth.js +228 -247
  329. package/dist/internal/cli-mcp.js +358 -383
  330. package/dist/internal/cli-migrate.js +73 -90
  331. package/dist/internal/cli-skills.js +35 -47
  332. package/dist/internal/cli-slack-manual.d.ts +0 -1
  333. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  334. package/dist/internal/cli-slack-manual.js +175 -204
  335. package/dist/internal/cli-slack.d.ts +1 -1
  336. package/dist/internal/cli-slack.d.ts.map +1 -1
  337. package/dist/internal/cli-slack.js +416 -456
  338. package/dist/internal/cloud-merge.js +7 -3
  339. package/dist/internal/cloud-turn-cost.js +8 -1
  340. package/dist/internal/connection-env.js +5 -6
  341. package/dist/internal/continuation-channel.js +10 -7
  342. package/dist/internal/continuation-identity.js +85 -67
  343. package/dist/internal/conversation-mirror.js +112 -131
  344. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  345. package/dist/internal/cron.js +3 -3
  346. package/dist/internal/cursor/account-mcp.js +147 -146
  347. package/dist/internal/cursor/backend-client.js +290 -320
  348. package/dist/internal/cursor/bound-secret-file.js +3 -3
  349. package/dist/internal/cursor/credentials.js +127 -142
  350. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  351. package/dist/internal/cursor/github-credentials.js +91 -108
  352. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  353. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  354. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  355. package/dist/internal/cursor/session-token.js +36 -48
  356. package/dist/internal/cursor/store-api-client.js +77 -92
  357. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  358. package/dist/internal/cursor-agent-template.js +1 -1
  359. package/dist/internal/cursor-deployment-relay.js +33 -54
  360. package/dist/internal/cursor-event-relay.js +65 -59
  361. package/dist/internal/cursor-relay-core.js +258 -286
  362. package/dist/internal/deferred-channel-session.js +3 -12
  363. package/dist/internal/deploy-client.js +410 -475
  364. package/dist/internal/deploy-manifest.d.ts +17 -0
  365. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  366. package/dist/internal/deploy-manifest.js +71 -21
  367. package/dist/internal/deploy-source.js +31 -43
  368. package/dist/internal/discovery/agent-config.js +45 -59
  369. package/dist/internal/discovery/agent.js +276 -280
  370. package/dist/internal/discovery/channels.js +67 -80
  371. package/dist/internal/discovery/connections.js +286 -296
  372. package/dist/internal/discovery/context.js +2 -13
  373. package/dist/internal/discovery/cursor-plugin.js +223 -259
  374. package/dist/internal/discovery/extension-overlay.js +104 -131
  375. package/dist/internal/discovery/extensions.js +276 -281
  376. package/dist/internal/discovery/fs.js +56 -79
  377. package/dist/internal/discovery/hooks.js +39 -50
  378. package/dist/internal/discovery/info.js +17 -19
  379. package/dist/internal/discovery/instructions.js +58 -71
  380. package/dist/internal/discovery/modules.js +45 -58
  381. package/dist/internal/discovery/project.d.ts.map +1 -1
  382. package/dist/internal/discovery/project.js +192 -215
  383. package/dist/internal/discovery/reminders.js +41 -52
  384. package/dist/internal/discovery/runtime.js +1 -1
  385. package/dist/internal/discovery/schedules.js +71 -82
  386. package/dist/internal/discovery/seed-files.js +21 -32
  387. package/dist/internal/discovery/services.js +74 -96
  388. package/dist/internal/discovery/skills.js +77 -94
  389. package/dist/internal/discovery/subagent.js +79 -95
  390. package/dist/internal/discovery/tools.js +12 -23
  391. package/dist/internal/distribution.js +2 -2
  392. package/dist/internal/docs-site.js +30 -45
  393. package/dist/internal/duration.js +1 -1
  394. package/dist/internal/env-file.js +48 -64
  395. package/dist/internal/eval-judge-model.js +17 -28
  396. package/dist/internal/eval-run-store.js +265 -254
  397. package/dist/internal/eval-runner.d.ts +8 -0
  398. package/dist/internal/eval-runner.d.ts.map +1 -1
  399. package/dist/internal/eval-runner.js +406 -408
  400. package/dist/internal/eval-transport.d.ts +24 -0
  401. package/dist/internal/eval-transport.d.ts.map +1 -0
  402. package/dist/internal/eval-transport.js +22 -0
  403. package/dist/internal/evals-client.js +242 -246
  404. package/dist/internal/event-log.js +72 -120
  405. package/dist/internal/event-mapper.js +30 -31
  406. package/dist/internal/factory-resource-channel.js +16 -30
  407. package/dist/internal/filesystem/errors.js +6 -6
  408. package/dist/internal/filesystem/format.js +10 -13
  409. package/dist/internal/filesystem/merge.js +52 -94
  410. package/dist/internal/filesystem/nearest.js +15 -27
  411. package/dist/internal/filesystem/scratch.js +65 -85
  412. package/dist/internal/filesystem/tools.js +221 -241
  413. package/dist/internal/filesystem/walk.js +76 -143
  414. package/dist/internal/framework-file-storage.js +118 -139
  415. package/dist/internal/framework-storage-selection.js +21 -13
  416. package/dist/internal/frontmatter.js +4 -6
  417. package/dist/internal/github-fanout.js +50 -64
  418. package/dist/internal/guest-network.js +96 -109
  419. package/dist/internal/handleAgentServeTrigger.js +121 -126
  420. package/dist/internal/host-files.js +73 -88
  421. package/dist/internal/host-kv.js +21 -36
  422. package/dist/internal/host-otel.js +22 -19
  423. package/dist/internal/host-platforms.js +49 -63
  424. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  425. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  426. package/dist/internal/hosted-catch-protocol.js +1 -0
  427. package/dist/internal/hosted-catch.d.ts +5 -3
  428. package/dist/internal/hosted-catch.d.ts.map +1 -1
  429. package/dist/internal/hosted-catch.js +84 -93
  430. package/dist/internal/hosted-delivery-protocol.js +32 -8
  431. package/dist/internal/hosted-delivery.d.ts +13 -1
  432. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  433. package/dist/internal/hosted-delivery.js +614 -584
  434. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  435. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  436. package/dist/internal/hosted-eval-cases.js +162 -0
  437. package/dist/internal/hosted-execution-diag.js +38 -30
  438. package/dist/internal/hosted-execution-flush.js +75 -66
  439. package/dist/internal/hosted-execution-latency.js +16 -8
  440. package/dist/internal/hosted-managed-automation.js +2 -2
  441. package/dist/internal/hosting.js +2 -3
  442. package/dist/internal/http-channel-define.js +4 -1
  443. package/dist/internal/http-channel.js +101 -112
  444. package/dist/internal/http-control-plane-session.d.ts +18 -1
  445. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  446. package/dist/internal/http-control-plane-session.js +66 -32
  447. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  448. package/dist/internal/init-interview.js +73 -93
  449. package/dist/internal/init-project.js +182 -214
  450. package/dist/internal/init-scaffold.js +10 -21
  451. package/dist/internal/inline-stdio-mcp.js +80 -86
  452. package/dist/internal/install-cursor-skills.js +231 -273
  453. package/dist/internal/legacy-command-guard.js +18 -31
  454. package/dist/internal/listen-port.js +34 -45
  455. package/dist/internal/local-control-plane.js +293 -307
  456. package/dist/internal/local-env.js +1 -1
  457. package/dist/internal/local-ingress.js +15 -9
  458. package/dist/internal/log-ring.js +1 -2
  459. package/dist/internal/logs-client.js +207 -227
  460. package/dist/internal/map-pool.js +24 -38
  461. package/dist/internal/mcp-endpoint.js +204 -180
  462. package/dist/internal/mcp-host.js +165 -168
  463. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  464. package/dist/internal/mcp-oauth-persist.js +15 -29
  465. package/dist/internal/mcp-oauth.js +209 -266
  466. package/dist/internal/named-webhook-secret.d.ts +39 -0
  467. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  468. package/dist/internal/named-webhook-secret.js +47 -0
  469. package/dist/internal/open-browser.js +2 -3
  470. package/dist/internal/otel/collector.js +104 -68
  471. package/dist/internal/otel/config.js +24 -37
  472. package/dist/internal/otel/http.js +5 -7
  473. package/dist/internal/otel/mcp.js +3 -12
  474. package/dist/internal/otel/runtime.js +69 -83
  475. package/dist/internal/package-inline-stdio.js +57 -65
  476. package/dist/internal/peer-connections.js +9 -5
  477. package/dist/internal/platform-schedule-sync.js +39 -54
  478. package/dist/internal/platform-timers.js +176 -210
  479. package/dist/internal/playground/static.js +1 -2
  480. package/dist/internal/playground/toolchain.js +37 -53
  481. package/dist/internal/playground-proxy.js +230 -270
  482. package/dist/internal/process-memory-telemetry.js +33 -51
  483. package/dist/internal/prompt-context.js +3 -6
  484. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  485. package/dist/internal/reminder-runner.js +770 -785
  486. package/dist/internal/reminder-schedule.js +1 -1
  487. package/dist/internal/reminder-store.js +57 -78
  488. package/dist/internal/request-error-status.js +1 -3
  489. package/dist/internal/request-headers.js +2 -2
  490. package/dist/internal/resolve-prod-target.js +119 -135
  491. package/dist/internal/resolved-connections.js +16 -6
  492. package/dist/internal/run-client.js +221 -229
  493. package/dist/internal/runtime-dispatch-runner.js +18 -43
  494. package/dist/internal/schedule-runner.js +49 -58
  495. package/dist/internal/scm/pr-url.js +7 -6
  496. package/dist/internal/sdk-runner.js +388 -363
  497. package/dist/internal/serve-restart.js +26 -39
  498. package/dist/internal/server.d.ts.map +1 -1
  499. package/dist/internal/server.js +1283 -1244
  500. package/dist/internal/session-cost.js +7 -9
  501. package/dist/internal/session-engine.d.ts +3 -1
  502. package/dist/internal/session-engine.d.ts.map +1 -1
  503. package/dist/internal/session-engine.js +2801 -2777
  504. package/dist/internal/session-links.js +12 -16
  505. package/dist/internal/session-run-log.js +134 -82
  506. package/dist/internal/session-store.js +133 -164
  507. package/dist/internal/sessions-client.js +97 -118
  508. package/dist/internal/skill-catalog.js +18 -23
  509. package/dist/internal/skills-sync.js +16 -30
  510. package/dist/internal/slack-provision-client.js +90 -116
  511. package/dist/internal/start-log-store.js +48 -67
  512. package/dist/internal/steering.js +1 -2
  513. package/dist/internal/storage-coordinator.js +160 -196
  514. package/dist/internal/store-mirror.js +16 -30
  515. package/dist/internal/stream-progress.js +6 -8
  516. package/dist/internal/terminal-style.js +3 -4
  517. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  518. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  519. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  520. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  521. package/dist/internal/tool-catalog.js +11 -5
  522. package/dist/internal/tool-result.js +1 -1
  523. package/dist/internal/trajectory.js +19 -22
  524. package/dist/internal/turn-cost.js +52 -62
  525. package/dist/internal/turn-governor.js +5 -8
  526. package/dist/internal/turn-lease-store.js +85 -105
  527. package/dist/internal/turn-outbox.js +28 -43
  528. package/dist/internal/update-check.js +231 -259
  529. package/dist/internal/v2-hosting.js +1 -2
  530. package/dist/internal/workspace-sync.js +25 -41
  531. package/dist/internal/workspace.js +111 -139
  532. package/dist/kv/memory-kv.js +27 -51
  533. package/dist/memory.js +106 -148
  534. package/dist/otel.js +5 -8
  535. package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
  536. package/dist/playground/assets/{index-Co4CUVTQ.js → index-JekUQERK.js} +45 -45
  537. package/dist/playground/index.html +2 -2
  538. package/dist/prompt.js +2 -4
  539. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  540. package/dist/storage-backends/cursor-hosted.js +105 -145
  541. package/dist/storage-backends/file-kv.js +100 -128
  542. package/dist/storage-protocol.js +3 -5
  543. package/dist/storage.js +17 -26
  544. package/dist/types.d.ts +68 -0
  545. package/dist/types.d.ts.map +1 -1
  546. package/dist/types.js +20 -18
  547. package/docs/building-with-agents.md +2 -0
  548. package/docs/deployment.md +7 -0
  549. package/docs/guides/bitbucket.md +9 -1
  550. package/docs/guides/github.md +20 -4
  551. package/docs/guides/gitlab.md +9 -1
  552. package/docs/guides/migrate.md +127 -0
  553. package/docs/reference/cli.md +39 -0
  554. package/docs/troubleshooting.md +1 -0
  555. package/package.json +1 -1
  556. package/skills/debug/SKILL.md +1 -0
  557. package/skills/github/SKILL.md +23 -0
  558. package/skills/migrate-v2/SKILL.md +51 -10
  559. package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
  560. package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
  561. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
  562. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
  563. package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
  564. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
  565. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  566. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  567. package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
  568. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  569. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
  570. /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
@@ -7,15 +7,6 @@
7
7
  * Drive with `t.send`, assert with `t.succeeded` / `t.calledTool` /
8
8
  * `t.messageIncludes` / `t.check`.
9
9
  */
10
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
11
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
12
- return new (P || (P = Promise))(function (resolve, reject) {
13
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
14
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
15
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
16
- step((generator = generator.apply(thisArg, _arguments || [])).next());
17
- });
18
- };
19
10
  import { readdir } from "node:fs/promises";
20
11
  import { join, relative, resolve } from "node:path";
21
12
  import { computeVerdict, createAssertions, EvalAssertionRecorder, EvalRequireFailure, EvalSkipSignal, } from "../evals/assertions.js";
@@ -28,84 +19,79 @@ import { EVAL_MAX_CONCURRENCY_LIMIT, expandEvalDefinition, expandSummarySuiteSel
28
19
  import { importAuthoredModule } from "./authored-loaders.js";
29
20
  import { isDefinitionOfKind } from "./brand.js";
30
21
  import { callJudgeModel, EVAL_JUDGE_MODEL_ENV, resolveJudgeModel } from "./eval-judge-model.js";
22
+ import { localHttpEvalTransport } from "./eval-transport.js";
31
23
  import { mapPool } from "./map-pool.js";
32
- import { RunSessionTimeoutError, runSession } from "./run-client.js";
24
+ import { RunSessionTimeoutError } from "./run-client.js";
33
25
  import { buildTrajectory } from "./trajectory.js";
34
- function listEvalFiles(dir) {
35
- return __awaiter(this, void 0, void 0, function* () {
36
- const out = [];
37
- function walk(current) {
38
- return __awaiter(this, void 0, void 0, function* () {
39
- let entries;
40
- try {
41
- entries = yield readdir(current, { withFileTypes: true });
42
- }
43
- catch (_a) {
44
- return;
45
- }
46
- for (const entry of entries) {
47
- if (entry.name.startsWith(".")) {
48
- continue;
49
- }
50
- const abs = join(current, entry.name);
51
- if (entry.isDirectory()) {
52
- if (entry.name === "node_modules") {
53
- continue;
54
- }
55
- yield walk(abs);
56
- }
57
- else if (entry.isFile()) {
58
- out.push(abs);
59
- }
60
- }
61
- });
26
+ async function listEvalFiles(dir) {
27
+ const out = [];
28
+ async function walk(current) {
29
+ let entries;
30
+ try {
31
+ entries = await readdir(current, { withFileTypes: true });
62
32
  }
63
- yield walk(dir);
64
- return out.sort();
65
- });
66
- }
67
- export function discoverEvals(projectRoot_1) {
68
- return __awaiter(this, arguments, void 0, function* (projectRoot, importModule = importAuthoredModule) {
69
- const root = resolve(projectRoot);
70
- const evalsDir = join(root, "evals");
71
- const files = yield listEvalFiles(evalsDir);
72
- const evals = [];
73
- let config = {};
74
- // Fixture loaders resolve relative paths against the app root, so a dataset
75
- // path reads the same however deep the eval file sits and whatever cwd the
76
- // CLI ran from.
77
- process.env[EVAL_ROOT_ENV] = root;
78
- for (const abs of files) {
79
- const rel = relative(evalsDir, abs).replace(/\\/g, "/");
80
- if (rel === "evals.config.ts" || rel === "evals.config.js") {
81
- const mod = yield importModule(abs);
82
- if (mod.default !== null && typeof mod.default === "object") {
83
- config = mod.default;
84
- }
85
- continue;
86
- }
87
- if (!rel.endsWith(".eval.ts") && !rel.endsWith(".eval.js")) {
33
+ catch {
34
+ return;
35
+ }
36
+ for (const entry of entries) {
37
+ if (entry.name.startsWith(".")) {
88
38
  continue;
89
39
  }
90
- const mod = yield importModule(abs);
91
- const fileId = rel.replace(/\.eval\.(ts|js)$/, "").replace(/\/index$/, "");
92
- try {
93
- for (const expanded of expandEvalModule(fileId, mod.default)) {
94
- evals.push({
95
- id: expanded.id,
96
- fileId,
97
- path: abs,
98
- definition: expanded.definition,
99
- });
40
+ const abs = join(current, entry.name);
41
+ if (entry.isDirectory()) {
42
+ if (entry.name === "node_modules") {
43
+ continue;
100
44
  }
45
+ await walk(abs);
101
46
  }
102
- catch (error) {
103
- const message = error instanceof Error ? error.message : String(error);
104
- throw new Error(`${rel}: ${message}`);
47
+ else if (entry.isFile()) {
48
+ out.push(abs);
105
49
  }
106
50
  }
107
- return { evals, config };
108
- });
51
+ }
52
+ await walk(dir);
53
+ return out.sort();
54
+ }
55
+ export async function discoverEvals(projectRoot, importModule = importAuthoredModule) {
56
+ const root = resolve(projectRoot);
57
+ const evalsDir = join(root, "evals");
58
+ const files = await listEvalFiles(evalsDir);
59
+ const evals = [];
60
+ let config = {};
61
+ // Fixture loaders resolve relative paths against the app root, so a dataset
62
+ // path reads the same however deep the eval file sits and whatever cwd the
63
+ // CLI ran from.
64
+ process.env[EVAL_ROOT_ENV] = root;
65
+ for (const abs of files) {
66
+ const rel = relative(evalsDir, abs).replace(/\\/g, "/");
67
+ if (rel === "evals.config.ts" || rel === "evals.config.js") {
68
+ const mod = await importModule(abs);
69
+ if (mod.default !== null && typeof mod.default === "object") {
70
+ config = mod.default;
71
+ }
72
+ continue;
73
+ }
74
+ if (!rel.endsWith(".eval.ts") && !rel.endsWith(".eval.js")) {
75
+ continue;
76
+ }
77
+ const mod = await importModule(abs);
78
+ const fileId = rel.replace(/\.eval\.(ts|js)$/, "").replace(/\/index$/, "");
79
+ try {
80
+ for (const expanded of expandEvalModule(fileId, mod.default)) {
81
+ evals.push({
82
+ id: expanded.id,
83
+ fileId,
84
+ path: abs,
85
+ definition: expanded.definition,
86
+ });
87
+ }
88
+ }
89
+ catch (error) {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ throw new Error(`${rel}: ${message}`);
92
+ }
93
+ }
94
+ return { evals, config };
109
95
  }
110
96
  /**
111
97
  * Expand one eval module's default export into runnable datapoints.
@@ -140,86 +126,83 @@ export function filterDiscoveredEvals(evals, options = {}) {
140
126
  selected = selected.filter(e => options.filterIds.some(f => matchesEvalIdFilter(e.id, f)));
141
127
  }
142
128
  if (options.tags !== undefined && options.tags.length > 0) {
143
- selected = selected.filter(e => { var _a; return ((_a = e.definition.tags) !== null && _a !== void 0 ? _a : []).some(t => options.tags.includes(t)); });
129
+ selected = selected.filter(e => (e.definition.tags ?? []).some(t => options.tags.includes(t)));
144
130
  }
145
131
  // Suite aggregators (`summary` tag) need sibling cases from the same file.
146
132
  return expandSummarySuiteSelection(evals, selected, e => isEvalSummaryCase(e.definition.tags));
147
133
  }
148
- export function runDiscoveredEvals(options) {
149
- return __awaiter(this, void 0, void 0, function* () {
150
- var _a, _b, _c, _d;
151
- let selected;
152
- let config;
153
- if (options.discovered !== undefined) {
154
- selected = options.discovered.evals;
155
- config = options.discovered.config;
156
- }
157
- else {
158
- const importModule = (_a = options.importModule) !== null && _a !== void 0 ? _a : importAuthoredModule;
159
- const discovered = yield discoverEvals(options.projectRoot, importModule);
160
- config = discovered.config;
161
- selected = filterDiscoveredEvals(discovered.evals, {
162
- filterIds: options.filterIds,
163
- tags: options.tags,
134
+ export async function runDiscoveredEvals(options) {
135
+ let selected;
136
+ let config;
137
+ if (options.discovered !== undefined) {
138
+ selected = options.discovered.evals;
139
+ config = options.discovered.config;
140
+ }
141
+ else {
142
+ const importModule = options.importModule ?? importAuthoredModule;
143
+ const discovered = await discoverEvals(options.projectRoot, importModule);
144
+ config = discovered.config;
145
+ selected = filterDiscoveredEvals(discovered.evals, {
146
+ filterIds: options.filterIds,
147
+ tags: options.tags,
148
+ });
149
+ }
150
+ if (selected.length === 0) {
151
+ return [];
152
+ }
153
+ const maxConcurrency = options.maxConcurrency === undefined
154
+ ? resolveEvalMaxConcurrency(config)
155
+ : normalizeEvalMaxConcurrency(options.maxConcurrency);
156
+ const defaultTimeoutMs = options.timeoutMs ?? config.timeoutMs ?? DEFAULT_EVAL_TIMEOUT_MS;
157
+ const transport = options.transport ??
158
+ localHttpEvalTransport({
159
+ baseUrl: options.baseUrl,
160
+ auth: { bearerToken: options.bearerToken, headers: options.headers },
161
+ });
162
+ const reporter = buildReporterHub(options, config, selected);
163
+ const startedAt = new Date().toISOString();
164
+ await reporter?.runStart(selected, options.target ?? { baseUrl: options.baseUrl, mode: "local" });
165
+ // Iterations of the same authored datapoint share one concurrency slot and
166
+ // run sequentially. maxConcurrency is therefore the max number of distinct
167
+ // datapoints in flight, not datapoints × iterations.
168
+ const groups = groupEvalsForIterationSchedule(selected);
169
+ const nested = await mapPool(groups, maxConcurrency, async (group) => {
170
+ const results = [];
171
+ for (const discovered of group) {
172
+ if (options.signal?.aborted) {
173
+ break;
174
+ }
175
+ if (options.verbose) {
176
+ process.stderr.write(` eval ${discovered.id}…\n`);
177
+ }
178
+ options.onCaseStart?.(discovered.id);
179
+ const result = await runOneEval(discovered, {
180
+ transport,
181
+ defaultTimeoutMs,
182
+ verbose: Boolean(options.verbose),
183
+ signal: options.signal,
184
+ judge: {
185
+ configModel: config.judge?.model,
186
+ caller: options.judgeCaller ?? callJudgeModel,
187
+ },
188
+ onEvent: event => {
189
+ options.onCaseEvent?.(discovered.id, event);
190
+ options.onEvent?.(event);
191
+ },
164
192
  });
193
+ options.onCaseDone?.(result);
194
+ await reporter?.caseComplete(discovered, result);
195
+ results.push(result);
165
196
  }
166
- if (selected.length === 0) {
167
- return [];
168
- }
169
- const maxConcurrency = options.maxConcurrency === undefined
170
- ? resolveEvalMaxConcurrency(config)
171
- : normalizeEvalMaxConcurrency(options.maxConcurrency);
172
- const defaultTimeoutMs = (_c = (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : config.timeoutMs) !== null && _c !== void 0 ? _c : 180000;
173
- const reporter = buildReporterHub(options, config, selected);
174
- const startedAt = new Date().toISOString();
175
- yield reporter === null || reporter === void 0 ? void 0 : reporter.runStart(selected, (_d = options.target) !== null && _d !== void 0 ? _d : { baseUrl: options.baseUrl, mode: "local" });
176
- // Iterations of the same authored datapoint share one concurrency slot and
177
- // run sequentially. maxConcurrency is therefore the max number of distinct
178
- // datapoints in flight, not datapoints × iterations.
179
- const groups = groupEvalsForIterationSchedule(selected);
180
- const nested = yield mapPool(groups, maxConcurrency, (group) => __awaiter(this, void 0, void 0, function* () {
181
- var _a, _b, _c, _d;
182
- var _e;
183
- const results = [];
184
- for (const discovered of group) {
185
- if ((_a = options.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
186
- break;
187
- }
188
- if (options.verbose) {
189
- process.stderr.write(` eval ${discovered.id}…\n`);
190
- }
191
- (_b = options.onCaseStart) === null || _b === void 0 ? void 0 : _b.call(options, discovered.id);
192
- const result = yield runOneEval(discovered, {
193
- baseUrl: options.baseUrl,
194
- defaultTimeoutMs,
195
- bearerToken: options.bearerToken,
196
- headers: options.headers,
197
- verbose: Boolean(options.verbose),
198
- signal: options.signal,
199
- judge: {
200
- configModel: (_c = config.judge) === null || _c === void 0 ? void 0 : _c.model,
201
- caller: (_e = options.judgeCaller) !== null && _e !== void 0 ? _e : callJudgeModel,
202
- },
203
- onEvent: event => {
204
- var _a, _b;
205
- (_a = options.onCaseEvent) === null || _a === void 0 ? void 0 : _a.call(options, discovered.id, event);
206
- (_b = options.onEvent) === null || _b === void 0 ? void 0 : _b.call(options, event);
207
- },
208
- });
209
- (_d = options.onCaseDone) === null || _d === void 0 ? void 0 : _d.call(options, result);
210
- yield reporter === null || reporter === void 0 ? void 0 : reporter.caseComplete(discovered, result);
211
- results.push(result);
212
- }
213
- return results;
214
- }), { signal: options.signal });
215
- const results = nested.flat();
216
- yield reporter === null || reporter === void 0 ? void 0 : reporter.runComplete(summarizeEvalResults(results, {
217
- strict: options.strict === true,
218
- startedAt,
219
- finishedAt: new Date().toISOString(),
220
- }));
221
197
  return results;
222
- });
198
+ }, { signal: options.signal });
199
+ const results = nested.flat();
200
+ await reporter?.runComplete(summarizeEvalResults(results, {
201
+ strict: options.strict === true,
202
+ startedAt,
203
+ finishedAt: new Date().toISOString(),
204
+ }));
205
+ return results;
223
206
  }
224
207
  /**
225
208
  * Fan results out to the reporters that observe them.
@@ -230,10 +213,9 @@ export function runDiscoveredEvals(options) {
230
213
  * `onRunStart` / `onRunComplete` pair.
231
214
  */
232
215
  function buildReporterHub(options, config, selected) {
233
- var _a, _b;
234
216
  const skip = options.skipReport === true;
235
- const runWide = [...((_a = options.reporters) !== null && _a !== void 0 ? _a : []), ...(skip ? [] : ((_b = config.reporters) !== null && _b !== void 0 ? _b : []))];
236
- const perEval = skip ? [] : selected.flatMap(e => { var _a; return (_a = e.definition.reporters) !== null && _a !== void 0 ? _a : []; });
217
+ const runWide = [...(options.reporters ?? []), ...(skip ? [] : (config.reporters ?? []))];
218
+ const perEval = skip ? [] : selected.flatMap(e => e.definition.reporters ?? []);
237
219
  const everyReporter = [...new Set([...runWide, ...perEval])];
238
220
  if (everyReporter.length === 0) {
239
221
  return undefined;
@@ -245,32 +227,22 @@ function buildReporterHub(options, config, selected) {
245
227
  };
246
228
  const all = combineReporters(everyReporter, onError);
247
229
  return {
248
- runStart(evals, target) {
249
- return __awaiter(this, void 0, void 0, function* () {
250
- var _a;
251
- yield (_a = all.onRunStart) === null || _a === void 0 ? void 0 : _a.call(all, evals.map(e => ({
252
- id: e.id,
253
- fileId: e.fileId,
254
- description: e.definition.description,
255
- tags: e.definition.tags,
256
- })), target);
257
- });
230
+ async runStart(evals, target) {
231
+ await all.onRunStart?.(evals.map(e => ({
232
+ id: e.id,
233
+ fileId: e.fileId,
234
+ description: e.definition.description,
235
+ tags: e.definition.tags,
236
+ })), target);
258
237
  },
259
- caseComplete(discovered, result) {
260
- return __awaiter(this, void 0, void 0, function* () {
261
- var _a, _b;
262
- var _c;
263
- const observers = [
264
- ...new Set([...runWide, ...(skip ? [] : ((_c = discovered.definition.reporters) !== null && _c !== void 0 ? _c : []))]),
265
- ];
266
- yield (_b = (_a = combineReporters(observers, onError)).onEvalComplete) === null || _b === void 0 ? void 0 : _b.call(_a, result);
267
- });
238
+ async caseComplete(discovered, result) {
239
+ const observers = [
240
+ ...new Set([...runWide, ...(skip ? [] : (discovered.definition.reporters ?? []))]),
241
+ ];
242
+ await combineReporters(observers, onError).onEvalComplete?.(result);
268
243
  },
269
- runComplete(summary) {
270
- return __awaiter(this, void 0, void 0, function* () {
271
- var _a;
272
- yield (_a = all.onRunComplete) === null || _a === void 0 ? void 0 : _a.call(all, summary);
273
- });
244
+ async runComplete(summary) {
245
+ await all.onRunComplete?.(summary);
274
246
  },
275
247
  };
276
248
  }
@@ -279,9 +251,8 @@ function buildReporterHub(options, config, selected) {
279
251
  * (`weather/nyc/1`…`/3`) share a key; single-iteration ids keep their full id.
280
252
  */
281
253
  export function iterationScheduleKey(discovered) {
282
- var _a, _b;
283
- const iterations = (_a = discovered.definition.iterations) !== null && _a !== void 0 ? _a : 1;
284
- const iteration = (_b = discovered.definition.iteration) !== null && _b !== void 0 ? _b : 1;
254
+ const iterations = discovered.definition.iterations ?? 1;
255
+ const iteration = discovered.definition.iteration ?? 1;
285
256
  if (iterations <= 1) {
286
257
  return discovered.id;
287
258
  }
@@ -310,7 +281,7 @@ export function groupEvalsForIterationSchedule(evals) {
310
281
  }
311
282
  return order.map(key => {
312
283
  const group = groups.get(key);
313
- return group.sort((a, b) => { var _a, _b; return ((_a = a.definition.iteration) !== null && _a !== void 0 ? _a : 1) - ((_b = b.definition.iteration) !== null && _b !== void 0 ? _b : 1); });
284
+ return group.sort((a, b) => (a.definition.iteration ?? 1) - (b.definition.iteration ?? 1));
314
285
  });
315
286
  }
316
287
  function resolveEvalMaxConcurrency(config) {
@@ -321,237 +292,266 @@ function resolveEvalMaxConcurrency(config) {
321
292
  }
322
293
  return normalizeEvalMaxConcurrency(config.maxConcurrency);
323
294
  }
324
- function runOneEval(discovered, opts) {
325
- return __awaiter(this, void 0, void 0, function* () {
326
- var _a, _b;
327
- var _c;
328
- const logs = [];
329
- const metrics = {};
330
- const recorder = new EvalAssertionRecorder();
331
- const def = discovered.definition;
332
- const timeoutMs = (_c = def.timeoutMs) !== null && _c !== void 0 ? _c : opts.defaultTimeoutMs;
333
- const startedAt = Date.now();
334
- let sessionId;
335
- let continuationToken;
336
- // The session stream replays from an index and the client stops at the first
337
- // terminal event, so each send must resume after the previous turn's last
338
- // event or it would re-read that turn instead of the new one.
339
- let nextEventIndex = 0;
340
- const allEvents = [];
341
- const inputs = [];
342
- const turns = [];
343
- let reply = null;
344
- const toolsUsed = () => buildTrajectory(allEvents).turns.flatMap(t => t.toolCalls.map(c => c.toolName));
345
- const toolCallIo = () => buildTrajectory(allEvents).turns.flatMap(turn => turn.toolCalls.map(c => (Object.assign(Object.assign(Object.assign({ toolName: c.toolName }, (c.args === undefined ? {} : { args: c.args })), (c.output === undefined ? {} : { output: c.output })), { isError: c.isError }))));
346
- const finish = (extra) => (Object.assign(Object.assign(Object.assign(Object.assign({ id: discovered.id, path: discovered.path }, (def.description === undefined ? {} : { description: def.description })), { ok: extra.ok, verdict: extra.verdict, skipReason: extra.skipReason, assertions: recorder.results(), error: extra.error, logs,
347
- metrics, metadata: def.metadata, tags: def.tags, inputs, toolCalls: toolCallIo() }), (sessionId === undefined ? {} : { sessionId })), { finalText: extra.finalText, tools: toolsUsed(), durationMs: Date.now() - startedAt }));
348
- if ((_a = opts.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
349
- return finish({ verdict: "failed", ok: false, error: "cancelled" });
350
- }
351
- // A judge that cannot reach a model must not look like a quality regression:
352
- // the case is skipped visibly instead.
353
- let judgeUnavailable;
354
- const timeout = new AbortController();
355
- const timer = setTimeout(() => timeout.abort(), clampTimerDelay(timeoutMs));
356
- // A pending case timer must not hold the process open on its own.
357
- (_b = timer.unref) === null || _b === void 0 ? void 0 : _b.call(timer);
358
- const runAssertions = createAssertions({
359
- recorder,
360
- events: () => allEvents,
361
- });
362
- const judge = createJudgeSurface({
363
- recorder,
364
- grader: name => EVAL_JUDGE_GRADERS[name],
365
- resolveModel: callModel => { var _a; return resolveJudgeModel({
366
- call: callModel,
367
- evalLevel: (_a = def.judge) === null || _a === void 0 ? void 0 : _a.model,
368
- config: opts.judge.configModel,
369
- env: process.env[EVAL_JUDGE_MODEL_ENV],
370
- }); },
371
- caller: opts.judge.caller,
372
- defaultValue: () => reply,
373
- onUnavailable: message => {
374
- judgeUnavailable = judgeUnavailable !== null && judgeUnavailable !== void 0 ? judgeUnavailable : message;
375
- },
376
- });
377
- // Accessors lead the literal: the es2015 build lowers an object spread to
378
- // `Object.assign`, which reads any accessor after it once and freezes it.
379
- const t = Object.assign({ get reply() {
380
- return reply;
381
- },
382
- get sessionId() {
383
- return sessionId;
384
- },
385
- get events() {
386
- return allEvents;
387
- },
388
- get turns() {
389
- return turns;
390
- },
391
- get iteration() {
392
- var _a;
393
- return (_a = def.iteration) !== null && _a !== void 0 ? _a : 1;
394
- },
395
- get iterations() {
396
- var _a;
397
- return (_a = def.iterations) !== null && _a !== void 0 ? _a : 1;
398
- },
399
- get signal() {
400
- return timeout.signal;
401
- },
402
- judge,
403
- send(message_1) {
404
- return __awaiter(this, arguments, void 0, function* (message, options = {}) {
405
- var _a;
406
- inputs.push(message);
407
- const result = yield runSession({
408
- baseUrl: opts.baseUrl,
409
- messages: [message],
410
- sessionId,
411
- continuationToken,
412
- startIndex: nextEventIndex,
413
- purpose: "eval",
414
- bearerToken: opts.bearerToken,
415
- headers: opts.headers,
416
- workspaceDir: options.workspaceDir,
417
- workspaceFiles: options.workspaceFiles,
418
- cloud: options.cloud,
419
- timeoutMs,
420
- signal: opts.signal,
421
- onEvent: opts.onEvent,
422
- });
423
- sessionId = result.sessionId;
424
- continuationToken = result.continuationToken;
425
- nextEventIndex = (_a = result.nextEventIndex) !== null && _a !== void 0 ? _a : nextEventIndex;
426
- allEvents.push(...result.events);
427
- if (result.trajectory.finalText !== "") {
428
- reply = result.trajectory.finalText;
295
+ const DEFAULT_EVAL_TIMEOUT_MS = 180_000;
296
+ /**
297
+ * One discovered case on a caller-supplied transport, with the defaults
298
+ * {@link runDiscoveredEvals} applies and no reporters.
299
+ */
300
+ export function runEvalCase(discovered, config, transport, signal) {
301
+ return runOneEval(discovered, {
302
+ transport,
303
+ defaultTimeoutMs: config.timeoutMs ?? DEFAULT_EVAL_TIMEOUT_MS,
304
+ verbose: false,
305
+ judge: { configModel: config.judge?.model, caller: callJudgeModel },
306
+ signal,
307
+ });
308
+ }
309
+ async function runOneEval(discovered, opts) {
310
+ const logs = [];
311
+ const metrics = {};
312
+ const recorder = new EvalAssertionRecorder();
313
+ const def = discovered.definition;
314
+ const timeoutMs = def.timeoutMs ?? opts.defaultTimeoutMs;
315
+ const startedAt = Date.now();
316
+ let sessionId;
317
+ let continuationToken;
318
+ // The session stream replays from an index and the client stops at the first
319
+ // terminal event, so each send must resume after the previous turn's last
320
+ // event or it would re-read that turn instead of the new one.
321
+ let nextEventIndex = 0;
322
+ const allEvents = [];
323
+ const inputs = [];
324
+ const turns = [];
325
+ let reply = null;
326
+ const toolsUsed = () => buildTrajectory(allEvents).turns.flatMap(t => t.toolCalls.map(c => c.toolName));
327
+ const toolCallIo = () => buildTrajectory(allEvents).turns.flatMap(turn => turn.toolCalls.map(c => ({
328
+ toolName: c.toolName,
329
+ ...(c.args === undefined ? {} : { args: c.args }),
330
+ ...(c.output === undefined ? {} : { output: c.output }),
331
+ isError: c.isError,
332
+ })));
333
+ const finish = (extra) => ({
334
+ id: discovered.id,
335
+ path: discovered.path,
336
+ ...(def.description === undefined ? {} : { description: def.description }),
337
+ ok: extra.ok,
338
+ verdict: extra.verdict,
339
+ skipReason: extra.skipReason,
340
+ assertions: recorder.results(),
341
+ error: extra.error,
342
+ logs,
343
+ metrics,
344
+ metadata: def.metadata,
345
+ tags: def.tags,
346
+ inputs,
347
+ toolCalls: toolCallIo(),
348
+ ...(sessionId === undefined ? {} : { sessionId }),
349
+ finalText: extra.finalText,
350
+ tools: toolsUsed(),
351
+ durationMs: Date.now() - startedAt,
352
+ });
353
+ if (opts.signal?.aborted) {
354
+ return finish({ verdict: "failed", ok: false, error: "cancelled" });
355
+ }
356
+ // A judge that cannot reach a model must not look like a quality regression:
357
+ // the case is skipped visibly instead.
358
+ let judgeUnavailable;
359
+ const timeout = new AbortController();
360
+ const timer = setTimeout(() => timeout.abort(), clampTimerDelay(timeoutMs));
361
+ // A pending case timer must not hold the process open on its own.
362
+ timer.unref?.();
363
+ const runAssertions = createAssertions({
364
+ recorder,
365
+ events: () => allEvents,
366
+ });
367
+ const judge = createJudgeSurface({
368
+ recorder,
369
+ grader: name => EVAL_JUDGE_GRADERS[name],
370
+ resolveModel: callModel => resolveJudgeModel({
371
+ call: callModel,
372
+ evalLevel: def.judge?.model,
373
+ config: opts.judge.configModel,
374
+ env: process.env[EVAL_JUDGE_MODEL_ENV],
375
+ }),
376
+ caller: opts.judge.caller,
377
+ defaultValue: () => reply,
378
+ onUnavailable: message => {
379
+ judgeUnavailable = judgeUnavailable ?? message;
380
+ },
381
+ });
382
+ // Accessors lead the literal: the es2015 build lowers an object spread to
383
+ // `Object.assign`, which reads any accessor after it once and freezes it.
384
+ const t = {
385
+ get reply() {
386
+ return reply;
387
+ },
388
+ get sessionId() {
389
+ return sessionId;
390
+ },
391
+ get events() {
392
+ return allEvents;
393
+ },
394
+ get turns() {
395
+ return turns;
396
+ },
397
+ get iteration() {
398
+ return def.iteration ?? 1;
399
+ },
400
+ get iterations() {
401
+ return def.iterations ?? 1;
402
+ },
403
+ get signal() {
404
+ return timeout.signal;
405
+ },
406
+ judge,
407
+ async send(message, options = {}) {
408
+ inputs.push(message);
409
+ const result = await opts.transport.send({
410
+ message,
411
+ sessionId,
412
+ continuationToken,
413
+ startIndex: nextEventIndex,
414
+ options,
415
+ timeoutMs,
416
+ signal: opts.signal,
417
+ onEvent: opts.onEvent,
418
+ });
419
+ sessionId = result.sessionId;
420
+ continuationToken = result.continuationToken;
421
+ nextEventIndex = result.nextEventIndex ?? nextEventIndex;
422
+ allEvents.push(...result.events);
423
+ if (result.trajectory.finalText !== "") {
424
+ reply = result.trajectory.finalText;
425
+ }
426
+ const index = turns.length + 1;
427
+ // The turn is immutable, so its assertions read a frozen event slice
428
+ // even after later turns append to the run.
429
+ const turnEvents = [...result.events];
430
+ const turn = {
431
+ ...createAssertions({
432
+ recorder,
433
+ events: () => turnEvents,
434
+ scope: `turn[${index}]`,
435
+ }),
436
+ message: result.trajectory.finalText,
437
+ sessionId: result.sessionId,
438
+ events: turnEvents,
439
+ toolCalls: result.trajectory.turns.flatMap(turn => turn.toolCalls.map(c => c.toolName)),
440
+ ok: result.ok,
441
+ index,
442
+ expectOk() {
443
+ if (!result.ok) {
444
+ throw new Error(`turn[${index}] failed: ${result.trajectory.turns.find(x => x.failed)?.error ?? "unknown error"}`);
429
445
  }
430
- const index = turns.length + 1;
431
- // The turn is immutable, so its assertions read a frozen event slice
432
- // even after later turns append to the run.
433
- const turnEvents = [...result.events];
434
- const turn = Object.assign(Object.assign({}, createAssertions({
435
- recorder,
436
- events: () => turnEvents,
437
- scope: `turn[${index}]`,
438
- })), { message: result.trajectory.finalText, sessionId: result.sessionId, events: turnEvents, toolCalls: result.trajectory.turns.flatMap(turn => turn.toolCalls.map(c => c.toolName)), ok: result.ok, index,
439
- expectOk() {
440
- var _a;
441
- var _b;
442
- if (!result.ok) {
443
- throw new Error(`turn[${index}] failed: ${(_b = (_a = result.trajectory.turns.find(x => x.failed)) === null || _a === void 0 ? void 0 : _a.error) !== null && _b !== void 0 ? _b : "unknown error"}`);
444
- }
445
- return turn;
446
- } });
447
- turns.push(turn);
448
446
  return turn;
449
- });
450
- },
451
- require(value, assertion) {
452
- return __awaiter(this, void 0, void 0, function* () {
453
- const outcome = evaluateExpectation(value, assertion);
454
- recorder.record({
455
- name: `require(${assertion.kind})`,
456
- passed: outcome.passed,
457
- detail: outcome.detail,
458
- score: outcome.score,
459
- severity: "gate",
460
- });
461
- if (!outcome.passed) {
462
- throw new EvalRequireFailure(`require(${assertion.kind})`);
463
- }
464
- return value;
465
- });
466
- },
467
- skip(reason) {
468
- throw new EvalSkipSignal(reason);
469
- },
470
- log(message) {
471
- logs.push(message);
472
- if (opts.verbose) {
473
- process.stderr.write(` ${message}\n`);
474
- }
475
- },
476
- metric(name, value) {
477
- const key = name.trim();
478
- if (key === "") {
479
- return;
480
- }
481
- metrics[key] = value;
482
- if (opts.verbose) {
483
- process.stderr.write(` metric ${key}=${String(value)}\n`);
484
- }
485
- } }, runAssertions);
486
- try {
487
- yield def.test(t);
488
- }
489
- catch (error) {
490
- if (error instanceof EvalSkipSignal) {
491
- clearTimeout(timer);
492
- return finish({
493
- verdict: "skipped",
494
- ok: true,
495
- skipReason: error.reason,
496
- finalText: reply !== null && reply !== void 0 ? reply : undefined,
497
- });
447
+ },
448
+ };
449
+ turns.push(turn);
450
+ return turn;
451
+ },
452
+ async require(value, assertion) {
453
+ const outcome = evaluateExpectation(value, assertion);
454
+ recorder.record({
455
+ name: `require(${assertion.kind})`,
456
+ passed: outcome.passed,
457
+ detail: outcome.detail,
458
+ score: outcome.score,
459
+ severity: "gate",
460
+ });
461
+ if (!outcome.passed) {
462
+ throw new EvalRequireFailure(`require(${assertion.kind})`);
498
463
  }
499
- if (!(error instanceof EvalRequireFailure)) {
500
- const message = error instanceof Error ? error.message : String(error);
501
- if (error instanceof RunSessionTimeoutError) {
502
- sessionId !== null && sessionId !== void 0 ? sessionId : (sessionId = error.sessionId);
503
- allEvents.push(...error.events);
504
- }
505
- yield recorder.waitForPending().catch(() => undefined);
506
- clearTimeout(timer);
507
- return finish({
508
- verdict: "failed",
509
- ok: false,
510
- error: message,
511
- finalText: reply !== null && reply !== void 0 ? reply : undefined,
512
- });
464
+ return value;
465
+ },
466
+ skip(reason) {
467
+ throw new EvalSkipSignal(reason);
468
+ },
469
+ log(message) {
470
+ logs.push(message);
471
+ if (opts.verbose) {
472
+ process.stderr.write(` ${message}\n`);
513
473
  }
514
- // `require` already recorded the failing gate; fall through so the verdict
515
- // comes from the assertions rather than a duplicate execution error.
516
- }
517
- yield recorder.waitForPending();
518
- clearTimeout(timer);
519
- const assertions = recorder.results();
520
- const traj = buildTrajectory(allEvents);
521
- // With no assertions at all, keep the historical fallback: a case that just
522
- // drives the agent passes when the run itself succeeded.
523
- const verdict = assertions.length > 0
524
- ? computeVerdict(assertions)
525
- : traj.ok && traj.turns.length > 0
526
- ? "passed"
527
- : "failed";
528
- const finalText = reply !== null && reply !== void 0 ? reply : traj.finalText;
529
- // An unreachable judge means the *judged* signal is unknown, so the case is
530
- // reported as skipped rather than as a quality regression. It must not also
531
- // bury a deterministic gate that already failed: skipping a failed case would
532
- // turn a red eval green on any machine that happens to lack credentials.
533
- if (judgeUnavailable !== undefined && verdict !== "failed") {
534
- logs.push(`judge skipped: ${judgeUnavailable}`);
474
+ },
475
+ metric(name, value) {
476
+ const key = name.trim();
477
+ if (key === "") {
478
+ return;
479
+ }
480
+ metrics[key] = value;
481
+ if (opts.verbose) {
482
+ process.stderr.write(` metric ${key}=${String(value)}\n`);
483
+ }
484
+ },
485
+ ...runAssertions,
486
+ };
487
+ try {
488
+ await def.test(t);
489
+ }
490
+ catch (error) {
491
+ if (error instanceof EvalSkipSignal) {
492
+ clearTimeout(timer);
535
493
  return finish({
536
494
  verdict: "skipped",
537
495
  ok: true,
538
- skipReason: judgeUnavailable,
539
- finalText,
496
+ skipReason: error.reason,
497
+ finalText: reply ?? undefined,
540
498
  });
541
499
  }
542
- if (judgeUnavailable !== undefined) {
543
- logs.push(`judge unavailable (${judgeUnavailable}), but a gate already failed — reporting the failure`);
500
+ if (!(error instanceof EvalRequireFailure)) {
501
+ const message = error instanceof Error ? error.message : String(error);
502
+ if (error instanceof RunSessionTimeoutError) {
503
+ sessionId ??= error.sessionId;
504
+ allEvents.push(...error.events);
505
+ }
506
+ await recorder.waitForPending().catch(() => undefined);
507
+ clearTimeout(timer);
508
+ return finish({
509
+ verdict: "failed",
510
+ ok: false,
511
+ error: message,
512
+ finalText: reply ?? undefined,
513
+ });
544
514
  }
515
+ // `require` already recorded the failing gate; fall through so the verdict
516
+ // comes from the assertions rather than a duplicate execution error.
517
+ }
518
+ await recorder.waitForPending();
519
+ clearTimeout(timer);
520
+ const assertions = recorder.results();
521
+ const traj = buildTrajectory(allEvents);
522
+ // With no assertions at all, keep the historical fallback: a case that just
523
+ // drives the agent passes when the run itself succeeded.
524
+ const verdict = assertions.length > 0
525
+ ? computeVerdict(assertions)
526
+ : traj.ok && traj.turns.length > 0
527
+ ? "passed"
528
+ : "failed";
529
+ const finalText = reply ?? traj.finalText;
530
+ // An unreachable judge means the *judged* signal is unknown, so the case is
531
+ // reported as skipped rather than as a quality regression. It must not also
532
+ // bury a deterministic gate that already failed: skipping a failed case would
533
+ // turn a red eval green on any machine that happens to lack credentials.
534
+ if (judgeUnavailable !== undefined && verdict !== "failed") {
535
+ logs.push(`judge skipped: ${judgeUnavailable}`);
545
536
  return finish({
546
- verdict,
547
- ok: verdict !== "failed",
537
+ verdict: "skipped",
538
+ ok: true,
539
+ skipReason: judgeUnavailable,
548
540
  finalText,
549
541
  });
542
+ }
543
+ if (judgeUnavailable !== undefined) {
544
+ logs.push(`judge unavailable (${judgeUnavailable}), but a gate already failed — reporting the failure`);
545
+ }
546
+ return finish({
547
+ verdict,
548
+ ok: verdict !== "failed",
549
+ finalText,
550
550
  });
551
551
  }
552
552
  /** Clamp a case timeout to a delay `setTimeout` can represent. */
553
553
  function clampTimerDelay(timeoutMs) {
554
- const MAX_TIMER = 2147483647;
554
+ const MAX_TIMER = 2_147_483_647;
555
555
  return Math.min(Math.max(timeoutMs, 0), MAX_TIMER);
556
556
  }
557
557
  /**
@@ -561,7 +561,7 @@ function clampTimerDelay(timeoutMs) {
561
561
  function createJudgeSurface(args) {
562
562
  const grade = (graderName, reference, options) => {
563
563
  const grader = args.grader(graderName);
564
- const model = args.resolveModel(options === null || options === void 0 ? void 0 : options.model);
564
+ const model = args.resolveModel(options?.model);
565
565
  const name = `judge.${graderName}(${truncateForName(reference)})`;
566
566
  if (model === undefined) {
567
567
  // A missing judge model is an authoring error, not a flaky provider.
@@ -573,8 +573,8 @@ function createJudgeSurface(args) {
573
573
  });
574
574
  }
575
575
  const submission = renderSubmission(options !== undefined && "on" in options ? options.on : args.defaultValue());
576
- const settle = (() => __awaiter(this, void 0, void 0, function* () {
577
- const reply = yield args.caller({
576
+ const settle = (async () => {
577
+ const reply = await args.caller({
578
578
  prompt: grader.buildPrompt({ submission, reference }),
579
579
  model,
580
580
  });
@@ -586,7 +586,7 @@ function createJudgeSurface(args) {
586
586
  ? `${result.choice} (${result.score.toFixed(2)})`
587
587
  : `${result.choice} (${result.score.toFixed(2)}) — ${result.rationale}`,
588
588
  };
589
- }))().catch((error) => {
589
+ })().catch((error) => {
590
590
  if (error instanceof EvalJudgeUnavailableError) {
591
591
  args.onUnavailable(error.message);
592
592
  return { passed: true, detail: `skipped: ${error.message}` };
@@ -597,14 +597,12 @@ function createJudgeSurface(args) {
597
597
  return args.recorder.recordAsync({ name, passed: true, severity: "soft", detail: "grading…" }, settle);
598
598
  };
599
599
  return {
600
- model(prompt, options) {
601
- return __awaiter(this, void 0, void 0, function* () {
602
- const model = args.resolveModel(options === null || options === void 0 ? void 0 : options.model);
603
- if (model === undefined) {
604
- throw new Error("t.judge.model: no judge model configured; set judge.model in evals.config.ts, on the eval, or on the call");
605
- }
606
- return args.caller({ prompt, model });
607
- });
600
+ async model(prompt, options) {
601
+ const model = args.resolveModel(options?.model);
602
+ if (model === undefined) {
603
+ throw new Error("t.judge.model: no judge model configured; set judge.model in evals.config.ts, on the eval, or on the call");
604
+ }
605
+ return args.caller({ prompt, model });
608
606
  },
609
607
  factuality: (expected, options) => grade("factuality", expected, options),
610
608
  summarizes: (expected, options) => grade("summarizes", expected, options),