@cursor/july 0.1.92 → 0.1.94

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 (448) hide show
  1. package/AGENTS.md +8 -20
  2. package/README.md +115 -182
  3. package/dist/channels/deployments/deployments-channel.d.ts +7 -0
  4. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  5. package/dist/channels/deployments/deployments-channel.js +26 -2
  6. package/dist/channels/deployments/types.d.ts +8 -0
  7. package/dist/channels/deployments/types.d.ts.map +1 -1
  8. package/dist/channels/github/github-channel.d.ts +3 -0
  9. package/dist/channels/github/github-channel.d.ts.map +1 -1
  10. package/dist/channels/github/github-channel.js +28 -56
  11. package/dist/channels/slack/attachments.js +2 -2
  12. package/dist/channels/slack/dispatch.d.ts +0 -7
  13. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  14. package/dist/channels/slack/dispatch.js +4 -7
  15. package/dist/channels/slack/eval-directive.d.ts +5 -12
  16. package/dist/channels/slack/eval-directive.d.ts.map +1 -1
  17. package/dist/channels/slack/eval-directive.js +8 -19
  18. package/dist/channels/slack/index.d.ts +0 -6
  19. package/dist/channels/slack/index.d.ts.map +1 -1
  20. package/dist/channels/slack/index.js +0 -6
  21. package/dist/channels/slack/setup.d.ts +4 -4
  22. package/dist/channels/slack/setup.d.ts.map +1 -1
  23. package/dist/channels/slack/setup.js +8 -15
  24. package/dist/channels/slack/slack-channel.d.ts +6 -13
  25. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  26. package/dist/channels/slack/slack-channel.js +15 -101
  27. package/dist/channels/slack/types.d.ts +12 -79
  28. package/dist/channels/slack/types.d.ts.map +1 -1
  29. package/dist/channels/slack/types.js +1 -15
  30. package/dist/client.d.ts +14 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +12 -0
  33. package/dist/connections.d.ts +18 -9
  34. package/dist/connections.d.ts.map +1 -1
  35. package/dist/connections.js +17 -8
  36. package/dist/continuation.d.ts +1 -1
  37. package/dist/continuation.js +1 -1
  38. package/dist/docs/404.html +2 -2
  39. package/dist/docs/ab.html +8 -8
  40. package/dist/docs/ab.md +7 -13
  41. package/dist/docs/assets/{ab.md.CVzWxLoB.js → ab.md.DJo5r4R-.js} +4 -4
  42. package/dist/docs/assets/{ab.md.CVzWxLoB.lean.js → ab.md.DJo5r4R-.lean.js} +1 -1
  43. package/dist/docs/assets/{app.Bci6CM9E.js → app.CFDEas4I.js} +1 -1
  44. package/dist/docs/assets/building-with-agents.md.DI4mEzlt.js +13 -0
  45. package/dist/docs/assets/{building-with-agents.md.DH8A_cHA.lean.js → building-with-agents.md.DI4mEzlt.lean.js} +1 -1
  46. package/dist/docs/assets/chunks/@localSearchIndexroot.DU3U2Ij2.js +1 -0
  47. package/dist/docs/assets/chunks/{VPLocalSearchBox.BCPT6xA-.js → VPLocalSearchBox.B1IIYpYS.js} +1 -1
  48. package/dist/docs/assets/chunks/{theme.BEA8BF3c.js → theme.Ct4NSiLm.js} +2 -2
  49. package/dist/docs/assets/concepts.md.lwAgBIMI.js +1 -0
  50. package/dist/docs/assets/{concepts.md.CRfU3bVg.lean.js → concepts.md.lwAgBIMI.lean.js} +1 -1
  51. package/dist/docs/assets/{deployment.md.DX_hc3ze.js → deployment.md.D9msOFOW.js} +9 -14
  52. package/dist/docs/assets/{deployment.md.DX_hc3ze.lean.js → deployment.md.D9msOFOW.lean.js} +1 -1
  53. package/dist/docs/assets/{evals.md.a0SMN6r9.js → evals.md.lfJoEVc8.js} +6 -6
  54. package/dist/docs/assets/{evals.md.a0SMN6r9.lean.js → evals.md.lfJoEVc8.lean.js} +1 -1
  55. package/dist/docs/assets/{guides_agent-to-agent.md.BCeVdJRJ.js → guides_agent-to-agent.md.BDb0t1QV.js} +2 -2
  56. package/dist/docs/assets/guides_cloud-runtime.md.CkYbjnAX.js +9 -0
  57. package/dist/docs/assets/guides_cloud-runtime.md.CkYbjnAX.lean.js +1 -0
  58. package/dist/docs/assets/{guides_convert-automation.md.D06eIzea.js → guides_convert-automation.md.B4sjlodG.js} +2 -2
  59. package/dist/docs/assets/{guides_github.md.Cdt1s2QC.js → guides_github.md.Cnh2mL4a.js} +5 -5
  60. package/dist/docs/assets/{guides_github.md.Cdt1s2QC.lean.js → guides_github.md.Cnh2mL4a.lean.js} +1 -1
  61. package/dist/docs/assets/{guides_mcp-oauth.md.Du0f7pGU.js → guides_mcp-oauth.md.DPYmBCbV.js} +7 -9
  62. package/dist/docs/assets/{guides_mcp-oauth.md.Du0f7pGU.lean.js → guides_mcp-oauth.md.DPYmBCbV.lean.js} +1 -1
  63. package/dist/docs/assets/{guides_slack.md.DiUmk_Oi.js → guides_slack.md.C32HsdKk.js} +7 -13
  64. package/dist/docs/assets/guides_slack.md.C32HsdKk.lean.js +1 -0
  65. package/dist/docs/assets/{guides_webhooks.md.BpnIdO0i.js → guides_webhooks.md.DKdA43Qm.js} +2 -2
  66. package/dist/docs/assets/{hillclimbing.md.ywF3yDAd.js → hillclimbing.md.DhESf3OO.js} +1 -1
  67. package/dist/docs/assets/index.md.DRakGHFe.js +5 -0
  68. package/dist/docs/assets/{index.md.BAaMXLFd.lean.js → index.md.DRakGHFe.lean.js} +1 -1
  69. package/dist/docs/assets/{quickstart.md.DsrarzEg.js → quickstart.md.Nj_LjW_a.js} +2 -2
  70. package/dist/docs/assets/{reference_agent-config.md.Bqylgw50.js → reference_agent-config.md.Cp_x38Nl.js} +3 -3
  71. package/dist/docs/assets/{reference_channels.md.DQZjCnyh.js → reference_channels.md.Cd2f2iyV.js} +2 -2
  72. package/dist/docs/assets/{reference_channels.md.DQZjCnyh.lean.js → reference_channels.md.Cd2f2iyV.lean.js} +1 -1
  73. package/dist/docs/assets/{reference_cli.md.B7GkAJRC.js → reference_cli.md.Cw6_ICYG.js} +10 -11
  74. package/dist/docs/assets/{reference_cli.md.B7GkAJRC.lean.js → reference_cli.md.Cw6_ICYG.lean.js} +1 -1
  75. package/dist/docs/assets/{reference_connections.md.DYidrb-j.js → reference_connections.md.BH8Oc0D0.js} +7 -7
  76. package/dist/docs/assets/{reference_connections.md.DYidrb-j.lean.js → reference_connections.md.BH8Oc0D0.lean.js} +1 -1
  77. package/dist/docs/assets/reference_hooks.md.a8BJxMR5.js +14 -0
  78. package/dist/docs/assets/{reference_hooks.md.B9FSgdDe.lean.js → reference_hooks.md.a8BJxMR5.lean.js} +1 -1
  79. package/dist/docs/assets/reference_http-api.md.D89k1mdm.js +11 -0
  80. package/dist/docs/assets/reference_http-api.md.D89k1mdm.lean.js +1 -0
  81. package/dist/docs/assets/{reference_instructions.md.DhNCOl7r.js → reference_instructions.md.CR7XSsGk.js} +3 -3
  82. package/dist/docs/assets/{reference_instructions.md.DhNCOl7r.lean.js → reference_instructions.md.CR7XSsGk.lean.js} +1 -1
  83. package/dist/docs/assets/reference_playground.md.DnX5nL-B.js +1 -0
  84. package/dist/docs/assets/reference_playground.md.DnX5nL-B.lean.js +1 -0
  85. package/dist/docs/assets/reference_project-layout.md.Bv4KOtlB.js +19 -0
  86. package/dist/docs/assets/{reference_prompt.md.DZUMtLPD.js → reference_prompt.md.DnaD5dNK.js} +1 -1
  87. package/dist/docs/assets/{reference_schedules.md.DNipebiG.js → reference_schedules.md.DI_JrHgq.js} +1 -1
  88. package/dist/docs/assets/reference_sessions.md.D0mIh4KK.js +1 -0
  89. package/dist/docs/assets/{reference_sessions.md.tUFzz98S.lean.js → reference_sessions.md.D0mIh4KK.lean.js} +1 -1
  90. package/dist/docs/assets/{reference_skills.md.B5ZEuHfG.js → reference_skills.md.8son6Hjm.js} +4 -4
  91. package/dist/docs/assets/{reference_subagents.md.Xoav0AII.js → reference_subagents.md.CfsIloPm.js} +1 -1
  92. package/dist/docs/assets/{reference_tools.md.wpaJtHn6.js → reference_tools.md.BHeXn2id.js} +3 -3
  93. package/dist/docs/assets/{reference_tools.md.wpaJtHn6.lean.js → reference_tools.md.BHeXn2id.lean.js} +1 -1
  94. package/dist/docs/assets/scaffolding-agents.md.D7UUkWw0.js +1 -0
  95. package/dist/docs/assets/{scaffolding-agents.md.CRDDUtYJ.lean.js → scaffolding-agents.md.D7UUkWw0.lean.js} +1 -1
  96. package/dist/docs/assets/{storage.md.JbjlHWZ6.js → storage.md.BOHeqk2M.js} +5 -5
  97. package/dist/docs/assets/{storage.md.JbjlHWZ6.lean.js → storage.md.BOHeqk2M.lean.js} +1 -1
  98. package/dist/docs/assets/{templates_agentic-owners.md.DSJSIpWU.js → templates_agentic-owners.md.DqtPdm6f.js} +2 -2
  99. package/dist/docs/assets/{templates_pr-autofixer.md.1HAR3RXE.js → templates_pr-autofixer.md.DU7dQpor.js} +2 -2
  100. package/dist/docs/assets/{templates_pr-autofixer.md.1HAR3RXE.lean.js → templates_pr-autofixer.md.DU7dQpor.lean.js} +1 -1
  101. package/dist/docs/assets/{templates_security-reviewer.md.ByFyRta2.js → templates_security-reviewer.md.CTa7u_l1.js} +2 -2
  102. package/dist/docs/assets/{templates_security-reviewer.md.ByFyRta2.lean.js → templates_security-reviewer.md.CTa7u_l1.lean.js} +1 -1
  103. package/dist/docs/assets/troubleshooting.md.Ctv3T8C2.js +1 -0
  104. package/dist/docs/assets/{troubleshooting.md.DYECCZiJ.lean.js → troubleshooting.md.Ctv3T8C2.lean.js} +1 -1
  105. package/dist/docs/building-with-agents.html +7 -7
  106. package/dist/docs/building-with-agents.md +5 -11
  107. package/dist/docs/concepts.html +5 -8
  108. package/dist/docs/concepts.md +13 -17
  109. package/dist/docs/deployment.html +13 -18
  110. package/dist/docs/deployment.md +9 -30
  111. package/dist/docs/design/agsh.md +406 -0
  112. package/dist/docs/evals.html +10 -10
  113. package/dist/docs/evals.md +16 -37
  114. package/dist/docs/guides/agent-to-agent.html +6 -6
  115. package/dist/docs/guides/agent-to-agent.md +3 -3
  116. package/dist/docs/guides/cloud-runtime.html +6 -6
  117. package/dist/docs/guides/cloud-runtime.md +9 -25
  118. package/dist/docs/guides/convert-automation.html +7 -7
  119. package/dist/docs/guides/convert-automation.md +4 -4
  120. package/dist/docs/guides/github.html +9 -9
  121. package/dist/docs/guides/github.md +16 -28
  122. package/dist/docs/guides/human-in-the-loop.html +4 -4
  123. package/dist/docs/guides/mcp-oauth.html +11 -13
  124. package/dist/docs/guides/mcp-oauth.md +14 -22
  125. package/dist/docs/guides/opentelemetry.html +5 -5
  126. package/dist/docs/guides/slack.html +11 -17
  127. package/dist/docs/guides/slack.md +13 -50
  128. package/dist/docs/guides/webhooks.html +6 -6
  129. package/dist/docs/guides/webhooks.md +3 -3
  130. package/dist/docs/hashmap.json +1 -1
  131. package/dist/docs/hillclimbing.html +6 -6
  132. package/dist/docs/hillclimbing.md +1 -1
  133. package/dist/docs/index.html +6 -6
  134. package/dist/docs/index.md +0 -36
  135. package/dist/docs/llms-full.txt +965 -3633
  136. package/dist/docs/llms.txt +3 -18
  137. package/dist/docs/quickstart.html +6 -6
  138. package/dist/docs/quickstart.md +3 -4
  139. package/dist/docs/reference/agent-config.html +8 -8
  140. package/dist/docs/reference/agent-config.md +10 -15
  141. package/dist/docs/reference/artifacts.html +4 -4
  142. package/dist/docs/reference/channels.html +6 -6
  143. package/dist/docs/reference/channels.md +20 -31
  144. package/dist/docs/reference/cli.html +14 -15
  145. package/dist/docs/reference/cli.md +29 -38
  146. package/dist/docs/reference/connections.html +11 -11
  147. package/dist/docs/reference/connections.md +24 -25
  148. package/dist/docs/reference/hooks.html +6 -6
  149. package/dist/docs/reference/hooks.md +12 -17
  150. package/dist/docs/reference/http-api.html +7 -7
  151. package/dist/docs/reference/http-api.md +25 -37
  152. package/dist/docs/reference/instructions.html +6 -6
  153. package/dist/docs/reference/instructions.md +1 -1
  154. package/dist/docs/reference/playground.html +5 -5
  155. package/dist/docs/reference/playground.md +14 -19
  156. package/dist/docs/reference/project-layout.html +9 -7
  157. package/dist/docs/reference/project-layout.md +7 -3
  158. package/dist/docs/reference/prompt.html +6 -6
  159. package/dist/docs/reference/prompt.md +1 -1
  160. package/dist/docs/reference/schedules.html +6 -6
  161. package/dist/docs/reference/schedules.md +1 -2
  162. package/dist/docs/reference/sessions.html +5 -12
  163. package/dist/docs/reference/sessions.md +8 -19
  164. package/dist/docs/reference/skills.html +8 -8
  165. package/dist/docs/reference/skills.md +3 -3
  166. package/dist/docs/reference/subagents.html +6 -6
  167. package/dist/docs/reference/subagents.md +2 -2
  168. package/dist/docs/reference/tools.html +8 -8
  169. package/dist/docs/reference/tools.md +30 -19
  170. package/dist/docs/scaffolding-agents.html +5 -5
  171. package/dist/docs/scaffolding-agents.md +4 -5
  172. package/dist/docs/storage.html +9 -9
  173. package/dist/docs/storage.md +37 -80
  174. package/dist/docs/templates/agentic-owners.html +7 -7
  175. package/dist/docs/templates/agentic-owners.md +2 -2
  176. package/dist/docs/templates/demo.html +4 -4
  177. package/dist/docs/templates/pr-autofixer.html +6 -6
  178. package/dist/docs/templates/pr-autofixer.md +7 -9
  179. package/dist/docs/templates/security-reviewer.html +5 -5
  180. package/dist/docs/templates/security-reviewer.md +2 -3
  181. package/dist/docs/templates/triage.html +4 -4
  182. package/dist/docs/troubleshooting.html +5 -5
  183. package/dist/docs/troubleshooting.md +8 -8
  184. package/dist/index.d.ts +1 -1
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +1 -1
  187. package/dist/internal/advertise-tools.d.ts +11 -0
  188. package/dist/internal/advertise-tools.d.ts.map +1 -1
  189. package/dist/internal/advertise-tools.js +47 -9
  190. package/dist/internal/authored-alias-hooks.d.ts +14 -11
  191. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  192. package/dist/internal/authored-alias-hooks.js +14 -11
  193. package/dist/internal/authored-loaders.d.ts +7 -6
  194. package/dist/internal/authored-loaders.d.ts.map +1 -1
  195. package/dist/internal/authored-loaders.js +14 -10
  196. package/dist/internal/cli-deploy.d.ts +1 -1
  197. package/dist/internal/cli-deploy.js +5 -5
  198. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  199. package/dist/internal/cli-mcp-oauth.js +7 -4
  200. package/dist/internal/continuation-channel.d.ts +6 -3
  201. package/dist/internal/continuation-channel.d.ts.map +1 -1
  202. package/dist/internal/continuation-channel.js +44 -40
  203. package/dist/internal/continuation-identity.d.ts +17 -16
  204. package/dist/internal/continuation-identity.d.ts.map +1 -1
  205. package/dist/internal/continuation-identity.js +109 -36
  206. package/dist/internal/convert-automation/convert-workflow.d.ts.map +1 -1
  207. package/dist/internal/convert-automation/convert-workflow.js +26 -15
  208. package/dist/internal/convert-automation/slug.d.ts +0 -2
  209. package/dist/internal/convert-automation/slug.d.ts.map +1 -1
  210. package/dist/internal/convert-automation/slug.js +0 -8
  211. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  212. package/dist/internal/cursor/account-mcp.js +5 -1
  213. package/dist/internal/deploy-manifest.d.ts +2 -2
  214. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  215. package/dist/internal/deploy-manifest.js +4 -9
  216. package/dist/internal/discovery.d.ts.map +1 -1
  217. package/dist/internal/discovery.js +91 -13
  218. package/dist/internal/distribution.d.ts +4 -3
  219. package/dist/internal/distribution.d.ts.map +1 -1
  220. package/dist/internal/distribution.js +4 -3
  221. package/dist/internal/hosted-delivery-protocol.d.ts +38 -0
  222. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -0
  223. package/dist/internal/hosted-delivery-protocol.js +70 -0
  224. package/dist/internal/hosted-delivery.d.ts +35 -0
  225. package/dist/internal/hosted-delivery.d.ts.map +1 -0
  226. package/dist/internal/hosted-delivery.js +239 -0
  227. package/dist/internal/http-channel.d.ts.map +1 -1
  228. package/dist/internal/http-channel.js +1 -1
  229. package/dist/internal/mcp-endpoint.js +3 -3
  230. package/dist/internal/mcp-host.d.ts +8 -7
  231. package/dist/internal/mcp-host.d.ts.map +1 -1
  232. package/dist/internal/mcp-host.js +8 -7
  233. package/dist/internal/peer-connections.d.ts.map +1 -1
  234. package/dist/internal/peer-connections.js +5 -1
  235. package/dist/internal/playground/static.d.ts +0 -3
  236. package/dist/internal/playground/static.d.ts.map +1 -1
  237. package/dist/internal/resolved-connections.d.ts.map +1 -1
  238. package/dist/internal/resolved-connections.js +5 -7
  239. package/dist/internal/review-comments.d.ts +186 -63
  240. package/dist/internal/review-comments.d.ts.map +1 -1
  241. package/dist/internal/review-comments.js +350 -168
  242. package/dist/internal/server.d.ts.map +1 -1
  243. package/dist/internal/server.js +134 -175
  244. package/dist/internal/session-engine.d.ts +50 -10
  245. package/dist/internal/session-engine.d.ts.map +1 -1
  246. package/dist/internal/session-engine.js +221 -68
  247. package/dist/internal/shallow-clone.d.ts +8 -2
  248. package/dist/internal/shallow-clone.d.ts.map +1 -1
  249. package/dist/internal/shallow-clone.js +17 -10
  250. package/dist/internal/tool-catalog.d.ts +31 -0
  251. package/dist/internal/tool-catalog.d.ts.map +1 -0
  252. package/dist/internal/tool-catalog.js +67 -0
  253. package/dist/playground/assets/{index-DDvyC2z6.js → index-B3JCyigB.js} +2 -2
  254. package/dist/playground/index.html +1 -1
  255. package/dist/types.d.ts +81 -40
  256. package/dist/types.d.ts.map +1 -1
  257. package/dist/types.js +19 -0
  258. package/docs/README.md +0 -36
  259. package/docs/ab.md +7 -13
  260. package/docs/building-with-agents.md +5 -11
  261. package/docs/concepts.md +13 -17
  262. package/docs/deployment.md +9 -30
  263. package/docs/design/agsh.md +406 -0
  264. package/docs/evals.md +16 -37
  265. package/docs/guides/agent-to-agent.md +3 -3
  266. package/docs/guides/cloud-runtime.md +9 -25
  267. package/docs/guides/convert-automation.md +4 -4
  268. package/docs/guides/github.md +16 -28
  269. package/docs/guides/mcp-oauth.md +14 -22
  270. package/docs/guides/slack.md +14 -51
  271. package/docs/guides/webhooks.md +3 -3
  272. package/docs/hillclimbing.md +1 -1
  273. package/docs/quickstart.md +3 -4
  274. package/docs/reference/agent-config.md +10 -15
  275. package/docs/reference/channels.md +20 -31
  276. package/docs/reference/cli.md +29 -38
  277. package/docs/reference/connections.md +24 -25
  278. package/docs/reference/hooks.md +12 -17
  279. package/docs/reference/http-api.md +26 -38
  280. package/docs/reference/instructions.md +1 -1
  281. package/docs/reference/playground.md +14 -19
  282. package/docs/reference/project-layout.md +7 -3
  283. package/docs/reference/prompt.md +1 -1
  284. package/docs/reference/schedules.md +1 -2
  285. package/docs/reference/sessions.md +8 -19
  286. package/docs/reference/skills.md +3 -3
  287. package/docs/reference/subagents.md +2 -2
  288. package/docs/reference/tools.md +30 -19
  289. package/docs/scaffolding-agents.md +4 -5
  290. package/docs/storage.md +37 -80
  291. package/docs/templates/agentic-owners.md +2 -2
  292. package/docs/templates/pr-autofixer.md +7 -9
  293. package/docs/templates/security-reviewer.md +2 -3
  294. package/docs/troubleshooting.md +8 -8
  295. package/package.json +16 -2
  296. package/skills/create-agent/SKILL.md +6 -13
  297. package/skills/debug/SKILL.md +2 -4
  298. package/skills/evals/SKILL.md +1 -1
  299. package/skills/framework-map/SKILL.md +3 -2
  300. package/skills/mcp-auth/SKILL.md +10 -13
  301. package/skills/setup-slack/SKILL.md +21 -137
  302. package/src/channels/deployments/deployments-channel.ts +32 -2
  303. package/src/channels/deployments/types.ts +8 -0
  304. package/src/channels/github/github-channel.ts +71 -21
  305. package/src/channels/slack/attachments.ts +2 -2
  306. package/src/channels/slack/dispatch.ts +2 -16
  307. package/src/channels/slack/eval-directive.ts +8 -27
  308. package/src/channels/slack/index.ts +0 -6
  309. package/src/channels/slack/setup.ts +8 -15
  310. package/src/channels/slack/slack-channel.ts +14 -125
  311. package/src/channels/slack/types.ts +12 -96
  312. package/src/client.ts +23 -0
  313. package/src/connections.ts +20 -7
  314. package/src/continuation.ts +1 -1
  315. package/src/index.ts +2 -0
  316. package/src/internal/advertise-tools.ts +45 -7
  317. package/src/internal/authored-alias-hooks.ts +14 -11
  318. package/src/internal/authored-loaders.ts +14 -10
  319. package/src/internal/cli-deploy.ts +5 -5
  320. package/src/internal/cli-mcp-oauth.ts +6 -4
  321. package/src/internal/continuation-channel.ts +62 -45
  322. package/src/internal/continuation-identity.ts +123 -38
  323. package/src/internal/convert-automation/convert-workflow.ts +29 -17
  324. package/src/internal/convert-automation/slug.ts +0 -9
  325. package/src/internal/cursor/account-mcp.ts +4 -1
  326. package/src/internal/deploy-manifest.ts +5 -9
  327. package/src/internal/discovery.ts +107 -13
  328. package/src/internal/distribution.ts +4 -3
  329. package/src/internal/fixtures/units-server.ts +52 -0
  330. package/src/internal/hosted-delivery-protocol.ts +114 -0
  331. package/src/internal/hosted-delivery.ts +359 -0
  332. package/src/internal/http-channel.ts +0 -2
  333. package/src/internal/mcp-endpoint.ts +3 -3
  334. package/src/internal/mcp-host.ts +8 -7
  335. package/src/internal/peer-connections.ts +4 -1
  336. package/src/internal/playground/static.ts +1 -3
  337. package/src/internal/resolved-connections.ts +8 -10
  338. package/src/internal/review-comments.ts +542 -229
  339. package/src/internal/server.ts +180 -253
  340. package/src/internal/session-engine.ts +279 -70
  341. package/src/internal/shallow-clone.ts +30 -16
  342. package/src/internal/tool-catalog.ts +106 -0
  343. package/src/types.ts +99 -40
  344. package/templates/pr-autofixer/agent/channels/slack.ts +8 -2
  345. package/templates/triage/README.md +2 -1
  346. package/templates/triage/overlays/jira/agent/mcp-connections/tracker.ts +0 -1
  347. package/templates/triage/overlays/linear/agent/mcp-connections/tracker.ts +0 -1
  348. package/dist/channels/slack/cursor-account.d.ts +0 -87
  349. package/dist/channels/slack/cursor-account.d.ts.map +0 -1
  350. package/dist/channels/slack/cursor-account.js +0 -100
  351. package/dist/docs/assets/building-with-agents.md.DH8A_cHA.js +0 -13
  352. package/dist/docs/assets/chunks/@localSearchIndexroot.Dv-Q0XtU.js +0 -1
  353. package/dist/docs/assets/concepts.md.CRfU3bVg.js +0 -4
  354. package/dist/docs/assets/example-agents_approval-buddy.md.DNL83puR.js +0 -10
  355. package/dist/docs/assets/example-agents_approval-buddy.md.DNL83puR.lean.js +0 -1
  356. package/dist/docs/assets/example-agents_benny.md.C40vHRLc.js +0 -7
  357. package/dist/docs/assets/example-agents_benny.md.C40vHRLc.lean.js +0 -1
  358. package/dist/docs/assets/example-agents_bugbot.md.BRGMi9O2.js +0 -11
  359. package/dist/docs/assets/example-agents_bugbot.md.BRGMi9O2.lean.js +0 -1
  360. package/dist/docs/assets/example-agents_codebase-wiki.md.Dftj_tPp.js +0 -8
  361. package/dist/docs/assets/example-agents_codebase-wiki.md.Dftj_tPp.lean.js +0 -1
  362. package/dist/docs/assets/example-agents_codeowners-review.md.Bfta-lBU.js +0 -8
  363. package/dist/docs/assets/example-agents_codeowners-review.md.Bfta-lBU.lean.js +0 -1
  364. package/dist/docs/assets/example-agents_concierge.md.MrKpQndp.js +0 -23
  365. package/dist/docs/assets/example-agents_concierge.md.MrKpQndp.lean.js +0 -1
  366. package/dist/docs/assets/example-agents_fsd.md.ZWHWWZPE.js +0 -15
  367. package/dist/docs/assets/example-agents_fsd.md.ZWHWWZPE.lean.js +0 -1
  368. package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.js +0 -2
  369. package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.lean.js +0 -1
  370. package/dist/docs/assets/example-agents_knowledge-base.md.DqKqHQ9u.js +0 -11
  371. package/dist/docs/assets/example-agents_knowledge-base.md.DqKqHQ9u.lean.js +0 -1
  372. package/dist/docs/assets/example-agents_oncall.md.DK4XkYTd.js +0 -10
  373. package/dist/docs/assets/example-agents_oncall.md.DK4XkYTd.lean.js +0 -1
  374. package/dist/docs/assets/example-agents_security-reviewer.md.Bai6D0Ee.js +0 -19
  375. package/dist/docs/assets/example-agents_security-reviewer.md.Bai6D0Ee.lean.js +0 -1
  376. package/dist/docs/assets/example-agents_slack-agent.md.D7Kdj5BV.js +0 -5
  377. package/dist/docs/assets/example-agents_slack-agent.md.D7Kdj5BV.lean.js +0 -1
  378. package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.js +0 -25
  379. package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.lean.js +0 -1
  380. package/dist/docs/assets/guides_cloud-runtime.md.BSMLIBHr.js +0 -9
  381. package/dist/docs/assets/guides_cloud-runtime.md.BSMLIBHr.lean.js +0 -1
  382. package/dist/docs/assets/guides_slack.md.DiUmk_Oi.lean.js +0 -1
  383. package/dist/docs/assets/index.md.BAaMXLFd.js +0 -5
  384. package/dist/docs/assets/reference_hooks.md.B9FSgdDe.js +0 -14
  385. package/dist/docs/assets/reference_http-api.md.CSHVobzG.js +0 -11
  386. package/dist/docs/assets/reference_http-api.md.CSHVobzG.lean.js +0 -1
  387. package/dist/docs/assets/reference_playground.md.Dfb92yQf.js +0 -1
  388. package/dist/docs/assets/reference_playground.md.Dfb92yQf.lean.js +0 -1
  389. package/dist/docs/assets/reference_project-layout.md.CwkSbEWT.js +0 -17
  390. package/dist/docs/assets/reference_sessions.md.tUFzz98S.js +0 -8
  391. package/dist/docs/assets/scaffolding-agents.md.CRDDUtYJ.js +0 -1
  392. package/dist/docs/assets/troubleshooting.md.DYECCZiJ.js +0 -1
  393. package/dist/docs/example-agents/approval-buddy.html +0 -36
  394. package/dist/docs/example-agents/approval-buddy.md +0 -266
  395. package/dist/docs/example-agents/benny.html +0 -33
  396. package/dist/docs/example-agents/benny.md +0 -182
  397. package/dist/docs/example-agents/bugbot.html +0 -37
  398. package/dist/docs/example-agents/bugbot.md +0 -229
  399. package/dist/docs/example-agents/codebase-wiki.html +0 -34
  400. package/dist/docs/example-agents/codebase-wiki.md +0 -170
  401. package/dist/docs/example-agents/codeowners-review.html +0 -34
  402. package/dist/docs/example-agents/codeowners-review.md +0 -192
  403. package/dist/docs/example-agents/concierge.html +0 -49
  404. package/dist/docs/example-agents/concierge.md +0 -201
  405. package/dist/docs/example-agents/fsd.html +0 -41
  406. package/dist/docs/example-agents/fsd.md +0 -329
  407. package/dist/docs/example-agents/index.html +0 -28
  408. package/dist/docs/example-agents/index.md +0 -102
  409. package/dist/docs/example-agents/knowledge-base.html +0 -37
  410. package/dist/docs/example-agents/knowledge-base.md +0 -168
  411. package/dist/docs/example-agents/oncall.html +0 -36
  412. package/dist/docs/example-agents/oncall.md +0 -212
  413. package/dist/docs/example-agents/security-reviewer.html +0 -45
  414. package/dist/docs/example-agents/security-reviewer.md +0 -265
  415. package/dist/docs/example-agents/slack-agent.html +0 -31
  416. package/dist/docs/example-agents/slack-agent.md +0 -142
  417. package/dist/docs/example-agents/weather-agent.html +0 -51
  418. package/dist/docs/example-agents/weather-agent.md +0 -296
  419. package/dist/internal/cursor-slack-relay.d.ts +0 -96
  420. package/dist/internal/cursor-slack-relay.d.ts.map +0 -1
  421. package/dist/internal/cursor-slack-relay.js +0 -176
  422. package/docs/example-agents/approval-buddy.md +0 -271
  423. package/docs/example-agents/benny.md +0 -187
  424. package/docs/example-agents/bugbot.md +0 -234
  425. package/docs/example-agents/codebase-wiki.md +0 -175
  426. package/docs/example-agents/codeowners-review.md +0 -197
  427. package/docs/example-agents/concierge.md +0 -206
  428. package/docs/example-agents/fsd.md +0 -334
  429. package/docs/example-agents/index.md +0 -107
  430. package/docs/example-agents/knowledge-base.md +0 -173
  431. package/docs/example-agents/oncall.md +0 -217
  432. package/docs/example-agents/security-reviewer.md +0 -270
  433. package/docs/example-agents/slack-agent.md +0 -147
  434. package/docs/example-agents/weather-agent.md +0 -301
  435. package/src/channels/slack/cursor-account.ts +0 -202
  436. package/src/internal/cursor-slack-relay.ts +0 -249
  437. /package/dist/docs/assets/{guides_agent-to-agent.md.BCeVdJRJ.lean.js → guides_agent-to-agent.md.BDb0t1QV.lean.js} +0 -0
  438. /package/dist/docs/assets/{guides_convert-automation.md.D06eIzea.lean.js → guides_convert-automation.md.B4sjlodG.lean.js} +0 -0
  439. /package/dist/docs/assets/{guides_webhooks.md.BpnIdO0i.lean.js → guides_webhooks.md.DKdA43Qm.lean.js} +0 -0
  440. /package/dist/docs/assets/{hillclimbing.md.ywF3yDAd.lean.js → hillclimbing.md.DhESf3OO.lean.js} +0 -0
  441. /package/dist/docs/assets/{quickstart.md.DsrarzEg.lean.js → quickstart.md.Nj_LjW_a.lean.js} +0 -0
  442. /package/dist/docs/assets/{reference_agent-config.md.Bqylgw50.lean.js → reference_agent-config.md.Cp_x38Nl.lean.js} +0 -0
  443. /package/dist/docs/assets/{reference_project-layout.md.CwkSbEWT.lean.js → reference_project-layout.md.Bv4KOtlB.lean.js} +0 -0
  444. /package/dist/docs/assets/{reference_prompt.md.DZUMtLPD.lean.js → reference_prompt.md.DnaD5dNK.lean.js} +0 -0
  445. /package/dist/docs/assets/{reference_schedules.md.DNipebiG.lean.js → reference_schedules.md.DI_JrHgq.lean.js} +0 -0
  446. /package/dist/docs/assets/{reference_skills.md.B5ZEuHfG.lean.js → reference_skills.md.8son6Hjm.lean.js} +0 -0
  447. /package/dist/docs/assets/{reference_subagents.md.Xoav0AII.lean.js → reference_subagents.md.CfsIloPm.lean.js} +0 -0
  448. /package/dist/docs/assets/{templates_agentic-owners.md.DSJSIpWU.lean.js → templates_agentic-owners.md.DqtPdm6f.lean.js} +0 -0
@@ -1,301 +0,0 @@
1
- ---
2
- title: "Explore the full Agent SDK surface with a weather agent"
3
- description: "Trace cloud tools, MCP, channels, skills, subagents, schedules, hooks, A/B metrics, and evals through one agent."
4
- ---
5
-
6
- # Explore the full Agent SDK surface with a weather agent
7
-
8
- The weather agent is the broadest small example in the repository. It fetches
9
- live conditions and forecasts, converts units through MCP, writes notes in a
10
- session workspace, and runs from HTTP, Slack, a schedule, and the MCP endpoint.
11
-
12
- Use this project when you want to see how the Agent SDK's filesystem pieces fit
13
- together before you design a larger agent.
14
-
15
- [Browse the weather agent source.](../../examples/weather-agent/)
16
-
17
- ## See the runtime features together
18
-
19
- Most examples focus on one feature. Weather agent puts the major runtime
20
- features side by side:
21
-
22
- | Capability | Source | Role |
23
- | --- | --- | --- |
24
- | Root config and instructions | [`agent/agent.ts`](../../examples/weather-agent/agent/agent.ts), [`agent/instructions.md`](../../examples/weather-agent/agent/instructions.md) | Select the cloud runtime and route each request. |
25
- | Server tools | [`agent/tools/`](../../examples/weather-agent/agent/tools/) | Fetch Open-Meteo data and call MCP from the serve host. |
26
- | Agent tool | [`save_weather_note.ts`](../../examples/weather-agent/agent/tools/save_weather_note.ts) | Run a Python script inside the session workspace. |
27
- | Stdio MCP | [`units.ts`](../../examples/weather-agent/agent/mcp-connections/units.ts), [`probe.ts`](../../examples/weather-agent/agent/mcp-connections/probe.ts) | Expose conversion tools to the model, host tools, and channel handlers. Author VM-side probe tools as TypeScript `execute` functions. |
28
- | Custom HTTP | [`webhook.ts`](../../examples/weather-agent/agent/channels/webhook.ts) | Start a turn or call MCP without a model turn. |
29
- | Slack | [`slack.ts`](../../examples/weather-agent/agent/channels/slack.ts), [`slack-app.ts`](../../examples/weather-agent/agent/channels/slack-app.ts) | Compare account-linked chat with a dedicated app. |
30
- | Skill and subagent | [`forecast.md`](../../examples/weather-agent/agent/skills/forecast.md), [`researcher/`](../../examples/weather-agent/agent/subagents/researcher/) | Load a procedure on demand or delegate broad research. |
31
- | Schedule and hooks | [`heartbeat.md`](../../examples/weather-agent/agent/schedules/heartbeat.md), [`audit.ts`](../../examples/weather-agent/agent/hooks/audit.ts), [`journal.ts`](../../examples/weather-agent/agent/hooks/journal.ts) | Start recurring tasks, log usage, and save turn summaries. |
32
- | A/B and evals | [`agent/ab.ts`](../../examples/weather-agent/agent/ab.ts), [`evals/`](../../examples/weather-agent/evals/) | Compare a sticky variant and protect tool routing with regression cases. |
33
-
34
- ## Follow one request
35
-
36
- A current-weather question takes this path:
37
-
38
- 1. The built-in HTTP channel, Slack, or the custom `/report` route creates a
39
- durable session.
40
- 2. `instructions.md` tells the model to call `get_weather` instead of
41
- guessing.
42
- 3. The server tool geocodes the city, fetches Open-Meteo, validates the
43
- response, and returns normalized fields.
44
- 4. The agent writes a short answer. The Agent SDK records every event in the
45
- session stream.
46
- 5. The audit hook observes `turn.completed`. If the session joined the A/B
47
- experiment, the collector updates its metrics too.
48
-
49
- Forecasts route to `get_forecast`. Unit conversions route to
50
- `convert_temperature`, which calls the `units` MCP server through
51
- `ctx.host.mcp`. Climate history and broad comparisons route to the
52
- `researcher` subagent.
53
-
54
- ## Prepare the example
55
-
56
- You need:
57
-
58
- - Node 22.13 or newer.
59
- - An agent-runtime credential.
60
- - Network access to Open-Meteo.
61
- - Python 3 for `save_weather_note`.
62
-
63
- The project mounts an account-linked Slack channel. The Agent SDK checks the
64
- connection at startup, so sign in even when you plan to call a deterministic
65
- tool.
66
-
67
- The optional dedicated Slack app also needs a token pair.
68
- `agent-sdk slack create --dir examples/weather-agent` provisions the
69
- app and writes the tokens for you (see the
70
- [Slack guide](../guides/slack.md#set-it-up)); with hand-minted tokens,
71
- export them instead:
72
-
73
- ```bash
74
- export WEATHER_AGENT_SLACK_BOT_TOKEN=xoxb-...
75
- export WEATHER_AGENT_SLACK_APP_TOKEN=xapp-...
76
- agent-sdk slack doctor --prefix WEATHER_AGENT
77
- ```
78
-
79
- Without those two tokens, the dedicated channel stays idle. The
80
- account-linked channel still works.
81
-
82
- ## Inspect before running
83
-
84
- ```bash
85
- agent-sdk validate --dir examples/weather-agent
86
- agent-sdk info --dir examples/weather-agent --json
87
- agent-sdk eval --dir examples/weather-agent --list
88
- ```
89
-
90
- `validate` should pass. `info` and `eval --list` should match the capabilities
91
- described above.
92
-
93
- ## Call the typed tools
94
-
95
- Start with the current-weather server tool:
96
-
97
- ```bash
98
- agent-sdk call get_weather \
99
- --dir examples/weather-agent \
100
- --input '{"city":"New York City"}'
101
- ```
102
-
103
- `defineTool` gives the input a Zod schema. The Agent SDK validates the JSON before
104
- `execute` runs. The result includes the matched place, condition,
105
- temperature, humidity, wind, gusts, and precipitation.
106
-
107
- Try the forecast:
108
-
109
- ```bash
110
- agent-sdk call get_forecast \
111
- --dir examples/weather-agent \
112
- --input '{"city":"Lisbon","days":5}'
113
- ```
114
-
115
- The tool accepts one to seven days. Shared Open-Meteo code lives under
116
- `agent/lib/`, so the Agent SDK imports it without discovering another tool.
117
-
118
- ## Compare server and agent execution
119
-
120
- Most weather tools use the default `execution: "server"`. Their TypeScript
121
- runs inside the serve host and can reach `ctx.host` services.
122
-
123
- `save_weather_note` uses `execution: "agent"` instead. The Agent SDK materializes
124
- its script into the agent environment. The script reads JSON from stdin and
125
- appends to `weather-notes.md` in that session's workspace:
126
-
127
- ```bash
128
- agent-sdk run --dir examples/weather-agent \
129
- --message "Save a note that Boston is cold and windy."
130
- ```
131
-
132
- Each session gets its own workspace. Saving a note doesn't edit the authored
133
- example.
134
-
135
- This split matters on cloud. Server tools stay on the Agent SDK host.
136
- Agent tools run inside the cloud workspace.
137
-
138
- ## Verify tool execution on the agent VM
139
-
140
- Ask the agent to call `probe_cloud_tool` on the `probe` MCP server.
141
- `agent/mcp-connections/probe.ts` authors that tool as TypeScript. The Agent
142
- SDK packages it as stdio MCP so a cloud VM with no checkout of this example
143
- can still run it. The model lists the server and calls the tool; it does
144
- not write a `.sh`.
145
-
146
- A real call writes `vm-tool-observations/<id>.json` in the agent cwd and
147
- returns hostname, cwd, and pid. Stream events show `probe:probe_cloud_tool`,
148
- not `shell`.
149
-
150
- A local `.agent-serve/tools/probe_cloud_tool.sh` or a marker under `probes/`
151
- means the model invented a substitute.
152
-
153
- ```bash
154
- agent-sdk run --dir examples/weather-agent \
155
- --message "Test custom tool execution from this cloud agent. Call probe_cloud_tool."
156
- ```
157
-
158
- ## Use MCP connections in three places
159
-
160
- `agent/mcp-connections/units.ts` starts a local stdio server. The filename
161
- makes its server name `units`. The Agent SDK exposes it to:
162
-
163
- - the model as MCP tools,
164
- - server tools through `ctx.host.mcp`, and
165
- - channel handlers through `host.mcp`.
166
-
167
- `probe` is a second stdio connection. Its tools are TypeScript `execute`
168
- functions; the Agent SDK packages them so a cloud VM can spawn the server
169
- without this checkout. The model calls `probe_cloud_tool` directly; no host
170
- tool wraps it.
171
-
172
- `convert_temperature` demonstrates the server-tool path:
173
-
174
- ```bash
175
- agent-sdk call convert_temperature \
176
- --dir examples/weather-agent \
177
- --input '{"value":72,"from":"F"}'
178
- ```
179
-
180
- The custom channel demonstrates the handler path. Start the dev server:
181
-
182
- ```bash
183
- agent-sdk dev examples/weather-agent
184
- ```
185
-
186
- Then call MCP deterministically through `/convert`:
187
-
188
- ```bash
189
- curl -s -X POST \
190
- http://127.0.0.1:3000/weather-agent/v1/channels/webhook/convert \
191
- -H 'content-type: application/json' \
192
- -d '{"value":20,"from":"C"}'
193
- ```
194
-
195
- No model chooses a tool in this route. The handler calls the MCP server and
196
- returns its result.
197
-
198
- ## Keep conversation state in a custom channel
199
-
200
- `POST /report` starts a model turn and waits for it:
201
-
202
- ```bash
203
- curl -s -X POST \
204
- http://127.0.0.1:3000/weather-agent/v1/channels/webhook/report \
205
- -H 'content-type: application/json' \
206
- -d '{"message":"What is the weather in Paris?"}'
207
- ```
208
-
209
- The response includes a `key`. Send it back on the next request to continue
210
- the same session:
211
-
212
- ```bash
213
- curl -s -X POST \
214
- http://127.0.0.1:3000/weather-agent/v1/channels/webhook/report \
215
- -H 'content-type: application/json' \
216
- -d '{"message":"How about tomorrow?","key":"<key>"}'
217
- ```
218
-
219
- This is the custom-channel version of a continuation token. See
220
- [webhooks and custom channels](../guides/webhooks.md) for route schemas,
221
- authentication, and asynchronous handlers.
222
-
223
- ## Load procedures and delegate research
224
-
225
- The forecast skill gives the root agent an on-demand procedure. The Agent SDK
226
- advertises the skill's description, then the harness loads its content when
227
- the request matches.
228
-
229
- The `researcher` directory is an SDK subagent. Its description tells the
230
- parent when to delegate. It inherits the parent's execution surface, but
231
- gets its own instructions:
232
-
233
- ```bash
234
- agent-sdk run --dir examples/weather-agent \
235
- --message "Compare record summer temperatures across Paris, London, and Rome."
236
- ```
237
-
238
- Use a skill when the same agent needs a procedure. Use a subagent when the
239
- parent should hand a bounded task to a specialist. The
240
- [subagents reference](../reference/subagents.md) explains the current
241
- inheritance limits.
242
-
243
- ## Trigger the schedule and inspect the hook
244
-
245
- The heartbeat schedule runs at 09:00 UTC on weekdays. Automatic schedule
246
- timers stay off under `--dev`, so dispatch it manually:
247
-
248
- ```bash
249
- curl -s -X POST \
250
- http://127.0.0.1:3000/weather-agent/v1/dev/schedules/heartbeat
251
- ```
252
-
253
- It creates a task session to check San Francisco, New York, and London.
254
- The audit hook logs usage after each completed turn. Hooks observe recorded
255
- events; their failures don't fail the turn.
256
-
257
- ## Measure variants and regressions
258
-
259
- The `weather-tool-efficiency` A/B experiment assigns sessions by a sticky
260
- hash:
261
-
262
- - `control` returns current conditions in Fahrenheit.
263
- - `treatment` adds a brief Celsius instruction and changes `get_weather` to
264
- return Celsius fields.
265
-
266
- Samples and aggregate snapshots persist under `.agent-serve/`. The treatment
267
- only changes current conditions; `get_forecast` still returns Fahrenheit.
268
- Treat the branch as an example of `ctx.session.abs`, not a complete unit
269
- policy.
270
-
271
- List and run the evals:
272
-
273
- ```bash
274
- agent-sdk eval --dir examples/weather-agent --list
275
- agent-sdk eval --dir examples/weather-agent --json
276
- ```
277
-
278
- The suite covers weather and forecast routing, the local converter, workspace
279
- notes, and the VM-side probe.
280
-
281
- ## Turn the weather tour into your own agent
282
-
283
- Keep the shape and replace the domain:
284
-
285
- - Swap Open-Meteo tools for your typed service clients.
286
- - Keep deterministic transforms behind direct server tools or MCP.
287
- - Use an agent tool only when code must run in the agent workspace.
288
- - Put reusable procedures in skills and narrow specialist work into
289
- subagents.
290
- - Add a channel only when the external surface needs its own identity,
291
- continuation key, or delivery behavior.
292
-
293
- ## Where to go next
294
-
295
- - [Tools](../reference/tools.md)
296
- - [MCP connections](../reference/connections.md)
297
- - [Human-in-the-loop approvals](../guides/human-in-the-loop.md)
298
- - [Slack](../guides/slack.md)
299
- - [Schedules and reminders](../reference/schedules.md)
300
- - [Evals](../evals.md)
301
- - [Live A/B metrics](../ab.md)
@@ -1,202 +0,0 @@
1
- /**
2
- * Cursor-account mode for the Slack channel pack: instead of a dedicated
3
- * Slack app (Socket Mode + `xoxb`/`xapp` tokens), the channel rides the
4
- * signed-in Cursor account's Slack connection. Inbound events are relayed
5
- * by the serve host from `/v0/slack-events` (see
6
- * `internal/cursor-slack-relay.ts`); outbound Web API calls run through a
7
- * {@link SlackApiTransport} bound to the backend proxy.
8
- *
9
- * This file is the seam between the channel definition (authored at
10
- * `defineChannel` time) and the serve-time relay: `slackChannel()` registers
11
- * a runtime ref here, and the server discovers it, binds the transport, and
12
- * dispatches relayed envelopes through the pack's normal inbound path.
13
- */
14
-
15
- import type { ArtifactsApi, HostContext, SendMessageFn } from "../../types.js";
16
- import { dispatchInboundMessage } from "./dispatch.js";
17
- import type { EventIdDedupe } from "./event-id-dedupe.js";
18
- import { slackTextToMarkdown } from "./inbound.js";
19
- import type { SlackLog } from "./log.js";
20
- import type {
21
- SlackApiTransport,
22
- SlackChannelOptions,
23
- SlackCredentials,
24
- SlackMessage,
25
- SlackMessageFile,
26
- SlackMessageHandler,
27
- } from "./types.js";
28
-
29
- /**
30
- * Transport placeholder created at `slackChannel()` definition time and
31
- * bound to the real backend proxy caller when the serve host starts its
32
- * relay. Calls before binding soft-fail Slack-style.
33
- */
34
- export interface PendingSlackApiTransport extends SlackApiTransport {
35
- bind(impl: SlackApiTransport["call"]): void;
36
- }
37
-
38
- export function createPendingSlackApiTransport(): PendingSlackApiTransport {
39
- let bound: SlackApiTransport["call"] | undefined;
40
- return {
41
- kind: "api-transport",
42
- label: "cursor-account",
43
- bind(impl) {
44
- bound = impl;
45
- },
46
- async call(method, args) {
47
- if (bound === undefined) {
48
- return { ok: false, error: "cursor_slack_relay_not_started" };
49
- }
50
- return bound(method, args);
51
- },
52
- };
53
- }
54
-
55
- /**
56
- * One routed Slack event from `/v0/slack-events` (mirror of the backend's
57
- * SlackAgentEventEnvelope, minus server-only fields).
58
- */
59
- export interface CursorSlackEnvelope {
60
- eventName: string;
61
- slackTeamId: string;
62
- channelId: string;
63
- channelType?: string;
64
- threadTs: string;
65
- messageTs: string;
66
- slackUserId?: string;
67
- text: string;
68
- agentName: string;
69
- consumerId: string;
70
- /**
71
- * How the backend routed the event: leading agent name or owned thread.
72
- */
73
- matchedBy: "name" | "thread";
74
- eventId?: string;
75
- receivedAtMs: number;
76
- /**
77
- * Slack file uploads on the triggering message. When `dataBase64` is set
78
- * the Cursor backend already downloaded bytes (cursorAccount has no bot
79
- * token for files.slack.com).
80
- */
81
- files?: SlackMessageFile[];
82
- }
83
-
84
- /** Serve-time runtime handle for one cursor-account Slack channel. */
85
- export interface SlackCursorAccountRuntime {
86
- options: SlackChannelOptions;
87
- /** The channel's live credentials (botToken slot holds the transport). */
88
- credentials: SlackCredentials;
89
- transport: PendingSlackApiTransport;
90
- eventIds: EventIdDedupe;
91
- onAppMention: SlackMessageHandler;
92
- onDirectMessage: SlackMessageHandler;
93
- getLog: () => SlackLog;
94
- }
95
-
96
- const runtimeByDefinition = new WeakMap<object, SlackCursorAccountRuntime>();
97
-
98
- export function registerSlackCursorAccountRuntime(
99
- definition: object,
100
- runtime: SlackCursorAccountRuntime
101
- ): void {
102
- runtimeByDefinition.set(definition, runtime);
103
- }
104
-
105
- /**
106
- * Recover the cursor-account runtime for a channel definition, if it was
107
- * created via `slackChannel({ cursorAccount: true })`.
108
- */
109
- export function getSlackCursorAccountRuntime(
110
- definition: object
111
- ): SlackCursorAccountRuntime | undefined {
112
- return runtimeByDefinition.get(definition);
113
- }
114
-
115
- /**
116
- * Dispatch one relayed envelope through the pack's normal inbound path
117
- * (same handlers, session continuation, and reply delivery as Socket Mode).
118
- */
119
- export async function dispatchCursorSlackEnvelope(args: {
120
- runtime: SlackCursorAccountRuntime;
121
- envelope: CursorSlackEnvelope;
122
- send: SendMessageFn;
123
- host: HostContext;
124
- artifacts: ArtifactsApi;
125
- hasContinuationSession?: (continuationToken: string) => Promise<boolean>;
126
- isContinuationBusy?: (continuationToken: string) => Promise<boolean>;
127
- getContinuationLastBotMessageTs?: (
128
- continuationToken: string
129
- ) => Promise<string | undefined>;
130
- interruptContinuation?: (continuationToken: string) => Promise<boolean>;
131
- }): Promise<void> {
132
- const { runtime, envelope } = args;
133
- const log = runtime.getLog();
134
-
135
- if (
136
- envelope.eventId !== undefined &&
137
- envelope.eventId.length > 0 &&
138
- !runtime.eventIds.tryHandle(envelope.eventId)
139
- ) {
140
- log.debug("cursor-account inbound dedupe drop", {
141
- event_id: envelope.eventId,
142
- });
143
- return;
144
- }
145
-
146
- const message: SlackMessage = {
147
- text: envelope.text,
148
- body: envelope.text,
149
- markdown: slackTextToMarkdown(envelope.text),
150
- ts: envelope.messageTs,
151
- threadTs: envelope.threadTs,
152
- channelId: envelope.channelId,
153
- teamId: envelope.slackTeamId,
154
- ...(envelope.slackUserId === undefined
155
- ? {}
156
- : {
157
- author: { userId: envelope.slackUserId, isBot: false },
158
- }),
159
- files: envelope.files,
160
- };
161
-
162
- // DMs to @Cursor route as direct messages; everything else (explicit
163
- // `@Cursor <agent> …` mentions and claimed-thread replies) dispatches on
164
- // the mention handler — a claimed-thread reply is addressed to the agent
165
- // by construction. Mentions/DM disable toggles are rejected at
166
- // `slackChannel({ cursorAccount: true })` construction so the backend
167
- // never consumes events the host would drop.
168
- const isDm =
169
- envelope.channelType === "im" || envelope.channelId.startsWith("D");
170
- const kind = isDm ? "direct_message" : "app_mention";
171
- const handler = isDm ? runtime.onDirectMessage : runtime.onAppMention;
172
- await dispatchInboundMessage({
173
- kind,
174
- message,
175
- handler,
176
- send: args.send,
177
- credentials: runtime.credentials,
178
- host: args.host,
179
- artifacts: args.artifacts,
180
- log,
181
- evalCommandsEnabled: runtime.options.evalCommands !== false,
182
- cursorAgentName: envelope.agentName,
183
- // Backend router already refused externals for this envelope.
184
- blockExternals: false,
185
- ...(args.hasContinuationSession === undefined
186
- ? {}
187
- : { hasContinuationSession: args.hasContinuationSession }),
188
- ...(args.isContinuationBusy === undefined
189
- ? {}
190
- : { isContinuationBusy: args.isContinuationBusy }),
191
- ...(args.getContinuationLastBotMessageTs === undefined
192
- ? {}
193
- : {
194
- getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
195
- }),
196
- ...(args.interruptContinuation === undefined
197
- ? {}
198
- : { interruptContinuation: args.interruptContinuation }),
199
- continuation: runtime.options.continuation,
200
- ...(envelope.eventId === undefined ? {} : { eventId: envelope.eventId }),
201
- });
202
- }