@cursor/july 0.1.111 → 0.1.113

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 (441) hide show
  1. package/README.md +4 -0
  2. package/dist/bin/agent-serve.js +20 -4
  3. package/dist/channels/checks.d.ts +10 -0
  4. package/dist/channels/checks.d.ts.map +1 -1
  5. package/dist/channels/github/github-channel.d.ts +29 -19
  6. package/dist/channels/github/github-channel.d.ts.map +1 -1
  7. package/dist/channels/github/github-channel.js +29 -19
  8. package/dist/channels/origin/checks.d.ts +1 -1
  9. package/dist/channels/origin/checks.d.ts.map +1 -1
  10. package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
  11. package/dist/channels/slack/agentic-delivery.js +2 -0
  12. package/dist/channels/slack/dispatch.d.ts +11 -1
  13. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  14. package/dist/channels/slack/dispatch.js +146 -39
  15. package/dist/channels/slack/placeholder.d.ts +26 -0
  16. package/dist/channels/slack/placeholder.d.ts.map +1 -1
  17. package/dist/channels/slack/placeholder.js +28 -0
  18. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  19. package/dist/channels/slack/slack-channel.js +9 -16
  20. package/dist/docs/404.html +2 -2
  21. package/dist/docs/assets/{app.Drol6mi6.js → app.CAeK13eM.js} +4 -4
  22. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
  23. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
  24. package/dist/docs/assets/chunks/@localSearchIndexroot.Ck9E52Ls.js +1 -0
  25. package/dist/docs/assets/chunks/{VPLocalSearchBox.CdqoBZJX.js → VPLocalSearchBox.C9LbPHod.js} +1 -1
  26. package/dist/docs/assets/chunks/{arc.BVX3ycTn.js → arc.CmMq2zmS.js} +1 -1
  27. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CcChnMxX.js → architectureDiagram-Q4EWVU46.CCXB8Uj5.js} +1 -1
  28. package/dist/docs/assets/chunks/{baseUniq.xwtXO-yt.js → baseUniq.CyQo6eLe.js} +1 -1
  29. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CijZ_taK.js → blockDiagram-DXYQGD6D.JYq6w91N.js} +1 -1
  30. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.0FBvwBvK.js → c4Diagram-AHTNJAMY.BRV8GPJJ.js} +1 -1
  31. package/dist/docs/assets/chunks/channel.BHiYmnZ4.js +1 -0
  32. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CELMmMDA.js → chunk-4BX2VUAB.Bv4ooYQR.js} +1 -1
  33. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C4bhFtSm.js → chunk-4TB4RGXK.t4JtKPcj.js} +1 -1
  34. package/dist/docs/assets/chunks/{chunk-55IACEB6.ZnQ9gRRQ.js → chunk-55IACEB6.34lCHj9Y.js} +1 -1
  35. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DPlmglG-.js → chunk-EDXVE4YY.BSwrPNrt.js} +1 -1
  36. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BrUk8pff.js → chunk-FMBD7UC4.Beeun-R-.js} +1 -1
  37. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CcmWIncu.js → chunk-OYMX7WX6.BUUFUcJc.js} +1 -1
  38. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D65-cs8I.js → chunk-QZHKN3VN.B2XjHzN_.js} +1 -1
  39. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.qoXZpG9F.js → chunk-YZCP3GAM.CLYG8znk.js} +1 -1
  40. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Degh8l90.js +1 -0
  41. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Degh8l90.js +1 -0
  42. package/dist/docs/assets/chunks/clone.BIywbczV.js +1 -0
  43. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.8rYtqudO.js → cose-bilkent-S5V4N54A.DVEa6fZp.js} +1 -1
  44. package/dist/docs/assets/chunks/{dagre-KV5264BT.DrRP1fOh.js → dagre-KV5264BT.C9PZQK-S.js} +1 -1
  45. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DHj_xA2_.js → diagram-5BDNPKRD.DoN0uv3Y.js} +1 -1
  46. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Bz_6nAKj.js → diagram-G4DWMVQ6.Czv3duqx.js} +1 -1
  47. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BWA0xSW9.js → diagram-MMDJMWI5.BinJ5kWb.js} +1 -1
  48. package/dist/docs/assets/chunks/{diagram-TYMM5635.CpTJLNJI.js → diagram-TYMM5635.DW326M4K.js} +1 -1
  49. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.-7AWWSrP.js → erDiagram-SMLLAGMA.U2pR_OA7.js} +1 -1
  50. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BTnQ742_.js → flowDiagram-DWJPFMVM.ByWJXeYK.js} +1 -1
  51. package/dist/docs/assets/chunks/framework.BNw1pucY.js +19 -0
  52. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B5_HiiQ5.js → ganttDiagram-T4ZO3ILL.OquF0Rtg.js} +1 -1
  53. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CZcNTFZd.js → gitGraphDiagram-UUTBAWPF.Bpn01P7X.js} +1 -1
  54. package/dist/docs/assets/chunks/{graph.V2GLaab4.js → graph.CNRB6ETL.js} +1 -1
  55. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.7pZOkCCU.js → infoDiagram-42DDH7IO.CqhknMWi.js} +1 -1
  56. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js → ishikawaDiagram-UXIWVN3A.C6xpR2af.js} +1 -1
  57. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BNEgWN1S.js → journeyDiagram-VCZTEJTY.Cg5f7oB3.js} +1 -1
  58. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B-4d4tC7.js → kanban-definition-6JOO6SKY.Cx9YTwlU.js} +1 -1
  59. package/dist/docs/assets/chunks/{layout.Dvbn9nSb.js → layout.ljS-wFtK.js} +1 -1
  60. package/dist/docs/assets/chunks/{linear.D2GM4p4b.js → linear.jSxNrsFC.js} +1 -1
  61. package/dist/docs/assets/chunks/{min.DVBtLK-B.js → min.Cum8AlQw.js} +1 -1
  62. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CnJRI55x.js → mindmap-definition-QFDTVHPH.BLiysLpe.js} +1 -1
  63. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CtoaTFlA.js → pieDiagram-DEJITSTG.BoIDyuKF.js} +1 -1
  64. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DtT24_vN.js → quadrantDiagram-34T5L4WZ.DLkpDytR.js} +1 -1
  65. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CjSO4o8f.js → requirementDiagram-MS252O5E.DqTVqSu2.js} +1 -1
  66. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.-wWiIVWa.js → sankeyDiagram-XADWPNL6.CG_6FF7j.js} +1 -1
  67. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DSk8s4gX.js → sequenceDiagram-FGHM5R23.BIp9602K.js} +1 -1
  68. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BFKAsdkN.js → stateDiagram-FHFEXIEX.COSXsD9I.js} +1 -1
  69. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.qrxrbFsX.js +1 -0
  70. package/dist/docs/assets/chunks/{theme.C0MctGaz.js → theme.CXJ7PNwy.js} +2 -2
  71. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.TUNJbAFe.js → timeline-definition-GMOUNBTQ.CXdVqkLq.js} +1 -1
  72. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.C-RGNnk4.js → vennDiagram-DHZGUBPP.CZxGuc4r.js} +1 -1
  73. package/dist/docs/assets/chunks/{wardley-RL74JXVD.g5efOWmT.js → wardley-RL74JXVD.3oVgfqQk.js} +1 -1
  74. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DH4zt73Y.js → wardleyDiagram-NUSXRM2D.6_irCgGJ.js} +1 -1
  75. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B-3k6bF6.js → xychartDiagram-5P7HB3ND.TRPe92m3.js} +1 -1
  76. package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
  77. package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
  78. package/dist/docs/assets/evals.md.D3Y3Aixt.js +72 -0
  79. package/dist/docs/assets/evals.md.D3Y3Aixt.lean.js +1 -0
  80. package/dist/docs/assets/guides_agent-to-agent.md.CD4T5FIl.js +41 -0
  81. package/dist/docs/assets/guides_agent-to-agent.md.CD4T5FIl.lean.js +1 -0
  82. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
  83. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
  84. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
  85. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
  86. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
  87. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
  88. package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
  89. package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
  90. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
  91. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
  92. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
  93. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
  94. package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
  95. package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
  96. package/dist/docs/assets/guides_jev.md.F5fAkkfN.js +189 -0
  97. package/dist/docs/assets/guides_jev.md.F5fAkkfN.lean.js +1 -0
  98. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
  99. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
  100. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
  101. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
  102. package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
  103. package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
  104. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
  105. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
  106. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
  107. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
  108. package/dist/docs/assets/{index.md.BFVyY2KT.js → index.md.C-t81M5J.js} +2 -2
  109. package/dist/docs/assets/{index.md.BFVyY2KT.lean.js → index.md.C-t81M5J.lean.js} +1 -1
  110. package/dist/docs/assets/{quickstart.md.D3MjSZN-.js → quickstart.md.DAvVhuuU.js} +1 -1
  111. package/dist/docs/assets/{quickstart.md.D3MjSZN-.lean.js → quickstart.md.DAvVhuuU.lean.js} +1 -1
  112. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
  113. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
  114. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
  115. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
  116. package/dist/docs/assets/{reference_channels.md.icqLKcTc.js → reference_channels.md.nFWbzAic.js} +1 -1
  117. package/dist/docs/assets/{reference_channels.md.icqLKcTc.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
  118. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.js → reference_cli.md.DLWDz9ij.js} +3 -1
  119. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
  120. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.js → reference_connections.md.Je9dMsdd.js} +2 -2
  121. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.lean.js → reference_connections.md.Je9dMsdd.lean.js} +1 -1
  122. package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
  123. package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
  124. package/dist/docs/assets/reference_extensions.md.Cv5aLCz_.js +58 -0
  125. package/dist/docs/assets/reference_extensions.md.Cv5aLCz_.lean.js +1 -0
  126. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.js → reference_hooks.md.B7uzNENk.js} +2 -2
  127. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
  128. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.js → reference_http-api.md.CduHavZ2.js} +1 -1
  129. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
  130. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.js → reference_instructions.md.CU1My5My.js} +1 -1
  131. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
  132. package/dist/docs/assets/{reference_playground.md.D2YExv5K.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
  133. package/dist/docs/assets/{reference_playground.md.D2YExv5K.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
  134. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.js → reference_project-layout.md.BGhgpy9V.js} +1 -1
  135. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
  136. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.js → reference_prompt.md.Ccp0R53H.js} +1 -1
  137. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
  138. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
  139. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
  140. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
  141. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
  142. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.js → reference_skills.md.DjQkRefx.js} +1 -1
  143. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
  144. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.js → reference_subagents.md.Dl16gcBj.js} +2 -2
  145. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.lean.js → reference_subagents.md.Dl16gcBj.lean.js} +1 -1
  146. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.js → reference_tools.md.B1dH1lpa.js} +3 -3
  147. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.lean.js → reference_tools.md.B1dH1lpa.lean.js} +1 -1
  148. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.js → templates_agentic-owners.md.9M575F5C.js} +1 -1
  149. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
  150. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
  151. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
  152. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
  153. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
  154. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
  155. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
  156. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
  157. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
  158. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.js → templates_triage.md.CVGe_FG6.js} +1 -1
  159. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
  160. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
  161. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
  162. package/dist/docs/building-with-agents.html +44 -48
  163. package/dist/docs/building-with-agents.md +94 -82
  164. package/dist/docs/deployment.html +59 -78
  165. package/dist/docs/deployment.md +117 -363
  166. package/dist/docs/evals.html +85 -224
  167. package/dist/docs/evals.md +149 -673
  168. package/dist/docs/guides/agent-to-agent.html +74 -47
  169. package/dist/docs/guides/agent-to-agent.md +128 -46
  170. package/dist/docs/guides/bitbucket.html +179 -44
  171. package/dist/docs/guides/bitbucket.md +249 -48
  172. package/dist/docs/guides/cloud-agents.html +46 -40
  173. package/dist/docs/guides/cloud-agents.md +119 -66
  174. package/dist/docs/guides/convert-automation.html +80 -49
  175. package/dist/docs/guides/convert-automation.md +156 -147
  176. package/dist/docs/guides/github.html +184 -92
  177. package/dist/docs/guides/github.md +260 -245
  178. package/dist/docs/guides/gitlab.html +184 -45
  179. package/dist/docs/guides/gitlab.md +249 -50
  180. package/dist/docs/guides/grokbot-agents.html +48 -41
  181. package/dist/docs/guides/grokbot-agents.md +99 -53
  182. package/dist/docs/guides/improve.html +48 -40
  183. package/dist/docs/guides/improve.md +111 -58
  184. package/dist/docs/guides/jev.html +248 -0
  185. package/dist/docs/guides/jev.md +348 -0
  186. package/dist/docs/guides/mcp-oauth.html +74 -52
  187. package/dist/docs/guides/mcp-oauth.md +111 -121
  188. package/dist/docs/guides/opentelemetry.html +63 -54
  189. package/dist/docs/guides/opentelemetry.md +96 -165
  190. package/dist/docs/guides/slack.html +83 -59
  191. package/dist/docs/guides/slack.md +157 -227
  192. package/dist/docs/guides/webhooks.html +97 -230
  193. package/dist/docs/guides/webhooks.md +154 -385
  194. package/dist/docs/hashmap.json +1 -1
  195. package/dist/docs/hillclimbing.html +44 -38
  196. package/dist/docs/hillclimbing.md +101 -55
  197. package/dist/docs/index.html +38 -38
  198. package/dist/docs/index.md +2 -0
  199. package/dist/docs/llms-full.txt +3490 -3146
  200. package/dist/docs/llms.txt +22 -18
  201. package/dist/docs/quickstart.html +37 -37
  202. package/dist/docs/reference/agent-config.html +37 -37
  203. package/dist/docs/reference/artifacts.html +38 -38
  204. package/dist/docs/reference/channels.html +37 -37
  205. package/dist/docs/reference/cli.html +39 -37
  206. package/dist/docs/reference/cli.md +2 -0
  207. package/dist/docs/reference/connections.html +38 -38
  208. package/dist/docs/reference/connections.md +1 -1
  209. package/dist/docs/reference/evals.html +116 -0
  210. package/dist/docs/reference/evals.md +293 -0
  211. package/dist/docs/reference/extensions.html +80 -84
  212. package/dist/docs/reference/extensions.md +131 -202
  213. package/dist/docs/reference/hooks.html +39 -39
  214. package/dist/docs/reference/hooks.md +34 -34
  215. package/dist/docs/reference/http-api.html +37 -37
  216. package/dist/docs/reference/instructions.html +37 -37
  217. package/dist/docs/reference/playground.html +37 -37
  218. package/dist/docs/reference/project-layout.html +37 -37
  219. package/dist/docs/reference/prompt.html +37 -37
  220. package/dist/docs/reference/schedules.html +37 -37
  221. package/dist/docs/reference/sessions.html +37 -37
  222. package/dist/docs/reference/skills.html +37 -37
  223. package/dist/docs/reference/subagents.html +38 -38
  224. package/dist/docs/reference/subagents.md +1 -1
  225. package/dist/docs/reference/tools.html +38 -38
  226. package/dist/docs/reference/tools.md +4 -0
  227. package/dist/docs/templates/agentic-owners.html +38 -38
  228. package/dist/docs/templates/pr-autofixer.html +37 -37
  229. package/dist/docs/templates/security-reviewer.html +38 -38
  230. package/dist/docs/templates/thermo-quality-review.html +62 -0
  231. package/dist/docs/templates/thermo-quality-review.md +75 -0
  232. package/dist/docs/templates/thermo-review.html +62 -0
  233. package/dist/docs/templates/thermo-review.md +74 -0
  234. package/dist/docs/templates/triage.html +37 -37
  235. package/dist/docs/troubleshooting.html +38 -38
  236. package/dist/docs/troubleshooting.md +97 -66
  237. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  238. package/dist/extensions/improve/extension.d.ts +3 -1
  239. package/dist/extensions/improve/extension.d.ts.map +1 -1
  240. package/dist/extensions/improve/extension.js +4 -2
  241. package/dist/extensions/improve/skills/yourself.js +1 -1
  242. package/dist/extensions/jev/extension.d.ts +43 -0
  243. package/dist/extensions/jev/extension.d.ts.map +1 -0
  244. package/dist/extensions/jev/extension.js +47 -0
  245. package/dist/extensions/jev/lib/evaluate.d.ts +101 -0
  246. package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -0
  247. package/dist/extensions/jev/lib/evaluate.js +167 -0
  248. package/dist/extensions/jev/skills/gated-write.md +25 -0
  249. package/dist/extensions/jev/skills/questions.md +33 -0
  250. package/dist/extensions/jev/tools/evaluate.d.ts +4 -0
  251. package/dist/extensions/jev/tools/evaluate.d.ts.map +1 -0
  252. package/dist/extensions/jev/tools/evaluate.js +88 -0
  253. package/dist/extensions.d.ts +1 -1
  254. package/dist/extensions.d.ts.map +1 -1
  255. package/dist/extensions.js +2 -0
  256. package/dist/filesystem.d.ts +46 -2
  257. package/dist/filesystem.d.ts.map +1 -1
  258. package/dist/filesystem.js +149 -102
  259. package/dist/index.d.ts +2 -2
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +1 -1
  262. package/dist/internal/advertise-tools.d.ts.map +1 -1
  263. package/dist/internal/advertise-tools.js +6 -0
  264. package/dist/internal/cli-ax.d.ts +6 -0
  265. package/dist/internal/cli-ax.d.ts.map +1 -1
  266. package/dist/internal/cli-ax.js +72 -14
  267. package/dist/internal/continuation-identity.d.ts.map +1 -1
  268. package/dist/internal/continuation-identity.js +1 -0
  269. package/dist/internal/cursor-agent-template.d.ts +1 -1
  270. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  271. package/dist/internal/cursor-agent-template.js +2 -0
  272. package/dist/internal/discovery/connections.d.ts.map +1 -1
  273. package/dist/internal/discovery/connections.js +18 -0
  274. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  275. package/dist/internal/discovery/extensions.js +8 -4
  276. package/dist/internal/discovery/info.d.ts.map +1 -1
  277. package/dist/internal/discovery/info.js +1 -0
  278. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  279. package/dist/internal/filesystem/tools.js +2 -2
  280. package/dist/internal/filesystem/walk.d.ts +7 -4
  281. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  282. package/dist/internal/filesystem/walk.js +34 -11
  283. package/dist/internal/hosted-admission-adapter.d.ts +3 -0
  284. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  285. package/dist/internal/hosted-delivery-protocol.d.ts +20 -0
  286. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  287. package/dist/internal/hosted-delivery-protocol.js +51 -1
  288. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  289. package/dist/internal/hosted-delivery.js +23 -25
  290. package/dist/internal/hosted-execution-diag.d.ts +12 -4
  291. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  292. package/dist/internal/hosted-execution-diag.js +26 -4
  293. package/dist/internal/hosted-execution-flush.d.ts +1 -0
  294. package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
  295. package/dist/internal/hosted-execution-flush.js +4 -2
  296. package/dist/internal/init-project.d.ts.map +1 -1
  297. package/dist/internal/init-project.js +4 -0
  298. package/dist/internal/server.d.ts.map +1 -1
  299. package/dist/internal/server.js +111 -48
  300. package/dist/internal/session-engine.d.ts +4 -1
  301. package/dist/internal/session-engine.d.ts.map +1 -1
  302. package/dist/internal/session-engine.js +39 -9
  303. package/dist/internal/skill-catalog.d.ts +28 -0
  304. package/dist/internal/skill-catalog.d.ts.map +1 -0
  305. package/dist/internal/skill-catalog.js +44 -0
  306. package/dist/playground/assets/index-DSMAewbx.css +1 -0
  307. package/dist/playground/assets/index-De_lpFxE.js +67 -0
  308. package/dist/playground/index.html +2 -2
  309. package/dist/types.d.ts +32 -3
  310. package/dist/types.d.ts.map +1 -1
  311. package/docs/README.md +2 -0
  312. package/docs/building-with-agents.md +96 -84
  313. package/docs/deployment.md +118 -364
  314. package/docs/evals.md +149 -673
  315. package/docs/guides/agent-to-agent.md +130 -48
  316. package/docs/guides/bitbucket.md +250 -49
  317. package/docs/guides/cloud-agents.md +119 -67
  318. package/docs/guides/convert-automation.md +157 -148
  319. package/docs/guides/github.md +261 -246
  320. package/docs/guides/gitlab.md +250 -51
  321. package/docs/guides/grokbot-agents.md +100 -55
  322. package/docs/guides/improve.md +112 -59
  323. package/docs/guides/jev.md +353 -0
  324. package/docs/guides/mcp-oauth.md +112 -122
  325. package/docs/guides/opentelemetry.md +97 -166
  326. package/docs/guides/slack.md +158 -228
  327. package/docs/guides/webhooks.md +155 -386
  328. package/docs/hillclimbing.md +102 -56
  329. package/docs/reference/cli.md +2 -0
  330. package/docs/reference/connections.md +1 -1
  331. package/docs/reference/evals.md +298 -0
  332. package/docs/reference/extensions.md +132 -203
  333. package/docs/reference/hooks.md +34 -34
  334. package/docs/reference/subagents.md +1 -1
  335. package/docs/reference/tools.md +4 -0
  336. package/docs/templates/thermo-quality-review.md +80 -0
  337. package/docs/templates/thermo-review.md +79 -0
  338. package/docs/troubleshooting.md +98 -67
  339. package/package.json +8 -1
  340. package/skills/github/SKILL.md +21 -13
  341. package/src/bin/agent-serve.ts +24 -3
  342. package/src/channels/checks.ts +8 -0
  343. package/src/channels/github/github-channel.ts +29 -19
  344. package/src/channels/origin/checks.ts +3 -1
  345. package/src/channels/slack/agentic-delivery.ts +2 -0
  346. package/src/channels/slack/dispatch.ts +131 -4
  347. package/src/channels/slack/placeholder.ts +51 -0
  348. package/src/channels/slack/slack-channel.ts +9 -2
  349. package/src/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  350. package/src/extensions/improve/extension.ts +4 -2
  351. package/src/extensions/improve/skills/yourself.ts +1 -1
  352. package/src/extensions/jev/extension.ts +95 -0
  353. package/src/extensions/jev/lib/evaluate.ts +289 -0
  354. package/src/extensions/jev/skills/gated-write.md +25 -0
  355. package/src/extensions/jev/skills/questions.md +33 -0
  356. package/src/extensions/jev/tools/evaluate.ts +90 -0
  357. package/src/extensions.ts +2 -0
  358. package/src/filesystem.ts +168 -65
  359. package/src/index.ts +3 -0
  360. package/src/internal/advertise-tools.ts +6 -0
  361. package/src/internal/cli-ax.ts +88 -15
  362. package/src/internal/continuation-identity.ts +1 -0
  363. package/src/internal/cursor-agent-template.ts +2 -0
  364. package/src/internal/discovery/connections.ts +21 -0
  365. package/src/internal/discovery/extensions.ts +12 -4
  366. package/src/internal/discovery/info.ts +1 -0
  367. package/src/internal/filesystem/tools.ts +2 -0
  368. package/src/internal/filesystem/walk.ts +60 -15
  369. package/src/internal/hosted-admission-adapter.ts +3 -0
  370. package/src/internal/hosted-delivery-protocol.ts +82 -1
  371. package/src/internal/hosted-delivery.ts +23 -0
  372. package/src/internal/hosted-execution-diag.ts +33 -4
  373. package/src/internal/hosted-execution-flush.ts +4 -0
  374. package/src/internal/init-project.ts +4 -0
  375. package/src/internal/server.ts +130 -53
  376. package/src/internal/session-engine.ts +46 -8
  377. package/src/internal/skill-catalog.ts +69 -0
  378. package/src/types.ts +33 -3
  379. package/templates/thermo-quality-review/README.md +35 -0
  380. package/templates/thermo-quality-review/agent/agent.ts +8 -0
  381. package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
  382. package/templates/thermo-quality-review/agent/instructions.md +43 -0
  383. package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
  384. package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
  385. package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
  386. package/templates/thermo-quality-review/package.json +18 -0
  387. package/templates/thermo-quality-review/tsconfig.json +12 -0
  388. package/templates/thermo-review/README.md +35 -0
  389. package/templates/thermo-review/agent/agent.ts +8 -0
  390. package/templates/thermo-review/agent/channels/github.ts +42 -0
  391. package/templates/thermo-review/agent/instructions.md +40 -0
  392. package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
  393. package/templates/thermo-review/evals/evals.config.ts +5 -0
  394. package/templates/thermo-review/evals/review.eval.ts +53 -0
  395. package/templates/thermo-review/package.json +18 -0
  396. package/templates/thermo-review/tsconfig.json +12 -0
  397. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.js +0 -13
  398. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.lean.js +0 -1
  399. package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +0 -1
  400. package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +0 -1
  401. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +0 -1
  402. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +0 -1
  403. package/dist/docs/assets/chunks/clone.YSt_40_s.js +0 -1
  404. package/dist/docs/assets/chunks/framework.dypDpWZ3.js +0 -19
  405. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +0 -1
  406. package/dist/docs/assets/deployment.md.Dm4Qo3hp.js +0 -51
  407. package/dist/docs/assets/deployment.md.Dm4Qo3hp.lean.js +0 -1
  408. package/dist/docs/assets/evals.md.BLDRt5LH.js +0 -211
  409. package/dist/docs/assets/evals.md.BLDRt5LH.lean.js +0 -1
  410. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +0 -14
  411. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +0 -1
  412. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.js +0 -10
  413. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.lean.js +0 -1
  414. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.js +0 -9
  415. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.lean.js +0 -1
  416. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.js +0 -12
  417. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.lean.js +0 -1
  418. package/dist/docs/assets/guides_github.md.D6ER29dG.js +0 -64
  419. package/dist/docs/assets/guides_github.md.D6ER29dG.lean.js +0 -1
  420. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.js +0 -14
  421. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.lean.js +0 -1
  422. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +0 -9
  423. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.lean.js +0 -1
  424. package/dist/docs/assets/guides_improve.md.BKaDuKKK.js +0 -14
  425. package/dist/docs/assets/guides_improve.md.BKaDuKKK.lean.js +0 -1
  426. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.js +0 -28
  427. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.lean.js +0 -1
  428. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.js +0 -26
  429. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.lean.js +0 -1
  430. package/dist/docs/assets/guides_slack.md.DdT8rmsj.js +0 -46
  431. package/dist/docs/assets/guides_slack.md.DdT8rmsj.lean.js +0 -1
  432. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.js +0 -225
  433. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.lean.js +0 -1
  434. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +0 -1
  435. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +0 -1
  436. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.js +0 -62
  437. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.lean.js +0 -1
  438. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.js +0 -1
  439. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.lean.js +0 -1
  440. package/dist/playground/assets/index-BLlKgZtI.css +0 -1
  441. 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,69 @@ export async function dispatchInboundMessage(args: {
413
433
  team: message.teamId,
414
434
  });
415
435
 
436
+ const handoff = args.platformHandoff?.slackPlaceholder;
437
+ const handoffInThread =
438
+ kind !== "channel_post" &&
439
+ handoff !== undefined &&
440
+ handoff.channelId === message.channelId &&
441
+ handoff.threadTs === message.threadTs
442
+ ? handoff
443
+ : undefined;
444
+ const matchedHandoff =
445
+ args.placeholder !== undefined ? handoffInThread : undefined;
446
+ let adoptedPlaceholder = false;
447
+ let handoffRetracted = false;
448
+ const retractUnadoptedHandoff = async (): Promise<void> => {
449
+ if (matchedHandoff === undefined || handoffRetracted) {
450
+ return;
451
+ }
452
+ handoffRetracted = true;
453
+ await retractPlaceholderMessage({
454
+ botToken: args.credentials?.botToken,
455
+ channelId: matchedHandoff.channelId,
456
+ ts: matchedHandoff.messageTs,
457
+ streamed: matchedHandoff.streamed,
458
+ log,
459
+ });
460
+ };
461
+ const adoptMatchedHandoff = async (): Promise<void> => {
462
+ if (matchedHandoff === undefined) {
463
+ return;
464
+ }
465
+ const adoption = adoptPlaceholder({
466
+ channelId: matchedHandoff.channelId,
467
+ threadTs: matchedHandoff.threadTs,
468
+ ts: matchedHandoff.messageTs,
469
+ streamed: matchedHandoff.streamed,
470
+ });
471
+ if (adoption === "adopted") {
472
+ adoptedPlaceholder = true;
473
+ log.info("placeholder adopted from control-plane handoff", {
474
+ channel: message.channelId,
475
+ thread_ts: message.threadTs,
476
+ message_ts: matchedHandoff.messageTs,
477
+ });
478
+ return;
479
+ }
480
+ if (adoption === "occupied") {
481
+ // Another delivery owns this thread's slot. Remove only this delivery's
482
+ // redundant CP post.
483
+ await retractUnadoptedHandoff();
484
+ }
485
+ };
486
+ const retractAdoptedPlaceholder = async (): Promise<void> => {
487
+ if (!adoptedPlaceholder) {
488
+ return;
489
+ }
490
+ adoptedPlaceholder = false;
491
+ await retractPlaceholderSlot({
492
+ channelId: message.channelId,
493
+ threadTs: message.threadTs,
494
+ botToken: args.credentials?.botToken,
495
+ log,
496
+ });
497
+ };
498
+
416
499
  const userId = message.author?.userId ?? "";
417
500
  const teamId = message.teamId;
418
501
  let membership: Promise<boolean> | undefined;
@@ -425,6 +508,7 @@ export async function dispatchInboundMessage(args: {
425
508
  user: userId,
426
509
  event_id: args.eventId,
427
510
  });
511
+ await retractUnadoptedHandoff();
428
512
  return;
429
513
  }
430
514
  membership = isExternalSlackSender({
@@ -463,6 +547,7 @@ export async function dispatchInboundMessage(args: {
463
547
  ) {
464
548
  if (membership !== undefined && (await membership)) {
465
549
  dropExternal();
550
+ await retractUnadoptedHandoff();
466
551
  return;
467
552
  }
468
553
  log.info("stop directive", {
@@ -484,6 +569,7 @@ export async function dispatchInboundMessage(args: {
484
569
  } catch {
485
570
  // best-effort status
486
571
  }
572
+ await retractUnadoptedHandoff();
487
573
  return;
488
574
  }
489
575
 
@@ -501,6 +587,7 @@ export async function dispatchInboundMessage(args: {
501
587
  if (evalDirective !== null && args.host.evals !== undefined) {
502
588
  if (membership !== undefined && (await membership)) {
503
589
  dropExternal();
590
+ await retractUnadoptedHandoff();
504
591
  return;
505
592
  }
506
593
  log.info("eval directive", {
@@ -516,6 +603,7 @@ export async function dispatchInboundMessage(args: {
516
603
  evals: args.host.evals,
517
604
  binding,
518
605
  });
606
+ await retractUnadoptedHandoff();
519
607
  return;
520
608
  }
521
609
 
@@ -530,8 +618,12 @@ export async function dispatchInboundMessage(args: {
530
618
  event_id: args.eventId,
531
619
  });
532
620
  if (args.propagateHandlerErrors === true) {
621
+ if (mapThrownRequestError(error)?.retry !== "transient") {
622
+ await retractUnadoptedHandoff();
623
+ }
533
624
  throw error;
534
625
  }
626
+ await retractUnadoptedHandoff();
535
627
  return;
536
628
  }
537
629
  if (decision === null || decision === undefined) {
@@ -541,6 +633,7 @@ export async function dispatchInboundMessage(args: {
541
633
  thread_ts: message.threadTs,
542
634
  event_id: args.eventId,
543
635
  });
636
+ await retractUnadoptedHandoff();
544
637
  return;
545
638
  }
546
639
 
@@ -560,6 +653,8 @@ export async function dispatchInboundMessage(args: {
560
653
  return;
561
654
  }
562
655
 
656
+ await adoptMatchedHandoff();
657
+
563
658
  const painted =
564
659
  args.ack === undefined
565
660
  ? undefined
@@ -580,8 +675,12 @@ export async function dispatchInboundMessage(args: {
580
675
  });
581
676
  }
582
677
 
678
+ // A control-plane placeholder is turn scaffolding, not thread history: the
679
+ // guest posts the reply over that exact ts, so hydrating it would feed the
680
+ // model its own "still working" line as an already-sent reply.
583
681
  const excludeThreadTimestamps = [
584
682
  message.ts,
683
+ ...(handoffInThread === undefined ? [] : [handoffInThread.messageTs]),
585
684
  ...(decision.excludeThreadTimestamps ?? []),
586
685
  ];
587
686
  const mergeMessages = [triggeringMergeMessage(message)];
@@ -639,6 +738,7 @@ export async function dispatchInboundMessage(args: {
639
738
  });
640
739
  }
641
740
  await args.host.slackNudges?.releaseAsk(message.channelId, message.ts);
741
+ await retractAdoptedPlaceholder();
642
742
  return;
643
743
  }
644
744
  if (message.files !== undefined && message.files.length > 0) {
@@ -688,8 +788,10 @@ export async function dispatchInboundMessage(args: {
688
788
  hosted &&
689
789
  hasPlaceholder &&
690
790
  (message.ts !== message.threadTs || continuationExists);
791
+ // Adopted slots already exist in Slack; skip a second post. Cold hosted
792
+ // without a handoff still defers to `turn.started`.
691
793
  const placeholder =
692
- hasPlaceholder && (!hosted || hostedFollowup)
794
+ !adoptedPlaceholder && hasPlaceholder && (!hosted || hostedFollowup)
693
795
  ? startPlaceholder({
694
796
  line: placeholderLine,
695
797
  botToken: args.credentials?.botToken,
@@ -700,7 +802,7 @@ export async function dispatchInboundMessage(args: {
700
802
  recipientTeamId: message.teamId,
701
803
  })
702
804
  : undefined;
703
- const posted = placeholder !== undefined;
805
+ const posted = adoptedPlaceholder || placeholder !== undefined;
704
806
  const state = emptySlackChannelState({
705
807
  channelId: message.channelId,
706
808
  threadTs: message.threadTs,
@@ -811,6 +913,7 @@ export async function dispatchInboundMessage(args: {
811
913
  if (placeholder !== undefined) {
812
914
  await placeholder.retract();
813
915
  }
916
+ await retractAdoptedPlaceholder();
814
917
  if (painted !== undefined) {
815
918
  await painted;
816
919
  await retractTurnStart({
@@ -850,6 +953,21 @@ export function dispatchInboundFromEventBody(
850
953
  ): boolean {
851
954
  const log = deps.log ?? defaultSlackLog;
852
955
  let eventId: string | undefined;
956
+ const retractUnscheduledHandoff = (): void => {
957
+ const placeholder = deps.platformHandoff?.slackPlaceholder;
958
+ if (placeholder === undefined) {
959
+ return;
960
+ }
961
+ deps.waitUntil(
962
+ retractPlaceholderMessage({
963
+ botToken: deps.credentials?.botToken,
964
+ channelId: placeholder.channelId,
965
+ ts: placeholder.messageTs,
966
+ streamed: placeholder.streamed,
967
+ log,
968
+ })
969
+ );
970
+ };
853
971
 
854
972
  if (body !== null && typeof body === "object" && !Array.isArray(body)) {
855
973
  const root = body as { event_id?: unknown };
@@ -857,6 +975,7 @@ export function dispatchInboundFromEventBody(
857
975
  eventId = root.event_id;
858
976
  if (!deps.eventIds.tryHandle(root.event_id)) {
859
977
  log.debug("inbound dedupe drop", { event_id: eventId });
978
+ retractUnscheduledHandoff();
860
979
  return false;
861
980
  }
862
981
  }
@@ -868,6 +987,7 @@ export function dispatchInboundFromEventBody(
868
987
  if (mention !== null) {
869
988
  if (deps.mentionsEnabled === false) {
870
989
  log.debug("inbound ignored (mentions disabled)", { event_id: eventId });
990
+ retractUnscheduledHandoff();
871
991
  return false;
872
992
  }
873
993
  if (mention.author?.isBot === true) {
@@ -885,6 +1005,7 @@ export function dispatchInboundFromEventBody(
885
1005
  from_bot: mention.author.botId ?? mention.author.userId,
886
1006
  reason: verdict.reason,
887
1007
  });
1008
+ retractUnscheduledHandoff();
888
1009
  return false;
889
1010
  }
890
1011
  }
@@ -894,6 +1015,7 @@ export function dispatchInboundFromEventBody(
894
1015
  handler: deps.onAppMention,
895
1016
  evalCommandsEnabled: deps.evalCommandsEnabled,
896
1017
  eventId,
1018
+ platformHandoff: deps.platformHandoff,
897
1019
  });
898
1020
  return true;
899
1021
  }
@@ -904,6 +1026,7 @@ export function dispatchInboundFromEventBody(
904
1026
  log.debug("inbound ignored (direct messages disabled)", {
905
1027
  event_id: eventId,
906
1028
  });
1029
+ retractUnscheduledHandoff();
907
1030
  return false;
908
1031
  }
909
1032
  scheduleInbound(deps, log, {
@@ -912,12 +1035,14 @@ export function dispatchInboundFromEventBody(
912
1035
  handler: deps.onDirectMessage,
913
1036
  evalCommandsEnabled: deps.evalCommandsEnabled,
914
1037
  eventId,
1038
+ platformHandoff: deps.platformHandoff,
915
1039
  });
916
1040
  return true;
917
1041
  }
918
1042
 
919
1043
  const reaction = parseReactionAddedEvent(body);
920
1044
  if (reaction !== null && deps.onReactionAdded !== undefined) {
1045
+ retractUnscheduledHandoff();
921
1046
  scheduleInbound(deps, log, {
922
1047
  kind: "reaction_added",
923
1048
  message: reaction,
@@ -982,6 +1107,7 @@ export function dispatchInboundFromEventBody(
982
1107
  includeBotAuthored: true,
983
1108
  });
984
1109
  if (channelEvent !== null) {
1110
+ retractUnscheduledHandoff();
985
1111
  return deps.channelWatch.handle(channelEvent, eventId);
986
1112
  }
987
1113
  }
@@ -990,5 +1116,6 @@ export function dispatchInboundFromEventBody(
990
1116
  ...describeSlackEventShape(body),
991
1117
  event_id: eventId,
992
1118
  });
1119
+ retractUnscheduledHandoff();
993
1120
  return false;
994
1121
  }
@@ -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
 
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Jev decisions as an extension. Mount it and the agent can ask Jev for
3
+ * typed boolean, choice, and score answers, then call `decide` from your
4
+ * own channel hooks and tools before they start a turn or write.
5
+ *
6
+ * ```ts
7
+ * // agent/extensions/jev.ts
8
+ * import jev from "@cursor/july/extensions/jev";
9
+ *
10
+ * export default jev();
11
+ * ```
12
+ *
13
+ * Contributes `<namespace>__evaluate` plus the `questions` and
14
+ * `gated-write` skills (the namespace is the mount filename). Auth is
15
+ * `TYPESAFE_API_KEY`. The default model is `jev-latest`. Custom tools
16
+ * import `decide`, `above`, and `needsHuman` from this same module. Set
17
+ * `harnessTools` or `skills` to false when the agent should not see those
18
+ * contributions.
19
+ */
20
+
21
+ import { z } from "zod";
22
+ import { defineExtension } from "../../extensions.js";
23
+ import type { Extension } from "../../types.js";
24
+ import { DEFAULT_EVALUATION_MODEL } from "./lib/evaluate.js";
25
+
26
+ /** Mount options; every field is optional. */
27
+ export interface JevOptions {
28
+ /** TypeSafe API key. Defaults to `TYPESAFE_API_KEY`. */
29
+ apiKey?: string;
30
+ /** TypeSafe model id. Defaults to `jev-latest`. */
31
+ model?: string;
32
+ /** Mount the namespaced `evaluate` harness tool. Defaults to true. */
33
+ harnessTools?: boolean;
34
+ /** Mount the `questions` and `gated-write` skills. Defaults to true. */
35
+ skills?: boolean;
36
+ }
37
+
38
+ /** {@link JevOptions} with defaults applied. */
39
+ export interface JevConfig {
40
+ apiKey?: string;
41
+ model: string;
42
+ harnessTools: boolean;
43
+ skills: boolean;
44
+ }
45
+
46
+ const config: z.ZodType<JevConfig, z.ZodTypeDef, JevOptions | undefined> = z
47
+ .object({
48
+ apiKey: z.string().min(1).optional(),
49
+ model: z.string().min(1).optional(),
50
+ harnessTools: z.boolean().default(true),
51
+ skills: z.boolean().default(true),
52
+ })
53
+ .default({})
54
+ .transform(options => ({
55
+ apiKey: options.apiKey,
56
+ model: options.model ?? DEFAULT_EVALUATION_MODEL,
57
+ harnessTools: options.harnessTools,
58
+ skills: options.skills,
59
+ }));
60
+
61
+ const jev: Extension<JevConfig, JevOptions | undefined> = defineExtension({
62
+ root: import.meta.dirname,
63
+ description: "Ask Jev for typed choice, score, and boolean answers.",
64
+ config,
65
+ contributions: options => ({
66
+ tools: options.harnessTools,
67
+ skills: options.skills,
68
+ }),
69
+ });
70
+
71
+ export type {
72
+ AnswersFor,
73
+ BooleanAnswer,
74
+ BooleanQuestion,
75
+ ChoiceAnswer,
76
+ ChoiceQuestion,
77
+ EvaluateArgs,
78
+ EvaluateResult,
79
+ EvaluationAnswer,
80
+ EvaluationQuestion,
81
+ EvaluationState,
82
+ QuestionMap,
83
+ ScoreAnswer,
84
+ ScoreQuestion,
85
+ } from "./lib/evaluate.js";
86
+ export {
87
+ above,
88
+ DEFAULT_EVALUATION_MODEL,
89
+ DEFAULT_HUMAN_THRESHOLD,
90
+ decide,
91
+ evaluate,
92
+ needsHuman,
93
+ } from "./lib/evaluate.js";
94
+
95
+ export default jev;