@cursor/bdk 0.2.17 → 0.2.20

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 (254) hide show
  1. package/AGENTS.md +16 -6
  2. package/dist/bin/agent-serve.js +7 -0
  3. package/dist/channels/runs/index.d.ts +4 -0
  4. package/dist/channels/runs/index.d.ts.map +1 -0
  5. package/dist/channels/runs/index.js +2 -0
  6. package/dist/channels/runs/runs-channel.d.ts +5 -0
  7. package/dist/channels/runs/runs-channel.d.ts.map +1 -0
  8. package/dist/channels/runs/runs-channel.js +34 -0
  9. package/dist/channels/runs/types.d.ts +34 -0
  10. package/dist/channels/runs/types.d.ts.map +1 -0
  11. package/dist/channels/runs/types.js +1 -0
  12. package/dist/channels/slack/slack-channel.d.ts +3 -2
  13. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  14. package/dist/channels/slack/slack-channel.js +9 -2
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/assets/{app.CUNuFTSm.js → app.BzgJFr_T.js} +4 -4
  17. package/dist/docs/assets/chunks/@localSearchIndexroot.gGwBYU3d.js +1 -0
  18. package/dist/docs/assets/chunks/{VPLocalSearchBox.Dez74k0W.js → VPLocalSearchBox.Bn5QyUDM.js} +1 -1
  19. package/dist/docs/assets/chunks/{arc.CJ3FhK7H.js → arc.D734Gm5d.js} +1 -1
  20. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CfUdbHsa.js → architectureDiagram-Q4EWVU46.NX1jj-YX.js} +1 -1
  21. package/dist/docs/assets/chunks/{baseUniq.D93LawU9.js → baseUniq.nd8dxdeO.js} +1 -1
  22. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.Zvsd6UHP.js → blockDiagram-DXYQGD6D.DG8faTim.js} +1 -1
  23. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.CGX5xZ9d.js → c4Diagram-AHTNJAMY.zD31AJ3b.js} +1 -1
  24. package/dist/docs/assets/chunks/channel.DQLJQMi3.js +1 -0
  25. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CCIf0QCo.js → chunk-4BX2VUAB.BHQj6Rko.js} +1 -1
  26. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.D_N1RPyi.js → chunk-4TB4RGXK.Cs38Yh16.js} +1 -1
  27. package/dist/docs/assets/chunks/{chunk-55IACEB6.B1oecjzx.js → chunk-55IACEB6.CFUR21JO.js} +1 -1
  28. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BzUNVPGX.js → chunk-EDXVE4YY.C80-Sneg.js} +1 -1
  29. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DheI8WSO.js → chunk-FMBD7UC4.CdT1MGza.js} +1 -1
  30. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Bg4iL0sM.js → chunk-OYMX7WX6.BctEzab0.js} +1 -1
  31. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.CSQjDhAD.js → chunk-QZHKN3VN.DTneeX3k.js} +1 -1
  32. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.BDdxnPU4.js → chunk-YZCP3GAM.Cz47F_-o.js} +1 -1
  33. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.j55aerUT.js +1 -0
  34. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.j55aerUT.js +1 -0
  35. package/dist/docs/assets/chunks/clone.XimRS84I.js +1 -0
  36. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.AT0weO8r.js → cose-bilkent-S5V4N54A.BPYgB-_O.js} +1 -1
  37. package/dist/docs/assets/chunks/{dagre-KV5264BT.CJ30TxV0.js → dagre-KV5264BT.Cu6hECod.js} +1 -1
  38. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.KtE--1fW.js → diagram-5BDNPKRD.BMgp95Tz.js} +1 -1
  39. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BFGygSUQ.js → diagram-G4DWMVQ6.towWdhDi.js} +1 -1
  40. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BLU-79eb.js → diagram-MMDJMWI5.D9IfOvE9.js} +1 -1
  41. package/dist/docs/assets/chunks/{diagram-TYMM5635.CdjfJdVG.js → diagram-TYMM5635.NTX57RPu.js} +1 -1
  42. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.Dj1Iwypl.js → erDiagram-SMLLAGMA.DIQLqDqu.js} +1 -1
  43. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BXqj_Su2.js → flowDiagram-DWJPFMVM.DhqpItRe.js} +1 -1
  44. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.CNfgGSst.js → ganttDiagram-T4ZO3ILL.B998R3Ps.js} +1 -1
  45. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.2tgvFDBr.js → gitGraphDiagram-UUTBAWPF.B45nTn8-.js} +1 -1
  46. package/dist/docs/assets/chunks/{graph.CWHZMxx6.js → graph.DPseWzzM.js} +1 -1
  47. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.DhLIK8m1.js → infoDiagram-42DDH7IO._GhhBBai.js} +1 -1
  48. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.BIN11n1G.js → ishikawaDiagram-UXIWVN3A.CTUMcaMM.js} +1 -1
  49. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BARmNJ0n.js → journeyDiagram-VCZTEJTY.DkJBUddC.js} +1 -1
  50. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BrTJYFyF.js → kanban-definition-6JOO6SKY.B5Q3uwhy.js} +1 -1
  51. package/dist/docs/assets/chunks/{layout.CPZIIywK.js → layout.CDY13IKh.js} +1 -1
  52. package/dist/docs/assets/chunks/{linear.DTpmzI5S.js → linear.BPd1ql9p.js} +1 -1
  53. package/dist/docs/assets/chunks/{min.BBLQmXwZ.js → min.dlGuqIBP.js} +1 -1
  54. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.5qkWJvdl.js → mindmap-definition-QFDTVHPH.Cp7zCtmb.js} +1 -1
  55. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.-4wufv_f.js → pieDiagram-DEJITSTG.CRH034nu.js} +1 -1
  56. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.C0jrp1-8.js → quadrantDiagram-34T5L4WZ.BspgZ-pX.js} +1 -1
  57. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DUDpANfe.js → requirementDiagram-MS252O5E.CQZqZ0nZ.js} +1 -1
  58. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.74Lvg6Gu.js → sankeyDiagram-XADWPNL6.DllwFU3k.js} +1 -1
  59. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.BHDIH286.js → sequenceDiagram-FGHM5R23.B5fTXycf.js} +1 -1
  60. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.Dr-HIuLb.js → stateDiagram-FHFEXIEX.12GQjmbD.js} +1 -1
  61. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.Ctv5WEMu.js +1 -0
  62. package/dist/docs/assets/chunks/{theme.H8zSBhlM.js → theme.BgocqONV.js} +2 -2
  63. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.GtyCaSiL.js → timeline-definition-GMOUNBTQ.DXKUL5rH.js} +1 -1
  64. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.DLId0rxH.js → vennDiagram-DHZGUBPP.BrsjYCjp.js} +1 -1
  65. package/dist/docs/assets/chunks/wardley-RL74JXVD.DZDndEXQ.js +162 -0
  66. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CI6mGYNG.js → wardleyDiagram-NUSXRM2D.C4oM69gv.js} +1 -1
  67. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CG1n865F.js → xychartDiagram-5P7HB3ND.qzHH9efW.js} +1 -1
  68. package/dist/docs/assets/{deployment.md.ajc3VM0m.js → deployment.md.D0uprX2p.js} +3 -3
  69. package/dist/docs/assets/{deployment.md.ajc3VM0m.lean.js → deployment.md.D0uprX2p.lean.js} +1 -1
  70. package/dist/docs/assets/{guides_agent-to-agent.md.Cps5NiCV.js → guides_agent-to-agent.md.CwL5cwuE.js} +6 -5
  71. package/dist/docs/assets/{guides_agent-to-agent.md.Cps5NiCV.lean.js → guides_agent-to-agent.md.CwL5cwuE.lean.js} +1 -1
  72. package/dist/docs/assets/guides_export-grokbot.md.qo5bxi4h.js +55 -0
  73. package/dist/docs/assets/guides_export-grokbot.md.qo5bxi4h.lean.js +1 -0
  74. package/dist/docs/assets/{guides_opentelemetry.md.jcPNrQbH.js → guides_opentelemetry.md.BHPm32OR.js} +3 -3
  75. package/dist/docs/assets/{guides_opentelemetry.md.jcPNrQbH.lean.js → guides_opentelemetry.md.BHPm32OR.lean.js} +1 -1
  76. package/dist/docs/assets/{index.md.CHAFTf6m.js → index.md.CAnsLl8D.js} +2 -2
  77. package/dist/docs/assets/{index.md.CHAFTf6m.lean.js → index.md.CAnsLl8D.lean.js} +1 -1
  78. package/dist/docs/assets/{reference_cli.md.Bt3sAfat.js → reference_cli.md.Bkrsce22.js} +7 -4
  79. package/dist/docs/assets/{reference_cli.md.Bt3sAfat.lean.js → reference_cli.md.Bkrsce22.lean.js} +1 -1
  80. package/dist/docs/assets/{reference_connections.md.CxbLpaaP.js → reference_connections.md.BJE2Zllp.js} +4 -4
  81. package/dist/docs/assets/{reference_connections.md.CxbLpaaP.lean.js → reference_connections.md.BJE2Zllp.lean.js} +1 -1
  82. package/dist/docs/assets/{reference_hooks.md.DbJC8mcZ.js → reference_hooks.md.CP3FENFJ.js} +1 -1
  83. package/dist/docs/assets/reference_memory.md.BwyJXYZe.js +4 -0
  84. package/dist/docs/assets/reference_memory.md.BwyJXYZe.lean.js +1 -0
  85. package/dist/docs/assets/{reference_skills.md.Ckddg6KX.js → reference_skills.md.C2GWh7g8.js} +3 -3
  86. package/dist/docs/building-with-agents.html +35 -35
  87. package/dist/docs/deployment.html +38 -38
  88. package/dist/docs/deployment.md +17 -0
  89. package/dist/docs/evals.html +35 -35
  90. package/dist/docs/guides/agent-to-agent.html +41 -40
  91. package/dist/docs/guides/agent-to-agent.md +34 -21
  92. package/dist/docs/guides/bitbucket.html +35 -35
  93. package/dist/docs/guides/cloud-agents.html +35 -35
  94. package/dist/docs/guides/convert-automation.html +35 -35
  95. package/dist/docs/guides/export-grokbot.html +114 -0
  96. package/dist/docs/guides/export-grokbot.md +239 -0
  97. package/dist/docs/guides/github.html +35 -35
  98. package/dist/docs/guides/gitlab.html +35 -35
  99. package/dist/docs/guides/grokbot-agents.html +35 -35
  100. package/dist/docs/guides/hooks.html +35 -35
  101. package/dist/docs/guides/improve.html +35 -35
  102. package/dist/docs/guides/jev.html +35 -35
  103. package/dist/docs/guides/mcp-oauth.html +35 -35
  104. package/dist/docs/guides/migrate.html +36 -36
  105. package/dist/docs/guides/opentelemetry.html +37 -37
  106. package/dist/docs/guides/opentelemetry.md +19 -0
  107. package/dist/docs/guides/slack.html +35 -35
  108. package/dist/docs/guides/webhooks.html +35 -35
  109. package/dist/docs/hashmap.json +1 -1
  110. package/dist/docs/hillclimbing.html +35 -35
  111. package/dist/docs/index.html +37 -37
  112. package/dist/docs/index.md +3 -0
  113. package/dist/docs/llms-full.txt +493 -29
  114. package/dist/docs/llms.txt +2 -0
  115. package/dist/docs/quickstart.html +35 -35
  116. package/dist/docs/reference/agent-config.html +35 -35
  117. package/dist/docs/reference/artifacts.html +35 -35
  118. package/dist/docs/reference/channels.html +35 -35
  119. package/dist/docs/reference/cli.html +41 -38
  120. package/dist/docs/reference/cli.md +39 -1
  121. package/dist/docs/reference/connections.html +38 -38
  122. package/dist/docs/reference/connections.md +16 -6
  123. package/dist/docs/reference/evals.html +36 -36
  124. package/dist/docs/reference/extensions.html +35 -35
  125. package/dist/docs/reference/hooks.html +38 -38
  126. package/dist/docs/reference/hooks.md +2 -1
  127. package/dist/docs/reference/http-api.html +35 -35
  128. package/dist/docs/reference/instructions.html +35 -35
  129. package/dist/docs/reference/memory.html +63 -0
  130. package/dist/docs/reference/memory.md +114 -0
  131. package/dist/docs/reference/playground.html +35 -35
  132. package/dist/docs/reference/project-layout.html +35 -35
  133. package/dist/docs/reference/prompt.html +35 -35
  134. package/dist/docs/reference/schedules.html +35 -35
  135. package/dist/docs/reference/sessions.html +35 -35
  136. package/dist/docs/reference/skills.html +38 -38
  137. package/dist/docs/reference/subagents.html +35 -35
  138. package/dist/docs/reference/tools.html +35 -35
  139. package/dist/docs/templates/agentic-owners.html +35 -35
  140. package/dist/docs/templates/grokbot-agents.html +35 -35
  141. package/dist/docs/templates/security-reviewer.html +35 -35
  142. package/dist/docs/templates/thermo-quality-review.html +35 -35
  143. package/dist/docs/templates/thermo-review.html +35 -35
  144. package/dist/docs/templates/triage.html +35 -35
  145. package/dist/docs/troubleshooting.html +35 -35
  146. package/dist/evals.d.ts +1 -1
  147. package/dist/evals.js +1 -1
  148. package/dist/extensions/cursor-cloud-agents/extension.d.ts +2 -2
  149. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  150. package/dist/extensions/cursor-cloud-agents/extension.js +1 -1
  151. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts +8 -1
  152. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts.map +1 -1
  153. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.js +10 -1
  154. package/dist/internal/cli-ax.d.ts +7 -7
  155. package/dist/internal/cli-ax.d.ts.map +1 -1
  156. package/dist/internal/cli-ax.js +36 -15
  157. package/dist/internal/cli-deploy.d.ts.map +1 -1
  158. package/dist/internal/cli-deploy.js +0 -14
  159. package/dist/internal/cloud-turn-usage.d.ts +34 -0
  160. package/dist/internal/cloud-turn-usage.d.ts.map +1 -0
  161. package/dist/internal/cloud-turn-usage.js +94 -0
  162. package/dist/internal/continuation-channel.d.ts.map +1 -1
  163. package/dist/internal/continuation-channel.js +6 -0
  164. package/dist/internal/continuation-identity.d.ts +6 -3
  165. package/dist/internal/continuation-identity.d.ts.map +1 -1
  166. package/dist/internal/continuation-identity.js +43 -0
  167. package/dist/internal/estimate-cost.d.ts +55 -0
  168. package/dist/internal/estimate-cost.d.ts.map +1 -0
  169. package/dist/internal/{turn-cost.js → estimate-cost.js} +18 -26
  170. package/dist/internal/event-log.d.ts +2 -2
  171. package/dist/internal/event-log.js +2 -2
  172. package/dist/internal/http-channel.d.ts.map +1 -1
  173. package/dist/internal/http-channel.js +21 -2
  174. package/dist/internal/http-control-plane-session.d.ts +5 -2
  175. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  176. package/dist/internal/http-control-plane-session.js +38 -2
  177. package/dist/internal/init-scaffold.d.ts.map +1 -1
  178. package/dist/internal/init-scaffold.js +3 -4
  179. package/dist/internal/model-config.d.ts +7 -0
  180. package/dist/internal/model-config.d.ts.map +1 -0
  181. package/dist/internal/model-config.js +67 -0
  182. package/dist/internal/otel/collector.d.ts +3 -3
  183. package/dist/internal/otel/collector.d.ts.map +1 -1
  184. package/dist/internal/otel/collector.js +8 -21
  185. package/dist/internal/otel/computer-use-attrs.d.ts +13 -0
  186. package/dist/internal/otel/computer-use-attrs.d.ts.map +1 -0
  187. package/dist/internal/otel/computer-use-attrs.js +29 -0
  188. package/dist/internal/peer-connections.d.ts +17 -8
  189. package/dist/internal/peer-connections.d.ts.map +1 -1
  190. package/dist/internal/peer-connections.js +41 -10
  191. package/dist/internal/request-error-status.d.ts.map +1 -1
  192. package/dist/internal/request-error-status.js +4 -1
  193. package/dist/internal/resolved-connections.d.ts +4 -1
  194. package/dist/internal/resolved-connections.d.ts.map +1 -1
  195. package/dist/internal/resolved-connections.js +9 -4
  196. package/dist/internal/sdk-runner.d.ts.map +1 -1
  197. package/dist/internal/sdk-runner.js +16 -14
  198. package/dist/internal/server.d.ts.map +1 -1
  199. package/dist/internal/server.js +2 -1
  200. package/dist/internal/session-cost.d.ts +21 -22
  201. package/dist/internal/session-cost.d.ts.map +1 -1
  202. package/dist/internal/session-cost.js +38 -46
  203. package/dist/internal/session-engine.d.ts +25 -41
  204. package/dist/internal/session-engine.d.ts.map +1 -1
  205. package/dist/internal/session-engine.js +130 -122
  206. package/dist/internal/sessions-client.d.ts +13 -1
  207. package/dist/internal/sessions-client.d.ts.map +1 -1
  208. package/dist/internal/sessions-client.js +24 -0
  209. package/dist/internal/storage-coordinator.d.ts +9 -9
  210. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  211. package/dist/internal/storage-coordinator.js +116 -36
  212. package/dist/internal/testing/factory-resource-fixtures.d.ts +16 -0
  213. package/dist/internal/testing/factory-resource-fixtures.d.ts.map +1 -1
  214. package/dist/internal/testing/factory-resource-fixtures.js +14 -0
  215. package/dist/internal/trajectory.d.ts +5 -6
  216. package/dist/internal/trajectory.d.ts.map +1 -1
  217. package/dist/internal/trajectory.js +1 -13
  218. package/dist/memory.d.ts +5 -2
  219. package/dist/memory.d.ts.map +1 -1
  220. package/dist/memory.js +1 -1
  221. package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
  222. package/dist/playground/assets/index-C77_FdOx.css +1 -0
  223. package/dist/playground/assets/index-CvzI2lhj.js +71 -0
  224. package/dist/playground/index.html +2 -2
  225. package/dist/types.d.ts +57 -22
  226. package/dist/types.d.ts.map +1 -1
  227. package/docs/README.md +3 -0
  228. package/docs/deployment.md +17 -0
  229. package/docs/guides/agent-to-agent.md +34 -21
  230. package/docs/guides/export-grokbot.md +244 -0
  231. package/docs/guides/opentelemetry.md +19 -0
  232. package/docs/reference/cli.md +39 -1
  233. package/docs/reference/connections.md +16 -6
  234. package/docs/reference/hooks.md +2 -1
  235. package/docs/reference/memory.md +119 -0
  236. package/package.json +13 -5
  237. package/templates/agentic-owners/bot/lib/owners/matching.ts +57 -2
  238. package/dist/docs/assets/chunks/@localSearchIndexroot.3c56VHUt.js +0 -1
  239. package/dist/docs/assets/chunks/channel.S8-FFjmE.js +0 -1
  240. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BB98tFjZ.js +0 -1
  241. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BB98tFjZ.js +0 -1
  242. package/dist/docs/assets/chunks/clone.B98w8OEv.js +0 -1
  243. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DW_lwpZY.js +0 -1
  244. package/dist/docs/assets/chunks/wardley-RL74JXVD.CSlECTHi.js +0 -162
  245. package/dist/internal/cloud-turn-cost.d.ts +0 -42
  246. package/dist/internal/cloud-turn-cost.d.ts.map +0 -1
  247. package/dist/internal/cloud-turn-cost.js +0 -120
  248. package/dist/internal/turn-cost.d.ts +0 -41
  249. package/dist/internal/turn-cost.d.ts.map +0 -1
  250. package/dist/playground/assets/cursor-icons-16-4RnoYH3n.woff2 +0 -0
  251. package/dist/playground/assets/index-7fVUOA5l.css +0 -1
  252. package/dist/playground/assets/index-U3TRnwAP.js +0 -71
  253. /package/dist/docs/assets/{reference_hooks.md.DbJC8mcZ.lean.js → reference_hooks.md.CP3FENFJ.lean.js} +0 -0
  254. /package/dist/docs/assets/{reference_skills.md.Ckddg6KX.lean.js → reference_skills.md.C2GWh7g8.lean.js} +0 -0
@@ -3,6 +3,7 @@ import { InvalidAsOfError, VacuousTimeArgsError } from "./as-of.js";
3
3
  import { V2EngineError } from "./continuation-identity.js";
4
4
  import { GUEST_CONNECT_STALLED, GUEST_NETWORK_UNAVAILABLE, GuestNetworkUnavailableError, hasGuestNetworkErrno, isQuietGuestConnectStall, } from "./guest-network.js";
5
5
  import { HOSTED_GUEST_RETRY_TERMINAL, HOSTED_GUEST_RETRY_TRANSIENT, } from "./hosted-delivery-protocol.js";
6
+ import { InvalidModelConfigError } from "./model-config.js";
6
7
  import { SessionAuthError, SessionBusyError } from "./session-engine.js";
7
8
  /**
8
9
  * Expected throw → HTTP mapping used by `handleRequest` and hosted flush.
@@ -41,7 +42,9 @@ export function mapThrownRequestError(error) {
41
42
  retry: HOSTED_GUEST_RETRY_TERMINAL,
42
43
  };
43
44
  }
44
- if (error instanceof InvalidAsOfError || error instanceof VacuousTimeArgsError) {
45
+ if (error instanceof InvalidAsOfError ||
46
+ error instanceof VacuousTimeArgsError ||
47
+ error instanceof InvalidModelConfigError) {
45
48
  return {
46
49
  status: 400,
47
50
  code: "invalid_request",
@@ -4,7 +4,8 @@
4
4
  * account bridge — resolve to concrete URLs and join the engine's
5
5
  * resolved-connection set. Local turns call both over loopback; cloud
6
6
  * turns use the serve `publicUrl` for peers and the account's native
7
- * connectors instead of the bridge.
7
+ * connectors instead of the bridge. A single-agent serve with a peers URL
8
+ * reaches its peers there from both runtimes.
8
9
  */
9
10
  import { type AgentProject } from "../types.js";
10
11
  import { type CursorAccountConnectionRef, type CursorAccountMcpBridge } from "./cursor/account-mcp.js";
@@ -55,6 +56,8 @@ export declare function resolveMountConnections(args: {
55
56
  accountBridge?: CursorAccountMcpBridge;
56
57
  publicUrl?: string;
57
58
  authToken?: string;
59
+ /** Resolves `peerRefs` on another host; see `resolveHostedPeerConnections`. */
60
+ peersUrl?: string;
58
61
  /** See {@link validateMountConnectionsConfig}. */
59
62
  cloudToolsBridge?: boolean;
60
63
  logger: (line: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"resolved-connections.d.ts","sourceRoot":"","sources":["../../src/internal/resolved-connections.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAkC,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,IAAI,CA0BP;AAED,qEAAqE;AACrE,wBAAgB,wCAAwC,CAAC,IAAI,EAAE;IAC7D,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,mBAAmB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACzD;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC,GAAG,IAAI,CAoBP;AAED,iFAAiF;AACjF,wBAAgB,oCAAoC,CAAC,IAAI,EAAE;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,qBAAqB,EAAE,OAAO,CAAC;CAChC,GAAG,IAAI,CAUP;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,GAAG,wBAAwB,EAAE,CAgE7B"}
1
+ {"version":3,"file":"resolved-connections.d.ts","sourceRoot":"","sources":["../../src/internal/resolved-connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAkC,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,IAAI,CA0BP;AAED,qEAAqE;AACrE,wBAAgB,wCAAwC,CAAC,IAAI,EAAE;IAC7D,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,mBAAmB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACzD;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC,GAAG,IAAI,CAoBP;AAED,iFAAiF;AACjF,wBAAgB,oCAAoC,CAAC,IAAI,EAAE;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,qBAAqB,EAAE,OAAO,CAAC;CAChC,GAAG,IAAI,CAUP;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,GAAG,wBAAwB,EAAE,CAmE7B"}
@@ -4,11 +4,12 @@
4
4
  * account bridge — resolve to concrete URLs and join the engine's
5
5
  * resolved-connection set. Local turns call both over loopback; cloud
6
6
  * turns use the serve `publicUrl` for peers and the account's native
7
- * connectors instead of the bridge.
7
+ * connectors instead of the bridge. A single-agent serve with a peers URL
8
+ * reaches its peers there from both runtimes.
8
9
  */
9
10
  import { isHostOauthConnectionTransport } from "../types.js";
10
11
  import { resolveCursorAccountConnections, } from "./cursor/account-mcp.js";
11
- import { resolvePeerConnections } from "./peer-connections.js";
12
+ import { resolveHostedPeerConnections, resolvePeerConnections, } from "./peer-connections.js";
12
13
  /** Fail fast before listen when static cloud config cannot honor `servers`. */
13
14
  export function validateMountConnectionsConfig(args) {
14
15
  if (args.accountRefs === undefined || args.accountRefs.length === 0) {
@@ -69,9 +70,13 @@ export function resolveMountConnections(args) {
69
70
  : `[bdk] warning: agent "${label}" has host-OAuth MCP connections (${hostOauthNames.join(", ")}) whose tokens live on this serve host; cloud-runtime turns omit them. Serve with a cloud tools URL so they reach turns through the host connection bridge, or drop \`oauth\` and authorize the server another way.`);
70
71
  }
71
72
  }
72
- if (args.peerRefs !== undefined && args.peerRefs.length > 0) {
73
+ const peerRefs = args.peerRefs ?? [];
74
+ if (args.peersUrl !== undefined) {
75
+ resolved.push(...resolveHostedPeerConnections({ refs: peerRefs, peersUrl: args.peersUrl }));
76
+ }
77
+ else if (peerRefs.length > 0) {
73
78
  const peers = resolvePeerConnections({
74
- refs: args.peerRefs,
79
+ refs: peerRefs,
75
80
  serverUrl: args.serverUrl,
76
81
  ...(args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl }),
77
82
  ...(args.authToken === undefined ? {} : { authToken: args.authToken }),
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../src/internal/sdk-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../src/internal/sdk-runner.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { mkdir } from "node:fs/promises";
9
9
  import { Agent, Cursor, createAgentPlatform, } from "@cursor/sdk";
10
10
  import { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
11
11
  import { DEFAULT_MODEL, } from "../types.js";
12
- import { mapSdkTokenUsage, usageTokenSum } from "./cloud-turn-cost.js";
12
+ import { mapSdkTokenUsage, usageTokenSum } from "./cloud-turn-usage.js";
13
13
  import { resolveApiKeySync, SIGN_IN_HINT } from "./cursor/credentials.js";
14
14
  import { describeError } from "./describe-error.js";
15
15
  import { installedSdkAppliesSubagentInherit } from "./sdk-subagent-inherit-support.js";
@@ -262,6 +262,7 @@ export class CursorSdkRunner {
262
262
  */
263
263
  async runTurnWithTransportRetry(request, onStreamed) {
264
264
  let sawUpdate = false;
265
+ let mintedSdkAgentId;
265
266
  const tracked = {
266
267
  ...request,
267
268
  onUpdate: (update) => {
@@ -269,6 +270,10 @@ export class CursorSdkRunner {
269
270
  onStreamed();
270
271
  return request.onUpdate(update);
271
272
  },
273
+ onSdkAgentId: async (sdkAgentId) => {
274
+ mintedSdkAgentId = sdkAgentId;
275
+ await request.onSdkAgentId?.(sdkAgentId);
276
+ },
272
277
  };
273
278
  const outcome = await this.runTurnAttempt(tracked);
274
279
  if (outcome.status !== "error" || sawUpdate || request.signal?.aborted === true) {
@@ -281,8 +286,13 @@ export class CursorSdkRunner {
281
286
  // Log the original error even when the retry succeeds so the expiry
282
287
  // still shows up in Datadog.
283
288
  this.log(`[bdk] session ${request.sessionId}: ${reason}: ${outcome.errorMessage}; retrying the turn`);
289
+ // The failed attempt already minted this cloud agent; resuming it is what
290
+ // keeps one trigger from leaving two `bc-…` agents behind.
291
+ const retried = mintedSdkAgentId !== undefined && isServerMintedCloudAgentId(mintedSdkAgentId)
292
+ ? { ...tracked, sdkAgentId: mintedSdkAgentId }
293
+ : tracked;
284
294
  try {
285
- return await this.runTurnAttempt(tracked);
295
+ return await this.runTurnAttempt(retried);
286
296
  }
287
297
  catch {
288
298
  return outcome;
@@ -366,11 +376,6 @@ export class CursorSdkRunner {
366
376
  try {
367
377
  const result = await run.wait();
368
378
  let outcome = toTurnOutcome(result);
369
- if (request.runtime === "cloud" && isCloudRunId(result.id)) {
370
- // The cost endpoint prices billed usage per run only when told
371
- // which run; a local run label is not resolvable there.
372
- outcome = { ...outcome, runId: result.id };
373
- }
374
379
  if (outcome.status === "error") {
375
380
  // An error result usually means the handle's transport is poisoned
376
381
  // — most often a cached access token that aged past its 60-minute
@@ -386,7 +391,7 @@ export class CursorSdkRunner {
386
391
  result.id !== "") {
387
392
  // Cloud `wait()` drops usage after stream reconnect / getRun replay,
388
393
  // or returns an all-zero stub. `getUsage` still has the run's tokens
389
- // (eventually); without them traces never record an estimated cost.
394
+ // (eventually); without them traces never record the turn's tokens.
390
395
  outcome = await fillMissingCloudUsage(agent, result.id, outcome);
391
396
  }
392
397
  return outcome;
@@ -770,15 +775,12 @@ function toTurnOutcome(result) {
770
775
  ...(usage === undefined ? {} : { usage }),
771
776
  };
772
777
  }
773
- function isCloudRunId(id) {
774
- return typeof id === "string" && id.startsWith("run-");
775
- }
776
- /** Billing can lag briefly after `wait()`; retry before giving up on cost. */
778
+ /** Billing can lag briefly after `wait()`; retry before giving up on usage. */
777
779
  const CLOUD_USAGE_RETRY_DELAYS_MS = [0, 400, 1200];
778
780
  /**
779
781
  * Cloud `wait()` often omits usage after a stream drop. Pull the run's
780
- * tokens from the usage API so the engine can still price the turn.
781
- * Failures are ignored: a missing estimate is better than failing the turn.
782
+ * tokens from the usage API so the turn still records them.
783
+ * Failures are ignored: missing usage is better than failing the turn.
782
784
  */
783
785
  async function fillMissingCloudUsage(agent, runId, outcome) {
784
786
  for (const delayMs of CLOUD_USAGE_RETRY_DELAYS_MS) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAsC,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AA6CpF,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAQhB,YAAY,EACb,MAAM,aAAa,CAAC;AA6FrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAgDpE,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAUpE,OAAO,EAEL,wBAAwB,EAEzB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAsB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAW/E,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAuCD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,yEAAyE;IACzE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;IAC5D,wEAAwE;IACxE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACvD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CA0nC3B;AAkmDD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,cAAc,EACnB,MAAM,SAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAkDf"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAsC,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AA6CpF,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAQhB,YAAY,EACb,MAAM,aAAa,CAAC;AA6FrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAgDpE,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAUpE,OAAO,EAEL,wBAAwB,EAEzB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAsB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAW/E,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAuCD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,yEAAyE;IACzE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;IAC5D,wEAAwE;IACxE,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;IACvD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CA2nC3B;AAkmDD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,cAAc,EACnB,MAAM,SAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAkDf"}
@@ -481,7 +481,7 @@ export async function startServer(mounts, options = {}) {
481
481
  // Validate peer MCP connections (defineConnection({ agent })) against the
482
482
  // mount set before anything starts. URLs resolve after listen, once the
483
483
  // port is known.
484
- const peerRefsBySlug = collectPeerConnections(mounts, logger);
484
+ const peerRefsBySlug = collectPeerConnections(mounts, logger, options.peersUrl);
485
485
  // Cursor account MCP connections (defineConnection({ cursorAccount: true }))
486
486
  // need a signed-in host: their tools execute on the Cursor backend with
487
487
  // the account's stored OAuth credentials. Fail fast at serve start instead
@@ -929,6 +929,7 @@ export async function startServer(mounts, options = {}) {
929
929
  : {}),
930
930
  ...(options.publicUrl === undefined ? {} : { publicUrl: options.publicUrl }),
931
931
  ...(options.authToken === undefined ? {} : { authToken: options.authToken }),
932
+ peersUrl: options.peersUrl,
932
933
  cloudToolsBridge: options.cloudToolsUrl !== undefined,
933
934
  logger,
934
935
  });
@@ -1,50 +1,49 @@
1
1
  /**
2
- * Per-session cost metrics folded from a durable session event stream.
2
+ * Per-session usage and cost report for `bdk cost [sessionId]`.
3
3
  *
4
- * Powers `agent-sdk cost [sessionId]`: each `turn.completed` event carries
5
- * the turn's token usage and the estimated dollar cost recorded by the
6
- * engine via `POST /v1/models/estimate-cost`, so a session's spend is a
7
- * pure fold over its `events.ndjson`. `GET /v1/session/:id/cost` is the
8
- * live billed total.
4
+ * Token usage is a pure fold over the session's `turn.completed` events.
5
+ * Dollars are priced for the whole session by `GET /v1/session/:id/cost`;
6
+ * turns are never priced on their own.
9
7
  */
10
- import type { SessionEvent, TurnCost, TurnUsage } from "../types.js";
11
- /** One agent loop pass (turn) with its usage and estimated cost. */
8
+ import type { SessionCost, SessionEvent, TurnUsage } from "../types.js";
9
+ /** One agent loop pass (turn) with its token usage. */
12
10
  export interface SessionCostTurn {
13
11
  turnId: string;
14
12
  failed: boolean;
15
13
  usage?: TurnUsage;
16
- cost?: TurnCost;
17
14
  }
18
- export interface SessionCostTotals {
15
+ export interface SessionUsageTotals {
19
16
  turns: number;
20
17
  turnFailures: number;
21
18
  inputTokens: number;
22
19
  outputTokens: number;
23
20
  cacheReadTokens: number;
24
21
  cacheWriteTokens: number;
25
- /** Sum of per-turn estimated costs (USD). */
26
- costUsd: number;
27
- /** Turns that reported usage but had no known model rates. */
28
- unpricedTurns: number;
29
22
  }
30
23
  export interface SessionCostReport {
31
24
  sessionId: string;
32
25
  turns: SessionCostTurn[];
33
- totals: SessionCostTotals;
26
+ totals: SessionUsageTotals;
27
+ /** Whole-session cost; absent when the server could not price it. */
28
+ cost?: SessionCost;
34
29
  }
35
- export declare function emptySessionCostTotals(): SessionCostTotals;
36
- export declare function addSessionCostTotals(target: SessionCostTotals, delta: SessionCostTotals): void;
37
- /** Fold a session event stream into per-turn and total cost metrics. */
38
- export declare function buildSessionCostReport(events: readonly SessionEvent[]): SessionCostReport;
39
- /** Per-turn table for `agent-sdk cost <sessionId>`. */
30
+ export declare function emptySessionUsageTotals(): SessionUsageTotals;
31
+ export declare function addSessionUsageTotals(target: SessionUsageTotals, delta: SessionUsageTotals): void;
32
+ /** Fold a session event stream into per-turn and total token usage. */
33
+ export declare function buildSessionCostReport(events: readonly SessionEvent[], cost?: SessionCost): SessionCostReport;
34
+ /** Per-turn token table plus the session cost for `bdk cost <sessionId>`. */
40
35
  export declare function formatSessionCostText(report: SessionCostReport): string;
41
36
  export interface SessionCostRow {
42
37
  sessionId: string;
43
38
  channelId: string;
44
39
  title?: string;
45
40
  updatedAt?: string;
46
- totals: SessionCostTotals;
41
+ totals: SessionUsageTotals;
47
42
  }
48
- /** All-sessions table for `agent-sdk cost` (no session id). */
43
+ /**
44
+ * All-sessions token table for `bdk cost` (no session id). Pricing every
45
+ * session would run one billed lookup per session, so dollars are left to
46
+ * `bdk cost <sessionId>`.
47
+ */
49
48
  export declare function formatSessionsCostText(rows: SessionCostRow[]): string;
50
49
  //# sourceMappingURL=session-cost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-cost.d.ts","sourceRoot":"","sources":["../../src/internal/session-cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGrE,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,IAAI,iBAAiB,CAW1D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAS9F;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,iBAAiB,CAyCzF;AAMD,uDAAuD;AACvD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAiCvE;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CA8BrE"}
1
+ {"version":3,"file":"session-cost.d.ts","sourceRoot":"","sources":["../../src/internal/session-cost.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxE,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,qEAAqE;IACrE,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,CAS5D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAOjG;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,IAAI,CAAC,EAAE,WAAW,GACjB,iBAAiB,CAsCnB;AAcD,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA0BvE;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CA8BrE"}
@@ -1,14 +1,13 @@
1
1
  /**
2
- * Per-session cost metrics folded from a durable session event stream.
2
+ * Per-session usage and cost report for `bdk cost [sessionId]`.
3
3
  *
4
- * Powers `agent-sdk cost [sessionId]`: each `turn.completed` event carries
5
- * the turn's token usage and the estimated dollar cost recorded by the
6
- * engine via `POST /v1/models/estimate-cost`, so a session's spend is a
7
- * pure fold over its `events.ndjson`. `GET /v1/session/:id/cost` is the
8
- * live billed total.
4
+ * Token usage is a pure fold over the session's `turn.completed` events.
5
+ * Dollars are priced for the whole session by `GET /v1/session/:id/cost`;
6
+ * turns are never priced on their own.
9
7
  */
10
- import { formatCostUsd, roundCostUsd } from "./trajectory.js";
11
- export function emptySessionCostTotals() {
8
+ import { CLI_COMMAND_NAME } from "./distribution.js";
9
+ import { formatCostUsd } from "./trajectory.js";
10
+ export function emptySessionUsageTotals() {
12
11
  return {
13
12
  turns: 0,
14
13
  turnFailures: 0,
@@ -16,25 +15,21 @@ export function emptySessionCostTotals() {
16
15
  outputTokens: 0,
17
16
  cacheReadTokens: 0,
18
17
  cacheWriteTokens: 0,
19
- costUsd: 0,
20
- unpricedTurns: 0,
21
18
  };
22
19
  }
23
- export function addSessionCostTotals(target, delta) {
20
+ export function addSessionUsageTotals(target, delta) {
24
21
  target.turns += delta.turns;
25
22
  target.turnFailures += delta.turnFailures;
26
23
  target.inputTokens += delta.inputTokens;
27
24
  target.outputTokens += delta.outputTokens;
28
25
  target.cacheReadTokens += delta.cacheReadTokens;
29
26
  target.cacheWriteTokens += delta.cacheWriteTokens;
30
- target.costUsd = roundCostUsd(target.costUsd + delta.costUsd);
31
- target.unpricedTurns += delta.unpricedTurns;
32
27
  }
33
- /** Fold a session event stream into per-turn and total cost metrics. */
34
- export function buildSessionCostReport(events) {
28
+ /** Fold a session event stream into per-turn and total token usage. */
29
+ export function buildSessionCostReport(events, cost) {
35
30
  let sessionId = "";
36
31
  const turns = [];
37
- const totals = emptySessionCostTotals();
32
+ const totals = emptySessionUsageTotals();
38
33
  for (const event of events) {
39
34
  if (sessionId === "" && typeof event.sessionId === "string") {
40
35
  sessionId = event.sessionId;
@@ -60,38 +55,39 @@ export function buildSessionCostReport(events) {
60
55
  totals.cacheReadTokens += usage.cacheReadTokens;
61
56
  totals.cacheWriteTokens += usage.cacheWriteTokens;
62
57
  }
63
- const cost = event.data.cost;
64
- if (cost !== undefined) {
65
- turn.cost = cost;
66
- totals.costUsd = roundCostUsd(totals.costUsd + cost.totalUsd);
67
- }
68
- else if (usage !== undefined) {
69
- totals.unpricedTurns += 1;
70
- }
71
58
  turns.push(turn);
72
59
  }
73
- return { sessionId, turns, totals };
60
+ const report = { sessionId, turns, totals };
61
+ if (cost !== undefined && cost.source !== "unavailable") {
62
+ report.cost = cost;
63
+ }
64
+ return report;
74
65
  }
75
66
  function formatCount(value) {
76
67
  return String(value);
77
68
  }
78
- /** Per-turn table for `agent-sdk cost <sessionId>`. */
69
+ function formatSessionCost(cost) {
70
+ if (cost === undefined) {
71
+ return "unavailable";
72
+ }
73
+ const model = cost.model === undefined ? "" : `, ${cost.model}`;
74
+ return `${formatCostUsd(cost.costUsd)} (${cost.source}${model})`;
75
+ }
76
+ /** Per-turn token table plus the session cost for `bdk cost <sessionId>`. */
79
77
  export function formatSessionCostText(report) {
80
78
  const lines = [];
81
- lines.push(`session ${report.sessionId || "(unknown)"} cost: ${formatCostUsd(report.totals.costUsd)}`);
79
+ lines.push(`session ${report.sessionId || "(unknown)"} cost: ${formatSessionCost(report.cost)}`);
82
80
  if (report.turns.length === 0) {
83
81
  lines.push("No turns recorded.");
84
82
  return `${lines.join("\n")}\n`;
85
83
  }
86
- const header = ["TURN", "IN", "OUT", "CACHE R", "CACHE W", "COST", "MODEL", "STATUS"];
84
+ const header = ["TURN", "IN", "OUT", "CACHE R", "CACHE W", "STATUS"];
87
85
  const rows = report.turns.map((turn) => [
88
86
  turn.turnId,
89
87
  turn.usage === undefined ? "—" : formatCount(turn.usage.inputTokens),
90
88
  turn.usage === undefined ? "—" : formatCount(turn.usage.outputTokens),
91
89
  turn.usage === undefined ? "—" : formatCount(turn.usage.cacheReadTokens),
92
90
  turn.usage === undefined ? "—" : formatCount(turn.usage.cacheWriteTokens),
93
- turn.cost === undefined ? "—" : formatCostUsd(turn.cost.totalUsd),
94
- turn.cost?.model ?? "—",
95
91
  turn.failed ? "failed" : "ok",
96
92
  ]);
97
93
  rows.push([
@@ -100,30 +96,30 @@ export function formatSessionCostText(report) {
100
96
  formatCount(report.totals.outputTokens),
101
97
  formatCount(report.totals.cacheReadTokens),
102
98
  formatCount(report.totals.cacheWriteTokens),
103
- formatCostUsd(report.totals.costUsd),
104
- "",
105
99
  report.totals.turnFailures > 0 ? `${report.totals.turnFailures} failed` : "",
106
100
  ]);
107
101
  lines.push(renderTable(header, rows));
108
- appendUnpricedNote(lines, report.totals.unpricedTurns);
109
102
  return `${lines.join("\n")}\n`;
110
103
  }
111
- /** All-sessions table for `agent-sdk cost` (no session id). */
104
+ /**
105
+ * All-sessions token table for `bdk cost` (no session id). Pricing every
106
+ * session would run one billed lookup per session, so dollars are left to
107
+ * `bdk cost <sessionId>`.
108
+ */
112
109
  export function formatSessionsCostText(rows) {
113
110
  if (rows.length === 0) {
114
111
  return "No sessions.\n";
115
112
  }
116
- const header = ["SESSION", "CHANNEL", "TURNS", "IN", "OUT", "COST", "UPDATED"];
117
- const totals = emptySessionCostTotals();
113
+ const header = ["SESSION", "CHANNEL", "TURNS", "IN", "OUT", "UPDATED"];
114
+ const totals = emptySessionUsageTotals();
118
115
  const body = rows.map((row) => {
119
- addSessionCostTotals(totals, row.totals);
116
+ addSessionUsageTotals(totals, row.totals);
120
117
  return [
121
118
  row.sessionId,
122
119
  row.channelId,
123
120
  formatCount(row.totals.turns),
124
121
  formatCount(row.totals.inputTokens),
125
122
  formatCount(row.totals.outputTokens),
126
- formatCostUsd(row.totals.costUsd),
127
123
  row.updatedAt ?? "",
128
124
  ];
129
125
  });
@@ -133,18 +129,14 @@ export function formatSessionsCostText(rows) {
133
129
  formatCount(totals.turns),
134
130
  formatCount(totals.inputTokens),
135
131
  formatCount(totals.outputTokens),
136
- formatCostUsd(totals.costUsd),
137
132
  "",
138
133
  ]);
139
- const lines = [renderTable(header, body)];
140
- appendUnpricedNote(lines, totals.unpricedTurns);
134
+ const lines = [
135
+ renderTable(header, body),
136
+ `Run \`${CLI_COMMAND_NAME} cost <sessionId>\` for a session's cost.`,
137
+ ];
141
138
  return `${lines.join("\n")}\n`;
142
139
  }
143
- function appendUnpricedNote(lines, unpricedTurns) {
144
- if (unpricedTurns > 0) {
145
- lines.push(`note: ${unpricedTurns} turn(s) reported usage with no priced cost; cost totals exclude them.`);
146
- }
147
- }
148
140
  function renderTable(header, rows) {
149
141
  const widths = header.map((h, i) => Math.max(h.length, ...rows.map((row) => (row[i] ?? "").length)));
150
142
  const renderRow = (row) => row
@@ -14,8 +14,8 @@ declare module "@cursor/sdk" {
14
14
  }
15
15
  import type { Meter } from "@opentelemetry/api";
16
16
  import { SlackAskDedupeStore, SlackNudgeStore } from "../channels/slack/nudge-store.js";
17
- import { type AgentProject, type ApprovalDecision, type ArtifactListFilter, type ArtifactPage, type ArtifactRecord, type ArtifactsApi, type AuthContext, type CallToolOptions, type ChannelDefinition, type ChannelSession, type ConnectionTransport, type DiscoveredTool, type EvalCaseResultEventData, type HostContext, type HttpChannelDefinition, type PendingApproval, type PendingAuth, type ReceiveInput, type SendMessageOptions, type SessionEvent, type SessionInfo, type SessionListSource, type SessionRecord, type SessionSummary, type ToolCallOutcome, type TurnOutcome } from "../types.js";
18
- import { type CloudAgentUsage } from "./cloud-turn-cost.js";
17
+ import { type AgentProject, type ApprovalDecision, type ArtifactListFilter, type ArtifactPage, type ArtifactRecord, type ArtifactsApi, type AuthContext, type CallToolOptions, type ChannelDefinition, type ChannelSession, type ConnectionTransport, type DiscoveredTool, type EvalCaseResultEventData, type HostContext, type HttpChannelDefinition, type PendingApproval, type PendingAuth, type ReceiveInput, type SendMessageOptions, type SessionCost, type SessionEvent, type SessionInfo, type SessionListSource, type SessionRecord, type SessionSummary, type ToolCallOutcome, type TurnOutcome } from "../types.js";
18
+ import { type CloudAgentUsage } from "./cloud-turn-usage.js";
19
19
  import { type EventLogMemoryStats } from "./event-log.js";
20
20
  import { type HostPlatforms } from "./host-platforms.js";
21
21
  import { McpOauthOnDemandHub } from "./mcp-oauth-on-demand.js";
@@ -23,7 +23,7 @@ import type { OtelCollector } from "./otel/collector.js";
23
23
  import type { AgentRunner } from "./sdk-runner.js";
24
24
  import { SessionStore } from "./session-store.js";
25
25
  import { StorageCoordinator } from "./storage-coordinator.js";
26
- import { type EstimateTurnCostFn } from "./turn-cost.js";
26
+ import { type EstimateCostFn } from "./estimate-cost.js";
27
27
  import { TurnLeaseStore } from "./turn-lease-store.js";
28
28
  import { TurnOutbox } from "./turn-outbox.js";
29
29
  export declare const HTTP_CHANNEL_ID = "http";
@@ -91,15 +91,15 @@ export interface SessionEngineOptions {
91
91
  platforms?: HostPlatforms;
92
92
  /**
93
93
  * Test seam / override for cloud billed usage (`Agent.getUsage`). Used to
94
- * backfill `turn.completed` rows that older engines persisted without
95
- * usage/cost so the playground Trace tab can still show an estimate.
94
+ * backfill `turn.completed` rows that finished without usage so the
95
+ * playground Trace tab can still show their tokens.
96
96
  */
97
97
  getCloudUsage?: (sdkAgentId: string) => Promise<CloudAgentUsage | undefined>;
98
98
  /**
99
- * Resolve turn cost via `POST /v1/models/estimate-cost`. Tests inject a
99
+ * Price a whole session via `POST /v1/models/estimate-cost`. Tests inject a
100
100
  * stub; production uses billed usage events when an agent id is known.
101
101
  */
102
- estimateTurnCost?: EstimateTurnCostFn;
102
+ estimateSessionCost?: EstimateCostFn;
103
103
  /** Process-level OTel collector; observe-only, never fatal. */
104
104
  otel?: OtelCollector;
105
105
  /** Process-level meter for {@link HostContext.otel}. Absent → no-op counters. */
@@ -254,11 +254,11 @@ export declare class SessionEngine {
254
254
  /** Lazily resolved Cursor credential for managed cloud tools. */
255
255
  private cloudServerToolsHeaders;
256
256
  private readonly getCloudUsage;
257
- private readonly estimateTurnCost;
258
- /** Sessions whose completed turns are fully priced (no further backfill). */
259
- private readonly cloudCostBackfillDone;
260
- /** Deduped in-flight cloud cost backfills, keyed by session id. */
261
- private readonly cloudCostBackfill;
257
+ private readonly estimateSessionCost;
258
+ /** Sessions whose completed turns all carry usage (no further backfill). */
259
+ private readonly cloudUsageBackfillDone;
260
+ /** Deduped in-flight cloud usage backfills, keyed by session id. */
261
+ private readonly cloudUsageBackfill;
262
262
  /** Per-session FileSystem handle cache (not a tree snapshot). */
263
263
  private readonly sessionRoots;
264
264
  /** In-flight factory resolves, so the first turn and a racing callTool share one handle. */
@@ -364,6 +364,7 @@ export declare class SessionEngine {
364
364
  * up `(agentId, cKey)` from a mailbox stamp or structured claim.
365
365
  */
366
366
  send(channelId: string, message: string, options?: EngineSendOptions): Promise<ChannelSession>;
367
+ private rejectMismatchedModelConfig;
367
368
  /**
368
369
  * Atomically validate and rotate an HTTP follow-up credential, then admit
369
370
  * the message to its exact session without changing the owning channel key.
@@ -371,7 +372,7 @@ export declare class SessionEngine {
371
372
  followUpHttp(sessionId: string, token: {
372
373
  channelId: string;
373
374
  key: string;
374
- }, message: string): Promise<string | undefined>;
375
+ }, message: string, modelConfig?: unknown): Promise<string | undefined>;
375
376
  /** Whether a continuation token already maps to a session on this channel. */
376
377
  hasContinuationSession(channelId: string, continuationToken: string): Promise<boolean>;
377
378
  /** Look up a session as a channel-scoped handle. */
@@ -515,6 +516,7 @@ export declare class SessionEngine {
515
516
  * durable state directory instead.
516
517
  */
517
518
  private cloudStore;
519
+ private turnModel;
518
520
  private buildTurnRequest;
519
521
  /**
520
522
  * Connection names a cloud turn can only reach through the host connection
@@ -827,40 +829,22 @@ export declare class SessionEngine {
827
829
  /** Append a hosted eval case's verdict to its session log, after its last turn. */
828
830
  recordEvalCaseResult(sessionId: string, data: EvalCaseResultEventData): Promise<void>;
829
831
  /**
830
- * Cost is a display figure resolved over the network, and the session holds
831
- * its delivery lease until `turn.completed`, so it is stamped onto the
832
- * recorded event afterwards rather than delaying the event. A host that
833
- * stops before the estimate lands leaves the turn unpriced; `sessionCost`
834
- * prices the session on read.
832
+ * Billed/catalog cost of the whole session, priced once per call. Powers
833
+ * the playground, `bdk run`, and `bdk cost` via `GET /v1/session/:id/cost`.
834
+ * The billed lookup is expensive, so nothing on the turn path calls this.
835
835
  */
836
- private stampTurnCost;
837
- private priceTurn;
838
- /**
839
- * Billed/catalog cost for a session. Powers playground, traces, and
840
- * `agent-sdk cost` via `GET /v1/session/:id/cost`.
841
- */
842
- sessionCost(sessionId: string): Promise<{
843
- sessionId: string;
844
- source: "usage" | "catalog" | "unavailable";
845
- cost: {
846
- rawCostCents: number;
847
- chargedCents: number;
848
- };
849
- costUsd: number;
850
- rawCostUsd: number;
851
- model?: string;
852
- }>;
836
+ sessionCost(sessionId: string): Promise<SessionCost>;
853
837
  /** Snapshot of recorded events (for download / offline trace). */
854
838
  listEvents(sessionId: string, startIndex?: number, options?: {
855
- backfillCloudCost?: boolean;
839
+ backfillCloudUsage?: boolean;
856
840
  }): Promise<SessionEvent[]>;
857
841
  /**
858
- * Historical cloud turns may lack usage/cost on `turn.completed` (pre-0.1.29
859
- * engines, or getUsage still zero at turn end). Fill them from billed usage
860
- * before the playground replays the stream so Trace can show cost.
842
+ * Cloud turns may lack usage on `turn.completed` (pre-0.1.29 engines, or
843
+ * getUsage still zero at turn end). Fill them from billed usage before the
844
+ * playground replays the stream so Trace can show their tokens.
861
845
  */
862
- private backfillCloudTurnCosts;
863
- private runCloudTurnCostBackfill;
846
+ private backfillCloudTurnUsage;
847
+ private runCloudTurnUsageBackfill;
864
848
  setContinuationToken(sessionId: string, token: string | null): Promise<void>;
865
849
  isTurnRunning(sessionId: string): boolean;
866
850
  sessionInfo(record: SessionRecord): SessionInfo;