@cursor/july 0.1.100 → 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 (484) hide show
  1. package/README.md +27 -0
  2. package/dist/bin/agent-serve.js +3 -2
  3. package/dist/channels/deployments/deployments-channel.d.ts +41 -5
  4. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  5. package/dist/channels/deployments/deployments-channel.js +88 -8
  6. package/dist/channels/deployments/types.d.ts +4 -3
  7. package/dist/channels/deployments/types.d.ts.map +1 -1
  8. package/dist/channels/origin/defaults.d.ts +43 -0
  9. package/dist/channels/origin/defaults.d.ts.map +1 -0
  10. package/dist/channels/origin/defaults.js +111 -0
  11. package/dist/channels/origin/index.d.ts +2 -0
  12. package/dist/channels/origin/index.d.ts.map +1 -1
  13. package/dist/channels/origin/index.js +2 -0
  14. package/dist/channels/origin/origin-channel.d.ts +2 -1
  15. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  16. package/dist/channels/origin/origin-channel.js +24 -3
  17. package/dist/channels/origin/state.d.ts +32 -0
  18. package/dist/channels/origin/state.d.ts.map +1 -0
  19. package/dist/channels/origin/state.js +23 -0
  20. package/dist/channels/origin/types.d.ts +23 -1
  21. package/dist/channels/origin/types.d.ts.map +1 -1
  22. package/dist/channels/slack/api.d.ts +1 -1
  23. package/dist/channels/slack/api.d.ts.map +1 -1
  24. package/dist/channels/slack/api.js +5 -2
  25. package/dist/channels/slack/assistant.d.ts +1 -1
  26. package/dist/channels/slack/assistant.d.ts.map +1 -1
  27. package/dist/channels/slack/code-fences.d.ts +17 -0
  28. package/dist/channels/slack/code-fences.d.ts.map +1 -0
  29. package/dist/channels/slack/code-fences.js +168 -0
  30. package/dist/channels/slack/dispatch.d.ts +3 -2
  31. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  32. package/dist/channels/slack/dispatch.js +28 -8
  33. package/dist/channels/slack/inbound.d.ts +8 -0
  34. package/dist/channels/slack/inbound.d.ts.map +1 -1
  35. package/dist/channels/slack/inbound.js +28 -0
  36. package/dist/channels/slack/index.d.ts +1 -0
  37. package/dist/channels/slack/index.d.ts.map +1 -1
  38. package/dist/channels/slack/index.js +1 -0
  39. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  40. package/dist/channels/slack/live-delivery.js +11 -4
  41. package/dist/channels/slack/manifest.d.ts.map +1 -1
  42. package/dist/channels/slack/manifest.js +2 -1
  43. package/dist/connections.d.ts +18 -2
  44. package/dist/connections.d.ts.map +1 -1
  45. package/dist/connections.js +18 -2
  46. package/dist/docs/404.html +2 -2
  47. package/dist/docs/ab.html +4 -4
  48. package/dist/docs/assets/{app.DZ1e0Ycq.js → app.CLA03RCz.js} +1 -1
  49. package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +1 -0
  50. package/dist/docs/assets/chunks/{VPLocalSearchBox.l8omwc6D.js → VPLocalSearchBox.ifxv-cJV.js} +1 -1
  51. package/dist/docs/assets/chunks/{theme.JVcD6gel.js → theme.DWCwM6p-.js} +2 -2
  52. package/dist/docs/assets/concepts.md.rPzW2HZN.js +1 -0
  53. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +9 -0
  54. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.lean.js +1 -0
  55. package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.js → guides_cloud-runtime.md.BRirbRAN.js} +1 -1
  56. package/dist/docs/assets/index.md.Kiht7ell.js +5 -0
  57. package/dist/docs/assets/{index.md.Bb4k8kUm.lean.js → index.md.Kiht7ell.lean.js} +1 -1
  58. package/dist/docs/assets/{reference_connections.md.BiGoBAk2.js → reference_connections.md.Di6jJAXF.js} +12 -2
  59. package/dist/docs/assets/{reference_connections.md.BiGoBAk2.lean.js → reference_connections.md.Di6jJAXF.lean.js} +1 -1
  60. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.js +56 -0
  61. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +1 -0
  62. package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.js → reference_http-api.md.oySXBO8o.js} +1 -1
  63. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.js → reference_project-layout.md.CA6QP6Lw.js} +2 -2
  64. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.lean.js → reference_project-layout.md.CA6QP6Lw.lean.js} +1 -1
  65. package/dist/docs/assets/{reference_skills.md.BFW9retM.js → reference_skills.md.l2ezAcaN.js} +1 -1
  66. package/dist/docs/assets/{reference_tools.md.CvAHsdSp.js → reference_tools.md.B1up2r9W.js} +1 -1
  67. package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +1 -0
  68. package/dist/docs/assets/{skills_framework-map.md.BTi817yv.lean.js → skills_framework-map.md.DDa4MeEW.lean.js} +1 -1
  69. package/dist/docs/building-with-agents.html +4 -4
  70. package/dist/docs/concepts.html +5 -5
  71. package/dist/docs/concepts.md +3 -3
  72. package/dist/docs/deployment.html +4 -4
  73. package/dist/docs/evals.html +4 -4
  74. package/dist/docs/guides/agent-to-agent.html +4 -4
  75. package/dist/docs/guides/cloud-agents.html +35 -0
  76. package/dist/docs/guides/cloud-agents.md +93 -0
  77. package/dist/docs/guides/cloud-runtime.html +6 -6
  78. package/dist/docs/guides/cloud-runtime.md +2 -0
  79. package/dist/docs/guides/convert-automation.html +4 -4
  80. package/dist/docs/guides/github.html +4 -4
  81. package/dist/docs/guides/human-in-the-loop.html +4 -4
  82. package/dist/docs/guides/mcp-oauth.html +4 -4
  83. package/dist/docs/guides/opentelemetry.html +5 -5
  84. package/dist/docs/guides/slack.html +4 -4
  85. package/dist/docs/guides/webhooks.html +4 -4
  86. package/dist/docs/hashmap.json +1 -1
  87. package/dist/docs/hillclimbing.html +4 -4
  88. package/dist/docs/index.html +6 -6
  89. package/dist/docs/index.md +5 -1
  90. package/dist/docs/llms-full.txt +353 -5
  91. package/dist/docs/llms.txt +2 -0
  92. package/dist/docs/quickstart.html +4 -4
  93. package/dist/docs/reference/agent-config.html +4 -4
  94. package/dist/docs/reference/artifacts.html +4 -4
  95. package/dist/docs/reference/channels.html +5 -5
  96. package/dist/docs/reference/cli.html +4 -4
  97. package/dist/docs/reference/connections.html +16 -6
  98. package/dist/docs/reference/connections.md +31 -0
  99. package/dist/docs/reference/extensions.html +82 -0
  100. package/dist/docs/reference/extensions.md +200 -0
  101. package/dist/docs/reference/hooks.html +4 -4
  102. package/dist/docs/reference/http-api.html +6 -6
  103. package/dist/docs/reference/http-api.md +1 -1
  104. package/dist/docs/reference/instructions.html +4 -4
  105. package/dist/docs/reference/playground.html +4 -4
  106. package/dist/docs/reference/project-layout.html +6 -6
  107. package/dist/docs/reference/project-layout.md +3 -0
  108. package/dist/docs/reference/prompt.html +4 -4
  109. package/dist/docs/reference/schedules.html +4 -4
  110. package/dist/docs/reference/sessions.html +4 -4
  111. package/dist/docs/reference/skills.html +6 -6
  112. package/dist/docs/reference/skills.md +2 -0
  113. package/dist/docs/reference/subagents.html +5 -5
  114. package/dist/docs/reference/tools.html +6 -6
  115. package/dist/docs/reference/tools.md +2 -0
  116. package/dist/docs/scaffolding-agents.html +4 -4
  117. package/dist/docs/skills/ab.html +4 -4
  118. package/dist/docs/skills/create-agent.html +4 -4
  119. package/dist/docs/skills/debug.html +4 -4
  120. package/dist/docs/skills/evals.html +4 -4
  121. package/dist/docs/skills/framework-map.html +5 -5
  122. package/dist/docs/skills/framework-map.md +1 -0
  123. package/dist/docs/skills/github.html +4 -4
  124. package/dist/docs/skills/hillclimb.html +4 -4
  125. package/dist/docs/skills/index.html +4 -4
  126. package/dist/docs/skills/mcp-auth.html +4 -4
  127. package/dist/docs/skills/otel.html +4 -4
  128. package/dist/docs/skills/setup-slack.html +4 -4
  129. package/dist/docs/storage.html +4 -4
  130. package/dist/docs/templates/agentic-owners.html +4 -4
  131. package/dist/docs/templates/agents-md.html +4 -4
  132. package/dist/docs/templates/code-wiki.html +4 -4
  133. package/dist/docs/templates/demo.html +4 -4
  134. package/dist/docs/templates/pr-autofixer.html +4 -4
  135. package/dist/docs/templates/security-help.html +4 -4
  136. package/dist/docs/templates/security-reviewer.html +4 -4
  137. package/dist/docs/templates/triage.html +4 -4
  138. package/dist/docs/troubleshooting.html +4 -4
  139. package/dist/extensions/cursor-cloud-agents/extension.d.ts +57 -0
  140. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -0
  141. package/dist/extensions/cursor-cloud-agents/extension.js +66 -0
  142. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +78 -0
  143. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -0
  144. package/dist/extensions/cursor-cloud-agents/lib/backend.js +286 -0
  145. package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts +25 -0
  146. package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts.map +1 -0
  147. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +85 -0
  148. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +5 -0
  149. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -0
  150. package/dist/extensions/cursor-cloud-agents/lib/inputs.js +4 -0
  151. package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts +15 -0
  152. package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts.map +1 -0
  153. package/dist/extensions/cursor-cloud-agents/lib/repos.js +55 -0
  154. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts +8 -0
  155. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -0
  156. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +15 -0
  157. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +41 -0
  158. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts +4 -0
  159. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts.map +1 -0
  160. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +26 -0
  161. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts +4 -0
  162. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts.map +1 -0
  163. package/dist/extensions/cursor-cloud-agents/tools/dump.js +54 -0
  164. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts +4 -0
  165. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts.map +1 -0
  166. package/dist/extensions/cursor-cloud-agents/tools/get.js +25 -0
  167. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts +4 -0
  168. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -0
  169. package/dist/extensions/cursor-cloud-agents/tools/launch.js +59 -0
  170. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts +4 -0
  171. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -0
  172. package/dist/extensions/cursor-cloud-agents/tools/list.js +36 -0
  173. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts +4 -0
  174. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts.map +1 -0
  175. package/dist/extensions/cursor-cloud-agents/tools/reply.js +35 -0
  176. package/dist/extensions.d.ts +73 -0
  177. package/dist/extensions.d.ts.map +1 -0
  178. package/dist/extensions.js +112 -0
  179. package/dist/files-backends/cursor-hosted.d.ts +0 -8
  180. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  181. package/dist/files-backends/cursor-hosted.js +1 -11
  182. package/dist/files.d.ts +5 -1
  183. package/dist/files.d.ts.map +1 -1
  184. package/dist/files.js +22 -18
  185. package/dist/index.d.ts +4 -3
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +3 -2
  188. package/dist/internal/advertise-tools.d.ts +4 -1
  189. package/dist/internal/advertise-tools.d.ts.map +1 -1
  190. package/dist/internal/advertise-tools.js +20 -1
  191. package/dist/internal/as-of.d.ts +18 -0
  192. package/dist/internal/as-of.d.ts.map +1 -1
  193. package/dist/internal/as-of.js +131 -0
  194. package/dist/internal/cli-deploy.d.ts.map +1 -1
  195. package/dist/internal/cli-deploy.js +64 -19
  196. package/dist/internal/continuation-identity.d.ts.map +1 -1
  197. package/dist/internal/continuation-identity.js +3 -1
  198. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  199. package/dist/internal/conversation-mirror.js +13 -15
  200. package/dist/internal/cursor/backend-client.d.ts +8 -1
  201. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  202. package/dist/internal/cursor/backend-client.js +25 -9
  203. package/dist/internal/cursor/hosted-deployment-secrets.d.ts +16 -0
  204. package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -0
  205. package/dist/internal/cursor/hosted-deployment-secrets.js +61 -0
  206. package/dist/internal/cursor/hosted-store-secrets.d.ts +11 -0
  207. package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
  208. package/dist/internal/cursor/hosted-store-secrets.js +15 -0
  209. package/dist/internal/cursor-deployment-relay.d.ts +15 -1
  210. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  211. package/dist/internal/cursor-deployment-relay.js +46 -7
  212. package/dist/internal/deploy-client.d.ts +23 -0
  213. package/dist/internal/deploy-client.d.ts.map +1 -1
  214. package/dist/internal/deploy-client.js +54 -12
  215. package/dist/internal/discovery/ab.d.ts +9 -0
  216. package/dist/internal/discovery/ab.d.ts.map +1 -0
  217. package/dist/internal/discovery/ab.js +101 -0
  218. package/dist/internal/discovery/agent-config.d.ts +35 -0
  219. package/dist/internal/discovery/agent-config.d.ts.map +1 -0
  220. package/dist/internal/discovery/agent-config.js +173 -0
  221. package/dist/internal/discovery/agent.d.ts +11 -0
  222. package/dist/internal/discovery/agent.d.ts.map +1 -0
  223. package/dist/internal/discovery/agent.js +306 -0
  224. package/dist/internal/discovery/channels.d.ts +10 -0
  225. package/dist/internal/discovery/channels.d.ts.map +1 -0
  226. package/dist/internal/discovery/channels.js +97 -0
  227. package/dist/internal/discovery/connections.d.ts +17 -0
  228. package/dist/internal/discovery/connections.d.ts.map +1 -0
  229. package/dist/internal/discovery/connections.js +436 -0
  230. package/dist/internal/discovery/context.d.ts +20 -0
  231. package/dist/internal/discovery/context.d.ts.map +1 -0
  232. package/dist/internal/discovery/context.js +30 -0
  233. package/dist/internal/discovery/cursor-plugin.d.ts +25 -0
  234. package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -0
  235. package/dist/internal/discovery/cursor-plugin.js +570 -0
  236. package/dist/internal/discovery/extensions.d.ts +19 -0
  237. package/dist/internal/discovery/extensions.d.ts.map +1 -0
  238. package/dist/internal/discovery/extensions.js +238 -0
  239. package/dist/internal/discovery/fs.d.ts +15 -0
  240. package/dist/internal/discovery/fs.d.ts.map +1 -0
  241. package/dist/internal/discovery/fs.js +115 -0
  242. package/dist/internal/discovery/hooks.d.ts +7 -0
  243. package/dist/internal/discovery/hooks.d.ts.map +1 -0
  244. package/dist/internal/discovery/hooks.js +48 -0
  245. package/dist/internal/discovery/info.d.ts +6 -0
  246. package/dist/internal/discovery/info.d.ts.map +1 -0
  247. package/dist/internal/discovery/info.js +141 -0
  248. package/dist/internal/discovery/instructions.d.ts +7 -0
  249. package/dist/internal/discovery/instructions.d.ts.map +1 -0
  250. package/dist/internal/discovery/instructions.js +95 -0
  251. package/dist/internal/discovery/modules.d.ts +20 -0
  252. package/dist/internal/discovery/modules.d.ts.map +1 -0
  253. package/dist/internal/discovery/modules.js +101 -0
  254. package/dist/internal/discovery/names.d.ts +12 -0
  255. package/dist/internal/discovery/names.d.ts.map +1 -0
  256. package/dist/internal/discovery/names.js +36 -0
  257. package/dist/internal/discovery/project.d.ts +53 -0
  258. package/dist/internal/discovery/project.d.ts.map +1 -0
  259. package/dist/internal/discovery/project.js +239 -0
  260. package/dist/internal/discovery/runtime.d.ts +34 -0
  261. package/dist/internal/discovery/runtime.d.ts.map +1 -0
  262. package/dist/internal/discovery/runtime.js +98 -0
  263. package/dist/internal/discovery/schedules.d.ts +7 -0
  264. package/dist/internal/discovery/schedules.d.ts.map +1 -0
  265. package/dist/internal/discovery/schedules.js +97 -0
  266. package/dist/internal/discovery/seed-files.d.ts +7 -0
  267. package/dist/internal/discovery/seed-files.d.ts.map +1 -0
  268. package/dist/internal/discovery/seed-files.js +41 -0
  269. package/dist/internal/discovery/services.d.ts +17 -0
  270. package/dist/internal/discovery/services.d.ts.map +1 -0
  271. package/dist/internal/discovery/services.js +104 -0
  272. package/dist/internal/discovery/skills.d.ts +16 -0
  273. package/dist/internal/discovery/skills.d.ts.map +1 -0
  274. package/dist/internal/discovery/skills.js +151 -0
  275. package/dist/internal/discovery/subagent.d.ts +13 -0
  276. package/dist/internal/discovery/subagent.d.ts.map +1 -0
  277. package/dist/internal/discovery/subagent.js +19 -0
  278. package/dist/internal/discovery/tools.d.ts +18 -0
  279. package/dist/internal/discovery/tools.d.ts.map +1 -0
  280. package/dist/internal/discovery/tools.js +159 -0
  281. package/dist/internal/discovery.d.ts +8 -62
  282. package/dist/internal/discovery.d.ts.map +1 -1
  283. package/dist/internal/discovery.js +8 -2210
  284. package/dist/internal/distribution.d.ts.map +1 -1
  285. package/dist/internal/distribution.js +5 -0
  286. package/dist/internal/framework-file-storage.d.ts +3 -3
  287. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  288. package/dist/internal/framework-file-storage.js +38 -9
  289. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  290. package/dist/internal/framework-storage-selection.js +8 -7
  291. package/dist/internal/frontmatter.d.ts +11 -3
  292. package/dist/internal/frontmatter.d.ts.map +1 -1
  293. package/dist/internal/frontmatter.js +29 -3
  294. package/dist/internal/hosted-delivery.d.ts +3 -1
  295. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  296. package/dist/internal/hosted-delivery.js +19 -32
  297. package/dist/internal/hosted-execution-diag.d.ts +5 -0
  298. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  299. package/dist/internal/hosted-execution-diag.js +5 -0
  300. package/dist/internal/hosted-execution-flush.d.ts +46 -0
  301. package/dist/internal/hosted-execution-flush.d.ts.map +1 -0
  302. package/dist/internal/hosted-execution-flush.js +81 -0
  303. package/dist/internal/mcp-endpoint.js +1 -0
  304. package/dist/internal/mcp-host.d.ts +2 -1
  305. package/dist/internal/mcp-host.d.ts.map +1 -1
  306. package/dist/internal/mcp-host.js +66 -29
  307. package/dist/internal/otel/collector.d.ts +13 -0
  308. package/dist/internal/otel/collector.d.ts.map +1 -1
  309. package/dist/internal/otel/collector.js +84 -17
  310. package/dist/internal/otel/http.d.ts.map +1 -1
  311. package/dist/internal/otel/http.js +2 -10
  312. package/dist/internal/otel/mcp.d.ts +16 -0
  313. package/dist/internal/otel/mcp.d.ts.map +1 -0
  314. package/dist/internal/otel/mcp.js +68 -0
  315. package/dist/internal/otel/propagation.d.ts +6 -0
  316. package/dist/internal/otel/propagation.d.ts.map +1 -0
  317. package/dist/internal/otel/propagation.js +14 -0
  318. package/dist/internal/otel/runtime.d.ts.map +1 -1
  319. package/dist/internal/otel/runtime.js +2 -0
  320. package/dist/internal/review-comments.d.ts +1 -1
  321. package/dist/internal/review-comments.d.ts.map +1 -1
  322. package/dist/internal/review-comments.js +4 -4
  323. package/dist/internal/server.d.ts +3 -0
  324. package/dist/internal/server.d.ts.map +1 -1
  325. package/dist/internal/server.js +79 -104
  326. package/dist/internal/session-engine.d.ts +14 -7
  327. package/dist/internal/session-engine.d.ts.map +1 -1
  328. package/dist/internal/session-engine.js +113 -66
  329. package/dist/internal/session-run-log.d.ts +3 -1
  330. package/dist/internal/session-run-log.d.ts.map +1 -1
  331. package/dist/internal/session-run-log.js +14 -14
  332. package/dist/internal/start-log-store.d.ts +60 -0
  333. package/dist/internal/start-log-store.d.ts.map +1 -0
  334. package/dist/internal/start-log-store.js +149 -0
  335. package/dist/internal/storage-coordinator.d.ts +4 -1
  336. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  337. package/dist/internal/storage-coordinator.js +15 -13
  338. package/dist/internal/tool-catalog.d.ts.map +1 -1
  339. package/dist/internal/tool-catalog.js +9 -6
  340. package/dist/internal/tool-policy.d.ts +8 -0
  341. package/dist/internal/tool-policy.d.ts.map +1 -1
  342. package/dist/internal/tool-policy.js +19 -7
  343. package/dist/internal/turn-cost.d.ts +14 -0
  344. package/dist/internal/turn-cost.d.ts.map +1 -1
  345. package/dist/internal/turn-cost.js +41 -9
  346. package/dist/internal/v2-hosting.d.ts +22 -0
  347. package/dist/internal/v2-hosting.d.ts.map +1 -0
  348. package/dist/internal/v2-hosting.js +23 -0
  349. package/dist/otel.d.ts +16 -0
  350. package/dist/otel.d.ts.map +1 -1
  351. package/dist/otel.js +26 -0
  352. package/dist/playground/assets/index-B6C9S9nG.css +1 -0
  353. package/dist/playground/assets/{index-DVs98vPL.js → index-ZqNoT8Ie.js} +45 -45
  354. package/dist/playground/index.html +2 -2
  355. package/dist/storage-protocol.d.ts +47 -22
  356. package/dist/storage-protocol.d.ts.map +1 -1
  357. package/dist/storage-protocol.js +90 -54
  358. package/dist/storage.d.ts +2 -2
  359. package/dist/storage.d.ts.map +1 -1
  360. package/dist/storage.js +1 -1
  361. package/dist/tools.d.ts +9 -0
  362. package/dist/tools.d.ts.map +1 -1
  363. package/dist/tools.js +9 -0
  364. package/dist/types.d.ts +154 -6
  365. package/dist/types.d.ts.map +1 -1
  366. package/dist/types.js +29 -1
  367. package/docs/README.md +5 -1
  368. package/docs/concepts.md +3 -3
  369. package/docs/guides/cloud-agents.md +98 -0
  370. package/docs/guides/cloud-runtime.md +2 -0
  371. package/docs/reference/connections.md +31 -0
  372. package/docs/reference/extensions.md +205 -0
  373. package/docs/reference/http-api.md +1 -1
  374. package/docs/reference/project-layout.md +3 -0
  375. package/docs/reference/skills.md +2 -0
  376. package/docs/reference/tools.md +2 -0
  377. package/package.json +18 -4
  378. package/skills/framework-map/SKILL.md +1 -0
  379. package/src/bin/agent-serve.ts +11 -2
  380. package/src/channels/deployments/deployments-channel.ts +117 -8
  381. package/src/channels/deployments/types.ts +4 -3
  382. package/src/channels/origin/defaults.ts +143 -0
  383. package/src/channels/origin/index.ts +2 -0
  384. package/src/channels/origin/origin-channel.ts +37 -1
  385. package/src/channels/origin/state.ts +54 -0
  386. package/src/channels/origin/types.ts +24 -0
  387. package/src/channels/slack/api.ts +6 -3
  388. package/src/channels/slack/assistant.ts +1 -1
  389. package/src/channels/slack/code-fences.ts +183 -0
  390. package/src/channels/slack/dispatch.ts +27 -2
  391. package/src/channels/slack/inbound.ts +37 -0
  392. package/src/channels/slack/index.ts +1 -0
  393. package/src/channels/slack/live-delivery.ts +16 -13
  394. package/src/channels/slack/manifest.ts +2 -1
  395. package/src/connections.ts +18 -1
  396. package/src/extensions/cursor-cloud-agents/extension.ts +120 -0
  397. package/src/extensions/cursor-cloud-agents/lib/backend.ts +395 -0
  398. package/src/extensions/cursor-cloud-agents/lib/fleet.ts +109 -0
  399. package/src/extensions/cursor-cloud-agents/lib/inputs.ts +5 -0
  400. package/src/extensions/cursor-cloud-agents/lib/repos.ts +81 -0
  401. package/src/extensions/cursor-cloud-agents/lib/transcript.ts +23 -0
  402. package/src/extensions/cursor-cloud-agents/skills/handoff.md +41 -0
  403. package/src/extensions/cursor-cloud-agents/tools/cancel.ts +19 -0
  404. package/src/extensions/cursor-cloud-agents/tools/dump.ts +51 -0
  405. package/src/extensions/cursor-cloud-agents/tools/get.ts +18 -0
  406. package/src/extensions/cursor-cloud-agents/tools/launch.ts +64 -0
  407. package/src/extensions/cursor-cloud-agents/tools/list.ts +31 -0
  408. package/src/extensions/cursor-cloud-agents/tools/reply.ts +34 -0
  409. package/src/extensions.ts +141 -0
  410. package/src/files-backends/cursor-hosted.ts +1 -17
  411. package/src/files.ts +43 -34
  412. package/src/index.ts +11 -0
  413. package/src/internal/advertise-tools.ts +37 -12
  414. package/src/internal/as-of.ts +163 -0
  415. package/src/internal/cli-deploy.ts +86 -23
  416. package/src/internal/continuation-identity.ts +3 -1
  417. package/src/internal/conversation-mirror.ts +23 -18
  418. package/src/internal/cursor/backend-client.ts +32 -10
  419. package/src/internal/cursor/hosted-deployment-secrets.ts +72 -0
  420. package/src/internal/cursor/hosted-store-secrets.ts +27 -0
  421. package/src/internal/cursor-deployment-relay.ts +65 -8
  422. package/src/internal/deploy-client.ts +73 -18
  423. package/src/internal/discovery/ab.ts +111 -0
  424. package/src/internal/discovery/agent-config.ts +222 -0
  425. package/src/internal/discovery/agent.ts +360 -0
  426. package/src/internal/discovery/channels.ts +103 -0
  427. package/src/internal/discovery/connections.ts +540 -0
  428. package/src/internal/discovery/context.ts +46 -0
  429. package/src/internal/discovery/cursor-plugin.ts +708 -0
  430. package/src/internal/discovery/extensions.ts +348 -0
  431. package/src/internal/discovery/fs.ts +108 -0
  432. package/src/internal/discovery/hooks.ts +45 -0
  433. package/src/internal/discovery/info.ts +179 -0
  434. package/src/internal/discovery/instructions.ts +113 -0
  435. package/src/internal/discovery/modules.ts +107 -0
  436. package/src/internal/discovery/names.ts +44 -0
  437. package/src/internal/discovery/project.ts +270 -0
  438. package/src/internal/discovery/runtime.ts +159 -0
  439. package/src/internal/discovery/schedules.ts +94 -0
  440. package/src/internal/discovery/seed-files.ts +37 -0
  441. package/src/internal/discovery/services.ts +124 -0
  442. package/src/internal/discovery/skills.ts +176 -0
  443. package/src/internal/discovery/subagent.ts +29 -0
  444. package/src/internal/discovery/tools.ts +182 -0
  445. package/src/internal/discovery.ts +20 -2724
  446. package/src/internal/distribution.ts +5 -0
  447. package/src/internal/framework-file-storage.ts +43 -9
  448. package/src/internal/framework-storage-selection.ts +9 -9
  449. package/src/internal/frontmatter.ts +36 -3
  450. package/src/internal/hosted-delivery.ts +38 -63
  451. package/src/internal/hosted-execution-diag.ts +6 -0
  452. package/src/internal/hosted-execution-flush.ts +142 -0
  453. package/src/internal/mcp-endpoint.ts +1 -0
  454. package/src/internal/mcp-host.ts +116 -37
  455. package/src/internal/otel/collector.ts +125 -25
  456. package/src/internal/otel/http.ts +2 -12
  457. package/src/internal/otel/mcp.ts +69 -0
  458. package/src/internal/otel/propagation.ts +17 -0
  459. package/src/internal/otel/runtime.ts +2 -0
  460. package/src/internal/review-comments.ts +5 -2
  461. package/src/internal/server.ts +81 -100
  462. package/src/internal/session-engine.ts +152 -39
  463. package/src/internal/session-run-log.ts +18 -16
  464. package/src/internal/start-log-store.ts +174 -0
  465. package/src/internal/storage-coordinator.ts +19 -16
  466. package/src/internal/tool-catalog.ts +9 -6
  467. package/src/internal/tool-policy.ts +39 -9
  468. package/src/internal/turn-cost.ts +47 -4
  469. package/src/internal/v2-hosting.ts +38 -0
  470. package/src/otel.ts +38 -0
  471. package/src/storage-protocol.ts +126 -79
  472. package/src/storage.ts +5 -0
  473. package/src/tools.ts +18 -0
  474. package/src/types.ts +213 -14
  475. package/dist/docs/assets/chunks/@localSearchIndexroot.j70vvPL4.js +0 -1
  476. package/dist/docs/assets/concepts.md.lwAgBIMI.js +0 -1
  477. package/dist/docs/assets/index.md.Bb4k8kUm.js +0 -5
  478. package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +0 -1
  479. package/dist/playground/assets/index-BszoQDc6.css +0 -1
  480. /package/dist/docs/assets/{concepts.md.lwAgBIMI.lean.js → concepts.md.rPzW2HZN.lean.js} +0 -0
  481. /package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.lean.js → guides_cloud-runtime.md.BRirbRAN.lean.js} +0 -0
  482. /package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.lean.js → reference_http-api.md.oySXBO8o.lean.js} +0 -0
  483. /package/dist/docs/assets/{reference_skills.md.BFW9retM.lean.js → reference_skills.md.l2ezAcaN.lean.js} +0 -0
  484. /package/dist/docs/assets/{reference_tools.md.CvAHsdSp.lean.js → reference_tools.md.B1up2r9W.lean.js} +0 -0
@@ -15,16 +15,22 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
15
15
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
16
16
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
17
17
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
18
- import type {
19
- DiscoveredConnection,
20
- HostMcpCallResult,
21
- HostMcpRegistry,
22
- HostMcpToolInfo,
23
- JsonObject,
24
- McpToolAnnotations,
18
+ import {
19
+ connectionAllowsTool,
20
+ type DiscoveredConnection,
21
+ type HostMcpCallResult,
22
+ type HostMcpRegistry,
23
+ type HostMcpToolInfo,
24
+ type JsonObject,
25
+ type McpToolAnnotations,
25
26
  } from "../types.js";
26
27
  import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
27
28
  import { createHostMcpOAuthProvider } from "./mcp-oauth.js";
29
+ import {
30
+ instrumentedMcpFetch,
31
+ mcpTraceMeta,
32
+ runMcpClientSpan,
33
+ } from "./otel/mcp.js";
28
34
 
29
35
  export class McpNeedsAuthError extends Error {
30
36
  readonly connection: string;
@@ -113,10 +119,17 @@ export class McpHost implements HostMcpRegistry {
113
119
  }
114
120
 
115
121
  async listTools(connectionName: string): Promise<HostMcpToolInfo[]> {
116
- return this.withClient(connectionName, async (client) => {
117
- const listed = await client.listTools();
118
- return listed.tools.map(toToolInfo);
119
- });
122
+ const connection = this.requireConnection(connectionName);
123
+ return runMcpClientSpan(
124
+ { method: "tools/list", connection: connectionName },
125
+ () =>
126
+ this.withClient(connectionName, async (client) => {
127
+ const listed = await client.listTools(mcpListParams());
128
+ return listed.tools
129
+ .map(toToolInfo)
130
+ .filter((tool) => connectionAllowsTool(connection, tool.name));
131
+ })
132
+ );
120
133
  }
121
134
 
122
135
  /**
@@ -142,21 +155,38 @@ export class McpHost implements HostMcpRegistry {
142
155
  };
143
156
  return {
144
157
  listTools: () =>
145
- withFreshClient(async (client) => {
146
- const listed = await client.listTools();
147
- return listed.tools.map(toToolInfo);
148
- }),
149
- callTool: (toolName, args = {}) =>
150
- withFreshClient(async (client) => {
151
- const result = await client.callTool({
152
- name: toolName,
153
- arguments: args,
154
- });
155
- return throwIfCallNeedsAuth(
156
- connection.name,
157
- normalizeCallResult(result)
158
- );
159
- }),
158
+ runMcpClientSpan(
159
+ { method: "tools/list", connection: connection.name },
160
+ () =>
161
+ withFreshClient(async (client) => {
162
+ const listed = await client.listTools(mcpListParams());
163
+ return listed.tools
164
+ .map(toToolInfo)
165
+ .filter((tool) => connectionAllowsTool(connection, tool.name));
166
+ })
167
+ ),
168
+ callTool: (toolName, args = {}) => {
169
+ assertConnectionAllowsTool(connection, toolName);
170
+ return runMcpClientSpan(
171
+ {
172
+ method: "tools/call",
173
+ connection: connection.name,
174
+ toolName,
175
+ },
176
+ () =>
177
+ withFreshClient(async (client) => {
178
+ const result = await client.callTool({
179
+ name: toolName,
180
+ arguments: args,
181
+ ...mcpCallMeta(),
182
+ });
183
+ return throwIfCallNeedsAuth(
184
+ connection.name,
185
+ normalizeCallResult(result)
186
+ );
187
+ })
188
+ );
189
+ },
160
190
  };
161
191
  }
162
192
 
@@ -165,13 +195,23 @@ export class McpHost implements HostMcpRegistry {
165
195
  toolName: string,
166
196
  args: Record<string, unknown> = {}
167
197
  ): Promise<HostMcpCallResult> {
168
- return this.withClient(connectionName, async (client) => {
169
- const result = await client.callTool({
170
- name: toolName,
171
- arguments: args,
172
- });
173
- return throwIfCallNeedsAuth(connectionName, normalizeCallResult(result));
174
- });
198
+ const connection = this.requireConnection(connectionName);
199
+ assertConnectionAllowsTool(connection, toolName);
200
+ return runMcpClientSpan(
201
+ { method: "tools/call", connection: connectionName, toolName },
202
+ () =>
203
+ this.withClient(connectionName, async (client) => {
204
+ const result = await client.callTool({
205
+ name: toolName,
206
+ arguments: args,
207
+ ...mcpCallMeta(),
208
+ });
209
+ return throwIfCallNeedsAuth(
210
+ connectionName,
211
+ normalizeCallResult(result)
212
+ );
213
+ })
214
+ );
175
215
  }
176
216
 
177
217
  async dropClient(name: string): Promise<void> {
@@ -254,7 +294,7 @@ export class McpHost implements HostMcpRegistry {
254
294
  await opened.close();
255
295
  }
256
296
 
257
- private async connect(name: string): Promise<OpenedConnection> {
297
+ private requireConnection(name: string): DiscoveredConnection {
258
298
  const connection = this.byName.get(name);
259
299
  if (connection === undefined) {
260
300
  const known = this.names().join(", ") || "(none)";
@@ -262,8 +302,24 @@ export class McpHost implements HostMcpRegistry {
262
302
  `Unknown MCP connection "${name}". Authored MCP connections: ${known}.`
263
303
  );
264
304
  }
265
- return openConnection(connection, this.oauthRedirectUrl);
305
+ return connection;
306
+ }
307
+
308
+ private async connect(name: string): Promise<OpenedConnection> {
309
+ return openConnection(this.requireConnection(name), this.oauthRedirectUrl);
310
+ }
311
+ }
312
+
313
+ function assertConnectionAllowsTool(
314
+ connection: DiscoveredConnection,
315
+ toolName: string
316
+ ): void {
317
+ if (connectionAllowsTool(connection, toolName)) {
318
+ return;
266
319
  }
320
+ throw new Error(
321
+ `MCP connection "${connection.name}" does not allow tool "${toolName}".`
322
+ );
267
323
  }
268
324
 
269
325
  /** Exported for unit tests. */
@@ -434,10 +490,33 @@ async function createTransport(
434
490
  })
435
491
  : undefined;
436
492
 
493
+ const fetchImpl = instrumentedMcpFetch();
494
+ const fetchLike = (url: string | URL, init?: RequestInit) =>
495
+ fetchImpl(url, init);
437
496
  if (transport.type === "sse") {
438
- return new SSEClientTransport(url, { requestInit, authProvider });
497
+ return new SSEClientTransport(url, {
498
+ requestInit,
499
+ authProvider,
500
+ fetch: fetchLike,
501
+ });
439
502
  }
440
- return new StreamableHTTPClientTransport(url, { requestInit, authProvider });
503
+ return new StreamableHTTPClientTransport(url, {
504
+ requestInit,
505
+ authProvider,
506
+ fetch: fetchLike,
507
+ });
508
+ }
509
+
510
+ function mcpListParams(): { _meta: { traceparent: string } } | undefined {
511
+ const meta = mcpTraceMeta();
512
+ return meta === undefined ? undefined : { _meta: meta };
513
+ }
514
+
515
+ function mcpCallMeta():
516
+ | { _meta: { traceparent: string } }
517
+ | Record<string, never> {
518
+ const meta = mcpTraceMeta();
519
+ return meta === undefined ? {} : { _meta: meta };
441
520
  }
442
521
 
443
522
  function isOauthHttpTransport(
@@ -24,9 +24,23 @@ import type { OtelRuntime } from "./runtime.js";
24
24
 
25
25
  const CONTENT_MAX = 2_048;
26
26
 
27
+ export interface OtelCallContext {
28
+ sessionId: string;
29
+ session: SessionInfo;
30
+ turnId: string;
31
+ callId: string;
32
+ toolName: string;
33
+ }
34
+
27
35
  export interface OtelCollector {
28
36
  onEvent(event: SessionEvent, session: SessionInfo): void;
29
37
  close(): void;
38
+ /**
39
+ * Run `fn` under the tool span so outbound inject sees that context.
40
+ * Opens the session / turn / tool span if the event stream has not
41
+ * reached `actions.requested` yet (dispatch is async).
42
+ */
43
+ runInCall<T>(args: OtelCallContext, fn: () => T | Promise<T>): Promise<T>;
30
44
  /** Merge author tags onto the session; paints open spans immediately. */
31
45
  setSessionAttributes(
32
46
  sessionId: string,
@@ -93,6 +107,12 @@ export function createOtelCollector(
93
107
  const bag = extraBySession.get(sessionId);
94
108
  return bag === undefined ? undefined : { ...bag };
95
109
  },
110
+ runInCall(args, fn) {
111
+ const span = ensureCallSpan(args);
112
+ return context.with(trace.setSpan(context.active(), span), () =>
113
+ Promise.resolve(fn())
114
+ );
115
+ },
96
116
  };
97
117
 
98
118
  function handle(event: SessionEvent, session: SessionInfo): void {
@@ -101,6 +121,9 @@ export function createOtelCollector(
101
121
 
102
122
  switch (event.type) {
103
123
  case "session.started": {
124
+ if (sessions.get(event.sessionId) !== undefined) {
125
+ return;
126
+ }
104
127
  openSession({
105
128
  sessionId: event.sessionId,
106
129
  session,
@@ -174,6 +197,15 @@ export function createOtelCollector(
174
197
  if (state === undefined) {
175
198
  return;
176
199
  }
200
+ // `runInCall` can open a synthetic turn before this event is
201
+ // applied. Keep that entry (and its in-flight tool spans) and
202
+ // just mark it real so `action.result` will not auto-close it.
203
+ const existing = state.turns.get(event.turnId);
204
+ if (existing !== undefined) {
205
+ existing.synthetic = false;
206
+ existing.span.setAttribute("agent_sdk.turn_synthetic", false);
207
+ return;
208
+ }
177
209
  openTurn({
178
210
  state,
179
211
  sessionId: event.sessionId,
@@ -227,32 +259,14 @@ export function createOtelCollector(
227
259
  return;
228
260
  }
229
261
  for (const call of event.data.calls) {
230
- const parentCtx = parentCtxFor(
262
+ openToolSpan({
231
263
  turn,
232
- event.data.parentCallId ?? call.parentCallId
233
- );
234
- const span = runtime.tracer.startSpan(
235
- "agent_sdk.tool",
236
- {
237
- kind: SpanKind.INTERNAL,
238
- startTime,
239
- attributes: join(event.sessionId, {
240
- "cursor.conversation.id": event.sessionId,
241
- "cursor.tool.name": call.toolName,
242
- "cursor.tool.kind": "builtin",
243
- "agent_sdk.agent": agentName,
244
- "agent_sdk.turn_id": event.turnId,
245
- "agent_sdk.call_id": call.callId,
246
- "agent_sdk.parent_call_id": call.parentCallId,
247
- "agent_sdk.tool_args":
248
- logOpts?.toolContent === true && call.args !== undefined
249
- ? truncate(json(call.args))
250
- : undefined,
251
- }),
252
- },
253
- parentCtx
254
- );
255
- turn.tools.set(call.callId, span);
264
+ sessionId: event.sessionId,
265
+ turnId: event.turnId,
266
+ call,
267
+ parentCallId: event.data.parentCallId ?? call.parentCallId,
268
+ startTime,
269
+ });
256
270
  }
257
271
  return;
258
272
  }
@@ -702,6 +716,92 @@ export function createOtelCollector(
702
716
  return trace.setSpan(context.active(), turn.span);
703
717
  }
704
718
 
719
+ function openToolSpan(args: {
720
+ turn: TurnState;
721
+ sessionId: string;
722
+ turnId: string | undefined;
723
+ call: {
724
+ callId: string;
725
+ toolName: string;
726
+ args?: unknown;
727
+ parentCallId?: string;
728
+ };
729
+ parentCallId?: string;
730
+ startTime: number | undefined;
731
+ }): Span {
732
+ const existing = args.turn.tools.get(args.call.callId);
733
+ if (existing !== undefined) {
734
+ // Early `runInCall` opens with callId/toolName only. Fill in
735
+ // parent linkage and opt-in args when `actions.requested` arrives.
736
+ // The OTel parent is fixed at start; `parent_call_id` still records
737
+ // the event-stream hierarchy for nested/subagent calls.
738
+ existing.setAttributes(
739
+ join(args.sessionId, {
740
+ "agent_sdk.parent_call_id":
741
+ args.parentCallId ?? args.call.parentCallId,
742
+ "agent_sdk.tool_args":
743
+ logOpts?.toolContent === true && args.call.args !== undefined
744
+ ? truncate(json(args.call.args))
745
+ : undefined,
746
+ })
747
+ );
748
+ return existing;
749
+ }
750
+ const span = runtime.tracer.startSpan(
751
+ "agent_sdk.tool",
752
+ {
753
+ kind: SpanKind.INTERNAL,
754
+ startTime: args.startTime,
755
+ attributes: join(args.sessionId, {
756
+ "cursor.conversation.id": args.sessionId,
757
+ "cursor.tool.name": args.call.toolName,
758
+ "cursor.tool.kind": "builtin",
759
+ "agent_sdk.agent": agentName,
760
+ "agent_sdk.turn_id": args.turnId,
761
+ "agent_sdk.call_id": args.call.callId,
762
+ "agent_sdk.parent_call_id": args.call.parentCallId,
763
+ "agent_sdk.tool_args":
764
+ logOpts?.toolContent === true && args.call.args !== undefined
765
+ ? truncate(json(args.call.args))
766
+ : undefined,
767
+ }),
768
+ },
769
+ parentCtxFor(args.turn, args.parentCallId ?? args.call.parentCallId)
770
+ );
771
+ args.turn.tools.set(args.call.callId, span);
772
+ return span;
773
+ }
774
+
775
+ function ensureCallSpan(args: OtelCallContext): Span {
776
+ const startTime = Date.now();
777
+ const state =
778
+ sessions.get(args.sessionId) ??
779
+ openSession({
780
+ sessionId: args.sessionId,
781
+ session: args.session,
782
+ channelId: args.session.channelId,
783
+ startTime,
784
+ restored: true,
785
+ });
786
+ const turn =
787
+ state.turns.get(args.turnId) ??
788
+ openTurn({
789
+ state,
790
+ sessionId: args.sessionId,
791
+ turnId: args.turnId,
792
+ session: args.session,
793
+ startTime,
794
+ synthetic: true,
795
+ });
796
+ return openToolSpan({
797
+ turn,
798
+ sessionId: args.sessionId,
799
+ turnId: args.turnId,
800
+ call: { callId: args.callId, toolName: args.toolName },
801
+ startTime,
802
+ });
803
+ }
804
+
705
805
  function endOpenChildren(turn: TurnState, endTime: number | undefined): void {
706
806
  for (const span of turn.tools.values()) {
707
807
  span.end(endTime);
@@ -11,19 +11,9 @@ import {
11
11
  SpanStatusCode,
12
12
  trace,
13
13
  } from "@opentelemetry/api";
14
- import { W3CTraceContextPropagator } from "@opentelemetry/core";
14
+ import { ensureW3cPropagator } from "./propagation.js";
15
15
  import type { OtelRuntime } from "./runtime.js";
16
16
 
17
- let propagatorInstalled = false;
18
-
19
- function ensurePropagator(): void {
20
- if (propagatorInstalled) {
21
- return;
22
- }
23
- propagation.setGlobalPropagator(new W3CTraceContextPropagator());
24
- propagatorInstalled = true;
25
- }
26
-
27
17
  interface HttpSpanHandle {
28
18
  context: Context;
29
19
  end(statusCode: number, error?: unknown): void;
@@ -61,7 +51,7 @@ function startHttpSpan(
61
51
  if (runtime === undefined || runtime.config.traces === false) {
62
52
  return undefined;
63
53
  }
64
- ensurePropagator();
54
+ ensureW3cPropagator();
65
55
  const headers: Record<string, string> = {};
66
56
  for (const [key, value] of Object.entries(req.headers)) {
67
57
  if (typeof value === "string") {
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Client-side MCP instrumentation: W3C / Cursor HTTP inject on Streamable
3
+ * HTTP + SSE fetches, SEP-414 `_meta.traceparent` on JSON-RPC params, and
4
+ * CLIENT spans for `tools/list` / `tools/call`.
5
+ */
6
+
7
+ import { context, SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
8
+ import { formatTraceparent, injectActiveTraceContext } from "../../otel.js";
9
+ import { attrs } from "./attrs.js";
10
+
11
+ const TRACER = "agent_sdk";
12
+
13
+ export function instrumentedMcpFetch(base: typeof fetch = fetch): typeof fetch {
14
+ return (input, init) => {
15
+ if (input instanceof Request && init === undefined) {
16
+ const headers = new Headers(input.headers);
17
+ injectActiveTraceContext(headers);
18
+ return base(new Request(input, { headers }));
19
+ }
20
+ const headers = new Headers(init?.headers);
21
+ injectActiveTraceContext(headers);
22
+ return base(input, { ...init, headers });
23
+ };
24
+ }
25
+
26
+ /** SEP-414 / OTel MCP carrier for `params._meta`. */
27
+ export function mcpTraceMeta(): { traceparent: string } | undefined {
28
+ const span = trace.getSpan(context.active());
29
+ if (span === undefined) {
30
+ return undefined;
31
+ }
32
+ const traceparent = formatTraceparent(span.spanContext());
33
+ if (traceparent === undefined) {
34
+ return undefined;
35
+ }
36
+ return { traceparent };
37
+ }
38
+
39
+ export function runMcpClientSpan<T>(
40
+ args: {
41
+ method: string;
42
+ connection: string;
43
+ toolName?: string;
44
+ },
45
+ fn: () => Promise<T>
46
+ ): Promise<T> {
47
+ const span = trace.getTracer(TRACER).startSpan(args.method, {
48
+ kind: SpanKind.CLIENT,
49
+ attributes: attrs({
50
+ "rpc.system": "mcp",
51
+ "mcp.method.name": args.method,
52
+ "mcp.tool.name": args.toolName,
53
+ "agent_sdk.mcp.connection": args.connection,
54
+ }),
55
+ });
56
+ return context.with(trace.setSpan(context.active(), span), async () => {
57
+ try {
58
+ return await fn();
59
+ } catch (error) {
60
+ span.setStatus({
61
+ code: SpanStatusCode.ERROR,
62
+ message: error instanceof Error ? error.message : String(error),
63
+ });
64
+ throw error;
65
+ } finally {
66
+ span.end();
67
+ }
68
+ });
69
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Process-global W3C `traceparent` propagator. Inbound HTTP extracts;
3
+ * outbound Factory / Cursor API calls inject.
4
+ */
5
+
6
+ import { propagation } from "@opentelemetry/api";
7
+ import { W3CTraceContextPropagator } from "@opentelemetry/core";
8
+
9
+ let installed = false;
10
+
11
+ export function ensureW3cPropagator(): void {
12
+ if (installed) {
13
+ return;
14
+ }
15
+ propagation.setGlobalPropagator(new W3CTraceContextPropagator());
16
+ installed = true;
17
+ }
@@ -41,6 +41,7 @@ import {
41
41
  } from "@opentelemetry/semantic-conventions";
42
42
  import type { OtelExporterConfig, OtelSignal } from "../../otel.js";
43
43
  import { exportersForSignal, type ResolvedOtelConfig } from "./config.js";
44
+ import { ensureW3cPropagator } from "./propagation.js";
44
45
 
45
46
  const INSTRUMENTATION = "agent_sdk";
46
47
 
@@ -66,6 +67,7 @@ export function createOtelRuntime(
66
67
  "[agent-sdk:otel] OTEL_EXPORTER_OTLP_PROTOCOL=grpc is unsupported; using http/protobuf"
67
68
  );
68
69
  }
70
+ ensureW3cPropagator();
69
71
  const sdk = startOtelSdk(config, log);
70
72
  const meter =
71
73
  config.metrics === false
@@ -639,7 +639,9 @@ type OriginThreadJson = {
639
639
  */
640
640
  type OriginActorJson = {
641
641
  user?: { id?: string; email?: string };
642
- app?: { id?: string; slug?: string };
642
+ // Apps have no slug (they are id + display name); `slug` is being retired
643
+ // from the public actor and is never read here.
644
+ app?: { id?: string; displayName?: string };
643
645
  serviceAccount?: { id?: string };
644
646
  };
645
647
 
@@ -685,7 +687,8 @@ export function listedCommentFromOriginComment(
685
687
  : startLine;
686
688
  const commitSha = thread.version?.headSha;
687
689
  const author = comment.author;
688
- const authorLogin = author?.app?.slug ?? author?.user?.email;
690
+ const authorLogin =
691
+ author?.app?.displayName ?? author?.app?.id ?? author?.user?.email;
689
692
  // App and service-account actors are machine identities; only a `user`
690
693
  // actor is a human PR participant.
691
694
  const authorIsBot =