@cursor/bdk 0.2.18 → 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 (213) hide show
  1. package/AGENTS.md +16 -6
  2. package/dist/channels/slack/slack-channel.d.ts +3 -2
  3. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  4. package/dist/channels/slack/slack-channel.js +9 -2
  5. package/dist/docs/404.html +2 -2
  6. package/dist/docs/assets/{app.CJ-XZTK5.js → app.BzgJFr_T.js} +4 -4
  7. package/dist/docs/assets/chunks/@localSearchIndexroot.gGwBYU3d.js +1 -0
  8. package/dist/docs/assets/chunks/{VPLocalSearchBox.CpbYgURZ.js → VPLocalSearchBox.Bn5QyUDM.js} +1 -1
  9. package/dist/docs/assets/chunks/{arc.B081PemO.js → arc.D734Gm5d.js} +1 -1
  10. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.DPaT_hi-.js → architectureDiagram-Q4EWVU46.NX1jj-YX.js} +1 -1
  11. package/dist/docs/assets/chunks/{baseUniq.Buu61NLg.js → baseUniq.nd8dxdeO.js} +1 -1
  12. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.C6t63owh.js → blockDiagram-DXYQGD6D.DG8faTim.js} +1 -1
  13. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BtKabdXR.js → c4Diagram-AHTNJAMY.zD31AJ3b.js} +1 -1
  14. package/dist/docs/assets/chunks/channel.DQLJQMi3.js +1 -0
  15. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DQpNaR8N.js → chunk-4BX2VUAB.BHQj6Rko.js} +1 -1
  16. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DrhL-6Rv.js → chunk-4TB4RGXK.Cs38Yh16.js} +1 -1
  17. package/dist/docs/assets/chunks/{chunk-55IACEB6.DRLIBfNR.js → chunk-55IACEB6.CFUR21JO.js} +1 -1
  18. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.kuUuFkIg.js → chunk-EDXVE4YY.C80-Sneg.js} +1 -1
  19. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BlrVxprw.js → chunk-FMBD7UC4.CdT1MGza.js} +1 -1
  20. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CZCfYeQA.js → chunk-OYMX7WX6.BctEzab0.js} +1 -1
  21. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.C7rwVEMV.js → chunk-QZHKN3VN.DTneeX3k.js} +1 -1
  22. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CGseJtT_.js → chunk-YZCP3GAM.Cz47F_-o.js} +1 -1
  23. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.j55aerUT.js +1 -0
  24. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.j55aerUT.js +1 -0
  25. package/dist/docs/assets/chunks/clone.XimRS84I.js +1 -0
  26. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BWlczAK4.js → cose-bilkent-S5V4N54A.BPYgB-_O.js} +1 -1
  27. package/dist/docs/assets/chunks/{dagre-KV5264BT.Cw0tT0bB.js → dagre-KV5264BT.Cu6hECod.js} +1 -1
  28. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.Cm96ah9V.js → diagram-5BDNPKRD.BMgp95Tz.js} +1 -1
  29. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Cl0AoWYM.js → diagram-G4DWMVQ6.towWdhDi.js} +1 -1
  30. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.Bp7mlzKs.js → diagram-MMDJMWI5.D9IfOvE9.js} +1 -1
  31. package/dist/docs/assets/chunks/{diagram-TYMM5635.ClVeqpcW.js → diagram-TYMM5635.NTX57RPu.js} +1 -1
  32. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.Bi8dojF9.js → erDiagram-SMLLAGMA.DIQLqDqu.js} +1 -1
  33. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.Bb4urpfG.js → flowDiagram-DWJPFMVM.DhqpItRe.js} +1 -1
  34. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.whR4wFze.js → ganttDiagram-T4ZO3ILL.B998R3Ps.js} +1 -1
  35. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.6oVMi6-3.js → gitGraphDiagram-UUTBAWPF.B45nTn8-.js} +1 -1
  36. package/dist/docs/assets/chunks/{graph.D8AJDOFK.js → graph.DPseWzzM.js} +1 -1
  37. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.nTpsf5Vk.js → infoDiagram-42DDH7IO._GhhBBai.js} +1 -1
  38. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DhYDOwyB.js → ishikawaDiagram-UXIWVN3A.CTUMcaMM.js} +1 -1
  39. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.Bg7Rudw3.js → journeyDiagram-VCZTEJTY.DkJBUddC.js} +1 -1
  40. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.D80D_ZAR.js → kanban-definition-6JOO6SKY.B5Q3uwhy.js} +1 -1
  41. package/dist/docs/assets/chunks/{layout.e9hmuC-K.js → layout.CDY13IKh.js} +1 -1
  42. package/dist/docs/assets/chunks/{linear.D6hEyqVB.js → linear.BPd1ql9p.js} +1 -1
  43. package/dist/docs/assets/chunks/{min.BPAdvB9D.js → min.dlGuqIBP.js} +1 -1
  44. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.tm2Sov2Q.js → mindmap-definition-QFDTVHPH.Cp7zCtmb.js} +1 -1
  45. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.BKHZ497m.js → pieDiagram-DEJITSTG.CRH034nu.js} +1 -1
  46. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CPj7gSp6.js → quadrantDiagram-34T5L4WZ.BspgZ-pX.js} +1 -1
  47. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E._U68yVUd.js → requirementDiagram-MS252O5E.CQZqZ0nZ.js} +1 -1
  48. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6._6jrIQPb.js → sankeyDiagram-XADWPNL6.DllwFU3k.js} +1 -1
  49. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.D9UlmB6F.js → sequenceDiagram-FGHM5R23.B5fTXycf.js} +1 -1
  50. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BQSaiJCe.js → stateDiagram-FHFEXIEX.12GQjmbD.js} +1 -1
  51. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.Ctv5WEMu.js +1 -0
  52. package/dist/docs/assets/chunks/{theme.25ZC61Iy.js → theme.BgocqONV.js} +2 -2
  53. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.d-17NZ3L.js → timeline-definition-GMOUNBTQ.DXKUL5rH.js} +1 -1
  54. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.DE9AGEjG.js → vennDiagram-DHZGUBPP.BrsjYCjp.js} +1 -1
  55. package/dist/docs/assets/chunks/{wardley-RL74JXVD.BcY0KddE.js → wardley-RL74JXVD.DZDndEXQ.js} +1 -1
  56. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9SDNipV.js → wardleyDiagram-NUSXRM2D.C4oM69gv.js} +1 -1
  57. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.DM1sIMf8.js → xychartDiagram-5P7HB3ND.qzHH9efW.js} +1 -1
  58. package/dist/docs/assets/{deployment.md.ajc3VM0m.js → deployment.md.D0uprX2p.js} +3 -3
  59. package/dist/docs/assets/{deployment.md.ajc3VM0m.lean.js → deployment.md.D0uprX2p.lean.js} +1 -1
  60. package/dist/docs/assets/{guides_agent-to-agent.md.Cps5NiCV.js → guides_agent-to-agent.md.CwL5cwuE.js} +6 -5
  61. package/dist/docs/assets/{guides_agent-to-agent.md.Cps5NiCV.lean.js → guides_agent-to-agent.md.CwL5cwuE.lean.js} +1 -1
  62. package/dist/docs/assets/guides_export-grokbot.md.qo5bxi4h.js +55 -0
  63. package/dist/docs/assets/guides_export-grokbot.md.qo5bxi4h.lean.js +1 -0
  64. package/dist/docs/assets/{guides_opentelemetry.md.jcPNrQbH.js → guides_opentelemetry.md.BHPm32OR.js} +3 -3
  65. package/dist/docs/assets/{guides_opentelemetry.md.jcPNrQbH.lean.js → guides_opentelemetry.md.BHPm32OR.lean.js} +1 -1
  66. package/dist/docs/assets/{index.md.CHAFTf6m.js → index.md.CAnsLl8D.js} +2 -2
  67. package/dist/docs/assets/{index.md.CHAFTf6m.lean.js → index.md.CAnsLl8D.lean.js} +1 -1
  68. package/dist/docs/assets/{reference_cli.md.Bt3sAfat.js → reference_cli.md.Bkrsce22.js} +7 -4
  69. package/dist/docs/assets/{reference_cli.md.Bt3sAfat.lean.js → reference_cli.md.Bkrsce22.lean.js} +1 -1
  70. package/dist/docs/assets/{reference_connections.md.CxbLpaaP.js → reference_connections.md.BJE2Zllp.js} +4 -4
  71. package/dist/docs/assets/{reference_connections.md.CxbLpaaP.lean.js → reference_connections.md.BJE2Zllp.lean.js} +1 -1
  72. package/dist/docs/assets/{reference_hooks.md.DbJC8mcZ.js → reference_hooks.md.CP3FENFJ.js} +1 -1
  73. package/dist/docs/assets/reference_memory.md.BwyJXYZe.js +4 -0
  74. package/dist/docs/assets/reference_memory.md.BwyJXYZe.lean.js +1 -0
  75. package/dist/docs/assets/{reference_skills.md.Ckddg6KX.js → reference_skills.md.C2GWh7g8.js} +3 -3
  76. package/dist/docs/building-with-agents.html +35 -35
  77. package/dist/docs/deployment.html +38 -38
  78. package/dist/docs/deployment.md +17 -0
  79. package/dist/docs/evals.html +35 -35
  80. package/dist/docs/guides/agent-to-agent.html +41 -40
  81. package/dist/docs/guides/agent-to-agent.md +34 -21
  82. package/dist/docs/guides/bitbucket.html +35 -35
  83. package/dist/docs/guides/cloud-agents.html +35 -35
  84. package/dist/docs/guides/convert-automation.html +35 -35
  85. package/dist/docs/guides/export-grokbot.html +114 -0
  86. package/dist/docs/guides/export-grokbot.md +239 -0
  87. package/dist/docs/guides/github.html +35 -35
  88. package/dist/docs/guides/gitlab.html +35 -35
  89. package/dist/docs/guides/grokbot-agents.html +35 -35
  90. package/dist/docs/guides/hooks.html +35 -35
  91. package/dist/docs/guides/improve.html +35 -35
  92. package/dist/docs/guides/jev.html +35 -35
  93. package/dist/docs/guides/mcp-oauth.html +35 -35
  94. package/dist/docs/guides/migrate.html +36 -36
  95. package/dist/docs/guides/opentelemetry.html +37 -37
  96. package/dist/docs/guides/opentelemetry.md +19 -0
  97. package/dist/docs/guides/slack.html +35 -35
  98. package/dist/docs/guides/webhooks.html +35 -35
  99. package/dist/docs/hashmap.json +1 -1
  100. package/dist/docs/hillclimbing.html +35 -35
  101. package/dist/docs/index.html +37 -37
  102. package/dist/docs/index.md +3 -0
  103. package/dist/docs/llms-full.txt +493 -29
  104. package/dist/docs/llms.txt +2 -0
  105. package/dist/docs/quickstart.html +35 -35
  106. package/dist/docs/reference/agent-config.html +35 -35
  107. package/dist/docs/reference/artifacts.html +35 -35
  108. package/dist/docs/reference/channels.html +35 -35
  109. package/dist/docs/reference/cli.html +41 -38
  110. package/dist/docs/reference/cli.md +39 -1
  111. package/dist/docs/reference/connections.html +38 -38
  112. package/dist/docs/reference/connections.md +16 -6
  113. package/dist/docs/reference/evals.html +36 -36
  114. package/dist/docs/reference/extensions.html +35 -35
  115. package/dist/docs/reference/hooks.html +38 -38
  116. package/dist/docs/reference/hooks.md +2 -1
  117. package/dist/docs/reference/http-api.html +35 -35
  118. package/dist/docs/reference/instructions.html +35 -35
  119. package/dist/docs/reference/memory.html +63 -0
  120. package/dist/docs/reference/memory.md +114 -0
  121. package/dist/docs/reference/playground.html +35 -35
  122. package/dist/docs/reference/project-layout.html +35 -35
  123. package/dist/docs/reference/prompt.html +35 -35
  124. package/dist/docs/reference/schedules.html +35 -35
  125. package/dist/docs/reference/sessions.html +35 -35
  126. package/dist/docs/reference/skills.html +38 -38
  127. package/dist/docs/reference/subagents.html +35 -35
  128. package/dist/docs/reference/tools.html +35 -35
  129. package/dist/docs/templates/agentic-owners.html +35 -35
  130. package/dist/docs/templates/grokbot-agents.html +35 -35
  131. package/dist/docs/templates/security-reviewer.html +35 -35
  132. package/dist/docs/templates/thermo-quality-review.html +35 -35
  133. package/dist/docs/templates/thermo-review.html +35 -35
  134. package/dist/docs/templates/triage.html +35 -35
  135. package/dist/docs/troubleshooting.html +35 -35
  136. package/dist/evals.d.ts +1 -1
  137. package/dist/evals.js +1 -1
  138. package/dist/extensions/cursor-cloud-agents/extension.d.ts +2 -2
  139. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  140. package/dist/extensions/cursor-cloud-agents/extension.js +1 -1
  141. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts +8 -1
  142. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts.map +1 -1
  143. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.js +10 -1
  144. package/dist/internal/cli-ax.d.ts +7 -7
  145. package/dist/internal/cli-ax.d.ts.map +1 -1
  146. package/dist/internal/cli-ax.js +36 -15
  147. package/dist/internal/cloud-turn-usage.d.ts +34 -0
  148. package/dist/internal/cloud-turn-usage.d.ts.map +1 -0
  149. package/dist/internal/cloud-turn-usage.js +94 -0
  150. package/dist/internal/estimate-cost.d.ts +55 -0
  151. package/dist/internal/estimate-cost.d.ts.map +1 -0
  152. package/dist/internal/{turn-cost.js → estimate-cost.js} +15 -23
  153. package/dist/internal/event-log.d.ts +2 -2
  154. package/dist/internal/event-log.js +2 -2
  155. package/dist/internal/http-channel.js +1 -1
  156. package/dist/internal/init-scaffold.d.ts.map +1 -1
  157. package/dist/internal/init-scaffold.js +3 -4
  158. package/dist/internal/otel/collector.d.ts +3 -3
  159. package/dist/internal/otel/collector.d.ts.map +1 -1
  160. package/dist/internal/otel/collector.js +8 -21
  161. package/dist/internal/otel/computer-use-attrs.d.ts +13 -0
  162. package/dist/internal/otel/computer-use-attrs.d.ts.map +1 -0
  163. package/dist/internal/otel/computer-use-attrs.js +29 -0
  164. package/dist/internal/sdk-runner.d.ts.map +1 -1
  165. package/dist/internal/sdk-runner.js +5 -13
  166. package/dist/internal/session-cost.d.ts +21 -22
  167. package/dist/internal/session-cost.d.ts.map +1 -1
  168. package/dist/internal/session-cost.js +38 -46
  169. package/dist/internal/session-engine.d.ts +22 -40
  170. package/dist/internal/session-engine.d.ts.map +1 -1
  171. package/dist/internal/session-engine.js +62 -109
  172. package/dist/internal/sessions-client.d.ts +13 -1
  173. package/dist/internal/sessions-client.d.ts.map +1 -1
  174. package/dist/internal/sessions-client.js +24 -0
  175. package/dist/internal/trajectory.d.ts +5 -6
  176. package/dist/internal/trajectory.d.ts.map +1 -1
  177. package/dist/internal/trajectory.js +1 -13
  178. package/dist/memory.d.ts +5 -2
  179. package/dist/memory.d.ts.map +1 -1
  180. package/dist/memory.js +1 -1
  181. package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
  182. package/dist/playground/assets/index-C77_FdOx.css +1 -0
  183. package/dist/playground/assets/index-CvzI2lhj.js +71 -0
  184. package/dist/playground/index.html +2 -2
  185. package/dist/types.d.ts +17 -26
  186. package/dist/types.d.ts.map +1 -1
  187. package/docs/README.md +3 -0
  188. package/docs/deployment.md +17 -0
  189. package/docs/guides/agent-to-agent.md +34 -21
  190. package/docs/guides/export-grokbot.md +244 -0
  191. package/docs/guides/opentelemetry.md +19 -0
  192. package/docs/reference/cli.md +39 -1
  193. package/docs/reference/connections.md +16 -6
  194. package/docs/reference/hooks.md +2 -1
  195. package/docs/reference/memory.md +119 -0
  196. package/package.json +4 -3
  197. package/templates/agentic-owners/bot/lib/owners/matching.ts +57 -2
  198. package/dist/docs/assets/chunks/@localSearchIndexroot.ylB4B_Ud.js +0 -1
  199. package/dist/docs/assets/chunks/channel.BgjgeSqp.js +0 -1
  200. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CIVv63wE.js +0 -1
  201. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CIVv63wE.js +0 -1
  202. package/dist/docs/assets/chunks/clone.HcW7h-70.js +0 -1
  203. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.B5d7jT7E.js +0 -1
  204. package/dist/internal/cloud-turn-cost.d.ts +0 -42
  205. package/dist/internal/cloud-turn-cost.d.ts.map +0 -1
  206. package/dist/internal/cloud-turn-cost.js +0 -120
  207. package/dist/internal/turn-cost.d.ts +0 -41
  208. package/dist/internal/turn-cost.d.ts.map +0 -1
  209. package/dist/playground/assets/cursor-icons-16-DBmD_cqy.woff2 +0 -0
  210. package/dist/playground/assets/index-BDPd0Sec.css +0 -1
  211. package/dist/playground/assets/index-BrXDwbrN.js +0 -71
  212. /package/dist/docs/assets/{reference_hooks.md.DbJC8mcZ.lean.js → reference_hooks.md.CP3FENFJ.lean.js} +0 -0
  213. /package/dist/docs/assets/{reference_skills.md.Ckddg6KX.lean.js → reference_skills.md.C2GWh7g8.lean.js} +0 -0
@@ -26,7 +26,7 @@ import { assertTimeArgs, normalizeAsOf, schemaTimeWindowKeys, sessionClock } fro
26
26
  import { SessionAuthError, samePrincipal } from "./auth.js";
27
27
  import { mergeChannelStateMutation, mergeChannelStateSkipNull } from "./channel-state.js";
28
28
  import { mergeCloudOptions, resolveSessionRuntime } from "./cloud-merge.js";
29
- import { applyCloudUsageToEvents, cloudSdkAgentIdFromEvents, isUnpricedCompletedTurn, mapSdkTokenUsage, } from "./cloud-turn-cost.js";
29
+ import { applyCloudUsageToEvents, cloudSdkAgentIdFromEvents, isUsageMissingCompletedTurn, mapSdkTokenUsage, } from "./cloud-turn-usage.js";
30
30
  import { resolveConnectionEnvTemplates } from "./connection-env.js";
31
31
  import { applyAgentContinuationDefaults, channelContinuationIdentity, httpContinuationIdentity, } from "./continuation-channel.js";
32
32
  import { continuationSource, isOneShotContinuationKey, resolveV2Key, V2EngineError, } from "./continuation-identity.js";
@@ -61,7 +61,7 @@ import { StorageCoordinator, isTurnBoundaryEvent } from "./storage-coordinator.j
61
61
  import { decideToolCall, directCallEffect } from "./tool-policy.js";
62
62
  import { retryReadOnlyToolCall } from "./tool-call-retry.js";
63
63
  import { normalizeToolResult, toolCallErrorMessage } from "./tool-result.js";
64
- import { estimateTurnCostFromApi, roundCostUsd, } from "./turn-cost.js";
64
+ import { estimateCostFromApi, roundCostUsd } from "./estimate-cost.js";
65
65
  import { TurnGovernor } from "./turn-governor.js";
66
66
  import { TurnLeaseStore } from "./turn-lease-store.js";
67
67
  import { TurnOutbox } from "./turn-outbox.js";
@@ -250,10 +250,10 @@ export class SessionEngine {
250
250
  this.oauthHub = new McpOauthOnDemandHub();
251
251
  /** Serve-time resolved connections (see {@link setResolvedConnections}). */
252
252
  this.resolvedConnections = [];
253
- /** Sessions whose completed turns are fully priced (no further backfill). */
254
- this.cloudCostBackfillDone = new Set();
255
- /** Deduped in-flight cloud cost backfills, keyed by session id. */
256
- this.cloudCostBackfill = new Map();
253
+ /** Sessions whose completed turns all carry usage (no further backfill). */
254
+ this.cloudUsageBackfillDone = new Set();
255
+ /** Deduped in-flight cloud usage backfills, keyed by session id. */
256
+ this.cloudUsageBackfill = new Map();
257
257
  /** Per-session FileSystem handle cache (not a tree snapshot). */
258
258
  this.sessionRoots = new Map();
259
259
  /** In-flight factory resolves, so the first turn and a racing callTool share one handle. */
@@ -266,7 +266,7 @@ export class SessionEngine {
266
266
  this.runner = options.runner;
267
267
  this.logger = options.logger ?? (() => { });
268
268
  this.getCloudUsage = options.getCloudUsage ?? defaultGetCloudUsage;
269
- this.estimateTurnCost = options.estimateTurnCost ?? estimateTurnCostFromApi;
269
+ this.estimateSessionCost = options.estimateSessionCost ?? estimateCostFromApi;
270
270
  this.otel = options.otel;
271
271
  this.otelHost = createHostOtelApi({
272
272
  agentName: options.project.name,
@@ -1840,7 +1840,7 @@ export class SessionEngine {
1840
1840
  const finalUsage = outcome.usage ?? mapper.usage;
1841
1841
  const preBoundaryDispatch = this.dispatchChains.get(sessionId);
1842
1842
  if (outcome.status === "finished") {
1843
- const completed = await this.appendEvent(sessionId, {
1843
+ await this.appendEvent(sessionId, {
1844
1844
  type: "turn.completed",
1845
1845
  turnId,
1846
1846
  data: {
@@ -1848,15 +1848,6 @@ export class SessionEngine {
1848
1848
  usage: finalUsage,
1849
1849
  },
1850
1850
  }, eventContext);
1851
- if (finalUsage !== undefined) {
1852
- this.stampTurnCost(sessionId, completed, {
1853
- model: this.turnModel(record).model ?? DEFAULT_MODEL,
1854
- usage: finalUsage,
1855
- agentId: record.sdkAgentId,
1856
- conversationId: record.sdkAgentId ?? sessionId,
1857
- runId: outcome.runId,
1858
- });
1859
- }
1860
1851
  }
1861
1852
  else {
1862
1853
  const interrupted = signal.aborted && outcome.status === "cancelled";
@@ -4011,8 +4002,8 @@ export class SessionEngine {
4011
4002
  }
4012
4003
  async eventStream(sessionId, startIndex = 0) {
4013
4004
  // Playground Trace replays this stream; backfill before the snapshot
4014
- // so historical Sherlock-style cloud turns can show billed cost.
4015
- await this.backfillCloudTurnCosts(sessionId);
4005
+ // so cloud turns that lost their streamed usage still show tokens.
4006
+ await this.backfillCloudTurnUsage(sessionId);
4016
4007
  const log = await this.logs.get(sessionId);
4017
4008
  return log.stream(startIndex);
4018
4009
  }
@@ -4063,133 +4054,82 @@ export class SessionEngine {
4063
4054
  await this.appendEvent(sessionId, { type: "eval.case.result", data });
4064
4055
  }
4065
4056
  /**
4066
- * Cost is a display figure resolved over the network, and the session holds
4067
- * its delivery lease until `turn.completed`, so it is stamped onto the
4068
- * recorded event afterwards rather than delaying the event. A host that
4069
- * stops before the estimate lands leaves the turn unpriced; `sessionCost`
4070
- * prices the session on read.
4071
- */
4072
- stampTurnCost(sessionId, completed, input) {
4073
- void this.priceTurn(input)
4074
- .then(async (cost) => {
4075
- if (cost === undefined || completed.type !== "turn.completed") {
4076
- return;
4077
- }
4078
- // Same object the turn.completed hook is waiting on.
4079
- completed.data = { ...completed.data, cost };
4080
- const log = await this.logs.get(sessionId);
4081
- log.replace(completed.index, completed);
4082
- })
4083
- .catch((error) => {
4084
- this.logger(`[bdk] turn cost stamp failed for ${sessionId}: ${describeError(error)}`);
4085
- });
4086
- }
4087
- async priceTurn(input) {
4088
- try {
4089
- return await this.estimateTurnCost(input);
4090
- }
4091
- catch (error) {
4092
- this.logger(`[bdk] turn cost estimate failed: ${describeError(error)}`);
4093
- return undefined;
4094
- }
4095
- }
4096
- /**
4097
- * Billed/catalog cost for a session. Powers playground, traces, and
4098
- * `agent-sdk cost` via `GET /v1/session/:id/cost`.
4057
+ * Billed/catalog cost of the whole session, priced once per call. Powers
4058
+ * the playground, `bdk run`, and `bdk cost` via `GET /v1/session/:id/cost`.
4059
+ * The billed lookup is expensive, so nothing on the turn path calls this.
4099
4060
  */
4100
4061
  async sessionCost(sessionId) {
4101
4062
  const record = await this.getOrRestoreSession(sessionId);
4102
4063
  if (record === undefined) {
4103
4064
  throw new Error(`Unknown session: ${sessionId}`);
4104
4065
  }
4105
- await this.backfillCloudTurnCosts(sessionId);
4066
+ await this.backfillCloudTurnUsage(sessionId);
4106
4067
  const events = await this.listEvents(sessionId);
4107
4068
  const sdkAgentId = (record.sdkAgentId !== undefined && record.sdkAgentId !== ""
4108
4069
  ? record.sdkAgentId
4109
4070
  : undefined) ?? cloudSdkAgentIdFromEvents(events);
4110
- const model = this.turnModel(record).model ?? DEFAULT_MODEL;
4111
- const priced = await this.estimateTurnCost({
4112
- model,
4071
+ const priced = await this.estimateSessionCost({
4072
+ model: this.turnModel(record).model ?? DEFAULT_MODEL,
4073
+ usage: sumSessionUsage(events),
4113
4074
  agentId: sdkAgentId,
4114
4075
  conversationId: sdkAgentId ?? sessionId,
4115
4076
  });
4116
- if (priced !== undefined && (priced.source === "usage" || priced.totalUsd > 0)) {
4077
+ if (priced === undefined || (priced.source !== "usage" && priced.totalUsd <= 0)) {
4117
4078
  return {
4118
4079
  sessionId,
4119
- source: priced.source,
4120
- cost: {
4121
- rawCostCents: priced.rawCostCents ?? priced.chargedCents ?? 0,
4122
- chargedCents: priced.chargedCents ?? priced.totalUsd * 100,
4123
- },
4124
- costUsd: priced.totalUsd,
4125
- rawCostUsd: roundCostUsd((priced.rawCostCents ?? priced.chargedCents ?? priced.totalUsd * 100) / 100),
4126
- model: priced.model,
4080
+ source: "unavailable",
4081
+ cost: { rawCostCents: 0, chargedCents: 0 },
4082
+ costUsd: 0,
4083
+ rawCostUsd: 0,
4127
4084
  };
4128
4085
  }
4129
- let costUsd = 0;
4130
- let rawCostUsd = 0;
4131
- let source = "unavailable";
4132
- let modelId;
4133
- for (const event of events) {
4134
- if (event.type !== "turn.completed" || event.data.cost === undefined) {
4135
- continue;
4136
- }
4137
- costUsd = roundCostUsd(costUsd + event.data.cost.totalUsd);
4138
- const rawCents = event.data.cost.rawCostCents;
4139
- rawCostUsd = roundCostUsd(rawCostUsd + (rawCents !== undefined ? rawCents / 100 : event.data.cost.totalUsd));
4140
- source = event.data.cost.source;
4141
- modelId = event.data.cost.model;
4142
- }
4143
4086
  return {
4144
4087
  sessionId,
4145
- source,
4146
- cost: {
4147
- rawCostCents: rawCostUsd * 100,
4148
- chargedCents: costUsd * 100,
4149
- },
4150
- costUsd,
4151
- rawCostUsd,
4152
- model: modelId,
4088
+ source: priced.source,
4089
+ cost: { rawCostCents: priced.rawCostCents, chargedCents: priced.chargedCents },
4090
+ costUsd: priced.totalUsd,
4091
+ rawCostUsd: roundCostUsd(priced.rawCostCents / 100),
4092
+ model: priced.model,
4153
4093
  };
4154
4094
  }
4155
4095
  /** Snapshot of recorded events (for download / offline trace). */
4156
4096
  async listEvents(sessionId, startIndex = 0, options) {
4157
- if (options?.backfillCloudCost === true) {
4158
- await this.backfillCloudTurnCosts(sessionId);
4097
+ if (options?.backfillCloudUsage === true) {
4098
+ await this.backfillCloudTurnUsage(sessionId);
4159
4099
  }
4160
4100
  const log = await this.logs.get(sessionId);
4161
4101
  return log.snapshot(startIndex);
4162
4102
  }
4163
4103
  /**
4164
- * Historical cloud turns may lack usage/cost on `turn.completed` (pre-0.1.29
4165
- * engines, or getUsage still zero at turn end). Fill them from billed usage
4166
- * before the playground replays the stream so Trace can show cost.
4104
+ * Cloud turns may lack usage on `turn.completed` (pre-0.1.29 engines, or
4105
+ * getUsage still zero at turn end). Fill them from billed usage before the
4106
+ * playground replays the stream so Trace can show their tokens.
4167
4107
  */
4168
- backfillCloudTurnCosts(sessionId) {
4169
- if (this.cloudCostBackfillDone.has(sessionId)) {
4108
+ backfillCloudTurnUsage(sessionId) {
4109
+ if (this.cloudUsageBackfillDone.has(sessionId)) {
4170
4110
  return Promise.resolve();
4171
4111
  }
4172
- const pending = this.cloudCostBackfill.get(sessionId);
4112
+ const pending = this.cloudUsageBackfill.get(sessionId);
4173
4113
  if (pending !== undefined) {
4174
4114
  return pending;
4175
4115
  }
4176
- const work = this.runCloudTurnCostBackfill(sessionId)
4116
+ const work = this.runCloudTurnUsageBackfill(sessionId)
4177
4117
  .catch((error) => {
4178
- this.logger(`[bdk] cloud cost backfill failed for ${sessionId}: ${describeError(error)}`);
4118
+ this.logger(`[bdk] cloud usage backfill failed for ${sessionId}: ${describeError(error)}`);
4179
4119
  })
4180
4120
  .finally(() => {
4181
- this.cloudCostBackfill.delete(sessionId);
4121
+ this.cloudUsageBackfill.delete(sessionId);
4182
4122
  });
4183
- this.cloudCostBackfill.set(sessionId, work);
4123
+ this.cloudUsageBackfill.set(sessionId, work);
4184
4124
  return work;
4185
4125
  }
4186
- async runCloudTurnCostBackfill(sessionId) {
4126
+ async runCloudTurnUsageBackfill(sessionId) {
4187
4127
  const log = await this.logs.get(sessionId);
4188
4128
  const events = await log.snapshot(0);
4189
- if (!events.some((event) => isUnpricedCompletedTurn(event))) {
4129
+ if (!events.some((event) => isUsageMissingCompletedTurn(event))) {
4190
4130
  if (!this.isTurnRunning(sessionId) &&
4191
4131
  events.some((event) => event.type === "turn.completed")) {
4192
- this.cloudCostBackfillDone.add(sessionId);
4132
+ this.cloudUsageBackfillDone.add(sessionId);
4193
4133
  }
4194
4134
  return;
4195
4135
  }
@@ -4203,8 +4143,7 @@ export class SessionEngine {
4203
4143
  if (billed === undefined) {
4204
4144
  return;
4205
4145
  }
4206
- const model = this.turnModel(record).model ?? DEFAULT_MODEL;
4207
- const patched = applyCloudUsageToEvents(events, billed, model);
4146
+ const patched = applyCloudUsageToEvents(events, billed);
4208
4147
  if (patched === undefined) {
4209
4148
  return;
4210
4149
  }
@@ -4216,8 +4155,8 @@ export class SessionEngine {
4216
4155
  }
4217
4156
  log.replace(i, next);
4218
4157
  }
4219
- if (!(await log.snapshot(0)).some((event) => isUnpricedCompletedTurn(event))) {
4220
- this.cloudCostBackfillDone.add(sessionId);
4158
+ if (!(await log.snapshot(0)).some((event) => isUsageMissingCompletedTurn(event))) {
4159
+ this.cloudUsageBackfillDone.add(sessionId);
4221
4160
  }
4222
4161
  }
4223
4162
  async setContinuationToken(sessionId, token) {
@@ -4495,7 +4434,7 @@ export class SessionEngine {
4495
4434
  // storage coordinator skips volatile-only record rewrites, bounded).
4496
4435
  // New turnIds mint from turnCount, so clamp it to the highest turn the
4497
4436
  // stream already used; otherwise a replacement process re-mints turn_N ids
4498
- // and trajectory/cost grouping merges unrelated turns.
4437
+ // and trajectory/usage grouping merges unrelated turns.
4499
4438
  const restored = withTurnCountClampedToEvents(record, events);
4500
4439
  await this.materializeSession(restored, eventsNdjson(events));
4501
4440
  this.logger(`[bdk] lazily restored session ${restored.sessionId} from storage`);
@@ -4645,17 +4584,31 @@ function toolErrorResult(message) {
4645
4584
  isError: true,
4646
4585
  };
4647
4586
  }
4587
+ /** Token usage summed over every completed turn; undefined when no turn reported any. */
4588
+ function sumSessionUsage(events) {
4589
+ let total;
4590
+ for (const event of events) {
4591
+ if (event.type !== "turn.completed" || event.data.usage === undefined) {
4592
+ continue;
4593
+ }
4594
+ const usage = event.data.usage;
4595
+ total ??= { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };
4596
+ total.inputTokens += usage.inputTokens;
4597
+ total.outputTokens += usage.outputTokens;
4598
+ total.cacheReadTokens += usage.cacheReadTokens;
4599
+ total.cacheWriteTokens += usage.cacheWriteTokens;
4600
+ }
4601
+ return total;
4602
+ }
4648
4603
  async function defaultGetCloudUsage(sdkAgentId) {
4649
4604
  try {
4650
4605
  const { Agent } = await import("@cursor/sdk");
4651
4606
  const billed = await Agent.getUsage(sdkAgentId);
4652
4607
  return {
4653
4608
  usage: mapSdkTokenUsage(billed.usage),
4654
- cost: billed.cost,
4655
4609
  runs: billed.runs.map((run) => ({
4656
4610
  runId: run.runId,
4657
4611
  usage: mapSdkTokenUsage(run.usage),
4658
- cost: run.cost,
4659
4612
  })),
4660
4613
  };
4661
4614
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Customer-facing errors never include hosting URLs or infra jargon.
5
5
  */
6
- import type { SessionEvent, SessionListSource, SessionSummary } from "../types.js";
6
+ import type { SessionCost, SessionEvent, SessionListSource, SessionSummary } from "../types.js";
7
7
  import { type RequestAuth } from "./request-headers.js";
8
8
  export interface ListedSessions {
9
9
  sessions: SessionSummary[];
@@ -29,6 +29,18 @@ export declare function fetchSessionEvents(args: {
29
29
  fetchImpl?: typeof fetch;
30
30
  signal?: AbortSignal;
31
31
  }): Promise<SessionEvent[]>;
32
+ /**
33
+ * Whole-session cost from `GET /v1/session/:id/cost`. Undefined when the
34
+ * server cannot price the session or does not serve the route, so callers
35
+ * can treat cost as optional.
36
+ */
37
+ export declare function fetchSessionCost(args: {
38
+ baseUrl: string;
39
+ sessionId: string;
40
+ auth?: RequestAuth;
41
+ fetchImpl?: typeof fetch;
42
+ signal?: AbortSignal;
43
+ }): Promise<SessionCost | undefined>;
32
44
  /**
33
45
  * Pick the previous (most recently updated) followable session for
34
46
  * `resume` / `chat --resume` when no session id was passed.
@@ -1 +1 @@
1
- {"version":3,"file":"sessions-client.d.ts","sourceRoot":"","sources":["../../src/internal/sessions-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAEpF;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8B5F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqE1B;AAkCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAClC,cAAc,GAAG,SAAS,CAQ5B;AAED,+DAA+D;AAC/D,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO9B;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAIzE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACvC,MAAM,CAgBR"}
1
+ {"version":3,"file":"sessions-client.d.ts","sourceRoot":"","sources":["../../src/internal/sessions-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhG,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAEpF;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8B5F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqE1B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAsBnC;AAkCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAClC,cAAc,GAAG,SAAS,CAQ5B;AAED,+DAA+D;AAC/D,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO9B;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAIzE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACvC,MAAM,CAgBR"}
@@ -106,6 +106,30 @@ export async function fetchSessionEvents(args) {
106
106
  throw new Error(sanitizeCustomerError(error instanceof Error ? error.message : "Could not fetch session events."));
107
107
  }
108
108
  }
109
+ /**
110
+ * Whole-session cost from `GET /v1/session/:id/cost`. Undefined when the
111
+ * server cannot price the session or does not serve the route, so callers
112
+ * can treat cost as optional.
113
+ */
114
+ export async function fetchSessionCost(args) {
115
+ const baseUrl = args.baseUrl.replace(/\/$/, "");
116
+ const fetchImpl = args.fetchImpl ?? fetch;
117
+ try {
118
+ const resp = await fetchImpl(`${baseUrl}/v1/session/${encodeURIComponent(args.sessionId)}/cost`, { headers: mergeRequestHeaders(args.auth), signal: args.signal });
119
+ if (!resp.ok) {
120
+ return undefined;
121
+ }
122
+ const body = (await resp.json());
123
+ if (typeof body.costUsd !== "number" ||
124
+ (body.source !== "usage" && body.source !== "catalog")) {
125
+ return undefined;
126
+ }
127
+ return body;
128
+ }
129
+ catch {
130
+ return undefined;
131
+ }
132
+ }
109
133
  /** Lenient parse so partial stubs / older servers still list by sessionId. */
110
134
  function parseSessionSummary(value) {
111
135
  if (typeof value !== "object" || value === null) {
@@ -5,7 +5,7 @@
5
5
  * messages, assistant text, tool calls with args/results, and
6
6
  * success/failure — not a firehose of streaming deltas.
7
7
  */
8
- import type { SessionEvent, TurnCost, TurnUsage } from "../types.js";
8
+ import type { SessionEvent, TurnUsage } from "../types.js";
9
9
  export interface TrajectoryToolCall {
10
10
  callId: string;
11
11
  toolName: string;
@@ -32,8 +32,6 @@ export interface TrajectoryTurn {
32
32
  toolCalls: TrajectoryToolCall[];
33
33
  subagents: TrajectorySubagent[];
34
34
  usage?: TurnUsage;
35
- /** Estimated dollar cost of this turn (from the `turn.completed` event). */
36
- cost?: TurnCost;
37
35
  result?: string;
38
36
  failed: boolean;
39
37
  error?: string;
@@ -47,7 +45,10 @@ export interface Trajectory {
47
45
  finalText: string;
48
46
  turnsFailed: number;
49
47
  toolCallCount: number;
50
- /** Sum of per-turn estimated costs; present when any turn reported cost. */
48
+ /**
49
+ * The session's cost from `GET /v1/session/:id/cost`, priced once after the
50
+ * last turn. Never derived from events; absent when nobody priced it.
51
+ */
51
52
  totalCostUsd?: number;
52
53
  turns: TrajectoryTurn[];
53
54
  }
@@ -56,8 +57,6 @@ export interface Trajectory {
56
57
  * folded into final assistant / reasoning text per turn.
57
58
  */
58
59
  export declare function buildTrajectory(events: SessionEvent[]): Trajectory;
59
- /** Micro-dollar precision so summed floats stay readable in JSON. */
60
- export declare function roundCostUsd(usd: number): number;
61
60
  /** Compact dollar display for estimated costs (`$0.0132`, `$1.25`). */
62
61
  export declare function formatCostUsd(usd: number): string;
63
62
  /** Parse an `events.ndjson` file (or any NDJSON blob of SessionEvents). */
@@ -1 +1 @@
1
- {"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/internal/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACtC,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAwOlE;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWjD;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAc9D;AAED,sDAAsD;AACtD,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAGpF;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAwDnE"}
1
+ {"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/internal/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACtC,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CA+NlE;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWjD;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAc9D;AAED,sDAAsD;AACtD,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAGpF;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAoDnE"}
@@ -188,9 +188,6 @@ export function buildTrajectory(events) {
188
188
  if (event.data.usage !== undefined) {
189
189
  turn.usage = event.data.usage;
190
190
  }
191
- if (event.data.cost !== undefined) {
192
- turn.cost = event.data.cost;
193
- }
194
191
  if (event.data.result !== undefined) {
195
192
  turn.result = event.data.result;
196
193
  if (turn.assistantText === "") {
@@ -223,10 +220,6 @@ export function buildTrajectory(events) {
223
220
  const turnsFailed = turns.filter((t) => t.failed).length;
224
221
  const toolCallCount = turns.reduce((n, t) => n + t.toolCalls.length + t.subagents.reduce((m, s) => m + s.toolCalls.length, 0), 0);
225
222
  const lastGood = [...turns].reverse().find((t) => t.assistantText !== "");
226
- const costedTurns = turns.filter((t) => t.cost !== undefined);
227
- const totalCostUsd = costedTurns.length === 0
228
- ? undefined
229
- : roundCostUsd(costedTurns.reduce((sum, t) => sum + (t.cost?.totalUsd ?? 0), 0));
230
223
  return {
231
224
  sessionId,
232
225
  ...(sdkAgentId === undefined ? {} : { sdkAgentId }),
@@ -236,14 +229,9 @@ export function buildTrajectory(events) {
236
229
  finalText: lastGood?.assistantText ?? "",
237
230
  turnsFailed,
238
231
  toolCallCount,
239
- ...(totalCostUsd === undefined ? {} : { totalCostUsd }),
240
232
  turns,
241
233
  };
242
234
  }
243
- /** Micro-dollar precision so summed floats stay readable in JSON. */
244
- export function roundCostUsd(usd) {
245
- return Math.round(usd * 1e6) / 1e6;
246
- }
247
235
  /** Compact dollar display for estimated costs (`$0.0132`, `$1.25`). */
248
236
  export function formatCostUsd(usd) {
249
237
  if (!Number.isFinite(usd)) {
@@ -324,7 +312,7 @@ export function formatTrajectoryText(trajectory) {
324
312
  lines.push(` error: ${turn.error}`);
325
313
  }
326
314
  if (turn.usage !== undefined) {
327
- lines.push(` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}${turn.cost === undefined ? "" : ` cost: ${formatCostUsd(turn.cost.totalUsd)}`}`);
315
+ lines.push(` usage: in ${turn.usage.inputTokens} out ${turn.usage.outputTokens}`);
328
316
  }
329
317
  }
330
318
  return `${lines.join("\n")}\n`;
package/dist/memory.d.ts CHANGED
@@ -90,14 +90,17 @@ export interface AgentStoreMemoryBackendOptions {
90
90
  */
91
91
  export declare function agentStoreMemoryBackend(options?: AgentStoreMemoryBackendOptions): MemoryBackend;
92
92
  export interface MemoryHookOptions {
93
- /** Where records go. Defaults to {@link fileMemoryBackend}. */
93
+ /**
94
+ * Where records go. Defaults to {@link agentStoreMemoryBackend} on
95
+ * Cursor-managed hosting and {@link fileMemoryBackend} elsewhere.
96
+ */
94
97
  backend?: MemoryBackend;
95
98
  /** Truncation cap for stored userMessage / result text. Default 2000. */
96
99
  maxTextLength?: number;
97
100
  }
98
101
  /**
99
102
  * Observe-only hook that journals every turn. Author it as
100
- * `agent/hooks/memory.ts`:
103
+ * `bot/hooks/memory.ts`:
101
104
  *
102
105
  * ```ts
103
106
  * import { memoryHook } from "@cursor/bdk/memory";
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAe,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzE,sEAAsE;AACtE,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,gDAAgD;AAChD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,UAAU,CACR,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;OAKG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,aAAa,CA6BvF;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,uCAAuC;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,aAAa,CA6Jf;AAgBD,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CAgG1E"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAe,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzE,sEAAsE;AACtE,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,gDAAgD;AAChD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,UAAU,CACR,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;OAKG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,aAAa,CA6BvF;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,uCAAuC;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,aAAa,CA6Jf;AAgBD,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CAgG1E"}
package/dist/memory.js CHANGED
@@ -219,7 +219,7 @@ function truncate(text, max) {
219
219
  }
220
220
  /**
221
221
  * Observe-only hook that journals every turn. Author it as
222
- * `agent/hooks/memory.ts`:
222
+ * `bot/hooks/memory.ts`:
223
223
  *
224
224
  * ```ts
225
225
  * import { memoryHook } from "@cursor/bdk/memory";