@cursor/july 0.1.109 → 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 (1166) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +0 -15
  3. package/dist/bin/agent-serve.js +99 -67
  4. package/dist/channels/bitbucket/api.js +8 -8
  5. package/dist/channels/bitbucket/binding.js +4 -4
  6. package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
  7. package/dist/channels/bitbucket/bitbucket-webhook.js +1 -1
  8. package/dist/channels/bitbucket/checks.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/checks.js +1 -1
  10. package/dist/channels/bitbucket/cursor-account.js +1 -1
  11. package/dist/channels/bitbucket/events.js +1 -1
  12. package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
  13. package/dist/channels/checks.d.ts.map +1 -1
  14. package/dist/channels/checks.js +2 -2
  15. package/dist/channels/deployments/deployments-channel.js +1 -1
  16. package/dist/channels/github/cursor-account.js +3 -3
  17. package/dist/channels/github/defaults.d.ts.map +1 -1
  18. package/dist/channels/github/defaults.js +5 -3
  19. package/dist/channels/github/events.js +1 -1
  20. package/dist/channels/github/forward.js +8 -8
  21. package/dist/channels/github/github-channel.d.ts +29 -19
  22. package/dist/channels/github/github-channel.d.ts.map +1 -1
  23. package/dist/channels/github/github-channel.js +46 -32
  24. package/dist/channels/github/progress.d.ts.map +1 -1
  25. package/dist/channels/github/progress.js +7 -2
  26. package/dist/channels/github/state.d.ts +6 -0
  27. package/dist/channels/github/state.d.ts.map +1 -1
  28. package/dist/channels/github/types.d.ts +6 -0
  29. package/dist/channels/github/types.d.ts.map +1 -1
  30. package/dist/channels/gitlab/binding.js +4 -4
  31. package/dist/channels/gitlab/checks.d.ts.map +1 -1
  32. package/dist/channels/gitlab/checks.js +1 -1
  33. package/dist/channels/gitlab/cursor-account.js +1 -1
  34. package/dist/channels/gitlab/events.js +1 -1
  35. package/dist/channels/gitlab/gitlab-channel.js +1 -1
  36. package/dist/channels/gitlab/gitlab-webhook.js +1 -1
  37. package/dist/channels/gitlab/replay.js +2 -2
  38. package/dist/channels/origin/binding.d.ts +2 -0
  39. package/dist/channels/origin/binding.d.ts.map +1 -1
  40. package/dist/channels/origin/binding.js +3 -3
  41. package/dist/channels/origin/checks.d.ts +19 -7
  42. package/dist/channels/origin/checks.d.ts.map +1 -1
  43. package/dist/channels/origin/checks.js +13 -9
  44. package/dist/channels/origin/cursor-account.js +1 -1
  45. package/dist/channels/origin/defaults.d.ts.map +1 -1
  46. package/dist/channels/origin/defaults.js +3 -1
  47. package/dist/channels/origin/events.js +1 -1
  48. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  49. package/dist/channels/origin/origin-channel.js +2 -1
  50. package/dist/channels/origin/origin-webhook.js +2 -2
  51. package/dist/channels/slack/agentic-delivery.d.ts +23 -0
  52. package/dist/channels/slack/agentic-delivery.d.ts.map +1 -0
  53. package/dist/channels/slack/agentic-delivery.js +560 -0
  54. package/dist/channels/slack/agentic-posted.d.ts +30 -0
  55. package/dist/channels/slack/agentic-posted.d.ts.map +1 -0
  56. package/dist/channels/slack/agentic-posted.js +102 -0
  57. package/dist/channels/slack/agentic-signals.d.ts +48 -0
  58. package/dist/channels/slack/agentic-signals.d.ts.map +1 -0
  59. package/dist/channels/slack/agentic-signals.js +204 -0
  60. package/dist/channels/slack/api.d.ts +20 -1
  61. package/dist/channels/slack/api.d.ts.map +1 -1
  62. package/dist/channels/slack/api.js +43 -11
  63. package/dist/channels/slack/approvals.js +1 -1
  64. package/dist/channels/slack/auth.d.ts.map +1 -1
  65. package/dist/channels/slack/auth.js +3 -1
  66. package/dist/channels/slack/blocks.js +3 -3
  67. package/dist/channels/slack/bot-mentions.d.ts.map +1 -1
  68. package/dist/channels/slack/bot-mentions.js +5 -5
  69. package/dist/channels/slack/channel-watch.js +1 -1
  70. package/dist/channels/slack/cli-project.js +3 -3
  71. package/dist/channels/slack/defaults.d.ts +3 -0
  72. package/dist/channels/slack/defaults.d.ts.map +1 -1
  73. package/dist/channels/slack/defaults.js +90 -29
  74. package/dist/channels/slack/dispatch.d.ts +44 -1
  75. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  76. package/dist/channels/slack/dispatch.js +323 -107
  77. package/dist/channels/slack/doctor.js +1 -1
  78. package/dist/channels/slack/eval-directive.js +1 -1
  79. package/dist/channels/slack/external-policy.d.ts +2 -1
  80. package/dist/channels/slack/external-policy.d.ts.map +1 -1
  81. package/dist/channels/slack/external-policy.js +13 -2
  82. package/dist/channels/slack/footer.d.ts +30 -0
  83. package/dist/channels/slack/footer.d.ts.map +1 -0
  84. package/dist/channels/slack/footer.js +88 -0
  85. package/dist/channels/slack/index.d.ts +2 -0
  86. package/dist/channels/slack/index.d.ts.map +1 -1
  87. package/dist/channels/slack/index.js +2 -0
  88. package/dist/channels/slack/interactive.d.ts.map +1 -1
  89. package/dist/channels/slack/interactive.js +5 -3
  90. package/dist/channels/slack/live-delivery.d.ts +1 -1
  91. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  92. package/dist/channels/slack/live-delivery.js +20 -6
  93. package/dist/channels/slack/log.d.ts.map +1 -1
  94. package/dist/channels/slack/log.js +1 -1
  95. package/dist/channels/slack/manifest.js +1 -1
  96. package/dist/channels/slack/nudge-carrier.js +1 -1
  97. package/dist/channels/slack/nudge-store.js +2 -2
  98. package/dist/channels/slack/paint-start.d.ts +22 -0
  99. package/dist/channels/slack/paint-start.d.ts.map +1 -0
  100. package/dist/channels/slack/paint-start.js +91 -0
  101. package/dist/channels/slack/placeholder.d.ts +62 -0
  102. package/dist/channels/slack/placeholder.d.ts.map +1 -0
  103. package/dist/channels/slack/placeholder.js +268 -0
  104. package/dist/channels/slack/progress-delivery.d.ts.map +1 -1
  105. package/dist/channels/slack/progress-delivery.js +13 -4
  106. package/dist/channels/slack/reasoning-chip.d.ts +8 -0
  107. package/dist/channels/slack/reasoning-chip.d.ts.map +1 -0
  108. package/dist/channels/slack/reasoning-chip.js +30 -0
  109. package/dist/channels/slack/recording-sink.d.ts +29 -0
  110. package/dist/channels/slack/recording-sink.d.ts.map +1 -0
  111. package/dist/channels/slack/recording-sink.js +142 -0
  112. package/dist/channels/slack/reply-options.d.ts +8 -1
  113. package/dist/channels/slack/reply-options.d.ts.map +1 -1
  114. package/dist/channels/slack/reply-options.js +59 -14
  115. package/dist/channels/slack/setup.js +1 -1
  116. package/dist/channels/slack/slack-channel.d.ts +2 -2
  117. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  118. package/dist/channels/slack/slack-channel.js +58 -30
  119. package/dist/channels/slack/socket-mode.js +2 -2
  120. package/dist/channels/slack/thread-context.js +5 -5
  121. package/dist/channels/slack/tool-approval-events.d.ts +5 -0
  122. package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
  123. package/dist/channels/slack/tool-approval-events.js +50 -38
  124. package/dist/channels/slack/tool-cards.js +1 -1
  125. package/dist/channels/slack/tool-chip.d.ts +9 -0
  126. package/dist/channels/slack/tool-chip.d.ts.map +1 -0
  127. package/dist/channels/slack/tool-chip.js +25 -0
  128. package/dist/channels/slack/types.d.ts +49 -7
  129. package/dist/channels/slack/types.d.ts.map +1 -1
  130. package/dist/channels/slack/upload.d.ts +13 -0
  131. package/dist/channels/slack/upload.d.ts.map +1 -0
  132. package/dist/channels/slack/upload.js +135 -0
  133. package/dist/channels.d.ts +10 -14
  134. package/dist/channels.d.ts.map +1 -1
  135. package/dist/channels.js +9 -21
  136. package/dist/dashboard-session-url.d.ts +15 -0
  137. package/dist/dashboard-session-url.d.ts.map +1 -0
  138. package/dist/dashboard-session-url.js +25 -0
  139. package/dist/docs/404.html +3 -3
  140. package/dist/docs/architecture.svg +59 -0
  141. package/dist/docs/assets/app.DxTdhphC.js +309 -0
  142. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
  143. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
  144. package/dist/docs/assets/chunks/@localSearchIndexroot.QmjDU6Jh.js +1 -0
  145. package/dist/docs/assets/chunks/{VPLocalSearchBox.CVQERt56.js → VPLocalSearchBox.CR3KTF0X.js} +2 -2
  146. package/dist/docs/assets/chunks/arc.CVVqBOdS.js +1 -0
  147. package/dist/docs/assets/chunks/architectureDiagram-Q4EWVU46.CJHGP4ki.js +36 -0
  148. package/dist/docs/assets/chunks/baseUniq.r7UVVRBP.js +1 -0
  149. package/dist/docs/assets/chunks/blockDiagram-DXYQGD6D.DKmMaTre.js +132 -0
  150. package/dist/docs/assets/chunks/c4Diagram-AHTNJAMY.DDJsntUO.js +10 -0
  151. package/dist/docs/assets/chunks/channel.BjpoSbz_.js +1 -0
  152. package/dist/docs/assets/chunks/chunk-4BX2VUAB.BK2rKt6W.js +1 -0
  153. package/dist/docs/assets/chunks/chunk-4TB4RGXK.DRLV8RnF.js +206 -0
  154. package/dist/docs/assets/chunks/chunk-55IACEB6.DaKjxtb7.js +1 -0
  155. package/dist/docs/assets/chunks/chunk-EDXVE4YY.C5sPCIT1.js +1 -0
  156. package/dist/docs/assets/chunks/chunk-FMBD7UC4.CSGWyNTB.js +15 -0
  157. package/dist/docs/assets/chunks/chunk-OYMX7WX6.D5tK9XEr.js +231 -0
  158. package/dist/docs/assets/chunks/chunk-QZHKN3VN.BeZGd1UZ.js +1 -0
  159. package/dist/docs/assets/chunks/chunk-YZCP3GAM.U_tfWwQR.js +1 -0
  160. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BgxOlMHw.js +1 -0
  161. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BgxOlMHw.js +1 -0
  162. package/dist/docs/assets/chunks/clone.DRuGBKZC.js +1 -0
  163. package/dist/docs/assets/chunks/cose-bilkent-S5V4N54A.DVeRXIb6.js +1 -0
  164. package/dist/docs/assets/chunks/cytoscape.esm.BQk4lpUV.js +331 -0
  165. package/dist/docs/assets/chunks/dagre-KV5264BT.BpKJAeRZ.js +4 -0
  166. package/dist/docs/assets/chunks/defaultLocale.C4B-KCzX.js +1 -0
  167. package/dist/docs/assets/chunks/diagram-5BDNPKRD.BQOtrd1Z.js +10 -0
  168. package/dist/docs/assets/chunks/diagram-G4DWMVQ6.CSDAhjPI.js +24 -0
  169. package/dist/docs/assets/chunks/diagram-MMDJMWI5.Dpztst2S.js +43 -0
  170. package/dist/docs/assets/chunks/diagram-TYMM5635.qJHRizHR.js +24 -0
  171. package/dist/docs/assets/chunks/erDiagram-SMLLAGMA.vbDotH3l.js +85 -0
  172. package/dist/docs/assets/chunks/flowDiagram-DWJPFMVM.CqS_ZQr4.js +162 -0
  173. package/dist/docs/assets/chunks/{framework.BCISBCiQ.js → framework.BNw1pucY.js} +6 -6
  174. package/dist/docs/assets/chunks/ganttDiagram-T4ZO3ILL.DTLdR4pN.js +292 -0
  175. package/dist/docs/assets/chunks/gitGraphDiagram-UUTBAWPF.D04lnbnr.js +106 -0
  176. package/dist/docs/assets/chunks/graph.BlfqLJsM.js +1 -0
  177. package/dist/docs/assets/chunks/infoDiagram-42DDH7IO.tAooImWA.js +2 -0
  178. package/dist/docs/assets/chunks/init.Gi6I4Gst.js +1 -0
  179. package/dist/docs/assets/chunks/ishikawaDiagram-UXIWVN3A.ClUsVqnJ.js +70 -0
  180. package/dist/docs/assets/chunks/journeyDiagram-VCZTEJTY.C3tUgyCg.js +139 -0
  181. package/dist/docs/assets/chunks/kanban-definition-6JOO6SKY.CtD9-QCe.js +89 -0
  182. package/dist/docs/assets/chunks/katex.DkKDou_j.js +257 -0
  183. package/dist/docs/assets/chunks/layout.D38U-LnT.js +1 -0
  184. package/dist/docs/assets/chunks/linear.BJmssyhN.js +1 -0
  185. package/dist/docs/assets/chunks/min.DNgXoouU.js +1 -0
  186. package/dist/docs/assets/chunks/mindmap-definition-QFDTVHPH.Dcp6cxeu.js +96 -0
  187. package/dist/docs/assets/chunks/ordinal.DBvzRdQf.js +1 -0
  188. package/dist/docs/assets/chunks/pieDiagram-DEJITSTG.CLDw6zIs.js +30 -0
  189. package/dist/docs/assets/chunks/quadrantDiagram-34T5L4WZ.CYaeeY4c.js +7 -0
  190. package/dist/docs/assets/chunks/requirementDiagram-MS252O5E.gMYuRpq2.js +84 -0
  191. package/dist/docs/assets/chunks/sankeyDiagram-XADWPNL6.CZqyHFbc.js +10 -0
  192. package/dist/docs/assets/chunks/sequenceDiagram-FGHM5R23.BTsCjUDN.js +157 -0
  193. package/dist/docs/assets/chunks/stateDiagram-FHFEXIEX.CftT9mLJ.js +1 -0
  194. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.-43J68xB.js +1 -0
  195. package/dist/docs/assets/chunks/{theme.Dnsd3XOn.js → theme.B_7J9ZsV.js} +2 -2
  196. package/dist/docs/assets/chunks/timeline-definition-GMOUNBTQ.DbU3WUNw.js +120 -0
  197. package/dist/docs/assets/chunks/vennDiagram-DHZGUBPP.ixsq-q2u.js +34 -0
  198. package/dist/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js +1 -0
  199. package/dist/docs/assets/chunks/wardley-RL74JXVD.WRXz-Dux.js +162 -0
  200. package/dist/docs/assets/chunks/wardleyDiagram-NUSXRM2D.C0ewvgbp.js +20 -0
  201. package/dist/docs/assets/chunks/xychartDiagram-5P7HB3ND.nAEhF4bO.js +7 -0
  202. package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
  203. package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
  204. package/dist/docs/assets/evals.md.BYvfZ-PO.js +72 -0
  205. package/dist/docs/assets/evals.md.BYvfZ-PO.lean.js +1 -0
  206. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.js +30 -0
  207. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.lean.js +1 -0
  208. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
  209. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
  210. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
  211. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
  212. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
  213. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
  214. package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
  215. package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
  216. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
  217. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
  218. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
  219. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
  220. package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
  221. package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
  222. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
  223. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
  224. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
  225. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
  226. package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
  227. package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
  228. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
  229. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
  230. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
  231. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
  232. package/dist/docs/assets/index.md.C-t81M5J.js +17 -0
  233. package/dist/docs/assets/index.md.C-t81M5J.lean.js +1 -0
  234. package/dist/docs/assets/{quickstart.md.DdQOF7Y8.js → quickstart.md.DAvVhuuU.js} +30 -38
  235. package/dist/docs/assets/quickstart.md.DAvVhuuU.lean.js +1 -0
  236. package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
  237. package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
  238. package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
  239. package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
  240. package/dist/docs/assets/{reference_channels.md.CAo-iK4j.js → reference_channels.md.nFWbzAic.js} +2 -12
  241. package/dist/docs/assets/{reference_channels.md.CAo-iK4j.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
  242. package/dist/docs/assets/{reference_cli.md.Deg7849l.js → reference_cli.md.DLWDz9ij.js} +5 -3
  243. package/dist/docs/assets/{reference_cli.md.Deg7849l.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
  244. package/dist/docs/assets/{reference_connections.md.BojkC6c5.js → reference_connections.md.CmyrlXfY.js} +4 -4
  245. package/dist/docs/assets/{reference_connections.md.BojkC6c5.lean.js → reference_connections.md.CmyrlXfY.lean.js} +1 -1
  246. package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
  247. package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
  248. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.js +58 -0
  249. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.lean.js +1 -0
  250. package/dist/docs/assets/{reference_hooks.md.BlM_bOg6.js → reference_hooks.md.B7uzNENk.js} +3 -3
  251. package/dist/docs/assets/{reference_hooks.md.BlM_bOg6.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
  252. package/dist/docs/assets/{reference_http-api.md.BwaCo-VO.js → reference_http-api.md.CduHavZ2.js} +3 -3
  253. package/dist/docs/assets/{reference_http-api.md.BwaCo-VO.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
  254. package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.js → reference_instructions.md.CU1My5My.js} +1 -1
  255. package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
  256. package/dist/docs/assets/{reference_playground.md.DLnoaczX.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
  257. package/dist/docs/assets/{reference_playground.md.DLnoaczX.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
  258. package/dist/docs/assets/{reference_project-layout.md.BEU8MtQV.js → reference_project-layout.md.BGhgpy9V.js} +3 -3
  259. package/dist/docs/assets/{reference_project-layout.md.BEU8MtQV.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
  260. package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.js → reference_prompt.md.Ccp0R53H.js} +1 -1
  261. package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
  262. package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
  263. package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
  264. package/dist/docs/assets/{reference_sessions.md.CyXV1MUw.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
  265. package/dist/docs/assets/{reference_sessions.md.CyXV1MUw.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
  266. package/dist/docs/assets/{reference_skills.md.l2ezAcaN.js → reference_skills.md.DjQkRefx.js} +1 -1
  267. package/dist/docs/assets/{reference_skills.md.l2ezAcaN.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
  268. package/dist/docs/assets/{reference_subagents.md.CfsIloPm.js → reference_subagents.md.BHsSMMyO.js} +2 -2
  269. package/dist/docs/assets/{reference_subagents.md.CfsIloPm.lean.js → reference_subagents.md.BHsSMMyO.lean.js} +1 -1
  270. package/dist/docs/assets/{reference_tools.md.aGrn99hP.js → reference_tools.md.BYzUTeVA.js} +4 -4
  271. package/dist/docs/assets/{reference_tools.md.aGrn99hP.lean.js → reference_tools.md.BYzUTeVA.lean.js} +1 -1
  272. package/dist/docs/assets/{style.DCD_zyg3.css → style.Cfo2vbik.css} +1 -1
  273. package/dist/docs/assets/{templates_agentic-owners.md.BZSH4N9z.js → templates_agentic-owners.md.9M575F5C.js} +1 -1
  274. package/dist/docs/assets/{templates_agentic-owners.md.BZSH4N9z.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
  275. package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
  276. package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
  277. package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
  278. package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
  279. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
  280. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
  281. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
  282. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
  283. package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.js → templates_triage.md.CVGe_FG6.js} +1 -1
  284. package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
  285. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
  286. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
  287. package/dist/docs/building-with-agents.html +47 -18
  288. package/dist/docs/building-with-agents.md +94 -84
  289. package/dist/docs/deployment.html +62 -48
  290. package/dist/docs/deployment.md +117 -364
  291. package/dist/docs/evals.html +88 -194
  292. package/dist/docs/evals.md +146 -673
  293. package/dist/docs/guides/agent-to-agent.html +65 -12
  294. package/dist/docs/guides/agent-to-agent.md +125 -91
  295. package/dist/docs/guides/bitbucket.html +182 -14
  296. package/dist/docs/guides/bitbucket.md +249 -48
  297. package/dist/docs/guides/cloud-agents.html +49 -10
  298. package/dist/docs/guides/cloud-agents.md +123 -66
  299. package/dist/docs/guides/convert-automation.html +83 -19
  300. package/dist/docs/guides/convert-automation.md +156 -147
  301. package/dist/docs/guides/github.html +187 -62
  302. package/dist/docs/guides/github.md +260 -245
  303. package/dist/docs/guides/gitlab.html +187 -15
  304. package/dist/docs/guides/gitlab.md +249 -50
  305. package/dist/docs/guides/grokbot-agents.html +51 -11
  306. package/dist/docs/guides/grokbot-agents.md +116 -63
  307. package/dist/docs/guides/improve.html +51 -10
  308. package/dist/docs/guides/improve.md +111 -58
  309. package/dist/docs/guides/mcp-oauth.html +77 -22
  310. package/dist/docs/guides/mcp-oauth.md +111 -121
  311. package/dist/docs/guides/opentelemetry.html +72 -30
  312. package/dist/docs/guides/opentelemetry.md +105 -187
  313. package/dist/docs/guides/slack.html +89 -24
  314. package/dist/docs/guides/slack.md +170 -191
  315. package/dist/docs/guides/webhooks.html +100 -200
  316. package/dist/docs/guides/webhooks.md +154 -386
  317. package/dist/docs/hashmap.json +1 -1
  318. package/dist/docs/hillclimbing.html +47 -11
  319. package/dist/docs/hillclimbing.md +101 -55
  320. package/dist/docs/index.html +57 -12
  321. package/dist/docs/index.md +83 -150
  322. package/dist/docs/llms-full.txt +6244 -10784
  323. package/dist/docs/llms.txt +23 -46
  324. package/dist/docs/quickstart.html +70 -45
  325. package/dist/docs/quickstart.md +44 -105
  326. package/dist/docs/reference/agent-config.html +41 -8
  327. package/dist/docs/reference/artifacts.html +41 -8
  328. package/dist/docs/reference/channels.html +41 -18
  329. package/dist/docs/reference/channels.md +0 -16
  330. package/dist/docs/reference/cli.html +44 -9
  331. package/dist/docs/reference/cli.md +2 -16
  332. package/dist/docs/reference/connections.html +43 -10
  333. package/dist/docs/reference/connections.md +3 -5
  334. package/dist/docs/reference/evals.html +116 -0
  335. package/dist/docs/reference/evals.md +293 -0
  336. package/dist/docs/reference/extensions.html +83 -54
  337. package/dist/docs/reference/extensions.md +127 -199
  338. package/dist/docs/reference/hooks.html +42 -9
  339. package/dist/docs/reference/hooks.md +34 -36
  340. package/dist/docs/reference/http-api.html +42 -9
  341. package/dist/docs/reference/http-api.md +5 -5
  342. package/dist/docs/reference/instructions.html +41 -8
  343. package/dist/docs/reference/playground.html +40 -7
  344. package/dist/docs/reference/playground.md +2 -2
  345. package/dist/docs/reference/project-layout.html +42 -9
  346. package/dist/docs/reference/project-layout.md +3 -4
  347. package/dist/docs/reference/prompt.html +41 -8
  348. package/dist/docs/reference/schedules.html +41 -8
  349. package/dist/docs/reference/sessions.html +40 -7
  350. package/dist/docs/reference/sessions.md +5 -4
  351. package/dist/docs/reference/skills.html +41 -8
  352. package/dist/docs/reference/subagents.html +41 -8
  353. package/dist/docs/reference/subagents.md +2 -4
  354. package/dist/docs/reference/tools.html +43 -10
  355. package/dist/docs/reference/tools.md +2 -5
  356. package/dist/docs/templates/agentic-owners.html +41 -8
  357. package/dist/docs/templates/pr-autofixer.html +41 -8
  358. package/dist/docs/templates/security-reviewer.html +41 -8
  359. package/dist/docs/templates/thermo-quality-review.html +62 -0
  360. package/dist/docs/templates/thermo-quality-review.md +75 -0
  361. package/dist/docs/templates/thermo-review.html +62 -0
  362. package/dist/docs/templates/thermo-review.md +74 -0
  363. package/dist/docs/templates/triage.html +41 -8
  364. package/dist/docs/troubleshooting.html +41 -8
  365. package/dist/docs/troubleshooting.md +97 -67
  366. package/dist/evals/assertions.js +19 -19
  367. package/dist/evals/expect.js +1 -1
  368. package/dist/evals/judge.js +1 -1
  369. package/dist/evals/reporters.d.ts.map +1 -1
  370. package/dist/evals/reporters.js +8 -8
  371. package/dist/evals/run-facts.js +2 -2
  372. package/dist/evals.d.ts +1 -1
  373. package/dist/evals.d.ts.map +1 -1
  374. package/dist/evals.js +7 -7
  375. package/dist/extensions/cursor-cloud-agents/extension.js +1 -1
  376. package/dist/extensions/cursor-cloud-agents/lib/backend.js +3 -3
  377. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
  378. package/dist/extensions/cursor-cloud-agents/lib/repos.js +6 -6
  379. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -1
  380. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -2
  381. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  382. package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
  383. package/dist/extensions/improve/extension.d.ts +3 -1
  384. package/dist/extensions/improve/extension.d.ts.map +1 -1
  385. package/dist/extensions/improve/extension.js +4 -2
  386. package/dist/extensions/improve/skills/yourself.js +2 -2
  387. package/dist/extensions/slack-communication/extension.d.ts +28 -0
  388. package/dist/extensions/slack-communication/extension.d.ts.map +1 -0
  389. package/dist/extensions/slack-communication/extension.js +32 -0
  390. package/dist/extensions/slack-communication/skills/slack-voice.d.ts +5 -0
  391. package/dist/extensions/slack-communication/skills/slack-voice.d.ts.map +1 -0
  392. package/dist/extensions/slack-communication/skills/slack-voice.js +54 -0
  393. package/dist/extensions/slack-communication/tools/delete-message.d.ts +4 -0
  394. package/dist/extensions/slack-communication/tools/delete-message.d.ts.map +1 -0
  395. package/dist/extensions/slack-communication/tools/delete-message.js +29 -0
  396. package/dist/extensions/slack-communication/tools/edit-message.d.ts +4 -0
  397. package/dist/extensions/slack-communication/tools/edit-message.d.ts.map +1 -0
  398. package/dist/extensions/slack-communication/tools/edit-message.js +37 -0
  399. package/dist/extensions/slack-communication/tools/post-card.d.ts +4 -0
  400. package/dist/extensions/slack-communication/tools/post-card.d.ts.map +1 -0
  401. package/dist/extensions/slack-communication/tools/post-card.js +25 -0
  402. package/dist/extensions/slack-communication/tools/post-file.d.ts +4 -0
  403. package/dist/extensions/slack-communication/tools/post-file.d.ts.map +1 -0
  404. package/dist/extensions/slack-communication/tools/post-file.js +76 -0
  405. package/dist/extensions/slack-communication/tools/post-update.d.ts +4 -0
  406. package/dist/extensions/slack-communication/tools/post-update.d.ts.map +1 -0
  407. package/dist/extensions/slack-communication/tools/post-update.js +36 -0
  408. package/dist/extensions/slack-communication/tools/react.d.ts +4 -0
  409. package/dist/extensions/slack-communication/tools/react.d.ts.map +1 -0
  410. package/dist/extensions/slack-communication/tools/react.js +27 -0
  411. package/dist/extensions/slack-communication/tools/set-status.d.ts +4 -0
  412. package/dist/extensions/slack-communication/tools/set-status.d.ts.map +1 -0
  413. package/dist/extensions/slack-communication/tools/set-status.js +18 -0
  414. package/dist/files-backends/cursor-hosted.d.ts +18 -6
  415. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  416. package/dist/files-backends/cursor-hosted.js +357 -74
  417. package/dist/files-backends/local-fs.js +1 -1
  418. package/dist/files.d.ts +15 -0
  419. package/dist/files.d.ts.map +1 -1
  420. package/dist/filesystem.d.ts +46 -2
  421. package/dist/filesystem.d.ts.map +1 -1
  422. package/dist/filesystem.js +160 -113
  423. package/dist/index.d.ts +7 -10
  424. package/dist/index.d.ts.map +1 -1
  425. package/dist/index.js +5 -7
  426. package/dist/internal/advertise-tools.js +6 -6
  427. package/dist/internal/approval-gate.js +1 -1
  428. package/dist/internal/artifacts-store.js +3 -3
  429. package/dist/internal/as-of.js +2 -2
  430. package/dist/internal/authored-alias-hooks.js +1 -1
  431. package/dist/internal/builtin-tools/reminders.js +2 -2
  432. package/dist/internal/chat-client.js +5 -5
  433. package/dist/internal/cli-ax.d.ts +7 -0
  434. package/dist/internal/cli-ax.d.ts.map +1 -1
  435. package/dist/internal/cli-ax.js +140 -27
  436. package/dist/internal/cli-bitbucket.js +10 -10
  437. package/dist/internal/cli-convert-automation.js +2 -2
  438. package/dist/internal/cli-cursor.d.ts +3 -11
  439. package/dist/internal/cli-cursor.d.ts.map +1 -1
  440. package/dist/internal/cli-cursor.js +5 -10
  441. package/dist/internal/cli-deploy.d.ts +12 -2
  442. package/dist/internal/cli-deploy.d.ts.map +1 -1
  443. package/dist/internal/cli-deploy.js +328 -96
  444. package/dist/internal/cli-docs.js +5 -5
  445. package/dist/internal/cli-github.js +15 -16
  446. package/dist/internal/cli-gitlab.js +10 -10
  447. package/dist/internal/cli-manifest.js +1 -1
  448. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  449. package/dist/internal/cli-mcp-oauth.js +5 -5
  450. package/dist/internal/cli-mcp.js +3 -3
  451. package/dist/internal/cli-skills.js +2 -2
  452. package/dist/internal/cli-slack.js +5 -5
  453. package/dist/internal/cloud-turn-cost.js +1 -1
  454. package/dist/internal/continuation-identity.d.ts.map +1 -1
  455. package/dist/internal/continuation-identity.js +15 -9
  456. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  457. package/dist/internal/conversation-mirror.js +33 -2
  458. package/dist/internal/convert-automation/convert-workflow.js +25 -24
  459. package/dist/internal/convert-automation/types.d.ts +8 -0
  460. package/dist/internal/convert-automation/types.d.ts.map +1 -1
  461. package/dist/internal/cursor/account-mcp.d.ts +2 -2
  462. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  463. package/dist/internal/cursor/account-mcp.js +32 -27
  464. package/dist/internal/cursor/backend-client.d.ts +15 -10
  465. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  466. package/dist/internal/cursor/backend-client.js +17 -11
  467. package/dist/internal/cursor/credentials.js +1 -1
  468. package/dist/internal/cursor/hosted-store-secrets.d.ts +16 -0
  469. package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
  470. package/dist/internal/cursor/hosted-store-secrets.js +25 -0
  471. package/dist/internal/cursor-account-mcp-auth.js +9 -9
  472. package/dist/internal/cursor-agent-template.d.ts +1 -1
  473. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  474. package/dist/internal/cursor-agent-template.js +2 -0
  475. package/dist/internal/cursor-deployment-relay.js +9 -9
  476. package/dist/internal/cursor-event-relay.js +10 -10
  477. package/dist/internal/cursor-relay-core.js +2 -2
  478. package/dist/internal/deploy-client.d.ts +106 -9
  479. package/dist/internal/deploy-client.d.ts.map +1 -1
  480. package/dist/internal/deploy-client.js +171 -23
  481. package/dist/internal/deploy-manifest.d.ts +13 -0
  482. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  483. package/dist/internal/deploy-manifest.js +32 -16
  484. package/dist/internal/discovery/agent-config.d.ts +5 -0
  485. package/dist/internal/discovery/agent-config.d.ts.map +1 -1
  486. package/dist/internal/discovery/agent-config.js +27 -0
  487. package/dist/internal/discovery/agent.d.ts.map +1 -1
  488. package/dist/internal/discovery/agent.js +10 -8
  489. package/dist/internal/discovery/channels.js +4 -4
  490. package/dist/internal/discovery/connections.js +4 -4
  491. package/dist/internal/discovery/cursor-plugin.js +12 -12
  492. package/dist/internal/discovery/extension-overlay.js +3 -3
  493. package/dist/internal/discovery/extensions.js +6 -6
  494. package/dist/internal/discovery/info.js +9 -9
  495. package/dist/internal/discovery/instructions.js +1 -1
  496. package/dist/internal/discovery/project.d.ts.map +1 -1
  497. package/dist/internal/discovery/project.js +4 -4
  498. package/dist/internal/discovery/services.js +1 -1
  499. package/dist/internal/discovery/tools.js +1 -1
  500. package/dist/internal/docs-site.js +2 -2
  501. package/dist/internal/env-file.js +1 -1
  502. package/dist/internal/eval-run-store.d.ts.map +1 -1
  503. package/dist/internal/eval-run-store.js +7 -7
  504. package/dist/internal/eval-runner.js +14 -14
  505. package/dist/internal/evals-client.js +4 -4
  506. package/dist/internal/event-log.js +8 -8
  507. package/dist/internal/event-mapper.d.ts +18 -0
  508. package/dist/internal/event-mapper.d.ts.map +1 -1
  509. package/dist/internal/event-mapper.js +34 -2
  510. package/dist/internal/filesystem/format.d.ts.map +1 -1
  511. package/dist/internal/filesystem/format.js +6 -3
  512. package/dist/internal/filesystem/scratch.js +3 -3
  513. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  514. package/dist/internal/filesystem/tools.js +7 -7
  515. package/dist/internal/filesystem/walk.d.ts +7 -4
  516. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  517. package/dist/internal/filesystem/walk.js +35 -12
  518. package/dist/internal/framework-file-storage.d.ts +6 -2
  519. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  520. package/dist/internal/framework-file-storage.js +91 -2
  521. package/dist/internal/framework-storage-selection.d.ts +0 -6
  522. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  523. package/dist/internal/framework-storage-selection.js +2 -11
  524. package/dist/internal/github-fanout.js +3 -3
  525. package/dist/internal/guest-network.js +4 -4
  526. package/dist/internal/host-files.js +1 -1
  527. package/dist/internal/host-kv.js +2 -2
  528. package/dist/internal/hosted-admission-adapter.d.ts +5 -0
  529. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  530. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  531. package/dist/internal/hosted-catch-protocol.js +2 -4
  532. package/dist/internal/hosted-catch.js +1 -1
  533. package/dist/internal/hosted-delivery-protocol.d.ts +46 -0
  534. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  535. package/dist/internal/hosted-delivery-protocol.js +126 -9
  536. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  537. package/dist/internal/hosted-delivery.js +209 -64
  538. package/dist/internal/hosted-execution-diag.js +3 -3
  539. package/dist/internal/hosted-execution-latency.d.ts +80 -0
  540. package/dist/internal/hosted-execution-latency.d.ts.map +1 -0
  541. package/dist/internal/hosted-execution-latency.js +220 -0
  542. package/dist/internal/hosting.d.ts +5 -5
  543. package/dist/internal/hosting.d.ts.map +1 -1
  544. package/dist/internal/hosting.js +5 -6
  545. package/dist/internal/http-channel-define.d.ts +11 -0
  546. package/dist/internal/http-channel-define.d.ts.map +1 -0
  547. package/dist/internal/http-channel-define.js +18 -0
  548. package/dist/internal/http-channel.d.ts +2 -3
  549. package/dist/internal/http-channel.d.ts.map +1 -1
  550. package/dist/internal/http-channel.js +3 -4
  551. package/dist/internal/http-control-plane-session.d.ts +7 -3
  552. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  553. package/dist/internal/http-control-plane-session.js +22 -10
  554. package/dist/internal/incoming-headers-to-fetch.d.ts +10 -0
  555. package/dist/internal/incoming-headers-to-fetch.d.ts.map +1 -0
  556. package/dist/internal/incoming-headers-to-fetch.js +41 -0
  557. package/dist/internal/init-interview.js +7 -7
  558. package/dist/internal/init-project.d.ts.map +1 -1
  559. package/dist/internal/init-project.js +18 -14
  560. package/dist/internal/init-scaffold.js +1 -1
  561. package/dist/internal/inline-stdio-mcp.js +2 -2
  562. package/dist/internal/install-cursor-skills.js +10 -10
  563. package/dist/internal/json-schema.js +1 -1
  564. package/dist/internal/local-control-plane.d.ts.map +1 -1
  565. package/dist/internal/local-control-plane.js +3 -3
  566. package/dist/internal/local-env.js +3 -3
  567. package/dist/internal/log-ring.js +1 -1
  568. package/dist/internal/logs-client.js +1 -1
  569. package/dist/internal/mcp-endpoint.js +8 -8
  570. package/dist/internal/mcp-host.js +4 -4
  571. package/dist/internal/mcp-oauth-on-demand.js +3 -3
  572. package/dist/internal/mcp-oauth.js +5 -5
  573. package/dist/internal/net.js +2 -2
  574. package/dist/internal/otel/config.js +3 -3
  575. package/dist/internal/otel/runtime.js +13 -13
  576. package/dist/internal/peer-connections.js +2 -2
  577. package/dist/internal/platform-schedule-sync.js +1 -1
  578. package/dist/internal/platform-timers.js +1 -1
  579. package/dist/internal/playground/static.js +2 -2
  580. package/dist/internal/playground/toolchain.js +2 -2
  581. package/dist/internal/playground-proxy.js +3 -3
  582. package/dist/internal/process-memory-telemetry.js +1 -1
  583. package/dist/internal/reminder-runner.d.ts.map +1 -1
  584. package/dist/internal/reminder-runner.js +7 -7
  585. package/dist/internal/reminder-store.js +1 -1
  586. package/dist/internal/request-error-status.d.ts.map +1 -1
  587. package/dist/internal/request-error-status.js +9 -0
  588. package/dist/internal/resolved-connections.js +8 -8
  589. package/dist/internal/result-output.d.ts +14 -2
  590. package/dist/internal/result-output.d.ts.map +1 -1
  591. package/dist/internal/result-output.js +45 -2
  592. package/dist/internal/router.js +4 -4
  593. package/dist/internal/run-client.js +2 -2
  594. package/dist/internal/schedule-runner.js +6 -6
  595. package/dist/internal/scm/pr-url.d.ts +3 -1
  596. package/dist/internal/scm/pr-url.d.ts.map +1 -1
  597. package/dist/internal/scm/pr-url.js +10 -2
  598. package/dist/internal/sdk-runner.d.ts.map +1 -1
  599. package/dist/internal/sdk-runner.js +14 -15
  600. package/dist/internal/serve-restart.js +1 -1
  601. package/dist/internal/server.d.ts.map +1 -1
  602. package/dist/internal/server.js +175 -126
  603. package/dist/internal/session-cost.js +3 -3
  604. package/dist/internal/session-engine.d.ts +34 -0
  605. package/dist/internal/session-engine.d.ts.map +1 -1
  606. package/dist/internal/session-engine.js +386 -184
  607. package/dist/internal/session-run-log.d.ts.map +1 -1
  608. package/dist/internal/session-run-log.js +4 -4
  609. package/dist/internal/session-store.d.ts +47 -3
  610. package/dist/internal/session-store.d.ts.map +1 -1
  611. package/dist/internal/session-store.js +198 -33
  612. package/dist/internal/sessions-client.js +3 -3
  613. package/dist/internal/skill-catalog.d.ts +28 -0
  614. package/dist/internal/skill-catalog.d.ts.map +1 -0
  615. package/dist/internal/skill-catalog.js +44 -0
  616. package/dist/internal/slack-thread-key.d.ts +7 -0
  617. package/dist/internal/slack-thread-key.d.ts.map +1 -0
  618. package/dist/internal/slack-thread-key.js +10 -0
  619. package/dist/internal/sleep.js +1 -1
  620. package/dist/internal/storage-coordinator.d.ts +17 -0
  621. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  622. package/dist/internal/storage-coordinator.js +111 -11
  623. package/dist/internal/storage.d.ts +2 -0
  624. package/dist/internal/storage.d.ts.map +1 -0
  625. package/dist/internal/storage.js +1 -0
  626. package/dist/internal/store-mirror.js +4 -4
  627. package/dist/internal/terminal-style.js +2 -2
  628. package/dist/internal/tool-result.js +3 -3
  629. package/dist/internal/trajectory.js +7 -7
  630. package/dist/internal/turn-governor.js +2 -2
  631. package/dist/internal/turn-outbox.js +1 -1
  632. package/dist/internal/update-check.js +2 -2
  633. package/dist/internal/v2-hosting.d.ts +9 -0
  634. package/dist/internal/v2-hosting.d.ts.map +1 -1
  635. package/dist/internal/v2-hosting.js +10 -0
  636. package/dist/internal/workspace.d.ts +13 -10
  637. package/dist/internal/workspace.d.ts.map +1 -1
  638. package/dist/internal/workspace.js +17 -16
  639. package/dist/kv/memory-kv.d.ts +6 -4
  640. package/dist/kv/memory-kv.d.ts.map +1 -1
  641. package/dist/kv/memory-kv.js +9 -7
  642. package/dist/kv.d.ts +4 -7
  643. package/dist/kv.d.ts.map +1 -1
  644. package/dist/kv.js +4 -7
  645. package/dist/otel-public.d.ts +7 -0
  646. package/dist/otel-public.d.ts.map +1 -0
  647. package/dist/otel-public.js +5 -0
  648. package/dist/otel.d.ts +7 -2
  649. package/dist/otel.d.ts.map +1 -1
  650. package/dist/otel.js +7 -2
  651. package/dist/playground/assets/index-B1c1LeIf.js +67 -0
  652. package/dist/playground/assets/index-CK2LX3iD.css +1 -0
  653. package/dist/playground/index.html +2 -2
  654. package/dist/prompt.js +1 -1
  655. package/dist/result.d.ts +10 -4
  656. package/dist/result.d.ts.map +1 -1
  657. package/dist/result.js +9 -3
  658. package/dist/storage-backends/cursor-hosted-v2.js +2 -2
  659. package/dist/storage-backends/cursor-hosted.d.ts +5 -17
  660. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  661. package/dist/storage-backends/cursor-hosted.js +6 -20
  662. package/dist/storage-backends/file-kv.js +7 -7
  663. package/dist/storage.d.ts +20 -2
  664. package/dist/storage.d.ts.map +1 -1
  665. package/dist/storage.js +7 -6
  666. package/dist/types.d.ts +76 -11
  667. package/dist/types.d.ts.map +1 -1
  668. package/dist/types.js +12 -4
  669. package/docs/README.md +85 -152
  670. package/docs/building-with-agents.md +96 -86
  671. package/docs/deployment.md +118 -365
  672. package/docs/evals.md +147 -674
  673. package/docs/guides/agent-to-agent.md +126 -92
  674. package/docs/guides/bitbucket.md +250 -49
  675. package/docs/guides/cloud-agents.md +124 -67
  676. package/docs/guides/convert-automation.md +157 -148
  677. package/docs/guides/github.md +261 -246
  678. package/docs/guides/gitlab.md +250 -51
  679. package/docs/guides/grokbot-agents.md +117 -64
  680. package/docs/guides/improve.md +112 -59
  681. package/docs/guides/mcp-oauth.md +112 -122
  682. package/docs/guides/opentelemetry.md +106 -188
  683. package/docs/guides/slack.md +171 -192
  684. package/docs/guides/webhooks.md +155 -387
  685. package/docs/hillclimbing.md +102 -56
  686. package/docs/quickstart.md +45 -106
  687. package/docs/reference/channels.md +0 -16
  688. package/docs/reference/cli.md +2 -16
  689. package/docs/reference/connections.md +3 -5
  690. package/docs/reference/evals.md +298 -0
  691. package/docs/reference/extensions.md +128 -200
  692. package/docs/reference/hooks.md +34 -36
  693. package/docs/reference/http-api.md +5 -5
  694. package/docs/reference/playground.md +2 -2
  695. package/docs/reference/project-layout.md +3 -4
  696. package/docs/reference/sessions.md +5 -4
  697. package/docs/reference/subagents.md +2 -4
  698. package/docs/reference/tools.md +2 -5
  699. package/docs/templates/thermo-quality-review.md +80 -0
  700. package/docs/templates/thermo-review.md +79 -0
  701. package/docs/troubleshooting.md +98 -68
  702. package/package.json +55 -37
  703. package/skills/framework-map/SKILL.md +2 -2
  704. package/skills/github/SKILL.md +21 -13
  705. package/skills/otel/SKILL.md +8 -18
  706. package/src/bin/agent-serve.ts +115 -72
  707. package/src/channels/bitbucket/api.ts +8 -8
  708. package/src/channels/bitbucket/binding.ts +4 -4
  709. package/src/channels/bitbucket/bitbucket-channel.ts +1 -1
  710. package/src/channels/bitbucket/bitbucket-webhook.ts +1 -1
  711. package/src/channels/bitbucket/checks.ts +3 -4
  712. package/src/channels/bitbucket/cursor-account.ts +1 -1
  713. package/src/channels/bitbucket/events.ts +1 -1
  714. package/src/channels/change-monitors/change-monitors-channel.ts +2 -2
  715. package/src/channels/checks.ts +5 -4
  716. package/src/channels/deployments/deployments-channel.ts +1 -1
  717. package/src/channels/github/api.ts +1 -1
  718. package/src/channels/github/checks.ts +1 -1
  719. package/src/channels/github/cursor-account.ts +3 -3
  720. package/src/channels/github/defaults.ts +8 -4
  721. package/src/channels/github/events.ts +1 -1
  722. package/src/channels/github/forward.ts +8 -8
  723. package/src/channels/github/github-channel.ts +48 -21
  724. package/src/channels/github/progress.ts +7 -2
  725. package/src/channels/github/state.ts +6 -0
  726. package/src/channels/github/types.ts +6 -0
  727. package/src/channels/gitlab/binding.ts +4 -4
  728. package/src/channels/gitlab/checks.ts +3 -4
  729. package/src/channels/gitlab/cursor-account.ts +1 -1
  730. package/src/channels/gitlab/events.ts +1 -1
  731. package/src/channels/gitlab/gitlab-channel.ts +1 -1
  732. package/src/channels/gitlab/gitlab-webhook.ts +1 -1
  733. package/src/channels/gitlab/replay.ts +2 -2
  734. package/src/channels/origin/binding.ts +6 -3
  735. package/src/channels/origin/checks.ts +27 -17
  736. package/src/channels/origin/cursor-account.ts +1 -1
  737. package/src/channels/origin/defaults.ts +5 -1
  738. package/src/channels/origin/events.ts +1 -1
  739. package/src/channels/origin/origin-channel.ts +2 -1
  740. package/src/channels/origin/origin-webhook.ts +2 -2
  741. package/src/channels/slack/agentic-delivery.ts +661 -0
  742. package/src/channels/slack/agentic-posted.ts +148 -0
  743. package/src/channels/slack/agentic-signals.ts +248 -0
  744. package/src/channels/slack/api.ts +51 -11
  745. package/src/channels/slack/approvals.ts +1 -1
  746. package/src/channels/slack/attachments.ts +1 -1
  747. package/src/channels/slack/auth.ts +3 -1
  748. package/src/channels/slack/blocks.ts +3 -3
  749. package/src/channels/slack/bot-mentions.ts +5 -7
  750. package/src/channels/slack/channel-watch.ts +1 -1
  751. package/src/channels/slack/cli-project.ts +3 -3
  752. package/src/channels/slack/defaults.ts +109 -37
  753. package/src/channels/slack/dispatch.ts +419 -168
  754. package/src/channels/slack/doctor.ts +1 -1
  755. package/src/channels/slack/eval-directive.ts +1 -1
  756. package/src/channels/slack/external-policy.ts +15 -2
  757. package/src/channels/slack/footer.ts +108 -0
  758. package/src/channels/slack/index.ts +2 -0
  759. package/src/channels/slack/interactive.ts +4 -2
  760. package/src/channels/slack/live-delivery.ts +23 -7
  761. package/src/channels/slack/log.ts +1 -1
  762. package/src/channels/slack/manifest.ts +1 -1
  763. package/src/channels/slack/nudge-carrier.ts +1 -1
  764. package/src/channels/slack/nudge-store.ts +2 -2
  765. package/src/channels/slack/paint-start.ts +93 -0
  766. package/src/channels/slack/placeholder.ts +366 -0
  767. package/src/channels/slack/progress-delivery.ts +14 -1
  768. package/src/channels/slack/reasoning-chip.ts +48 -0
  769. package/src/channels/slack/recording-sink.ts +176 -0
  770. package/src/channels/slack/reply-options.ts +71 -15
  771. package/src/channels/slack/setup.ts +1 -1
  772. package/src/channels/slack/slack-channel.ts +81 -14
  773. package/src/channels/slack/socket-mode.ts +2 -2
  774. package/src/channels/slack/thread-context.ts +5 -5
  775. package/src/channels/slack/tool-approval-events.ts +54 -38
  776. package/src/channels/slack/tool-cards.ts +1 -1
  777. package/src/channels/slack/tool-chip.ts +36 -0
  778. package/src/channels/slack/types.ts +47 -7
  779. package/src/channels/slack/upload.ts +142 -0
  780. package/src/channels.ts +12 -30
  781. package/src/dashboard-session-url.ts +32 -0
  782. package/src/evals/assertions.ts +19 -19
  783. package/src/evals/expect.ts +1 -1
  784. package/src/evals/judge.ts +1 -1
  785. package/src/evals/reporters.ts +8 -9
  786. package/src/evals/run-facts.ts +2 -2
  787. package/src/evals.ts +7 -10
  788. package/src/extensions/cursor-cloud-agents/extension.ts +1 -1
  789. package/src/extensions/cursor-cloud-agents/lib/backend.ts +3 -3
  790. package/src/extensions/cursor-cloud-agents/lib/fleet.ts +1 -1
  791. package/src/extensions/cursor-cloud-agents/lib/repos.ts +3 -3
  792. package/src/extensions/cursor-cloud-agents/lib/transcript.ts +3 -4
  793. package/src/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  794. package/src/extensions/cursor-cloud-agents/tools/list.ts +1 -1
  795. package/src/extensions/improve/extension.ts +4 -2
  796. package/src/extensions/improve/skills/yourself.ts +2 -2
  797. package/src/extensions/slack-communication/evals/harness.ts +728 -0
  798. package/src/extensions/slack-communication/evals/slack-communication.eval.ts +953 -0
  799. package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +194 -0
  800. package/src/extensions/slack-communication/extension.ts +45 -0
  801. package/src/extensions/slack-communication/skills/slack-voice.ts +59 -0
  802. package/src/extensions/slack-communication/tools/delete-message.ts +34 -0
  803. package/src/extensions/slack-communication/tools/edit-message.ts +42 -0
  804. package/src/extensions/slack-communication/tools/post-card.ts +28 -0
  805. package/src/extensions/slack-communication/tools/post-file.ts +85 -0
  806. package/src/extensions/slack-communication/tools/post-update.ts +41 -0
  807. package/src/extensions/slack-communication/tools/react.ts +33 -0
  808. package/src/extensions/slack-communication/tools/set-status.ts +21 -0
  809. package/src/files-backends/cursor-hosted.ts +502 -98
  810. package/src/files-backends/local-fs.ts +1 -1
  811. package/src/files.ts +15 -0
  812. package/src/filesystem.ts +182 -81
  813. package/src/index.ts +7 -36
  814. package/src/internal/advertise-tools.ts +6 -6
  815. package/src/internal/approval-gate.ts +1 -1
  816. package/src/internal/artifacts-store.ts +3 -3
  817. package/src/internal/as-of.ts +2 -2
  818. package/src/internal/authored-alias-hooks.ts +1 -1
  819. package/src/internal/authored-loaders.ts +2 -3
  820. package/src/internal/builtin-tools/reminders.ts +2 -2
  821. package/src/internal/chat-client.ts +5 -5
  822. package/src/internal/cli-ax.ts +172 -29
  823. package/src/internal/cli-bitbucket.ts +11 -11
  824. package/src/internal/cli-convert-automation.ts +2 -2
  825. package/src/internal/cli-cursor.ts +5 -16
  826. package/src/internal/cli-deploy.ts +389 -104
  827. package/src/internal/cli-docs.ts +5 -5
  828. package/src/internal/cli-github.ts +16 -19
  829. package/src/internal/cli-gitlab.ts +11 -11
  830. package/src/internal/cli-manifest.ts +1 -1
  831. package/src/internal/cli-mcp-oauth.ts +5 -7
  832. package/src/internal/cli-mcp.ts +3 -3
  833. package/src/internal/cli-skills.ts +2 -2
  834. package/src/internal/cli-slack.ts +5 -5
  835. package/src/internal/cloud-turn-cost.ts +1 -1
  836. package/src/internal/continuation-identity.ts +14 -9
  837. package/src/internal/conversation-mirror.ts +36 -3
  838. package/src/internal/convert-automation/convert-workflow.ts +27 -27
  839. package/src/internal/convert-automation/types.ts +9 -0
  840. package/src/internal/cursor/account-mcp.ts +48 -31
  841. package/src/internal/cursor/backend-client.ts +28 -17
  842. package/src/internal/cursor/credentials.ts +1 -1
  843. package/src/internal/cursor/hosted-store-secrets.ts +34 -0
  844. package/src/internal/cursor-account-mcp-auth.ts +9 -9
  845. package/src/internal/cursor-agent-template.ts +2 -0
  846. package/src/internal/cursor-deployment-relay.ts +10 -10
  847. package/src/internal/cursor-event-relay.ts +10 -10
  848. package/src/internal/cursor-relay-core.ts +2 -2
  849. package/src/internal/deploy-client.ts +266 -24
  850. package/src/internal/deploy-manifest.ts +46 -8
  851. package/src/internal/discovery/agent-config.ts +34 -0
  852. package/src/internal/discovery/agent.ts +14 -6
  853. package/src/internal/discovery/channels.ts +4 -4
  854. package/src/internal/discovery/connections.ts +4 -4
  855. package/src/internal/discovery/cursor-plugin.ts +12 -12
  856. package/src/internal/discovery/extension-overlay.ts +3 -3
  857. package/src/internal/discovery/extensions.ts +6 -6
  858. package/src/internal/discovery/info.ts +9 -9
  859. package/src/internal/discovery/instructions.ts +1 -1
  860. package/src/internal/discovery/project.ts +4 -4
  861. package/src/internal/discovery/services.ts +1 -1
  862. package/src/internal/discovery/tools.ts +1 -1
  863. package/src/internal/docs-site.ts +2 -2
  864. package/src/internal/env-file.ts +2 -2
  865. package/src/internal/eval-run-store.ts +7 -9
  866. package/src/internal/eval-runner.ts +20 -20
  867. package/src/internal/evals-client.ts +6 -6
  868. package/src/internal/event-log.ts +10 -10
  869. package/src/internal/event-mapper.ts +37 -2
  870. package/src/internal/filesystem/format.ts +11 -12
  871. package/src/internal/filesystem/scratch.ts +3 -3
  872. package/src/internal/filesystem/tools.ts +8 -8
  873. package/src/internal/filesystem/walk.ts +61 -16
  874. package/src/internal/framework-file-storage.ts +104 -4
  875. package/src/internal/framework-storage-selection.ts +2 -12
  876. package/src/internal/github-fanout.ts +4 -4
  877. package/src/internal/guest-network.ts +4 -4
  878. package/src/internal/host-files.ts +1 -1
  879. package/src/internal/host-kv.ts +2 -2
  880. package/src/internal/hosted-admission-adapter.ts +5 -0
  881. package/src/internal/hosted-catch-protocol.ts +3 -5
  882. package/src/internal/hosted-catch.ts +1 -1
  883. package/src/internal/hosted-delivery-protocol.ts +189 -14
  884. package/src/internal/hosted-delivery.ts +294 -81
  885. package/src/internal/hosted-execution-diag.ts +3 -3
  886. package/src/internal/hosted-execution-latency.ts +334 -0
  887. package/src/internal/hosting.ts +5 -6
  888. package/src/internal/http-channel-define.ts +27 -0
  889. package/src/internal/http-channel.ts +3 -4
  890. package/src/internal/http-control-plane-session.ts +24 -11
  891. package/src/internal/incoming-headers-to-fetch.ts +54 -0
  892. package/src/internal/init-interview.ts +7 -7
  893. package/src/internal/init-project.ts +18 -16
  894. package/src/internal/init-scaffold.ts +1 -1
  895. package/src/internal/inline-stdio-mcp.ts +2 -2
  896. package/src/internal/install-cursor-skills.ts +11 -11
  897. package/src/internal/json-schema.ts +1 -1
  898. package/src/internal/local-control-plane.ts +4 -5
  899. package/src/internal/local-env.ts +3 -3
  900. package/src/internal/log-ring.ts +1 -1
  901. package/src/internal/logs-client.ts +1 -1
  902. package/src/internal/mcp-endpoint.ts +10 -10
  903. package/src/internal/mcp-host.ts +9 -9
  904. package/src/internal/mcp-oauth-on-demand.ts +3 -3
  905. package/src/internal/mcp-oauth.ts +5 -5
  906. package/src/internal/net.ts +2 -2
  907. package/src/internal/otel/config.ts +3 -3
  908. package/src/internal/otel/runtime.ts +14 -14
  909. package/src/internal/peer-connections.ts +2 -2
  910. package/src/internal/platform-schedule-sync.ts +1 -1
  911. package/src/internal/platform-timers.ts +1 -1
  912. package/src/internal/playground/static.ts +2 -2
  913. package/src/internal/playground/toolchain.ts +2 -2
  914. package/src/internal/playground-proxy.ts +3 -3
  915. package/src/internal/process-memory-telemetry.ts +1 -1
  916. package/src/internal/reminder-runner.ts +8 -10
  917. package/src/internal/reminder-store.ts +1 -1
  918. package/src/internal/request-error-status.ts +9 -0
  919. package/src/internal/resolved-connections.ts +8 -8
  920. package/src/internal/result-output.ts +62 -5
  921. package/src/internal/router.ts +4 -4
  922. package/src/internal/run-client.ts +2 -2
  923. package/src/internal/schedule-runner.ts +6 -6
  924. package/src/internal/scm/pr-url.ts +11 -2
  925. package/src/internal/sdk-runner.ts +14 -28
  926. package/src/internal/serve-restart.ts +1 -1
  927. package/src/internal/server.ts +201 -140
  928. package/src/internal/session-cost.ts +3 -3
  929. package/src/internal/session-engine.ts +516 -244
  930. package/src/internal/session-run-log.ts +4 -6
  931. package/src/internal/session-store.ts +213 -39
  932. package/src/internal/sessions-client.ts +3 -3
  933. package/src/internal/skill-catalog.ts +69 -0
  934. package/src/internal/slack-thread-key.ts +11 -0
  935. package/src/internal/sleep.ts +1 -1
  936. package/src/internal/storage-coordinator.ts +118 -21
  937. package/src/internal/storage.ts +1 -0
  938. package/src/internal/store-mirror.ts +4 -4
  939. package/src/internal/terminal-style.ts +2 -2
  940. package/src/internal/tool-result.ts +3 -3
  941. package/src/internal/trajectory.ts +7 -7
  942. package/src/internal/turn-governor.ts +2 -2
  943. package/src/internal/turn-outbox.ts +1 -1
  944. package/src/internal/update-check.ts +2 -2
  945. package/src/internal/v2-hosting.ts +14 -0
  946. package/src/internal/workspace.ts +17 -17
  947. package/src/kv/memory-kv.ts +9 -7
  948. package/src/kv.ts +4 -7
  949. package/src/otel-public.ts +24 -0
  950. package/src/otel.ts +7 -2
  951. package/src/prompt.ts +1 -1
  952. package/src/result.ts +10 -8
  953. package/src/storage-backends/cursor-hosted-v2.ts +2 -2
  954. package/src/storage-backends/cursor-hosted.ts +6 -23
  955. package/src/storage-backends/file-kv.ts +7 -7
  956. package/src/storage.ts +22 -7
  957. package/src/types.ts +91 -17
  958. package/templates/agentic-owners/agent/channels/github.ts +3 -6
  959. package/templates/agentic-owners/agent/lib/github.ts +5 -5
  960. package/templates/agentic-owners/agent/lib/owners/decision.ts +13 -10
  961. package/templates/agentic-owners/agent/lib/owners/handles.ts +2 -2
  962. package/templates/agentic-owners/agent/lib/owners/match.ts +3 -3
  963. package/templates/agentic-owners/agent/lib/owners/matching.ts +1 -1
  964. package/templates/agentic-owners/agent/lib/owners/parse.ts +4 -9
  965. package/templates/agentic-owners/agent/lib/owners/prompt.ts +1 -1
  966. package/templates/agentic-owners/agent/lib/review.ts +37 -30
  967. package/templates/agentic-owners/evals/owners.eval.ts +2 -2
  968. package/templates/agentic-owners/package.json +1 -1
  969. package/templates/agents-md/agent/lib/collect.ts +16 -10
  970. package/templates/agents-md/agent/lib/config.ts +1 -1
  971. package/templates/agents-md/agent/tools/apply_agents.ts +10 -8
  972. package/templates/agents-md/package.json +1 -1
  973. package/templates/code-wiki/agent/channels/github.ts +4 -7
  974. package/templates/code-wiki/agent/lib/repos.ts +1 -1
  975. package/templates/code-wiki/agent/tools/apply_wiki.ts +3 -4
  976. package/templates/code-wiki/package.json +1 -1
  977. package/templates/demo/agent/lib/collect.ts +6 -2
  978. package/templates/demo/agent/lib/repos.ts +1 -1
  979. package/templates/demo/agent/tools/record_demo.ts +1 -1
  980. package/templates/demo/evals/demo.eval.ts +1 -5
  981. package/templates/demo/package.json +1 -1
  982. package/templates/grokbot-agents/package.json +1 -1
  983. package/templates/pr-autofixer/agent/channels/github.ts +16 -13
  984. package/templates/pr-autofixer/agent/lib/merge-watch.ts +2 -4
  985. package/templates/pr-autofixer/agent/lib/repos.ts +2 -2
  986. package/templates/pr-autofixer/agent/lib/webhook-routing.ts +1 -1
  987. package/templates/pr-autofixer/package.json +1 -1
  988. package/templates/security-help/agent/lib/repos.ts +1 -1
  989. package/templates/security-help/package.json +1 -1
  990. package/templates/security-reviewer/agent/lib/repos.ts +1 -1
  991. package/templates/security-reviewer/agent/tools/post_findings.ts +1 -3
  992. package/templates/security-reviewer/package.json +1 -1
  993. package/templates/thermo-quality-review/README.md +35 -0
  994. package/templates/thermo-quality-review/agent/agent.ts +8 -0
  995. package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
  996. package/templates/thermo-quality-review/agent/instructions.md +43 -0
  997. package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
  998. package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
  999. package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
  1000. package/templates/thermo-quality-review/package.json +18 -0
  1001. package/templates/thermo-quality-review/tsconfig.json +12 -0
  1002. package/templates/thermo-review/README.md +35 -0
  1003. package/templates/thermo-review/agent/agent.ts +8 -0
  1004. package/templates/thermo-review/agent/channels/github.ts +42 -0
  1005. package/templates/thermo-review/agent/instructions.md +40 -0
  1006. package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
  1007. package/templates/thermo-review/evals/evals.config.ts +5 -0
  1008. package/templates/thermo-review/evals/review.eval.ts +53 -0
  1009. package/templates/thermo-review/package.json +18 -0
  1010. package/templates/thermo-review/tsconfig.json +12 -0
  1011. package/templates/triage/agent/lib/actuate.ts +26 -41
  1012. package/templates/triage/agent/lib/parse-queue-event.ts +2 -1
  1013. package/templates/triage/agent/lib/verify-webhook.ts +10 -5
  1014. package/templates/triage/agent/tools/record_triage.ts +1 -4
  1015. package/templates/triage/package.json +1 -1
  1016. package/dist/client.d.ts +0 -14
  1017. package/dist/client.d.ts.map +0 -1
  1018. package/dist/client.js +0 -12
  1019. package/dist/docs/assets/app.Cr-wVbnB.js +0 -1
  1020. package/dist/docs/assets/building-with-agents.md.D0KbSkJn.js +0 -13
  1021. package/dist/docs/assets/building-with-agents.md.D0KbSkJn.lean.js +0 -1
  1022. package/dist/docs/assets/chunks/@localSearchIndexroot.CFVQ4S17.js +0 -1
  1023. package/dist/docs/assets/concepts.md.B4o63Gul.js +0 -1
  1024. package/dist/docs/assets/concepts.md.B4o63Gul.lean.js +0 -1
  1025. package/dist/docs/assets/deployment.md.JenwuCCB.js +0 -51
  1026. package/dist/docs/assets/deployment.md.JenwuCCB.lean.js +0 -1
  1027. package/dist/docs/assets/evals.md.C7JLjoEP.js +0 -211
  1028. package/dist/docs/assets/evals.md.C7JLjoEP.lean.js +0 -1
  1029. package/dist/docs/assets/guides_agent-to-agent.md.BDb0t1QV.js +0 -10
  1030. package/dist/docs/assets/guides_agent-to-agent.md.BDb0t1QV.lean.js +0 -1
  1031. package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.js +0 -10
  1032. package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.lean.js +0 -1
  1033. package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.js +0 -9
  1034. package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.lean.js +0 -1
  1035. package/dist/docs/assets/guides_convert-automation.md.B4sjlodG.js +0 -12
  1036. package/dist/docs/assets/guides_convert-automation.md.B4sjlodG.lean.js +0 -1
  1037. package/dist/docs/assets/guides_github.md.TZaTZlfz.js +0 -64
  1038. package/dist/docs/assets/guides_github.md.TZaTZlfz.lean.js +0 -1
  1039. package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.js +0 -14
  1040. package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.lean.js +0 -1
  1041. package/dist/docs/assets/guides_grokbot-agents.md.DyV-WArv.js +0 -9
  1042. package/dist/docs/assets/guides_grokbot-agents.md.DyV-WArv.lean.js +0 -1
  1043. package/dist/docs/assets/guides_human-in-the-loop.md.By1G2T3_.js +0 -28
  1044. package/dist/docs/assets/guides_human-in-the-loop.md.By1G2T3_.lean.js +0 -1
  1045. package/dist/docs/assets/guides_improve.md.BGVk32bK.js +0 -14
  1046. package/dist/docs/assets/guides_improve.md.BGVk32bK.lean.js +0 -1
  1047. package/dist/docs/assets/guides_mcp-oauth.md.Dp6cDP7f.js +0 -28
  1048. package/dist/docs/assets/guides_mcp-oauth.md.Dp6cDP7f.lean.js +0 -1
  1049. package/dist/docs/assets/guides_opentelemetry.md.SCRMskno.js +0 -26
  1050. package/dist/docs/assets/guides_opentelemetry.md.SCRMskno.lean.js +0 -1
  1051. package/dist/docs/assets/guides_slack.md.D4RVMM4G.js +0 -38
  1052. package/dist/docs/assets/guides_slack.md.D4RVMM4G.lean.js +0 -1
  1053. package/dist/docs/assets/guides_webhooks.md.CJK484ex.js +0 -225
  1054. package/dist/docs/assets/guides_webhooks.md.CJK484ex.lean.js +0 -1
  1055. package/dist/docs/assets/hillclimbing.md.BOiVo1tf.js +0 -4
  1056. package/dist/docs/assets/hillclimbing.md.BOiVo1tf.lean.js +0 -1
  1057. package/dist/docs/assets/index.md.DD9Q2XuJ.js +0 -5
  1058. package/dist/docs/assets/index.md.DD9Q2XuJ.lean.js +0 -1
  1059. package/dist/docs/assets/quickstart.md.DdQOF7Y8.lean.js +0 -1
  1060. package/dist/docs/assets/reference_extensions.md.ZAVUyuEX.js +0 -62
  1061. package/dist/docs/assets/reference_extensions.md.ZAVUyuEX.lean.js +0 -1
  1062. package/dist/docs/assets/reference_result.md.BK5SxDrf.js +0 -19
  1063. package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +0 -1
  1064. package/dist/docs/assets/scaffolding-agents.md.Kctn3OVb.js +0 -1
  1065. package/dist/docs/assets/scaffolding-agents.md.Kctn3OVb.lean.js +0 -1
  1066. package/dist/docs/assets/skills_create-agent.md.Q3h6Je-e.js +0 -8
  1067. package/dist/docs/assets/skills_create-agent.md.Q3h6Je-e.lean.js +0 -1
  1068. package/dist/docs/assets/skills_debug.md.CVjCXMFF.js +0 -1
  1069. package/dist/docs/assets/skills_debug.md.CVjCXMFF.lean.js +0 -1
  1070. package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.js +0 -35
  1071. package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.lean.js +0 -1
  1072. package/dist/docs/assets/skills_evals.md.DFxYPErF.js +0 -25
  1073. package/dist/docs/assets/skills_evals.md.DFxYPErF.lean.js +0 -1
  1074. package/dist/docs/assets/skills_framework-map.md.BxLSOhSY.js +0 -1
  1075. package/dist/docs/assets/skills_framework-map.md.BxLSOhSY.lean.js +0 -1
  1076. package/dist/docs/assets/skills_github.md.hgFX_oKY.js +0 -16
  1077. package/dist/docs/assets/skills_github.md.hgFX_oKY.lean.js +0 -1
  1078. package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.js +0 -7
  1079. package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.lean.js +0 -1
  1080. package/dist/docs/assets/skills_index.md.DL7EHaQ-.js +0 -1
  1081. package/dist/docs/assets/skills_index.md.DL7EHaQ-.lean.js +0 -1
  1082. package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.js +0 -18
  1083. package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.lean.js +0 -1
  1084. package/dist/docs/assets/skills_otel.md.B5Ddv1xH.js +0 -8
  1085. package/dist/docs/assets/skills_otel.md.B5Ddv1xH.lean.js +0 -1
  1086. package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.js +0 -20
  1087. package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.lean.js +0 -1
  1088. package/dist/docs/assets/storage.md.BUrhJ-Zz.js +0 -30
  1089. package/dist/docs/assets/storage.md.BUrhJ-Zz.lean.js +0 -1
  1090. package/dist/docs/assets/templates_agents-md.md.CXSMZljE.js +0 -2
  1091. package/dist/docs/assets/templates_agents-md.md.CXSMZljE.lean.js +0 -1
  1092. package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.js +0 -2
  1093. package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.lean.js +0 -1
  1094. package/dist/docs/assets/templates_demo.md.BeQX9V3H.js +0 -4
  1095. package/dist/docs/assets/templates_demo.md.BeQX9V3H.lean.js +0 -1
  1096. package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.js +0 -3
  1097. package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.lean.js +0 -1
  1098. package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.js +0 -4
  1099. package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.lean.js +0 -1
  1100. package/dist/docs/assets/troubleshooting.md.CYEAO9bM.js +0 -1
  1101. package/dist/docs/assets/troubleshooting.md.CYEAO9bM.lean.js +0 -1
  1102. package/dist/docs/concepts.html +0 -27
  1103. package/dist/docs/concepts.md +0 -166
  1104. package/dist/docs/design/filesystem.md +0 -376
  1105. package/dist/docs/design/runtime-abstraction.md +0 -1756
  1106. package/dist/docs/guides/human-in-the-loop.html +0 -54
  1107. package/dist/docs/guides/human-in-the-loop.md +0 -126
  1108. package/dist/docs/reference/result.html +0 -45
  1109. package/dist/docs/reference/result.md +0 -89
  1110. package/dist/docs/scaffolding-agents.html +0 -27
  1111. package/dist/docs/scaffolding-agents.md +0 -130
  1112. package/dist/docs/skills/create-agent.html +0 -34
  1113. package/dist/docs/skills/create-agent.md +0 -160
  1114. package/dist/docs/skills/debug.html +0 -27
  1115. package/dist/docs/skills/debug.md +0 -36
  1116. package/dist/docs/skills/deploy.html +0 -61
  1117. package/dist/docs/skills/deploy.md +0 -161
  1118. package/dist/docs/skills/evals.html +0 -51
  1119. package/dist/docs/skills/evals.md +0 -137
  1120. package/dist/docs/skills/framework-map.html +0 -27
  1121. package/dist/docs/skills/framework-map.md +0 -99
  1122. package/dist/docs/skills/github.html +0 -42
  1123. package/dist/docs/skills/github.md +0 -93
  1124. package/dist/docs/skills/hillclimb.html +0 -33
  1125. package/dist/docs/skills/hillclimb.md +0 -55
  1126. package/dist/docs/skills/index.html +0 -27
  1127. package/dist/docs/skills/index.md +0 -21
  1128. package/dist/docs/skills/mcp-auth.html +0 -44
  1129. package/dist/docs/skills/mcp-auth.md +0 -76
  1130. package/dist/docs/skills/otel.html +0 -34
  1131. package/dist/docs/skills/otel.md +0 -53
  1132. package/dist/docs/skills/setup-slack.html +0 -46
  1133. package/dist/docs/skills/setup-slack.md +0 -141
  1134. package/dist/docs/storage.html +0 -56
  1135. package/dist/docs/storage.md +0 -167
  1136. package/dist/docs/templates/agents-md.html +0 -28
  1137. package/dist/docs/templates/agents-md.md +0 -105
  1138. package/dist/docs/templates/code-wiki.html +0 -28
  1139. package/dist/docs/templates/code-wiki.md +0 -91
  1140. package/dist/docs/templates/demo.html +0 -30
  1141. package/dist/docs/templates/demo.md +0 -80
  1142. package/dist/docs/templates/grokbot-agents.html +0 -29
  1143. package/dist/docs/templates/grokbot-agents.md +0 -48
  1144. package/dist/docs/templates/security-help.html +0 -30
  1145. package/dist/docs/templates/security-help.md +0 -65
  1146. package/dist/internal/tenant-slack/relay.d.ts +0 -75
  1147. package/dist/internal/tenant-slack/relay.d.ts.map +0 -1
  1148. package/dist/internal/tenant-slack/relay.js +0 -148
  1149. package/dist/playground/assets/index-Bhxzrcf6.css +0 -1
  1150. package/dist/playground/assets/index-CqLX5uF3.js +0 -67
  1151. package/docs/concepts.md +0 -171
  1152. package/docs/design/filesystem.md +0 -376
  1153. package/docs/design/runtime-abstraction.md +0 -1756
  1154. package/docs/guides/human-in-the-loop.md +0 -131
  1155. package/docs/reference/result.md +0 -94
  1156. package/docs/scaffolding-agents.md +0 -135
  1157. package/docs/skills/index.md +0 -26
  1158. package/docs/storage.md +0 -172
  1159. package/docs/templates/agents-md.md +0 -110
  1160. package/docs/templates/code-wiki.md +0 -96
  1161. package/docs/templates/demo.md +0 -85
  1162. package/docs/templates/grokbot-agents.md +0 -53
  1163. package/docs/templates/security-help.md +0 -70
  1164. package/src/client.ts +0 -23
  1165. package/src/internal/tenant-slack/relay.ts +0 -203
  1166. package/templates/pr-autofixer/agent/storage.ts +0 -7
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import { AsyncLocalStorage } from "node:async_hooks";
11
- import { mkdir, rm, writeFile } from "node:fs/promises";
11
+ import { access, mkdir, rm, writeFile } from "node:fs/promises";
12
12
  import { dirname, join } from "node:path";
13
13
  import type { SDKCustomTool, SDKCustomToolResult } from "@cursor/sdk";
14
14
  import type { Meter } from "@opentelemetry/api";
@@ -176,7 +176,12 @@ import {
176
176
  SCHEDULE_CHANNEL_PREFIX,
177
177
  } from "./prompt-context.js";
178
178
  import { assertCloudCanHonorAccountServersFilters } from "./resolved-connections.js";
179
- import { applyAuthoredResult } from "./result-output.js";
179
+ import {
180
+ addTurnUsage,
181
+ applyAuthoredResult,
182
+ RESULT_REPAIR_BUDGET,
183
+ resultRepairPrompt,
184
+ } from "./result-output.js";
180
185
  import type { AgentRunner, SteerAckOutcome } from "./sdk-runner.js";
181
186
  import { sessionExternalLinks } from "./session-links.js";
182
187
  import { SessionStore } from "./session-store.js";
@@ -243,6 +248,21 @@ export class SessionBusyError extends Error {
243
248
  }
244
249
  }
245
250
 
251
+ /**
252
+ * Hosted enqueue-only admission could not coalesce into an active turn.
253
+ * Distinct from {@link SessionBusyError}: the caller asked not to start work.
254
+ */
255
+ export class HostedEnqueueNotActiveError extends Error {
256
+ constructor(sessionId?: string) {
257
+ super(
258
+ sessionId === undefined
259
+ ? "Hosted enqueue requires an active accepting session"
260
+ : `Hosted enqueue requires an active turn on session ${sessionId}`
261
+ );
262
+ this.name = "HostedEnqueueNotActiveError";
263
+ }
264
+ }
265
+
246
266
  // Defined in auth.js (HTTP/session-store callers import it without this
247
267
  // module); re-exported here because this is its historical public home.
248
268
  export { SessionAuthError } from "./auth.js";
@@ -414,6 +434,12 @@ export interface EngineSendOptions extends SendMessageOptions {
414
434
  * authors cannot choose a session id through the public SendMessageOptions.
415
435
  */
416
436
  hostedSessionId?: string;
437
+ /**
438
+ * Hosted active-guest enqueue: admit only by coalescing into an already
439
+ * running turn. Never creates a session or starts a turn. Private host
440
+ * plumbing — not part of public SendMessageOptions.
441
+ */
442
+ hostedEnqueueOnly?: boolean;
417
443
  }
418
444
 
419
445
  interface CoalescedQueuedTurn {
@@ -429,6 +455,39 @@ interface AdmitTurnOptions {
429
455
  * coalesce drain so asks that arrived during drain are not wiped.
430
456
  */
431
457
  retainCoalesced?: boolean;
458
+ /** See {@link EngineSendOptions.hostedEnqueueOnly}. */
459
+ hostedEnqueueOnly?: boolean;
460
+ }
461
+
462
+ /** Marker that we `git init`'d this shared harness so scaffold is ours to write. */
463
+ const OWNED_HARNESS = join(".agent-serve", "owned-harness");
464
+
465
+ function pathExists(path: string): Promise<boolean> {
466
+ return access(path).then(
467
+ () => true,
468
+ () => false
469
+ );
470
+ }
471
+
472
+ /**
473
+ * Nested dirs get their own git root so the harness does not ripwalk the
474
+ * enclosing checkout. A real `workspaceDir` checkout (already a git root)
475
+ * is left alone.
476
+ */
477
+ async function ownSharedHarness(dir: string): Promise<boolean> {
478
+ if (await pathExists(join(dir, OWNED_HARNESS))) {
479
+ return true;
480
+ }
481
+ if (!(await isNestedInGitRepo(dir))) {
482
+ return false;
483
+ }
484
+ await ensureOwnGitRoot(dir);
485
+ if (await isNestedInGitRepo(dir)) {
486
+ return false;
487
+ }
488
+ await mkdir(join(dir, ".agent-serve"), { recursive: true });
489
+ await writeFile(join(dir, OWNED_HARNESS), "");
490
+ return true;
432
491
  }
433
492
 
434
493
  export class SessionEngine {
@@ -493,6 +552,8 @@ export class SessionEngine {
493
552
  private readonly turnAborts = new Map<string, AbortController>();
494
553
  /** Serializes turn admission per session (latest follow-up wins). */
495
554
  private readonly admissionChains = new Map<string, Promise<unknown>>();
555
+ /** Live turn snapshot so a coalesced Slack wake can repaint on this process. */
556
+ private readonly liveTurns = new Map<string, EventDispatchContext>();
496
557
  /** FIFO turn slots under `concurrency.maxRunningTurns` (unlimited when unset). */
497
558
  private readonly turnGovernor: TurnGovernor;
498
559
  /**
@@ -547,6 +608,8 @@ export class SessionEngine {
547
608
  string,
548
609
  { root: FileSystem; cwd: string }
549
610
  >();
611
+ /** In-flight `prewarmSharedWorkspace`; first turn waits so it lands hot. */
612
+ private sharedWarm: Promise<void> | undefined;
550
613
 
551
614
  constructor(options: SessionEngineOptions) {
552
615
  this.project = options.project;
@@ -575,7 +638,7 @@ export class SessionEngine {
575
638
  );
576
639
  this.outbox = new TurnOutbox(join(options.stateRoot, "outbox"));
577
640
  this.logs = new EventLogStore(
578
- (sessionId) => this.sessions.eventFilePath(sessionId),
641
+ sessionId => this.sessions.eventFilePath(sessionId),
579
642
  (sessionId, error) =>
580
643
  this.logger(
581
644
  `[agent-sdk] failed to persist events for ${sessionId}: ${describeError(error)}`
@@ -635,7 +698,7 @@ export class SessionEngine {
635
698
  ...options.project.agent.connections,
636
699
  ...(options.project.agent.hostConnections ?? []),
637
700
  ].filter(
638
- (connection) => !isSymbolicConnectionTransport(connection.transport)
701
+ connection => !isSymbolicConnectionTransport(connection.transport)
639
702
  )
640
703
  );
641
704
  const basePlatforms = options.platforms ?? createHostPlatforms();
@@ -688,8 +751,8 @@ export class SessionEngine {
688
751
 
689
752
  private authoredConnection(name: string): DiscoveredConnection | undefined {
690
753
  return (
691
- this.project.agent.connections.find((item) => item.name === name) ??
692
- this.project.agent.hostConnections?.find((item) => item.name === name)
754
+ this.project.agent.connections.find(item => item.name === name) ??
755
+ this.project.agent.hostConnections?.find(item => item.name === name)
693
756
  );
694
757
  }
695
758
 
@@ -758,7 +821,7 @@ export class SessionEngine {
758
821
  */
759
822
  artifactsApi(binding?: { sessionId: string; turnId?: string }): ArtifactsApi {
760
823
  return {
761
- tag: async (input) => {
824
+ tag: async input => {
762
825
  if (binding === undefined) {
763
826
  return this.tagArtifact(input);
764
827
  }
@@ -776,7 +839,7 @@ export class SessionEngine {
776
839
  turnId: input.turnId ?? binding.turnId,
777
840
  });
778
841
  },
779
- list: (filter) => this.artifactsStore.list(filter),
842
+ list: filter => this.artifactsStore.list(filter),
780
843
  };
781
844
  }
782
845
 
@@ -925,11 +988,11 @@ export class SessionEngine {
925
988
 
926
989
  private slackNudgeHostApi(): SlackNudgeHostApi {
927
990
  return {
928
- append: (input) => this.nudgeStore.append(input),
929
- drainFormatted: (continuationKey) =>
991
+ append: input => this.nudgeStore.append(input),
992
+ drainFormatted: continuationKey =>
930
993
  this.nudgeStore.drainFormatted(continuationKey),
931
- clear: (continuationKey) => this.nudgeStore.clear(continuationKey),
932
- hasUndelivered: (continuationKey) =>
994
+ clear: continuationKey => this.nudgeStore.clear(continuationKey),
995
+ hasUndelivered: continuationKey =>
933
996
  this.nudgeStore.hasUndelivered(continuationKey),
934
997
  isDelivered: (continuationKey, sourceTs) =>
935
998
  this.nudgeStore.isDelivered(continuationKey, sourceTs),
@@ -974,6 +1037,11 @@ export class SessionEngine {
974
1037
  // on a sessionless pod.
975
1038
  throw new HostedAdmissionLocalSendError();
976
1039
  }
1040
+ if (options.clearCloudOverride === true && options.cloud !== undefined) {
1041
+ throw new Error(
1042
+ "send options cloud and clearCloudOverride cannot be combined"
1043
+ );
1044
+ }
977
1045
  const identity =
978
1046
  channelId === HTTP_CHANNEL_ID
979
1047
  ? httpContinuationIdentity(this.project.httpChannel)
@@ -1039,61 +1107,83 @@ export class SessionEngine {
1039
1107
  // Refresh harness cwd when the caller supplies a newer worktree (e.g. PR
1040
1108
  // synchronize). Leave the durable continuation key unchanged.
1041
1109
  let record = existing;
1042
- const refreshWorkspace =
1043
- sendOptions.workspaceDir !== undefined &&
1044
- sendOptions.workspaceDir !== existing.workspaceOverride;
1045
- if (
1046
- refreshWorkspace ||
1047
- sendOptions.workspaceFiles !== undefined ||
1048
- sendOptions.images !== undefined
1049
- ) {
1050
- record = await this.updateRecord(existing.sessionId, (current) => ({
1051
- ...current,
1052
- workspaceOverride: refreshWorkspace
1053
- ? sendOptions.workspaceDir
1054
- : current.workspaceOverride,
1055
- pendingWorkspaceFiles: mergePendingWorkspaceFiles(
1056
- current.pendingWorkspaceFiles,
1057
- sendOptions.workspaceFiles
1058
- ),
1059
- pendingImages: mergePendingImages(
1060
- current.pendingImages,
1061
- sendOptions.images
1062
- ),
1063
- }));
1064
- }
1065
- // Refresh the cloud attach the same way: a follow-up send carries the
1066
- // caller's CURRENT cloud options (e.g. a PR attach re-derived per wake),
1067
- // and the first send's snapshot must not pin this session's turns to a
1068
- // stale repo/prUrl for the session's lifetime.
1069
- if (
1070
- sendOptions.cloud !== undefined &&
1071
- JSON.stringify(sendOptions.cloud) !==
1072
- JSON.stringify(record.cloudOverride)
1073
- ) {
1074
- record = await this.updateRecord(record.sessionId, (current) => ({
1075
- ...current,
1076
- cloudOverride: sendOptions.cloud,
1077
- }));
1078
- }
1079
- // Refresh wake-derived channel state (GitHub headSha / refs) without
1080
- // wiping sticky fields. Null patch values are skipped.
1081
- if (sendOptions.refreshState !== undefined) {
1082
- record = await this.updateRecord(record.sessionId, (current) => ({
1083
- ...current,
1084
- channelState: mergeChannelStateSkipNull(
1085
- current.channelState,
1086
- sendOptions.refreshState
1087
- ),
1088
- }));
1110
+ const enqueueOnly = sendOptions.hostedEnqueueOnly === true;
1111
+ if (!enqueueOnly) {
1112
+ const refreshWorkspace =
1113
+ sendOptions.workspaceDir !== undefined &&
1114
+ sendOptions.workspaceDir !== existing.workspaceOverride;
1115
+ if (
1116
+ refreshWorkspace ||
1117
+ sendOptions.workspaceFiles !== undefined ||
1118
+ sendOptions.images !== undefined
1119
+ ) {
1120
+ record = await this.updateRecord(existing.sessionId, current => ({
1121
+ ...current,
1122
+ workspaceOverride: refreshWorkspace
1123
+ ? sendOptions.workspaceDir
1124
+ : current.workspaceOverride,
1125
+ pendingWorkspaceFiles: mergePendingWorkspaceFiles(
1126
+ current.pendingWorkspaceFiles,
1127
+ sendOptions.workspaceFiles
1128
+ ),
1129
+ pendingImages: mergePendingImages(
1130
+ current.pendingImages,
1131
+ sendOptions.images
1132
+ ),
1133
+ }));
1134
+ }
1135
+ // A caller can explicitly return a continuation to the agent's
1136
+ // configured runtime. Omission remains sticky for compatibility:
1137
+ // follow-ups that do not know the original attach keep it.
1138
+ if (
1139
+ sendOptions.clearCloudOverride === true &&
1140
+ record.cloudOverride !== undefined
1141
+ ) {
1142
+ record = await this.updateRecord(record.sessionId, current => ({
1143
+ ...current,
1144
+ cloudOverride: undefined,
1145
+ }));
1146
+ } else if (
1147
+ sendOptions.cloud !== undefined &&
1148
+ JSON.stringify(sendOptions.cloud) !==
1149
+ JSON.stringify(record.cloudOverride)
1150
+ ) {
1151
+ record = await this.updateRecord(record.sessionId, current => ({
1152
+ ...current,
1153
+ cloudOverride: sendOptions.cloud,
1154
+ }));
1155
+ }
1156
+ // Refresh wake-derived channel state (GitHub headSha / refs) without
1157
+ // wiping sticky fields. Null patch values are skipped.
1158
+ if (sendOptions.refreshState !== undefined) {
1159
+ record = await this.updateRecord(record.sessionId, current => ({
1160
+ ...current,
1161
+ channelState: mergeChannelStateSkipNull(
1162
+ current.channelState,
1163
+ sendOptions.refreshState
1164
+ ),
1165
+ }));
1166
+ }
1089
1167
  }
1090
1168
  const since = (await this.logs.get(record.sessionId)).count;
1091
1169
  const coalesced = await this.startTurn(record.sessionId, message, {
1092
- admission: sendOptions.admission ?? "preempt",
1170
+ admission: enqueueOnly
1171
+ ? "coalesce"
1172
+ : (sendOptions.admission ?? "preempt"),
1093
1173
  ...(sendOptions.coalesceSourceTs === undefined
1094
1174
  ? {}
1095
1175
  : { sourceTs: sendOptions.coalesceSourceTs }),
1176
+ ...(enqueueOnly ? { hostedEnqueueOnly: true } : {}),
1096
1177
  });
1178
+ if (enqueueOnly && !coalesced) {
1179
+ throw new HostedEnqueueNotActiveError(record.sessionId);
1180
+ }
1181
+ if (!enqueueOnly && coalesced && sendOptions.refreshState !== undefined) {
1182
+ await this.repaintOnCoalescedRefresh(
1183
+ record.sessionId,
1184
+ sendOptions.refreshState
1185
+ );
1186
+ }
1097
1187
  return this.channelSession(
1098
1188
  record.sessionId,
1099
1189
  record,
@@ -1103,6 +1193,10 @@ export class SessionEngine {
1103
1193
  );
1104
1194
  }
1105
1195
 
1196
+ if (sendOptions.hostedEnqueueOnly === true) {
1197
+ throw new HostedEnqueueNotActiveError(sendOptions.hostedSessionId);
1198
+ }
1199
+
1106
1200
  if (sendOptions.hostedSessionId !== undefined) {
1107
1201
  const collision = await this.getOrRestoreSession(
1108
1202
  sendOptions.hostedSessionId
@@ -1171,7 +1265,7 @@ export class SessionEngine {
1171
1265
  const stale = new Error("stale HTTP continuation");
1172
1266
  let previous: string | undefined;
1173
1267
  try {
1174
- await this.updateRecord(sessionId, (record) => {
1268
+ await this.updateRecord(sessionId, record => {
1175
1269
  const expectedChannel =
1176
1270
  record.httpContinuationKey === undefined
1177
1271
  ? record.channelId
@@ -1194,7 +1288,7 @@ export class SessionEngine {
1194
1288
  await this.startTurn(sessionId, message);
1195
1289
  return next;
1196
1290
  } catch (error) {
1197
- await this.updateRecord(sessionId, (record) =>
1291
+ await this.updateRecord(sessionId, record =>
1198
1292
  record.httpContinuationKey === next
1199
1293
  ? { ...record, httpContinuationKey: previous }
1200
1294
  : record
@@ -1285,6 +1379,53 @@ export class SessionEngine {
1285
1379
  // Turn execution
1286
1380
  // ==========================================================================
1287
1381
 
1382
+ /**
1383
+ * Repaint on the follow-up wake without retargeting the live turn.
1384
+ * Persist already took the refresh; in-flight writes stay on the carrier ts.
1385
+ */
1386
+ private async repaintOnCoalescedRefresh(
1387
+ sessionId: string,
1388
+ patch: JsonValue | undefined
1389
+ ): Promise<void> {
1390
+ const live = this.liveTurns.get(sessionId);
1391
+ if (live === undefined || patch === undefined) {
1392
+ return;
1393
+ }
1394
+ const repaintState =
1395
+ mergeChannelStateSkipNull(live.channelState, patch) ?? live.channelState;
1396
+ const record = await this.sessions.get(sessionId);
1397
+ if (record === undefined) {
1398
+ return;
1399
+ }
1400
+ const handler = this.channelEventHandlersFor(record.channelId)?.[
1401
+ "message.received"
1402
+ ];
1403
+ if (handler === undefined) {
1404
+ return;
1405
+ }
1406
+ await handler(
1407
+ {
1408
+ type: "message.received",
1409
+ data: { text: "" },
1410
+ index: 0,
1411
+ sessionId,
1412
+ at: new Date().toISOString(),
1413
+ },
1414
+ {
1415
+ channelId: record.channelId,
1416
+ state: repaintState,
1417
+ continuationToken: record.continuationKey,
1418
+ setContinuationToken: (token: string | null) =>
1419
+ this.setContinuationToken(sessionId, token),
1420
+ },
1421
+ {
1422
+ session: live.session,
1423
+ host: this.hostForSession(sessionId),
1424
+ artifacts: this.artifactsApi({ sessionId }),
1425
+ }
1426
+ );
1427
+ }
1428
+
1288
1429
  /**
1289
1430
  * Admit a turn for `sessionId`.
1290
1431
  *
@@ -1306,7 +1447,12 @@ export class SessionEngine {
1306
1447
  .catch(() => {})
1307
1448
  .then(async () => {
1308
1449
  // Another server holds the turn: hand the message to it and coalesce.
1450
+ // Enqueue-only must not report coalesced success without a local
1451
+ // enqueue — the outbox drain may never run on this process.
1309
1452
  if (await this.turnLeases.runningElsewhere(sessionId)) {
1453
+ if (options.hostedEnqueueOnly === true) {
1454
+ throw new HostedEnqueueNotActiveError(sessionId);
1455
+ }
1310
1456
  await this.outbox.post(sessionId, { message, options });
1311
1457
  return true;
1312
1458
  }
@@ -1323,7 +1469,7 @@ export class SessionEngine {
1323
1469
  private drainOutbox(sessionId: string): void {
1324
1470
  void this.outbox
1325
1471
  .takeAll(sessionId)
1326
- .then((items) => {
1472
+ .then(items => {
1327
1473
  for (const item of items) {
1328
1474
  void this.startTurn(sessionId, item.message, item.options).catch(
1329
1475
  () => {}
@@ -1337,7 +1483,7 @@ export class SessionEngine {
1337
1483
  const queue = this.coalesceQueues.get(sessionId) ?? [];
1338
1484
  if (
1339
1485
  item.sourceTs !== undefined &&
1340
- queue.some((entry) => entry.sourceTs === item.sourceTs)
1486
+ queue.some(entry => entry.sourceTs === item.sourceTs)
1341
1487
  ) {
1342
1488
  return;
1343
1489
  }
@@ -1418,7 +1564,7 @@ export class SessionEngine {
1418
1564
  }
1419
1565
  const parts = [
1420
1566
  "<slack_followups>",
1421
- `ANSWER-EACH: ${items.length} asks arrived while you were busy. Address each in order; keep replies compact.`,
1567
+ `${items.length} asks arrived while you were busy.`,
1422
1568
  "",
1423
1569
  ];
1424
1570
  for (let i = 0; i < items.length; i++) {
@@ -1512,11 +1658,21 @@ export class SessionEngine {
1512
1658
  // enqueue: `drainCoalescedFollowups` reads only this process's queue, so
1513
1659
  // the shared nudge store is the carrier. Not redundant with `acquire`
1514
1660
  // below — this returns before preempt's `clearCoalesced` drops the queue.
1661
+ // Enqueue-only cannot claim coalesced here: nothing joined a local turn.
1515
1662
  if (await this.turnLeases.runningElsewhere(sessionId)) {
1663
+ if (options.hostedEnqueueOnly === true) {
1664
+ throw new HostedEnqueueNotActiveError(sessionId);
1665
+ }
1516
1666
  this.logger(`[session] coalesce; another server owns ${sessionId}`);
1517
1667
  return true;
1518
1668
  }
1519
1669
 
1670
+ // Enqueue-only must never start a turn (or preempt/interrupt). Steer and
1671
+ // coalesce above already returned true when they absorbed the message.
1672
+ if (options.hostedEnqueueOnly === true) {
1673
+ throw new HostedEnqueueNotActiveError(sessionId);
1674
+ }
1675
+
1520
1676
  // Interrupt any turn in flight and wait for it to settle so the SDK run is
1521
1677
  // terminal before this turn's send (the follow-up also force-expires as a
1522
1678
  // belt-and-suspenders — see buildTurnRequest). Drain-resume skips interrupt:
@@ -1545,7 +1701,7 @@ export class SessionEngine {
1545
1701
 
1546
1702
  let lifecycleInstalled = false;
1547
1703
  try {
1548
- const record = await this.updateRecord(sessionId, (current) => ({
1704
+ const record = await this.updateRecord(sessionId, current => ({
1549
1705
  ...current,
1550
1706
  turnCount: current.turnCount + 1,
1551
1707
  }));
@@ -1591,6 +1747,7 @@ export class SessionEngine {
1591
1747
  };
1592
1748
  } finally {
1593
1749
  clearInterval(poll);
1750
+ this.liveTurns.delete(sessionId);
1594
1751
  }
1595
1752
  this.lastOutcomes.set(sessionId, outcome);
1596
1753
  const wasCurrent = this.activeTurns.get(sessionId) === lifecycle;
@@ -1600,14 +1757,19 @@ export class SessionEngine {
1600
1757
  if (this.turnAborts.get(sessionId) === abort) {
1601
1758
  this.turnAborts.delete(sessionId);
1602
1759
  }
1603
- if (wasCurrent && !abort.signal.aborted) {
1604
- const drain = this.drainCoalescedFollowups(sessionId).catch(
1605
- (error) => {
1606
- this.logger(
1607
- `[session] coalesce drain failed for ${sessionId}: ${describeError(error)}`
1608
- );
1609
- }
1610
- );
1760
+ // Failed/cancelled owners must not start a coalesced successor.
1761
+ // Hosted execute would then 503 and Temporal/FIFO would re-run the
1762
+ // same follow-ups as full deliveries.
1763
+ if (
1764
+ wasCurrent &&
1765
+ !abort.signal.aborted &&
1766
+ outcome.status === "finished"
1767
+ ) {
1768
+ const drain = this.drainCoalescedFollowups(sessionId).catch(error => {
1769
+ this.logger(
1770
+ `[session] coalesce drain failed for ${sessionId}: ${describeError(error)}`
1771
+ );
1772
+ });
1611
1773
  this.coalesceDrains.set(sessionId, drain);
1612
1774
  try {
1613
1775
  await drain;
@@ -1867,7 +2029,7 @@ export class SessionEngine {
1867
2029
  if (turn === undefined) {
1868
2030
  return tools;
1869
2031
  }
1870
- return tools.map((tool) => {
2032
+ return tools.map(tool => {
1871
2033
  const execute = tool.definition.execute;
1872
2034
  if (typeof execute !== "function") {
1873
2035
  return tool;
@@ -2044,6 +2206,13 @@ export class SessionEngine {
2044
2206
  * Best effort — warming is an optimization, and a turn rebuilds on its own.
2045
2207
  */
2046
2208
  async prewarmSharedWorkspace(): Promise<void> {
2209
+ if (this.sharedWarm === undefined) {
2210
+ this.sharedWarm = this.warmSharedWorkspace();
2211
+ }
2212
+ await this.sharedWarm;
2213
+ }
2214
+
2215
+ private async warmSharedWorkspace(): Promise<void> {
2047
2216
  const agent = this.project.agent;
2048
2217
  const workspaceDir = agent.local?.workspaceDir;
2049
2218
  if (
@@ -2056,6 +2225,15 @@ export class SessionEngine {
2056
2225
  }
2057
2226
  const startedAt = Date.now();
2058
2227
  try {
2228
+ await mkdir(workspaceDir, { recursive: true });
2229
+ if (await ownSharedHarness(workspaceDir)) {
2230
+ await materializeWorkspace({
2231
+ agent,
2232
+ workspaceDir,
2233
+ seed: true,
2234
+ stateRoot: this.stateRoot,
2235
+ });
2236
+ }
2059
2237
  const harness = resolveHostHarnessToolOptions(agent.allowedTools);
2060
2238
  const outcome = await this.runner.prewarm({
2061
2239
  workspaceDir,
@@ -2069,7 +2247,10 @@ export class SessionEngine {
2069
2247
  // warmed without an identity; the per-send flag still has to match
2070
2248
  // the turns' requests or the warmed executor is one no turn asks for.
2071
2249
  mcpServers: this.buildMcpServers("local"),
2072
- ...(this.hasAttachedAuthedConnections()
2250
+ ...(this.hasAttachedAuthedConnections() ||
2251
+ this.project.agent.connections.some(connection =>
2252
+ isCursorAccountTransport(connection.transport)
2253
+ )
2073
2254
  ? { perSendMcpServers: true }
2074
2255
  : {}),
2075
2256
  subagents: buildRunnerSubagents(agent),
@@ -2113,6 +2294,7 @@ export class SessionEngine {
2113
2294
  channelState: structuredClone(turnChannelState),
2114
2295
  session: this.sessionInfo(record),
2115
2296
  };
2297
+ this.liveTurns.set(sessionId, eventContext);
2116
2298
  // Hold the open log so tool events append synchronously. Fire-and-forget
2117
2299
  // `appendEvent` races parallel tool completions and delays the live stream
2118
2300
  // until the next await tick — often after *all* parallel tools finish.
@@ -2130,7 +2312,7 @@ export class SessionEngine {
2130
2312
  // Read by closure, so the mapper still sees it while draining after the
2131
2313
  // registry entry below is gone.
2132
2314
  const stubbed = new Set<string>();
2133
- const mapper = new TurnEventMapper(emit, (callId) => stubbed.has(callId));
2315
+ const mapper = new TurnEventMapper(emit, callId => stubbed.has(callId));
2134
2316
 
2135
2317
  // Take a turn slot before any work happens. When every slot is busy the
2136
2318
  // turn waits FIFO — durable `turn.queued` marks the wait — and a
@@ -2139,7 +2321,7 @@ export class SessionEngine {
2139
2321
  const permit = await this.turnGovernor.acquire({
2140
2322
  sessionId,
2141
2323
  signal,
2142
- onQueued: (position) => {
2324
+ onQueued: position => {
2143
2325
  const maxRunningTurns = this.turnGovernor.maxRunningTurns ?? 0;
2144
2326
  emit({ type: "turn.queued", data: { position, maxRunningTurns } });
2145
2327
  this.logger(
@@ -2155,6 +2337,12 @@ export class SessionEngine {
2155
2337
  } else {
2156
2338
  emit({ type: "turn.started", data: {} });
2157
2339
  try {
2340
+ if (
2341
+ record.workspaceOverride === undefined &&
2342
+ this.project.agent.local?.workspaceDir !== undefined
2343
+ ) {
2344
+ await this.prewarmSharedWorkspace();
2345
+ }
2158
2346
  // Scaffold agent files into the session workspace even when the harness
2159
2347
  // cwd is overridden (e.g. a PR worktree).
2160
2348
  if (!this.hasRootOverride()) {
@@ -2199,7 +2387,7 @@ export class SessionEngine {
2199
2387
  (hasPendingFiles && runtime !== "cloud") ||
2200
2388
  (pendingImages !== undefined && pendingImages.length > 0)
2201
2389
  ) {
2202
- await this.updateRecord(sessionId, (current) => ({
2390
+ await this.updateRecord(sessionId, current => ({
2203
2391
  ...current,
2204
2392
  pendingWorkspaceFiles:
2205
2393
  hasPendingFiles &&
@@ -2213,48 +2401,39 @@ export class SessionEngine {
2213
2401
  : current.pendingImages,
2214
2402
  }));
2215
2403
  }
2216
- // The harness only loads the scaffolded AGENTS.md when the session
2217
- // workspace is its own project root. When the harness cwd is borrowed
2218
- // (PR worktree, shared checkout) the scaffold lands elsewhere, and a
2219
- // workspace nested inside a git repo re-roots harness rules at that
2220
- // repo — in both cases deliver instructions inline on the first turn.
2221
- const instructionsInvisibleToHarness =
2222
- isFirstTurn &&
2223
- (this.hasBorrowedWorkspace(record) ||
2224
- (await isNestedInGitRepo(harnessCwd)));
2404
+ const onUpdate: RunnerTurnRequest["onUpdate"] = async update => {
2405
+ const turn = this.turnRoots.get(sessionId);
2406
+ if (turn !== undefined) {
2407
+ update = await applyWebScratchUpdate({
2408
+ cwd: turn.cwd,
2409
+ root: turn.root,
2410
+ update,
2411
+ });
2412
+ }
2413
+ mapper.handleUpdate(update);
2414
+ // Yield so the HTTP NDJSON writer can flush tool start/result
2415
+ // events while sibling parallel tools are still executing.
2416
+ if (
2417
+ update.type === "tool-call-started" ||
2418
+ update.type === "tool-call-completed" ||
2419
+ // Nested subagent progress (newer SDKs); string check keeps
2420
+ // typecheck green against older published `@cursor/sdk` pins.
2421
+ (update as { type: string }).type === "tool-call-delta"
2422
+ ) {
2423
+ // Same boundary the carrier hook runs on, so a drain is visible
2424
+ // by the time this fires.
2425
+ await this.emitDeliveredNudges(record, emit);
2426
+ await yieldEventLoop();
2427
+ }
2428
+ };
2225
2429
  const request = await this.buildTurnRequest(
2226
2430
  record,
2227
2431
  turnId,
2228
2432
  message,
2229
2433
  isFirstTurn,
2230
- instructionsInvisibleToHarness,
2231
2434
  emit,
2232
2435
  eventContext,
2233
- async (update) => {
2234
- const turn = this.turnRoots.get(sessionId);
2235
- if (turn !== undefined) {
2236
- update = await applyWebScratchUpdate({
2237
- cwd: turn.cwd,
2238
- root: turn.root,
2239
- update,
2240
- });
2241
- }
2242
- mapper.handleUpdate(update);
2243
- // Yield so the HTTP NDJSON writer can flush tool start/result
2244
- // events while sibling parallel tools are still executing.
2245
- if (
2246
- update.type === "tool-call-started" ||
2247
- update.type === "tool-call-completed" ||
2248
- // Nested subagent progress (newer SDKs); string check keeps
2249
- // typecheck green against older published `@cursor/sdk` pins.
2250
- (update as { type: string }).type === "tool-call-delta"
2251
- ) {
2252
- // Same boundary the carrier hook runs on, so a drain is visible
2253
- // by the time this fires.
2254
- await this.emitDeliveredNudges(record, emit);
2255
- await yieldEventLoop();
2256
- }
2257
- },
2436
+ onUpdate,
2258
2437
  signal,
2259
2438
  pendingImages
2260
2439
  );
@@ -2264,6 +2443,20 @@ export class SessionEngine {
2264
2443
  outcome = await this.runTurnExecute(record, turnId, () =>
2265
2444
  this.runner.runTurn(request)
2266
2445
  );
2446
+ // Commit before dropping the turn FS so `ctx.reject` can
2447
+ // re-run the model with tools still mounted.
2448
+ outcome = await this.settleAuthoredResult({
2449
+ record,
2450
+ turnId,
2451
+ emit,
2452
+ eventContext,
2453
+ turnChannelState,
2454
+ harnessCwd,
2455
+ signal,
2456
+ onUpdate,
2457
+ mapper,
2458
+ outcome,
2459
+ });
2267
2460
  } finally {
2268
2461
  this.activeToolContexts.delete(sessionId);
2269
2462
  this.stubbedCallIds.delete(sessionId);
@@ -2293,7 +2486,7 @@ export class SessionEngine {
2293
2486
 
2294
2487
  if (mapper.title !== undefined) {
2295
2488
  const title = mapper.title;
2296
- await this.updateRecord(sessionId, (current) => ({ ...current, title }));
2489
+ await this.updateRecord(sessionId, current => ({ ...current, title }));
2297
2490
  eventContext.session = { ...eventContext.session, title };
2298
2491
  }
2299
2492
 
@@ -2312,32 +2505,6 @@ export class SessionEngine {
2312
2505
  outcome = { ...outcome, cost: finalCost };
2313
2506
  }
2314
2507
 
2315
- const authored = this.project.result;
2316
- if (outcome.status === "finished" && authored !== undefined) {
2317
- const settled = await applyAuthoredResult({
2318
- definition: authored,
2319
- text: finalResult,
2320
- dryRun: record.dryRun === true,
2321
- ctx: {
2322
- session: eventContext.session,
2323
- channelState: turnChannelState,
2324
- host: this.hostForSession(sessionId),
2325
- artifacts: this.artifactsApi({ sessionId, turnId }),
2326
- stateRoot: this.stateRoot,
2327
- workspaceDir: harnessCwd,
2328
- },
2329
- });
2330
- if (!settled.ok) {
2331
- outcome = {
2332
- status: "error",
2333
- result: finalResult,
2334
- errorMessage: `turn output failed: ${settled.message}`,
2335
- usage: finalUsage,
2336
- cost: finalCost,
2337
- };
2338
- }
2339
- }
2340
-
2341
2508
  if (outcome.status === "finished") {
2342
2509
  await this.appendEvent(
2343
2510
  sessionId,
@@ -2407,6 +2574,89 @@ export class SessionEngine {
2407
2574
  };
2408
2575
  }
2409
2576
 
2577
+ /**
2578
+ * Run `defineResult` while the turn FS and tools are still up.
2579
+ * `ctx.reject` re-invokes `runTurn` on this turnId until commit
2580
+ * succeeds, throws, or the repair budget is gone.
2581
+ */
2582
+ private async settleAuthoredResult(args: {
2583
+ record: SessionRecord;
2584
+ turnId: string;
2585
+ emit: (payload: SessionEventPayload) => void;
2586
+ eventContext: EventDispatchContext;
2587
+ turnChannelState: JsonValue;
2588
+ harnessCwd: string;
2589
+ signal: AbortSignal;
2590
+ onUpdate: RunnerTurnRequest["onUpdate"];
2591
+ mapper: TurnEventMapper;
2592
+ outcome: TurnOutcome;
2593
+ }): Promise<TurnOutcome> {
2594
+ const authored = this.project.result;
2595
+ if (args.outcome.status !== "finished" || authored === undefined) {
2596
+ return args.outcome;
2597
+ }
2598
+
2599
+ let outcome = args.outcome;
2600
+ let usage = outcome.usage;
2601
+ let repairs = 0;
2602
+
2603
+ while (true) {
2604
+ const settled = await applyAuthoredResult({
2605
+ definition: authored,
2606
+ text: outcome.result ?? args.mapper.pendingText,
2607
+ dryRun: args.record.dryRun === true,
2608
+ ctx: {
2609
+ session: args.eventContext.session,
2610
+ channelState: args.turnChannelState,
2611
+ host: this.hostForSession(args.record.sessionId),
2612
+ artifacts: this.artifactsApi({
2613
+ sessionId: args.record.sessionId,
2614
+ turnId: args.turnId,
2615
+ }),
2616
+ stateRoot: this.stateRoot,
2617
+ workspaceDir: args.harnessCwd,
2618
+ },
2619
+ });
2620
+ if (settled.ok) {
2621
+ return { ...outcome, result: settled.text, usage };
2622
+ }
2623
+ if (settled.kind === "error" || repairs >= RESULT_REPAIR_BUDGET) {
2624
+ return {
2625
+ status: "error",
2626
+ result: outcome.result,
2627
+ errorMessage: `turn output failed: ${settled.message}`,
2628
+ usage,
2629
+ };
2630
+ }
2631
+ repairs += 1;
2632
+ // Close the rejected stream without posting it (empty `stop`)
2633
+ // so Slack does not append a repair onto that block, and so an
2634
+ // empty repair cannot recommit `lastAssistantText`.
2635
+ args.mapper.abandonPendingText();
2636
+ this.logger(
2637
+ `[session] ${args.record.sessionId} ${args.turnId} result rejected; repairing (${repairs}/${RESULT_REPAIR_BUDGET})`
2638
+ );
2639
+ const repairRequest = await this.buildTurnRequest(
2640
+ args.record,
2641
+ args.turnId,
2642
+ resultRepairPrompt(settled.message),
2643
+ false,
2644
+ args.emit,
2645
+ args.eventContext,
2646
+ args.onUpdate,
2647
+ args.signal
2648
+ );
2649
+ const repaired = await this.runTurnExecute(args.record, args.turnId, () =>
2650
+ this.runner.runTurn(repairRequest)
2651
+ );
2652
+ usage = addTurnUsage(usage, repaired.usage);
2653
+ if (repaired.status !== "finished") {
2654
+ return { ...repaired, usage };
2655
+ }
2656
+ outcome = { ...repaired, usage };
2657
+ }
2658
+ }
2659
+
2410
2660
  /**
2411
2661
  * Sync authored skills onto the Agent Store at `skills/<name>/…` (hosted)
2412
2662
  * or `agent-serve/<agent>/skills/<name>/…` (personal-key local+cloud)
@@ -2499,7 +2749,7 @@ export class SessionEngine {
2499
2749
  sessionId: string,
2500
2750
  pending: NonNullable<SessionRecord["pendingWorkspaceFiles"]>
2501
2751
  ): Promise<void> {
2502
- await this.updateRecord(sessionId, (current) => ({
2752
+ await this.updateRecord(sessionId, current => ({
2503
2753
  ...current,
2504
2754
  pendingWorkspaceFiles:
2505
2755
  current.pendingWorkspaceFiles === pending
@@ -2532,7 +2782,7 @@ export class SessionEngine {
2532
2782
  }
2533
2783
  let sync = run().then(
2534
2784
  () => true,
2535
- (error) => {
2785
+ error => {
2536
2786
  this.logger(
2537
2787
  `[${surface}] ${store.label} sync failed: ${error instanceof Error ? error.message : String(error)}`
2538
2788
  );
@@ -2551,11 +2801,17 @@ export class SessionEngine {
2551
2801
  /**
2552
2802
  * Hosted deployments own the deployment store. Local `serve`/`run` with
2553
2803
  * a personal API key writes into the USER store under `agent-serve/`.
2804
+ * A persistent deployment's version container has no cloud store at all:
2805
+ * its state directory is the durable copy, and its service-account key
2806
+ * must not be mistaken for a personal one.
2554
2807
  */
2555
2808
  private cloudStore(): CloudStoreTarget | undefined {
2556
2809
  const v2Hosting = resolveAgentV2Hosting({
2557
2810
  architecture: this.project.agent.architecture,
2558
2811
  });
2812
+ if (v2Hosting.kind === "cursor-managed-persistent") {
2813
+ return undefined;
2814
+ }
2559
2815
  const deployment = {
2560
2816
  mountPath: DEPLOYMENT_STORE_MOUNT_PATH,
2561
2817
  skillsPrefix: agentStoreKeys.skillsPrefix(),
@@ -2600,7 +2856,6 @@ export class SessionEngine {
2600
2856
  turnId: string,
2601
2857
  prompt: string,
2602
2858
  isFirstTurn: boolean,
2603
- instructionsInvisibleToHarness: boolean,
2604
2859
  emit: (payload: SessionEventPayload) => void,
2605
2860
  eventContext: EventDispatchContext,
2606
2861
  onUpdate: RunnerTurnRequest["onUpdate"],
@@ -2642,7 +2897,7 @@ export class SessionEngine {
2642
2897
  // agents already fail discovery; this guards hybrid agents' per-send
2643
2898
  // cloud sessions.
2644
2899
  const perSessionConnection = agent.connections.find(
2645
- (connection) =>
2900
+ connection =>
2646
2901
  connection.advertiseTools === true || connection.auth !== undefined
2647
2902
  );
2648
2903
  if (runtime !== "local" && perSessionConnection !== undefined) {
@@ -2696,7 +2951,7 @@ export class SessionEngine {
2696
2951
  : this.withTurnScratchTools(
2697
2952
  authoredRoot
2698
2953
  ? fileTools
2699
- : fileTools.filter((tool) => tool.name !== "SemanticSearch"),
2954
+ : fileTools.filter(tool => tool.name !== "SemanticSearch"),
2700
2955
  record.sessionId
2701
2956
  );
2702
2957
  let turnPrompt = prompt;
@@ -2772,6 +3027,9 @@ export class SessionEngine {
2772
3027
  }
2773
3028
  }
2774
3029
  } else if (pending !== undefined && Object.keys(pending).length > 0) {
3030
+ this.logger(
3031
+ `[workspace] no cloud store on this hosting; dropping workspaceFiles for session ${record.sessionId}: ${Object.keys(pending).join(", ")}`
3032
+ );
2775
3033
  await this.clearPendingWorkspaceFiles(record.sessionId, pending);
2776
3034
  }
2777
3035
  if (isFirstTurn && hosted) {
@@ -2779,36 +3037,26 @@ export class SessionEngine {
2779
3037
  }
2780
3038
  if (preamble !== "" || sections.length > 0) {
2781
3039
  turnPrompt = [preamble, ...sections, turnPrompt]
2782
- .filter((part) => part !== "")
3040
+ .filter(part => part !== "")
2783
3041
  .join("\n\n");
2784
3042
  }
2785
3043
  } else if (isFirstTurn && runtime === "local" && authoredRoot) {
2786
- // Virtual roots skip materialize, so AGENTS.md never lands on disk.
2787
- // Ship the same preamble the borrowed-cwd local path uses.
2788
- const preamble = buildAgentsMdContent(
2789
- { ...agent, tools: [...agent.tools, ...synthesized] },
2790
- { includeScripts: true }
2791
- );
2792
- const workspaceInfo = `<user_info>\nWorkspace Path: /\n</user_info>`;
2793
- turnPrompt =
2794
- preamble === ""
2795
- ? `${workspaceInfo}\n\n${turnPrompt}`
2796
- : `${workspaceInfo}\n\n${preamble}\n\n${turnPrompt}`;
2797
- } else if (
2798
- isFirstTurn &&
2799
- runtime === "local" &&
2800
- instructionsInvisibleToHarness
2801
- ) {
2802
- // Local workspace whose AGENTS.md the harness will not load. With a
2803
- // borrowed harness cwd, agent tool scripts live only in the durable
2804
- // scaffold dir — embed bodies like cloud. Otherwise the catalog can
2805
- // reference on-disk paths under the harness cwd. Grokbot turns are
2806
- // excluded: their instructions ride the request's `instructions`
2807
- // field into the Sand system prompt instead.
2808
- const includeScripts = this.hasBorrowedWorkspace(record);
2809
- const preamble = buildAgentsMdContent(agent, { includeScripts });
2810
- turnPrompt = `${preamble}\n\n${turnPrompt}`;
3044
+ // The harness reports no path for a root it never mounted.
3045
+ turnPrompt = `<user_info>\nWorkspace Path: /\n</user_info>\n\n${turnPrompt}`;
2811
3046
  }
3047
+ // A virtual root has no scaffold dir either, so its catalog carries the
3048
+ // synthesized file tools and embedded script bodies.
3049
+ const localInstructions =
3050
+ runtime === "local"
3051
+ ? authoredRoot
3052
+ ? buildAgentsMdContent(
3053
+ { ...agent, tools: [...agent.tools, ...synthesized] },
3054
+ { includeScripts: true }
3055
+ )
3056
+ : buildAgentsMdContent(agent, {
3057
+ includeScripts: this.hasBorrowedWorkspace(record),
3058
+ })
3059
+ : undefined;
2812
3060
  return {
2813
3061
  sessionId: record.sessionId,
2814
3062
  ...(record.sdkAgentId === undefined
@@ -2834,15 +3082,18 @@ export class SessionEngine {
2834
3082
  runtime,
2835
3083
  agentName: agent.name,
2836
3084
  ...(mergedCloud === undefined ? {} : { cloud: mergedCloud }),
2837
- // The hosted Grok Bot harness reads no workspace AGENTS.md: grokbot
2838
- // turns carry the composed instructions into the hosted session,
2839
- // which surfaces them in the Sand system prompt. The box never sees
2840
- // the local session workspace, so agent-tool script bodies are
2841
- // always embedded same rule as the cloud first-prompt preamble.
3085
+ // Local turns send the composed instructions as the harness system
3086
+ // prompt; grokbot turns carry them into the hosted session, which
3087
+ // surfaces them in the Sand system prompt. Cloud turns inline them into
3088
+ // the first prompt above instead. Script bodies are embedded whenever
3089
+ // the harness cannot reach the scaffold dir: always for grokbot (the
3090
+ // box never sees the session workspace) and for a borrowed local cwd
3091
+ // (PR worktree, shared checkout); otherwise the catalog references the
3092
+ // on-disk paths under the harness cwd.
2842
3093
  instructions:
2843
3094
  runtime === "grokbot"
2844
3095
  ? buildAgentsMdContent(agent, { includeScripts: true })
2845
- : undefined,
3096
+ : localInstructions,
2846
3097
  ...(runtime === "cloud" && !isCursorHostedFilesAvailable()
2847
3098
  ? { agentServeAgent: this.project.name }
2848
3099
  : {}),
@@ -2855,7 +3106,11 @@ export class SessionEngine {
2855
3106
  record.sessionId,
2856
3107
  await this.evaluateConnectionAuth(record)
2857
3108
  ),
2858
- ...(runtime === "local" && this.hasAttachedAuthedConnections()
3109
+ ...(runtime === "local" &&
3110
+ (this.hasAttachedAuthedConnections() ||
3111
+ this.project.agent.connections.some(connection =>
3112
+ isCursorAccountTransport(connection.transport)
3113
+ ))
2859
3114
  ? { perSendMcpServers: true }
2860
3115
  : {}),
2861
3116
  subagents: buildRunnerSubagents(agent),
@@ -2864,14 +3119,14 @@ export class SessionEngine {
2864
3119
  // Local follow-ups expire any lingering active run so a preempted turn
2865
3120
  // (or one orphaned by a crashed process) never blocks this send.
2866
3121
  forceExpireActiveRun: runtime === "local" && !isFirstTurn,
2867
- onRequestId: (requestId) => {
3122
+ onRequestId: requestId => {
2868
3123
  emit({ type: "turn.bound", data: { requestId } });
2869
3124
  },
2870
- onSdkAgentId: async (sdkAgentId) => {
3125
+ onSdkAgentId: async sdkAgentId => {
2871
3126
  if (record.sdkAgentId === sdkAgentId) {
2872
3127
  return;
2873
3128
  }
2874
- await this.updateRecord(record.sessionId, (current) => ({
3129
+ await this.updateRecord(record.sessionId, current => ({
2875
3130
  ...current,
2876
3131
  sdkAgentId,
2877
3132
  }));
@@ -2973,12 +3228,12 @@ export class SessionEngine {
2973
3228
  // attached MCP server (each tool appears exactly once).
2974
3229
  const advertisedNames = new Set(
2975
3230
  this.project.agent.connections
2976
- .filter((connection) => connection.advertiseTools === true)
2977
- .map((connection) => connection.name)
3231
+ .filter(connection => connection.advertiseTools === true)
3232
+ .map(connection => connection.name)
2978
3233
  );
2979
3234
  const hostConnectionNames = new Set(
2980
3235
  (this.project.agent.hostConnections ?? []).map(
2981
- (connection) => connection.name
3236
+ connection => connection.name
2982
3237
  )
2983
3238
  );
2984
3239
  const bridgedNames = new Set(
@@ -2992,7 +3247,7 @@ export class SessionEngine {
2992
3247
  assertCloudCanHonorAccountServersFilters({
2993
3248
  runtime,
2994
3249
  resolvedConnections: this.resolvedConnections.filter(
2995
- (resolved) =>
3250
+ resolved =>
2996
3251
  !advertisedNames.has(resolved.name) &&
2997
3252
  !hostConnectionNames.has(resolved.name)
2998
3253
  ),
@@ -3065,6 +3320,20 @@ export class SessionEngine {
3065
3320
  }
3066
3321
  continue;
3067
3322
  }
3323
+ const authored = this.authoredConnection(resolved.name);
3324
+ if (
3325
+ sessionId !== undefined &&
3326
+ authored !== undefined &&
3327
+ isCursorAccountTransport(authored.transport)
3328
+ ) {
3329
+ const bound = new URL(url);
3330
+ bound.searchParams.set("agentkitSessionId", sessionId);
3331
+ servers[resolved.name] = {
3332
+ url: bound.toString(),
3333
+ headers: resolved.headers,
3334
+ };
3335
+ continue;
3336
+ }
3068
3337
  servers[resolved.name] = {
3069
3338
  url,
3070
3339
  headers: resolved.headers,
@@ -3074,7 +3343,7 @@ export class SessionEngine {
3074
3343
  runtime === "cloud" &&
3075
3344
  sessionId !== undefined &&
3076
3345
  this.cloudServerToolsConnection !== undefined &&
3077
- this.project.agent.tools.some((tool) => tool.execution === "server")
3346
+ this.project.agent.tools.some(tool => tool.execution === "server")
3078
3347
  ) {
3079
3348
  if (servers[SERVER_TOOLS_MCP_SERVER_NAME] !== undefined) {
3080
3349
  throw new Error(
@@ -3102,7 +3371,7 @@ export class SessionEngine {
3102
3371
  */
3103
3372
  private hasAttachedAuthedConnections(): boolean {
3104
3373
  return this.project.agent.connections.some(
3105
- (connection) =>
3374
+ connection =>
3106
3375
  connection.auth !== undefined && connection.advertiseTools !== true
3107
3376
  );
3108
3377
  }
@@ -3118,7 +3387,7 @@ export class SessionEngine {
3118
3387
  record: SessionRecord
3119
3388
  ): Promise<ReadonlyMap<string, Record<string, string>> | undefined> {
3120
3389
  const authed = this.project.agent.connections.filter(
3121
- (connection) =>
3390
+ connection =>
3122
3391
  connection.auth !== undefined && connection.advertiseTools !== true
3123
3392
  );
3124
3393
  if (authed.length === 0) {
@@ -3234,7 +3503,7 @@ export class SessionEngine {
3234
3503
  );
3235
3504
  }
3236
3505
  const tool = this.project.agent.tools.find(
3237
- (candidate) =>
3506
+ candidate =>
3238
3507
  candidate.name === toolName && candidate.execution === "server"
3239
3508
  );
3240
3509
  if (tool === undefined) {
@@ -3481,11 +3750,11 @@ export class SessionEngine {
3481
3750
  args.sessionId,
3482
3751
  pendingRecord
3483
3752
  );
3484
- await this.updateRecord(args.sessionId, (current) => ({
3753
+ await this.updateRecord(args.sessionId, current => ({
3485
3754
  ...current,
3486
3755
  pendingApprovals: [
3487
3756
  ...(current.pendingApprovals ?? []).filter(
3488
- (item) => item.callId !== args.callId
3757
+ item => item.callId !== args.callId
3489
3758
  ),
3490
3759
  pendingRecord,
3491
3760
  ],
@@ -3502,10 +3771,10 @@ export class SessionEngine {
3502
3771
  `[session] tool ${args.toolName} awaiting approval (${args.callId})`
3503
3772
  );
3504
3773
  const { decision, by } = await resolutionPromise;
3505
- await this.updateRecord(args.sessionId, (current) => ({
3774
+ await this.updateRecord(args.sessionId, current => ({
3506
3775
  ...current,
3507
3776
  pendingApprovals: (current.pendingApprovals ?? []).filter(
3508
- (item) => item.callId !== args.callId
3777
+ item => item.callId !== args.callId
3509
3778
  ),
3510
3779
  }));
3511
3780
  args.emit({
@@ -3532,7 +3801,7 @@ export class SessionEngine {
3532
3801
  ) {
3533
3802
  return;
3534
3803
  }
3535
- await this.updateRecord(sessionId, (record) => ({
3804
+ await this.updateRecord(sessionId, record => ({
3536
3805
  ...record,
3537
3806
  pendingApprovals: [],
3538
3807
  }));
@@ -3575,8 +3844,8 @@ export class SessionEngine {
3575
3844
  throw new SessionAuthError(sessionId);
3576
3845
  }
3577
3846
  const pending =
3578
- (record.pendingApprovals ?? []).find((item) => item.callId === callId) ??
3579
- this.approvals.list(sessionId).find((item) => item.callId === callId);
3847
+ (record.pendingApprovals ?? []).find(item => item.callId === callId) ??
3848
+ this.approvals.list(sessionId).find(item => item.callId === callId);
3580
3849
  if (pending === undefined) {
3581
3850
  throw new ApprovalNotFoundError(sessionId, callId);
3582
3851
  }
@@ -3592,10 +3861,10 @@ export class SessionEngine {
3592
3861
  sessionId: string,
3593
3862
  callId: string
3594
3863
  ): Promise<void> {
3595
- await this.updateRecord(sessionId, (current) => ({
3864
+ await this.updateRecord(sessionId, current => ({
3596
3865
  ...current,
3597
3866
  pendingApprovals: (current.pendingApprovals ?? []).filter(
3598
- (item) => item.callId !== callId
3867
+ item => item.callId !== callId
3599
3868
  ),
3600
3869
  }));
3601
3870
  }
@@ -3603,7 +3872,7 @@ export class SessionEngine {
3603
3872
  private wrapMcp(inner: McpHost): HostMcpRegistry {
3604
3873
  return {
3605
3874
  names: () => inner.names(),
3606
- listTools: (name) => this.withMcpAuth(name, () => inner.listTools(name)),
3875
+ listTools: name => this.withMcpAuth(name, () => inner.listTools(name)),
3607
3876
  callTool: (name, tool, args) =>
3608
3877
  this.withMcpAuth(name, () => inner.callTool(name, tool, args)),
3609
3878
  };
@@ -3611,11 +3880,11 @@ export class SessionEngine {
3611
3880
 
3612
3881
  private advertiseMcp(): AdvertiseHostMcp {
3613
3882
  return {
3614
- listTools: (name) =>
3883
+ listTools: name =>
3615
3884
  this.withMcpListAuth(name, () => this.mcpHost.listTools(name)),
3616
3885
  callTool: (name, tool, args) =>
3617
3886
  this.withMcpAuth(name, () => this.mcpHost.callTool(name, tool, args)),
3618
- oneOff: (connection) => {
3887
+ oneOff: connection => {
3619
3888
  const inner = this.mcpHost.oneOff(connection);
3620
3889
  return {
3621
3890
  listTools: () =>
@@ -3768,11 +4037,11 @@ export class SessionEngine {
3768
4037
  requestedAt,
3769
4038
  };
3770
4039
  const resolutionPromise = this.auths.wait(args.sessionId, pendingRecord);
3771
- await this.updateRecord(args.sessionId, (current) => ({
4040
+ await this.updateRecord(args.sessionId, current => ({
3772
4041
  ...current,
3773
4042
  pendingAuths: [
3774
4043
  ...(current.pendingAuths ?? []).filter(
3775
- (item) => item.callId !== args.callId
4044
+ item => item.callId !== args.callId
3776
4045
  ),
3777
4046
  pendingRecord,
3778
4047
  ],
@@ -3790,10 +4059,10 @@ export class SessionEngine {
3790
4059
  `[session] tool ${args.toolName} awaiting MCP auth ${args.connection} (${args.callId})`
3791
4060
  );
3792
4061
  const { decision, by } = await resolutionPromise;
3793
- await this.updateRecord(args.sessionId, (current) => ({
4062
+ await this.updateRecord(args.sessionId, current => ({
3794
4063
  ...current,
3795
4064
  pendingAuths: (current.pendingAuths ?? []).filter(
3796
- (item) => item.callId !== args.callId
4065
+ item => item.callId !== args.callId
3797
4066
  ),
3798
4067
  }));
3799
4068
  args.emit({
@@ -3822,7 +4091,7 @@ export class SessionEngine {
3822
4091
  ) {
3823
4092
  return;
3824
4093
  }
3825
- await this.updateRecord(sessionId, (record) => ({
4094
+ await this.updateRecord(sessionId, record => ({
3826
4095
  ...record,
3827
4096
  pendingAuths: [],
3828
4097
  }));
@@ -3856,8 +4125,8 @@ export class SessionEngine {
3856
4125
  throw new SessionAuthError(sessionId);
3857
4126
  }
3858
4127
  const pending =
3859
- (record.pendingAuths ?? []).find((item) => item.callId === callId) ??
3860
- this.auths.list(sessionId).find((item) => item.callId === callId);
4128
+ (record.pendingAuths ?? []).find(item => item.callId === callId) ??
4129
+ this.auths.list(sessionId).find(item => item.callId === callId);
3861
4130
  if (pending === undefined) {
3862
4131
  throw new AuthNotFoundError(sessionId, callId);
3863
4132
  }
@@ -3876,10 +4145,10 @@ export class SessionEngine {
3876
4145
  sessionId: string,
3877
4146
  callId: string
3878
4147
  ): Promise<void> {
3879
- await this.updateRecord(sessionId, (current) => ({
4148
+ await this.updateRecord(sessionId, current => ({
3880
4149
  ...current,
3881
4150
  pendingAuths: (current.pendingAuths ?? []).filter(
3882
- (item) => item.callId !== callId
4151
+ item => item.callId !== callId
3883
4152
  ),
3884
4153
  }));
3885
4154
  }
@@ -4087,17 +4356,17 @@ export class SessionEngine {
4087
4356
  }
4088
4357
  > {
4089
4358
  const authored = this.project.agent.tools.find(
4090
- (tool) => tool.name === toolName
4359
+ tool => tool.name === toolName
4091
4360
  );
4092
4361
  if (authored !== undefined) {
4093
4362
  return { tool: authored };
4094
4363
  }
4095
4364
  const catalog = await this.listCatalogTools(options);
4096
- const tool = catalog.tools.find((entry) => entry.name === toolName);
4365
+ const tool = catalog.tools.find(entry => entry.name === toolName);
4097
4366
  if (tool === undefined) {
4098
4367
  return {
4099
4368
  tool: undefined,
4100
- availableTools: catalog.tools.map((entry) => entry.name),
4369
+ availableTools: catalog.tools.map(entry => entry.name),
4101
4370
  connectionErrors: catalog.connectionErrors,
4102
4371
  };
4103
4372
  }
@@ -4139,10 +4408,10 @@ export class SessionEngine {
4139
4408
  if (native !== undefined) {
4140
4409
  return native;
4141
4410
  }
4142
- let tool = this.project.agent.tools.find((t) => t.name === toolName);
4411
+ let tool = this.project.agent.tools.find(t => t.name === toolName);
4143
4412
  if (
4144
4413
  tool === undefined &&
4145
- this.project.agent.connections.some((c) => c.advertiseTools === true)
4414
+ this.project.agent.connections.some(c => c.advertiseTools === true)
4146
4415
  ) {
4147
4416
  // Advertised passthroughs are ordinary server tools in the session's
4148
4417
  // namespace; resolve the live listing so direct calls address them by
@@ -4153,14 +4422,14 @@ export class SessionEngine {
4153
4422
  session,
4154
4423
  hostMcp: this.advertiseMcp(),
4155
4424
  });
4156
- tool = advertised.find((t) => t.name === toolName);
4425
+ tool = advertised.find(t => t.name === toolName);
4157
4426
  }
4158
4427
  if (tool === undefined) {
4159
4428
  throw new UnknownToolError(
4160
4429
  toolName,
4161
4430
  this.project.agent.tools
4162
- .filter((t) => t.execution === "server")
4163
- .map((t) => t.name)
4431
+ .filter(t => t.execution === "server")
4432
+ .map(t => t.name)
4164
4433
  );
4165
4434
  }
4166
4435
  const execute = tool.definition.execute;
@@ -4531,7 +4800,7 @@ export class SessionEngine {
4531
4800
  ): Promise<HostMcpToolInfo | undefined> {
4532
4801
  try {
4533
4802
  const listed = await this.host.mcp.listTools(connectionName);
4534
- return listed.find((tool) => tool.name === toolName);
4803
+ return listed.find(tool => tool.name === toolName);
4535
4804
  } catch {
4536
4805
  return undefined;
4537
4806
  }
@@ -4563,7 +4832,7 @@ export class SessionEngine {
4563
4832
  const chain = this.dispatchChains.get(sessionId) ?? Promise.resolve();
4564
4833
  const next = chain
4565
4834
  .then(() => this.dispatchEvent(sessionId, event, context))
4566
- .catch((error) => {
4835
+ .catch(error => {
4567
4836
  this.logger(
4568
4837
  `[agent-sdk] event dispatch failed for ${sessionId}: ${describeError(error)}`
4569
4838
  );
@@ -4630,11 +4899,11 @@ export class SessionEngine {
4630
4899
  }
4631
4900
  if (context === undefined || channelStateBefore === undefined) {
4632
4901
  // Handlers mutate live channel state in place; save the current record.
4633
- await this.updateRecord(sessionId, (current) => ({ ...current }));
4902
+ await this.updateRecord(sessionId, current => ({ ...current }));
4634
4903
  } else {
4635
4904
  const updatedState = channelCtx.state as JsonValue;
4636
4905
  context.channelState = updatedState;
4637
- await this.updateRecord(sessionId, (current) => ({
4906
+ await this.updateRecord(sessionId, current => ({
4638
4907
  ...current,
4639
4908
  channelState: mergeChannelStateMutation({
4640
4909
  current: current.channelState,
@@ -4718,8 +4987,10 @@ export class SessionEngine {
4718
4987
  async waitForCompletion(sessionId: string): Promise<TurnOutcome> {
4719
4988
  // Drain admission first so pendingTurns → activeTurns is visible before we
4720
4989
  // decide the session is idle (reminders use this for queueBehindTurn).
4721
- // The active lifecycle promise also awaits coalesce drain + the drained
4722
- // follow-up's admission, so Slack coalesced waiters see the resume turn.
4990
+ // Wait for coalesce drain and any successor turn so hosted execute does
4991
+ // not park mid-follow-up, but report the root turn's outcome: a drained
4992
+ // successor failure must not un-ACK an already-finished owner.
4993
+ let root: TurnOutcome | undefined;
4723
4994
  for (;;) {
4724
4995
  const chain = this.admissionChains.get(sessionId);
4725
4996
  if (chain !== undefined) {
@@ -4727,14 +4998,15 @@ export class SessionEngine {
4727
4998
  }
4728
4999
  const active = this.activeTurns.get(sessionId);
4729
5000
  if (active !== undefined) {
4730
- await active;
5001
+ const outcome = await active;
5002
+ root ??= outcome;
4731
5003
  continue;
4732
5004
  }
4733
5005
  const dispatch = this.dispatchChains.get(sessionId);
4734
5006
  if (dispatch !== undefined) {
4735
5007
  await dispatch.catch(() => {});
4736
5008
  }
4737
- return this.lastOutcomes.get(sessionId) ?? { status: "finished" };
5009
+ return root ?? this.lastOutcomes.get(sessionId) ?? { status: "finished" };
4738
5010
  }
4739
5011
  }
4740
5012
 
@@ -4773,7 +5045,7 @@ export class SessionEngine {
4773
5045
  }
4774
5046
  const owned = await this.ownedSessionIds(caller);
4775
5047
  return records.filter(
4776
- (record) => record.sessionId !== undefined && owned.has(record.sessionId)
5048
+ record => record.sessionId !== undefined && owned.has(record.sessionId)
4777
5049
  );
4778
5050
  }
4779
5051
 
@@ -4810,8 +5082,8 @@ export class SessionEngine {
4810
5082
  const sessions = await this.sessions.list();
4811
5083
  return new Set(
4812
5084
  sessions
4813
- .filter((record) => samePrincipal(record.auth, caller))
4814
- .map((record) => record.sessionId)
5085
+ .filter(record => samePrincipal(record.auth, caller))
5086
+ .map(record => record.sessionId)
4815
5087
  );
4816
5088
  }
4817
5089
 
@@ -4955,8 +5227,8 @@ export class SessionEngine {
4955
5227
  includeAll: boolean
4956
5228
  ): SessionSummary[] {
4957
5229
  return records
4958
- .filter((record) => includeAll || samePrincipal(record.auth, caller))
4959
- .map((record) => {
5230
+ .filter(record => includeAll || samePrincipal(record.auth, caller))
5231
+ .map(record => {
4960
5232
  const links = sessionExternalLinks(record);
4961
5233
  return {
4962
5234
  sessionId: record.sessionId,
@@ -5015,7 +5287,7 @@ export class SessionEngine {
5015
5287
  if (existing === undefined) {
5016
5288
  throw new Error(`Unknown session: ${sessionId}`);
5017
5289
  }
5018
- const record = await this.updateRecord(sessionId, (current) => ({
5290
+ const record = await this.updateRecord(sessionId, current => ({
5019
5291
  ...current,
5020
5292
  turnCount: current.turnCount + 1,
5021
5293
  }));
@@ -5150,7 +5422,7 @@ export class SessionEngine {
5150
5422
  return pending;
5151
5423
  }
5152
5424
  const work = this.runCloudTurnCostBackfill(sessionId)
5153
- .catch((error) => {
5425
+ .catch(error => {
5154
5426
  this.logger(
5155
5427
  `[agent-sdk] cloud cost backfill failed for ${sessionId}: ${describeError(error)}`
5156
5428
  );
@@ -5165,10 +5437,10 @@ export class SessionEngine {
5165
5437
  private async runCloudTurnCostBackfill(sessionId: string): Promise<void> {
5166
5438
  const log = await this.logs.get(sessionId);
5167
5439
  const events = await log.snapshot(0);
5168
- if (!events.some((event) => isUnpricedCompletedTurn(event))) {
5440
+ if (!events.some(event => isUnpricedCompletedTurn(event))) {
5169
5441
  if (
5170
5442
  !this.isTurnRunning(sessionId) &&
5171
- events.some((event) => event.type === "turn.completed")
5443
+ events.some(event => event.type === "turn.completed")
5172
5444
  ) {
5173
5445
  this.cloudCostBackfillDone.add(sessionId);
5174
5446
  }
@@ -5199,7 +5471,7 @@ export class SessionEngine {
5199
5471
  log.replace(i, next);
5200
5472
  }
5201
5473
  if (
5202
- !(await log.snapshot(0)).some((event) => isUnpricedCompletedTurn(event))
5474
+ !(await log.snapshot(0)).some(event => isUnpricedCompletedTurn(event))
5203
5475
  ) {
5204
5476
  this.cloudCostBackfillDone.add(sessionId);
5205
5477
  }
@@ -5210,7 +5482,7 @@ export class SessionEngine {
5210
5482
  token: string | null
5211
5483
  ): Promise<void> {
5212
5484
  const previous = await this.sessions.get(sessionId);
5213
- await this.updateRecord(sessionId, (current) => ({
5485
+ await this.updateRecord(sessionId, current => ({
5214
5486
  ...current,
5215
5487
  continuationKey: token,
5216
5488
  }));
@@ -5387,7 +5659,7 @@ export class SessionEngine {
5387
5659
  // the lazy continuation-lookup path.
5388
5660
  const cutoff = Date.now() - policy.maxAgeMs;
5389
5661
  const candidates = loaded
5390
- .map((record) => ({
5662
+ .map(record => ({
5391
5663
  record,
5392
5664
  // Numeric timestamp for both the age filter and the sort; a
5393
5665
  // non-string updatedAt (e.g. a raw DB Date from an untyped sink)
@@ -5419,7 +5691,7 @@ export class SessionEngine {
5419
5691
  ) {
5420
5692
  const chunk = candidates.slice(i, i + RESTORE_FETCH_CONCURRENCY);
5421
5693
  const fetched = await Promise.all(
5422
- chunk.map(async (record) => {
5694
+ chunk.map(async record => {
5423
5695
  try {
5424
5696
  // Local state always wins over the sink.
5425
5697
  if ((await this.sessions.get(record.sessionId)) !== undefined) {
@@ -5676,7 +5948,7 @@ function eventsNdjson(events: SessionEvent[]): string | undefined {
5676
5948
  if (events.length === 0) {
5677
5949
  return undefined;
5678
5950
  }
5679
- return `${events.map((event) => JSON.stringify(event)).join("\n")}\n`;
5951
+ return `${events.map(event => JSON.stringify(event)).join("\n")}\n`;
5680
5952
  }
5681
5953
 
5682
5954
  function subagentPrompt(subagent: ResolvedAgent): string {
@@ -5692,7 +5964,7 @@ function subagentPrompt(subagent: ResolvedAgent): string {
5692
5964
  * executor that turn will run on.
5693
5965
  */
5694
5966
  function buildRunnerSubagents(agent: ResolvedAgent): RunnerSubagent[] {
5695
- return agent.subagents.map((subagent) => ({
5967
+ return agent.subagents.map(subagent => ({
5696
5968
  name: subagent.name,
5697
5969
  description: subagent.description ?? subagent.name,
5698
5970
  prompt: subagentPrompt(subagent),
@@ -5716,7 +5988,7 @@ async function defaultGetCloudUsage(
5716
5988
  return {
5717
5989
  usage: mapSdkTokenUsage(billed.usage),
5718
5990
  cost: billed.cost,
5719
- runs: billed.runs.map((run) => ({
5991
+ runs: billed.runs.map(run => ({
5720
5992
  runId: run.runId,
5721
5993
  usage: mapSdkTokenUsage(run.usage),
5722
5994
  cost: run.cost,
@@ -5768,7 +6040,7 @@ function approvalResolverLabel(auth: AuthContext | null): string | undefined {
5768
6040
 
5769
6041
  /** Let the HTTP NDJSON writer flush before the next SDK update. */
5770
6042
  function yieldEventLoop(): Promise<void> {
5771
- return new Promise((resolve) => {
6043
+ return new Promise(resolve => {
5772
6044
  setImmediate(resolve);
5773
6045
  });
5774
6046
  }