@cursor/july 0.1.101 → 0.1.102

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 (374) hide show
  1. package/README.md +27 -0
  2. package/dist/channels/slack/api.d.ts +1 -1
  3. package/dist/channels/slack/api.d.ts.map +1 -1
  4. package/dist/channels/slack/api.js +3 -1
  5. package/dist/channels/slack/assistant.d.ts +1 -1
  6. package/dist/channels/slack/assistant.d.ts.map +1 -1
  7. package/dist/channels/slack/dispatch.d.ts +3 -2
  8. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  9. package/dist/channels/slack/dispatch.js +28 -8
  10. package/dist/channels/slack/inbound.d.ts +8 -0
  11. package/dist/channels/slack/inbound.d.ts.map +1 -1
  12. package/dist/channels/slack/inbound.js +28 -0
  13. package/dist/channels/slack/manifest.d.ts.map +1 -1
  14. package/dist/channels/slack/manifest.js +2 -1
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/ab.html +4 -4
  17. package/dist/docs/assets/{app.BASO9Kih.js → app.CLA03RCz.js} +1 -1
  18. package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +1 -0
  19. package/dist/docs/assets/chunks/{VPLocalSearchBox.DwkqxoE0.js → VPLocalSearchBox.ifxv-cJV.js} +1 -1
  20. package/dist/docs/assets/chunks/{theme.CCil_13e.js → theme.DWCwM6p-.js} +2 -2
  21. package/dist/docs/assets/concepts.md.rPzW2HZN.js +1 -0
  22. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +9 -0
  23. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.lean.js +1 -0
  24. package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.js → guides_cloud-runtime.md.BRirbRAN.js} +1 -1
  25. package/dist/docs/assets/index.md.Kiht7ell.js +5 -0
  26. package/dist/docs/assets/{index.md.Bb4k8kUm.lean.js → index.md.Kiht7ell.lean.js} +1 -1
  27. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.js +56 -0
  28. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +1 -0
  29. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.js → reference_project-layout.md.CA6QP6Lw.js} +2 -2
  30. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.lean.js → reference_project-layout.md.CA6QP6Lw.lean.js} +1 -1
  31. package/dist/docs/assets/{reference_skills.md.BFW9retM.js → reference_skills.md.l2ezAcaN.js} +1 -1
  32. package/dist/docs/assets/{reference_tools.md.CvAHsdSp.js → reference_tools.md.B1up2r9W.js} +1 -1
  33. package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +1 -0
  34. package/dist/docs/assets/{skills_framework-map.md.BTi817yv.lean.js → skills_framework-map.md.DDa4MeEW.lean.js} +1 -1
  35. package/dist/docs/building-with-agents.html +4 -4
  36. package/dist/docs/concepts.html +5 -5
  37. package/dist/docs/concepts.md +3 -3
  38. package/dist/docs/deployment.html +4 -4
  39. package/dist/docs/evals.html +4 -4
  40. package/dist/docs/guides/agent-to-agent.html +4 -4
  41. package/dist/docs/guides/cloud-agents.html +35 -0
  42. package/dist/docs/guides/cloud-agents.md +93 -0
  43. package/dist/docs/guides/cloud-runtime.html +6 -6
  44. package/dist/docs/guides/cloud-runtime.md +2 -0
  45. package/dist/docs/guides/convert-automation.html +4 -4
  46. package/dist/docs/guides/github.html +4 -4
  47. package/dist/docs/guides/human-in-the-loop.html +4 -4
  48. package/dist/docs/guides/mcp-oauth.html +4 -4
  49. package/dist/docs/guides/opentelemetry.html +5 -5
  50. package/dist/docs/guides/slack.html +4 -4
  51. package/dist/docs/guides/webhooks.html +4 -4
  52. package/dist/docs/hashmap.json +1 -1
  53. package/dist/docs/hillclimbing.html +4 -4
  54. package/dist/docs/index.html +6 -6
  55. package/dist/docs/index.md +5 -1
  56. package/dist/docs/llms-full.txt +321 -4
  57. package/dist/docs/llms.txt +2 -0
  58. package/dist/docs/quickstart.html +4 -4
  59. package/dist/docs/reference/agent-config.html +4 -4
  60. package/dist/docs/reference/artifacts.html +4 -4
  61. package/dist/docs/reference/channels.html +5 -5
  62. package/dist/docs/reference/cli.html +4 -4
  63. package/dist/docs/reference/connections.html +4 -4
  64. package/dist/docs/reference/extensions.html +82 -0
  65. package/dist/docs/reference/extensions.md +200 -0
  66. package/dist/docs/reference/hooks.html +4 -4
  67. package/dist/docs/reference/http-api.html +4 -4
  68. package/dist/docs/reference/instructions.html +4 -4
  69. package/dist/docs/reference/playground.html +4 -4
  70. package/dist/docs/reference/project-layout.html +6 -6
  71. package/dist/docs/reference/project-layout.md +3 -0
  72. package/dist/docs/reference/prompt.html +4 -4
  73. package/dist/docs/reference/schedules.html +4 -4
  74. package/dist/docs/reference/sessions.html +4 -4
  75. package/dist/docs/reference/skills.html +6 -6
  76. package/dist/docs/reference/skills.md +2 -0
  77. package/dist/docs/reference/subagents.html +5 -5
  78. package/dist/docs/reference/tools.html +6 -6
  79. package/dist/docs/reference/tools.md +2 -0
  80. package/dist/docs/scaffolding-agents.html +4 -4
  81. package/dist/docs/skills/ab.html +4 -4
  82. package/dist/docs/skills/create-agent.html +4 -4
  83. package/dist/docs/skills/debug.html +4 -4
  84. package/dist/docs/skills/evals.html +4 -4
  85. package/dist/docs/skills/framework-map.html +5 -5
  86. package/dist/docs/skills/framework-map.md +1 -0
  87. package/dist/docs/skills/github.html +4 -4
  88. package/dist/docs/skills/hillclimb.html +4 -4
  89. package/dist/docs/skills/index.html +4 -4
  90. package/dist/docs/skills/mcp-auth.html +4 -4
  91. package/dist/docs/skills/otel.html +4 -4
  92. package/dist/docs/skills/setup-slack.html +4 -4
  93. package/dist/docs/storage.html +4 -4
  94. package/dist/docs/templates/agentic-owners.html +4 -4
  95. package/dist/docs/templates/agents-md.html +4 -4
  96. package/dist/docs/templates/code-wiki.html +4 -4
  97. package/dist/docs/templates/demo.html +4 -4
  98. package/dist/docs/templates/pr-autofixer.html +4 -4
  99. package/dist/docs/templates/security-help.html +4 -4
  100. package/dist/docs/templates/security-reviewer.html +4 -4
  101. package/dist/docs/templates/triage.html +4 -4
  102. package/dist/docs/troubleshooting.html +4 -4
  103. package/dist/extensions/cursor-cloud-agents/extension.d.ts +9 -7
  104. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  105. package/dist/extensions/cursor-cloud-agents/extension.js +9 -7
  106. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +78 -0
  107. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -0
  108. package/dist/extensions/cursor-cloud-agents/lib/backend.js +286 -0
  109. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +5 -0
  110. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -0
  111. package/dist/extensions/cursor-cloud-agents/lib/inputs.js +4 -0
  112. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts +8 -0
  113. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -0
  114. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +15 -0
  115. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +21 -7
  116. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts +4 -0
  117. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts.map +1 -0
  118. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +26 -0
  119. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts +4 -0
  120. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts.map +1 -0
  121. package/dist/extensions/cursor-cloud-agents/tools/dump.js +54 -0
  122. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts +4 -0
  123. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts.map +1 -0
  124. package/dist/extensions/cursor-cloud-agents/tools/get.js +25 -0
  125. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -1
  126. package/dist/extensions/cursor-cloud-agents/tools/launch.js +14 -38
  127. package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
  128. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts +4 -0
  129. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts.map +1 -0
  130. package/dist/extensions/cursor-cloud-agents/tools/{follow_up.js → reply.js} +12 -14
  131. package/dist/extensions.d.ts +38 -14
  132. package/dist/extensions.d.ts.map +1 -1
  133. package/dist/extensions.js +49 -12
  134. package/dist/files-backends/cursor-hosted.d.ts +0 -8
  135. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  136. package/dist/files-backends/cursor-hosted.js +1 -11
  137. package/dist/files.d.ts +5 -1
  138. package/dist/files.d.ts.map +1 -1
  139. package/dist/files.js +22 -18
  140. package/dist/index.d.ts +3 -3
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +2 -2
  143. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  144. package/dist/internal/conversation-mirror.js +13 -15
  145. package/dist/internal/cursor/backend-client.d.ts +8 -1
  146. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  147. package/dist/internal/cursor/backend-client.js +25 -9
  148. package/dist/internal/cursor/hosted-store-secrets.d.ts +11 -0
  149. package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
  150. package/dist/internal/cursor/hosted-store-secrets.js +15 -0
  151. package/dist/internal/discovery/ab.d.ts +9 -0
  152. package/dist/internal/discovery/ab.d.ts.map +1 -0
  153. package/dist/internal/discovery/ab.js +101 -0
  154. package/dist/internal/discovery/agent-config.d.ts +35 -0
  155. package/dist/internal/discovery/agent-config.d.ts.map +1 -0
  156. package/dist/internal/discovery/agent-config.js +173 -0
  157. package/dist/internal/discovery/agent.d.ts +11 -0
  158. package/dist/internal/discovery/agent.d.ts.map +1 -0
  159. package/dist/internal/discovery/agent.js +306 -0
  160. package/dist/internal/discovery/channels.d.ts +10 -0
  161. package/dist/internal/discovery/channels.d.ts.map +1 -0
  162. package/dist/internal/discovery/channels.js +97 -0
  163. package/dist/internal/discovery/connections.d.ts +17 -0
  164. package/dist/internal/discovery/connections.d.ts.map +1 -0
  165. package/dist/internal/discovery/connections.js +436 -0
  166. package/dist/internal/discovery/context.d.ts +20 -0
  167. package/dist/internal/discovery/context.d.ts.map +1 -0
  168. package/dist/internal/discovery/context.js +30 -0
  169. package/dist/internal/discovery/cursor-plugin.d.ts +25 -0
  170. package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -0
  171. package/dist/internal/discovery/cursor-plugin.js +570 -0
  172. package/dist/internal/discovery/extensions.d.ts +19 -0
  173. package/dist/internal/discovery/extensions.d.ts.map +1 -0
  174. package/dist/internal/discovery/extensions.js +238 -0
  175. package/dist/internal/discovery/fs.d.ts +15 -0
  176. package/dist/internal/discovery/fs.d.ts.map +1 -0
  177. package/dist/internal/discovery/fs.js +115 -0
  178. package/dist/internal/discovery/hooks.d.ts +7 -0
  179. package/dist/internal/discovery/hooks.d.ts.map +1 -0
  180. package/dist/internal/discovery/hooks.js +48 -0
  181. package/dist/internal/discovery/info.d.ts +6 -0
  182. package/dist/internal/discovery/info.d.ts.map +1 -0
  183. package/dist/internal/discovery/info.js +141 -0
  184. package/dist/internal/discovery/instructions.d.ts +7 -0
  185. package/dist/internal/discovery/instructions.d.ts.map +1 -0
  186. package/dist/internal/discovery/instructions.js +95 -0
  187. package/dist/internal/discovery/modules.d.ts +20 -0
  188. package/dist/internal/discovery/modules.d.ts.map +1 -0
  189. package/dist/internal/discovery/modules.js +101 -0
  190. package/dist/internal/discovery/names.d.ts +12 -0
  191. package/dist/internal/discovery/names.d.ts.map +1 -0
  192. package/dist/internal/discovery/names.js +36 -0
  193. package/dist/internal/discovery/project.d.ts +53 -0
  194. package/dist/internal/discovery/project.d.ts.map +1 -0
  195. package/dist/internal/discovery/project.js +239 -0
  196. package/dist/internal/discovery/runtime.d.ts +34 -0
  197. package/dist/internal/discovery/runtime.d.ts.map +1 -0
  198. package/dist/internal/discovery/runtime.js +98 -0
  199. package/dist/internal/discovery/schedules.d.ts +7 -0
  200. package/dist/internal/discovery/schedules.d.ts.map +1 -0
  201. package/dist/internal/discovery/schedules.js +97 -0
  202. package/dist/internal/discovery/seed-files.d.ts +7 -0
  203. package/dist/internal/discovery/seed-files.d.ts.map +1 -0
  204. package/dist/internal/discovery/seed-files.js +41 -0
  205. package/dist/internal/discovery/services.d.ts +17 -0
  206. package/dist/internal/discovery/services.d.ts.map +1 -0
  207. package/dist/internal/discovery/services.js +104 -0
  208. package/dist/internal/discovery/skills.d.ts +16 -0
  209. package/dist/internal/discovery/skills.d.ts.map +1 -0
  210. package/dist/internal/discovery/skills.js +151 -0
  211. package/dist/internal/discovery/subagent.d.ts +13 -0
  212. package/dist/internal/discovery/subagent.d.ts.map +1 -0
  213. package/dist/internal/discovery/subagent.js +19 -0
  214. package/dist/internal/discovery/tools.d.ts +18 -0
  215. package/dist/internal/discovery/tools.d.ts.map +1 -0
  216. package/dist/internal/discovery/tools.js +159 -0
  217. package/dist/internal/discovery.d.ts +8 -62
  218. package/dist/internal/discovery.d.ts.map +1 -1
  219. package/dist/internal/discovery.js +8 -2505
  220. package/dist/internal/framework-file-storage.js +6 -6
  221. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  222. package/dist/internal/framework-storage-selection.js +8 -7
  223. package/dist/internal/frontmatter.d.ts +11 -3
  224. package/dist/internal/frontmatter.d.ts.map +1 -1
  225. package/dist/internal/frontmatter.js +29 -3
  226. package/dist/internal/mcp-host.d.ts.map +1 -1
  227. package/dist/internal/mcp-host.js +37 -20
  228. package/dist/internal/otel/collector.d.ts +13 -0
  229. package/dist/internal/otel/collector.d.ts.map +1 -1
  230. package/dist/internal/otel/collector.js +84 -17
  231. package/dist/internal/otel/http.d.ts.map +1 -1
  232. package/dist/internal/otel/http.js +2 -10
  233. package/dist/internal/otel/mcp.d.ts +16 -0
  234. package/dist/internal/otel/mcp.d.ts.map +1 -0
  235. package/dist/internal/otel/mcp.js +68 -0
  236. package/dist/internal/otel/propagation.d.ts +6 -0
  237. package/dist/internal/otel/propagation.d.ts.map +1 -0
  238. package/dist/internal/otel/propagation.js +14 -0
  239. package/dist/internal/otel/runtime.d.ts.map +1 -1
  240. package/dist/internal/otel/runtime.js +2 -0
  241. package/dist/internal/session-engine.d.ts +5 -0
  242. package/dist/internal/session-engine.d.ts.map +1 -1
  243. package/dist/internal/session-engine.js +68 -32
  244. package/dist/internal/session-run-log.d.ts +2 -1
  245. package/dist/internal/session-run-log.d.ts.map +1 -1
  246. package/dist/internal/session-run-log.js +13 -14
  247. package/dist/internal/start-log-store.d.ts +1 -1
  248. package/dist/internal/start-log-store.d.ts.map +1 -1
  249. package/dist/internal/start-log-store.js +12 -14
  250. package/dist/internal/storage-coordinator.d.ts +4 -1
  251. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  252. package/dist/internal/storage-coordinator.js +15 -13
  253. package/dist/internal/tool-catalog.d.ts.map +1 -1
  254. package/dist/internal/tool-catalog.js +9 -6
  255. package/dist/internal/turn-cost.d.ts +14 -0
  256. package/dist/internal/turn-cost.d.ts.map +1 -1
  257. package/dist/internal/turn-cost.js +41 -9
  258. package/dist/internal/v2-hosting.d.ts +22 -0
  259. package/dist/internal/v2-hosting.d.ts.map +1 -0
  260. package/dist/internal/v2-hosting.js +23 -0
  261. package/dist/otel.d.ts +16 -0
  262. package/dist/otel.d.ts.map +1 -1
  263. package/dist/otel.js +26 -0
  264. package/dist/playground/assets/index-B6C9S9nG.css +1 -0
  265. package/dist/playground/index.html +2 -2
  266. package/dist/storage-protocol.d.ts +24 -23
  267. package/dist/storage-protocol.d.ts.map +1 -1
  268. package/dist/storage-protocol.js +68 -65
  269. package/dist/storage.d.ts +2 -2
  270. package/dist/storage.d.ts.map +1 -1
  271. package/dist/storage.js +1 -1
  272. package/dist/tools.d.ts +9 -0
  273. package/dist/tools.d.ts.map +1 -1
  274. package/dist/tools.js +9 -0
  275. package/dist/types.d.ts +39 -3
  276. package/dist/types.d.ts.map +1 -1
  277. package/docs/README.md +5 -1
  278. package/docs/concepts.md +3 -3
  279. package/docs/guides/cloud-agents.md +98 -0
  280. package/docs/guides/cloud-runtime.md +2 -0
  281. package/docs/reference/extensions.md +205 -0
  282. package/docs/reference/project-layout.md +3 -0
  283. package/docs/reference/skills.md +2 -0
  284. package/docs/reference/tools.md +2 -0
  285. package/package.json +1 -1
  286. package/skills/framework-map/SKILL.md +1 -0
  287. package/src/channels/slack/api.ts +4 -2
  288. package/src/channels/slack/assistant.ts +1 -1
  289. package/src/channels/slack/dispatch.ts +27 -2
  290. package/src/channels/slack/inbound.ts +37 -0
  291. package/src/channels/slack/manifest.ts +2 -1
  292. package/src/extensions/cursor-cloud-agents/extension.ts +9 -7
  293. package/src/extensions/cursor-cloud-agents/lib/backend.ts +395 -0
  294. package/src/extensions/cursor-cloud-agents/lib/inputs.ts +5 -0
  295. package/src/extensions/cursor-cloud-agents/lib/transcript.ts +23 -0
  296. package/src/extensions/cursor-cloud-agents/skills/handoff.md +21 -7
  297. package/src/extensions/cursor-cloud-agents/tools/cancel.ts +19 -0
  298. package/src/extensions/cursor-cloud-agents/tools/dump.ts +51 -0
  299. package/src/extensions/cursor-cloud-agents/tools/get.ts +18 -0
  300. package/src/extensions/cursor-cloud-agents/tools/launch.ts +22 -42
  301. package/src/extensions/cursor-cloud-agents/tools/list.ts +1 -1
  302. package/src/extensions/cursor-cloud-agents/tools/reply.ts +34 -0
  303. package/src/extensions.ts +55 -12
  304. package/src/files-backends/cursor-hosted.ts +1 -17
  305. package/src/files.ts +43 -34
  306. package/src/index.ts +10 -1
  307. package/src/internal/conversation-mirror.ts +23 -18
  308. package/src/internal/cursor/backend-client.ts +32 -10
  309. package/src/internal/cursor/hosted-store-secrets.ts +27 -0
  310. package/src/internal/discovery/ab.ts +111 -0
  311. package/src/internal/discovery/agent-config.ts +222 -0
  312. package/src/internal/discovery/agent.ts +360 -0
  313. package/src/internal/discovery/channels.ts +103 -0
  314. package/src/internal/discovery/connections.ts +540 -0
  315. package/src/internal/discovery/context.ts +46 -0
  316. package/src/internal/discovery/cursor-plugin.ts +708 -0
  317. package/src/internal/discovery/extensions.ts +348 -0
  318. package/src/internal/discovery/fs.ts +108 -0
  319. package/src/internal/discovery/hooks.ts +45 -0
  320. package/src/internal/discovery/info.ts +179 -0
  321. package/src/internal/discovery/instructions.ts +113 -0
  322. package/src/internal/discovery/modules.ts +107 -0
  323. package/src/internal/discovery/names.ts +44 -0
  324. package/src/internal/discovery/project.ts +270 -0
  325. package/src/internal/discovery/runtime.ts +159 -0
  326. package/src/internal/discovery/schedules.ts +94 -0
  327. package/src/internal/discovery/seed-files.ts +37 -0
  328. package/src/internal/discovery/services.ts +124 -0
  329. package/src/internal/discovery/skills.ts +176 -0
  330. package/src/internal/discovery/subagent.ts +29 -0
  331. package/src/internal/discovery/tools.ts +182 -0
  332. package/src/internal/discovery.ts +20 -3081
  333. package/src/internal/framework-file-storage.ts +6 -6
  334. package/src/internal/framework-storage-selection.ts +9 -9
  335. package/src/internal/frontmatter.ts +36 -3
  336. package/src/internal/mcp-host.ts +84 -31
  337. package/src/internal/otel/collector.ts +125 -25
  338. package/src/internal/otel/http.ts +2 -12
  339. package/src/internal/otel/mcp.ts +69 -0
  340. package/src/internal/otel/propagation.ts +17 -0
  341. package/src/internal/otel/runtime.ts +2 -0
  342. package/src/internal/session-engine.ts +96 -11
  343. package/src/internal/session-run-log.ts +17 -16
  344. package/src/internal/start-log-store.ts +13 -16
  345. package/src/internal/storage-coordinator.ts +19 -16
  346. package/src/internal/tool-catalog.ts +9 -6
  347. package/src/internal/turn-cost.ts +47 -4
  348. package/src/internal/v2-hosting.ts +38 -0
  349. package/src/otel.ts +38 -0
  350. package/src/storage-protocol.ts +101 -91
  351. package/src/storage.ts +4 -0
  352. package/src/tools.ts +18 -0
  353. package/src/types.ts +43 -2
  354. package/dist/docs/assets/chunks/@localSearchIndexroot.DbFXINq2.js +0 -1
  355. package/dist/docs/assets/concepts.md.lwAgBIMI.js +0 -1
  356. package/dist/docs/assets/index.md.Bb4k8kUm.js +0 -5
  357. package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +0 -1
  358. package/dist/extensions/cursor-cloud-agents/lib/cloud.d.ts +0 -30
  359. package/dist/extensions/cursor-cloud-agents/lib/cloud.d.ts.map +0 -1
  360. package/dist/extensions/cursor-cloud-agents/lib/cloud.js +0 -45
  361. package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts +0 -4
  362. package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts.map +0 -1
  363. package/dist/extensions/cursor-cloud-agents/tools/status.d.ts +0 -4
  364. package/dist/extensions/cursor-cloud-agents/tools/status.d.ts.map +0 -1
  365. package/dist/extensions/cursor-cloud-agents/tools/status.js +0 -41
  366. package/dist/playground/assets/index-DBQCwFp0.css +0 -1
  367. package/src/extensions/cursor-cloud-agents/lib/cloud.ts +0 -79
  368. package/src/extensions/cursor-cloud-agents/tools/follow_up.ts +0 -29
  369. package/src/extensions/cursor-cloud-agents/tools/status.ts +0 -39
  370. /package/dist/docs/assets/{concepts.md.lwAgBIMI.lean.js → concepts.md.rPzW2HZN.lean.js} +0 -0
  371. /package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.lean.js → guides_cloud-runtime.md.BRirbRAN.lean.js} +0 -0
  372. /package/dist/docs/assets/{reference_skills.md.BFW9retM.lean.js → reference_skills.md.l2ezAcaN.lean.js} +0 -0
  373. /package/dist/docs/assets/{reference_tools.md.CvAHsdSp.lean.js → reference_tools.md.B1up2r9W.lean.js} +0 -0
  374. /package/dist/playground/assets/{index-BnNN1-EK.js → index-ZqNoT8Ie.js} +0 -0
@@ -34,6 +34,7 @@ import {
34
34
  isCursorHostedFilesAvailable,
35
35
  isCursorUserStoreFilesAvailable,
36
36
  } from "../files-backends/cursor-hosted.js";
37
+ import { storageKeysForArchitecture } from "../storage.js";
37
38
  import {
38
39
  type AgentProject,
39
40
  type AgentRuntime,
@@ -168,6 +169,7 @@ import {
168
169
  import { TurnGovernor } from "./turn-governor.js";
169
170
  import { TurnLeaseStore } from "./turn-lease-store.js";
170
171
  import { TurnOutbox } from "./turn-outbox.js";
172
+ import { resolveAgentV2Hosting } from "./v2-hosting.js";
171
173
  import {
172
174
  buildAgentsMdContent,
173
175
  buildCloudMemorySection,
@@ -537,20 +539,36 @@ export class SessionEngine {
537
539
  agentName: options.project.name,
538
540
  projectRoot: options.project.rootDir,
539
541
  logger: this.logger,
542
+ keys: storageKeysForArchitecture(
543
+ options.project.agent.architecture
544
+ ),
540
545
  });
541
546
  this.kvApi = createHostKvApi({
542
547
  agentName: options.project.name,
543
548
  stateRoot: options.stateRoot,
544
549
  ...(this.storage === undefined ? {} : { storage: this.storage }),
545
550
  });
551
+ const v2Hosting = resolveAgentV2Hosting({
552
+ architecture: options.project.agent.architecture,
553
+ });
554
+ const managedV2Files =
555
+ v2Hosting.kind === "cursor-managed"
556
+ ? () =>
557
+ cursorHostedFiles({
558
+ resolveStoreSourceId: () =>
559
+ v2Hosting.resolveStoreIds().deploymentStoreSourceId,
560
+ })
561
+ : undefined;
546
562
  this.filesApi = createHostFilesApi({
547
563
  agentName: options.project.name,
548
564
  stateRoot: options.stateRoot,
565
+ sink: managedV2Files?.(),
549
566
  });
550
567
  this.artifactsStore = new ArtifactsStore({
551
568
  stateRoot: options.stateRoot,
552
569
  agentName: options.project.name,
553
570
  config: options.project.artifacts,
571
+ sink: managedV2Files?.(),
554
572
  });
555
573
  this.abCollector = new ABCollector(
556
574
  options.project.abs,
@@ -2148,7 +2166,20 @@ export class SessionEngine {
2148
2166
  label: string;
2149
2167
  }
2150
2168
  | undefined {
2151
- if (isCursorHostedFilesAvailable()) {
2169
+ const v2Hosting = resolveAgentV2Hosting({
2170
+ architecture: this.project.agent.architecture,
2171
+ });
2172
+ if (v2Hosting.kind === "cursor-managed") {
2173
+ return {
2174
+ sink: cursorHostedFiles({
2175
+ resolveStoreSourceId: () =>
2176
+ v2Hosting.resolveStoreIds().deploymentStoreSourceId,
2177
+ }),
2178
+ skillsPrefix: agentStoreKeys.skillsPrefix(),
2179
+ label: "deployment store",
2180
+ };
2181
+ }
2182
+ if (v2Hosting.kind === "not-v2" && isCursorHostedFilesAvailable()) {
2152
2183
  return {
2153
2184
  sink: cursorHostedFiles(),
2154
2185
  skillsPrefix: agentStoreKeys.skillsPrefix(),
@@ -2747,6 +2778,7 @@ export class SessionEngine {
2747
2778
  this.getChannelSession(channelId, sessionId),
2748
2779
  emit: args.emit,
2749
2780
  now: sessionClock(args.record.asOf),
2781
+ ...(args.record.asOf === undefined ? {} : { asOf: args.record.asOf }),
2750
2782
  };
2751
2783
  try {
2752
2784
  // Before the approval gate: a dry run is unattended, so parking a write
@@ -2815,15 +2847,24 @@ export class SessionEngine {
2815
2847
  }
2816
2848
  const started = Date.now();
2817
2849
  this.logger(`[session] tool ${args.tool.name} start`);
2818
- const result = await mcpAuthAls.run(
2850
+ const result = await this.runToolExecute(
2819
2851
  {
2820
- sessionId: args.record.sessionId,
2852
+ record: args.record,
2821
2853
  turnId: args.turnId,
2822
2854
  callId: toolCallId,
2823
2855
  toolName: args.tool.name,
2824
- emit: args.emit,
2825
2856
  },
2826
- () => execute(validation.value as never, toolCtx)
2857
+ () =>
2858
+ mcpAuthAls.run(
2859
+ {
2860
+ sessionId: args.record.sessionId,
2861
+ turnId: args.turnId,
2862
+ callId: toolCallId,
2863
+ toolName: args.tool.name,
2864
+ emit: args.emit,
2865
+ },
2866
+ () => execute(validation.value as never, toolCtx)
2867
+ )
2827
2868
  );
2828
2869
  this.logger(
2829
2870
  `[session] tool ${args.tool.name} done (${Date.now() - started}ms)`
@@ -2839,6 +2880,36 @@ export class SessionEngine {
2839
2880
  }
2840
2881
  }
2841
2882
 
2883
+ /**
2884
+ * Bind outbound inject (Factory / Cursor API `traceparent`) to the
2885
+ * tool span. No-op when OTel is off.
2886
+ */
2887
+ private runToolExecute<T>(
2888
+ args: {
2889
+ record: SessionRecord;
2890
+ turnId: string;
2891
+ callId: string;
2892
+ toolName: string;
2893
+ },
2894
+ fn: () => T | Promise<T>
2895
+ ): Promise<T> {
2896
+ const otel = this.otel;
2897
+ const run = (): Promise<T> => Promise.resolve(fn());
2898
+ if (otel === undefined) {
2899
+ return run();
2900
+ }
2901
+ return otel.runInCall(
2902
+ {
2903
+ sessionId: args.record.sessionId,
2904
+ session: this.sessionInfo(args.record),
2905
+ turnId: args.turnId,
2906
+ callId: args.callId,
2907
+ toolName: args.toolName,
2908
+ },
2909
+ run
2910
+ );
2911
+ }
2912
+
2842
2913
  /**
2843
2914
  * Park a server-tool call until a human approves or denies. Emits
2844
2915
  * `action.approval_requested` / `action.approval_resolved` on the
@@ -3712,20 +3783,34 @@ export class SessionEngine {
3712
3783
  this.getChannelSession(channelId, sessionId),
3713
3784
  emit,
3714
3785
  now: sessionClock(record?.asOf),
3786
+ ...(record?.asOf === undefined ? {} : { asOf: record.asOf }),
3715
3787
  });
3716
- result = normalizeToolResult(
3788
+ const executeBody =
3717
3789
  record !== undefined && emit !== undefined
3718
- ? await mcpAuthAls.run(
3790
+ ? () =>
3791
+ mcpAuthAls.run(
3792
+ {
3793
+ sessionId: record.sessionId,
3794
+ turnId: callId,
3795
+ callId,
3796
+ toolName,
3797
+ emit,
3798
+ },
3799
+ run
3800
+ )
3801
+ : run;
3802
+ result = normalizeToolResult(
3803
+ record !== undefined
3804
+ ? await this.runToolExecute(
3719
3805
  {
3720
- sessionId: record.sessionId,
3806
+ record,
3721
3807
  turnId: callId,
3722
3808
  callId,
3723
3809
  toolName,
3724
- emit,
3725
3810
  },
3726
- run
3811
+ executeBody
3727
3812
  )
3728
- : await run()
3813
+ : await executeBody()
3729
3814
  );
3730
3815
  isError = isErrorEnvelope(result);
3731
3816
  }
@@ -15,21 +15,19 @@
15
15
  * persist so a store outage never changes the hosted-execution HTTP reply.
16
16
  *
17
17
  * Same flush moments as `hosted-execution.json` and the start.log tee —
18
- * see `hosted-execution-flush.ts`. Keys: {@link storageKeys.sessionRun}.
18
+ * see `hosted-execution-flush.ts`. Keys:
19
+ * {@link agentSdkStorageKeys.sessionRun}.
19
20
  */
20
21
 
21
22
  import type { FileSink } from "../files.js";
22
- import {
23
- cursorFrameworkStoreSourceId,
24
- cursorHostedFiles,
25
- } from "../files-backends/cursor-hosted.js";
26
- import { storageKeys } from "../storage-protocol.js";
23
+ import { cursorHostedFiles } from "../files-backends/cursor-hosted.js";
24
+ import { agentSdkStorageKeys } from "../storage-protocol.js";
27
25
  import type { AgentProject } from "../types.js";
28
26
  import { resolveApiKeySync } from "./cursor/credentials.js";
29
- import { AGENT_SERVE_GENERATION_ENV_VAR } from "./cursor-relay-core.js";
30
27
  import { describeError } from "./describe-error.js";
31
28
  import type { HostedExecutionDiagAbortReason } from "./hosted-execution-diag.js";
32
29
  import type { LogRingEntry } from "./log-ring.js";
30
+ import { resolveAgentV2Hosting } from "./v2-hosting.js";
33
31
 
34
32
  export const SESSION_RUN_LOG_VERSION = 1;
35
33
  /** Last N log-ring lines kept on each execution. */
@@ -442,7 +440,7 @@ export function createSessionRunLogStore(input: {
442
440
  const readDocument = async (
443
441
  sessionPublicId: string
444
442
  ): Promise<SessionRunLogDocument | undefined> => {
445
- const key = storageKeys.sessionRun(agentName, sessionPublicId);
443
+ const key = agentSdkStorageKeys.sessionRun(agentName, sessionPublicId);
446
444
  const body = await sink.get(key);
447
445
  if (body === undefined) {
448
446
  return undefined;
@@ -479,7 +477,10 @@ export function createSessionRunLogStore(input: {
479
477
  updatedAt: fitted.writtenAt,
480
478
  executions,
481
479
  });
482
- const key = storageKeys.sessionRun(agentName, document.sessionPublicId);
480
+ const key = agentSdkStorageKeys.sessionRun(
481
+ agentName,
482
+ document.sessionPublicId
483
+ );
483
484
  try {
484
485
  await sink.put(key, new TextEncoder().encode(JSON.stringify(document)));
485
486
  } catch (error) {
@@ -558,17 +559,17 @@ export function selectSessionRunLogStore(input: {
558
559
  env?: Record<string, string | undefined>;
559
560
  snapshotLogs?: () => readonly LogRingEntry[];
560
561
  }): SessionRunLogStore | undefined {
561
- if (input.project.agent.architecture !== "v2") {
562
- return undefined;
563
- }
564
- const env = input.env ?? process.env;
565
- if (env[AGENT_SERVE_GENERATION_ENV_VAR] === undefined) {
562
+ const hosting = resolveAgentV2Hosting({
563
+ architecture: input.project.agent.architecture,
564
+ env: input.env as NodeJS.ProcessEnv | undefined,
565
+ });
566
+ if (hosting.kind !== "cursor-managed") {
566
567
  return undefined;
567
568
  }
568
- const envSnapshot = env as NodeJS.ProcessEnv;
569
569
  return createSessionRunLogStore({
570
570
  sink: cursorHostedFiles({
571
- resolveStoreSourceId: () => cursorFrameworkStoreSourceId(envSnapshot),
571
+ resolveStoreSourceId: () =>
572
+ hosting.resolveStoreIds().frameworkStoreSourceId,
572
573
  resolveApiKey: () => resolveApiKeySync()?.apiKey,
573
574
  }),
574
575
  agentName: input.project.name,
@@ -8,21 +8,18 @@
8
8
  * after park/discard.
9
9
  *
10
10
  * Same flush moments as `hosted-execution.json` and session-runs —
11
- * see `hosted-execution-flush.ts`. Keys: {@link storageKeys.log}.
11
+ * see `hosted-execution-flush.ts`. Keys: {@link agentSdkStorageKeys.log}.
12
12
  * Values are raw UTF-8, not JSON.
13
13
  */
14
14
 
15
15
  import { readFile } from "node:fs/promises";
16
16
  import type { FileSink } from "../files.js";
17
- import {
18
- cursorFrameworkStoreSourceId,
19
- cursorHostedFiles,
20
- } from "../files-backends/cursor-hosted.js";
21
- import { storageKeys } from "../storage-protocol.js";
17
+ import { cursorHostedFiles } from "../files-backends/cursor-hosted.js";
18
+ import { agentSdkStorageKeys } from "../storage-protocol.js";
22
19
  import type { AgentProject } from "../types.js";
23
20
  import { resolveApiKeySync } from "./cursor/credentials.js";
24
- import { AGENT_SERVE_GENERATION_ENV_VAR } from "./cursor-relay-core.js";
25
21
  import { describeError } from "./describe-error.js";
22
+ import { resolveAgentV2Hosting } from "./v2-hosting.js";
26
23
 
27
24
  /**
28
25
  * Last N bytes flushed to the store. Matches the Temporal catch-up cap
@@ -102,7 +99,7 @@ export function createStartLogStore(input: {
102
99
 
103
100
  return {
104
101
  async persist(startLogId, contents) {
105
- const key = storageKeys.log(agentName, startLogId);
102
+ const key = agentSdkStorageKeys.log(agentName, startLogId);
106
103
  const body = tailStartLogText(contents, START_LOG_STORE_MAX_BYTES);
107
104
  try {
108
105
  await sink.put(key, new TextEncoder().encode(body));
@@ -114,7 +111,7 @@ export function createStartLogStore(input: {
114
111
  },
115
112
 
116
113
  async read(startLogId) {
117
- const key = storageKeys.log(agentName, startLogId);
114
+ const key = agentSdkStorageKeys.log(agentName, startLogId);
118
115
  try {
119
116
  const body = await sink.get(key);
120
117
  if (body === undefined) {
@@ -140,17 +137,17 @@ export function selectStartLogStore(input: {
140
137
  logger?: (line: string) => void;
141
138
  env?: Record<string, string | undefined>;
142
139
  }): StartLogStore | undefined {
143
- if (input.project.agent.architecture !== "v2") {
144
- return undefined;
145
- }
146
- const env = input.env ?? process.env;
147
- if (env[AGENT_SERVE_GENERATION_ENV_VAR] === undefined) {
140
+ const hosting = resolveAgentV2Hosting({
141
+ architecture: input.project.agent.architecture,
142
+ env: input.env as NodeJS.ProcessEnv | undefined,
143
+ });
144
+ if (hosting.kind !== "cursor-managed") {
148
145
  return undefined;
149
146
  }
150
- const envSnapshot = env as NodeJS.ProcessEnv;
151
147
  return createStartLogStore({
152
148
  sink: cursorHostedFiles({
153
- resolveStoreSourceId: () => cursorFrameworkStoreSourceId(envSnapshot),
149
+ resolveStoreSourceId: () =>
150
+ hosting.resolveStoreIds().frameworkStoreSourceId,
154
151
  resolveApiKey: () => resolveApiKeySync()?.apiKey,
155
152
  }),
156
153
  agentName: input.project.name,
@@ -31,6 +31,7 @@ import {
31
31
  type StorageContext,
32
32
  type StorageDefinition,
33
33
  type StorageEntry,
34
+ type StorageKeys,
34
35
  storageKeys,
35
36
  } from "../storage.js";
36
37
  import { isCursorHostedStorage } from "../storage-backends/cursor-hosted.js";
@@ -79,7 +80,7 @@ const AB_SNAPSHOT_MIN_INTERVAL_MS = 60_000;
79
80
 
80
81
  /** One queued sink call (KV put/delete or a dedicated-table write). */
81
82
  interface StorageOp {
82
- /** Human-readable op label for failure logs, e.g. `put(agentkit/v1/...)`. */
83
+ /** Human-readable op label for failure logs, e.g. `put({root}/...)`. */
83
84
  label: string;
84
85
  run: (ctx: StorageContext) => void | Promise<void>;
85
86
  }
@@ -89,6 +90,8 @@ export interface StorageCoordinatorOptions {
89
90
  agentName: string;
90
91
  projectRoot: string;
91
92
  logger: (line: string) => void;
93
+ /** Defaults to the architecture-v1 key contract. */
94
+ keys?: StorageKeys;
92
95
  }
93
96
 
94
97
  interface SessionBuffer {
@@ -116,6 +119,7 @@ export class StorageCoordinator
116
119
  readonly policy: ResolvedStoragePolicy;
117
120
 
118
121
  private readonly definition: StorageDefinition;
122
+ private readonly keys: StorageKeys;
119
123
  private readonly agentName: string;
120
124
  private readonly projectRoot: string;
121
125
  private readonly logger: (line: string) => void;
@@ -137,6 +141,7 @@ export class StorageCoordinator
137
141
 
138
142
  constructor(options: StorageCoordinatorOptions) {
139
143
  this.definition = options.definition;
144
+ this.keys = options.keys ?? storageKeys;
140
145
  this.policy = resolveStoragePolicy(options.definition.policy);
141
146
  this.agentName = options.agentName;
142
147
  this.projectRoot = options.projectRoot;
@@ -215,7 +220,7 @@ export class StorageCoordinator
215
220
  if (first !== undefined) {
216
221
  ops.push(
217
222
  this.putOp(
218
- storageKeys.sessionEvents(this.agentName, sessionId, first.index),
223
+ this.keys.sessionEvents(this.agentName, sessionId, first.index),
219
224
  buffer.events as unknown as JsonValue
220
225
  )
221
226
  );
@@ -223,7 +228,7 @@ export class StorageCoordinator
223
228
  if (buffer.record !== undefined) {
224
229
  ops.push(
225
230
  this.putOp(
226
- storageKeys.session(this.agentName, sessionId),
231
+ this.keys.session(this.agentName, sessionId),
227
232
  buffer.record as unknown as JsonValue
228
233
  )
229
234
  );
@@ -249,14 +254,14 @@ export class StorageCoordinator
249
254
  if (previous != null) {
250
255
  ops.push(
251
256
  this.deleteOp(
252
- storageKeys.continuation(this.agentName, record.channelId, previous)
257
+ this.keys.continuation(this.agentName, record.channelId, previous)
253
258
  )
254
259
  );
255
260
  }
256
261
  if (next != null) {
257
262
  ops.push(
258
263
  this.putOp(
259
- storageKeys.continuation(this.agentName, record.channelId, next),
264
+ this.keys.continuation(this.agentName, record.channelId, next),
260
265
  { sessionId: record.sessionId }
261
266
  )
262
267
  );
@@ -303,9 +308,7 @@ export class StorageCoordinator
303
308
  * serve start.
304
309
  */
305
310
  async listSessions(): Promise<SessionRecord[]> {
306
- const entries = await this.tryList(
307
- storageKeys.sessionPrefix(this.agentName)
308
- );
311
+ const entries = await this.tryList(this.keys.sessionPrefix(this.agentName));
309
312
  return entries
310
313
  .map((entry) => entry.value as unknown as SessionRecord)
311
314
  .filter((record) => record != null);
@@ -322,7 +325,7 @@ export class StorageCoordinator
322
325
  throw new Error("storage sink has no list");
323
326
  }
324
327
  const entries = await list(
325
- storageKeys.sessionPrefix(this.agentName),
328
+ this.keys.sessionPrefix(this.agentName),
326
329
  this.context("restore")
327
330
  );
328
331
  if (!Array.isArray(entries)) {
@@ -345,7 +348,7 @@ export class StorageCoordinator
345
348
  return undefined;
346
349
  }
347
350
  const entries = await listNewest(
348
- storageKeys.sessionPrefix(this.agentName),
351
+ this.keys.sessionPrefix(this.agentName),
349
352
  limit,
350
353
  this.context("restore")
351
354
  );
@@ -362,7 +365,7 @@ export class StorageCoordinator
362
365
  */
363
366
  async listSessionEvents(sessionId: string): Promise<SessionEvent[]> {
364
367
  const entries = await this.tryList(
365
- storageKeys.sessionEventsPrefix(this.agentName, sessionId)
368
+ this.keys.sessionEventsPrefix(this.agentName, sessionId)
366
369
  );
367
370
  const events: SessionEvent[] = [];
368
371
  for (const entry of entries) {
@@ -389,7 +392,7 @@ export class StorageCoordinator
389
392
  }
390
393
  const ctx = this.context("restore");
391
394
  const record = (await get(
392
- storageKeys.session(this.agentName, sessionId),
395
+ this.keys.session(this.agentName, sessionId),
393
396
  ctx
394
397
  )) as SessionRecord | null | undefined;
395
398
  if (record == null) {
@@ -422,7 +425,7 @@ export class StorageCoordinator
422
425
  }
423
426
  const ctx = this.context("restore");
424
427
  const pointer = await get(
425
- storageKeys.continuation(this.agentName, channelId, continuationKey),
428
+ this.keys.continuation(this.agentName, channelId, continuationKey),
426
429
  ctx
427
430
  );
428
431
  if (pointer == null) {
@@ -482,7 +485,7 @@ export class StorageCoordinator
482
485
  if (get === undefined) {
483
486
  throw new Error("storage get is not configured");
484
487
  }
485
- const key = storageKeys.kv(this.agentName, authorKey);
488
+ const key = this.keys.kv(this.agentName, authorKey);
486
489
  // Preserve stored JSON `null` (distinct from a missing key).
487
490
  return await get(key, this.context("restore"));
488
491
  }
@@ -492,13 +495,13 @@ export class StorageCoordinator
492
495
  * at-most-once delivery queue) so callers observe durable success/failure.
493
496
  */
494
497
  async kvPut(authorKey: string, value: JsonValue): Promise<void> {
495
- const key = storageKeys.kv(this.agentName, authorKey);
498
+ const key = this.keys.kv(this.agentName, authorKey);
496
499
  await this.definition.put(key, value, this.context("policy"));
497
500
  }
498
501
 
499
502
  /** Awaited author KV delete. No-op when the sink omits `delete`. */
500
503
  async kvDelete(authorKey: string): Promise<void> {
501
- const key = storageKeys.kv(this.agentName, authorKey);
504
+ const key = this.keys.kv(this.agentName, authorKey);
502
505
  await this.definition.delete?.(key, this.context("policy"));
503
506
  }
504
507
 
@@ -23,13 +23,16 @@ import type {
23
23
  * presentation concern is not worth the authoring surface).
24
24
  */
25
25
  const WELL_KNOWN_TOOL_TITLES: Readonly<Record<string, string>> = {
26
- diff: "Show change diffs",
27
- glob: "Find files by pattern",
28
- grep: "Search file contents",
29
- ls: "List a directory",
30
- read: "Read a file",
26
+ Delete: "Delete a file",
27
+ Diff: "Show change diffs",
28
+ Glob: "Find files by pattern",
29
+ Grep: "Search file contents",
30
+ LS: "List a directory",
31
+ Read: "Read a file",
32
+ StrReplace: "Replace text in a file",
33
+ Write: "Write a file",
34
+ script: "Run a TypeScript program",
31
35
  search: "Search with a typed query",
32
- write: "Write a file",
33
36
  };
34
37
 
35
38
  function catalogTitle(tool: DiscoveredTool): string | undefined {
@@ -28,6 +28,45 @@ export function modelSettingId(model: ModelSetting): string {
28
28
  return typeof model === "string" ? model : model.id;
29
29
  }
30
30
 
31
+ /**
32
+ * This estimate-cost client treats OpenAI-compat usage as **provider-gross**
33
+ * (local playground: `prompt_tokens` includes `cachedPromptTokens`). Catalog
34
+ * `costForBaseTier` assumes Anthropic / billing-style disjoint nets and ADDs
35
+ * `cacheRead × cachedRate` on top of `input × inputRate`, so we send
36
+ * `input − cache` for Grok / xAI / GPT / o-series.
37
+ *
38
+ * Non-OpenAI-compat models are left alone. `input < cache` is only a
39
+ * defensive clamp (avoid a negative uncached count), not a detector for
40
+ * billed / openaiProxy-shaped tokens. Cloud catalog fallback with already-
41
+ * netted OpenAI-compat usage is out of scope here.
42
+ */
43
+ export function isOpenAiCompatGrossCacheModel(model: ModelSetting): boolean {
44
+ const id = modelSettingId(model).toLowerCase();
45
+ return (
46
+ id.includes("grok") ||
47
+ id.includes("xai") ||
48
+ id.includes("gpt") ||
49
+ /(^|[-_/])o[1-9]/.test(id)
50
+ );
51
+ }
52
+
53
+ export function toCatalogDisjointUsage(
54
+ usage: TurnUsage,
55
+ model?: ModelSetting
56
+ ): TurnUsage {
57
+ if (model === undefined || !isOpenAiCompatGrossCacheModel(model)) {
58
+ return usage;
59
+ }
60
+ const cachedTokens = usage.cacheReadTokens + usage.cacheWriteTokens;
61
+ if (cachedTokens === 0 || usage.inputTokens < cachedTokens) {
62
+ return usage;
63
+ }
64
+ return {
65
+ ...usage,
66
+ inputTokens: usage.inputTokens - cachedTokens,
67
+ };
68
+ }
69
+
31
70
  export function roundCostUsd(usd: number): number {
32
71
  return Math.round(usd * 1e6) / 1e6;
33
72
  }
@@ -67,6 +106,10 @@ export async function estimateTurnCostFromApi(
67
106
  return undefined;
68
107
  }
69
108
  const model = modelSettingId(input.model);
109
+ const catalogUsage =
110
+ input.usage === undefined
111
+ ? undefined
112
+ : toCatalogDisjointUsage(input.usage, input.model);
70
113
  const response = await fetch(
71
114
  `${cursorExternalApiUrl()}/v1/models/estimate-cost`,
72
115
  {
@@ -77,10 +120,10 @@ export async function estimateTurnCostFromApi(
77
120
  },
78
121
  body: JSON.stringify({
79
122
  model,
80
- inputTokens: input.usage?.inputTokens,
81
- outputTokens: input.usage?.outputTokens,
82
- cacheReadTokens: input.usage?.cacheReadTokens,
83
- cacheWriteTokens: input.usage?.cacheWriteTokens,
123
+ inputTokens: catalogUsage?.inputTokens,
124
+ outputTokens: catalogUsage?.outputTokens,
125
+ cacheReadTokens: catalogUsage?.cacheReadTokens,
126
+ cacheWriteTokens: catalogUsage?.cacheWriteTokens,
84
127
  agentId: input.agentId,
85
128
  conversationId: input.conversationId,
86
129
  runId: input.runId,
@@ -0,0 +1,38 @@
1
+ import type { AgentArchitecture } from "../types.js";
2
+ import {
3
+ type CursorManagedV2StoreIds,
4
+ requireCursorManagedV2StoreIdsSync,
5
+ } from "./cursor/hosted-store-secrets.js";
6
+ import { AGENT_SERVE_GENERATION_ENV_VAR } from "./cursor-relay-core.js";
7
+
8
+ export type AgentV2Hosting =
9
+ | { kind: "not-v2" }
10
+ | { kind: "self-hosted" }
11
+ | {
12
+ kind: "cursor-managed";
13
+ resolveStoreIds: () => CursorManagedV2StoreIds;
14
+ };
15
+
16
+ /**
17
+ * Close the architecture/hosting inputs into a compiler-owned union.
18
+ *
19
+ * Managed freeze processes exist before task bind, so store resolution stays
20
+ * lazy. Consumers can branch once on `kind`; managed storage operations then
21
+ * receive a resolver whose successful result always contains both ids.
22
+ */
23
+ export function resolveAgentV2Hosting(input: {
24
+ architecture: AgentArchitecture | undefined;
25
+ env?: NodeJS.ProcessEnv;
26
+ }): AgentV2Hosting {
27
+ if (input.architecture !== "v2") {
28
+ return { kind: "not-v2" };
29
+ }
30
+ const env = input.env ?? process.env;
31
+ if (env[AGENT_SERVE_GENERATION_ENV_VAR] === undefined) {
32
+ return { kind: "self-hosted" };
33
+ }
34
+ return {
35
+ kind: "cursor-managed",
36
+ resolveStoreIds: () => requireCursorManagedV2StoreIdsSync(env),
37
+ };
38
+ }
package/src/otel.ts CHANGED
@@ -12,6 +12,7 @@
12
12
  * ```
13
13
  */
14
14
 
15
+ import { context, trace } from "@opentelemetry/api";
15
16
  import { brandDefinition } from "./internal/brand.js";
16
17
 
17
18
  export type OtelSignal = "traces" | "metrics" | "logs";
@@ -153,3 +154,40 @@ function assertSampleRatio(traces: OtelConfig["traces"]): void {
153
154
  throw new Error("defineOtel: traces.sampleRatio must be in [0, 1]");
154
155
  }
155
156
  }
157
+
158
+ export const TRACEPARENT_HEADER = "traceparent";
159
+ /** Cursor backend prefers this; `remoteSpanContextFromRequest` falls back to W3C. */
160
+ export const BACKEND_TRACEPARENT_HEADER = "backend-traceparent";
161
+
162
+ export function formatTraceparent(spanContext: {
163
+ traceId: string;
164
+ spanId: string;
165
+ traceFlags: number;
166
+ }): string | undefined {
167
+ if (!trace.isSpanContextValid(spanContext)) {
168
+ return undefined;
169
+ }
170
+ return `00-${spanContext.traceId}-${
171
+ spanContext.spanId
172
+ }-${spanContext.traceFlags.toString(16).padStart(2, "0")}`;
173
+ }
174
+
175
+ /**
176
+ * Copy the active span onto outbound headers as W3C `traceparent` and
177
+ * Cursor `backend-traceparent`. No-op when no valid span is active.
178
+ */
179
+ export function injectActiveTraceContext(headers: {
180
+ get(name: string): string | null;
181
+ set(name: string, value: string): void;
182
+ }): void {
183
+ const span = trace.getSpan(context.active());
184
+ if (span === undefined) {
185
+ return;
186
+ }
187
+ const traceparent = formatTraceparent(span.spanContext());
188
+ if (traceparent === undefined) {
189
+ return;
190
+ }
191
+ headers.set(TRACEPARENT_HEADER, traceparent);
192
+ headers.set(BACKEND_TRACEPARENT_HEADER, traceparent);
193
+ }