@cursor/bdk 0.2.8 → 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 (581) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.d.ts +1 -0
  3. package/dist/bin/agent-serve.d.ts.map +1 -1
  4. package/dist/bin/agent-serve.js +820 -807
  5. package/dist/channels/bitbucket/api.js +305 -321
  6. package/dist/channels/bitbucket/binding.js +97 -61
  7. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  8. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  10. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  11. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  12. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  13. package/dist/channels/bitbucket/checks.js +9 -21
  14. package/dist/channels/bitbucket/cursor-account.js +1 -1
  15. package/dist/channels/bitbucket/defaults.js +14 -4
  16. package/dist/channels/bitbucket/events.js +1 -2
  17. package/dist/channels/bitbucket/index.d.ts +6 -2
  18. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  19. package/dist/channels/bitbucket/index.js +6 -2
  20. package/dist/channels/bitbucket/replay.js +80 -56
  21. package/dist/channels/bitbucket/state.js +16 -7
  22. package/dist/channels/bitbucket/types.d.ts +11 -2
  23. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  24. package/dist/channels/checks.js +18 -28
  25. package/dist/channels/deployments/deployments-channel.js +26 -34
  26. package/dist/channels/github/api.js +216 -210
  27. package/dist/channels/github/auth.d.ts +5 -1
  28. package/dist/channels/github/auth.d.ts.map +1 -1
  29. package/dist/channels/github/auth.js +157 -174
  30. package/dist/channels/github/binding.js +48 -39
  31. package/dist/channels/github/checks.js +9 -14
  32. package/dist/channels/github/cursor-account.js +6 -11
  33. package/dist/channels/github/defaults.js +105 -130
  34. package/dist/channels/github/forward.js +13 -17
  35. package/dist/channels/github/github-channel.d.ts +43 -2
  36. package/dist/channels/github/github-channel.d.ts.map +1 -1
  37. package/dist/channels/github/github-channel.js +1228 -958
  38. package/dist/channels/github/progress.js +145 -146
  39. package/dist/channels/github/replay.js +30 -39
  40. package/dist/channels/github/state.js +40 -16
  41. package/dist/channels/github/types.d.ts +30 -6
  42. package/dist/channels/github/types.d.ts.map +1 -1
  43. package/dist/channels/gitlab/api.js +100 -114
  44. package/dist/channels/gitlab/binding.js +52 -33
  45. package/dist/channels/gitlab/checks.js +28 -29
  46. package/dist/channels/gitlab/cursor-account.js +1 -1
  47. package/dist/channels/gitlab/defaults.js +9 -3
  48. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  49. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  50. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  51. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  52. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  53. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  54. package/dist/channels/gitlab/index.d.ts +6 -2
  55. package/dist/channels/gitlab/index.d.ts.map +1 -1
  56. package/dist/channels/gitlab/index.js +6 -2
  57. package/dist/channels/gitlab/replay.js +50 -27
  58. package/dist/channels/gitlab/state.js +14 -6
  59. package/dist/channels/gitlab/types.d.ts +13 -2
  60. package/dist/channels/gitlab/types.d.ts.map +1 -1
  61. package/dist/channels/origin/api.js +100 -116
  62. package/dist/channels/origin/binding.js +15 -16
  63. package/dist/channels/origin/checks.js +30 -28
  64. package/dist/channels/origin/defaults.js +50 -65
  65. package/dist/channels/origin/origin-channel.js +266 -272
  66. package/dist/channels/origin/origin-webhook.js +70 -88
  67. package/dist/channels/origin/reactions.js +9 -21
  68. package/dist/channels/origin/state.js +13 -5
  69. package/dist/channels/slack/agentic-delivery.js +426 -478
  70. package/dist/channels/slack/agentic-posted.js +9 -10
  71. package/dist/channels/slack/agentic-signals.js +2 -3
  72. package/dist/channels/slack/api.js +417 -427
  73. package/dist/channels/slack/approvals.js +1 -1
  74. package/dist/channels/slack/assistant.js +37 -47
  75. package/dist/channels/slack/attachments.js +188 -206
  76. package/dist/channels/slack/auth.js +8 -6
  77. package/dist/channels/slack/bot-mentions.js +31 -45
  78. package/dist/channels/slack/channel-watch.js +42 -48
  79. package/dist/channels/slack/cli-project.js +112 -137
  80. package/dist/channels/slack/code-fences.js +3 -5
  81. package/dist/channels/slack/constants.js +2 -2
  82. package/dist/channels/slack/credentials.js +23 -38
  83. package/dist/channels/slack/defaults.js +292 -331
  84. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  85. package/dist/channels/slack/dispatch.js +533 -460
  86. package/dist/channels/slack/doctor.js +200 -214
  87. package/dist/channels/slack/eval-directive.js +79 -96
  88. package/dist/channels/slack/event-id-dedupe.js +1 -1
  89. package/dist/channels/slack/external-policy.js +26 -39
  90. package/dist/channels/slack/footer.js +28 -41
  91. package/dist/channels/slack/inbound.d.ts +1 -0
  92. package/dist/channels/slack/inbound.d.ts.map +1 -1
  93. package/dist/channels/slack/inbound.js +50 -31
  94. package/dist/channels/slack/init.d.ts +1 -5
  95. package/dist/channels/slack/init.d.ts.map +1 -1
  96. package/dist/channels/slack/init.js +42 -59
  97. package/dist/channels/slack/interactive.d.ts +9 -3
  98. package/dist/channels/slack/interactive.d.ts.map +1 -1
  99. package/dist/channels/slack/interactive.js +160 -162
  100. package/dist/channels/slack/links.js +1 -2
  101. package/dist/channels/slack/live-delivery.js +172 -190
  102. package/dist/channels/slack/manifest.d.ts.map +1 -1
  103. package/dist/channels/slack/manifest.js +44 -23
  104. package/dist/channels/slack/message-body.js +2 -2
  105. package/dist/channels/slack/nudge-carrier.js +30 -42
  106. package/dist/channels/slack/nudge-store.js +164 -191
  107. package/dist/channels/slack/paint-start.js +66 -81
  108. package/dist/channels/slack/placeholder.js +123 -152
  109. package/dist/channels/slack/pr-ref.js +1 -1
  110. package/dist/channels/slack/progress-delivery.js +65 -78
  111. package/dist/channels/slack/reasoning-card.js +36 -49
  112. package/dist/channels/slack/recording-sink.js +12 -24
  113. package/dist/channels/slack/reply-options.js +7 -12
  114. package/dist/channels/slack/self-identity.js +27 -35
  115. package/dist/channels/slack/sender-name.d.ts +12 -3
  116. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  117. package/dist/channels/slack/sender-name.js +57 -61
  118. package/dist/channels/slack/setup.js +2 -4
  119. package/dist/channels/slack/slack-channel.d.ts +6 -4
  120. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  121. package/dist/channels/slack/slack-channel.js +441 -308
  122. package/dist/channels/slack/socket-mode.js +38 -52
  123. package/dist/channels/slack/thread-context.js +143 -160
  124. package/dist/channels/slack/tool-approval-events.js +149 -166
  125. package/dist/channels/slack/tool-cards.js +6 -11
  126. package/dist/channels/slack/tool-chip.js +1 -2
  127. package/dist/channels/slack/types.d.ts +15 -17
  128. package/dist/channels/slack/types.d.ts.map +1 -1
  129. package/dist/channels/slack/upload.js +84 -97
  130. package/dist/channels/slack/user-info.js +27 -41
  131. package/dist/channels.js +9 -20
  132. package/dist/dashboard-session-url.js +3 -4
  133. package/dist/docs/404.html +2 -2
  134. package/dist/docs/assets/{app.oyjtOr3W.js → app.DXI7bwox.js} +4 -4
  135. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  136. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  137. package/dist/docs/assets/chunks/{VPLocalSearchBox.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  138. package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
  139. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  140. package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
  141. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  142. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  143. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  144. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  150. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  151. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  152. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  153. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  154. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  155. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  156. package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  159. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  160. package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  161. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  162. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  163. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  164. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  165. package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
  166. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  167. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  168. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  169. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  170. package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
  171. package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
  172. package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
  173. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  174. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  175. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  176. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  177. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  178. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  179. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  180. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  181. package/dist/docs/assets/chunks/{theme.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
  182. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  183. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  184. package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
  185. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  186. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  187. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  188. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  189. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  191. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  192. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  193. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  194. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  195. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  196. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  197. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  198. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  199. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  200. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  201. package/dist/docs/building-with-agents.html +37 -37
  202. package/dist/docs/building-with-agents.md +2 -0
  203. package/dist/docs/deployment.html +38 -38
  204. package/dist/docs/deployment.md +7 -0
  205. package/dist/docs/evals.html +36 -36
  206. package/dist/docs/guides/agent-to-agent.html +35 -35
  207. package/dist/docs/guides/bitbucket.html +38 -38
  208. package/dist/docs/guides/bitbucket.md +9 -1
  209. package/dist/docs/guides/cloud-agents.html +35 -35
  210. package/dist/docs/guides/convert-automation.html +35 -35
  211. package/dist/docs/guides/github.html +39 -39
  212. package/dist/docs/guides/github.md +20 -4
  213. package/dist/docs/guides/gitlab.html +38 -38
  214. package/dist/docs/guides/gitlab.md +9 -1
  215. package/dist/docs/guides/grokbot-agents.html +35 -35
  216. package/dist/docs/guides/hooks.html +35 -35
  217. package/dist/docs/guides/improve.html +35 -35
  218. package/dist/docs/guides/jev.html +35 -35
  219. package/dist/docs/guides/mcp-oauth.html +35 -35
  220. package/dist/docs/guides/migrate.html +66 -0
  221. package/dist/docs/guides/migrate.md +122 -0
  222. package/dist/docs/guides/opentelemetry.html +35 -35
  223. package/dist/docs/guides/slack.html +35 -35
  224. package/dist/docs/guides/webhooks.html +35 -35
  225. package/dist/docs/hashmap.json +1 -1
  226. package/dist/docs/hillclimbing.html +35 -35
  227. package/dist/docs/index.html +35 -35
  228. package/dist/docs/llms-full.txt +214 -6
  229. package/dist/docs/llms.txt +1 -0
  230. package/dist/docs/quickstart.html +35 -35
  231. package/dist/docs/reference/agent-config.html +35 -35
  232. package/dist/docs/reference/artifacts.html +35 -35
  233. package/dist/docs/reference/channels.html +35 -35
  234. package/dist/docs/reference/cli.html +39 -38
  235. package/dist/docs/reference/cli.md +39 -0
  236. package/dist/docs/reference/connections.html +35 -35
  237. package/dist/docs/reference/evals.html +35 -35
  238. package/dist/docs/reference/extensions.html +35 -35
  239. package/dist/docs/reference/hooks.html +35 -35
  240. package/dist/docs/reference/http-api.html +35 -35
  241. package/dist/docs/reference/instructions.html +35 -35
  242. package/dist/docs/reference/playground.html +35 -35
  243. package/dist/docs/reference/project-layout.html +35 -35
  244. package/dist/docs/reference/prompt.html +35 -35
  245. package/dist/docs/reference/schedules.html +35 -35
  246. package/dist/docs/reference/sessions.html +35 -35
  247. package/dist/docs/reference/skills.html +38 -38
  248. package/dist/docs/reference/subagents.html +35 -35
  249. package/dist/docs/reference/tools.html +35 -35
  250. package/dist/docs/templates/agentic-owners.html +35 -35
  251. package/dist/docs/templates/grokbot-agents.html +35 -35
  252. package/dist/docs/templates/security-reviewer.html +35 -35
  253. package/dist/docs/templates/thermo-quality-review.html +35 -35
  254. package/dist/docs/templates/thermo-review.html +35 -35
  255. package/dist/docs/templates/triage.html +35 -35
  256. package/dist/docs/troubleshooting.html +36 -36
  257. package/dist/docs/troubleshooting.md +1 -0
  258. package/dist/evals/assertions.js +20 -34
  259. package/dist/evals/expect.js +3 -6
  260. package/dist/evals/judge.js +5 -8
  261. package/dist/evals/loaders.js +45 -62
  262. package/dist/evals/matchers.js +2 -3
  263. package/dist/evals/reporters.js +43 -67
  264. package/dist/evals/results.js +1 -1
  265. package/dist/evals/run-facts.js +5 -6
  266. package/dist/evals.js +27 -15
  267. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  268. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +0 -1
  269. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  270. package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
  271. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  272. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  273. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  274. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  275. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  276. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  277. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  278. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  279. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  280. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -1
  281. package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
  282. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  283. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  284. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  285. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  286. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  287. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  288. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  289. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  290. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  291. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  292. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  293. package/dist/extensions/jev/extension.js +3 -3
  294. package/dist/extensions/jev/lib/evaluate.js +43 -60
  295. package/dist/extensions/jev/tools/evaluate.js +6 -17
  296. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  297. package/dist/extensions.js +3 -5
  298. package/dist/files-backends/cursor-hosted.js +504 -523
  299. package/dist/files-backends/local-fs.js +72 -134
  300. package/dist/files.js +3 -3
  301. package/dist/filesystem.js +562 -861
  302. package/dist/index.js +16 -35
  303. package/dist/internal/advertise-tools.js +74 -86
  304. package/dist/internal/artifacts-store.js +298 -361
  305. package/dist/internal/as-of.js +2 -4
  306. package/dist/internal/authored-alias-hooks.js +6 -4
  307. package/dist/internal/authored-loaders.js +37 -52
  308. package/dist/internal/bounded-int.js +1 -2
  309. package/dist/internal/bounded.js +13 -24
  310. package/dist/internal/brand.js +1 -1
  311. package/dist/internal/browser-origin-guard.js +4 -4
  312. package/dist/internal/builtin-tools/artifacts.js +15 -27
  313. package/dist/internal/builtin-tools/index.js +2 -3
  314. package/dist/internal/builtin-tools/reminders.js +33 -52
  315. package/dist/internal/channel-architecture.d.ts +21 -0
  316. package/dist/internal/channel-architecture.d.ts.map +1 -0
  317. package/dist/internal/channel-architecture.js +41 -0
  318. package/dist/internal/channel-dispatch.js +3 -4
  319. package/dist/internal/channel-route-dispatch.js +40 -51
  320. package/dist/internal/channel-state.js +1 -1
  321. package/dist/internal/chat-client.js +319 -340
  322. package/dist/internal/cli-ax.js +1262 -1294
  323. package/dist/internal/cli-bitbucket.js +244 -272
  324. package/dist/internal/cli-convert-automation.js +137 -151
  325. package/dist/internal/cli-cursor.js +126 -147
  326. package/dist/internal/cli-deploy.d.ts.map +1 -1
  327. package/dist/internal/cli-deploy.js +1457 -1507
  328. package/dist/internal/cli-docs.js +130 -147
  329. package/dist/internal/cli-github.js +437 -476
  330. package/dist/internal/cli-gitlab.js +259 -288
  331. package/dist/internal/cli-images.js +266 -334
  332. package/dist/internal/cli-manifest.js +25 -37
  333. package/dist/internal/cli-mcp-oauth.js +228 -247
  334. package/dist/internal/cli-mcp.js +358 -383
  335. package/dist/internal/cli-migrate.d.ts +18 -0
  336. package/dist/internal/cli-migrate.d.ts.map +1 -0
  337. package/dist/internal/cli-migrate.js +136 -0
  338. package/dist/internal/cli-skills.js +35 -47
  339. package/dist/internal/cli-slack-manual.d.ts +0 -1
  340. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  341. package/dist/internal/cli-slack-manual.js +175 -204
  342. package/dist/internal/cli-slack.d.ts +1 -1
  343. package/dist/internal/cli-slack.d.ts.map +1 -1
  344. package/dist/internal/cli-slack.js +416 -456
  345. package/dist/internal/cloud-merge.js +7 -3
  346. package/dist/internal/cloud-turn-cost.js +8 -1
  347. package/dist/internal/connection-env.js +5 -6
  348. package/dist/internal/continuation-channel.js +10 -7
  349. package/dist/internal/continuation-identity.js +85 -67
  350. package/dist/internal/conversation-mirror.js +112 -131
  351. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  352. package/dist/internal/cron.js +3 -3
  353. package/dist/internal/cursor/account-mcp.js +147 -146
  354. package/dist/internal/cursor/backend-client.js +290 -320
  355. package/dist/internal/cursor/bound-secret-file.js +3 -3
  356. package/dist/internal/cursor/credentials.d.ts +1 -0
  357. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  358. package/dist/internal/cursor/credentials.js +130 -142
  359. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  360. package/dist/internal/cursor/github-credentials.js +91 -108
  361. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  362. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  363. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  364. package/dist/internal/cursor/session-token.js +36 -48
  365. package/dist/internal/cursor/store-api-client.js +77 -92
  366. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  367. package/dist/internal/cursor-agent-template.js +1 -1
  368. package/dist/internal/cursor-deployment-relay.js +33 -54
  369. package/dist/internal/cursor-event-relay.js +65 -59
  370. package/dist/internal/cursor-relay-core.js +258 -286
  371. package/dist/internal/deferred-channel-session.js +3 -12
  372. package/dist/internal/deploy-client.js +410 -475
  373. package/dist/internal/deploy-manifest.d.ts +17 -0
  374. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  375. package/dist/internal/deploy-manifest.js +71 -21
  376. package/dist/internal/deploy-source.js +31 -43
  377. package/dist/internal/discovery/agent-config.js +45 -59
  378. package/dist/internal/discovery/agent.js +276 -280
  379. package/dist/internal/discovery/channels.js +67 -80
  380. package/dist/internal/discovery/connections.js +286 -296
  381. package/dist/internal/discovery/context.js +2 -13
  382. package/dist/internal/discovery/cursor-plugin.js +223 -259
  383. package/dist/internal/discovery/extension-overlay.js +104 -131
  384. package/dist/internal/discovery/extensions.js +276 -281
  385. package/dist/internal/discovery/fs.js +56 -79
  386. package/dist/internal/discovery/hooks.js +39 -50
  387. package/dist/internal/discovery/info.js +17 -19
  388. package/dist/internal/discovery/instructions.js +58 -71
  389. package/dist/internal/discovery/modules.js +45 -58
  390. package/dist/internal/discovery/project.d.ts.map +1 -1
  391. package/dist/internal/discovery/project.js +192 -215
  392. package/dist/internal/discovery/reminders.js +41 -52
  393. package/dist/internal/discovery/runtime.js +1 -1
  394. package/dist/internal/discovery/schedules.js +71 -82
  395. package/dist/internal/discovery/seed-files.js +21 -32
  396. package/dist/internal/discovery/services.js +74 -96
  397. package/dist/internal/discovery/skills.js +77 -94
  398. package/dist/internal/discovery/subagent.js +79 -95
  399. package/dist/internal/discovery/tools.js +12 -23
  400. package/dist/internal/distribution.js +2 -2
  401. package/dist/internal/docs-site.js +30 -45
  402. package/dist/internal/duration.js +1 -1
  403. package/dist/internal/env-file.js +48 -64
  404. package/dist/internal/eval-judge-model.js +17 -28
  405. package/dist/internal/eval-run-store.js +265 -254
  406. package/dist/internal/eval-runner.d.ts +8 -0
  407. package/dist/internal/eval-runner.d.ts.map +1 -1
  408. package/dist/internal/eval-runner.js +406 -408
  409. package/dist/internal/eval-transport.d.ts +24 -0
  410. package/dist/internal/eval-transport.d.ts.map +1 -0
  411. package/dist/internal/eval-transport.js +22 -0
  412. package/dist/internal/evals-client.js +242 -246
  413. package/dist/internal/event-log.js +72 -120
  414. package/dist/internal/event-mapper.js +30 -31
  415. package/dist/internal/factory-resource-channel.js +16 -30
  416. package/dist/internal/filesystem/errors.js +6 -6
  417. package/dist/internal/filesystem/format.js +10 -13
  418. package/dist/internal/filesystem/merge.js +52 -94
  419. package/dist/internal/filesystem/nearest.js +15 -27
  420. package/dist/internal/filesystem/scratch.js +65 -85
  421. package/dist/internal/filesystem/tools.js +221 -241
  422. package/dist/internal/filesystem/walk.js +76 -143
  423. package/dist/internal/framework-file-storage.js +118 -139
  424. package/dist/internal/framework-storage-selection.js +21 -13
  425. package/dist/internal/frontmatter.js +4 -6
  426. package/dist/internal/github-fanout.js +50 -64
  427. package/dist/internal/guest-network.js +96 -109
  428. package/dist/internal/handleAgentServeTrigger.js +121 -126
  429. package/dist/internal/host-files.js +73 -88
  430. package/dist/internal/host-kv.js +21 -36
  431. package/dist/internal/host-otel.js +22 -19
  432. package/dist/internal/host-platforms.js +49 -63
  433. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  434. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  435. package/dist/internal/hosted-catch-protocol.js +1 -0
  436. package/dist/internal/hosted-catch.d.ts +5 -3
  437. package/dist/internal/hosted-catch.d.ts.map +1 -1
  438. package/dist/internal/hosted-catch.js +84 -93
  439. package/dist/internal/hosted-delivery-protocol.js +32 -8
  440. package/dist/internal/hosted-delivery.d.ts +13 -1
  441. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  442. package/dist/internal/hosted-delivery.js +614 -584
  443. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  444. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  445. package/dist/internal/hosted-eval-cases.js +162 -0
  446. package/dist/internal/hosted-execution-diag.js +38 -30
  447. package/dist/internal/hosted-execution-flush.js +75 -66
  448. package/dist/internal/hosted-execution-latency.js +16 -8
  449. package/dist/internal/hosted-managed-automation.js +2 -2
  450. package/dist/internal/hosting.js +2 -3
  451. package/dist/internal/http-channel-define.js +4 -1
  452. package/dist/internal/http-channel.js +101 -112
  453. package/dist/internal/http-control-plane-session.d.ts +18 -1
  454. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  455. package/dist/internal/http-control-plane-session.js +66 -32
  456. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  457. package/dist/internal/init-interview.js +73 -93
  458. package/dist/internal/init-project.js +182 -214
  459. package/dist/internal/init-scaffold.js +10 -21
  460. package/dist/internal/inline-stdio-mcp.js +80 -86
  461. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  462. package/dist/internal/install-cursor-skills.js +238 -274
  463. package/dist/internal/legacy-command-guard.js +18 -31
  464. package/dist/internal/listen-port.js +34 -45
  465. package/dist/internal/local-control-plane.js +293 -307
  466. package/dist/internal/local-env.js +1 -1
  467. package/dist/internal/local-ingress.js +15 -9
  468. package/dist/internal/log-ring.js +1 -2
  469. package/dist/internal/logs-client.js +207 -227
  470. package/dist/internal/map-pool.js +24 -38
  471. package/dist/internal/mcp-endpoint.js +204 -180
  472. package/dist/internal/mcp-host.js +165 -168
  473. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  474. package/dist/internal/mcp-oauth-persist.js +15 -29
  475. package/dist/internal/mcp-oauth.js +209 -266
  476. package/dist/internal/named-webhook-secret.d.ts +39 -0
  477. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  478. package/dist/internal/named-webhook-secret.js +47 -0
  479. package/dist/internal/open-browser.js +2 -3
  480. package/dist/internal/otel/collector.js +104 -68
  481. package/dist/internal/otel/config.js +24 -37
  482. package/dist/internal/otel/http.js +5 -7
  483. package/dist/internal/otel/mcp.js +3 -12
  484. package/dist/internal/otel/runtime.js +69 -83
  485. package/dist/internal/package-inline-stdio.js +57 -65
  486. package/dist/internal/peer-connections.js +9 -5
  487. package/dist/internal/platform-schedule-sync.js +39 -54
  488. package/dist/internal/platform-timers.js +176 -210
  489. package/dist/internal/playground/static.js +1 -2
  490. package/dist/internal/playground/toolchain.js +37 -53
  491. package/dist/internal/playground-proxy.js +230 -270
  492. package/dist/internal/process-memory-telemetry.js +33 -51
  493. package/dist/internal/prompt-context.js +3 -6
  494. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  495. package/dist/internal/reminder-runner.js +770 -785
  496. package/dist/internal/reminder-schedule.js +1 -1
  497. package/dist/internal/reminder-store.js +57 -78
  498. package/dist/internal/request-error-status.js +1 -3
  499. package/dist/internal/request-headers.js +2 -2
  500. package/dist/internal/resolve-prod-target.js +119 -135
  501. package/dist/internal/resolved-connections.js +16 -6
  502. package/dist/internal/run-client.js +221 -229
  503. package/dist/internal/runtime-dispatch-runner.js +18 -43
  504. package/dist/internal/schedule-runner.js +49 -58
  505. package/dist/internal/scm/pr-url.js +7 -6
  506. package/dist/internal/sdk-runner.js +388 -363
  507. package/dist/internal/serve-restart.js +26 -39
  508. package/dist/internal/server.d.ts.map +1 -1
  509. package/dist/internal/server.js +1283 -1244
  510. package/dist/internal/session-cost.js +7 -9
  511. package/dist/internal/session-engine.d.ts +3 -1
  512. package/dist/internal/session-engine.d.ts.map +1 -1
  513. package/dist/internal/session-engine.js +2801 -2777
  514. package/dist/internal/session-links.js +12 -16
  515. package/dist/internal/session-run-log.js +134 -82
  516. package/dist/internal/session-store.js +133 -164
  517. package/dist/internal/sessions-client.js +97 -118
  518. package/dist/internal/skill-catalog.js +18 -23
  519. package/dist/internal/skills-sync.js +16 -30
  520. package/dist/internal/slack-provision-client.js +90 -116
  521. package/dist/internal/start-log-store.js +48 -67
  522. package/dist/internal/steering.js +1 -2
  523. package/dist/internal/storage-coordinator.js +160 -196
  524. package/dist/internal/store-mirror.js +16 -30
  525. package/dist/internal/stream-progress.js +6 -8
  526. package/dist/internal/terminal-style.js +3 -4
  527. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  528. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  529. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  530. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  531. package/dist/internal/tool-catalog.js +11 -5
  532. package/dist/internal/tool-result.js +1 -1
  533. package/dist/internal/trajectory.js +19 -22
  534. package/dist/internal/turn-cost.js +52 -62
  535. package/dist/internal/turn-governor.js +5 -8
  536. package/dist/internal/turn-lease-store.js +85 -105
  537. package/dist/internal/turn-outbox.js +28 -43
  538. package/dist/internal/update-check.js +231 -259
  539. package/dist/internal/v2-hosting.js +1 -2
  540. package/dist/internal/workspace-sync.js +25 -41
  541. package/dist/internal/workspace.js +111 -139
  542. package/dist/kv/memory-kv.js +27 -51
  543. package/dist/memory.js +106 -148
  544. package/dist/otel.js +5 -8
  545. package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
  546. package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
  547. package/dist/playground/index.html +2 -2
  548. package/dist/prompt.js +2 -4
  549. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  550. package/dist/storage-backends/cursor-hosted.js +105 -145
  551. package/dist/storage-backends/file-kv.js +100 -128
  552. package/dist/storage-protocol.js +3 -5
  553. package/dist/storage.js +17 -26
  554. package/dist/types.d.ts +68 -0
  555. package/dist/types.d.ts.map +1 -1
  556. package/dist/types.js +20 -18
  557. package/docs/building-with-agents.md +2 -0
  558. package/docs/deployment.md +7 -0
  559. package/docs/guides/bitbucket.md +9 -1
  560. package/docs/guides/github.md +20 -4
  561. package/docs/guides/gitlab.md +9 -1
  562. package/docs/guides/migrate.md +127 -0
  563. package/docs/reference/cli.md +39 -0
  564. package/docs/troubleshooting.md +1 -0
  565. package/package.json +1 -1
  566. package/skills/debug/SKILL.md +1 -0
  567. package/skills/github/SKILL.md +23 -0
  568. package/skills/migrate-v2/SKILL.md +264 -0
  569. package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
  570. package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
  571. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
  572. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
  573. package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
  574. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
  575. package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
  576. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  577. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  578. package/dist/playground/assets/index-DPKLl4C_.css +0 -1
  579. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  580. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
  581. /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),