@cursor/july 0.1.111 → 0.1.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/dist/bin/agent-serve.js +18 -1
  2. package/dist/channels/github/github-channel.d.ts +29 -19
  3. package/dist/channels/github/github-channel.d.ts.map +1 -1
  4. package/dist/channels/github/github-channel.js +29 -19
  5. package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
  6. package/dist/channels/slack/agentic-delivery.js +2 -0
  7. package/dist/channels/slack/dispatch.d.ts +11 -1
  8. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  9. package/dist/channels/slack/dispatch.js +142 -39
  10. package/dist/channels/slack/placeholder.d.ts +26 -0
  11. package/dist/channels/slack/placeholder.d.ts.map +1 -1
  12. package/dist/channels/slack/placeholder.js +28 -0
  13. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  14. package/dist/channels/slack/slack-channel.js +9 -16
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/assets/{app.Drol6mi6.js → app.DxTdhphC.js} +4 -4
  17. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
  18. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
  19. package/dist/docs/assets/chunks/@localSearchIndexroot.QmjDU6Jh.js +1 -0
  20. package/dist/docs/assets/chunks/{VPLocalSearchBox.CdqoBZJX.js → VPLocalSearchBox.CR3KTF0X.js} +1 -1
  21. package/dist/docs/assets/chunks/{arc.BVX3ycTn.js → arc.CVVqBOdS.js} +1 -1
  22. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CcChnMxX.js → architectureDiagram-Q4EWVU46.CJHGP4ki.js} +1 -1
  23. package/dist/docs/assets/chunks/{baseUniq.xwtXO-yt.js → baseUniq.r7UVVRBP.js} +1 -1
  24. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CijZ_taK.js → blockDiagram-DXYQGD6D.DKmMaTre.js} +1 -1
  25. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.0FBvwBvK.js → c4Diagram-AHTNJAMY.DDJsntUO.js} +1 -1
  26. package/dist/docs/assets/chunks/channel.BjpoSbz_.js +1 -0
  27. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CELMmMDA.js → chunk-4BX2VUAB.BK2rKt6W.js} +1 -1
  28. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C4bhFtSm.js → chunk-4TB4RGXK.DRLV8RnF.js} +1 -1
  29. package/dist/docs/assets/chunks/{chunk-55IACEB6.ZnQ9gRRQ.js → chunk-55IACEB6.DaKjxtb7.js} +1 -1
  30. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DPlmglG-.js → chunk-EDXVE4YY.C5sPCIT1.js} +1 -1
  31. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BrUk8pff.js → chunk-FMBD7UC4.CSGWyNTB.js} +1 -1
  32. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CcmWIncu.js → chunk-OYMX7WX6.D5tK9XEr.js} +1 -1
  33. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D65-cs8I.js → chunk-QZHKN3VN.BeZGd1UZ.js} +1 -1
  34. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.qoXZpG9F.js → chunk-YZCP3GAM.U_tfWwQR.js} +1 -1
  35. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BgxOlMHw.js +1 -0
  36. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BgxOlMHw.js +1 -0
  37. package/dist/docs/assets/chunks/clone.DRuGBKZC.js +1 -0
  38. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.8rYtqudO.js → cose-bilkent-S5V4N54A.DVeRXIb6.js} +1 -1
  39. package/dist/docs/assets/chunks/{dagre-KV5264BT.DrRP1fOh.js → dagre-KV5264BT.BpKJAeRZ.js} +1 -1
  40. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DHj_xA2_.js → diagram-5BDNPKRD.BQOtrd1Z.js} +1 -1
  41. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Bz_6nAKj.js → diagram-G4DWMVQ6.CSDAhjPI.js} +1 -1
  42. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BWA0xSW9.js → diagram-MMDJMWI5.Dpztst2S.js} +1 -1
  43. package/dist/docs/assets/chunks/{diagram-TYMM5635.CpTJLNJI.js → diagram-TYMM5635.qJHRizHR.js} +1 -1
  44. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.-7AWWSrP.js → erDiagram-SMLLAGMA.vbDotH3l.js} +1 -1
  45. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BTnQ742_.js → flowDiagram-DWJPFMVM.CqS_ZQr4.js} +1 -1
  46. package/dist/docs/assets/chunks/framework.BNw1pucY.js +19 -0
  47. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B5_HiiQ5.js → ganttDiagram-T4ZO3ILL.DTLdR4pN.js} +1 -1
  48. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CZcNTFZd.js → gitGraphDiagram-UUTBAWPF.D04lnbnr.js} +1 -1
  49. package/dist/docs/assets/chunks/{graph.V2GLaab4.js → graph.BlfqLJsM.js} +1 -1
  50. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.7pZOkCCU.js → infoDiagram-42DDH7IO.tAooImWA.js} +1 -1
  51. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js → ishikawaDiagram-UXIWVN3A.ClUsVqnJ.js} +1 -1
  52. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BNEgWN1S.js → journeyDiagram-VCZTEJTY.C3tUgyCg.js} +1 -1
  53. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B-4d4tC7.js → kanban-definition-6JOO6SKY.CtD9-QCe.js} +1 -1
  54. package/dist/docs/assets/chunks/{layout.Dvbn9nSb.js → layout.D38U-LnT.js} +1 -1
  55. package/dist/docs/assets/chunks/{linear.D2GM4p4b.js → linear.BJmssyhN.js} +1 -1
  56. package/dist/docs/assets/chunks/{min.DVBtLK-B.js → min.DNgXoouU.js} +1 -1
  57. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CnJRI55x.js → mindmap-definition-QFDTVHPH.Dcp6cxeu.js} +1 -1
  58. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CtoaTFlA.js → pieDiagram-DEJITSTG.CLDw6zIs.js} +1 -1
  59. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DtT24_vN.js → quadrantDiagram-34T5L4WZ.CYaeeY4c.js} +1 -1
  60. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CjSO4o8f.js → requirementDiagram-MS252O5E.gMYuRpq2.js} +1 -1
  61. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.-wWiIVWa.js → sankeyDiagram-XADWPNL6.CZqyHFbc.js} +1 -1
  62. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DSk8s4gX.js → sequenceDiagram-FGHM5R23.BTsCjUDN.js} +1 -1
  63. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BFKAsdkN.js → stateDiagram-FHFEXIEX.CftT9mLJ.js} +1 -1
  64. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.-43J68xB.js +1 -0
  65. package/dist/docs/assets/chunks/{theme.C0MctGaz.js → theme.B_7J9ZsV.js} +2 -2
  66. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.TUNJbAFe.js → timeline-definition-GMOUNBTQ.DbU3WUNw.js} +1 -1
  67. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.C-RGNnk4.js → vennDiagram-DHZGUBPP.ixsq-q2u.js} +1 -1
  68. package/dist/docs/assets/chunks/wardley-RL74JXVD.WRXz-Dux.js +162 -0
  69. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DH4zt73Y.js → wardleyDiagram-NUSXRM2D.C0ewvgbp.js} +1 -1
  70. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B-3k6bF6.js → xychartDiagram-5P7HB3ND.nAEhF4bO.js} +1 -1
  71. package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
  72. package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
  73. package/dist/docs/assets/evals.md.BYvfZ-PO.js +72 -0
  74. package/dist/docs/assets/evals.md.BYvfZ-PO.lean.js +1 -0
  75. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.js +30 -0
  76. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.lean.js +1 -0
  77. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
  78. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
  79. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
  80. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
  81. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
  82. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
  83. package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
  84. package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
  85. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
  86. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
  87. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
  88. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
  89. package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
  90. package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
  91. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
  92. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
  93. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
  94. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
  95. package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
  96. package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
  97. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
  98. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
  99. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
  100. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
  101. package/dist/docs/assets/{index.md.BFVyY2KT.js → index.md.C-t81M5J.js} +2 -2
  102. package/dist/docs/assets/{index.md.BFVyY2KT.lean.js → index.md.C-t81M5J.lean.js} +1 -1
  103. package/dist/docs/assets/{quickstart.md.D3MjSZN-.js → quickstart.md.DAvVhuuU.js} +1 -1
  104. package/dist/docs/assets/{quickstart.md.D3MjSZN-.lean.js → quickstart.md.DAvVhuuU.lean.js} +1 -1
  105. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
  106. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
  107. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
  108. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
  109. package/dist/docs/assets/{reference_channels.md.icqLKcTc.js → reference_channels.md.nFWbzAic.js} +1 -1
  110. package/dist/docs/assets/{reference_channels.md.icqLKcTc.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
  111. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.js → reference_cli.md.DLWDz9ij.js} +3 -1
  112. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
  113. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.js → reference_connections.md.CmyrlXfY.js} +1 -1
  114. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.lean.js → reference_connections.md.CmyrlXfY.lean.js} +1 -1
  115. package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
  116. package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
  117. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.js +58 -0
  118. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.lean.js +1 -0
  119. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.js → reference_hooks.md.B7uzNENk.js} +2 -2
  120. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
  121. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.js → reference_http-api.md.CduHavZ2.js} +1 -1
  122. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
  123. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.js → reference_instructions.md.CU1My5My.js} +1 -1
  124. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
  125. package/dist/docs/assets/{reference_playground.md.D2YExv5K.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
  126. package/dist/docs/assets/{reference_playground.md.D2YExv5K.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
  127. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.js → reference_project-layout.md.BGhgpy9V.js} +1 -1
  128. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
  129. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.js → reference_prompt.md.Ccp0R53H.js} +1 -1
  130. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
  131. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
  132. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
  133. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
  134. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
  135. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.js → reference_skills.md.DjQkRefx.js} +1 -1
  136. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
  137. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.js → reference_subagents.md.BHsSMMyO.js} +1 -1
  138. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.lean.js → reference_subagents.md.BHsSMMyO.lean.js} +1 -1
  139. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.js → reference_tools.md.BYzUTeVA.js} +1 -1
  140. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.lean.js → reference_tools.md.BYzUTeVA.lean.js} +1 -1
  141. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.js → templates_agentic-owners.md.9M575F5C.js} +1 -1
  142. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
  143. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
  144. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
  145. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
  146. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
  147. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
  148. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
  149. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
  150. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
  151. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.js → templates_triage.md.CVGe_FG6.js} +1 -1
  152. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
  153. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
  154. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
  155. package/dist/docs/building-with-agents.html +44 -48
  156. package/dist/docs/building-with-agents.md +94 -82
  157. package/dist/docs/deployment.html +59 -78
  158. package/dist/docs/deployment.md +117 -363
  159. package/dist/docs/evals.html +85 -224
  160. package/dist/docs/evals.md +146 -673
  161. package/dist/docs/guides/agent-to-agent.html +58 -42
  162. package/dist/docs/guides/agent-to-agent.md +112 -35
  163. package/dist/docs/guides/bitbucket.html +179 -44
  164. package/dist/docs/guides/bitbucket.md +249 -48
  165. package/dist/docs/guides/cloud-agents.html +46 -40
  166. package/dist/docs/guides/cloud-agents.md +119 -66
  167. package/dist/docs/guides/convert-automation.html +80 -49
  168. package/dist/docs/guides/convert-automation.md +156 -147
  169. package/dist/docs/guides/github.html +184 -92
  170. package/dist/docs/guides/github.md +260 -245
  171. package/dist/docs/guides/gitlab.html +184 -45
  172. package/dist/docs/guides/gitlab.md +249 -50
  173. package/dist/docs/guides/grokbot-agents.html +48 -41
  174. package/dist/docs/guides/grokbot-agents.md +99 -53
  175. package/dist/docs/guides/improve.html +48 -40
  176. package/dist/docs/guides/improve.md +111 -58
  177. package/dist/docs/guides/mcp-oauth.html +74 -52
  178. package/dist/docs/guides/mcp-oauth.md +111 -121
  179. package/dist/docs/guides/opentelemetry.html +63 -54
  180. package/dist/docs/guides/opentelemetry.md +96 -165
  181. package/dist/docs/guides/slack.html +83 -59
  182. package/dist/docs/guides/slack.md +157 -227
  183. package/dist/docs/guides/webhooks.html +97 -230
  184. package/dist/docs/guides/webhooks.md +154 -385
  185. package/dist/docs/hashmap.json +1 -1
  186. package/dist/docs/hillclimbing.html +44 -38
  187. package/dist/docs/hillclimbing.md +101 -55
  188. package/dist/docs/index.html +38 -38
  189. package/dist/docs/index.md +2 -0
  190. package/dist/docs/llms-full.txt +3082 -3104
  191. package/dist/docs/llms.txt +21 -18
  192. package/dist/docs/quickstart.html +37 -37
  193. package/dist/docs/reference/agent-config.html +37 -37
  194. package/dist/docs/reference/artifacts.html +38 -38
  195. package/dist/docs/reference/channels.html +37 -37
  196. package/dist/docs/reference/cli.html +39 -37
  197. package/dist/docs/reference/cli.md +2 -0
  198. package/dist/docs/reference/connections.html +37 -37
  199. package/dist/docs/reference/evals.html +116 -0
  200. package/dist/docs/reference/evals.md +293 -0
  201. package/dist/docs/reference/extensions.html +80 -84
  202. package/dist/docs/reference/extensions.md +127 -199
  203. package/dist/docs/reference/hooks.html +39 -39
  204. package/dist/docs/reference/hooks.md +34 -34
  205. package/dist/docs/reference/http-api.html +37 -37
  206. package/dist/docs/reference/instructions.html +37 -37
  207. package/dist/docs/reference/playground.html +37 -37
  208. package/dist/docs/reference/project-layout.html +37 -37
  209. package/dist/docs/reference/prompt.html +37 -37
  210. package/dist/docs/reference/schedules.html +37 -37
  211. package/dist/docs/reference/sessions.html +37 -37
  212. package/dist/docs/reference/skills.html +37 -37
  213. package/dist/docs/reference/subagents.html +37 -37
  214. package/dist/docs/reference/tools.html +37 -37
  215. package/dist/docs/templates/agentic-owners.html +38 -38
  216. package/dist/docs/templates/pr-autofixer.html +37 -37
  217. package/dist/docs/templates/security-reviewer.html +38 -38
  218. package/dist/docs/templates/thermo-quality-review.html +62 -0
  219. package/dist/docs/templates/thermo-quality-review.md +75 -0
  220. package/dist/docs/templates/thermo-review.html +62 -0
  221. package/dist/docs/templates/thermo-review.md +74 -0
  222. package/dist/docs/templates/triage.html +37 -37
  223. package/dist/docs/troubleshooting.html +38 -38
  224. package/dist/docs/troubleshooting.md +97 -66
  225. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  226. package/dist/extensions/improve/extension.d.ts +3 -1
  227. package/dist/extensions/improve/extension.d.ts.map +1 -1
  228. package/dist/extensions/improve/extension.js +4 -2
  229. package/dist/extensions/improve/skills/yourself.js +1 -1
  230. package/dist/filesystem.d.ts +46 -2
  231. package/dist/filesystem.d.ts.map +1 -1
  232. package/dist/filesystem.js +149 -102
  233. package/dist/index.d.ts +2 -2
  234. package/dist/index.d.ts.map +1 -1
  235. package/dist/index.js +1 -1
  236. package/dist/internal/cli-ax.d.ts +6 -0
  237. package/dist/internal/cli-ax.d.ts.map +1 -1
  238. package/dist/internal/cli-ax.js +72 -14
  239. package/dist/internal/continuation-identity.d.ts.map +1 -1
  240. package/dist/internal/continuation-identity.js +1 -0
  241. package/dist/internal/cursor-agent-template.d.ts +1 -1
  242. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  243. package/dist/internal/cursor-agent-template.js +2 -0
  244. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  245. package/dist/internal/filesystem/tools.js +2 -2
  246. package/dist/internal/filesystem/walk.d.ts +7 -4
  247. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  248. package/dist/internal/filesystem/walk.js +34 -11
  249. package/dist/internal/hosted-admission-adapter.d.ts +3 -0
  250. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  251. package/dist/internal/hosted-delivery-protocol.d.ts +17 -0
  252. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  253. package/dist/internal/hosted-delivery-protocol.js +50 -1
  254. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  255. package/dist/internal/hosted-delivery.js +8 -0
  256. package/dist/internal/init-project.d.ts.map +1 -1
  257. package/dist/internal/init-project.js +4 -0
  258. package/dist/internal/server.d.ts.map +1 -1
  259. package/dist/internal/server.js +94 -39
  260. package/dist/internal/session-engine.d.ts.map +1 -1
  261. package/dist/internal/session-engine.js +11 -5
  262. package/dist/internal/skill-catalog.d.ts +28 -0
  263. package/dist/internal/skill-catalog.d.ts.map +1 -0
  264. package/dist/internal/skill-catalog.js +44 -0
  265. package/dist/playground/assets/index-B1c1LeIf.js +67 -0
  266. package/dist/playground/assets/index-CK2LX3iD.css +1 -0
  267. package/dist/playground/index.html +2 -2
  268. package/dist/types.d.ts +9 -0
  269. package/dist/types.d.ts.map +1 -1
  270. package/docs/README.md +2 -0
  271. package/docs/building-with-agents.md +96 -84
  272. package/docs/deployment.md +118 -364
  273. package/docs/evals.md +147 -674
  274. package/docs/guides/agent-to-agent.md +113 -36
  275. package/docs/guides/bitbucket.md +250 -49
  276. package/docs/guides/cloud-agents.md +119 -67
  277. package/docs/guides/convert-automation.md +157 -148
  278. package/docs/guides/github.md +261 -246
  279. package/docs/guides/gitlab.md +250 -51
  280. package/docs/guides/grokbot-agents.md +100 -55
  281. package/docs/guides/improve.md +112 -59
  282. package/docs/guides/mcp-oauth.md +112 -122
  283. package/docs/guides/opentelemetry.md +97 -166
  284. package/docs/guides/slack.md +158 -228
  285. package/docs/guides/webhooks.md +155 -386
  286. package/docs/hillclimbing.md +102 -56
  287. package/docs/reference/cli.md +2 -0
  288. package/docs/reference/evals.md +298 -0
  289. package/docs/reference/extensions.md +128 -200
  290. package/docs/reference/hooks.md +34 -34
  291. package/docs/templates/thermo-quality-review.md +80 -0
  292. package/docs/templates/thermo-review.md +79 -0
  293. package/docs/troubleshooting.md +98 -67
  294. package/package.json +1 -1
  295. package/skills/github/SKILL.md +21 -13
  296. package/src/bin/agent-serve.ts +22 -0
  297. package/src/channels/github/github-channel.ts +29 -19
  298. package/src/channels/slack/agentic-delivery.ts +2 -0
  299. package/src/channels/slack/dispatch.ts +126 -4
  300. package/src/channels/slack/placeholder.ts +51 -0
  301. package/src/channels/slack/slack-channel.ts +9 -2
  302. package/src/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  303. package/src/extensions/improve/extension.ts +4 -2
  304. package/src/extensions/improve/skills/yourself.ts +1 -1
  305. package/src/filesystem.ts +168 -65
  306. package/src/index.ts +3 -0
  307. package/src/internal/cli-ax.ts +88 -15
  308. package/src/internal/continuation-identity.ts +1 -0
  309. package/src/internal/cursor-agent-template.ts +2 -0
  310. package/src/internal/filesystem/tools.ts +2 -0
  311. package/src/internal/filesystem/walk.ts +60 -15
  312. package/src/internal/hosted-admission-adapter.ts +3 -0
  313. package/src/internal/hosted-delivery-protocol.ts +78 -1
  314. package/src/internal/hosted-delivery.ts +8 -0
  315. package/src/internal/init-project.ts +4 -0
  316. package/src/internal/server.ts +104 -41
  317. package/src/internal/session-engine.ts +16 -4
  318. package/src/internal/skill-catalog.ts +69 -0
  319. package/src/types.ts +9 -0
  320. package/templates/thermo-quality-review/README.md +35 -0
  321. package/templates/thermo-quality-review/agent/agent.ts +8 -0
  322. package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
  323. package/templates/thermo-quality-review/agent/instructions.md +43 -0
  324. package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
  325. package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
  326. package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
  327. package/templates/thermo-quality-review/package.json +18 -0
  328. package/templates/thermo-quality-review/tsconfig.json +12 -0
  329. package/templates/thermo-review/README.md +35 -0
  330. package/templates/thermo-review/agent/agent.ts +8 -0
  331. package/templates/thermo-review/agent/channels/github.ts +42 -0
  332. package/templates/thermo-review/agent/instructions.md +40 -0
  333. package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
  334. package/templates/thermo-review/evals/evals.config.ts +5 -0
  335. package/templates/thermo-review/evals/review.eval.ts +53 -0
  336. package/templates/thermo-review/package.json +18 -0
  337. package/templates/thermo-review/tsconfig.json +12 -0
  338. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.js +0 -13
  339. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.lean.js +0 -1
  340. package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +0 -1
  341. package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +0 -1
  342. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +0 -1
  343. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +0 -1
  344. package/dist/docs/assets/chunks/clone.YSt_40_s.js +0 -1
  345. package/dist/docs/assets/chunks/framework.dypDpWZ3.js +0 -19
  346. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +0 -1
  347. package/dist/docs/assets/chunks/wardley-RL74JXVD.g5efOWmT.js +0 -162
  348. package/dist/docs/assets/deployment.md.Dm4Qo3hp.js +0 -51
  349. package/dist/docs/assets/deployment.md.Dm4Qo3hp.lean.js +0 -1
  350. package/dist/docs/assets/evals.md.BLDRt5LH.js +0 -211
  351. package/dist/docs/assets/evals.md.BLDRt5LH.lean.js +0 -1
  352. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +0 -14
  353. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +0 -1
  354. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.js +0 -10
  355. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.lean.js +0 -1
  356. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.js +0 -9
  357. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.lean.js +0 -1
  358. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.js +0 -12
  359. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.lean.js +0 -1
  360. package/dist/docs/assets/guides_github.md.D6ER29dG.js +0 -64
  361. package/dist/docs/assets/guides_github.md.D6ER29dG.lean.js +0 -1
  362. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.js +0 -14
  363. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.lean.js +0 -1
  364. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +0 -9
  365. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.lean.js +0 -1
  366. package/dist/docs/assets/guides_improve.md.BKaDuKKK.js +0 -14
  367. package/dist/docs/assets/guides_improve.md.BKaDuKKK.lean.js +0 -1
  368. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.js +0 -28
  369. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.lean.js +0 -1
  370. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.js +0 -26
  371. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.lean.js +0 -1
  372. package/dist/docs/assets/guides_slack.md.DdT8rmsj.js +0 -46
  373. package/dist/docs/assets/guides_slack.md.DdT8rmsj.lean.js +0 -1
  374. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.js +0 -225
  375. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.lean.js +0 -1
  376. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +0 -1
  377. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +0 -1
  378. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.js +0 -62
  379. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.lean.js +0 -1
  380. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.js +0 -1
  381. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.lean.js +0 -1
  382. package/dist/playground/assets/index-BLlKgZtI.css +0 -1
  383. package/dist/playground/assets/index-CDS5p9sR.js +0 -67
@@ -7,8 +7,14 @@
7
7
 
8
8
  import { posix } from "node:path";
9
9
  import { minimatch } from "minimatch";
10
- import type { DirEntry, FileInfo, FileSystem } from "../../filesystem.js";
11
- import { normalizeFsPath } from "../../filesystem.js";
10
+ import type {
11
+ DirEntry,
12
+ FileInfo,
13
+ FileSystem,
14
+ GlobOptions,
15
+ ListOptions,
16
+ } from "../../filesystem.js";
17
+ import { FILE_SYSTEM_SCAN_LIMIT, normalizeFsPath } from "../../filesystem.js";
12
18
  import { mergeSorted } from "./merge.js";
13
19
 
14
20
  /**
@@ -29,13 +35,22 @@ export interface LsDirectoryTreeNode {
29
35
  /** Filename-character ingest budget; matches LocalLsExecutor. */
30
36
  export const LS_INGEST_CHARACTER_BUDGET = 2_500;
31
37
 
38
+ function takeLimit(entries: readonly DirEntry[], limit?: number): DirEntry[] {
39
+ if (limit === undefined || !Number.isFinite(limit)) {
40
+ return [...entries];
41
+ }
42
+ const cap = Math.max(0, Math.floor(limit));
43
+ return entries.slice(0, cap);
44
+ }
45
+
32
46
  /**
33
47
  * Yield the files under `prefix`, sorted. A file whose path equals
34
48
  * `prefix` is not under itself.
35
49
  */
36
50
  export async function* listFilesFromPaths(
37
51
  files: Iterable<DirEntry>,
38
- prefix?: string
52
+ prefix?: string,
53
+ options?: ListOptions
39
54
  ): AsyncGenerator<DirEntry> {
40
55
  const scope = normalizeListPrefix(prefix);
41
56
  const withSlash = scope === "/" ? "/" : `${scope}/`;
@@ -60,7 +75,7 @@ export async function* listFilesFromPaths(
60
75
  );
61
76
  }
62
77
  matches.sort((left, right) => left.path.localeCompare(right.path));
63
- yield* matches;
78
+ yield* takeLimit(applyIgnores(matches, options?.excludes), options?.limit);
64
79
  }
65
80
 
66
81
  export function normalizeListPrefix(prefix?: string): string {
@@ -97,13 +112,14 @@ export function statFromFilePaths(
97
112
 
98
113
  export async function collectList(
99
114
  root: Pick<FileSystem, "list">,
100
- prefix?: string
115
+ prefix?: string,
116
+ options?: ListOptions
101
117
  ): Promise<DirEntry[]> {
102
118
  const entries: DirEntry[] = [];
103
119
  if (root.list === undefined) {
104
120
  return entries;
105
121
  }
106
- for await (const entry of root.list(prefix)) {
122
+ for await (const entry of root.list(prefix, options)) {
107
123
  entries.push(entry);
108
124
  }
109
125
  return entries;
@@ -111,13 +127,19 @@ export async function collectList(
111
127
 
112
128
  export async function collectGlob(
113
129
  root: Pick<FileSystem, "glob">,
114
- options: { pattern: string; dir?: string }
130
+ options: { pattern: string; dir?: string; limit?: number }
115
131
  ): Promise<DirEntry[]> {
116
132
  const entries: DirEntry[] = [];
117
133
  if (root.glob === undefined) {
118
134
  return entries;
119
135
  }
120
- for await (const entry of root.glob(options.pattern, options.dir)) {
136
+ const globOptions: GlobOptions | undefined =
137
+ options.limit === undefined ? undefined : { limit: options.limit };
138
+ for await (const entry of root.glob(
139
+ options.pattern,
140
+ options.dir,
141
+ globOptions
142
+ )) {
121
143
  entries.push(entry);
122
144
  }
123
145
  return entries;
@@ -129,9 +151,10 @@ export async function collectGlob(
129
151
  */
130
152
  export async function collectListOrStat(
131
153
  root: Pick<FileSystem, "list" | "stat">,
132
- path?: string
154
+ path?: string,
155
+ options?: ListOptions
133
156
  ): Promise<{ kind: FileInfo["kind"]; files: DirEntry[] }> {
134
- const files = await collectList(root, path);
157
+ const files = await collectList(root, path, options);
135
158
  if (files.length > 0) {
136
159
  return { kind: "directory", files };
137
160
  }
@@ -298,10 +321,27 @@ function matchesIgnoreGlob(filePath: string, glob: string): boolean {
298
321
  ? glob
299
322
  : recursivePrefix + glob;
300
323
  const relative = filePath.replace(/^\//, "");
301
- return (
302
- minimatch(relative, pattern, { dot: true }) ||
303
- minimatch(filePath, pattern, { dot: true })
304
- );
324
+ const candidates = [relative, filePath];
325
+ for (const candidate of candidates) {
326
+ if (
327
+ minimatch(candidate, pattern, { dot: true }) ||
328
+ minimatch(candidate, `${pattern}/**`, { dot: true })
329
+ ) {
330
+ return true;
331
+ }
332
+ }
333
+ return false;
334
+ }
335
+
336
+ /** True when `path` matches any {@link ListOptions.excludes} glob. */
337
+ export function isExcludedPath(
338
+ path: string,
339
+ excludes?: readonly string[]
340
+ ): boolean {
341
+ if (excludes === undefined || excludes.length === 0) {
342
+ return false;
343
+ }
344
+ return excludes.some(glob => matchesIgnoreGlob(path, glob));
305
345
  }
306
346
 
307
347
  export async function lsFromList(
@@ -312,7 +352,12 @@ export async function lsFromList(
312
352
  | { status: "success"; value: { directoryTreeRoot: LsDirectoryTreeNode } }
313
353
  | { status: "error"; error: { message: string } }
314
354
  > {
315
- const listed = await collectListOrStat(root, path);
355
+ const listed = await collectListOrStat(root, path, {
356
+ limit: FILE_SYSTEM_SCAN_LIMIT,
357
+ ...(ignoreGlobs === undefined || ignoreGlobs.length === 0
358
+ ? {}
359
+ : { excludes: ignoreGlobs }),
360
+ });
316
361
  const treePath = path ?? inferListedRoot(listed.files);
317
362
  switch (listed.kind) {
318
363
  case "missing":
@@ -1,4 +1,5 @@
1
1
  import type { ChannelHandlerArgs } from "../types.js";
2
+ import type { HostedAdmissionPlatformHandoff } from "./hosted-delivery-protocol.js";
2
3
 
3
4
  /**
4
5
  * Hosted-admission hook a channel pack attaches to its definition.
@@ -27,6 +28,8 @@ export type HostedAdmissionAdapter = {
27
28
  args: ChannelHandlerArgs;
28
29
  /** Mailbox key the control plane already allocated for this admission. */
29
30
  mailboxContinuationKey?: string;
31
+ /** Trusted control-plane handoff (Slack placeholder ts, …). */
32
+ platformHandoff?: HostedAdmissionPlatformHandoff;
30
33
  }): Promise<Response>;
31
34
  };
32
35
 
@@ -236,6 +236,20 @@ export type HostedAdmissionManagedAutomation = {
236
236
  slackChannels?: string[];
237
237
  };
238
238
 
239
+ /**
240
+ * Trusted control-plane handoff for a Slack placeholder posted at ingress
241
+ * before the Temporal signal. Omitted when no placeholder was posted.
242
+ */
243
+ export type HostedAdmissionPlatformHandoff = {
244
+ v: 1;
245
+ slackPlaceholder: {
246
+ messageTs: string;
247
+ channelId: string;
248
+ threadTs: string;
249
+ streamed: false;
250
+ };
251
+ };
252
+
239
253
  export type HostedAdmission = {
240
254
  v: 2;
241
255
  channelId: string;
@@ -251,6 +265,8 @@ export type HostedAdmission = {
251
265
  mailboxContinuationKey: string;
252
266
  payload: unknown;
253
267
  managedAutomation?: HostedAdmissionManagedAutomation;
268
+ /** Present only when control-plane Slack fast-act posted a placeholder. */
269
+ platformHandoff?: HostedAdmissionPlatformHandoff;
254
270
  };
255
271
 
256
272
  export type HostedAdmissionOutcome =
@@ -304,12 +320,19 @@ const DELIVERY_KEYS = new Set([
304
320
  "mailboxContinuationKey",
305
321
  "payload",
306
322
  "managedAutomation",
323
+ "platformHandoff",
307
324
  ]);
308
325
  const MANAGED_AUTOMATION_KEYS = new Set([
309
326
  "automationUuid",
310
327
  "mcpServerNames",
311
328
  "slackChannels",
312
329
  ]);
330
+ export const HOSTED_PLATFORM_HANDOFF_KEYS: ReadonlySet<string> = new Set([
331
+ "v",
332
+ "slackPlaceholder",
333
+ ]);
334
+ export const HOSTED_SLACK_PLACEHOLDER_HANDOFF_KEYS: ReadonlySet<string> =
335
+ new Set(["messageTs", "channelId", "threadTs", "streamed"]);
313
336
  /** More names than any real automation configures is a malformed envelope. */
314
337
  const MANAGED_AUTOMATION_MAX_SERVERS = 64;
315
338
  /** More channels than the dashboard picker allows is a malformed envelope. */
@@ -370,6 +393,59 @@ function parseManagedAutomation(
370
393
  };
371
394
  }
372
395
 
396
+ /**
397
+ * Parse optional control-plane Slack placeholder handoff. Absent → valid;
398
+ * present-but-malformed → invalid (fail closed like managedAutomation).
399
+ */
400
+ function parsePlatformHandoff(
401
+ value: unknown
402
+ ): { platformHandoff?: HostedAdmissionPlatformHandoff } | undefined {
403
+ if (value === undefined) {
404
+ return {};
405
+ }
406
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
407
+ return undefined;
408
+ }
409
+ const body = value as Record<string, unknown>;
410
+ if (
411
+ Object.keys(body).some(key => !HOSTED_PLATFORM_HANDOFF_KEYS.has(key)) ||
412
+ body.v !== 1
413
+ ) {
414
+ return undefined;
415
+ }
416
+ const placeholder = body.slackPlaceholder;
417
+ if (
418
+ typeof placeholder !== "object" ||
419
+ placeholder === null ||
420
+ Array.isArray(placeholder)
421
+ ) {
422
+ return undefined;
423
+ }
424
+ const slot = placeholder as Record<string, unknown>;
425
+ if (
426
+ Object.keys(slot).some(
427
+ key => !HOSTED_SLACK_PLACEHOLDER_HANDOFF_KEYS.has(key)
428
+ ) ||
429
+ !boundedString(slot.messageTs, 64) ||
430
+ !boundedString(slot.channelId, 64) ||
431
+ !boundedString(slot.threadTs, 64) ||
432
+ slot.streamed !== false
433
+ ) {
434
+ return undefined;
435
+ }
436
+ return {
437
+ platformHandoff: {
438
+ v: 1,
439
+ slackPlaceholder: {
440
+ messageTs: slot.messageTs,
441
+ channelId: slot.channelId,
442
+ threadTs: slot.threadTs,
443
+ streamed: slot.streamed,
444
+ },
445
+ },
446
+ };
447
+ }
448
+
373
449
  export function parseHostedAdmission(
374
450
  value: unknown
375
451
  ): HostedAdmission | undefined {
@@ -387,7 +463,8 @@ export function parseHostedAdmission(
387
463
  !boundedString(body.deliveryId, 256) ||
388
464
  (body.sessionMode !== "event" && body.sessionMode !== "continuation") ||
389
465
  !boundedString(body.mailboxContinuationKey, 512) ||
390
- parseManagedAutomation(body.managedAutomation) === undefined
466
+ parseManagedAutomation(body.managedAutomation) === undefined ||
467
+ parsePlatformHandoff(body.platformHandoff) === undefined
391
468
  ) {
392
469
  return undefined;
393
470
  }
@@ -391,6 +391,7 @@ async function runAdmission(
391
391
  deliveryId: input.delivery.deliveryId,
392
392
  args,
393
393
  mailboxContinuationKey: input.delivery.mailboxContinuationKey,
394
+ platformHandoff: input.delivery.platformHandoff,
394
395
  });
395
396
  } catch (error) {
396
397
  const mapped = mappedAdmissionFailure(error);
@@ -948,6 +949,13 @@ export function registerHostedDeliveryRoute(input: {
948
949
  },
949
950
  });
950
951
  sessionId = session.id;
952
+ // The pre-turn claim used an empty sessionId. Stamp the
953
+ // engine id now so a dashboard / session-view poll that
954
+ // only has the factory `ses_…` can follow `session-events/`.
955
+ await writeDiag({
956
+ sessionId,
957
+ turnStatus: HOSTED_EXECUTION_DIAG_RUNNING_STATUS,
958
+ });
951
959
  const outcome = await session.waitForCompletion();
952
960
  completionAt = hostedExecutionNow();
953
961
  // Status is the owner turn. waitForCompletion still waited
@@ -81,6 +81,8 @@ const TEMPLATES: Readonly<Record<TemplateName, TemplateEntry>> = {
81
81
  "pr-autofixer": { dir: "pr-autofixer" },
82
82
  "security-help": { dir: "security-help" },
83
83
  "security-reviewer": { dir: "security-reviewer" },
84
+ "thermo-quality-review": { dir: "thermo-quality-review" },
85
+ "thermo-review": { dir: "thermo-review" },
84
86
  "triage-linear": { dir: "triage", overlay: "linear" },
85
87
  "triage-jira": { dir: "triage", overlay: "jira" },
86
88
  };
@@ -714,6 +716,8 @@ Scaffold a project, then open the playground:
714
716
  npx ${PACKAGE_NAME} init ./code-wiki --template code-wiki # keep wiki pages current after merge
715
717
  npx ${PACKAGE_NAME} init ./agents-md --template agents-md # keep AGENTS.md current from last week's PRs and Slack
716
718
  npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
719
+ npx ${PACKAGE_NAME} init ./thermo-review --template thermo-review # review PRs for bugs and breakage
720
+ npx ${PACKAGE_NAME} init ./thermo-quality --template thermo-quality-review # review PRs for code quality
717
721
  npx ${PACKAGE_NAME} init ./security-help --template security-help # answer security questions in Slack
718
722
  npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
719
723
  npx ${PACKAGE_NAME} init ./my-triage --template triage-jira # comment on Jira issues
@@ -238,6 +238,11 @@ import {
238
238
  unregisterSessionRunFatalFlush,
239
239
  } from "./session-run-log.js";
240
240
  import { sessionUrlsForRequest } from "./session-urls.js";
241
+ import {
242
+ readSkillDetail,
243
+ skillListEntry,
244
+ UnknownSkillError,
245
+ } from "./skill-catalog.js";
241
246
  import { flushLocalStartLog, selectStartLogStore } from "./start-log-store.js";
242
247
  import { catalogDetailEntry, catalogListEntry } from "./tool-catalog.js";
243
248
 
@@ -1568,7 +1573,15 @@ function mountAgentRoutes(
1568
1573
  }
1569
1574
  return null;
1570
1575
  };
1571
- if (noControlPlane === true && isV2Project(project)) {
1576
+ // A v2 mount served under `--no-control-plane` is a hosted v2 guest: the
1577
+ // hosted control plane drives it through the hosted delivery route below.
1578
+ // Session HTTP is a control-plane surface, so such a guest mounts no
1579
+ // `/v1/session*` or `/v1/sessions` routes — session starts arrive as hosted
1580
+ // admissions (`agentsdk.session` on the built-in http channel) and session
1581
+ // reads come from the control plane's runs surface and durable storage.
1582
+ // Local dev, self-hosted serve, and hosted v1 keep the engine mounts.
1583
+ const hostedV2Guest = noControlPlane === true && isV2Project(project);
1584
+ if (hostedV2Guest) {
1572
1585
  registerHostedDeliveryRoute({
1573
1586
  router,
1574
1587
  base,
@@ -1747,34 +1760,38 @@ function mountAgentRoutes(
1747
1760
  },
1748
1761
  });
1749
1762
 
1750
- router.add({
1751
- method: "GET",
1752
- pattern: `${base}/v1/sessions`,
1753
- auth: httpAuth,
1754
- handler: async (request, ctx) => {
1755
- // Same gate as requireSessionOwner / relaxSessionReadAuth: never with
1756
- // bearer or custom channel auth (strict per-principal isolation).
1757
- // `--allow-anonymous` alone is a shared-principal trust boundary (corp
1758
- // Okta ALB); `--dev` alone stays loopback-only.
1759
- const includeAll =
1760
- relaxSessionReadAuth &&
1761
- (relaxSessionReadAuthBeyondLoopback ||
1762
- (typeof ctx.requestIp === "string" &&
1763
- isLoopbackAddress(ctx.requestIp)));
1764
- // `?latest=1` — only the newest visible session. Clients binding a
1765
- // default session (agsh) do not need the whole list, and on hosted
1766
- // storage the whole list is a database scan.
1767
- const latest = new URL(request.url).searchParams.get("latest");
1768
- const listed =
1769
- latest === "1" || latest === "true"
1770
- ? await engine.latestSessionWithSource(ctx.auth, { includeAll })
1771
- : await engine.listSessionsWithSource(ctx.auth, { includeAll });
1772
- return jsonResponse({
1773
- sessions: listed.sessions,
1774
- source: listed.source,
1775
- });
1776
- },
1777
- });
1763
+ // Session list is session surface: not mounted on a hosted v2 guest (the
1764
+ // control plane owns session reads there; see hostedV2Guest above).
1765
+ if (!hostedV2Guest) {
1766
+ router.add({
1767
+ method: "GET",
1768
+ pattern: `${base}/v1/sessions`,
1769
+ auth: httpAuth,
1770
+ handler: async (request, ctx) => {
1771
+ // Same gate as requireSessionOwner / relaxSessionReadAuth: never with
1772
+ // bearer or custom channel auth (strict per-principal isolation).
1773
+ // `--allow-anonymous` alone is a shared-principal trust boundary (corp
1774
+ // Okta ALB); `--dev` alone stays loopback-only.
1775
+ const includeAll =
1776
+ relaxSessionReadAuth &&
1777
+ (relaxSessionReadAuthBeyondLoopback ||
1778
+ (typeof ctx.requestIp === "string" &&
1779
+ isLoopbackAddress(ctx.requestIp)));
1780
+ // `?latest=1` only the newest visible session. Clients binding a
1781
+ // default session (agsh) do not need the whole list, and on hosted
1782
+ // storage the whole list is a database scan.
1783
+ const latest = new URL(request.url).searchParams.get("latest");
1784
+ const listed =
1785
+ latest === "1" || latest === "true"
1786
+ ? await engine.latestSessionWithSource(ctx.auth, { includeAll })
1787
+ : await engine.listSessionsWithSource(ctx.auth, { includeAll });
1788
+ return jsonResponse({
1789
+ sessions: listed.sessions,
1790
+ source: listed.source,
1791
+ });
1792
+ },
1793
+ });
1794
+ }
1778
1795
 
1779
1796
  // Durable artifacts (ctx.artifacts / tag_artifact), newest-updated first.
1780
1797
  router.add({
@@ -2084,6 +2101,45 @@ function mountAgentRoutes(
2084
2101
  },
2085
2102
  });
2086
2103
 
2104
+ // Deterministic skill reads: the body the harness would receive, plus
2105
+ // resolved sibling files. Read-only, so plain GETs with no session binding.
2106
+ router.add({
2107
+ method: "GET",
2108
+ pattern: `${base}/v1/skills`,
2109
+ auth: httpAuth,
2110
+ handler: async () =>
2111
+ jsonResponse({
2112
+ skills: project.agent.skills.map(skillListEntry),
2113
+ }),
2114
+ });
2115
+
2116
+ router.add({
2117
+ method: "GET",
2118
+ pattern: `${base}/v1/skills/:skillName`,
2119
+ auth: httpAuth,
2120
+ handler: async (_request, ctx) => {
2121
+ const skillName = ctx.params.skillName ?? "";
2122
+ try {
2123
+ return jsonResponse(
2124
+ await readSkillDetail(project.agent.skills, skillName)
2125
+ );
2126
+ } catch (error) {
2127
+ if (error instanceof UnknownSkillError) {
2128
+ return jsonResponse(
2129
+ {
2130
+ ok: false,
2131
+ error: "unknown_skill",
2132
+ message: error.message,
2133
+ availableSkills: error.availableSkillNames,
2134
+ },
2135
+ { status: 404 }
2136
+ );
2137
+ }
2138
+ throw error;
2139
+ }
2140
+ },
2141
+ });
2142
+
2087
2143
  if (playground) {
2088
2144
  // Serve the built Vite SPA. `<base href>` is injected so the SPA's relative
2089
2145
  // asset URLs resolve under this mount regardless of the trailing slash the
@@ -2107,18 +2163,25 @@ function mountAgentRoutes(
2107
2163
  });
2108
2164
  }
2109
2165
 
2110
- for (const route of buildHttpChannelRoutes({
2111
- engine,
2112
- config: project.httpChannel,
2113
- auth: httpAuth,
2114
- basePath: base,
2115
- // Dev playground lists every session (`includeAll`); allow opening them
2116
- // (see relaxSessionReadAuth above).
2117
- relaxSessionReadAuth,
2118
- relaxSessionReadAuthBeyondLoopback,
2119
- relaxSessionApprovalAuth,
2120
- })) {
2121
- router.add(route);
2166
+ // The built-in HTTP session channel (`/v1/session*`, including the
2167
+ // session-scoped approvals/auths routes) is session surface: not mounted on
2168
+ // a hosted v2 guest (see hostedV2Guest above). The `http` channel itself
2169
+ // stays registered with the hosted delivery route, which is how the control
2170
+ // plane's session starts reach it.
2171
+ if (!hostedV2Guest) {
2172
+ for (const route of buildHttpChannelRoutes({
2173
+ engine,
2174
+ config: project.httpChannel,
2175
+ auth: httpAuth,
2176
+ basePath: base,
2177
+ // Dev playground lists every session (`includeAll`); allow opening them
2178
+ // (see relaxSessionReadAuth above).
2179
+ relaxSessionReadAuth,
2180
+ relaxSessionReadAuthBeyondLoopback,
2181
+ relaxSessionApprovalAuth,
2182
+ })) {
2183
+ router.add(route);
2184
+ }
2122
2185
  }
2123
2186
 
2124
2187
  // Playground eval list/run — available without `--dev` (corp / allow-anonymous).
@@ -1037,6 +1037,11 @@ export class SessionEngine {
1037
1037
  // on a sessionless pod.
1038
1038
  throw new HostedAdmissionLocalSendError();
1039
1039
  }
1040
+ if (options.clearCloudOverride === true && options.cloud !== undefined) {
1041
+ throw new Error(
1042
+ "send options cloud and clearCloudOverride cannot be combined"
1043
+ );
1044
+ }
1040
1045
  const identity =
1041
1046
  channelId === HTTP_CHANNEL_ID
1042
1047
  ? httpContinuationIdentity(this.project.httpChannel)
@@ -1127,11 +1132,18 @@ export class SessionEngine {
1127
1132
  ),
1128
1133
  }));
1129
1134
  }
1130
- // Refresh the cloud attach the same way: a follow-up send carries the
1131
- // caller's CURRENT cloud options (e.g. a PR attach re-derived per wake),
1132
- // and the first send's snapshot must not pin this session's turns to a
1133
- // stale repo/prUrl for the session's lifetime.
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.
1134
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 (
1135
1147
  sendOptions.cloud !== undefined &&
1136
1148
  JSON.stringify(sendOptions.cloud) !==
1137
1149
  JSON.stringify(record.cloudOverride)
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Deterministic skill reads (`GET /v1/skills`, `GET /v1/skills/:name`,
3
+ * `agent-sdk skill <name>`): the skill body exactly as the harness would
4
+ * receive it, plus resolved sibling files. No model turn, no session.
5
+ */
6
+
7
+ import { readFile } from "node:fs/promises";
8
+ import type { DiscoveredSkill } from "../types.js";
9
+ import { buildSkillMd } from "./workspace.js";
10
+
11
+ export class UnknownSkillError extends Error {
12
+ constructor(
13
+ skillName: string,
14
+ readonly availableSkillNames: string[]
15
+ ) {
16
+ super(`Unknown skill "${skillName}"`);
17
+ this.name = "UnknownSkillError";
18
+ }
19
+ }
20
+
21
+ /** Light listing entry: routing hint only, like `info` shows. */
22
+ export interface SkillListEntry {
23
+ name: string;
24
+ description: string;
25
+ }
26
+
27
+ /** Full read behind `GET /v1/skills/:name`. */
28
+ export interface SkillDetailEntry extends SkillListEntry {
29
+ /** SKILL.md body without generated frontmatter. */
30
+ markdown: string;
31
+ /** Rendered SKILL.md the harness reads (frontmatter + body). */
32
+ skillMd: string;
33
+ /** Sibling files by package-relative path, with contents resolved. */
34
+ files: Record<string, string>;
35
+ extension?: string;
36
+ }
37
+
38
+ export function skillListEntry(skill: DiscoveredSkill): SkillListEntry {
39
+ return { name: skill.name, description: skill.description };
40
+ }
41
+
42
+ export async function readSkillDetail(
43
+ skills: readonly DiscoveredSkill[],
44
+ skillName: string
45
+ ): Promise<SkillDetailEntry> {
46
+ const skill = skills.find(s => s.name === skillName);
47
+ if (skill === undefined) {
48
+ throw new UnknownSkillError(
49
+ skillName,
50
+ skills.map(s => s.name)
51
+ );
52
+ }
53
+ // Null-prototype: authored keys (`defineSkill`) pass through
54
+ // unvalidated, and `__proto__` would silently vanish on a plain object.
55
+ const files: Record<string, string> = Object.create(null);
56
+ for (const [rel, source] of Object.entries(skill.files)) {
57
+ files[rel] =
58
+ "contents" in source
59
+ ? source.contents
60
+ : await readFile(source.sourcePath, "utf8");
61
+ }
62
+ return {
63
+ ...skillListEntry(skill),
64
+ markdown: skill.markdown,
65
+ skillMd: buildSkillMd(skill),
66
+ files,
67
+ extension: skill.extension,
68
+ };
69
+ }
package/src/types.ts CHANGED
@@ -2130,6 +2130,15 @@ export interface SendMessageOptions {
2130
2130
  * runtime is forced local with no override path.
2131
2131
  */
2132
2132
  cloud?: AgentCloudOptions;
2133
+ /**
2134
+ * Clear cloud options retained by an existing continuation session before
2135
+ * starting this turn. Use when a caller intentionally moves a previously
2136
+ * cloud-attached session back to the agent's configured runtime. Cannot be
2137
+ * combined with {@link cloud}.
2138
+ *
2139
+ * On a new session this is a no-op.
2140
+ */
2141
+ clearCloudOverride?: boolean;
2133
2142
  /**
2134
2143
  * Seed the Cursor SDK agent id for a **new** session (ignored when the
2135
2144
  * continuation token matches an existing session). For cloud agents this
@@ -0,0 +1,35 @@
1
+ # Thermo quality review
2
+
3
+ Reviews pull requests for structural code quality. Posts one review comment.
4
+
5
+ ```bash
6
+ npx @cursor/july init ./thermo-quality-review --template thermo-quality-review
7
+ ```
8
+
9
+ ## Run hosted
10
+
11
+ ```bash
12
+ cd thermo-quality-review
13
+ agent-sdk login
14
+ agent-sdk deploy --cursor-events-repo acme/api
15
+ ```
16
+
17
+ The deployment watches that repo through your team's Cursor GitHub
18
+ connection. Open a PR to get a review.
19
+
20
+ ## Run locally
21
+
22
+ ```bash
23
+ agent-sdk dev --cursor-events --repo acme/api
24
+ ```
25
+
26
+ Or replay a PR without pushing:
27
+
28
+ ```bash
29
+ agent-sdk github replay https://github.com/acme/api/pull/12 --dir .
30
+ ```
31
+
32
+ ## Files
33
+
34
+ - `agent/instructions.md`: what counts as a finding
35
+ - `evals/review.eval.ts`: two smoke cases
@@ -0,0 +1,8 @@
1
+ import { defineAgent } from "@cursor/july";
2
+
3
+ export default defineAgent({
4
+ tools: ["read"],
5
+ local: {
6
+ sandbox: true,
7
+ },
8
+ });