@cursor/july 0.1.111 → 0.1.112

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 (383) hide show
  1. package/dist/bin/agent-serve.js +18 -1
  2. package/dist/channels/github/github-channel.d.ts +29 -19
  3. package/dist/channels/github/github-channel.d.ts.map +1 -1
  4. package/dist/channels/github/github-channel.js +29 -19
  5. package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
  6. package/dist/channels/slack/agentic-delivery.js +2 -0
  7. package/dist/channels/slack/dispatch.d.ts +11 -1
  8. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  9. package/dist/channels/slack/dispatch.js +142 -39
  10. package/dist/channels/slack/placeholder.d.ts +26 -0
  11. package/dist/channels/slack/placeholder.d.ts.map +1 -1
  12. package/dist/channels/slack/placeholder.js +28 -0
  13. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  14. package/dist/channels/slack/slack-channel.js +9 -16
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/assets/{app.Drol6mi6.js → app.DxTdhphC.js} +4 -4
  17. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
  18. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
  19. package/dist/docs/assets/chunks/@localSearchIndexroot.QmjDU6Jh.js +1 -0
  20. package/dist/docs/assets/chunks/{VPLocalSearchBox.CdqoBZJX.js → VPLocalSearchBox.CR3KTF0X.js} +1 -1
  21. package/dist/docs/assets/chunks/{arc.BVX3ycTn.js → arc.CVVqBOdS.js} +1 -1
  22. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CcChnMxX.js → architectureDiagram-Q4EWVU46.CJHGP4ki.js} +1 -1
  23. package/dist/docs/assets/chunks/{baseUniq.xwtXO-yt.js → baseUniq.r7UVVRBP.js} +1 -1
  24. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CijZ_taK.js → blockDiagram-DXYQGD6D.DKmMaTre.js} +1 -1
  25. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.0FBvwBvK.js → c4Diagram-AHTNJAMY.DDJsntUO.js} +1 -1
  26. package/dist/docs/assets/chunks/channel.BjpoSbz_.js +1 -0
  27. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CELMmMDA.js → chunk-4BX2VUAB.BK2rKt6W.js} +1 -1
  28. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C4bhFtSm.js → chunk-4TB4RGXK.DRLV8RnF.js} +1 -1
  29. package/dist/docs/assets/chunks/{chunk-55IACEB6.ZnQ9gRRQ.js → chunk-55IACEB6.DaKjxtb7.js} +1 -1
  30. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DPlmglG-.js → chunk-EDXVE4YY.C5sPCIT1.js} +1 -1
  31. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BrUk8pff.js → chunk-FMBD7UC4.CSGWyNTB.js} +1 -1
  32. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CcmWIncu.js → chunk-OYMX7WX6.D5tK9XEr.js} +1 -1
  33. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D65-cs8I.js → chunk-QZHKN3VN.BeZGd1UZ.js} +1 -1
  34. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.qoXZpG9F.js → chunk-YZCP3GAM.U_tfWwQR.js} +1 -1
  35. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BgxOlMHw.js +1 -0
  36. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BgxOlMHw.js +1 -0
  37. package/dist/docs/assets/chunks/clone.DRuGBKZC.js +1 -0
  38. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.8rYtqudO.js → cose-bilkent-S5V4N54A.DVeRXIb6.js} +1 -1
  39. package/dist/docs/assets/chunks/{dagre-KV5264BT.DrRP1fOh.js → dagre-KV5264BT.BpKJAeRZ.js} +1 -1
  40. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DHj_xA2_.js → diagram-5BDNPKRD.BQOtrd1Z.js} +1 -1
  41. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Bz_6nAKj.js → diagram-G4DWMVQ6.CSDAhjPI.js} +1 -1
  42. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BWA0xSW9.js → diagram-MMDJMWI5.Dpztst2S.js} +1 -1
  43. package/dist/docs/assets/chunks/{diagram-TYMM5635.CpTJLNJI.js → diagram-TYMM5635.qJHRizHR.js} +1 -1
  44. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.-7AWWSrP.js → erDiagram-SMLLAGMA.vbDotH3l.js} +1 -1
  45. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BTnQ742_.js → flowDiagram-DWJPFMVM.CqS_ZQr4.js} +1 -1
  46. package/dist/docs/assets/chunks/framework.BNw1pucY.js +19 -0
  47. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B5_HiiQ5.js → ganttDiagram-T4ZO3ILL.DTLdR4pN.js} +1 -1
  48. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CZcNTFZd.js → gitGraphDiagram-UUTBAWPF.D04lnbnr.js} +1 -1
  49. package/dist/docs/assets/chunks/{graph.V2GLaab4.js → graph.BlfqLJsM.js} +1 -1
  50. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.7pZOkCCU.js → infoDiagram-42DDH7IO.tAooImWA.js} +1 -1
  51. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js → ishikawaDiagram-UXIWVN3A.ClUsVqnJ.js} +1 -1
  52. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BNEgWN1S.js → journeyDiagram-VCZTEJTY.C3tUgyCg.js} +1 -1
  53. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B-4d4tC7.js → kanban-definition-6JOO6SKY.CtD9-QCe.js} +1 -1
  54. package/dist/docs/assets/chunks/{layout.Dvbn9nSb.js → layout.D38U-LnT.js} +1 -1
  55. package/dist/docs/assets/chunks/{linear.D2GM4p4b.js → linear.BJmssyhN.js} +1 -1
  56. package/dist/docs/assets/chunks/{min.DVBtLK-B.js → min.DNgXoouU.js} +1 -1
  57. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CnJRI55x.js → mindmap-definition-QFDTVHPH.Dcp6cxeu.js} +1 -1
  58. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CtoaTFlA.js → pieDiagram-DEJITSTG.CLDw6zIs.js} +1 -1
  59. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DtT24_vN.js → quadrantDiagram-34T5L4WZ.CYaeeY4c.js} +1 -1
  60. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CjSO4o8f.js → requirementDiagram-MS252O5E.gMYuRpq2.js} +1 -1
  61. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.-wWiIVWa.js → sankeyDiagram-XADWPNL6.CZqyHFbc.js} +1 -1
  62. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DSk8s4gX.js → sequenceDiagram-FGHM5R23.BTsCjUDN.js} +1 -1
  63. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BFKAsdkN.js → stateDiagram-FHFEXIEX.CftT9mLJ.js} +1 -1
  64. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.-43J68xB.js +1 -0
  65. package/dist/docs/assets/chunks/{theme.C0MctGaz.js → theme.B_7J9ZsV.js} +2 -2
  66. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.TUNJbAFe.js → timeline-definition-GMOUNBTQ.DbU3WUNw.js} +1 -1
  67. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.C-RGNnk4.js → vennDiagram-DHZGUBPP.ixsq-q2u.js} +1 -1
  68. package/dist/docs/assets/chunks/wardley-RL74JXVD.WRXz-Dux.js +162 -0
  69. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DH4zt73Y.js → wardleyDiagram-NUSXRM2D.C0ewvgbp.js} +1 -1
  70. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B-3k6bF6.js → xychartDiagram-5P7HB3ND.nAEhF4bO.js} +1 -1
  71. package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
  72. package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
  73. package/dist/docs/assets/evals.md.BYvfZ-PO.js +72 -0
  74. package/dist/docs/assets/evals.md.BYvfZ-PO.lean.js +1 -0
  75. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.js +30 -0
  76. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.lean.js +1 -0
  77. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
  78. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
  79. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
  80. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
  81. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
  82. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
  83. package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
  84. package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
  85. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
  86. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
  87. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
  88. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
  89. package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
  90. package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
  91. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
  92. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
  93. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
  94. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
  95. package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
  96. package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
  97. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
  98. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
  99. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
  100. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
  101. package/dist/docs/assets/{index.md.BFVyY2KT.js → index.md.C-t81M5J.js} +2 -2
  102. package/dist/docs/assets/{index.md.BFVyY2KT.lean.js → index.md.C-t81M5J.lean.js} +1 -1
  103. package/dist/docs/assets/{quickstart.md.D3MjSZN-.js → quickstart.md.DAvVhuuU.js} +1 -1
  104. package/dist/docs/assets/{quickstart.md.D3MjSZN-.lean.js → quickstart.md.DAvVhuuU.lean.js} +1 -1
  105. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
  106. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
  107. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
  108. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
  109. package/dist/docs/assets/{reference_channels.md.icqLKcTc.js → reference_channels.md.nFWbzAic.js} +1 -1
  110. package/dist/docs/assets/{reference_channels.md.icqLKcTc.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
  111. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.js → reference_cli.md.DLWDz9ij.js} +3 -1
  112. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
  113. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.js → reference_connections.md.CmyrlXfY.js} +1 -1
  114. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.lean.js → reference_connections.md.CmyrlXfY.lean.js} +1 -1
  115. package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
  116. package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
  117. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.js +58 -0
  118. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.lean.js +1 -0
  119. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.js → reference_hooks.md.B7uzNENk.js} +2 -2
  120. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
  121. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.js → reference_http-api.md.CduHavZ2.js} +1 -1
  122. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
  123. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.js → reference_instructions.md.CU1My5My.js} +1 -1
  124. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
  125. package/dist/docs/assets/{reference_playground.md.D2YExv5K.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
  126. package/dist/docs/assets/{reference_playground.md.D2YExv5K.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
  127. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.js → reference_project-layout.md.BGhgpy9V.js} +1 -1
  128. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
  129. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.js → reference_prompt.md.Ccp0R53H.js} +1 -1
  130. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
  131. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
  132. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
  133. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
  134. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
  135. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.js → reference_skills.md.DjQkRefx.js} +1 -1
  136. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
  137. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.js → reference_subagents.md.BHsSMMyO.js} +1 -1
  138. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.lean.js → reference_subagents.md.BHsSMMyO.lean.js} +1 -1
  139. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.js → reference_tools.md.BYzUTeVA.js} +1 -1
  140. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.lean.js → reference_tools.md.BYzUTeVA.lean.js} +1 -1
  141. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.js → templates_agentic-owners.md.9M575F5C.js} +1 -1
  142. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
  143. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
  144. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
  145. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
  146. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
  147. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
  148. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
  149. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
  150. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
  151. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.js → templates_triage.md.CVGe_FG6.js} +1 -1
  152. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
  153. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
  154. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
  155. package/dist/docs/building-with-agents.html +44 -48
  156. package/dist/docs/building-with-agents.md +94 -82
  157. package/dist/docs/deployment.html +59 -78
  158. package/dist/docs/deployment.md +117 -363
  159. package/dist/docs/evals.html +85 -224
  160. package/dist/docs/evals.md +146 -673
  161. package/dist/docs/guides/agent-to-agent.html +58 -42
  162. package/dist/docs/guides/agent-to-agent.md +112 -35
  163. package/dist/docs/guides/bitbucket.html +179 -44
  164. package/dist/docs/guides/bitbucket.md +249 -48
  165. package/dist/docs/guides/cloud-agents.html +46 -40
  166. package/dist/docs/guides/cloud-agents.md +119 -66
  167. package/dist/docs/guides/convert-automation.html +80 -49
  168. package/dist/docs/guides/convert-automation.md +156 -147
  169. package/dist/docs/guides/github.html +184 -92
  170. package/dist/docs/guides/github.md +260 -245
  171. package/dist/docs/guides/gitlab.html +184 -45
  172. package/dist/docs/guides/gitlab.md +249 -50
  173. package/dist/docs/guides/grokbot-agents.html +48 -41
  174. package/dist/docs/guides/grokbot-agents.md +99 -53
  175. package/dist/docs/guides/improve.html +48 -40
  176. package/dist/docs/guides/improve.md +111 -58
  177. package/dist/docs/guides/mcp-oauth.html +74 -52
  178. package/dist/docs/guides/mcp-oauth.md +111 -121
  179. package/dist/docs/guides/opentelemetry.html +63 -54
  180. package/dist/docs/guides/opentelemetry.md +96 -165
  181. package/dist/docs/guides/slack.html +83 -59
  182. package/dist/docs/guides/slack.md +157 -227
  183. package/dist/docs/guides/webhooks.html +97 -230
  184. package/dist/docs/guides/webhooks.md +154 -385
  185. package/dist/docs/hashmap.json +1 -1
  186. package/dist/docs/hillclimbing.html +44 -38
  187. package/dist/docs/hillclimbing.md +101 -55
  188. package/dist/docs/index.html +38 -38
  189. package/dist/docs/index.md +2 -0
  190. package/dist/docs/llms-full.txt +3082 -3104
  191. package/dist/docs/llms.txt +21 -18
  192. package/dist/docs/quickstart.html +37 -37
  193. package/dist/docs/reference/agent-config.html +37 -37
  194. package/dist/docs/reference/artifacts.html +38 -38
  195. package/dist/docs/reference/channels.html +37 -37
  196. package/dist/docs/reference/cli.html +39 -37
  197. package/dist/docs/reference/cli.md +2 -0
  198. package/dist/docs/reference/connections.html +37 -37
  199. package/dist/docs/reference/evals.html +116 -0
  200. package/dist/docs/reference/evals.md +293 -0
  201. package/dist/docs/reference/extensions.html +80 -84
  202. package/dist/docs/reference/extensions.md +127 -199
  203. package/dist/docs/reference/hooks.html +39 -39
  204. package/dist/docs/reference/hooks.md +34 -34
  205. package/dist/docs/reference/http-api.html +37 -37
  206. package/dist/docs/reference/instructions.html +37 -37
  207. package/dist/docs/reference/playground.html +37 -37
  208. package/dist/docs/reference/project-layout.html +37 -37
  209. package/dist/docs/reference/prompt.html +37 -37
  210. package/dist/docs/reference/schedules.html +37 -37
  211. package/dist/docs/reference/sessions.html +37 -37
  212. package/dist/docs/reference/skills.html +37 -37
  213. package/dist/docs/reference/subagents.html +37 -37
  214. package/dist/docs/reference/tools.html +37 -37
  215. package/dist/docs/templates/agentic-owners.html +38 -38
  216. package/dist/docs/templates/pr-autofixer.html +37 -37
  217. package/dist/docs/templates/security-reviewer.html +38 -38
  218. package/dist/docs/templates/thermo-quality-review.html +62 -0
  219. package/dist/docs/templates/thermo-quality-review.md +75 -0
  220. package/dist/docs/templates/thermo-review.html +62 -0
  221. package/dist/docs/templates/thermo-review.md +74 -0
  222. package/dist/docs/templates/triage.html +37 -37
  223. package/dist/docs/troubleshooting.html +38 -38
  224. package/dist/docs/troubleshooting.md +97 -66
  225. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  226. package/dist/extensions/improve/extension.d.ts +3 -1
  227. package/dist/extensions/improve/extension.d.ts.map +1 -1
  228. package/dist/extensions/improve/extension.js +4 -2
  229. package/dist/extensions/improve/skills/yourself.js +1 -1
  230. package/dist/filesystem.d.ts +46 -2
  231. package/dist/filesystem.d.ts.map +1 -1
  232. package/dist/filesystem.js +149 -102
  233. package/dist/index.d.ts +2 -2
  234. package/dist/index.d.ts.map +1 -1
  235. package/dist/index.js +1 -1
  236. package/dist/internal/cli-ax.d.ts +6 -0
  237. package/dist/internal/cli-ax.d.ts.map +1 -1
  238. package/dist/internal/cli-ax.js +72 -14
  239. package/dist/internal/continuation-identity.d.ts.map +1 -1
  240. package/dist/internal/continuation-identity.js +1 -0
  241. package/dist/internal/cursor-agent-template.d.ts +1 -1
  242. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  243. package/dist/internal/cursor-agent-template.js +2 -0
  244. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  245. package/dist/internal/filesystem/tools.js +2 -2
  246. package/dist/internal/filesystem/walk.d.ts +7 -4
  247. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  248. package/dist/internal/filesystem/walk.js +34 -11
  249. package/dist/internal/hosted-admission-adapter.d.ts +3 -0
  250. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  251. package/dist/internal/hosted-delivery-protocol.d.ts +17 -0
  252. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  253. package/dist/internal/hosted-delivery-protocol.js +50 -1
  254. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  255. package/dist/internal/hosted-delivery.js +8 -0
  256. package/dist/internal/init-project.d.ts.map +1 -1
  257. package/dist/internal/init-project.js +4 -0
  258. package/dist/internal/server.d.ts.map +1 -1
  259. package/dist/internal/server.js +94 -39
  260. package/dist/internal/session-engine.d.ts.map +1 -1
  261. package/dist/internal/session-engine.js +11 -5
  262. package/dist/internal/skill-catalog.d.ts +28 -0
  263. package/dist/internal/skill-catalog.d.ts.map +1 -0
  264. package/dist/internal/skill-catalog.js +44 -0
  265. package/dist/playground/assets/index-B1c1LeIf.js +67 -0
  266. package/dist/playground/assets/index-CK2LX3iD.css +1 -0
  267. package/dist/playground/index.html +2 -2
  268. package/dist/types.d.ts +9 -0
  269. package/dist/types.d.ts.map +1 -1
  270. package/docs/README.md +2 -0
  271. package/docs/building-with-agents.md +96 -84
  272. package/docs/deployment.md +118 -364
  273. package/docs/evals.md +147 -674
  274. package/docs/guides/agent-to-agent.md +113 -36
  275. package/docs/guides/bitbucket.md +250 -49
  276. package/docs/guides/cloud-agents.md +119 -67
  277. package/docs/guides/convert-automation.md +157 -148
  278. package/docs/guides/github.md +261 -246
  279. package/docs/guides/gitlab.md +250 -51
  280. package/docs/guides/grokbot-agents.md +100 -55
  281. package/docs/guides/improve.md +112 -59
  282. package/docs/guides/mcp-oauth.md +112 -122
  283. package/docs/guides/opentelemetry.md +97 -166
  284. package/docs/guides/slack.md +158 -228
  285. package/docs/guides/webhooks.md +155 -386
  286. package/docs/hillclimbing.md +102 -56
  287. package/docs/reference/cli.md +2 -0
  288. package/docs/reference/evals.md +298 -0
  289. package/docs/reference/extensions.md +128 -200
  290. package/docs/reference/hooks.md +34 -34
  291. package/docs/templates/thermo-quality-review.md +80 -0
  292. package/docs/templates/thermo-review.md +79 -0
  293. package/docs/troubleshooting.md +98 -67
  294. package/package.json +1 -1
  295. package/skills/github/SKILL.md +21 -13
  296. package/src/bin/agent-serve.ts +22 -0
  297. package/src/channels/github/github-channel.ts +29 -19
  298. package/src/channels/slack/agentic-delivery.ts +2 -0
  299. package/src/channels/slack/dispatch.ts +126 -4
  300. package/src/channels/slack/placeholder.ts +51 -0
  301. package/src/channels/slack/slack-channel.ts +9 -2
  302. package/src/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  303. package/src/extensions/improve/extension.ts +4 -2
  304. package/src/extensions/improve/skills/yourself.ts +1 -1
  305. package/src/filesystem.ts +168 -65
  306. package/src/index.ts +3 -0
  307. package/src/internal/cli-ax.ts +88 -15
  308. package/src/internal/continuation-identity.ts +1 -0
  309. package/src/internal/cursor-agent-template.ts +2 -0
  310. package/src/internal/filesystem/tools.ts +2 -0
  311. package/src/internal/filesystem/walk.ts +60 -15
  312. package/src/internal/hosted-admission-adapter.ts +3 -0
  313. package/src/internal/hosted-delivery-protocol.ts +78 -1
  314. package/src/internal/hosted-delivery.ts +8 -0
  315. package/src/internal/init-project.ts +4 -0
  316. package/src/internal/server.ts +104 -41
  317. package/src/internal/session-engine.ts +16 -4
  318. package/src/internal/skill-catalog.ts +69 -0
  319. package/src/types.ts +9 -0
  320. package/templates/thermo-quality-review/README.md +35 -0
  321. package/templates/thermo-quality-review/agent/agent.ts +8 -0
  322. package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
  323. package/templates/thermo-quality-review/agent/instructions.md +43 -0
  324. package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
  325. package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
  326. package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
  327. package/templates/thermo-quality-review/package.json +18 -0
  328. package/templates/thermo-quality-review/tsconfig.json +12 -0
  329. package/templates/thermo-review/README.md +35 -0
  330. package/templates/thermo-review/agent/agent.ts +8 -0
  331. package/templates/thermo-review/agent/channels/github.ts +42 -0
  332. package/templates/thermo-review/agent/instructions.md +40 -0
  333. package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
  334. package/templates/thermo-review/evals/evals.config.ts +5 -0
  335. package/templates/thermo-review/evals/review.eval.ts +53 -0
  336. package/templates/thermo-review/package.json +18 -0
  337. package/templates/thermo-review/tsconfig.json +12 -0
  338. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.js +0 -13
  339. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.lean.js +0 -1
  340. package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +0 -1
  341. package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +0 -1
  342. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +0 -1
  343. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +0 -1
  344. package/dist/docs/assets/chunks/clone.YSt_40_s.js +0 -1
  345. package/dist/docs/assets/chunks/framework.dypDpWZ3.js +0 -19
  346. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +0 -1
  347. package/dist/docs/assets/chunks/wardley-RL74JXVD.g5efOWmT.js +0 -162
  348. package/dist/docs/assets/deployment.md.Dm4Qo3hp.js +0 -51
  349. package/dist/docs/assets/deployment.md.Dm4Qo3hp.lean.js +0 -1
  350. package/dist/docs/assets/evals.md.BLDRt5LH.js +0 -211
  351. package/dist/docs/assets/evals.md.BLDRt5LH.lean.js +0 -1
  352. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +0 -14
  353. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +0 -1
  354. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.js +0 -10
  355. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.lean.js +0 -1
  356. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.js +0 -9
  357. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.lean.js +0 -1
  358. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.js +0 -12
  359. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.lean.js +0 -1
  360. package/dist/docs/assets/guides_github.md.D6ER29dG.js +0 -64
  361. package/dist/docs/assets/guides_github.md.D6ER29dG.lean.js +0 -1
  362. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.js +0 -14
  363. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.lean.js +0 -1
  364. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +0 -9
  365. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.lean.js +0 -1
  366. package/dist/docs/assets/guides_improve.md.BKaDuKKK.js +0 -14
  367. package/dist/docs/assets/guides_improve.md.BKaDuKKK.lean.js +0 -1
  368. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.js +0 -28
  369. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.lean.js +0 -1
  370. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.js +0 -26
  371. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.lean.js +0 -1
  372. package/dist/docs/assets/guides_slack.md.DdT8rmsj.js +0 -46
  373. package/dist/docs/assets/guides_slack.md.DdT8rmsj.lean.js +0 -1
  374. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.js +0 -225
  375. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.lean.js +0 -1
  376. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +0 -1
  377. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +0 -1
  378. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.js +0 -62
  379. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.lean.js +0 -1
  380. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.js +0 -1
  381. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.lean.js +0 -1
  382. package/dist/playground/assets/index-BLlKgZtI.css +0 -1
  383. package/dist/playground/assets/index-CDS5p9sR.js +0 -67
@@ -9,7 +9,9 @@ import {
9
9
  normalizeIdentity,
10
10
  } from "../../internal/continuation-identity.js";
11
11
  import { isDeferredChannelSession } from "../../internal/deferred-channel-session.js";
12
+ import type { HostedAdmissionPlatformHandoff } from "../../internal/hosted-delivery-protocol.js";
12
13
  import { routeLocalIngressContinuation } from "../../internal/local-ingress.js";
14
+ import { mapThrownRequestError } from "../../internal/request-error-status.js";
13
15
  import { isSlackImChannel } from "../../internal/slack-thread-key.js";
14
16
  import { steeringEnabled } from "../../internal/steering.js";
15
17
  import type {
@@ -49,7 +51,12 @@ import {
49
51
  } from "./inbound.js";
50
52
  import { defaultSlackLog, type SlackLog } from "./log.js";
51
53
  import { paintTurnStart, retractTurnStart } from "./paint-start.js";
52
- import { startPlaceholder } from "./placeholder.js";
54
+ import {
55
+ adoptPlaceholder,
56
+ retractPlaceholderMessage,
57
+ retractPlaceholderSlot,
58
+ startPlaceholder,
59
+ } from "./placeholder.js";
53
60
  import { isWholeMessageStop } from "./stop.js";
54
61
  import {
55
62
  loadSlackThreadContextBlock,
@@ -219,9 +226,16 @@ export interface SlackInboundDispatchDeps extends SlackContinuationProbes {
219
226
  * Static replaceable first message. Fired with `send()`
220
227
  * locally, and on hosted admission when the continuation already
221
228
  * exists (warm / coalesced follow-up). Cold hosted posts it on
222
- * `turn.started`. Overlay claims that slot.
229
+ * `turn.started` unless {@link platformHandoff} already seeded the
230
+ * slot from a control-plane post. Overlay claims that slot.
223
231
  */
224
232
  placeholder?: string;
233
+ /**
234
+ * Trusted control-plane handoff (Slack placeholder ts). Hosted
235
+ * admission passes this so the guest adopts the CP-posted message
236
+ * instead of posting a duplicate.
237
+ */
238
+ platformHandoff?: HostedAdmissionPlatformHandoff;
225
239
  /**
226
240
  * When false, skip the built-in `eval` directive. Defaults to true when
227
241
  * `host.evals` is present; only ever runs on mentions and DMs.
@@ -307,6 +321,7 @@ function scheduleInbound(
307
321
  handler: SlackMessageHandler;
308
322
  evalCommandsEnabled?: boolean;
309
323
  eventId?: string;
324
+ platformHandoff?: HostedAdmissionPlatformHandoff;
310
325
  }
311
326
  ): void {
312
327
  deps.waitUntil(
@@ -327,6 +342,9 @@ function scheduleInbound(
327
342
  blockExternals: deps.blockExternals,
328
343
  ...inboundContinuation(deps),
329
344
  ...(args.eventId === undefined ? {} : { eventId: args.eventId }),
345
+ ...(args.platformHandoff === undefined
346
+ ? {}
347
+ : { platformHandoff: args.platformHandoff }),
330
348
  })
331
349
  );
332
350
  }
@@ -388,6 +406,8 @@ export async function dispatchInboundMessage(args: {
388
406
  ack?: string;
389
407
  /** See {@link SlackInboundDispatchDeps.placeholder}. */
390
408
  placeholder?: string;
409
+ /** See {@link SlackInboundDispatchDeps.platformHandoff}. */
410
+ platformHandoff?: HostedAdmissionPlatformHandoff;
391
411
  /** See {@link SlackInboundDispatchDeps.propagateHandlerErrors}. */
392
412
  propagateHandlerErrors?: boolean;
393
413
  }): Promise<void> {
@@ -413,6 +433,68 @@ export async function dispatchInboundMessage(args: {
413
433
  team: message.teamId,
414
434
  });
415
435
 
436
+ const handoff = args.platformHandoff?.slackPlaceholder;
437
+ const matchedHandoff =
438
+ args.placeholder !== undefined &&
439
+ kind !== "channel_post" &&
440
+ handoff !== undefined &&
441
+ handoff.channelId === message.channelId &&
442
+ handoff.threadTs === message.threadTs
443
+ ? handoff
444
+ : undefined;
445
+ let adoptedPlaceholder = false;
446
+ let handoffRetracted = false;
447
+ const retractUnadoptedHandoff = async (): Promise<void> => {
448
+ if (matchedHandoff === undefined || handoffRetracted) {
449
+ return;
450
+ }
451
+ handoffRetracted = true;
452
+ await retractPlaceholderMessage({
453
+ botToken: args.credentials?.botToken,
454
+ channelId: matchedHandoff.channelId,
455
+ ts: matchedHandoff.messageTs,
456
+ streamed: matchedHandoff.streamed,
457
+ log,
458
+ });
459
+ };
460
+ const adoptMatchedHandoff = async (): Promise<void> => {
461
+ if (matchedHandoff === undefined) {
462
+ return;
463
+ }
464
+ const adoption = adoptPlaceholder({
465
+ channelId: matchedHandoff.channelId,
466
+ threadTs: matchedHandoff.threadTs,
467
+ ts: matchedHandoff.messageTs,
468
+ streamed: matchedHandoff.streamed,
469
+ });
470
+ if (adoption === "adopted") {
471
+ adoptedPlaceholder = true;
472
+ log.info("placeholder adopted from control-plane handoff", {
473
+ channel: message.channelId,
474
+ thread_ts: message.threadTs,
475
+ message_ts: matchedHandoff.messageTs,
476
+ });
477
+ return;
478
+ }
479
+ if (adoption === "occupied") {
480
+ // Another delivery owns this thread's slot. Remove only this delivery's
481
+ // redundant CP post.
482
+ await retractUnadoptedHandoff();
483
+ }
484
+ };
485
+ const retractAdoptedPlaceholder = async (): Promise<void> => {
486
+ if (!adoptedPlaceholder) {
487
+ return;
488
+ }
489
+ adoptedPlaceholder = false;
490
+ await retractPlaceholderSlot({
491
+ channelId: message.channelId,
492
+ threadTs: message.threadTs,
493
+ botToken: args.credentials?.botToken,
494
+ log,
495
+ });
496
+ };
497
+
416
498
  const userId = message.author?.userId ?? "";
417
499
  const teamId = message.teamId;
418
500
  let membership: Promise<boolean> | undefined;
@@ -425,6 +507,7 @@ export async function dispatchInboundMessage(args: {
425
507
  user: userId,
426
508
  event_id: args.eventId,
427
509
  });
510
+ await retractUnadoptedHandoff();
428
511
  return;
429
512
  }
430
513
  membership = isExternalSlackSender({
@@ -463,6 +546,7 @@ export async function dispatchInboundMessage(args: {
463
546
  ) {
464
547
  if (membership !== undefined && (await membership)) {
465
548
  dropExternal();
549
+ await retractUnadoptedHandoff();
466
550
  return;
467
551
  }
468
552
  log.info("stop directive", {
@@ -484,6 +568,7 @@ export async function dispatchInboundMessage(args: {
484
568
  } catch {
485
569
  // best-effort status
486
570
  }
571
+ await retractUnadoptedHandoff();
487
572
  return;
488
573
  }
489
574
 
@@ -501,6 +586,7 @@ export async function dispatchInboundMessage(args: {
501
586
  if (evalDirective !== null && args.host.evals !== undefined) {
502
587
  if (membership !== undefined && (await membership)) {
503
588
  dropExternal();
589
+ await retractUnadoptedHandoff();
504
590
  return;
505
591
  }
506
592
  log.info("eval directive", {
@@ -516,6 +602,7 @@ export async function dispatchInboundMessage(args: {
516
602
  evals: args.host.evals,
517
603
  binding,
518
604
  });
605
+ await retractUnadoptedHandoff();
519
606
  return;
520
607
  }
521
608
 
@@ -530,8 +617,12 @@ export async function dispatchInboundMessage(args: {
530
617
  event_id: args.eventId,
531
618
  });
532
619
  if (args.propagateHandlerErrors === true) {
620
+ if (mapThrownRequestError(error)?.retry !== "transient") {
621
+ await retractUnadoptedHandoff();
622
+ }
533
623
  throw error;
534
624
  }
625
+ await retractUnadoptedHandoff();
535
626
  return;
536
627
  }
537
628
  if (decision === null || decision === undefined) {
@@ -541,6 +632,7 @@ export async function dispatchInboundMessage(args: {
541
632
  thread_ts: message.threadTs,
542
633
  event_id: args.eventId,
543
634
  });
635
+ await retractUnadoptedHandoff();
544
636
  return;
545
637
  }
546
638
 
@@ -560,6 +652,8 @@ export async function dispatchInboundMessage(args: {
560
652
  return;
561
653
  }
562
654
 
655
+ await adoptMatchedHandoff();
656
+
563
657
  const painted =
564
658
  args.ack === undefined
565
659
  ? undefined
@@ -639,6 +733,7 @@ export async function dispatchInboundMessage(args: {
639
733
  });
640
734
  }
641
735
  await args.host.slackNudges?.releaseAsk(message.channelId, message.ts);
736
+ await retractAdoptedPlaceholder();
642
737
  return;
643
738
  }
644
739
  if (message.files !== undefined && message.files.length > 0) {
@@ -688,8 +783,10 @@ export async function dispatchInboundMessage(args: {
688
783
  hosted &&
689
784
  hasPlaceholder &&
690
785
  (message.ts !== message.threadTs || continuationExists);
786
+ // Adopted slots already exist in Slack; skip a second post. Cold hosted
787
+ // without a handoff still defers to `turn.started`.
691
788
  const placeholder =
692
- hasPlaceholder && (!hosted || hostedFollowup)
789
+ !adoptedPlaceholder && hasPlaceholder && (!hosted || hostedFollowup)
693
790
  ? startPlaceholder({
694
791
  line: placeholderLine,
695
792
  botToken: args.credentials?.botToken,
@@ -700,7 +797,7 @@ export async function dispatchInboundMessage(args: {
700
797
  recipientTeamId: message.teamId,
701
798
  })
702
799
  : undefined;
703
- const posted = placeholder !== undefined;
800
+ const posted = adoptedPlaceholder || placeholder !== undefined;
704
801
  const state = emptySlackChannelState({
705
802
  channelId: message.channelId,
706
803
  threadTs: message.threadTs,
@@ -811,6 +908,7 @@ export async function dispatchInboundMessage(args: {
811
908
  if (placeholder !== undefined) {
812
909
  await placeholder.retract();
813
910
  }
911
+ await retractAdoptedPlaceholder();
814
912
  if (painted !== undefined) {
815
913
  await painted;
816
914
  await retractTurnStart({
@@ -850,6 +948,21 @@ export function dispatchInboundFromEventBody(
850
948
  ): boolean {
851
949
  const log = deps.log ?? defaultSlackLog;
852
950
  let eventId: string | undefined;
951
+ const retractUnscheduledHandoff = (): void => {
952
+ const placeholder = deps.platformHandoff?.slackPlaceholder;
953
+ if (placeholder === undefined) {
954
+ return;
955
+ }
956
+ deps.waitUntil(
957
+ retractPlaceholderMessage({
958
+ botToken: deps.credentials?.botToken,
959
+ channelId: placeholder.channelId,
960
+ ts: placeholder.messageTs,
961
+ streamed: placeholder.streamed,
962
+ log,
963
+ })
964
+ );
965
+ };
853
966
 
854
967
  if (body !== null && typeof body === "object" && !Array.isArray(body)) {
855
968
  const root = body as { event_id?: unknown };
@@ -857,6 +970,7 @@ export function dispatchInboundFromEventBody(
857
970
  eventId = root.event_id;
858
971
  if (!deps.eventIds.tryHandle(root.event_id)) {
859
972
  log.debug("inbound dedupe drop", { event_id: eventId });
973
+ retractUnscheduledHandoff();
860
974
  return false;
861
975
  }
862
976
  }
@@ -868,6 +982,7 @@ export function dispatchInboundFromEventBody(
868
982
  if (mention !== null) {
869
983
  if (deps.mentionsEnabled === false) {
870
984
  log.debug("inbound ignored (mentions disabled)", { event_id: eventId });
985
+ retractUnscheduledHandoff();
871
986
  return false;
872
987
  }
873
988
  if (mention.author?.isBot === true) {
@@ -885,6 +1000,7 @@ export function dispatchInboundFromEventBody(
885
1000
  from_bot: mention.author.botId ?? mention.author.userId,
886
1001
  reason: verdict.reason,
887
1002
  });
1003
+ retractUnscheduledHandoff();
888
1004
  return false;
889
1005
  }
890
1006
  }
@@ -894,6 +1010,7 @@ export function dispatchInboundFromEventBody(
894
1010
  handler: deps.onAppMention,
895
1011
  evalCommandsEnabled: deps.evalCommandsEnabled,
896
1012
  eventId,
1013
+ platformHandoff: deps.platformHandoff,
897
1014
  });
898
1015
  return true;
899
1016
  }
@@ -904,6 +1021,7 @@ export function dispatchInboundFromEventBody(
904
1021
  log.debug("inbound ignored (direct messages disabled)", {
905
1022
  event_id: eventId,
906
1023
  });
1024
+ retractUnscheduledHandoff();
907
1025
  return false;
908
1026
  }
909
1027
  scheduleInbound(deps, log, {
@@ -912,12 +1030,14 @@ export function dispatchInboundFromEventBody(
912
1030
  handler: deps.onDirectMessage,
913
1031
  evalCommandsEnabled: deps.evalCommandsEnabled,
914
1032
  eventId,
1033
+ platformHandoff: deps.platformHandoff,
915
1034
  });
916
1035
  return true;
917
1036
  }
918
1037
 
919
1038
  const reaction = parseReactionAddedEvent(body);
920
1039
  if (reaction !== null && deps.onReactionAdded !== undefined) {
1040
+ retractUnscheduledHandoff();
921
1041
  scheduleInbound(deps, log, {
922
1042
  kind: "reaction_added",
923
1043
  message: reaction,
@@ -982,6 +1102,7 @@ export function dispatchInboundFromEventBody(
982
1102
  includeBotAuthored: true,
983
1103
  });
984
1104
  if (channelEvent !== null) {
1105
+ retractUnscheduledHandoff();
985
1106
  return deps.channelWatch.handle(channelEvent, eventId);
986
1107
  }
987
1108
  }
@@ -990,5 +1111,6 @@ export function dispatchInboundFromEventBody(
990
1111
  ...describeSlackEventShape(body),
991
1112
  event_id: eventId,
992
1113
  });
1114
+ retractUnscheduledHandoff();
993
1115
  return false;
994
1116
  }
@@ -122,6 +122,16 @@ async function retractKey(key: string, args: FinishArgs): Promise<void> {
122
122
  });
123
123
  }
124
124
 
125
+ /** Retract only one thread's slot; admission cleanup must not sweep DM peers. */
126
+ export async function retractPlaceholderSlot(args: {
127
+ channelId: string;
128
+ threadTs: string;
129
+ botToken: SlackBotToken | undefined;
130
+ log?: SlackLog;
131
+ }): Promise<void> {
132
+ await retractKey(slotKey(args.channelId, args.threadTs), args);
133
+ }
134
+
125
135
  export async function finishPlaceholder(args: {
126
136
  channelId: string;
127
137
  threadTs: string;
@@ -155,6 +165,47 @@ export function startPlaceholder(args: {
155
165
  };
156
166
  }
157
167
 
168
+ /**
169
+ * Seed the in-process placeholder slot with a control-plane-posted message
170
+ * ts so the first agentic update overlays that exact Slack message.
171
+ */
172
+ export type PlaceholderAdoption = "adopted" | "already_adopted" | "occupied";
173
+
174
+ export function adoptPlaceholder(args: {
175
+ channelId: string;
176
+ threadTs: string;
177
+ ts: string;
178
+ streamed?: boolean;
179
+ }): PlaceholderAdoption {
180
+ const key = slotKey(args.channelId, args.threadTs);
181
+ const existing = slots.get(key);
182
+ if (
183
+ existing !== undefined &&
184
+ !existing.claimed &&
185
+ existing.ts === args.ts &&
186
+ existing.streamed === (args.streamed === true)
187
+ ) {
188
+ return "already_adopted";
189
+ }
190
+ if (!openPlaceholder(key)) {
191
+ return "occupied";
192
+ }
193
+ return rememberPlaceholder(key, args.ts, args.streamed === true)
194
+ ? "adopted"
195
+ : "occupied";
196
+ }
197
+
198
+ /** Delete a control-plane placeholder that this process could not adopt. */
199
+ export async function retractPlaceholderMessage(args: {
200
+ botToken: SlackBotToken | undefined;
201
+ channelId: string;
202
+ ts: string;
203
+ streamed: boolean;
204
+ log?: SlackLog;
205
+ }): Promise<void> {
206
+ await retractPosted(args);
207
+ }
208
+
158
209
  async function postPlaceholder(args: {
159
210
  line: string;
160
211
  botToken: SlackBotToken | undefined;
@@ -259,6 +259,7 @@ export function slackChannel(
259
259
  continuationToken: string
260
260
  ) => Promise<string | undefined>;
261
261
  interruptContinuation?: (continuationToken: string) => Promise<boolean>;
262
+ platformHandoff?: SlackInboundDispatchDeps["platformHandoff"];
262
263
  }): SlackInboundDispatchDeps {
263
264
  return {
264
265
  send: args.send,
@@ -280,6 +281,9 @@ export function slackChannel(
280
281
  ack: reply.ack,
281
282
  placeholder: reply.placeholder,
282
283
  blockExternals,
284
+ ...(args.platformHandoff === undefined
285
+ ? {}
286
+ : { platformHandoff: args.platformHandoff }),
283
287
  ...(args.hasContinuationSession === undefined
284
288
  ? {}
285
289
  : { hasContinuationSession: args.hasContinuationSession }),
@@ -319,7 +323,9 @@ export function slackChannel(
319
323
  ack: reply.ack ?? DEFAULT_ACK,
320
324
  ...(reply.placeholder === undefined
321
325
  ? {}
322
- : { placeholder: reply.placeholder }),
326
+ : {
327
+ placeholder: reply.placeholder,
328
+ }),
323
329
  },
324
330
  }
325
331
  : {}),
@@ -654,7 +660,7 @@ export function slackChannel(
654
660
  // claim already dedupes Slack retries, and on a warm pod the local set
655
661
  // would otherwise swallow the control plane's own retry of a delivery
656
662
  // that failed after the id was marked handled.
657
- dispatch: async ({ payload, args }) => {
663
+ dispatch: async ({ payload, args, platformHandoff }) => {
658
664
  const dispatched = dispatchInboundFromEventBody(
659
665
  payload,
660
666
  inboundDeps({
@@ -668,6 +674,7 @@ export function slackChannel(
668
674
  isContinuationBusy: args.isContinuationBusy,
669
675
  getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
670
676
  interruptContinuation: args.interruptContinuation,
677
+ ...(platformHandoff === undefined ? {} : { platformHandoff }),
671
678
  })
672
679
  );
673
680
  return skipped(dispatched ? "not_engaged" : "not_dispatchable");
@@ -16,17 +16,13 @@ The result carries `agentId` (`bc-...`) and a `url`. Report both in full. Never
16
16
 
17
17
  ## Look an agent up by id
18
18
 
19
- Call `get` with the `agent_id`. It returns the agent's `status` (`creating`, `running`, `finished`, `error`, or `expired`), its `branch` and pull request `prUrl` once pushed, the `changes` it made so far (files and lines), a `summary` when one exists, and an `error` when it failed. A run takes minutes: check when asked or when you need the result, not in a tight loop. The final report itself comes from `dump`.
19
+ Call `get` with the `agent_id`. It returns the agent's `status` (`creating`, `running`, `finished`, `error`, `expired`, or `unknown`), its `branch` and pull request `prUrl` once pushed, change counts, a `summary` when one exists, and an `error` when it failed. A run takes minutes: check when asked or when you need the result, not in a tight loop. The final report itself comes from `dump`.
20
20
 
21
21
  ## Read what it did
22
22
 
23
- To read the report or understand what was done, call `dump` with the `agent_id`. It writes the agent's whole conversation, every run, to `cloud-agent-transcripts/<agent_id>.jsonl` in your workspace and returns the absolute `path` plus the `finalMessage`. Each line is one JSON message with `role` (`user` or `assistant`) and, for assistant lines, `text`, `thinking`, and `toolCalls` (tool `name`, `args`, `content`, `error`). Read it with your file and shell tools, using the returned path:
23
+ To read the report or understand what was done, call `dump` with the `agent_id`. Once a transcript exists, it writes the agent's whole conversation to `cloud-agent-transcripts/<agent_id>.jsonl` in your workspace and returns the absolute `path` plus `finalMessage`. Before any transcript exists, either value may be absent; wait for output instead of inventing a report.
24
24
 
25
- - `tail -n 1 <path>` gives the final report.
26
- - `grep '"toolCalls"' <path>` shows the commands and edits it made.
27
- - `grep '"role":"user"' <path>` shows every prompt it received, including replies.
28
-
29
- Use `dump` before summarizing an agent's work for a person, and to understand a failure before replying with a fix.
25
+ Use `finalMessage` as the agent's report. Read the returned transcript path when you need its prompts, reasoning, or tool calls, then inspect the resulting branch or pull request before claiming exact code changes. The transcript is evidence of what the agent did, not a canonical diff.
30
26
 
31
27
  ## Reply
32
28
 
@@ -3,7 +3,9 @@
3
3
  * repository, so changing how it behaves is a change to that source: a
4
4
  * one-off Cursor cloud agent does the coding on a branch and opens a pull
5
5
  * request, the agent that mounted this writes the brief and reports the
6
- * pull request, and the tree it runs from is never edited.
6
+ * pull request. Durable behavior changes only after review, merge, and
7
+ * deployment. A cloud-runtime turn may edit its ephemeral checkout while
8
+ * preparing the pull request.
7
9
  *
8
10
  * ```ts
9
11
  * // agent/extensions/improve.ts
@@ -52,7 +54,7 @@ const line = z.string().trim().min(1);
52
54
  const improve: Extension<ImproveConfig, ImproveOptions> = defineExtension({
53
55
  root: import.meta.dirname,
54
56
  description:
55
- "Change your own source through a one-off cloud agent and a pull request, never the running tree.",
57
+ "Propose changes to your own source through a branch and pull request; durable behavior changes after review and deployment.",
56
58
  config: z.object({
57
59
  repo: z.string().url(),
58
60
  path: z
@@ -29,7 +29,7 @@ Under \`${path}/agent/\`:
29
29
  ${treeNotes}
30
30
  ## The change is made on a clean checkout
31
31
 
32
- Never edit the tree you run from: it is a deployed copy of \`${path}\`, and nothing changed there lasts. The change is made on a clean checkout of ${repo} at \`${ref}\`. When your own turn runs on a cloud VM with that repository checked out, that VM is the checkout: branch there. Otherwise hand the coding to a one-off Cursor cloud agent through the cloud agents extension, with \`launch\` under its mount namespace, \`repo\` set to ${repo}, and \`starting_ref\` to \`${ref}\`. One agent per change; steer it with \`reply\` rather than launching another.
32
+ Durable source changes happen on a branch from a clean checkout of ${repo} at \`${ref}\`, never by mutating a deployed local-runtime copy. When your own turn runs on a cloud VM with that repository checked out, its ephemeral tree is the checkout: branch there. Otherwise hand the coding to a one-off Cursor cloud agent through the cloud agents extension, with \`launch\` under its mount namespace, \`repo\` set to ${repo}, and \`starting_ref\` to \`${ref}\`. One agent per change; steer it with \`reply\` instead of launching another.
33
33
 
34
34
  ## The brief
35
35