@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
@@ -29,7 +29,7 @@ import { startPlaygroundProxy } from "./playground-proxy.js";
29
29
  import { resolveProdPlaygroundUrl, resolveProdSlug, resolveProdTarget, } from "./resolve-prod-target.js";
30
30
  import { runSession } from "./run-client.js";
31
31
  import { buildSessionCostReport, formatSessionCostText, formatSessionsCostText, } from "./session-cost.js";
32
- import { fetchSessionEvents, formatSessionsTable, listSessionsWithSource, resolvePreviousSessionId, } from "./sessions-client.js";
32
+ import { fetchSessionCost, fetchSessionEvents, formatSessionsTable, listSessionsWithSource, resolvePreviousSessionId, } from "./sessions-client.js";
33
33
  import { createStreamProgress } from "./stream-progress.js";
34
34
  import { buildTrajectory, formatTrajectoryText, loadTrajectoryFromEventsFile, } from "./trajectory.js";
35
35
  function shouldStreamProgress(options) {
@@ -363,6 +363,8 @@ export async function cmdChat(options) {
363
363
  return 1;
364
364
  }
365
365
  }
366
+ /** Covers the server's billed lookup plus its catalog retry; `run` reports no cost past it. */
367
+ const RUN_SESSION_COST_TIMEOUT_MS = 15_000;
366
368
  export async function cmdRun(options) {
367
369
  // Only a v2-shaped request tries the control plane; every v1 `run --prod`
368
370
  // form (multi-turn, continuation token, local session id, --url) keeps its
@@ -394,6 +396,17 @@ export async function cmdRun(options) {
394
396
  timeoutMs: options.timeoutMs,
395
397
  onEvent: progress === undefined ? undefined : (e) => progress.onEvent(e),
396
398
  });
399
+ if (options.prod !== true) {
400
+ const cost = await fetchSessionCost({
401
+ baseUrl: target.agentUrl,
402
+ sessionId: result.sessionId,
403
+ auth: { bearerToken: options.bearerToken, headers: target.headers },
404
+ signal: AbortSignal.timeout(RUN_SESSION_COST_TIMEOUT_MS),
405
+ });
406
+ if (cost !== undefined) {
407
+ result.trajectory.totalCostUsd = cost.costUsd;
408
+ }
409
+ }
397
410
  let eventsPath;
398
411
  const writeEvents = options.events !== false;
399
412
  if (writeEvents) {
@@ -1614,14 +1627,14 @@ export async function cmdSession(sessionId, options) {
1614
1627
  /** Sessions fetched concurrently when `cost` aggregates every session. */
1615
1628
  const COST_FETCH_CONCURRENCY = 4;
1616
1629
  /**
1617
- * `cost [sessionId]` — pull per-session cost metrics.
1630
+ * `cost [sessionId]` — pull per-session usage and cost.
1618
1631
  *
1619
- * With a session id: per-turn token usage + estimated cost for that session.
1620
- * Without one: one row per session (all sessions on the target) plus a
1621
- * total row. `--json` prints the underlying report(s); text is the default.
1622
- * Costs are recorded on `turn.completed` via `POST /v1/models/estimate-cost`
1623
- * (billed usage when available). Turns persisted before cost tracking simply
1624
- * count as unpriced.
1632
+ * With a session id: per-turn token usage plus the whole session's cost from
1633
+ * `GET /v1/session/:id/cost` (billed usage when available, else catalog
1634
+ * pricing of the summed tokens). Without one: token usage per session (all
1635
+ * sessions on the target) plus a total row, unpriced so listing does not run
1636
+ * a billed lookup per session. `--json` prints the underlying report(s);
1637
+ * text is the default.
1625
1638
  */
1626
1639
  export async function cmdCost(sessionId, options) {
1627
1640
  const target = await resolveSessionTarget(options);
@@ -1635,13 +1648,21 @@ export async function cmdCost(sessionId, options) {
1635
1648
  try {
1636
1649
  const resolved = trimNonEmpty(sessionId);
1637
1650
  if (resolved !== undefined) {
1638
- const events = await fetchSessionEvents({
1639
- baseUrl: target.agentUrl,
1640
- sessionId: resolved,
1641
- auth,
1642
- fetchImpl: options.fetchImpl,
1643
- });
1644
- const report = buildSessionCostReport(events);
1651
+ const [events, cost] = await Promise.all([
1652
+ fetchSessionEvents({
1653
+ baseUrl: target.agentUrl,
1654
+ sessionId: resolved,
1655
+ auth,
1656
+ fetchImpl: options.fetchImpl,
1657
+ }),
1658
+ fetchSessionCost({
1659
+ baseUrl: target.agentUrl,
1660
+ sessionId: resolved,
1661
+ auth,
1662
+ fetchImpl: options.fetchImpl,
1663
+ }),
1664
+ ]);
1665
+ const report = buildSessionCostReport(events, cost);
1645
1666
  if (report.sessionId === "") {
1646
1667
  report.sessionId = resolved;
1647
1668
  }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Recover token usage for cloud turns that finished without it on
3
+ * `turn.completed`.
4
+ *
5
+ * Cloud `run.wait()` often drops streamed usage after SSE reconnect. The
6
+ * playground Trace tab only renders what is on the event, so those turns
7
+ * stay blank unless usage is backfilled from `Agent.getUsage` when the
8
+ * stream is read.
9
+ */
10
+ import type { SessionEvent, TurnUsage } from "../types.js";
11
+ export interface CloudRunUsage {
12
+ runId: string;
13
+ usage: TurnUsage;
14
+ }
15
+ export interface CloudAgentUsage {
16
+ usage: TurnUsage;
17
+ runs: CloudRunUsage[];
18
+ }
19
+ export declare function usageTokenSum(usage: TurnUsage | undefined): number;
20
+ export declare function isUsageMissingCompletedTurn(event: SessionEvent): boolean;
21
+ export declare function cloudSdkAgentIdFromEvents(events: ReadonlyArray<SessionEvent>): string | undefined;
22
+ /**
23
+ * Copy usage onto `turn.completed` events that have none. Returns undefined
24
+ * when the snapshot cannot be attributed safely (multiple unmatched turns).
25
+ */
26
+ export declare function applyCloudUsageToEvents(events: ReadonlyArray<SessionEvent>, billed: CloudAgentUsage): SessionEvent[] | undefined;
27
+ export declare function mapSdkTokenUsage(usage: {
28
+ inputTokens: number;
29
+ outputTokens: number;
30
+ cacheReadTokens: number;
31
+ cacheWriteTokens: number;
32
+ reasoningTokens?: number;
33
+ }): TurnUsage;
34
+ //# sourceMappingURL=cloud-turn-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-turn-usage.d.ts","sourceRoot":"","sources":["../../src/internal/cloud-turn-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAKlE;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAExE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,MAAM,GAAG,SAAS,CAYjG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,EACnC,MAAM,EAAE,eAAe,GACtB,YAAY,EAAE,GAAG,SAAS,CAkD5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,SAAS,CAWZ"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Recover token usage for cloud turns that finished without it on
3
+ * `turn.completed`.
4
+ *
5
+ * Cloud `run.wait()` often drops streamed usage after SSE reconnect. The
6
+ * playground Trace tab only renders what is on the event, so those turns
7
+ * stay blank unless usage is backfilled from `Agent.getUsage` when the
8
+ * stream is read.
9
+ */
10
+ export function usageTokenSum(usage) {
11
+ if (usage === undefined) {
12
+ return 0;
13
+ }
14
+ return usage.inputTokens + usage.outputTokens + usage.cacheReadTokens + usage.cacheWriteTokens;
15
+ }
16
+ export function isUsageMissingCompletedTurn(event) {
17
+ return event.type === "turn.completed" && usageTokenSum(event.data.usage) <= 0;
18
+ }
19
+ export function cloudSdkAgentIdFromEvents(events) {
20
+ let sdkAgentId;
21
+ for (const event of events) {
22
+ if (event.type !== "agent.bound") {
23
+ continue;
24
+ }
25
+ const id = event.data.sdkAgentId.trim();
26
+ if (id.startsWith("bc-")) {
27
+ sdkAgentId = id;
28
+ }
29
+ }
30
+ return sdkAgentId;
31
+ }
32
+ /**
33
+ * Copy usage onto `turn.completed` events that have none. Returns undefined
34
+ * when the snapshot cannot be attributed safely (multiple unmatched turns).
35
+ */
36
+ export function applyCloudUsageToEvents(events, billed) {
37
+ const completedIndexes = [];
38
+ const missingIndexes = [];
39
+ for (let i = 0; i < events.length; i++) {
40
+ const event = events[i];
41
+ if (event === undefined || event.type !== "turn.completed") {
42
+ continue;
43
+ }
44
+ completedIndexes.push(i);
45
+ if (isUsageMissingCompletedTurn(event)) {
46
+ missingIndexes.push(i);
47
+ }
48
+ }
49
+ if (missingIndexes.length === 0) {
50
+ return [...events];
51
+ }
52
+ const patches = new Map();
53
+ if (missingIndexes.length === 1 &&
54
+ completedIndexes.length === 1 &&
55
+ usageTokenSum(billed.usage) > 0) {
56
+ const index = missingIndexes[0];
57
+ if (index !== undefined) {
58
+ patches.set(index, billed.usage);
59
+ }
60
+ }
61
+ else if (billed.runs.length === missingIndexes.length &&
62
+ billed.runs.every((run) => usageTokenSum(run.usage) > 0)) {
63
+ for (let i = 0; i < missingIndexes.length; i++) {
64
+ const index = missingIndexes[i];
65
+ const run = billed.runs[i];
66
+ if (index === undefined || run === undefined) {
67
+ return undefined;
68
+ }
69
+ patches.set(index, run.usage);
70
+ }
71
+ }
72
+ else {
73
+ return undefined;
74
+ }
75
+ return events.map((event, index) => {
76
+ const usage = patches.get(index);
77
+ if (usage === undefined || event.type !== "turn.completed") {
78
+ return event;
79
+ }
80
+ return { ...event, data: { ...event.data, usage } };
81
+ });
82
+ }
83
+ export function mapSdkTokenUsage(usage) {
84
+ const mapped = {
85
+ inputTokens: usage.inputTokens,
86
+ outputTokens: usage.outputTokens,
87
+ cacheReadTokens: usage.cacheReadTokens,
88
+ cacheWriteTokens: usage.cacheWriteTokens,
89
+ };
90
+ if (usage.reasoningTokens !== undefined) {
91
+ mapped.reasoningTokens = usage.reasoningTokens;
92
+ }
93
+ return mapped;
94
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Dollar cost for a whole session, computed by the Cloud Agents
3
+ * `POST /v1/models/estimate-cost` endpoint: billed usage events for the
4
+ * conversation when they can be read, otherwise live catalog pricing of the
5
+ * session's summed tokens.
6
+ *
7
+ * The billed lookup scans the owning team's usage history, so it runs only
8
+ * when something asks for a session's cost, never once per turn.
9
+ */
10
+ import type { ModelSetting, TurnUsage } from "../types.js";
11
+ export interface UsageCostCents {
12
+ rawCostCents: number;
13
+ chargedCents: number;
14
+ }
15
+ export interface EstimateCostInput {
16
+ model: ModelSetting;
17
+ /** Summed token usage, for the catalog fallback when billed events are unavailable. */
18
+ usage?: TurnUsage;
19
+ agentId?: string;
20
+ conversationId?: string;
21
+ }
22
+ export interface EstimatedCost {
23
+ /** Charged total, in USD. */
24
+ totalUsd: number;
25
+ /** Model id the cost was priced against. */
26
+ model: string;
27
+ /** `"usage"` is billed events; `"catalog"` is live list pricing. */
28
+ source: "usage" | "catalog";
29
+ rawCostCents: number;
30
+ chargedCents: number;
31
+ }
32
+ export type EstimateCostFn = (input: EstimateCostInput) => Promise<EstimatedCost | undefined>;
33
+ export declare function modelSettingId(model: ModelSetting): string;
34
+ /**
35
+ * This estimate-cost client treats OpenAI-compat usage as **provider-gross**
36
+ * (local playground: `prompt_tokens` includes `cachedPromptTokens`). Catalog
37
+ * `costForBaseTier` assumes Anthropic / billing-style disjoint nets and ADDs
38
+ * `cacheRead × cachedRate` on top of `input × inputRate`, so we send
39
+ * `input − cache` for Grok / xAI / GPT / o-series.
40
+ *
41
+ * Non-OpenAI-compat models are left alone. `input < cache` is only a
42
+ * defensive clamp (avoid a negative uncached count), not a detector for
43
+ * billed / openaiProxy-shaped tokens. Cloud catalog fallback with already-
44
+ * netted OpenAI-compat usage is out of scope here.
45
+ */
46
+ export declare function isOpenAiCompatGrossCacheModel(model: ModelSetting): boolean;
47
+ export declare function toCatalogDisjointUsage(usage: TurnUsage, model?: ModelSetting): TurnUsage;
48
+ export declare function roundCostUsd(usd: number): number;
49
+ export declare function estimatedCostFromCents(args: {
50
+ model: ModelSetting;
51
+ cost: UsageCostCents;
52
+ source: EstimatedCost["source"];
53
+ }): EstimatedCost;
54
+ export declare function estimateCostFromApi(input: EstimateCostInput): Promise<EstimatedCost | undefined>;
55
+ //# sourceMappingURL=estimate-cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-cost.d.ts","sourceRoot":"","sources":["../../src/internal/estimate-cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,YAAY,CAAC;IACpB,uFAAuF;IACvF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;AAE9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAE1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAK1E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAYxF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CACjC,GAAG,aAAa,CAQhB;AAWD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAgBpC"}
@@ -1,7 +1,11 @@
1
1
  /**
2
- * Dollar cost for an agent turn, computed by the Cloud Agents
3
- * `POST /v1/models/estimate-cost` endpoint (billed usage events for the
4
- * turn's cloud run when a run id is known, otherwise live catalog pricing).
2
+ * Dollar cost for a whole session, computed by the Cloud Agents
3
+ * `POST /v1/models/estimate-cost` endpoint: billed usage events for the
4
+ * conversation when they can be read, otherwise live catalog pricing of the
5
+ * session's summed tokens.
6
+ *
7
+ * The billed lookup scans the owning team's usage history, so it runs only
8
+ * when something asks for a session's cost, never once per turn.
5
9
  */
6
10
  import { cursorExternalApiUrl, resolveApiKey } from "./cursor/credentials.js";
7
11
  export function modelSettingId(model) {
@@ -39,29 +43,18 @@ export function toCatalogDisjointUsage(usage, model) {
39
43
  export function roundCostUsd(usd) {
40
44
  return Math.round(usd * 1e6) / 1e6;
41
45
  }
42
- export function turnCostFromCents(args) {
43
- const totalUsd = roundCostUsd(args.cost.chargedCents / 100);
44
- const modelParams = typeof args.model === "string" ? undefined : args.model.params;
46
+ export function estimatedCostFromCents(args) {
45
47
  return {
46
- totalUsd,
47
- inputUsd: 0,
48
- outputUsd: 0,
49
- cacheReadUsd: 0,
50
- cacheWriteUsd: 0,
48
+ totalUsd: roundCostUsd(args.cost.chargedCents / 100),
51
49
  model: modelSettingId(args.model),
52
- modelParams,
53
50
  source: args.source,
54
51
  rawCostCents: args.cost.rawCostCents,
55
52
  chargedCents: args.cost.chargedCents,
56
53
  };
57
54
  }
58
- /**
59
- * A session holds its delivery lease until `turn.completed`, and this request
60
- * is the last thing in front of that event, so an unbounded wait here queues
61
- * the next message behind the endpoint's billed-usage lookup.
62
- */
55
+ /** The endpoint keeps scanning after this client gives up, so the bound only caps the caller's wait. */
63
56
  const ESTIMATE_COST_TIMEOUT_MS = 5_000;
64
- export async function estimateTurnCostFromApi(input) {
57
+ export async function estimateCostFromApi(input) {
65
58
  const resolved = await resolveApiKey();
66
59
  if (resolved === undefined) {
67
60
  return undefined;
@@ -70,9 +63,9 @@ export async function estimateTurnCostFromApi(input) {
70
63
  if (priced !== undefined) {
71
64
  return priced;
72
65
  }
73
- // The first lookup can time out or miss. Catalog-price this turn from
74
- // the local usage whether or not a run id was sent. The retry omits the
75
- // run id so it does not ask for billed events again.
66
+ // The billed lookup can time out or miss. Catalog-price the summed usage
67
+ // instead; omitting the ids keeps the retry from asking for billed events
68
+ // again.
76
69
  if (input.usage === undefined) {
77
70
  return undefined;
78
71
  }
@@ -97,7 +90,6 @@ async function requestEstimate(apiKey, input) {
97
90
  cacheWriteTokens: catalogUsage?.cacheWriteTokens,
98
91
  agentId: input.agentId,
99
92
  conversationId: input.conversationId,
100
- runId: input.runId,
101
93
  }),
102
94
  signal: AbortSignal.timeout(ESTIMATE_COST_TIMEOUT_MS),
103
95
  });
@@ -118,7 +110,7 @@ async function requestEstimate(apiKey, input) {
118
110
  if (typeof body.cost?.rawCostCents !== "number" || typeof body.cost.chargedCents !== "number") {
119
111
  return undefined;
120
112
  }
121
- return turnCostFromCents({
113
+ return estimatedCostFromCents({
122
114
  model: input.model,
123
115
  cost: body.cost,
124
116
  source: body.source === "usage" ? "usage" : "catalog",
@@ -22,7 +22,7 @@ export declare class SessionEventLog {
22
22
  /** Appended events whose `appendFile` has not finished. */
23
23
  private readonly inflight;
24
24
  /**
25
- * In-process patches (cloud cost backfill) that are not rewritten to
25
+ * In-process patches (cloud usage backfill) that are not rewritten to
26
26
  * `events.ndjson`. Applied on read.
27
27
  */
28
28
  private readonly replacements;
@@ -59,7 +59,7 @@ export declare class SessionEventLog {
59
59
  snapshot(startIndex?: number): Promise<SessionEvent[]>;
60
60
  /**
61
61
  * Replace one already-recorded event in this process. Used to backfill
62
- * usage/cost onto historical `turn.completed` rows without rewriting
62
+ * usage onto historical `turn.completed` rows without rewriting
63
63
  * `events.ndjson`. Live subscribers are not notified — patch before
64
64
  * opening a replay stream.
65
65
  */
@@ -68,7 +68,7 @@ export class SessionEventLog {
68
68
  /** Appended events whose `appendFile` has not finished. */
69
69
  this.inflight = [];
70
70
  /**
71
- * In-process patches (cloud cost backfill) that are not rewritten to
71
+ * In-process patches (cloud usage backfill) that are not rewritten to
72
72
  * `events.ndjson`. Applied on read.
73
73
  */
74
74
  this.replacements = new Map();
@@ -174,7 +174,7 @@ export class SessionEventLog {
174
174
  }
175
175
  /**
176
176
  * Replace one already-recorded event in this process. Used to backfill
177
- * usage/cost onto historical `turn.completed` rows without rewriting
177
+ * usage onto historical `turn.completed` rows without rewriting
178
178
  * `events.ndjson`. Live subscribers are not notified — patch before
179
179
  * opening a replay stream.
180
180
  */
@@ -191,7 +191,7 @@ export function buildHttpChannelRoutes(args) {
191
191
  const url = new URL(request.url);
192
192
  const asJson = url.searchParams.get("format") === "json";
193
193
  const snapshot = await engine.listEvents(sessionId, 0, {
194
- backfillCloudCost: true,
194
+ backfillCloudUsage: true,
195
195
  });
196
196
  if (asJson) {
197
197
  return jsonResponse({
@@ -1 +1 @@
1
- {"version":3,"file":"init-scaffold.d.ts","sourceRoot":"","sources":["../../src/internal/init-scaffold.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAkBvE;AAED,eAAO,MAAM,SAAS,EAAE,MAOZ,CAAC;AAgBb,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAgBzD;AAcD,eAAO,MAAM,SAAS,EAAE,MAOvB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAK7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAS3B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,WAAmB,GAAG,MAAM,CA0C/E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAuBtF;AAWD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,EAAE,MAUlC,CAAC;AAWF,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,EACpE,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAmB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAUf"}
1
+ {"version":3,"file":"init-scaffold.d.ts","sourceRoot":"","sources":["../../src/internal/init-scaffold.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAkBvE;AAED,eAAO,MAAM,SAAS,EAAE,MAOZ,CAAC;AAgBb,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAgBzD;AAcD,eAAO,MAAM,SAAS,EAAE,MAMvB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAK7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAS3B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,WAAmB,GAAG,MAAM,CA0C/E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAuBtF;AAWD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,EAAE,MAUlC,CAAC;AAWF,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,EACpE,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAmB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -67,10 +67,9 @@ export default defineTool({
67
67
  },
68
68
  });
69
69
  `;
70
- export const MEMORY_TS = `// Journals every turn (timestamp, session, user message, result) so
71
- // future sessions can recall past work. The journal is shared across every
72
- // session — and every user — of this agent. Pass your own MemoryBackend to
73
- // change where memories live, or delete this file to opt out.
70
+ export const MEMORY_TS = `// Every session and every user of this agent share one memory journal.
71
+ // To turn memory off, delete this file and the "## Memory" section of
72
+ // instructions.md.
74
73
  import { memoryHook } from "${PACKAGE_NAME}/memory";
75
74
 
76
75
  export default memoryHook();
@@ -2,9 +2,9 @@
2
2
  * Maps the durable session event stream onto OTel traces / metrics / logs.
3
3
  *
4
4
  * Attribute names reuse Cursor enterprise wire keys where they overlap
5
- * (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool.*`,
6
- * `cursor.cost.usage`, `cursor.model.name`) so Agent SDK traces join org
7
- * metrics/logs in the same collector. Agent-SDK-only fields use `agent_sdk.*`.
5
+ * (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool.*`) so Agent SDK
6
+ * traces join org metrics/logs in the same collector. Agent-SDK-only fields
7
+ * use `agent_sdk.*`.
8
8
  */
9
9
  import type { SessionEvent, SessionInfo } from "../../types.js";
10
10
  import { type AttrValue } from "./attrs.js";
@@ -1 +1 @@
1
- {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACzD,KAAK,IAAI,IAAI,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E;;;;OAIG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,0FAA0F;IAC1F,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC7D,yEAAyE;IACzE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IACrF,mEAAmE;IACnE,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;CAChF;AAiBD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,aAAa,CA0yBf"}
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/collector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACzD,KAAK,IAAI,IAAI,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E;;;;OAIG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,0FAA0F;IAC1F,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC7D,yEAAyE;IACzE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IACrF,mEAAmE;IACnE,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;CAChF;AAiBD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,aAAa,CA2xBf"}
@@ -2,14 +2,15 @@
2
2
  * Maps the durable session event stream onto OTel traces / metrics / logs.
3
3
  *
4
4
  * Attribute names reuse Cursor enterprise wire keys where they overlap
5
- * (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool.*`,
6
- * `cursor.cost.usage`, `cursor.model.name`) so Agent SDK traces join org
7
- * metrics/logs in the same collector. Agent-SDK-only fields use `agent_sdk.*`.
5
+ * (`cursor.conversation.id`, `cursor.token.*`, `cursor.tool.*`) so Agent SDK
6
+ * traces join org metrics/logs in the same collector. Agent-SDK-only fields
7
+ * use `agent_sdk.*`.
8
8
  */
9
9
  import { context, ROOT_CONTEXT, SpanKind, SpanStatusCode, trace, } from "@opentelemetry/api";
10
10
  import { SeverityNumber } from "@opentelemetry/api-logs";
11
11
  import { classifyExpectedDeliveryFailure } from "../expected-delivery-failure.js";
12
12
  import { attrs } from "./attrs.js";
13
+ import { computerUseRequestAttrs, computerUseResultAttrs } from "./computer-use-attrs.js";
13
14
  const CONTENT_MAX = 2_048;
14
15
  export function createOtelCollector(runtime, agentName, log) {
15
16
  const sessions = new Map();
@@ -206,6 +207,7 @@ export function createOtelCollector(runtime, agentName, log) {
206
207
  const status = event.data.isError ? "failure" : "success";
207
208
  if (span !== undefined) {
208
209
  span.setAttribute("cursor.tool.status", status);
210
+ span.setAttributes(attrs(computerUseResultAttrs(event.data.toolName, event.data.output)));
209
211
  if (logOpts?.toolContent === true && event.data.output !== undefined) {
210
212
  span.setAttribute("agent_sdk.tool_output", truncate(json(event.data.output)));
211
213
  }
@@ -300,7 +302,6 @@ export function createOtelCollector(runtime, agentName, log) {
300
302
  }
301
303
  endOpenChildren(turn, startTime);
302
304
  const usage = event.data.usage;
303
- const cost = event.data.cost;
304
305
  if (usage !== undefined) {
305
306
  turn.span.setAttributes(attrs({
306
307
  "agent_sdk.usage.input_tokens": usage.inputTokens,
@@ -311,17 +312,6 @@ export function createOtelCollector(runtime, agentName, log) {
311
312
  }));
312
313
  recordTokens(event.sessionId, usage);
313
314
  }
314
- if (cost !== undefined) {
315
- turn.span.setAttributes(attrs({
316
- "cursor.model.name": cost.model,
317
- "agent_sdk.cost_usd": cost.totalUsd,
318
- "agent_sdk.cost_source": cost.source,
319
- }));
320
- metrics?.cost.add(cost.totalUsd, join(event.sessionId, {
321
- "cursor.model.name": cost.model,
322
- "agent_sdk.agent": agentName,
323
- }));
324
- }
325
315
  turn.span.setStatus({ code: SpanStatusCode.OK });
326
316
  turn.span.end(startTime);
327
317
  sessions.get(event.sessionId)?.turns.delete(event.turnId);
@@ -333,8 +323,6 @@ export function createOtelCollector(runtime, agentName, log) {
333
323
  ...baseLog(event, session),
334
324
  "agent_sdk.usage.input_tokens": usage?.inputTokens,
335
325
  "agent_sdk.usage.output_tokens": usage?.outputTokens,
336
- "agent_sdk.cost_usd": cost?.totalUsd,
337
- "cursor.model.name": cost?.model,
338
326
  }));
339
327
  return;
340
328
  }
@@ -476,6 +464,7 @@ export function createOtelCollector(runtime, agentName, log) {
476
464
  return trace.setSpan(context.active(), turn.span);
477
465
  }
478
466
  function openToolSpan(args) {
467
+ const computerUseAttrs = computerUseRequestAttrs(args.call.toolName, args.call.args);
479
468
  const existing = args.turn.tools.get(args.call.callId);
480
469
  if (existing !== undefined) {
481
470
  // Early `runInCall` opens with callId/toolName only. Fill in
@@ -483,6 +472,7 @@ export function createOtelCollector(runtime, agentName, log) {
483
472
  // The OTel parent is fixed at start; `parent_call_id` still records
484
473
  // the event-stream hierarchy for nested/subagent calls.
485
474
  existing.setAttributes(join(args.sessionId, {
475
+ ...computerUseAttrs,
486
476
  "agent_sdk.parent_call_id": args.parentCallId ?? args.call.parentCallId,
487
477
  "agent_sdk.tool_args": logOpts?.toolContent === true && args.call.args !== undefined
488
478
  ? truncate(json(args.call.args))
@@ -504,6 +494,7 @@ export function createOtelCollector(runtime, agentName, log) {
504
494
  "agent_sdk.tool_args": logOpts?.toolContent === true && args.call.args !== undefined
505
495
  ? truncate(json(args.call.args))
506
496
  : undefined,
497
+ ...computerUseAttrs,
507
498
  }),
508
499
  }, parentCtxFor(args.turn, args.parentCallId ?? args.call.parentCallId));
509
500
  args.turn.tools.set(args.call.callId, span);
@@ -668,10 +659,6 @@ function buildMetrics(meter) {
668
659
  description: "Token usage by type",
669
660
  unit: "{token}",
670
661
  }),
671
- cost: meter.createCounter("cursor.cost.usage", {
672
- description: "Estimated turn cost in USD",
673
- unit: "USD",
674
- }),
675
662
  };
676
663
  }
677
664
  function truncate(value) {
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Content-free span attributes for `computerUse` tool calls.
3
+ *
4
+ * Computer use args hold typed text and screen coordinates, so the collector
5
+ * exports them only under `toolContent`. These attributes keep the batch
6
+ * shape visible without that opt-in.
7
+ */
8
+ import type { AttrValue } from "./attrs.js";
9
+ type Attrs = Record<string, AttrValue | undefined>;
10
+ export declare function computerUseRequestAttrs(toolName: string, args: unknown): Attrs;
11
+ export declare function computerUseResultAttrs(toolName: string, output: unknown): Attrs;
12
+ export {};
13
+ //# sourceMappingURL=computer-use-attrs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computer-use-attrs.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/computer-use-attrs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AAEnD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,CAa9E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,CAU/E"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Content-free span attributes for `computerUse` tool calls.
3
+ *
4
+ * Computer use args hold typed text and screen coordinates, so the collector
5
+ * exports them only under `toolContent`. These attributes keep the batch
6
+ * shape visible without that opt-in.
7
+ */
8
+ import { isRecord } from "../is-record.js";
9
+ export function computerUseRequestAttrs(toolName, args) {
10
+ if (toolName !== "computerUse" || !isRecord(args) || !Array.isArray(args.actions)) {
11
+ return {};
12
+ }
13
+ // The SDK adapter emits only known action types, so `type` is a fixed
14
+ // literal and carries no content.
15
+ const types = args.actions.map((action) => isRecord(action) && typeof action.type === "string" ? action.type : "other");
16
+ return {
17
+ "agent_sdk.computer.action_count": types.length,
18
+ "agent_sdk.computer.actions": types.join(","),
19
+ };
20
+ }
21
+ export function computerUseResultAttrs(toolName, output) {
22
+ if (toolName !== "computerUse" || !isRecord(output)) {
23
+ return {};
24
+ }
25
+ return {
26
+ "agent_sdk.computer.completed_action_count": typeof output.actionCount === "number" ? output.actionCount : undefined,
27
+ "agent_sdk.computer.executor_duration_ms": typeof output.durationMs === "number" ? output.durationMs : undefined,
28
+ };
29
+ }
@@ -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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"}