@cursor/july 0.1.90 → 0.1.92

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 (335) hide show
  1. package/AGENTS.md +12 -0
  2. package/README.md +8 -7
  3. package/dist/channels/slack/channel-watch.d.ts +1 -1
  4. package/dist/channels/slack/channel-watch.js +1 -1
  5. package/dist/channels/slack/slack-channel.js +1 -1
  6. package/dist/channels/slack/types.d.ts +2 -4
  7. package/dist/channels/slack/types.d.ts.map +1 -1
  8. package/dist/docs/404.html +5 -3
  9. package/dist/docs/ab.html +9 -7
  10. package/dist/docs/ab.md +338 -0
  11. package/dist/docs/assets/{ab.md.DYjwREAP.js → ab.md.CVzWxLoB.js} +1 -1
  12. package/dist/docs/assets/{ab.md.DYjwREAP.lean.js → ab.md.CVzWxLoB.lean.js} +1 -1
  13. package/dist/docs/assets/{app.wiNkt6G7.js → app.Bci6CM9E.js} +1 -1
  14. package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.js → building-with-agents.md.DH8A_cHA.js} +1 -1
  15. package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.lean.js → building-with-agents.md.DH8A_cHA.lean.js} +1 -1
  16. package/dist/docs/assets/chunks/@localSearchIndexroot.Dv-Q0XtU.js +1 -0
  17. package/dist/docs/assets/chunks/{VPLocalSearchBox.ByhUGu47.js → VPLocalSearchBox.BCPT6xA-.js} +1 -1
  18. package/dist/docs/assets/chunks/{framework.CAZyNGu9.js → framework.BCISBCiQ.js} +1 -1
  19. package/dist/docs/assets/chunks/theme.BEA8BF3c.js +2 -0
  20. package/dist/docs/assets/{concepts.md.2NfkGjqM.js → concepts.md.CRfU3bVg.js} +1 -1
  21. package/dist/docs/assets/{concepts.md.2NfkGjqM.lean.js → concepts.md.CRfU3bVg.lean.js} +1 -1
  22. package/dist/docs/assets/{deployment.md.B8kW-h7P.js → deployment.md.DX_hc3ze.js} +6 -5
  23. package/dist/docs/assets/{deployment.md.B8kW-h7P.lean.js → deployment.md.DX_hc3ze.lean.js} +1 -1
  24. package/dist/docs/assets/{evals.md.CVe_O75-.js → evals.md.a0SMN6r9.js} +3 -3
  25. package/dist/docs/assets/{evals.md.CVe_O75-.lean.js → evals.md.a0SMN6r9.lean.js} +1 -1
  26. package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.js → example-agents_approval-buddy.md.DNL83puR.js} +1 -1
  27. package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.lean.js → example-agents_approval-buddy.md.DNL83puR.lean.js} +1 -1
  28. package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.js → example-agents_benny.md.C40vHRLc.js} +1 -1
  29. package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.lean.js → example-agents_benny.md.C40vHRLc.lean.js} +1 -1
  30. package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.js → example-agents_bugbot.md.BRGMi9O2.js} +1 -1
  31. package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.lean.js → example-agents_bugbot.md.BRGMi9O2.lean.js} +1 -1
  32. package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.js → example-agents_codebase-wiki.md.Dftj_tPp.js} +1 -1
  33. package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.lean.js → example-agents_codebase-wiki.md.Dftj_tPp.lean.js} +1 -1
  34. package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.js → example-agents_codeowners-review.md.Bfta-lBU.js} +1 -1
  35. package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.lean.js → example-agents_codeowners-review.md.Bfta-lBU.lean.js} +1 -1
  36. package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.js → example-agents_concierge.md.MrKpQndp.js} +1 -1
  37. package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.lean.js → example-agents_concierge.md.MrKpQndp.lean.js} +1 -1
  38. package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.js → example-agents_fsd.md.ZWHWWZPE.js} +1 -1
  39. package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.lean.js → example-agents_fsd.md.ZWHWWZPE.lean.js} +1 -1
  40. package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.js +2 -0
  41. package/dist/docs/assets/{example-agents_index.md.xmJ87d_3.lean.js → example-agents_index.md.QZ8mhr6n.lean.js} +1 -1
  42. package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.js → example-agents_knowledge-base.md.DqKqHQ9u.js} +1 -1
  43. package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.lean.js → example-agents_knowledge-base.md.DqKqHQ9u.lean.js} +1 -1
  44. package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.js → example-agents_oncall.md.DK4XkYTd.js} +1 -1
  45. package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.lean.js → example-agents_oncall.md.DK4XkYTd.lean.js} +1 -1
  46. package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.js → example-agents_security-reviewer.md.Bai6D0Ee.js} +4 -4
  47. package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.lean.js → example-agents_security-reviewer.md.Bai6D0Ee.lean.js} +1 -1
  48. package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.js → example-agents_slack-agent.md.D7Kdj5BV.js} +1 -1
  49. package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.lean.js → example-agents_slack-agent.md.D7Kdj5BV.lean.js} +1 -1
  50. package/dist/docs/assets/{example-agents_weather-agent.md.DC3lINjo.js → example-agents_weather-agent.md.lVEAbWFf.js} +5 -5
  51. package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.lean.js +1 -0
  52. package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.js → guides_agent-to-agent.md.BCeVdJRJ.js} +1 -1
  53. package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.lean.js → guides_agent-to-agent.md.BCeVdJRJ.lean.js} +1 -1
  54. package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.js → guides_cloud-runtime.md.BSMLIBHr.js} +1 -1
  55. package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.lean.js → guides_cloud-runtime.md.BSMLIBHr.lean.js} +1 -1
  56. package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.js → guides_convert-automation.md.D06eIzea.js} +1 -1
  57. package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.lean.js → guides_convert-automation.md.D06eIzea.lean.js} +1 -1
  58. package/dist/docs/assets/{guides_github.md.CLLQJKRB.js → guides_github.md.Cdt1s2QC.js} +4 -4
  59. package/dist/docs/assets/{guides_github.md.CLLQJKRB.lean.js → guides_github.md.Cdt1s2QC.lean.js} +1 -1
  60. package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.js → guides_human-in-the-loop.md.By1G2T3_.js} +1 -1
  61. package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.lean.js → guides_human-in-the-loop.md.By1G2T3_.lean.js} +1 -1
  62. package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.js → guides_mcp-oauth.md.Du0f7pGU.js} +1 -1
  63. package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.lean.js → guides_mcp-oauth.md.Du0f7pGU.lean.js} +1 -1
  64. package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.js → guides_opentelemetry.md.bmPmkvJu.js} +1 -1
  65. package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.lean.js → guides_opentelemetry.md.bmPmkvJu.lean.js} +1 -1
  66. package/dist/docs/assets/{guides_slack.md.DP4H75WP.js → guides_slack.md.DiUmk_Oi.js} +5 -5
  67. package/dist/docs/assets/{guides_slack.md.DP4H75WP.lean.js → guides_slack.md.DiUmk_Oi.lean.js} +1 -1
  68. package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.js → guides_webhooks.md.BpnIdO0i.js} +5 -6
  69. package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.lean.js → guides_webhooks.md.BpnIdO0i.lean.js} +1 -1
  70. package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.js → hillclimbing.md.ywF3yDAd.js} +1 -1
  71. package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.lean.js → hillclimbing.md.ywF3yDAd.lean.js} +1 -1
  72. package/dist/docs/assets/index.md.BAaMXLFd.js +5 -0
  73. package/dist/docs/assets/{index.md.DhRHS_-L.lean.js → index.md.BAaMXLFd.lean.js} +1 -1
  74. package/dist/docs/assets/{quickstart.md.DZxBu44y.js → quickstart.md.DsrarzEg.js} +1 -1
  75. package/dist/docs/assets/{quickstart.md.DZxBu44y.lean.js → quickstart.md.DsrarzEg.lean.js} +1 -1
  76. package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.js → reference_agent-config.md.Bqylgw50.js} +1 -1
  77. package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.lean.js → reference_agent-config.md.Bqylgw50.lean.js} +1 -1
  78. package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.js → reference_artifacts.md.Dior32Qw.js} +1 -1
  79. package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.lean.js → reference_artifacts.md.Dior32Qw.lean.js} +1 -1
  80. package/dist/docs/assets/{reference_channels.md.CboFd5IH.js → reference_channels.md.DQZjCnyh.js} +2 -2
  81. package/dist/docs/assets/{reference_channels.md.CboFd5IH.lean.js → reference_channels.md.DQZjCnyh.lean.js} +1 -1
  82. package/dist/docs/assets/{reference_cli.md.TAaYU8br.js → reference_cli.md.B7GkAJRC.js} +8 -7
  83. package/dist/docs/assets/{reference_cli.md.TAaYU8br.lean.js → reference_cli.md.B7GkAJRC.lean.js} +1 -1
  84. package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.js → reference_connections.md.DYidrb-j.js} +5 -5
  85. package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.lean.js → reference_connections.md.DYidrb-j.lean.js} +1 -1
  86. package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.js → reference_hooks.md.B9FSgdDe.js} +1 -1
  87. package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.lean.js → reference_hooks.md.B9FSgdDe.lean.js} +1 -1
  88. package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.js → reference_http-api.md.CSHVobzG.js} +4 -4
  89. package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.lean.js → reference_http-api.md.CSHVobzG.lean.js} +1 -1
  90. package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.js → reference_instructions.md.DhNCOl7r.js} +1 -1
  91. package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.lean.js → reference_instructions.md.DhNCOl7r.lean.js} +1 -1
  92. package/dist/docs/assets/{reference_playground.md.CPZhfYaO.js → reference_playground.md.Dfb92yQf.js} +1 -1
  93. package/dist/docs/assets/{reference_playground.md.CPZhfYaO.lean.js → reference_playground.md.Dfb92yQf.lean.js} +1 -1
  94. package/dist/docs/assets/{reference_project-layout.md.CueaKpjr.js → reference_project-layout.md.CwkSbEWT.js} +1 -1
  95. package/dist/docs/assets/{reference_project-layout.md.CueaKpjr.lean.js → reference_project-layout.md.CwkSbEWT.lean.js} +1 -1
  96. package/dist/docs/assets/{reference_prompt.md.BaiweQxE.js → reference_prompt.md.DZUMtLPD.js} +1 -1
  97. package/dist/docs/assets/{reference_prompt.md.BaiweQxE.lean.js → reference_prompt.md.DZUMtLPD.lean.js} +1 -1
  98. package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.js → reference_schedules.md.DNipebiG.js} +1 -1
  99. package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.lean.js → reference_schedules.md.DNipebiG.lean.js} +1 -1
  100. package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.js → reference_sessions.md.tUFzz98S.js} +1 -1
  101. package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.lean.js → reference_sessions.md.tUFzz98S.lean.js} +1 -1
  102. package/dist/docs/assets/{reference_skills.md.BRF2nDv9.js → reference_skills.md.B5ZEuHfG.js} +1 -1
  103. package/dist/docs/assets/{reference_skills.md.BRF2nDv9.lean.js → reference_skills.md.B5ZEuHfG.lean.js} +1 -1
  104. package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.js → reference_subagents.md.Xoav0AII.js} +1 -1
  105. package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.lean.js → reference_subagents.md.Xoav0AII.lean.js} +1 -1
  106. package/dist/docs/assets/{reference_tools.md.XmeFP_3d.js → reference_tools.md.wpaJtHn6.js} +2 -3
  107. package/dist/docs/assets/{reference_tools.md.XmeFP_3d.lean.js → reference_tools.md.wpaJtHn6.lean.js} +1 -1
  108. package/dist/docs/assets/{scaffolding-agents.md.BpMFXv2J.js → scaffolding-agents.md.CRDDUtYJ.js} +1 -1
  109. package/dist/docs/assets/{scaffolding-agents.md.BpMFXv2J.lean.js → scaffolding-agents.md.CRDDUtYJ.lean.js} +1 -1
  110. package/dist/docs/assets/{storage.md.ks1u64_R.js → storage.md.JbjlHWZ6.js} +1 -1
  111. package/dist/docs/assets/{storage.md.ks1u64_R.lean.js → storage.md.JbjlHWZ6.lean.js} +1 -1
  112. package/dist/docs/assets/{style.kTsvp4pE.css → style.BRuM8477.css} +1 -1
  113. package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.js → templates_agentic-owners.md.DSJSIpWU.js} +1 -1
  114. package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.lean.js → templates_agentic-owners.md.DSJSIpWU.lean.js} +1 -1
  115. package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.js → templates_demo.md.DhFcWN6j.js} +1 -1
  116. package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.lean.js → templates_demo.md.DhFcWN6j.lean.js} +1 -1
  117. package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.js → templates_pr-autofixer.md.1HAR3RXE.js} +1 -1
  118. package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.lean.js → templates_pr-autofixer.md.1HAR3RXE.lean.js} +1 -1
  119. package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.js → templates_security-reviewer.md.ByFyRta2.js} +1 -1
  120. package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.lean.js → templates_security-reviewer.md.ByFyRta2.lean.js} +1 -1
  121. package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.js → templates_triage.md.CVlpctKS.js} +2 -2
  122. package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.lean.js → templates_triage.md.CVlpctKS.lean.js} +1 -1
  123. package/dist/docs/assets/troubleshooting.md.DYECCZiJ.js +1 -0
  124. package/dist/docs/assets/{troubleshooting.md.KgmmaCgw.lean.js → troubleshooting.md.DYECCZiJ.lean.js} +1 -1
  125. package/dist/docs/building-with-agents.html +9 -7
  126. package/dist/docs/building-with-agents.md +124 -0
  127. package/dist/docs/concepts.html +9 -7
  128. package/dist/docs/concepts.md +174 -0
  129. package/dist/docs/deployment.html +13 -10
  130. package/dist/docs/deployment.md +464 -0
  131. package/dist/docs/evals.html +10 -8
  132. package/dist/docs/evals.md +481 -0
  133. package/dist/docs/example-agents/approval-buddy.html +9 -7
  134. package/dist/docs/example-agents/approval-buddy.md +266 -0
  135. package/dist/docs/example-agents/benny.html +9 -7
  136. package/dist/docs/example-agents/benny.md +182 -0
  137. package/dist/docs/example-agents/bugbot.html +9 -7
  138. package/dist/docs/example-agents/bugbot.md +229 -0
  139. package/dist/docs/example-agents/codebase-wiki.html +9 -7
  140. package/dist/docs/example-agents/codebase-wiki.md +170 -0
  141. package/dist/docs/example-agents/codeowners-review.html +9 -7
  142. package/dist/docs/example-agents/codeowners-review.md +192 -0
  143. package/dist/docs/example-agents/concierge.html +9 -7
  144. package/dist/docs/example-agents/concierge.md +201 -0
  145. package/dist/docs/example-agents/fsd.html +9 -7
  146. package/dist/docs/example-agents/fsd.md +329 -0
  147. package/dist/docs/example-agents/index.html +9 -7
  148. package/dist/docs/example-agents/index.md +102 -0
  149. package/dist/docs/example-agents/knowledge-base.html +9 -7
  150. package/dist/docs/example-agents/knowledge-base.md +168 -0
  151. package/dist/docs/example-agents/oncall.html +9 -7
  152. package/dist/docs/example-agents/oncall.md +212 -0
  153. package/dist/docs/example-agents/security-reviewer.html +12 -10
  154. package/dist/docs/example-agents/security-reviewer.md +265 -0
  155. package/dist/docs/example-agents/slack-agent.html +9 -7
  156. package/dist/docs/example-agents/slack-agent.md +142 -0
  157. package/dist/docs/example-agents/weather-agent.html +14 -12
  158. package/dist/docs/example-agents/weather-agent.md +296 -0
  159. package/dist/docs/guides/agent-to-agent.html +9 -7
  160. package/dist/docs/guides/agent-to-agent.md +113 -0
  161. package/dist/docs/guides/cloud-runtime.html +9 -7
  162. package/dist/docs/guides/cloud-runtime.md +131 -0
  163. package/dist/docs/guides/convert-automation.html +9 -7
  164. package/dist/docs/guides/convert-automation.md +171 -0
  165. package/dist/docs/guides/github.html +11 -9
  166. package/dist/docs/guides/github.md +287 -0
  167. package/dist/docs/guides/human-in-the-loop.html +9 -7
  168. package/dist/docs/guides/human-in-the-loop.md +126 -0
  169. package/dist/docs/guides/mcp-oauth.html +9 -7
  170. package/dist/docs/guides/mcp-oauth.md +159 -0
  171. package/dist/docs/guides/opentelemetry.html +9 -7
  172. package/dist/docs/guides/opentelemetry.md +209 -0
  173. package/dist/docs/guides/slack.html +12 -10
  174. package/dist/docs/guides/slack.md +337 -0
  175. package/dist/docs/guides/webhooks.html +12 -11
  176. package/dist/docs/guides/webhooks.md +463 -0
  177. package/dist/docs/hashmap.json +1 -1
  178. package/dist/docs/hillclimbing.html +9 -7
  179. package/dist/docs/hillclimbing.md +88 -0
  180. package/dist/docs/index.html +10 -8
  181. package/dist/docs/index.md +179 -0
  182. package/dist/docs/llms-full.txt +11518 -0
  183. package/dist/docs/llms.txt +75 -0
  184. package/dist/docs/quickstart.html +9 -7
  185. package/dist/docs/quickstart.md +364 -0
  186. package/dist/docs/reference/agent-config.html +9 -7
  187. package/dist/docs/reference/agent-config.md +256 -0
  188. package/dist/docs/reference/artifacts.html +9 -7
  189. package/dist/docs/reference/artifacts.md +112 -0
  190. package/dist/docs/reference/channels.html +10 -8
  191. package/dist/docs/reference/channels.md +255 -0
  192. package/dist/docs/reference/cli.html +15 -12
  193. package/dist/docs/reference/cli.md +957 -0
  194. package/dist/docs/reference/connections.html +12 -10
  195. package/dist/docs/reference/connections.md +268 -0
  196. package/dist/docs/reference/hooks.html +9 -7
  197. package/dist/docs/reference/hooks.md +102 -0
  198. package/dist/docs/reference/http-api.html +12 -10
  199. package/dist/docs/reference/http-api.md +267 -0
  200. package/dist/docs/reference/instructions.html +9 -7
  201. package/dist/docs/reference/instructions.md +74 -0
  202. package/dist/docs/reference/playground.html +9 -7
  203. package/dist/docs/reference/playground.md +62 -0
  204. package/dist/docs/reference/project-layout.html +9 -7
  205. package/dist/docs/reference/project-layout.md +107 -0
  206. package/dist/docs/reference/prompt.html +9 -7
  207. package/dist/docs/reference/prompt.md +42 -0
  208. package/dist/docs/reference/schedules.html +9 -7
  209. package/dist/docs/reference/schedules.md +215 -0
  210. package/dist/docs/reference/sessions.html +9 -7
  211. package/dist/docs/reference/sessions.md +170 -0
  212. package/dist/docs/reference/skills.html +9 -7
  213. package/dist/docs/reference/skills.md +83 -0
  214. package/dist/docs/reference/subagents.html +9 -7
  215. package/dist/docs/reference/subagents.md +71 -0
  216. package/dist/docs/reference/tools.html +10 -9
  217. package/dist/docs/reference/tools.md +298 -0
  218. package/dist/docs/scaffolding-agents.html +9 -7
  219. package/dist/docs/scaffolding-agents.md +130 -0
  220. package/dist/docs/storage.html +9 -7
  221. package/dist/docs/storage.md +219 -0
  222. package/dist/docs/templates/agentic-owners.html +9 -7
  223. package/dist/docs/templates/agentic-owners.md +92 -0
  224. package/dist/docs/templates/demo.html +9 -7
  225. package/dist/docs/templates/demo.md +79 -0
  226. package/dist/docs/templates/pr-autofixer.html +9 -7
  227. package/dist/docs/templates/pr-autofixer.md +131 -0
  228. package/dist/docs/templates/security-reviewer.html +9 -7
  229. package/dist/docs/templates/security-reviewer.md +84 -0
  230. package/dist/docs/templates/triage.html +10 -8
  231. package/dist/docs/templates/triage.md +98 -0
  232. package/dist/docs/troubleshooting.html +9 -7
  233. package/dist/docs/troubleshooting.md +111 -0
  234. package/dist/internal/cli-deploy.d.ts.map +1 -1
  235. package/dist/internal/cli-deploy.js +21 -3
  236. package/dist/internal/cursor-agent-template.d.ts +1 -1
  237. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  238. package/dist/internal/cursor-agent-template.js +1 -0
  239. package/dist/internal/deploy-client.d.ts +18 -0
  240. package/dist/internal/deploy-client.d.ts.map +1 -1
  241. package/dist/internal/deploy-client.js +25 -1
  242. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  243. package/dist/internal/deploy-manifest.js +5 -1
  244. package/dist/internal/discovery.d.ts +5 -1
  245. package/dist/internal/discovery.d.ts.map +1 -1
  246. package/dist/internal/discovery.js +16 -0
  247. package/dist/internal/http-channel.d.ts +2 -2
  248. package/dist/internal/http-channel.d.ts.map +1 -1
  249. package/dist/internal/http-channel.js +11 -31
  250. package/dist/internal/init-project.d.ts.map +1 -1
  251. package/dist/internal/init-project.js +2 -0
  252. package/dist/internal/init-scaffold.d.ts.map +1 -1
  253. package/dist/internal/init-scaffold.js +1 -0
  254. package/dist/internal/playground/static.d.ts.map +1 -1
  255. package/dist/internal/playground/static.js +2 -0
  256. package/dist/internal/session-engine.d.ts +8 -0
  257. package/dist/internal/session-engine.d.ts.map +1 -1
  258. package/dist/internal/session-engine.js +50 -6
  259. package/dist/playground/assets/index-D9N7-q97.css +1 -0
  260. package/dist/playground/assets/{index-DxapiDj_.js → index-DDvyC2z6.js} +49 -49
  261. package/dist/playground/index.html +2 -2
  262. package/dist/types.d.ts +8 -5
  263. package/dist/types.d.ts.map +1 -1
  264. package/docs/README.md +3 -1
  265. package/docs/concepts.md +1 -1
  266. package/docs/deployment.md +9 -6
  267. package/docs/evals.md +1 -5
  268. package/docs/example-agents/codebase-wiki.md +2 -3
  269. package/docs/example-agents/fsd.md +1 -1
  270. package/docs/example-agents/index.md +2 -2
  271. package/docs/example-agents/knowledge-base.md +3 -3
  272. package/docs/example-agents/security-reviewer.md +17 -48
  273. package/docs/example-agents/weather-agent.md +14 -45
  274. package/docs/guides/github.md +7 -4
  275. package/docs/guides/slack.md +7 -2
  276. package/docs/guides/webhooks.md +12 -15
  277. package/docs/reference/channels.md +4 -0
  278. package/docs/reference/cli.md +21 -7
  279. package/docs/reference/connections.md +13 -32
  280. package/docs/reference/http-api.md +14 -9
  281. package/docs/reference/tools.md +1 -3
  282. package/docs/templates/triage.md +3 -5
  283. package/docs/troubleshooting.md +1 -1
  284. package/package.json +2 -2
  285. package/skills/ab/SKILL.md +3 -0
  286. package/skills/create-agent/SKILL.md +9 -7
  287. package/skills/debug/SKILL.md +3 -0
  288. package/skills/evals/SKILL.md +3 -0
  289. package/skills/framework-map/SKILL.md +9 -6
  290. package/skills/github/SKILL.md +3 -0
  291. package/skills/hillclimb/SKILL.md +3 -0
  292. package/skills/mcp-auth/SKILL.md +3 -0
  293. package/skills/otel/SKILL.md +3 -0
  294. package/skills/setup-slack/SKILL.md +4 -1
  295. package/src/channels/slack/channel-watch.ts +1 -1
  296. package/src/channels/slack/slack-channel.ts +1 -1
  297. package/src/channels/slack/types.ts +2 -4
  298. package/src/internal/cli-deploy.ts +27 -7
  299. package/src/internal/cursor-agent-template.ts +1 -0
  300. package/src/internal/deploy-client.ts +40 -1
  301. package/src/internal/deploy-manifest.ts +10 -1
  302. package/src/internal/discovery.ts +20 -0
  303. package/src/internal/http-channel.ts +14 -41
  304. package/src/internal/init-project.ts +2 -0
  305. package/src/internal/init-scaffold.ts +1 -0
  306. package/src/internal/playground/static.ts +2 -0
  307. package/src/internal/session-engine.ts +62 -14
  308. package/src/types.ts +8 -5
  309. package/templates/security-help/README.md +37 -0
  310. package/templates/security-help/agent/agent.ts +18 -0
  311. package/templates/security-help/agent/channels/github.ts +13 -0
  312. package/templates/security-help/agent/channels/slack.ts +89 -0
  313. package/templates/security-help/agent/instructions.md +20 -0
  314. package/templates/security-help/agent/knowledge/faq/approvals.md +5 -0
  315. package/templates/security-help/agent/knowledge/faq/channels.md +6 -0
  316. package/templates/security-help/agent/knowledge/faq/phishing.md +10 -0
  317. package/templates/security-help/agent/lib/pr-first-pass.ts +42 -0
  318. package/templates/security-help/agent/lib/repos.ts +5 -0
  319. package/templates/security-help/agent/skills/access-request.md +10 -0
  320. package/templates/security-help/agent/skills/security-first-pass.md +15 -0
  321. package/templates/security-help/agent/skills/security-playbooks.md +12 -0
  322. package/templates/security-help/agent/skills/security-pr-first-pass.md +12 -0
  323. package/templates/security-help/evals/evals.config.ts +5 -0
  324. package/templates/security-help/evals/security-help.eval.ts +53 -0
  325. package/templates/security-help/init.json +31 -0
  326. package/templates/security-help/package.json +18 -0
  327. package/templates/security-help/tsconfig.json +12 -0
  328. package/templates/triage/agent/channels/webhook.ts +2 -2
  329. package/dist/docs/assets/chunks/@localSearchIndexroot.FV0R6kOb.js +0 -1
  330. package/dist/docs/assets/chunks/theme.Dx7j_-0n.js +0 -2
  331. package/dist/docs/assets/example-agents_index.md.xmJ87d_3.js +0 -2
  332. package/dist/docs/assets/example-agents_weather-agent.md.DC3lINjo.lean.js +0 -1
  333. package/dist/docs/assets/index.md.DhRHS_-L.js +0 -5
  334. package/dist/docs/assets/troubleshooting.md.KgmmaCgw.js +0 -1
  335. package/dist/playground/assets/index-BpVS-paP.css +0 -1
@@ -16,6 +16,9 @@ over HTTP/Slack/GitHub channels, with the Cursor SDK + harness as the
16
16
  execution engine. Ground truth is the package `README.md` (full reference)
17
17
  and `AGENTS.md` (coding-agent loop) — this skill is the map, not the spec.
18
18
 
19
+ Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
20
+ host serves the same index at `/docs/llms.txt`.
21
+
19
22
  Run the CLI as `agent-sdk <cmd>`. In the everysphere monorepo there is no
20
23
  installed bin — use:
21
24
 
@@ -77,10 +80,11 @@ the serve host; `runtime: "cloud"` runs them on Cursor cloud agents
77
80
 
78
81
  | Capability | local | cloud |
79
82
  | --- | --- | --- |
80
- | Server tools (`execution: "server"`), approvals | yes | **no** |
83
+ | Server tools (`execution: "server"`) | yes | yes on managed hosting; self-hosted needs `--public-url` |
84
+ | Tool approvals | yes | no |
81
85
  | Agent tools (`execution: "agent"` scripts) | yes | yes |
82
- | Skills | yes | yes (Agent Store native discovery) |
83
- | sandbox seeds | yes | only if in the cloud repo |
86
+ | Skills | yes | yes |
87
+ | sandbox seeds | yes | no |
84
88
  | Instructions | `AGENTS.md` in session workspace | prepended to first prompt |
85
89
  | Checkout of a repo/PR | you arrange it | the VM carries it |
86
90
 
@@ -93,9 +97,8 @@ scale, use cloud and keep the host to routing, briefs, and bookkeeping.
93
97
 
94
98
  Two handles, two owners:
95
99
 
96
- - **continuationToken** channel-owned conversation key. Same token =
97
- same durable session (a Slack `channelId:threadTs`, a `pr:owner/repo#N`).
98
- Rotates on each accepted HTTP follow-up; stale tokens get `409`.
100
+ - **continuationToken:** credential for continuing a conversation. HTTP
101
+ follow-ups rotate it; stale tokens get `409`.
99
102
  - **sessionId** — runtime-owned handle for streaming/inspection
100
103
  (`GET /v1/session/:id/stream?startIndex=N`, durable NDJSON replay).
101
104
 
@@ -9,6 +9,9 @@ description: >-
9
9
 
10
10
  # GitHub channels in the Agent SDK
11
11
 
12
+ Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
13
+ host serves the same index at `/docs/llms.txt`.
14
+
12
15
  Author `agent/channels/github.ts` with `githubChannel()` from
13
16
  `@cursor/july/channels/github`. It mounts
14
17
  `POST /<slug>/v1/channels/github` and publishes the events it dispatches on
@@ -11,6 +11,9 @@ paths:
11
11
 
12
12
  # Agent SDK hillclimb
13
13
 
14
+ Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
15
+ host serves the same index at `/docs/llms.txt`.
16
+
14
17
  Optimize one Agent SDK agent project
15
18
  with a tight measure → change → remeasure loop. Do not redesign the
16
19
  whole framework; climb one concrete failure mode at a time. Sibling skills:
@@ -8,6 +8,9 @@ description: >-
8
8
 
9
9
  # Host MCP OAuth (mcp auth)
10
10
 
11
+ Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
12
+ host serves the same index at `/docs/llms.txt`.
13
+
11
14
  Use this skill when a human asks to authorize a remote MCP server on an
12
15
  Agent SDK host, store credentials for Cursor-managed hosting, or debug
13
16
  `host.mcp` auth failures for `oauth: true` connections.
@@ -8,6 +8,9 @@ description: >-
8
8
 
9
9
  # Agent SDK OpenTelemetry (`defineOtel`)
10
10
 
11
+ Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
12
+ host serves the same index at `/docs/llms.txt`.
13
+
11
14
  Push session, turn, tool, and subagent traces, plus token and cost
12
15
  metrics, from the serve process to an OTLP collector. Logs are off
13
16
  until you opt in.
@@ -9,6 +9,9 @@ description: >-
9
9
 
10
10
  # Setup Slack for the Agent SDK
11
11
 
12
+ Public docs index: `node_modules/@cursor/july/dist/docs/llms.txt`. A running
13
+ host serves the same index at `/docs/llms.txt`.
14
+
12
15
  Use this skill when a human asks to wire Slack to an Agent SDK agent.
13
16
 
14
17
  There are **two ways to connect**:
@@ -303,7 +306,7 @@ a mention), opt in explicitly:
303
306
  export default slackChannel({
304
307
  engagement: {
305
308
  channelPosts: {
306
- allow: ["#issues-cursor-desktop"], // explicit allowlist; no wildcard exists
309
+ allow: ["#issues-cursor-desktop"], // use ["*"] for every joined channel
307
310
  posts: "top-level", // default — thread replies never dispatch
308
311
  debounceMs: 15_000, // optional: edits settle, deletes cancel
309
312
  },
@@ -2,7 +2,7 @@
2
2
  * Opt-in channel watch: dispatch on posts in allowlisted channels.
3
3
  *
4
4
  * Filtering rules (the anti-slop guarantees):
5
- * - Only explicitly allowlisted channels are watched no wildcard.
5
+ * - Only configured channels are watched; `"*"` opts into every channel.
6
6
  * - Top-level posts only by default; thread replies never dispatch unless
7
7
  * `posts: "all"` is configured.
8
8
  * - Posts that @mention the bot are skipped here (the `app_mention` path
@@ -233,7 +233,7 @@ export function slackChannel<const Name extends string = string>(
233
233
  const entries = channelPosts.allow.filter((entry) => entry.trim() !== "");
234
234
  if (entries.length === 0) {
235
235
  throw new Error(
236
- "slackChannel engagement.channelPosts.allow must list at least one channel (id or #name); there is no wildcard watch."
236
+ 'slackChannel engagement.channelPosts.allow must list at least one channel (id, #name, or "*").'
237
237
  );
238
238
  }
239
239
  }
@@ -324,10 +324,8 @@ export type SlackBlockActionHandler = (
324
324
  | Promise<SlackDispatchDecision | null | undefined>;
325
325
 
326
326
  /**
327
- * Opt-in channel watch: dispatch on posts in explicitly allowlisted
328
- * channels without requiring an @mention. There is deliberately no
329
- * "every channel the bot is in" wildcard — watching a channel is a
330
- * per-channel decision.
327
+ * Opt-in channel watch: dispatch on posts in configured channels without an
328
+ * @mention. Use `"*"` for every channel the bot has joined.
331
329
  */
332
330
  export interface SlackChannelPostsOptions {
333
331
  /**
@@ -28,6 +28,7 @@ import { readDeployTemplate } from "./cursor-agent-template.js";
28
28
  import {
29
29
  type AgentkitDeployAccepted,
30
30
  type AgentkitDeployStatus,
31
+ type AgentkitStopAccepted,
31
32
  AgentServeDeployClient,
32
33
  type DeleteAccepted,
33
34
  type DeployAccepted,
@@ -1187,11 +1188,25 @@ export async function cmdStop(
1187
1188
  if (typeof ctx === "number") {
1188
1189
  return ctx;
1189
1190
  }
1190
- let accepted: StopAccepted;
1191
+ // Stop takes only a slug, so there is no manifest to dispatch on (unlike
1192
+ // deploy). The v2 agentkit control plane goes first: v1 endpoints refuse
1193
+ // `architecture: "v2"` slugs with a 409 rather than a 404, so v1-first
1194
+ // could not fall through. A v2 404 (including an older backend without
1195
+ // the agentkit mount) falls back to the v1 stop.
1196
+ let architecture: "v1" | "v2" = "v2";
1197
+ let accepted: StopAccepted | AgentkitStopAccepted;
1191
1198
  try {
1192
- accepted = await ctx.client.stopDeployment({ teamId: ctx.teamId, slug });
1199
+ accepted = await ctx.client.stopAgentkit({ teamId: ctx.teamId, slug });
1193
1200
  } catch (error) {
1194
- return renderApiError(error, ctx.err);
1201
+ if (!(error instanceof DeployApiError) || error.status !== 404) {
1202
+ return renderApiError(error, ctx.err);
1203
+ }
1204
+ try {
1205
+ accepted = await ctx.client.stopDeployment({ teamId: ctx.teamId, slug });
1206
+ architecture = "v1";
1207
+ } catch (v1Error) {
1208
+ return renderApiError(v1Error, ctx.err);
1209
+ }
1195
1210
  }
1196
1211
  if (ctx.noWait) {
1197
1212
  if (ctx.json) {
@@ -1201,11 +1216,16 @@ export async function cmdStop(
1201
1216
  }
1202
1217
  return 0;
1203
1218
  }
1204
- let detail: DeploymentDetail;
1219
+ let detail: DeploymentDetail | AgentkitDeployStatus;
1205
1220
  try {
1206
- detail = await pollUntil(ctx, slug, new Set(["stopped"]), () =>
1207
- ctx.client.getDeployment({ teamId: ctx.teamId, slug })
1208
- );
1221
+ detail =
1222
+ architecture === "v2"
1223
+ ? await pollUntil(ctx, slug, new Set(["stopped"]), () =>
1224
+ ctx.client.getAgentkitDeploy({ teamId: ctx.teamId, slug })
1225
+ )
1226
+ : await pollUntil(ctx, slug, new Set(["stopped"]), () =>
1227
+ ctx.client.getDeployment({ teamId: ctx.teamId, slug })
1228
+ );
1209
1229
  } catch (error) {
1210
1230
  return renderApiError(error, ctx.err);
1211
1231
  }
@@ -6,6 +6,7 @@ const TEMPLATE_NAMES = [
6
6
  "agentic-owners",
7
7
  "demo",
8
8
  "pr-autofixer",
9
+ "security-help",
9
10
  "security-reviewer",
10
11
  "triage-linear",
11
12
  "triage-jira",
@@ -255,6 +255,17 @@ export interface AgentkitDeployStatus {
255
255
  export const TERMINAL_AGENTKIT_DEPLOY_STATUSES: ReadonlySet<AgentkitCustomerStatus> =
256
256
  new Set(["running", "failed", "stopped"]);
257
257
 
258
+ /**
259
+ * `POST /internal/agentkit/deployments/:slug/stop` 202 body. Like v1
260
+ * {@link StopAccepted} but keyed by catalog ids instead of the numeric
261
+ * deployment row id.
262
+ */
263
+ export interface AgentkitStopAccepted {
264
+ applicationId: string;
265
+ releaseId: string;
266
+ status: string;
267
+ }
268
+
258
269
  /** One secret's metadata from the list endpoint — names only, never values. */
259
270
  export interface SecretInfo {
260
271
  name: string;
@@ -332,6 +343,14 @@ const agentkitDeployStatusSchema = z
332
343
  })
333
344
  .passthrough();
334
345
 
346
+ const agentkitStopAcceptedSchema = z
347
+ .object({
348
+ applicationId: z.string().min(1),
349
+ releaseId: z.string().min(1),
350
+ status: z.string(),
351
+ })
352
+ .passthrough();
353
+
335
354
  const deploymentSchema = z.object({
336
355
  id: z.number(),
337
356
  slug: z.string(),
@@ -602,6 +621,22 @@ export class AgentServeDeployClient {
602
621
  return agentkitDeployStatusSchema.parse(raw);
603
622
  }
604
623
 
624
+ /**
625
+ * Stop a v2 deployment (`POST /internal/agentkit/deployments/:slug/stop`).
626
+ * 202 means accepted; poll {@link getAgentkitDeploy} until `stopped`.
627
+ */
628
+ async stopAgentkit(args: {
629
+ teamId: number;
630
+ slug: string;
631
+ }): Promise<AgentkitStopAccepted> {
632
+ const raw = await this.request({
633
+ method: "POST",
634
+ path: `/internal/agentkit/deployments/${encodeURIComponent(args.slug)}/stop?teamId=${args.teamId}`,
635
+ context: { verb: "stop", slug: args.slug },
636
+ });
637
+ return agentkitStopAcceptedSchema.parse(raw);
638
+ }
639
+
605
640
  async listDeployments(args: { teamId: number }): Promise<Deployment[]> {
606
641
  const raw = await this.request({
607
642
  method: "GET",
@@ -888,8 +923,12 @@ function mapErrorResponse(
888
923
  );
889
924
  }
890
925
  case 409:
926
+ // The server's 409 body distinguishes real conflicts (CAS races,
927
+ // "still deploying", architecture-v2 slugs on the v1 surface); keep
928
+ // its message when present.
891
929
  return new DeployApiError(
892
- `A concurrent deploy or stop is changing deployment${slugPart}; retry in a moment.`,
930
+ serverError ??
931
+ `A concurrent deploy or stop is changing deployment${slugPart}; retry in a moment.`,
893
932
  409
894
933
  );
895
934
  case 429: {
@@ -40,7 +40,10 @@ import {
40
40
  handshakeChannelContinuation,
41
41
  } from "./continuation-channel.js";
42
42
  import { CONTINUATION_SELECTORS } from "./continuation-identity.js";
43
- import { projectInfo } from "./discovery.js";
43
+ import {
44
+ projectInfo,
45
+ runtimeArchitectureCompatibilityError,
46
+ } from "./discovery.js";
44
47
  import { packageVersion } from "./distribution.js";
45
48
 
46
49
  export const DEPLOY_MANIFEST_VERSION: 1 = 1;
@@ -125,6 +128,12 @@ export function buildAgentDeployManifest(
125
128
  project: AgentProject,
126
129
  options?: { nowMs?: number; cliVersion?: string }
127
130
  ): AgentDeployManifestV1 {
131
+ const runtimeArchitectureError = runtimeArchitectureCompatibilityError(
132
+ project.agent
133
+ );
134
+ if (runtimeArchitectureError !== undefined) {
135
+ throw new Error(runtimeArchitectureError);
136
+ }
128
137
  applyAgentContinuationDefaults(project);
129
138
  const channels = project.channels.map((channel) => {
130
139
  const handshake = handshakeChannelContinuation(channel);
@@ -524,6 +524,17 @@ async function loadAgent(
524
524
  const hosting = resolveHosting(ctx, agentDir, config?.hosting);
525
525
  const concurrency = resolveConcurrency(ctx, agentDir, config?.concurrency);
526
526
  const architecture = resolveArchitecture(ctx, agentDir, config?.architecture);
527
+ const runtimeArchitectureError = runtimeArchitectureCompatibilityError({
528
+ runtime,
529
+ architecture,
530
+ });
531
+ if (runtimeArchitectureError !== undefined) {
532
+ ctx.diagnostics.push({
533
+ severity: "error",
534
+ path: displayPath(ctx, join(agentDir, "agent.ts")),
535
+ message: runtimeArchitectureError,
536
+ });
537
+ }
527
538
 
528
539
  if (runtime === "cloud") {
529
540
  warnCloudRuntimeLimitations(ctx, agentDir, {
@@ -570,6 +581,15 @@ async function loadAgent(
570
581
  };
571
582
  }
572
583
 
584
+ export function runtimeArchitectureCompatibilityError(agent: {
585
+ runtime: AgentRuntime;
586
+ architecture?: AgentArchitecture;
587
+ }): string | undefined {
588
+ return agent.architecture === "v2" && agent.runtime === "grokbot"
589
+ ? 'architecture: "v2" cannot use runtime: "grokbot": the grokbot runtime executes through the signed-in account\'s hosted /v0/grokbot box, not a deployment-scoped v2 runtime.'
590
+ : undefined;
591
+ }
592
+
573
593
  function resolveArchitecture(
574
594
  ctx: DiscoveryContext,
575
595
  agentDir: string,
@@ -7,8 +7,8 @@
7
7
  * Continuation semantics: `POST /v1/session` returns a `continuationToken`;
8
8
  * each accepted follow-up rotates it and returns the replacement, and a
9
9
  * stale token is rejected with 409. Follow-ups address any chat session by
10
- * id (including custom channels such as `drive`) when the token matches
11
- * that session's channel + key; task sessions stay fire-and-forget.
10
+ * id (including custom channels such as `drive`) when the token matches its
11
+ * active HTTP follow-up key; task sessions stay fire-and-forget.
12
12
  */
13
13
 
14
14
  import type {
@@ -20,11 +20,7 @@ import type {
20
20
  SessionRecord,
21
21
  } from "../types.js";
22
22
  import { samePrincipal } from "./auth.js";
23
- import {
24
- formatContinuationToken,
25
- newContinuationKey,
26
- parseContinuationToken,
27
- } from "./ids.js";
23
+ import { formatContinuationToken, parseContinuationToken } from "./ids.js";
28
24
  import { isLoopbackAddress } from "./net.js";
29
25
  import type { ServerRoute } from "./router.js";
30
26
  import {
@@ -32,7 +28,6 @@ import {
32
28
  ApprovalNotFoundError,
33
29
  HTTP_CHANNEL_ID,
34
30
  SessionAuthError,
35
- SessionBusyError,
36
31
  type SessionEngine,
37
32
  } from "./session-engine.js";
38
33
  import {
@@ -143,10 +138,8 @@ export function buildHttpChannelRoutes(args: {
143
138
  `Unknown session ${sessionId}.`
144
139
  );
145
140
  }
146
- // Playground (and other HTTP clients) may follow up on any chat
147
- // session including custom channels like `drive` — using that
148
- // session's own continuation token. Task/schedule sessions stay
149
- // fire-and-forget.
141
+ // HTTP can follow any chat session. Its credential is separate from the
142
+ // owning channel's continuation key.
150
143
  if (record.mode === "task") {
151
144
  return errorResponse(
152
145
  409,
@@ -178,12 +171,7 @@ export function buildHttpChannelRoutes(args: {
178
171
  );
179
172
  }
180
173
  const presented = parseContinuationToken(body.continuationToken);
181
- if (
182
- presented === null ||
183
- presented.channelId !== record.channelId ||
184
- record.continuationKey === null ||
185
- presented.key !== record.continuationKey
186
- ) {
174
+ if (presented === null) {
187
175
  return errorResponse(
188
176
  409,
189
177
  "stale_continuation_token",
@@ -192,34 +180,19 @@ export function buildHttpChannelRoutes(args: {
192
180
  }
193
181
 
194
182
  const message = await transformMessage(body.message, ctx.auth);
195
- try {
196
- // Continue as the session owner after the HTTP ownership gate so
197
- // `--dev` relaxed reads can follow up on channel-owned sessions
198
- // (drive/slack/…) without failing SessionAuthError.
199
- await engine.send(record.channelId, message, {
200
- auth: record.auth,
201
- continuationToken: record.continuationKey,
202
- });
203
- } catch (error) {
204
- if (error instanceof SessionBusyError) {
205
- return errorResponse(
206
- 409,
207
- "session_busy",
208
- "A turn is already running; wait for session.waiting before sending a follow-up."
209
- );
210
- }
211
- throw error;
183
+ const rotated = await engine.followUpHttp(sessionId, presented, message);
184
+ if (rotated === undefined) {
185
+ return errorResponse(
186
+ 409,
187
+ "stale_continuation_token",
188
+ "The continuation token does not address this session's active continuation."
189
+ );
212
190
  }
213
-
214
- // Rotate only after the message is accepted so a rejected send leaves
215
- // the caller's token valid for retry.
216
- const rotated = newContinuationKey();
217
- await engine.setContinuationToken(sessionId, rotated);
218
191
  return jsonResponse(
219
192
  {
220
193
  ok: true,
221
194
  sessionId,
222
- continuationToken: formatContinuationToken(record.channelId, rotated),
195
+ continuationToken: formatContinuationToken(HTTP_CHANNEL_ID, rotated),
223
196
  },
224
197
  { headers: { [SESSION_ID_HEADER]: sessionId } }
225
198
  );
@@ -76,6 +76,7 @@ const TEMPLATES: Readonly<Record<TemplateName, TemplateEntry>> = {
76
76
  "agentic-owners": { dir: "agentic-owners" },
77
77
  demo: { dir: "demo" },
78
78
  "pr-autofixer": { dir: "pr-autofixer" },
79
+ "security-help": { dir: "security-help" },
79
80
  "security-reviewer": { dir: "security-reviewer" },
80
81
  "triage-linear": { dir: "triage", overlay: "linear" },
81
82
  "triage-jira": { dir: "triage", overlay: "jira" },
@@ -709,6 +710,7 @@ Scaffold a project, then open the playground:
709
710
  npx ${PACKAGE_NAME} init ./my-agent # installs deps + links agent-sdk onto PATH
710
711
  npx ${PACKAGE_NAME} init ./my-demo --template demo # record a PR walkthrough
711
712
  npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
713
+ npx ${PACKAGE_NAME} init ./security-help --template security-help # answer security questions in Slack
712
714
  npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
713
715
  npx ${PACKAGE_NAME} init ./my-triage --template triage-jira # comment on Jira issues
714
716
  npx ${PACKAGE_NAME} init ./my-owners --template agentic-owners # review PRs via owners policies
@@ -103,6 +103,7 @@ Run the CLI under Node, never Bun.
103
103
  - Package loop: \`node_modules/${PACKAGE_NAME}/AGENTS.md\`
104
104
  - Skills: \`node_modules/${PACKAGE_NAME}/skills/\` (\`create-agent\`, \`evals\`, \`hillclimb\`, \`debug\`)
105
105
  - Docs: \`npx ${PACKAGE_NAME} docs\`
106
+ - LLM docs index: \`node_modules/${PACKAGE_NAME}/dist/docs/llms.txt\`
106
107
  `;
107
108
  }
108
109
 
@@ -27,6 +27,7 @@ const ASSETS_DIR = join(DIST_DIR, "assets");
27
27
  export const STATIC_CONTENT_TYPES: Record<string, string> = {
28
28
  ".html": "text/html; charset=utf-8",
29
29
  ".js": "text/javascript; charset=utf-8",
30
+ ".md": "text/markdown; charset=utf-8",
30
31
  ".mjs": "text/javascript; charset=utf-8",
31
32
  ".css": "text/css; charset=utf-8",
32
33
  ".map": "application/json; charset=utf-8",
@@ -41,6 +42,7 @@ export const STATIC_CONTENT_TYPES: Record<string, string> = {
41
42
  ".woff": "font/woff",
42
43
  ".woff2": "font/woff2",
43
44
  ".ttf": "font/ttf",
45
+ ".txt": "text/plain; charset=utf-8",
44
46
  };
45
47
 
46
48
  /** Whether `pnpm run build:playground` has produced the SPA bundle. */
@@ -925,6 +925,51 @@ export class SessionEngine {
925
925
  return this.channelSession(record.sessionId, record, true, false, since);
926
926
  }
927
927
 
928
+ /**
929
+ * Atomically validate and rotate an HTTP follow-up credential, then admit
930
+ * the message to its exact session without changing the owning channel key.
931
+ */
932
+ async followUpHttp(
933
+ sessionId: string,
934
+ token: { channelId: string; key: string },
935
+ message: string
936
+ ): Promise<string | undefined> {
937
+ const next = newContinuationKey();
938
+ const stale = new Error("stale HTTP continuation");
939
+ let previous: string | undefined;
940
+ try {
941
+ await this.updateRecord(sessionId, (record) => {
942
+ const expectedChannel =
943
+ record.httpContinuationKey === undefined
944
+ ? record.channelId
945
+ : HTTP_CHANNEL_ID;
946
+ const expectedKey =
947
+ record.httpContinuationKey ?? record.continuationKey;
948
+ if (token.channelId !== expectedChannel || token.key !== expectedKey) {
949
+ throw stale;
950
+ }
951
+ previous = record.httpContinuationKey;
952
+ return { ...record, httpContinuationKey: next };
953
+ });
954
+ } catch (error) {
955
+ if (error === stale) {
956
+ return undefined;
957
+ }
958
+ throw error;
959
+ }
960
+ try {
961
+ await this.startTurn(sessionId, message);
962
+ return next;
963
+ } catch (error) {
964
+ await this.updateRecord(sessionId, (record) =>
965
+ record.httpContinuationKey === next
966
+ ? { ...record, httpContinuationKey: previous }
967
+ : record
968
+ );
969
+ throw error;
970
+ }
971
+ }
972
+
928
973
  /** Whether a continuation token already maps to a session on this channel. */
929
974
  async hasContinuationSession(
930
975
  channelId: string,
@@ -2339,14 +2384,12 @@ export class SessionEngine {
2339
2384
  tools[tool.name] = {
2340
2385
  description: tool.description,
2341
2386
  inputSchema: tool.inputSchema as SDKCustomTool["inputSchema"],
2342
- // `SDKCustomTool.outputSchema` ships in the next published
2343
- // @cursor/sdk; the conditional spread carries the field through the
2344
- // pinned SDK's type until the dependency bumps, at which point local
2345
- // runs start advertising it.
2346
2387
  ...(tool.outputSchema === undefined
2347
2388
  ? {}
2348
- : { outputSchema: tool.outputSchema }),
2349
- // Same pinned-SDK carry for `SDKCustomTool.annotations`: an advertised
2389
+ : {
2390
+ outputSchema: tool.outputSchema as SDKCustomTool["outputSchema"],
2391
+ }),
2392
+ // Pinned-SDK carry for `SDKCustomTool.annotations`: an advertised
2350
2393
  // MCP passthrough's server-declared hints (bounded at listing time)
2351
2394
  // ride into the harness listing once the dependency bumps.
2352
2395
  ...(tool.annotations === undefined
@@ -3315,12 +3358,17 @@ export class SessionEngine {
3315
3358
  createdAt: record.createdAt,
3316
3359
  updatedAt: record.updatedAt,
3317
3360
  continuationToken:
3318
- record.continuationKey === null
3319
- ? null
3320
- : formatContinuationToken(
3321
- record.channelId,
3322
- record.continuationKey
3323
- ),
3361
+ record.httpContinuationKey !== undefined
3362
+ ? formatContinuationToken(
3363
+ HTTP_CHANNEL_ID,
3364
+ record.httpContinuationKey
3365
+ )
3366
+ : record.continuationKey === null
3367
+ ? null
3368
+ : formatContinuationToken(
3369
+ record.channelId,
3370
+ record.continuationKey
3371
+ ),
3324
3372
  externalUrl: links.slack ?? links.github,
3325
3373
  prUrl: links.github,
3326
3374
  };
@@ -3606,8 +3654,8 @@ export class SessionEngine {
3606
3654
  ...current,
3607
3655
  continuationKey: token,
3608
3656
  }));
3609
- // Keep armed reminders addressed at the conversation across rotation
3610
- // (the built-in HTTP channel rotates after every follow-up).
3657
+ // Keep armed reminders addressed at the conversation across channel
3658
+ // continuation rotation.
3611
3659
  if (
3612
3660
  previous?.continuationKey != null &&
3613
3661
  token !== null &&
package/src/types.ts CHANGED
@@ -1201,10 +1201,8 @@ export type ConnectionConfig = (
1201
1201
  *
1202
1202
  * Derive the identity from durable session facts — `session.auth`,
1203
1203
  * `session.id`, or your channel's own session state. Do **not** key it
1204
- * off `session.continuationKey`: the HTTP channel rotates the
1205
- * continuation key after every accepted follow-up, so a tenant mapping
1206
- * keyed on it silently breaks mid-conversation. (Channels that mint
1207
- * stable, parseable tokens by design are the exception.)
1204
+ * off `session.continuationKey`: it is a channel routing key, and channels
1205
+ * may re-key it independently of the authenticated principal.
1208
1206
  *
1209
1207
  * Works attached or advertised. Advertised connections
1210
1208
  * ({@link advertiseTools}) open per-operation clients with the
@@ -1593,6 +1591,11 @@ export interface SessionRecord {
1593
1591
  abs?: Record<string, string | null>;
1594
1592
  /** Channel-local continuation key; null when the session is not addressable. */
1595
1593
  continuationKey: string | null;
1594
+ /**
1595
+ * Rotating HTTP follow-up credential for a channel-owned session.
1596
+ * Omitted until HTTP accepts the first follow-up.
1597
+ */
1598
+ httpContinuationKey?: string;
1596
1599
  auth: AuthContext | null;
1597
1600
  title?: string;
1598
1601
  channelState?: JsonValue;
@@ -1668,7 +1671,7 @@ export interface SessionSummary {
1668
1671
  queued?: boolean;
1669
1672
  createdAt: string;
1670
1673
  updatedAt: string;
1671
- /** `<channelId>:<key>` wire token, or null when not addressable. */
1674
+ /** Active wire token for HTTP follow-ups, or null when not addressable. */
1672
1675
  continuationToken: string | null;
1673
1676
  /**
1674
1677
  * Conversation permalink (Slack thread, else GitHub PR).
@@ -0,0 +1,37 @@
1
+ # Security help
2
+
3
+ Answers security questions in Slack from your FAQ files and takes a first
4
+ look when someone pastes a GitHub pull request.
5
+
6
+ ```bash
7
+ npx @cursor/july init ./security-help --template security-help
8
+ ```
9
+
10
+ `init` asks which repos it may read. Skip the prompt with
11
+ `--var repos=owner/repo`.
12
+
13
+ ## Run
14
+
15
+ ```bash
16
+ agent-sdk login
17
+ agent-sdk slack create --name "Security Help" --channel-posts
18
+ agent-sdk dev
19
+ ```
20
+
21
+ Slack is a dedicated bot (`@Security Help`). Mentions, DMs, and channel
22
+ watch go through that app. GitHub reads use your Cursor GitHub connection
23
+ for the repos in `agent/lib/repos.ts`. Paste a PR URL in Slack, or replay
24
+ one in the playground.
25
+
26
+ ## Edit
27
+
28
+ - `agent/lib/repos.ts`: repos it may read
29
+ - `agent/channels/slack.ts`: channel ids to watch (`watch`)
30
+ - `agent/knowledge/faq/`: answers for your company
31
+ - `agent/skills/`: how to look at a PR, a leak, or an access ask
32
+ - `agent/instructions.md`: routing
33
+
34
+ `--channel-posts` is required to watch channels. Mentions and DMs work
35
+ without it.
36
+
37
+ `agent-sdk eval` runs three smoke turns and writes nothing to Slack or GitHub.