@cursor/bdk 0.2.20 → 0.2.21

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 (225) hide show
  1. package/dist/channels/github/defaults.d.ts +1 -1
  2. package/dist/channels/github/defaults.d.ts.map +1 -1
  3. package/dist/channels/github/defaults.js +1 -1
  4. package/dist/channels/github/progress.d.ts +1 -1
  5. package/dist/channels/github/progress.d.ts.map +1 -1
  6. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  7. package/dist/docs/404.html +2 -2
  8. package/dist/docs/assets/{app.BzgJFr_T.js → app.C0diulDR.js} +4 -4
  9. package/dist/docs/assets/chunks/@localSearchIndexroot._fglLrPa.js +1 -0
  10. package/dist/docs/assets/chunks/{VPLocalSearchBox.Bn5QyUDM.js → VPLocalSearchBox.mlUwkfRQ.js} +1 -1
  11. package/dist/docs/assets/chunks/{arc.D734Gm5d.js → arc.DM5RRfvb.js} +1 -1
  12. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.NX1jj-YX.js → architectureDiagram-Q4EWVU46.CNHCBbQl.js} +1 -1
  13. package/dist/docs/assets/chunks/{baseUniq.nd8dxdeO.js → baseUniq.25Udb_uV.js} +1 -1
  14. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DG8faTim.js → blockDiagram-DXYQGD6D.Bg-f3-qN.js} +1 -1
  15. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.zD31AJ3b.js → c4Diagram-AHTNJAMY.BywSQvK9.js} +1 -1
  16. package/dist/docs/assets/chunks/channel.C4s-x2x3.js +1 -0
  17. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.BHQj6Rko.js → chunk-4BX2VUAB.C3IdWWlO.js} +1 -1
  18. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.Cs38Yh16.js → chunk-4TB4RGXK.D_t-pAXu.js} +1 -1
  19. package/dist/docs/assets/chunks/{chunk-55IACEB6.CFUR21JO.js → chunk-55IACEB6.DvlNSQE5.js} +1 -1
  20. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.C80-Sneg.js → chunk-EDXVE4YY.6LpTrDTf.js} +1 -1
  21. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CdT1MGza.js → chunk-FMBD7UC4.BZxXsutI.js} +1 -1
  22. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.BctEzab0.js → chunk-OYMX7WX6.CrtynS_e.js} +1 -1
  23. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.DTneeX3k.js → chunk-QZHKN3VN.CUOQY0pM.js} +1 -1
  24. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.Cz47F_-o.js → chunk-YZCP3GAM.Dv3biZVN.js} +1 -1
  25. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.h-fLya-M.js +1 -0
  26. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.h-fLya-M.js +1 -0
  27. package/dist/docs/assets/chunks/clone.BM9yCOiZ.js +1 -0
  28. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BPYgB-_O.js → cose-bilkent-S5V4N54A.DDzCqntx.js} +1 -1
  29. package/dist/docs/assets/chunks/{dagre-KV5264BT.Cu6hECod.js → dagre-KV5264BT.DoiV-U_C.js} +1 -1
  30. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BMgp95Tz.js → diagram-5BDNPKRD.LHX1aUDr.js} +1 -1
  31. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.towWdhDi.js → diagram-G4DWMVQ6.lTnkbDQp.js} +1 -1
  32. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.D9IfOvE9.js → diagram-MMDJMWI5.CclJPnEx.js} +1 -1
  33. package/dist/docs/assets/chunks/{diagram-TYMM5635.NTX57RPu.js → diagram-TYMM5635.CLmB0KKs.js} +1 -1
  34. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DIQLqDqu.js → erDiagram-SMLLAGMA.qKkkB7iQ.js} +1 -1
  35. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.DhqpItRe.js → flowDiagram-DWJPFMVM.HIkXNLJ3.js} +1 -1
  36. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B998R3Ps.js → ganttDiagram-T4ZO3ILL.YN9lDgHe.js} +1 -1
  37. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.B45nTn8-.js → gitGraphDiagram-UUTBAWPF.CL6gf7f9.js} +1 -1
  38. package/dist/docs/assets/chunks/{graph.DPseWzzM.js → graph.DMkP70rB.js} +1 -1
  39. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO._GhhBBai.js → infoDiagram-42DDH7IO.CT98u6Zd.js} +1 -1
  40. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CTUMcaMM.js → ishikawaDiagram-UXIWVN3A.CF88w8YD.js} +1 -1
  41. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.DkJBUddC.js → journeyDiagram-VCZTEJTY.BoWKk6Rz.js} +1 -1
  42. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B5Q3uwhy.js → kanban-definition-6JOO6SKY.CrmPv2sG.js} +1 -1
  43. package/dist/docs/assets/chunks/{layout.CDY13IKh.js → layout.CEiPTQln.js} +1 -1
  44. package/dist/docs/assets/chunks/{linear.BPd1ql9p.js → linear.gkXuWu8G.js} +1 -1
  45. package/dist/docs/assets/chunks/{min.dlGuqIBP.js → min.C4EHK60v.js} +1 -1
  46. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.Cp7zCtmb.js → mindmap-definition-QFDTVHPH.C-JqTP4s.js} +1 -1
  47. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CRH034nu.js → pieDiagram-DEJITSTG.t2HgQOCt.js} +1 -1
  48. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.BspgZ-pX.js → quadrantDiagram-34T5L4WZ.D1k-BEKc.js} +1 -1
  49. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CQZqZ0nZ.js → requirementDiagram-MS252O5E.CUu9VVrt.js} +1 -1
  50. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DllwFU3k.js → sankeyDiagram-XADWPNL6.HroiBrt1.js} +1 -1
  51. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B5fTXycf.js → sequenceDiagram-FGHM5R23.CeJapdwH.js} +1 -1
  52. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.12GQjmbD.js → stateDiagram-FHFEXIEX.CLj6JnXZ.js} +1 -1
  53. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CLFLHNN0.js +1 -0
  54. package/dist/docs/assets/chunks/{theme.BgocqONV.js → theme.B9ZHHvCq.js} +2 -2
  55. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.DXKUL5rH.js → timeline-definition-GMOUNBTQ.BzKGPAdN.js} +1 -1
  56. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BrsjYCjp.js → vennDiagram-DHZGUBPP.DtBNkpF9.js} +1 -1
  57. package/dist/docs/assets/chunks/wardley-RL74JXVD.D_iarxve.js +162 -0
  58. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.C4oM69gv.js → wardleyDiagram-NUSXRM2D.rOXEXIA9.js} +1 -1
  59. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.qzHH9efW.js → xychartDiagram-5P7HB3ND.BrM71_SA.js} +1 -1
  60. package/dist/docs/assets/{deployment.md.D0uprX2p.js → deployment.md.CtSJ6sF9.js} +2 -2
  61. package/dist/docs/assets/{deployment.md.D0uprX2p.lean.js → deployment.md.CtSJ6sF9.lean.js} +1 -1
  62. package/dist/docs/assets/{guides_hooks.md.B_bKG1oA.js → guides_hooks.md.Bfj0pK91.js} +1 -1
  63. package/dist/docs/assets/{guides_hooks.md.B_bKG1oA.lean.js → guides_hooks.md.Bfj0pK91.lean.js} +1 -1
  64. package/dist/docs/assets/{guides_opentelemetry.md.BHPm32OR.js → guides_opentelemetry.md.ByW1Fs7b.js} +4 -4
  65. package/dist/docs/assets/{guides_opentelemetry.md.BHPm32OR.lean.js → guides_opentelemetry.md.ByW1Fs7b.lean.js} +1 -1
  66. package/dist/docs/assets/{reference_hooks.md.CP3FENFJ.js → reference_hooks.md.B1jq3oGl.js} +2 -2
  67. package/dist/docs/assets/{reference_hooks.md.CP3FENFJ.lean.js → reference_hooks.md.B1jq3oGl.lean.js} +1 -1
  68. package/dist/docs/assets/{reference_project-layout.md.SNzIvnmC.js → reference_project-layout.md.mFcS8yDD.js} +3 -3
  69. package/dist/docs/assets/{reference_project-layout.md.SNzIvnmC.lean.js → reference_project-layout.md.mFcS8yDD.lean.js} +1 -1
  70. package/dist/docs/assets/{reference_sessions.md.C_uzIWuy.js → reference_sessions.md.C8FXuGwk.js} +1 -1
  71. package/dist/docs/assets/{reference_subagents.md.gmPt5J-M.js → reference_subagents.md.ChNGh6HK.js} +1 -1
  72. package/dist/docs/assets/{reference_subagents.md.gmPt5J-M.lean.js → reference_subagents.md.ChNGh6HK.lean.js} +1 -1
  73. package/dist/docs/assets/{troubleshooting.md.PCafNCb5.js → troubleshooting.md.DFnoTDlQ.js} +1 -1
  74. package/dist/docs/building-with-agents.html +35 -35
  75. package/dist/docs/deployment.html +37 -37
  76. package/dist/docs/deployment.md +10 -3
  77. package/dist/docs/evals.html +35 -35
  78. package/dist/docs/guides/agent-to-agent.html +35 -35
  79. package/dist/docs/guides/bitbucket.html +35 -35
  80. package/dist/docs/guides/cloud-agents.html +35 -35
  81. package/dist/docs/guides/convert-automation.html +35 -35
  82. package/dist/docs/guides/export-grokbot.html +35 -35
  83. package/dist/docs/guides/github.html +35 -35
  84. package/dist/docs/guides/gitlab.html +35 -35
  85. package/dist/docs/guides/grokbot-agents.html +35 -35
  86. package/dist/docs/guides/hooks.html +37 -37
  87. package/dist/docs/guides/hooks.md +3 -1
  88. package/dist/docs/guides/improve.html +35 -35
  89. package/dist/docs/guides/jev.html +35 -35
  90. package/dist/docs/guides/mcp-oauth.html +35 -35
  91. package/dist/docs/guides/migrate.html +35 -35
  92. package/dist/docs/guides/opentelemetry.html +39 -39
  93. package/dist/docs/guides/opentelemetry.md +26 -13
  94. package/dist/docs/guides/slack.html +35 -35
  95. package/dist/docs/guides/webhooks.html +35 -35
  96. package/dist/docs/hashmap.json +1 -1
  97. package/dist/docs/hillclimbing.html +35 -35
  98. package/dist/docs/index.html +35 -35
  99. package/dist/docs/llms-full.txt +51 -23
  100. package/dist/docs/quickstart.html +35 -35
  101. package/dist/docs/reference/agent-config.html +35 -35
  102. package/dist/docs/reference/artifacts.html +35 -35
  103. package/dist/docs/reference/channels.html +35 -35
  104. package/dist/docs/reference/cli.html +35 -35
  105. package/dist/docs/reference/connections.html +35 -35
  106. package/dist/docs/reference/evals.html +35 -35
  107. package/dist/docs/reference/extensions.html +35 -35
  108. package/dist/docs/reference/hooks.html +37 -37
  109. package/dist/docs/reference/hooks.md +4 -1
  110. package/dist/docs/reference/http-api.html +35 -35
  111. package/dist/docs/reference/instructions.html +35 -35
  112. package/dist/docs/reference/memory.html +35 -35
  113. package/dist/docs/reference/playground.html +35 -35
  114. package/dist/docs/reference/project-layout.html +37 -37
  115. package/dist/docs/reference/project-layout.md +4 -1
  116. package/dist/docs/reference/prompt.html +35 -35
  117. package/dist/docs/reference/schedules.html +35 -35
  118. package/dist/docs/reference/sessions.html +36 -36
  119. package/dist/docs/reference/sessions.md +1 -3
  120. package/dist/docs/reference/skills.html +35 -35
  121. package/dist/docs/reference/subagents.html +36 -36
  122. package/dist/docs/reference/subagents.md +2 -0
  123. package/dist/docs/reference/tools.html +35 -35
  124. package/dist/docs/templates/agentic-owners.html +35 -35
  125. package/dist/docs/templates/grokbot-agents.html +35 -35
  126. package/dist/docs/templates/security-reviewer.html +35 -35
  127. package/dist/docs/templates/thermo-quality-review.html +35 -35
  128. package/dist/docs/templates/thermo-review.html +35 -35
  129. package/dist/docs/templates/triage.html +35 -35
  130. package/dist/docs/troubleshooting.html +36 -36
  131. package/dist/docs/troubleshooting.md +1 -1
  132. package/dist/evals/assertions.d.ts +3 -3
  133. package/dist/evals/assertions.d.ts.map +1 -1
  134. package/dist/evals/assertions.js +2 -2
  135. package/dist/evals/judge.d.ts +5 -4
  136. package/dist/evals/judge.d.ts.map +1 -1
  137. package/dist/extensions/cursor-cloud-agents/extension.d.ts +4 -1
  138. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  139. package/dist/extensions/cursor-cloud-agents/extension.js +20 -0
  140. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +22 -1
  141. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  142. package/dist/extensions/cursor-cloud-agents/lib/backend.js +1 -0
  143. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts +3 -3
  144. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts.map +1 -1
  145. package/dist/filesystem.js +1 -1
  146. package/dist/internal/cursor/account-mcp.d.ts +1 -1
  147. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  148. package/dist/internal/cursor/account-mcp.js +1 -1
  149. package/dist/internal/cursor/github-credentials.d.ts +1 -1
  150. package/dist/internal/cursor/github-credentials.d.ts.map +1 -1
  151. package/dist/internal/deploy-client.js +20 -1
  152. package/dist/internal/discovery/agent.d.ts +1 -1
  153. package/dist/internal/discovery/agent.d.ts.map +1 -1
  154. package/dist/internal/eval-judge-model.d.ts +1 -1
  155. package/dist/internal/eval-judge-model.d.ts.map +1 -1
  156. package/dist/internal/eval-runner.d.ts +2 -2
  157. package/dist/internal/eval-runner.d.ts.map +1 -1
  158. package/dist/internal/eval-runner.js +1 -1
  159. package/dist/internal/evals-client.d.ts +1 -1
  160. package/dist/internal/evals-client.d.ts.map +1 -1
  161. package/dist/internal/evals-client.js +1 -1
  162. package/dist/internal/event-log.d.ts.map +1 -1
  163. package/dist/internal/event-log.js +4 -1
  164. package/dist/internal/event-mapper.d.ts.map +1 -1
  165. package/dist/internal/event-mapper.js +5 -1
  166. package/dist/internal/filesystem/nearest.d.ts +1 -1
  167. package/dist/internal/filesystem/nearest.d.ts.map +1 -1
  168. package/dist/internal/filesystem/walk.d.ts +1 -1
  169. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  170. package/dist/internal/filesystem/walk.js +1 -1
  171. package/dist/internal/host-otel.d.ts.map +1 -1
  172. package/dist/internal/memory-dir.d.ts +8 -0
  173. package/dist/internal/memory-dir.d.ts.map +1 -0
  174. package/dist/internal/memory-dir.js +7 -0
  175. package/dist/internal/otel/collector.d.ts.map +1 -1
  176. package/dist/internal/otel/collector.js +61 -23
  177. package/dist/internal/otel/computer-use-attrs.d.ts +8 -3
  178. package/dist/internal/otel/computer-use-attrs.d.ts.map +1 -1
  179. package/dist/internal/otel/computer-use-attrs.js +10 -9
  180. package/dist/internal/otel/config.d.ts +1 -1
  181. package/dist/internal/otel/config.d.ts.map +1 -1
  182. package/dist/internal/otel/config.js +1 -1
  183. package/dist/internal/otel/runtime.d.ts +2 -6
  184. package/dist/internal/otel/runtime.d.ts.map +1 -1
  185. package/dist/internal/otel/runtime.js +54 -43
  186. package/dist/internal/otel/tool-error-class.d.ts +4 -0
  187. package/dist/internal/otel/tool-error-class.d.ts.map +1 -0
  188. package/dist/internal/otel/tool-error-class.js +36 -0
  189. package/dist/internal/tool-result.d.ts +2 -2
  190. package/dist/internal/tool-result.d.ts.map +1 -1
  191. package/dist/internal/tool-result.js +16 -11
  192. package/dist/internal/workspace-sync.js +1 -1
  193. package/dist/internal/workspace.js +1 -1
  194. package/dist/memory.d.ts +0 -2
  195. package/dist/memory.d.ts.map +1 -1
  196. package/dist/memory.js +1 -2
  197. package/dist/playground/assets/index-BfePgvWh.css +1 -0
  198. package/dist/playground/assets/index-DAlf9lxD.js +71 -0
  199. package/dist/playground/index.html +2 -2
  200. package/dist/types.d.ts +8 -3
  201. package/dist/types.d.ts.map +1 -1
  202. package/docs/deployment.md +10 -3
  203. package/docs/guides/hooks.md +3 -1
  204. package/docs/guides/opentelemetry.md +26 -13
  205. package/docs/reference/hooks.md +4 -1
  206. package/docs/reference/project-layout.md +4 -1
  207. package/docs/reference/sessions.md +1 -3
  208. package/docs/reference/subagents.md +2 -0
  209. package/docs/troubleshooting.md +1 -1
  210. package/package.json +4 -4
  211. package/skills/evals/SKILL.md +1 -1
  212. package/skills/framework-map/SKILL.md +3 -1
  213. package/skills/otel/SKILL.md +4 -3
  214. package/templates/pr-autofixer/bot/tools/drive_pr.ts +1 -2
  215. package/dist/docs/assets/chunks/@localSearchIndexroot.gGwBYU3d.js +0 -1
  216. package/dist/docs/assets/chunks/channel.DQLJQMi3.js +0 -1
  217. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.j55aerUT.js +0 -1
  218. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.j55aerUT.js +0 -1
  219. package/dist/docs/assets/chunks/clone.XimRS84I.js +0 -1
  220. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.Ctv5WEMu.js +0 -1
  221. package/dist/docs/assets/chunks/wardley-RL74JXVD.DZDndEXQ.js +0 -162
  222. package/dist/playground/assets/index-C77_FdOx.css +0 -1
  223. package/dist/playground/assets/index-CvzI2lhj.js +0 -71
  224. /package/dist/docs/assets/{reference_sessions.md.C_uzIWuy.lean.js → reference_sessions.md.C8FXuGwk.lean.js} +0 -0
  225. /package/dist/docs/assets/{troubleshooting.md.PCafNCb5.lean.js → troubleshooting.md.DFnoTDlQ.lean.js} +0 -0
@@ -9,9 +9,12 @@
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
+ import { toolCallErrorMessage } from "../tool-result.js";
12
13
  import { attrs } from "./attrs.js";
13
14
  import { computerUseRequestAttrs, computerUseResultAttrs } from "./computer-use-attrs.js";
15
+ import { classifyToolErrorText } from "./tool-error-class.js";
14
16
  const CONTENT_MAX = 2_048;
17
+ const SPAN_STATUS_REASON_MAX = 160;
15
18
  export function createOtelCollector(runtime, agentName, log) {
16
19
  const sessions = new Map();
17
20
  const extraBySession = new Map();
@@ -129,14 +132,22 @@ export function createOtelCollector(runtime, agentName, log) {
129
132
  return;
130
133
  }
131
134
  case "reasoning.completed": {
132
- ensureTurn(event, session, startTime)?.span.addEvent("reasoning.completed", attrs({
135
+ const turn = ensureTurn(event, session, startTime);
136
+ if (turn === undefined) {
137
+ return;
138
+ }
139
+ spanFor(turn, event.data.parentCallId).addEvent("reasoning.completed", attrs({
133
140
  "agent_sdk.duration_ms": event.data.durationMs,
134
141
  "agent_sdk.parent_call_id": event.data.parentCallId,
135
142
  }), startTime);
136
143
  return;
137
144
  }
138
145
  case "message.completed": {
139
- ensureTurn(event, session, startTime)?.span.addEvent("message.completed", attrs({
146
+ const turn = ensureTurn(event, session, startTime);
147
+ if (turn === undefined) {
148
+ return;
149
+ }
150
+ spanFor(turn, event.data.parentCallId).addEvent("message.completed", attrs({
140
151
  "agent_sdk.finish_reason": event.data.finishReason,
141
152
  "agent_sdk.parent_call_id": event.data.parentCallId,
142
153
  }), startTime);
@@ -171,18 +182,20 @@ export function createOtelCollector(runtime, agentName, log) {
171
182
  return;
172
183
  }
173
184
  case "action.approval_resolved": {
174
- ensureTurn(event, session, startTime)
175
- ?.tools.get(event.data.callId)
176
- ?.addEvent("approval_resolved", attrs({
185
+ const approvalTurn = ensureTurn(event, session, startTime);
186
+ if (event.data.decision === "deny") {
187
+ approvalTurn?.pendingToolErrors.set(event.data.callId, "denied");
188
+ }
189
+ approvalTurn?.tools.get(event.data.callId)?.addEvent("approval_resolved", attrs({
177
190
  "agent_sdk.decision": event.data.decision,
178
191
  "agent_sdk.decision_by": event.data.by,
179
192
  }), startTime);
180
193
  return;
181
194
  }
182
195
  case "action.auth_requested": {
183
- ensureTurn(event, session, startTime)
184
- ?.tools.get(event.data.callId)
185
- ?.addEvent("auth_requested", undefined, startTime);
196
+ const authTurn = ensureTurn(event, session, startTime);
197
+ authTurn?.pendingToolErrors.set(event.data.callId, "auth_required");
198
+ authTurn?.tools.get(event.data.callId)?.addEvent("auth_requested", undefined, startTime);
186
199
  emitLog("action.auth_requested", SeverityNumber.INFO, attrs({
187
200
  ...baseLog(event, session),
188
201
  "cursor.tool.name": event.data.toolName,
@@ -192,9 +205,11 @@ export function createOtelCollector(runtime, agentName, log) {
192
205
  return;
193
206
  }
194
207
  case "action.auth_resolved": {
195
- ensureTurn(event, session, startTime)
196
- ?.tools.get(event.data.callId)
197
- ?.addEvent("auth_resolved", attrs({
208
+ const authTurn = ensureTurn(event, session, startTime);
209
+ if (event.data.decision === "approve") {
210
+ authTurn?.pendingToolErrors.delete(event.data.callId);
211
+ }
212
+ authTurn?.tools.get(event.data.callId)?.addEvent("auth_resolved", attrs({
198
213
  "agent_sdk.decision": event.data.decision,
199
214
  "agent_sdk.decision_by": event.data.by,
200
215
  "agent_sdk.mcp_connection": event.data.connection,
@@ -207,18 +222,22 @@ export function createOtelCollector(runtime, agentName, log) {
207
222
  const status = event.data.isError ? "failure" : "success";
208
223
  if (span !== undefined) {
209
224
  span.setAttribute("cursor.tool.status", status);
210
- span.setAttributes(attrs(computerUseResultAttrs(event.data.toolName, event.data.output)));
225
+ span.setAttributes(attrs(computerUseResultAttrs(event.data)));
211
226
  if (logOpts?.toolContent === true && event.data.output !== undefined) {
212
227
  span.setAttribute("agent_sdk.tool_output", truncate(json(event.data.output)));
213
228
  }
214
229
  if (event.data.isError) {
230
+ const errorClass = turn?.pendingToolErrors.get(event.data.callId) ??
231
+ classifyToolErrorText(event.data.output);
232
+ span.setAttribute("agent_sdk.tool_error_class", errorClass);
215
233
  span.setStatus({
216
234
  code: SpanStatusCode.ERROR,
217
- message: "tool error",
235
+ message: toolFailureReason(event.data.output) ?? "tool error",
218
236
  });
219
237
  }
220
238
  span.end(startTime);
221
239
  turn?.tools.delete(event.data.callId);
240
+ turn?.pendingToolErrors.delete(event.data.callId);
222
241
  }
223
242
  metrics?.toolCalls.add(1, join(event.sessionId, {
224
243
  "cursor.tool.name": event.data.toolName,
@@ -274,6 +293,9 @@ export function createOtelCollector(runtime, agentName, log) {
274
293
  const turn = ensureTurn(event, session, startTime);
275
294
  const span = turn?.subagents.get(event.data.callId);
276
295
  if (span !== undefined) {
296
+ if (event.data.isError === true) {
297
+ span.setStatus({ code: SpanStatusCode.ERROR, message: "subagent error" });
298
+ }
277
299
  span.end(startTime);
278
300
  turn?.subagents.delete(event.data.callId);
279
301
  }
@@ -448,20 +470,19 @@ export function createOtelCollector(runtime, agentName, log) {
448
470
  const turn = {
449
471
  span,
450
472
  tools: new Map(),
473
+ pendingToolErrors: new Map(),
451
474
  subagents: new Map(),
452
475
  synthetic: args.synthetic,
453
476
  };
454
477
  args.state.turns.set(args.turnId, turn);
455
478
  return turn;
456
479
  }
480
+ // Work inside a subagent belongs to its span, everything else to the turn.
481
+ function spanFor(turn, parentCallId) {
482
+ return (parentCallId === undefined ? undefined : turn.subagents.get(parentCallId)) ?? turn.span;
483
+ }
457
484
  function parentCtxFor(turn, parentCallId) {
458
- if (parentCallId !== undefined) {
459
- const sub = turn.subagents.get(parentCallId);
460
- if (sub !== undefined) {
461
- return trace.setSpan(context.active(), sub);
462
- }
463
- }
464
- return trace.setSpan(context.active(), turn.span);
485
+ return trace.setSpan(context.active(), spanFor(turn, parentCallId));
465
486
  }
466
487
  function openToolSpan(args) {
467
488
  const computerUseAttrs = computerUseRequestAttrs(args.call.toolName, args.call.args);
@@ -528,10 +549,20 @@ export function createOtelCollector(runtime, agentName, log) {
528
549
  }
529
550
  function endOpenChildren(turn, endTime) {
530
551
  for (const span of turn.tools.values()) {
552
+ span.setAttribute("cursor.tool.status", "unknown");
553
+ span.setStatus({
554
+ code: SpanStatusCode.ERROR,
555
+ message: "no result",
556
+ });
531
557
  span.end(endTime);
532
558
  }
533
559
  turn.tools.clear();
560
+ turn.pendingToolErrors.clear();
534
561
  for (const span of turn.subagents.values()) {
562
+ span.setStatus({
563
+ code: SpanStatusCode.ERROR,
564
+ message: "no result",
565
+ });
535
566
  span.end(endTime);
536
567
  }
537
568
  turn.subagents.clear();
@@ -661,11 +692,18 @@ function buildMetrics(meter) {
661
692
  }),
662
693
  };
663
694
  }
664
- function truncate(value) {
665
- if (value.length <= CONTENT_MAX) {
695
+ function truncate(value, max = CONTENT_MAX) {
696
+ if (value.length <= max) {
666
697
  return value;
667
698
  }
668
- return `${value.slice(0, CONTENT_MAX)}…`;
699
+ return `${value.slice(0, max)}…`;
700
+ }
701
+ function toolFailureReason(output) {
702
+ const summary = toolCallErrorMessage(output);
703
+ if (summary === undefined) {
704
+ return undefined;
705
+ }
706
+ return truncate(summary.replace(/\s+/g, " ").trim(), SPAN_STATUS_REASON_MAX);
669
707
  }
670
708
  function json(value) {
671
709
  try {
@@ -2,12 +2,17 @@
2
2
  * Content-free span attributes for `computerUse` tool calls.
3
3
  *
4
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.
5
+ * exports them only under `toolContent`. These attributes keep the action
6
+ * shape visible without that opt-in. On the cloud agent path one
7
+ * `computerUse` call is one action, so its tool span is the action span.
7
8
  */
8
9
  import type { AttrValue } from "./attrs.js";
9
10
  type Attrs = Record<string, AttrValue | undefined>;
10
11
  export declare function computerUseRequestAttrs(toolName: string, args: unknown): Attrs;
11
- export declare function computerUseResultAttrs(toolName: string, output: unknown): Attrs;
12
+ export declare function computerUseResultAttrs(result: {
13
+ readonly toolName: string;
14
+ readonly output?: unknown;
15
+ readonly isError: boolean;
16
+ }): Attrs;
12
17
  export {};
13
18
  //# sourceMappingURL=computer-use-attrs.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"computer-use-attrs.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/computer-use-attrs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;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,CAU9E;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,GAAG,KAAK,CAWR"}
@@ -2,8 +2,9 @@
2
2
  * Content-free span attributes for `computerUse` tool calls.
3
3
  *
4
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.
5
+ * exports them only under `toolContent`. These attributes keep the action
6
+ * shape visible without that opt-in. On the cloud agent path one
7
+ * `computerUse` call is one action, so its tool span is the action span.
7
8
  */
8
9
  import { isRecord } from "../is-record.js";
9
10
  export function computerUseRequestAttrs(toolName, args) {
@@ -13,17 +14,17 @@ export function computerUseRequestAttrs(toolName, args) {
13
14
  // The SDK adapter emits only known action types, so `type` is a fixed
14
15
  // literal and carries no content.
15
16
  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
- };
17
+ return { "agent_sdk.computer.actions": types.join(",") };
20
18
  }
21
- export function computerUseResultAttrs(toolName, output) {
22
- if (toolName !== "computerUse" || !isRecord(output)) {
19
+ // An error result is rebuilt from the thrown error and reports zero
20
+ // durations, so only a success result carries executor timing.
21
+ export function computerUseResultAttrs(result) {
22
+ const { toolName, output, isError } = result;
23
+ if (toolName !== "computerUse" || isError || !isRecord(output)) {
23
24
  return {};
24
25
  }
25
26
  return {
26
- "agent_sdk.computer.completed_action_count": typeof output.actionCount === "number" ? output.actionCount : undefined,
27
27
  "agent_sdk.computer.executor_duration_ms": typeof output.durationMs === "number" ? output.durationMs : undefined,
28
+ "agent_sdk.computer.settle_ms": typeof output.settleMs === "number" ? output.settleMs : undefined,
28
29
  };
29
30
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Merge authored `defineOtel`, `serve({ otel })`, and standard OTel env.
3
3
  */
4
- import type { OtelConfig, OtelDefinition, OtelExporterConfig, OtelLogOptions, OtelMetricOptions, OtelSignal, OtelTraceOptions } from "../../otel.js";
4
+ import { type OtelConfig, type OtelDefinition, type OtelExporterConfig, type OtelLogOptions, type OtelMetricOptions, type OtelSignal, type OtelTraceOptions } from "../../otel.js";
5
5
  export interface ResolvedOtelConfig {
6
6
  enabled: boolean;
7
7
  serviceName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,MAAM,EAAE,KAAK,GAAG,gBAAgB,CAAC;IACjC,OAAO,EAAE,KAAK,GAAG,iBAAiB,CAAC;IACnC,IAAI,EAAE,KAAK,GAAG,cAAc,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC,GAC3E,cAAc,GAAG,SAAS,CAmB5B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG,kBAAkB,CAkDrB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBhF;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,kBAAkB,EAAE,EACxC,MAAM,EAAE,UAAU,GACjB,kBAAkB,EAAE,CAItB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,MAAM,EAAE,KAAK,GAAG,gBAAgB,CAAC;IACjC,OAAO,EAAE,KAAK,GAAG,iBAAiB,CAAC;IACnC,IAAI,EAAE,KAAK,GAAG,cAAc,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC,GAC3E,cAAc,GAAG,SAAS,CAmB5B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG,kBAAkB,CAkDrB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBhF;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,kBAAkB,EAAE,EACxC,MAAM,EAAE,UAAU,GACjB,kBAAkB,EAAE,CAItB"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Merge authored `defineOtel`, `serve({ otel })`, and standard OTel env.
3
3
  */
4
- import { resolveOtelDefinition } from "../../otel.js";
4
+ import { resolveOtelDefinition, } from "../../otel.js";
5
5
  /**
6
6
  * Process-global authored config. OTel SDK is one per serve process — if
7
7
  * several mounts ship `agent/otel.ts`, they must be identical.
@@ -1,12 +1,8 @@
1
1
  /**
2
2
  * Process-level OTel SDK (OTLP HTTP exporters for traces / metrics / logs).
3
- *
4
- * Refuses to install a second global Tracer/Meter/Logger provider when one
5
- * already owns the process (CLI, extension host, etc.). Spans still use
6
- * `trace.getTracer()` so they nest under an existing parent when present.
7
3
  */
8
- import type { Histogram, Meter, Tracer } from "@opentelemetry/api";
9
- import type { Logger as OtelLogger } from "@opentelemetry/api-logs";
4
+ import { type Histogram, type Meter, type Tracer } from "@opentelemetry/api";
5
+ import { type Logger as OtelLogger } from "@opentelemetry/api-logs";
10
6
  import { type ResolvedOtelConfig } from "./config.js";
11
7
  /**
12
8
  * Hosted v2 pods may be frozen or destroyed as soon as the HTTP reply
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AA8BpE,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAK1E;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAErD,2EAA2E;AAC3E,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,kBAAkB,CAAC;CAC1C;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC3B,OAAO,CAAC,EAAE,wBAAwB,GACjC,WAAW,GAAG,SAAS,CA8BzB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3F;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EACtB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC3B,SAAS,GAAE,MAAoC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAef"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/runtime.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,MAAM,EAKZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,MAAM,IAAI,UAAU,EAAQ,MAAM,yBAAyB,CAAC;AAiC1E,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAK1E;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAErD,2EAA2E;AAC3E,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,kBAAkB,CAAC;CAC1C;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC3B,OAAO,CAAC,EAAE,wBAAwB,GACjC,WAAW,GAAG,SAAS,CA8BzB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3F;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EACtB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC3B,SAAS,GAAE,MAAoC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -1,11 +1,7 @@
1
1
  /**
2
2
  * Process-level OTel SDK (OTLP HTTP exporters for traces / metrics / logs).
3
- *
4
- * Refuses to install a second global Tracer/Meter/Logger provider when one
5
- * already owns the process (CLI, extension host, etc.). Spans still use
6
- * `trace.getTracer()` so they nest under an existing parent when present.
7
3
  */
8
- import { DiagLogLevel, diag, metrics, trace } from "@opentelemetry/api";
4
+ import { DiagLogLevel, diag, metrics, trace, } from "@opentelemetry/api";
9
5
  import { logs } from "@opentelemetry/api-logs";
10
6
  import { ExportResultCode } from "@opentelemetry/core";
11
7
  import { OTLPLogExporter as OTLPLogExporterHttp } from "@opentelemetry/exporter-logs-otlp-http";
@@ -17,7 +13,7 @@ import { OTLPTraceExporter as OTLPTraceExporterProto } from "@opentelemetry/expo
17
13
  import { resourceFromAttributes } from "@opentelemetry/resources";
18
14
  import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs";
19
15
  import { AggregationTemporality, MeterProvider, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
20
- import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
16
+ import { SimpleSpanProcessor, } from "@opentelemetry/sdk-trace-base";
21
17
  import { BatchSpanProcessor, NodeTracerProvider, ParentBasedSampler, TraceIdRatioBasedSampler, } from "@opentelemetry/sdk-trace-node";
22
18
  import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic-conventions";
23
19
  import { installOutboundFetchInstrumentation, } from "../../otel.js";
@@ -51,12 +47,12 @@ export function createOtelRuntime(config, log, options) {
51
47
  }
52
48
  ensureW3cPropagator();
53
49
  const sdk = startOtelSdk(config, log, options?.resolveExport);
54
- const meter = config.metrics === false ? undefined : metrics.getMeterProvider().getMeter(INSTRUMENTATION);
50
+ const meter = config.metrics === false ? undefined : (sdk.meter ?? metrics.getMeter(INSTRUMENTATION));
55
51
  return {
56
52
  config,
57
- tracer: trace.getTracer(INSTRUMENTATION),
53
+ tracer: sdk.tracer,
58
54
  meter,
59
- logger: config.logs === false ? undefined : logs.getLogger(INSTRUMENTATION),
55
+ logger: config.logs === false ? undefined : (sdk.logger ?? logs.getLogger(INSTRUMENTATION)),
60
56
  httpDuration: meter === undefined
61
57
  ? undefined
62
58
  : meter.createHistogram("agent_sdk.http.duration", {
@@ -105,20 +101,18 @@ function startOtelSdk(config, logger, resolveExport) {
105
101
  const traceOpts = config.traces;
106
102
  if (traceOpts !== false) {
107
103
  const exporters = exportersForSignal(config.exporters, "traces");
108
- if (hasRealTracerProvider()) {
109
- logger("[bdk:otel] TracerProvider already registered; reusing global (BDK OTLP exporters not attached)");
110
- }
111
- else {
112
- const spanProcessors = [];
113
- if (exporters.length > 0) {
114
- for (const exporter of exporters) {
115
- spanProcessors.push(new BatchSpanProcessor(createTraceExporter(exporter, signalUrl(exporter.url, "traces"))));
116
- }
117
- }
118
- else {
119
- memoryExporter = new BoundedMemorySpanExporter(OTEL_IN_MEMORY_SPAN_LIMIT);
120
- spanProcessors.push(new SimpleSpanProcessor(memoryExporter));
104
+ const globalTracer = hasRealTracerProvider();
105
+ const spanProcessors = [];
106
+ if (exporters.length > 0) {
107
+ for (const exporter of exporters) {
108
+ spanProcessors.push(new BatchSpanProcessor(createTraceExporter(exporter, signalUrl(exporter.url, "traces"))));
121
109
  }
110
+ }
111
+ else if (!globalTracer) {
112
+ memoryExporter = new BoundedMemorySpanExporter(OTEL_IN_MEMORY_SPAN_LIMIT);
113
+ spanProcessors.push(new SimpleSpanProcessor(memoryExporter));
114
+ }
115
+ if (spanProcessors.length > 0) {
122
116
  tracerProvider = new NodeTracerProvider({
123
117
  resource,
124
118
  spanProcessors,
@@ -126,7 +120,12 @@ function startOtelSdk(config, logger, resolveExport) {
126
120
  root: new TraceIdRatioBasedSampler(traceOpts.sampleRatio ?? 1),
127
121
  }),
128
122
  });
129
- tracerProvider.register();
123
+ if (globalTracer) {
124
+ logger("[bdk:otel] TracerProvider already registered; BDK traces export on a local provider");
125
+ }
126
+ else {
127
+ tracerProvider.register();
128
+ }
130
129
  }
131
130
  }
132
131
  const metricOpts = config.metrics;
@@ -141,12 +140,9 @@ function startOtelSdk(config, logger, resolveExport) {
141
140
  exportIntervalMillis,
142
141
  })),
143
142
  });
144
- if (metrics.setGlobalMeterProvider(provider)) {
145
- meterProvider = provider;
146
- }
147
- else {
148
- logger("[bdk:otel] MeterProvider already registered; reusing global (BDK OTLP exporters not attached)");
149
- void provider.shutdown();
143
+ meterProvider = provider;
144
+ if (!metrics.setGlobalMeterProvider(provider)) {
145
+ logger("[bdk:otel] MeterProvider already registered; BDK metrics export on a local provider");
150
146
  }
151
147
  }
152
148
  }
@@ -157,13 +153,10 @@ function startOtelSdk(config, logger, resolveExport) {
157
153
  resource,
158
154
  processors: exporters.map((exporter) => new BatchLogRecordProcessor(createLogExporter(exporter, signalUrl(exporter.url, "logs")))),
159
155
  });
156
+ loggerProvider = provider;
160
157
  // api-logs returns the active provider (ours on success, existing otherwise).
161
- if (logs.setGlobalLoggerProvider(provider) === provider) {
162
- loggerProvider = provider;
163
- }
164
- else {
165
- logger("[bdk:otel] LoggerProvider already registered; reusing global (BDK OTLP exporters not attached)");
166
- void provider.shutdown();
158
+ if (logs.setGlobalLoggerProvider(provider) !== provider) {
159
+ logger("[bdk:otel] LoggerProvider already registered; BDK logs export on a local provider");
167
160
  }
168
161
  }
169
162
  }
@@ -173,14 +166,17 @@ function startOtelSdk(config, logger, resolveExport) {
173
166
  else {
174
167
  logger(`[bdk] otel recording service=${config.serviceName} (export on flush when OTLP exporters resolve)`);
175
168
  }
176
- const flushDeferred = async () => {
169
+ let draining;
170
+ const flushDeferred = () => {
171
+ draining ??= drainDeferred().finally(() => {
172
+ draining = undefined;
173
+ });
174
+ return draining;
175
+ };
176
+ const drainDeferred = async () => {
177
177
  if (memoryExporter === undefined) {
178
178
  return;
179
179
  }
180
- const spans = memoryExporter.getFinishedSpans();
181
- if (spans.length === 0) {
182
- return;
183
- }
184
180
  const exportConfig = resolveExport?.() ?? config;
185
181
  const destinations = exportersForSignal(exportConfig.exporters, "traces");
186
182
  if (destinations.length === 0) {
@@ -189,12 +185,23 @@ function startOtelSdk(config, logger, resolveExport) {
189
185
  // Spans already carry the bake-time Resource. Hosted v2 binds
190
186
  // deployment secrets after bake, so env / service extras on
191
187
  // exportConfig must replace that Resource on the wire.
192
- const ok = await exportQueuedSpans(spans, destinations, logger, buildResource(exportConfig));
193
- if (ok) {
194
- memoryExporter.reset();
188
+ const resource = buildResource(exportConfig);
189
+ for (;;) {
190
+ const spans = memoryExporter.getFinishedSpans();
191
+ if (spans.length === 0) {
192
+ return;
193
+ }
194
+ const ok = await exportQueuedSpans(spans, destinations, logger, resource);
195
+ if (!ok) {
196
+ return;
197
+ }
198
+ memoryExporter.dropExported(spans);
195
199
  }
196
200
  };
197
201
  return {
202
+ tracer: tracerProvider?.getTracer(INSTRUMENTATION) ?? trace.getTracer(INSTRUMENTATION),
203
+ meter: meterProvider?.getMeter(INSTRUMENTATION),
204
+ logger: loggerProvider?.getLogger(INSTRUMENTATION),
198
205
  forceFlush: async () => {
199
206
  await Promise.allSettled([
200
207
  raceOtelForceFlush(Promise.allSettled([
@@ -306,6 +313,10 @@ class BoundedMemorySpanExporter {
306
313
  getFinishedSpans() {
307
314
  return this.spans.slice();
308
315
  }
316
+ dropExported(exported) {
317
+ const exportedSet = new Set(exported);
318
+ this.spans = this.spans.filter((span) => !exportedSet.has(span));
319
+ }
309
320
  reset() {
310
321
  this.spans = [];
311
322
  }
@@ -0,0 +1,4 @@
1
+ export type ToolErrorTextClass = "not_found" | "rate_limited" | "timeout" | "unauthorized" | "tool_error";
2
+ export type ToolErrorClass = ToolErrorTextClass | "auth_required" | "denied";
3
+ export declare function classifyToolErrorText(output: unknown): ToolErrorTextClass;
4
+ //# sourceMappingURL=tool-error-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-error-class.d.ts","sourceRoot":"","sources":["../../../src/internal/otel/tool-error-class.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,cAAc,GACd,SAAS,GACT,cAAc,GACd,YAAY,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,eAAe,GAAG,QAAQ,CAAC;AA6B7E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB,CAWzE"}
@@ -0,0 +1,36 @@
1
+ import { toolCallErrorMessage } from "../tool-result.js";
2
+ const MAX_SCANNED_CHARS = 2_000;
3
+ const TEXT_CLASSES = [
4
+ ["not_found", /\bnot found: \/|path does not exist:|\benoent\b|no such file or directory/i],
5
+ [
6
+ "rate_limited",
7
+ /\b(?:HTTP(?:\/[\d.]+)?|status(?: code)?|code)[\s:=]*429\b|rate limit|too many requests/i,
8
+ ],
9
+ ["timeout", /\btimed?\s*out\b|\btimeout\b|\betimedout\b/i],
10
+ [
11
+ "unauthorized",
12
+ /\b(?:HTTP(?:\/[\d.]+)?|status(?: code)?|code)[\s:=]*(?:401|403)\b|\bunauthorized\b|\bforbidden\b/i,
13
+ ],
14
+ ];
15
+ function errorText(output) {
16
+ const message = toolCallErrorMessage(output);
17
+ if (message !== undefined || output === null || typeof output !== "object") {
18
+ return message;
19
+ }
20
+ const error = output.error;
21
+ return typeof error === "string" && error.trim() !== "" ? error : undefined;
22
+ }
23
+ const HOST_TOOL_PREFIX = /^Tool "[^"]*" /;
24
+ const INPUT_ECHO_PREFIX = /^(?:Invalid input for tool "|invalid grep pattern:)/i;
25
+ export function classifyToolErrorText(output) {
26
+ const text = errorText(output)?.replace(HOST_TOOL_PREFIX, "").slice(0, MAX_SCANNED_CHARS);
27
+ if (text === undefined || INPUT_ECHO_PREFIX.test(text)) {
28
+ return "tool_error";
29
+ }
30
+ for (const [errorClass, pattern] of TEXT_CLASSES) {
31
+ if (pattern.test(text)) {
32
+ return errorClass;
33
+ }
34
+ }
35
+ return "tool_error";
36
+ }
@@ -13,8 +13,8 @@ import type { ToolExecuteResult } from "../types.js";
13
13
  export declare function normalizeToolResult(result: ToolExecuteResult | undefined): SDKCustomToolResult;
14
14
  /**
15
15
  * Pull a channel-friendly error string out of a normalized tool result
16
- * (error envelopes with `{ content: [{ type: "text", text }] }`, or a
17
- * bare string). Used for {@link import("../types.js").ToolCallOutcome.errorMessage}.
16
+ * (a bare string, text parts of a content envelope, or `{ message }`).
17
+ * Used for {@link import("../types.js").ToolCallOutcome.errorMessage}.
18
18
  */
19
19
  export declare function toolCallErrorMessage(result: unknown): string | undefined;
20
20
  //# sourceMappingURL=tool-result.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-result.d.ts","sourceRoot":"","sources":["../../src/internal/tool-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GAAG,mBAAmB,CAY9F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAiBxE"}
1
+ {"version":3,"file":"tool-result.d.ts","sourceRoot":"","sources":["../../src/internal/tool-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GAAG,mBAAmB,CAY9F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAoBxE"}
@@ -24,22 +24,27 @@ export function normalizeToolResult(result) {
24
24
  }
25
25
  /**
26
26
  * Pull a channel-friendly error string out of a normalized tool result
27
- * (error envelopes with `{ content: [{ type: "text", text }] }`, or a
28
- * bare string). Used for {@link import("../types.js").ToolCallOutcome.errorMessage}.
27
+ * (a bare string, text parts of a content envelope, or `{ message }`).
28
+ * Used for {@link import("../types.js").ToolCallOutcome.errorMessage}.
29
29
  */
30
30
  export function toolCallErrorMessage(result) {
31
31
  if (typeof result === "string" && result.trim() !== "") {
32
32
  return result;
33
33
  }
34
- if (result === null ||
35
- typeof result !== "object" ||
36
- !("content" in result) ||
37
- !Array.isArray(result.content)) {
34
+ if (result === null || typeof result !== "object") {
38
35
  return undefined;
39
36
  }
40
- const texts = result.content
41
- .filter((part) => part.type === "text" && typeof part.text === "string")
42
- .map((part) => part.text.trim())
43
- .filter((text) => text !== "");
44
- return texts.length === 0 ? undefined : texts.join("\n");
37
+ if ("content" in result && Array.isArray(result.content)) {
38
+ const texts = result.content
39
+ .filter((part) => part.type === "text" && typeof part.text === "string")
40
+ .map((part) => part.text.trim())
41
+ .filter((text) => text !== "");
42
+ if (texts.length > 0) {
43
+ return texts.join("\n");
44
+ }
45
+ }
46
+ if ("message" in result && typeof result.message === "string" && result.message.trim() !== "") {
47
+ return result.message;
48
+ }
49
+ return undefined;
45
50
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { readFile } from "node:fs/promises";
7
7
  import { agentStoreKeys } from "../files.js";
8
- import { MEMORY_DIR_NAME } from "../memory.js";
8
+ import { MEMORY_DIR_NAME } from "./memory-dir.js";
9
9
  import { mirrorToStore, storeRelPath } from "./store-mirror.js";
10
10
  /** Path or encoding that can never land. Distinct from a store outage. */
11
11
  export class WorkspaceFileRefusal extends Error {
@@ -14,7 +14,7 @@ import { homedir } from "node:os";
14
14
  import { dirname, join, parse, relative, resolve, sep } from "node:path";
15
15
  import { promisify } from "node:util";
16
16
  import { agentStoreKeys, DEPLOYMENT_STORE_MOUNT_PATH } from "../files.js";
17
- import { MEMORY_DIR_NAME } from "../memory.js";
17
+ import { MEMORY_DIR_NAME } from "./memory-dir.js";
18
18
  import { parseFrontmatter, serializeFrontmatter } from "./frontmatter.js";
19
19
  import { buildIdentitySection } from "./prompt-context.js";
20
20
  const execFileAsync = promisify(execFile);
package/dist/memory.d.ts CHANGED
@@ -21,8 +21,6 @@
21
21
  import { type CursorHostedFilesOptions } from "./files-backends/cursor-hosted.js";
22
22
  import { type StoreApiClient } from "./internal/cursor/store-api-client.js";
23
23
  import type { HookDefinition, TurnUsage } from "./types.js";
24
- /** Name of the shared memory directory under the agent state root. */
25
- export declare const MEMORY_DIR_NAME = "memory";
26
24
  /** One journal line: what a single turn did. */
27
25
  export type TurnMemoryRecord = {
28
26
  /** ISO timestamp of when the turn finished. */
@@ -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;;;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"}
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;AAE/C,OAAO,KAAK,EAAe,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzE,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
@@ -25,8 +25,7 @@ import { agentStoreKeys } from "./files.js";
25
25
  import { isCursorHostedFilesAvailable, } from "./files-backends/cursor-hosted.js";
26
26
  import { defineHook } from "./hooks.js";
27
27
  import { createStoreApiClient, isStoreApiLaneEnabled, } from "./internal/cursor/store-api-client.js";
28
- /** Name of the shared memory directory under the agent state root. */
29
- export const MEMORY_DIR_NAME = "memory";
28
+ import { MEMORY_DIR_NAME } from "./internal/memory-dir.js";
30
29
  /**
31
30
  * Local default backend: append-only JSONL at `<stateRoot>/memory/journal.jsonl`
32
31
  * in the directory the framework symlinks into session workspaces. Rotated