@cursor/july 0.1.111 → 0.1.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/README.md +4 -0
  2. package/dist/bin/agent-serve.js +20 -4
  3. package/dist/channels/checks.d.ts +10 -0
  4. package/dist/channels/checks.d.ts.map +1 -1
  5. package/dist/channels/github/github-channel.d.ts +29 -19
  6. package/dist/channels/github/github-channel.d.ts.map +1 -1
  7. package/dist/channels/github/github-channel.js +29 -19
  8. package/dist/channels/origin/checks.d.ts +1 -1
  9. package/dist/channels/origin/checks.d.ts.map +1 -1
  10. package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
  11. package/dist/channels/slack/agentic-delivery.js +2 -0
  12. package/dist/channels/slack/dispatch.d.ts +11 -1
  13. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  14. package/dist/channels/slack/dispatch.js +146 -39
  15. package/dist/channels/slack/placeholder.d.ts +26 -0
  16. package/dist/channels/slack/placeholder.d.ts.map +1 -1
  17. package/dist/channels/slack/placeholder.js +28 -0
  18. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  19. package/dist/channels/slack/slack-channel.js +9 -16
  20. package/dist/docs/404.html +2 -2
  21. package/dist/docs/assets/{app.Drol6mi6.js → app.CAeK13eM.js} +4 -4
  22. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
  23. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
  24. package/dist/docs/assets/chunks/@localSearchIndexroot.Ck9E52Ls.js +1 -0
  25. package/dist/docs/assets/chunks/{VPLocalSearchBox.CdqoBZJX.js → VPLocalSearchBox.C9LbPHod.js} +1 -1
  26. package/dist/docs/assets/chunks/{arc.BVX3ycTn.js → arc.CmMq2zmS.js} +1 -1
  27. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CcChnMxX.js → architectureDiagram-Q4EWVU46.CCXB8Uj5.js} +1 -1
  28. package/dist/docs/assets/chunks/{baseUniq.xwtXO-yt.js → baseUniq.CyQo6eLe.js} +1 -1
  29. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CijZ_taK.js → blockDiagram-DXYQGD6D.JYq6w91N.js} +1 -1
  30. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.0FBvwBvK.js → c4Diagram-AHTNJAMY.BRV8GPJJ.js} +1 -1
  31. package/dist/docs/assets/chunks/channel.BHiYmnZ4.js +1 -0
  32. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CELMmMDA.js → chunk-4BX2VUAB.Bv4ooYQR.js} +1 -1
  33. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C4bhFtSm.js → chunk-4TB4RGXK.t4JtKPcj.js} +1 -1
  34. package/dist/docs/assets/chunks/{chunk-55IACEB6.ZnQ9gRRQ.js → chunk-55IACEB6.34lCHj9Y.js} +1 -1
  35. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DPlmglG-.js → chunk-EDXVE4YY.BSwrPNrt.js} +1 -1
  36. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BrUk8pff.js → chunk-FMBD7UC4.Beeun-R-.js} +1 -1
  37. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CcmWIncu.js → chunk-OYMX7WX6.BUUFUcJc.js} +1 -1
  38. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D65-cs8I.js → chunk-QZHKN3VN.B2XjHzN_.js} +1 -1
  39. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.qoXZpG9F.js → chunk-YZCP3GAM.CLYG8znk.js} +1 -1
  40. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Degh8l90.js +1 -0
  41. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Degh8l90.js +1 -0
  42. package/dist/docs/assets/chunks/clone.BIywbczV.js +1 -0
  43. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.8rYtqudO.js → cose-bilkent-S5V4N54A.DVEa6fZp.js} +1 -1
  44. package/dist/docs/assets/chunks/{dagre-KV5264BT.DrRP1fOh.js → dagre-KV5264BT.C9PZQK-S.js} +1 -1
  45. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DHj_xA2_.js → diagram-5BDNPKRD.DoN0uv3Y.js} +1 -1
  46. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Bz_6nAKj.js → diagram-G4DWMVQ6.Czv3duqx.js} +1 -1
  47. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BWA0xSW9.js → diagram-MMDJMWI5.BinJ5kWb.js} +1 -1
  48. package/dist/docs/assets/chunks/{diagram-TYMM5635.CpTJLNJI.js → diagram-TYMM5635.DW326M4K.js} +1 -1
  49. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.-7AWWSrP.js → erDiagram-SMLLAGMA.U2pR_OA7.js} +1 -1
  50. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BTnQ742_.js → flowDiagram-DWJPFMVM.ByWJXeYK.js} +1 -1
  51. package/dist/docs/assets/chunks/framework.BNw1pucY.js +19 -0
  52. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B5_HiiQ5.js → ganttDiagram-T4ZO3ILL.OquF0Rtg.js} +1 -1
  53. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CZcNTFZd.js → gitGraphDiagram-UUTBAWPF.Bpn01P7X.js} +1 -1
  54. package/dist/docs/assets/chunks/{graph.V2GLaab4.js → graph.CNRB6ETL.js} +1 -1
  55. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.7pZOkCCU.js → infoDiagram-42DDH7IO.CqhknMWi.js} +1 -1
  56. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js → ishikawaDiagram-UXIWVN3A.C6xpR2af.js} +1 -1
  57. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BNEgWN1S.js → journeyDiagram-VCZTEJTY.Cg5f7oB3.js} +1 -1
  58. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B-4d4tC7.js → kanban-definition-6JOO6SKY.Cx9YTwlU.js} +1 -1
  59. package/dist/docs/assets/chunks/{layout.Dvbn9nSb.js → layout.ljS-wFtK.js} +1 -1
  60. package/dist/docs/assets/chunks/{linear.D2GM4p4b.js → linear.jSxNrsFC.js} +1 -1
  61. package/dist/docs/assets/chunks/{min.DVBtLK-B.js → min.Cum8AlQw.js} +1 -1
  62. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CnJRI55x.js → mindmap-definition-QFDTVHPH.BLiysLpe.js} +1 -1
  63. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CtoaTFlA.js → pieDiagram-DEJITSTG.BoIDyuKF.js} +1 -1
  64. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DtT24_vN.js → quadrantDiagram-34T5L4WZ.DLkpDytR.js} +1 -1
  65. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CjSO4o8f.js → requirementDiagram-MS252O5E.DqTVqSu2.js} +1 -1
  66. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.-wWiIVWa.js → sankeyDiagram-XADWPNL6.CG_6FF7j.js} +1 -1
  67. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DSk8s4gX.js → sequenceDiagram-FGHM5R23.BIp9602K.js} +1 -1
  68. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BFKAsdkN.js → stateDiagram-FHFEXIEX.COSXsD9I.js} +1 -1
  69. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.qrxrbFsX.js +1 -0
  70. package/dist/docs/assets/chunks/{theme.C0MctGaz.js → theme.CXJ7PNwy.js} +2 -2
  71. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.TUNJbAFe.js → timeline-definition-GMOUNBTQ.CXdVqkLq.js} +1 -1
  72. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.C-RGNnk4.js → vennDiagram-DHZGUBPP.CZxGuc4r.js} +1 -1
  73. package/dist/docs/assets/chunks/{wardley-RL74JXVD.g5efOWmT.js → wardley-RL74JXVD.3oVgfqQk.js} +1 -1
  74. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DH4zt73Y.js → wardleyDiagram-NUSXRM2D.6_irCgGJ.js} +1 -1
  75. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B-3k6bF6.js → xychartDiagram-5P7HB3ND.TRPe92m3.js} +1 -1
  76. package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
  77. package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
  78. package/dist/docs/assets/evals.md.D3Y3Aixt.js +72 -0
  79. package/dist/docs/assets/evals.md.D3Y3Aixt.lean.js +1 -0
  80. package/dist/docs/assets/guides_agent-to-agent.md.CD4T5FIl.js +41 -0
  81. package/dist/docs/assets/guides_agent-to-agent.md.CD4T5FIl.lean.js +1 -0
  82. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
  83. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
  84. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
  85. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
  86. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
  87. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
  88. package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
  89. package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
  90. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
  91. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
  92. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
  93. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
  94. package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
  95. package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
  96. package/dist/docs/assets/guides_jev.md.F5fAkkfN.js +189 -0
  97. package/dist/docs/assets/guides_jev.md.F5fAkkfN.lean.js +1 -0
  98. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
  99. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
  100. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
  101. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
  102. package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
  103. package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
  104. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
  105. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
  106. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
  107. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
  108. package/dist/docs/assets/{index.md.BFVyY2KT.js → index.md.C-t81M5J.js} +2 -2
  109. package/dist/docs/assets/{index.md.BFVyY2KT.lean.js → index.md.C-t81M5J.lean.js} +1 -1
  110. package/dist/docs/assets/{quickstart.md.D3MjSZN-.js → quickstart.md.DAvVhuuU.js} +1 -1
  111. package/dist/docs/assets/{quickstart.md.D3MjSZN-.lean.js → quickstart.md.DAvVhuuU.lean.js} +1 -1
  112. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
  113. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
  114. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
  115. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
  116. package/dist/docs/assets/{reference_channels.md.icqLKcTc.js → reference_channels.md.nFWbzAic.js} +1 -1
  117. package/dist/docs/assets/{reference_channels.md.icqLKcTc.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
  118. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.js → reference_cli.md.DLWDz9ij.js} +3 -1
  119. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
  120. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.js → reference_connections.md.Je9dMsdd.js} +2 -2
  121. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.lean.js → reference_connections.md.Je9dMsdd.lean.js} +1 -1
  122. package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
  123. package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
  124. package/dist/docs/assets/reference_extensions.md.Cv5aLCz_.js +58 -0
  125. package/dist/docs/assets/reference_extensions.md.Cv5aLCz_.lean.js +1 -0
  126. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.js → reference_hooks.md.B7uzNENk.js} +2 -2
  127. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
  128. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.js → reference_http-api.md.CduHavZ2.js} +1 -1
  129. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
  130. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.js → reference_instructions.md.CU1My5My.js} +1 -1
  131. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
  132. package/dist/docs/assets/{reference_playground.md.D2YExv5K.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
  133. package/dist/docs/assets/{reference_playground.md.D2YExv5K.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
  134. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.js → reference_project-layout.md.BGhgpy9V.js} +1 -1
  135. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
  136. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.js → reference_prompt.md.Ccp0R53H.js} +1 -1
  137. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
  138. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
  139. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
  140. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
  141. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
  142. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.js → reference_skills.md.DjQkRefx.js} +1 -1
  143. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
  144. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.js → reference_subagents.md.Dl16gcBj.js} +2 -2
  145. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.lean.js → reference_subagents.md.Dl16gcBj.lean.js} +1 -1
  146. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.js → reference_tools.md.B1dH1lpa.js} +3 -3
  147. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.lean.js → reference_tools.md.B1dH1lpa.lean.js} +1 -1
  148. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.js → templates_agentic-owners.md.9M575F5C.js} +1 -1
  149. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
  150. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
  151. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
  152. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
  153. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
  154. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
  155. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
  156. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
  157. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
  158. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.js → templates_triage.md.CVGe_FG6.js} +1 -1
  159. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
  160. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
  161. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
  162. package/dist/docs/building-with-agents.html +44 -48
  163. package/dist/docs/building-with-agents.md +94 -82
  164. package/dist/docs/deployment.html +59 -78
  165. package/dist/docs/deployment.md +117 -363
  166. package/dist/docs/evals.html +85 -224
  167. package/dist/docs/evals.md +149 -673
  168. package/dist/docs/guides/agent-to-agent.html +74 -47
  169. package/dist/docs/guides/agent-to-agent.md +128 -46
  170. package/dist/docs/guides/bitbucket.html +179 -44
  171. package/dist/docs/guides/bitbucket.md +249 -48
  172. package/dist/docs/guides/cloud-agents.html +46 -40
  173. package/dist/docs/guides/cloud-agents.md +119 -66
  174. package/dist/docs/guides/convert-automation.html +80 -49
  175. package/dist/docs/guides/convert-automation.md +156 -147
  176. package/dist/docs/guides/github.html +184 -92
  177. package/dist/docs/guides/github.md +260 -245
  178. package/dist/docs/guides/gitlab.html +184 -45
  179. package/dist/docs/guides/gitlab.md +249 -50
  180. package/dist/docs/guides/grokbot-agents.html +48 -41
  181. package/dist/docs/guides/grokbot-agents.md +99 -53
  182. package/dist/docs/guides/improve.html +48 -40
  183. package/dist/docs/guides/improve.md +111 -58
  184. package/dist/docs/guides/jev.html +248 -0
  185. package/dist/docs/guides/jev.md +348 -0
  186. package/dist/docs/guides/mcp-oauth.html +74 -52
  187. package/dist/docs/guides/mcp-oauth.md +111 -121
  188. package/dist/docs/guides/opentelemetry.html +63 -54
  189. package/dist/docs/guides/opentelemetry.md +96 -165
  190. package/dist/docs/guides/slack.html +83 -59
  191. package/dist/docs/guides/slack.md +157 -227
  192. package/dist/docs/guides/webhooks.html +97 -230
  193. package/dist/docs/guides/webhooks.md +154 -385
  194. package/dist/docs/hashmap.json +1 -1
  195. package/dist/docs/hillclimbing.html +44 -38
  196. package/dist/docs/hillclimbing.md +101 -55
  197. package/dist/docs/index.html +38 -38
  198. package/dist/docs/index.md +2 -0
  199. package/dist/docs/llms-full.txt +3490 -3146
  200. package/dist/docs/llms.txt +22 -18
  201. package/dist/docs/quickstart.html +37 -37
  202. package/dist/docs/reference/agent-config.html +37 -37
  203. package/dist/docs/reference/artifacts.html +38 -38
  204. package/dist/docs/reference/channels.html +37 -37
  205. package/dist/docs/reference/cli.html +39 -37
  206. package/dist/docs/reference/cli.md +2 -0
  207. package/dist/docs/reference/connections.html +38 -38
  208. package/dist/docs/reference/connections.md +1 -1
  209. package/dist/docs/reference/evals.html +116 -0
  210. package/dist/docs/reference/evals.md +293 -0
  211. package/dist/docs/reference/extensions.html +80 -84
  212. package/dist/docs/reference/extensions.md +131 -202
  213. package/dist/docs/reference/hooks.html +39 -39
  214. package/dist/docs/reference/hooks.md +34 -34
  215. package/dist/docs/reference/http-api.html +37 -37
  216. package/dist/docs/reference/instructions.html +37 -37
  217. package/dist/docs/reference/playground.html +37 -37
  218. package/dist/docs/reference/project-layout.html +37 -37
  219. package/dist/docs/reference/prompt.html +37 -37
  220. package/dist/docs/reference/schedules.html +37 -37
  221. package/dist/docs/reference/sessions.html +37 -37
  222. package/dist/docs/reference/skills.html +37 -37
  223. package/dist/docs/reference/subagents.html +38 -38
  224. package/dist/docs/reference/subagents.md +1 -1
  225. package/dist/docs/reference/tools.html +38 -38
  226. package/dist/docs/reference/tools.md +4 -0
  227. package/dist/docs/templates/agentic-owners.html +38 -38
  228. package/dist/docs/templates/pr-autofixer.html +37 -37
  229. package/dist/docs/templates/security-reviewer.html +38 -38
  230. package/dist/docs/templates/thermo-quality-review.html +62 -0
  231. package/dist/docs/templates/thermo-quality-review.md +75 -0
  232. package/dist/docs/templates/thermo-review.html +62 -0
  233. package/dist/docs/templates/thermo-review.md +74 -0
  234. package/dist/docs/templates/triage.html +37 -37
  235. package/dist/docs/troubleshooting.html +38 -38
  236. package/dist/docs/troubleshooting.md +97 -66
  237. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  238. package/dist/extensions/improve/extension.d.ts +3 -1
  239. package/dist/extensions/improve/extension.d.ts.map +1 -1
  240. package/dist/extensions/improve/extension.js +4 -2
  241. package/dist/extensions/improve/skills/yourself.js +1 -1
  242. package/dist/extensions/jev/extension.d.ts +43 -0
  243. package/dist/extensions/jev/extension.d.ts.map +1 -0
  244. package/dist/extensions/jev/extension.js +47 -0
  245. package/dist/extensions/jev/lib/evaluate.d.ts +101 -0
  246. package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -0
  247. package/dist/extensions/jev/lib/evaluate.js +167 -0
  248. package/dist/extensions/jev/skills/gated-write.md +25 -0
  249. package/dist/extensions/jev/skills/questions.md +33 -0
  250. package/dist/extensions/jev/tools/evaluate.d.ts +4 -0
  251. package/dist/extensions/jev/tools/evaluate.d.ts.map +1 -0
  252. package/dist/extensions/jev/tools/evaluate.js +88 -0
  253. package/dist/extensions.d.ts +1 -1
  254. package/dist/extensions.d.ts.map +1 -1
  255. package/dist/extensions.js +2 -0
  256. package/dist/filesystem.d.ts +46 -2
  257. package/dist/filesystem.d.ts.map +1 -1
  258. package/dist/filesystem.js +149 -102
  259. package/dist/index.d.ts +2 -2
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +1 -1
  262. package/dist/internal/advertise-tools.d.ts.map +1 -1
  263. package/dist/internal/advertise-tools.js +6 -0
  264. package/dist/internal/cli-ax.d.ts +6 -0
  265. package/dist/internal/cli-ax.d.ts.map +1 -1
  266. package/dist/internal/cli-ax.js +72 -14
  267. package/dist/internal/continuation-identity.d.ts.map +1 -1
  268. package/dist/internal/continuation-identity.js +1 -0
  269. package/dist/internal/cursor-agent-template.d.ts +1 -1
  270. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  271. package/dist/internal/cursor-agent-template.js +2 -0
  272. package/dist/internal/discovery/connections.d.ts.map +1 -1
  273. package/dist/internal/discovery/connections.js +18 -0
  274. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  275. package/dist/internal/discovery/extensions.js +8 -4
  276. package/dist/internal/discovery/info.d.ts.map +1 -1
  277. package/dist/internal/discovery/info.js +1 -0
  278. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  279. package/dist/internal/filesystem/tools.js +2 -2
  280. package/dist/internal/filesystem/walk.d.ts +7 -4
  281. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  282. package/dist/internal/filesystem/walk.js +34 -11
  283. package/dist/internal/hosted-admission-adapter.d.ts +3 -0
  284. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  285. package/dist/internal/hosted-delivery-protocol.d.ts +20 -0
  286. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  287. package/dist/internal/hosted-delivery-protocol.js +51 -1
  288. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  289. package/dist/internal/hosted-delivery.js +23 -25
  290. package/dist/internal/hosted-execution-diag.d.ts +12 -4
  291. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  292. package/dist/internal/hosted-execution-diag.js +26 -4
  293. package/dist/internal/hosted-execution-flush.d.ts +1 -0
  294. package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
  295. package/dist/internal/hosted-execution-flush.js +4 -2
  296. package/dist/internal/init-project.d.ts.map +1 -1
  297. package/dist/internal/init-project.js +4 -0
  298. package/dist/internal/server.d.ts.map +1 -1
  299. package/dist/internal/server.js +111 -48
  300. package/dist/internal/session-engine.d.ts +4 -1
  301. package/dist/internal/session-engine.d.ts.map +1 -1
  302. package/dist/internal/session-engine.js +39 -9
  303. package/dist/internal/skill-catalog.d.ts +28 -0
  304. package/dist/internal/skill-catalog.d.ts.map +1 -0
  305. package/dist/internal/skill-catalog.js +44 -0
  306. package/dist/playground/assets/index-DSMAewbx.css +1 -0
  307. package/dist/playground/assets/index-De_lpFxE.js +67 -0
  308. package/dist/playground/index.html +2 -2
  309. package/dist/types.d.ts +32 -3
  310. package/dist/types.d.ts.map +1 -1
  311. package/docs/README.md +2 -0
  312. package/docs/building-with-agents.md +96 -84
  313. package/docs/deployment.md +118 -364
  314. package/docs/evals.md +149 -673
  315. package/docs/guides/agent-to-agent.md +130 -48
  316. package/docs/guides/bitbucket.md +250 -49
  317. package/docs/guides/cloud-agents.md +119 -67
  318. package/docs/guides/convert-automation.md +157 -148
  319. package/docs/guides/github.md +261 -246
  320. package/docs/guides/gitlab.md +250 -51
  321. package/docs/guides/grokbot-agents.md +100 -55
  322. package/docs/guides/improve.md +112 -59
  323. package/docs/guides/jev.md +353 -0
  324. package/docs/guides/mcp-oauth.md +112 -122
  325. package/docs/guides/opentelemetry.md +97 -166
  326. package/docs/guides/slack.md +158 -228
  327. package/docs/guides/webhooks.md +155 -386
  328. package/docs/hillclimbing.md +102 -56
  329. package/docs/reference/cli.md +2 -0
  330. package/docs/reference/connections.md +1 -1
  331. package/docs/reference/evals.md +298 -0
  332. package/docs/reference/extensions.md +132 -203
  333. package/docs/reference/hooks.md +34 -34
  334. package/docs/reference/subagents.md +1 -1
  335. package/docs/reference/tools.md +4 -0
  336. package/docs/templates/thermo-quality-review.md +80 -0
  337. package/docs/templates/thermo-review.md +79 -0
  338. package/docs/troubleshooting.md +98 -67
  339. package/package.json +8 -1
  340. package/skills/github/SKILL.md +21 -13
  341. package/src/bin/agent-serve.ts +24 -3
  342. package/src/channels/checks.ts +8 -0
  343. package/src/channels/github/github-channel.ts +29 -19
  344. package/src/channels/origin/checks.ts +3 -1
  345. package/src/channels/slack/agentic-delivery.ts +2 -0
  346. package/src/channels/slack/dispatch.ts +131 -4
  347. package/src/channels/slack/placeholder.ts +51 -0
  348. package/src/channels/slack/slack-channel.ts +9 -2
  349. package/src/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  350. package/src/extensions/improve/extension.ts +4 -2
  351. package/src/extensions/improve/skills/yourself.ts +1 -1
  352. package/src/extensions/jev/extension.ts +95 -0
  353. package/src/extensions/jev/lib/evaluate.ts +289 -0
  354. package/src/extensions/jev/skills/gated-write.md +25 -0
  355. package/src/extensions/jev/skills/questions.md +33 -0
  356. package/src/extensions/jev/tools/evaluate.ts +90 -0
  357. package/src/extensions.ts +2 -0
  358. package/src/filesystem.ts +168 -65
  359. package/src/index.ts +3 -0
  360. package/src/internal/advertise-tools.ts +6 -0
  361. package/src/internal/cli-ax.ts +88 -15
  362. package/src/internal/continuation-identity.ts +1 -0
  363. package/src/internal/cursor-agent-template.ts +2 -0
  364. package/src/internal/discovery/connections.ts +21 -0
  365. package/src/internal/discovery/extensions.ts +12 -4
  366. package/src/internal/discovery/info.ts +1 -0
  367. package/src/internal/filesystem/tools.ts +2 -0
  368. package/src/internal/filesystem/walk.ts +60 -15
  369. package/src/internal/hosted-admission-adapter.ts +3 -0
  370. package/src/internal/hosted-delivery-protocol.ts +82 -1
  371. package/src/internal/hosted-delivery.ts +23 -0
  372. package/src/internal/hosted-execution-diag.ts +33 -4
  373. package/src/internal/hosted-execution-flush.ts +4 -0
  374. package/src/internal/init-project.ts +4 -0
  375. package/src/internal/server.ts +130 -53
  376. package/src/internal/session-engine.ts +46 -8
  377. package/src/internal/skill-catalog.ts +69 -0
  378. package/src/types.ts +33 -3
  379. package/templates/thermo-quality-review/README.md +35 -0
  380. package/templates/thermo-quality-review/agent/agent.ts +8 -0
  381. package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
  382. package/templates/thermo-quality-review/agent/instructions.md +43 -0
  383. package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
  384. package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
  385. package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
  386. package/templates/thermo-quality-review/package.json +18 -0
  387. package/templates/thermo-quality-review/tsconfig.json +12 -0
  388. package/templates/thermo-review/README.md +35 -0
  389. package/templates/thermo-review/agent/agent.ts +8 -0
  390. package/templates/thermo-review/agent/channels/github.ts +42 -0
  391. package/templates/thermo-review/agent/instructions.md +40 -0
  392. package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
  393. package/templates/thermo-review/evals/evals.config.ts +5 -0
  394. package/templates/thermo-review/evals/review.eval.ts +53 -0
  395. package/templates/thermo-review/package.json +18 -0
  396. package/templates/thermo-review/tsconfig.json +12 -0
  397. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.js +0 -13
  398. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.lean.js +0 -1
  399. package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +0 -1
  400. package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +0 -1
  401. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +0 -1
  402. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +0 -1
  403. package/dist/docs/assets/chunks/clone.YSt_40_s.js +0 -1
  404. package/dist/docs/assets/chunks/framework.dypDpWZ3.js +0 -19
  405. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +0 -1
  406. package/dist/docs/assets/deployment.md.Dm4Qo3hp.js +0 -51
  407. package/dist/docs/assets/deployment.md.Dm4Qo3hp.lean.js +0 -1
  408. package/dist/docs/assets/evals.md.BLDRt5LH.js +0 -211
  409. package/dist/docs/assets/evals.md.BLDRt5LH.lean.js +0 -1
  410. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +0 -14
  411. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +0 -1
  412. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.js +0 -10
  413. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.lean.js +0 -1
  414. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.js +0 -9
  415. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.lean.js +0 -1
  416. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.js +0 -12
  417. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.lean.js +0 -1
  418. package/dist/docs/assets/guides_github.md.D6ER29dG.js +0 -64
  419. package/dist/docs/assets/guides_github.md.D6ER29dG.lean.js +0 -1
  420. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.js +0 -14
  421. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.lean.js +0 -1
  422. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +0 -9
  423. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.lean.js +0 -1
  424. package/dist/docs/assets/guides_improve.md.BKaDuKKK.js +0 -14
  425. package/dist/docs/assets/guides_improve.md.BKaDuKKK.lean.js +0 -1
  426. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.js +0 -28
  427. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.lean.js +0 -1
  428. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.js +0 -26
  429. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.lean.js +0 -1
  430. package/dist/docs/assets/guides_slack.md.DdT8rmsj.js +0 -46
  431. package/dist/docs/assets/guides_slack.md.DdT8rmsj.lean.js +0 -1
  432. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.js +0 -225
  433. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.lean.js +0 -1
  434. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +0 -1
  435. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +0 -1
  436. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.js +0 -62
  437. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.lean.js +0 -1
  438. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.js +0 -1
  439. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.lean.js +0 -1
  440. package/dist/playground/assets/index-BLlKgZtI.css +0 -1
  441. package/dist/playground/assets/index-CDS5p9sR.js +0 -67
@@ -137,7 +137,10 @@ import {
137
137
  HOSTED_GUEST_RETRY_TERMINAL,
138
138
  hostedGuestErrorResponse,
139
139
  } from "./hosted-delivery-protocol.js";
140
- import { hostedErrorStackSnippet } from "./hosted-execution-diag.js";
140
+ import {
141
+ hostedErrorMessageOnly,
142
+ hostedErrorStackSnippet,
143
+ } from "./hosted-execution-diag.js";
141
144
  import { flushHostedExecutionProcessDeath } from "./hosted-execution-flush.js";
142
145
  import {
143
146
  buildHttpChannelRoutes,
@@ -238,6 +241,11 @@ import {
238
241
  unregisterSessionRunFatalFlush,
239
242
  } from "./session-run-log.js";
240
243
  import { sessionUrlsForRequest } from "./session-urls.js";
244
+ import {
245
+ readSkillDetail,
246
+ skillListEntry,
247
+ UnknownSkillError,
248
+ } from "./skill-catalog.js";
241
249
  import { flushLocalStartLog, selectStartLogStore } from "./start-log-store.js";
242
250
  import { catalogDetailEntry, catalogListEntry } from "./tool-catalog.js";
243
251
 
@@ -1316,11 +1324,18 @@ export async function startServer(
1316
1324
  );
1317
1325
  }
1318
1326
  } else {
1327
+ const resolveCloudToolsHeaders =
1328
+ options.cloudToolsUrl === undefined
1329
+ ? undefined
1330
+ : (): Record<string, string> | undefined => {
1331
+ const apiKey = liveCursorApiKey();
1332
+ return apiKey === undefined
1333
+ ? undefined
1334
+ : { authorization: `Bearer ${apiKey}` };
1335
+ };
1319
1336
  const headers =
1320
1337
  options.cloudToolsUrl !== undefined
1321
- ? accountKey === undefined
1322
- ? undefined
1323
- : { authorization: `Bearer ${accountKey.apiKey}` }
1338
+ ? resolveCloudToolsHeaders?.()
1324
1339
  : options.authToken === undefined
1325
1340
  ? undefined
1326
1341
  : { authorization: `Bearer ${options.authToken}` };
@@ -1331,14 +1346,17 @@ export async function startServer(
1331
1346
  );
1332
1347
  }
1333
1348
  logger(
1334
- `[agent-sdk] --cloud-tools-url: listening unsigned; Bearer is taken from the key present at start`
1349
+ `[agent-sdk] --cloud-tools-url: listening unsigned; Bearer resolves after task-time credential binding`
1335
1350
  );
1336
1351
  }
1337
- runtime.engine.setCloudServerToolsConnection({
1338
- type: "http",
1339
- url: publicToolsUrl,
1340
- ...(headers === undefined ? {} : { headers }),
1341
- });
1352
+ runtime.engine.setCloudServerToolsConnection(
1353
+ {
1354
+ type: "http",
1355
+ url: publicToolsUrl,
1356
+ ...(headers === undefined ? {} : { headers }),
1357
+ },
1358
+ resolveCloudToolsHeaders
1359
+ );
1342
1360
  }
1343
1361
  }
1344
1362
  }
@@ -1568,7 +1586,15 @@ function mountAgentRoutes(
1568
1586
  }
1569
1587
  return null;
1570
1588
  };
1571
- if (noControlPlane === true && isV2Project(project)) {
1589
+ // A v2 mount served under `--no-control-plane` is a hosted v2 guest: the
1590
+ // hosted control plane drives it through the hosted delivery route below.
1591
+ // Session HTTP is a control-plane surface, so such a guest mounts no
1592
+ // `/v1/session*` or `/v1/sessions` routes — session starts arrive as hosted
1593
+ // admissions (`agentsdk.session` on the built-in http channel) and session
1594
+ // reads come from the control plane's runs surface and durable storage.
1595
+ // Local dev, self-hosted serve, and hosted v1 keep the engine mounts.
1596
+ const hostedV2Guest = noControlPlane === true && isV2Project(project);
1597
+ if (hostedV2Guest) {
1572
1598
  registerHostedDeliveryRoute({
1573
1599
  router,
1574
1600
  base,
@@ -1747,34 +1773,38 @@ function mountAgentRoutes(
1747
1773
  },
1748
1774
  });
1749
1775
 
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
- });
1776
+ // Session list is session surface: not mounted on a hosted v2 guest (the
1777
+ // control plane owns session reads there; see hostedV2Guest above).
1778
+ if (!hostedV2Guest) {
1779
+ router.add({
1780
+ method: "GET",
1781
+ pattern: `${base}/v1/sessions`,
1782
+ auth: httpAuth,
1783
+ handler: async (request, ctx) => {
1784
+ // Same gate as requireSessionOwner / relaxSessionReadAuth: never with
1785
+ // bearer or custom channel auth (strict per-principal isolation).
1786
+ // `--allow-anonymous` alone is a shared-principal trust boundary (corp
1787
+ // Okta ALB); `--dev` alone stays loopback-only.
1788
+ const includeAll =
1789
+ relaxSessionReadAuth &&
1790
+ (relaxSessionReadAuthBeyondLoopback ||
1791
+ (typeof ctx.requestIp === "string" &&
1792
+ isLoopbackAddress(ctx.requestIp)));
1793
+ // `?latest=1` only the newest visible session. Clients binding a
1794
+ // default session (agsh) do not need the whole list, and on hosted
1795
+ // storage the whole list is a database scan.
1796
+ const latest = new URL(request.url).searchParams.get("latest");
1797
+ const listed =
1798
+ latest === "1" || latest === "true"
1799
+ ? await engine.latestSessionWithSource(ctx.auth, { includeAll })
1800
+ : await engine.listSessionsWithSource(ctx.auth, { includeAll });
1801
+ return jsonResponse({
1802
+ sessions: listed.sessions,
1803
+ source: listed.source,
1804
+ });
1805
+ },
1806
+ });
1807
+ }
1778
1808
 
1779
1809
  // Durable artifacts (ctx.artifacts / tag_artifact), newest-updated first.
1780
1810
  router.add({
@@ -2084,6 +2114,45 @@ function mountAgentRoutes(
2084
2114
  },
2085
2115
  });
2086
2116
 
2117
+ // Deterministic skill reads: the body the harness would receive, plus
2118
+ // resolved sibling files. Read-only, so plain GETs with no session binding.
2119
+ router.add({
2120
+ method: "GET",
2121
+ pattern: `${base}/v1/skills`,
2122
+ auth: httpAuth,
2123
+ handler: async () =>
2124
+ jsonResponse({
2125
+ skills: project.agent.skills.map(skillListEntry),
2126
+ }),
2127
+ });
2128
+
2129
+ router.add({
2130
+ method: "GET",
2131
+ pattern: `${base}/v1/skills/:skillName`,
2132
+ auth: httpAuth,
2133
+ handler: async (_request, ctx) => {
2134
+ const skillName = ctx.params.skillName ?? "";
2135
+ try {
2136
+ return jsonResponse(
2137
+ await readSkillDetail(project.agent.skills, skillName)
2138
+ );
2139
+ } catch (error) {
2140
+ if (error instanceof UnknownSkillError) {
2141
+ return jsonResponse(
2142
+ {
2143
+ ok: false,
2144
+ error: "unknown_skill",
2145
+ message: error.message,
2146
+ availableSkills: error.availableSkillNames,
2147
+ },
2148
+ { status: 404 }
2149
+ );
2150
+ }
2151
+ throw error;
2152
+ }
2153
+ },
2154
+ });
2155
+
2087
2156
  if (playground) {
2088
2157
  // Serve the built Vite SPA. `<base href>` is injected so the SPA's relative
2089
2158
  // asset URLs resolve under this mount regardless of the trailing slash the
@@ -2107,18 +2176,25 @@ function mountAgentRoutes(
2107
2176
  });
2108
2177
  }
2109
2178
 
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);
2179
+ // The built-in HTTP session channel (`/v1/session*`, including the
2180
+ // session-scoped approvals/auths routes) is session surface: not mounted on
2181
+ // a hosted v2 guest (see hostedV2Guest above). The `http` channel itself
2182
+ // stays registered with the hosted delivery route, which is how the control
2183
+ // plane's session starts reach it.
2184
+ if (!hostedV2Guest) {
2185
+ for (const route of buildHttpChannelRoutes({
2186
+ engine,
2187
+ config: project.httpChannel,
2188
+ auth: httpAuth,
2189
+ basePath: base,
2190
+ // Dev playground lists every session (`includeAll`); allow opening them
2191
+ // (see relaxSessionReadAuth above).
2192
+ relaxSessionReadAuth,
2193
+ relaxSessionReadAuthBeyondLoopback,
2194
+ relaxSessionApprovalAuth,
2195
+ })) {
2196
+ router.add(route);
2197
+ }
2122
2198
  }
2123
2199
 
2124
2200
  // Playground eval list/run — available without `--dev` (corp / allow-anonymous).
@@ -3087,8 +3163,9 @@ async function handleRequest(
3087
3163
  }`
3088
3164
  );
3089
3165
  const snippet = hostedErrorStackSnippet(error);
3090
- const message =
3091
- snippet.length > 0
3166
+ const message = hostedDeliveryRequest
3167
+ ? hostedErrorMessageOnly(error)
3168
+ : snippet.length > 0
3092
3169
  ? `Internal server error: ${snippet}`
3093
3170
  : "Internal server error.";
3094
3171
  response = hostedDeliveryRequest
@@ -591,6 +591,10 @@ export class SessionEngine {
591
591
  private resolvedConnections: EngineResolvedConnection[] = [];
592
592
  /** Direct server-tool HTTP MCP transport exposed only to cloud turns. */
593
593
  private cloudServerToolsConnection: ConnectionTransport | undefined;
594
+ /** Re-resolved after hosted v2 task binding writes the Cursor credential. */
595
+ private cloudServerToolsHeaders:
596
+ | (() => Record<string, string> | undefined)
597
+ | undefined;
594
598
  private readonly getCloudUsage: (
595
599
  sdkAgentId: string
596
600
  ) => Promise<CloudAgentUsage | undefined>;
@@ -756,8 +760,30 @@ export class SessionEngine {
756
760
  );
757
761
  }
758
762
 
759
- setCloudServerToolsConnection(connection: ConnectionTransport): void {
763
+ setCloudServerToolsConnection(
764
+ connection: ConnectionTransport,
765
+ resolveHeaders?: () => Record<string, string> | undefined
766
+ ): void {
760
767
  this.cloudServerToolsConnection = connection;
768
+ this.cloudServerToolsHeaders = resolveHeaders;
769
+ }
770
+
771
+ private currentCloudServerToolsConnection(): ConnectionTransport | undefined {
772
+ const connection = this.cloudServerToolsConnection;
773
+ const resolveHeaders = this.cloudServerToolsHeaders;
774
+ if (
775
+ connection === undefined ||
776
+ !("url" in connection) ||
777
+ resolveHeaders === undefined
778
+ ) {
779
+ return connection;
780
+ }
781
+ const { headers: _headers, ...withoutHeaders } = connection;
782
+ const headers = resolveHeaders();
783
+ return {
784
+ ...withoutHeaders,
785
+ ...(headers === undefined ? {} : { headers }),
786
+ };
761
787
  }
762
788
 
763
789
  setMcpOauthCallbackUrl(url: string): void {
@@ -1037,6 +1063,11 @@ export class SessionEngine {
1037
1063
  // on a sessionless pod.
1038
1064
  throw new HostedAdmissionLocalSendError();
1039
1065
  }
1066
+ if (options.clearCloudOverride === true && options.cloud !== undefined) {
1067
+ throw new Error(
1068
+ "send options cloud and clearCloudOverride cannot be combined"
1069
+ );
1070
+ }
1040
1071
  const identity =
1041
1072
  channelId === HTTP_CHANNEL_ID
1042
1073
  ? httpContinuationIdentity(this.project.httpChannel)
@@ -1127,11 +1158,18 @@ export class SessionEngine {
1127
1158
  ),
1128
1159
  }));
1129
1160
  }
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.
1161
+ // A caller can explicitly return a continuation to the agent's
1162
+ // configured runtime. Omission remains sticky for compatibility:
1163
+ // follow-ups that do not know the original attach keep it.
1134
1164
  if (
1165
+ sendOptions.clearCloudOverride === true &&
1166
+ record.cloudOverride !== undefined
1167
+ ) {
1168
+ record = await this.updateRecord(record.sessionId, current => ({
1169
+ ...current,
1170
+ cloudOverride: undefined,
1171
+ }));
1172
+ } else if (
1135
1173
  sendOptions.cloud !== undefined &&
1136
1174
  JSON.stringify(sendOptions.cloud) !==
1137
1175
  JSON.stringify(record.cloudOverride)
@@ -3184,7 +3222,7 @@ export class SessionEngine {
3184
3222
  sessionId: string,
3185
3223
  connectionName: string
3186
3224
  ): ConnectionTransport | undefined {
3187
- const connection = this.cloudServerToolsConnection;
3225
+ const connection = this.currentCloudServerToolsConnection();
3188
3226
  if (connection === undefined || !("url" in connection)) {
3189
3227
  return undefined;
3190
3228
  }
@@ -3338,8 +3376,8 @@ export class SessionEngine {
3338
3376
  `MCP connection name "${SERVER_TOOLS_MCP_SERVER_NAME}" is reserved for authored server tools on cloud turns.`
3339
3377
  );
3340
3378
  }
3341
- const connection = this.cloudServerToolsConnection;
3342
- if ("url" in connection) {
3379
+ const connection = this.currentCloudServerToolsConnection();
3380
+ if (connection !== undefined && "url" in connection) {
3343
3381
  const url = new URL(connection.url);
3344
3382
  url.searchParams.set("agentkitSessionId", sessionId);
3345
3383
  servers[SERVER_TOOLS_MCP_SERVER_NAME] = {
@@ -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
@@ -1147,6 +1147,16 @@ export interface ExtensionOptions<TConfig, TInput = TConfig> {
1147
1147
  description?: string;
1148
1148
  /** Mount configuration schema. A consumer's settings are validated at mount. */
1149
1149
  config?: z.ZodType<TConfig, z.ZodTypeDef, TInput>;
1150
+ /** Choose which contribution groups this mount includes. */
1151
+ contributions?: (config: TConfig) => ExtensionContributionSelection;
1152
+ }
1153
+
1154
+ /** Contribution groups a configured extension mount may include or omit. */
1155
+ export interface ExtensionContributionSelection {
1156
+ /** Include tools from the extension tree. Defaults to true. */
1157
+ tools?: boolean;
1158
+ /** Include skills from the extension tree. Defaults to true. */
1159
+ skills?: boolean;
1150
1160
  }
1151
1161
 
1152
1162
  /**
@@ -1181,6 +1191,7 @@ export interface CursorPluginDeclaration extends ExtensionDeclaration {
1181
1191
  export interface ExtensionMount extends BrandedDefinition<"extension"> {
1182
1192
  readonly extension: ExtensionDeclaration | CursorPluginDeclaration;
1183
1193
  readonly config: unknown;
1194
+ readonly contributions?: ExtensionContributionSelection;
1184
1195
  }
1185
1196
 
1186
1197
  /** `cursorPlugin({ ... })`: mount a Cursor plugin directory as an extension. */
@@ -1479,13 +1490,20 @@ export type ConnectionConfig = (
1479
1490
  * Fail-closed: a `listTools` failure, an invalid tool name, or a name
1480
1491
  * collision (with an authored tool or another advertised connection)
1481
1492
  * fails the turn — a turn never silently runs with a shrunken toolset.
1482
- * Local runtime only, like all server tools: a `runtime: "cloud"` agent
1483
- * fails discovery, and hybrid per-send cloud sessions refuse the turn.
1484
- * The listing runs once per turn; point this at endpoints that can
1493
+ * Set {@link optional} to skip this connection instead of failing the
1494
+ * turn. Local runtime only, like all server tools: a `runtime: "cloud"`
1495
+ * agent fails discovery, and hybrid per-send cloud sessions refuse the
1496
+ * turn. The listing runs once per turn; point this at endpoints that can
1485
1497
  * answer `tools/list` cheaply. Tools whose MCP `annotations.title` is
1486
1498
  * `do-not-call` are omitted (vendor host-UI / MCP Apps helpers).
1487
1499
  */
1488
1500
  advertiseTools?: boolean;
1501
+ /**
1502
+ * With {@link advertiseTools}, a `listTools` or `auth` failure skips this
1503
+ * connection (zero tools from it) instead of failing the turn. Other
1504
+ * advertised connections still fail closed. Requires `advertiseTools`.
1505
+ */
1506
+ optional?: boolean;
1489
1507
  /**
1490
1508
  * Intended effects of tools this connection serves. When set, only
1491
1509
  * tools whose classified effect is in this set are advertised — a
@@ -2130,6 +2148,15 @@ export interface SendMessageOptions {
2130
2148
  * runtime is forced local with no override path.
2131
2149
  */
2132
2150
  cloud?: AgentCloudOptions;
2151
+ /**
2152
+ * Clear cloud options retained by an existing continuation session before
2153
+ * starting this turn. Use when a caller intentionally moves a previously
2154
+ * cloud-attached session back to the agent's configured runtime. Cannot be
2155
+ * combined with {@link cloud}.
2156
+ *
2157
+ * On a new session this is a no-op.
2158
+ */
2159
+ clearCloudOverride?: boolean;
2133
2160
  /**
2134
2161
  * Seed the Cursor SDK agent id for a **new** session (ignored when the
2135
2162
  * continuation token matches an existing session). For cloud agents this
@@ -3237,6 +3264,8 @@ export interface DiscoveredConnection {
3237
3264
  auth?: ConnectionAuthProvider;
3238
3265
  /** Advertise-by-name from {@link ConnectionConfig.advertiseTools}. */
3239
3266
  advertiseTools?: boolean;
3267
+ /** Skip a listing failure instead of failing the turn. */
3268
+ optional?: boolean;
3240
3269
  /**
3241
3270
  * Normalized intended effects from {@link ConnectionConfig.effects}.
3242
3271
  * Absent means every listed tool is advertised.
@@ -3415,6 +3444,7 @@ export interface AgentProjectInfo {
3415
3444
  name: string;
3416
3445
  transport: string;
3417
3446
  advertiseTools?: boolean;
3447
+ optional?: boolean;
3418
3448
  effects?: readonly ToolEffect[];
3419
3449
  tools?: readonly string[];
3420
3450
  disallowedTools?: readonly string[];
@@ -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
+ });
@@ -0,0 +1,42 @@
1
+ import {
2
+ defaultGitHubPullRequestDispatch,
3
+ githubChannel,
4
+ } from "@cursor/july/channels/github";
5
+
6
+ const MAX_DIFF_CHARS = 150_000;
7
+
8
+ export default githubChannel({
9
+ cursorAccount: true,
10
+ deliverReplies: false,
11
+ onComment: () => null,
12
+ onPullRequest: (ctx, pr) => {
13
+ if (pr.draft) {
14
+ return null;
15
+ }
16
+ const dispatch = defaultGitHubPullRequestDispatch(ctx, pr);
17
+ if (dispatch === null) {
18
+ return null;
19
+ }
20
+ return {
21
+ auth: dispatch.auth,
22
+ context: ["Read pr/diff.patch."],
23
+ async workspaceFiles() {
24
+ const octokit = await ctx.github.getOctokit();
25
+ const diff = await octokit.rest.pulls.get({
26
+ owner: ctx.repository.owner,
27
+ repo: ctx.repository.name,
28
+ pull_number: pr.number,
29
+ mediaType: { format: "diff" },
30
+ });
31
+ const text = String(diff.data);
32
+ return {
33
+ "pr/diff.patch":
34
+ text.length > MAX_DIFF_CHARS
35
+ ? `${text.slice(0, MAX_DIFF_CHARS)}\n…[truncated]\n`
36
+ : text,
37
+ "pr/head.sha": pr.headSha,
38
+ };
39
+ },
40
+ };
41
+ },
42
+ });
@@ -0,0 +1,43 @@
1
+ # Thermo quality review
2
+
3
+ You review pull requests for structural code quality. Be ambitious:
4
+ look for restructures that delete whole branches, helpers, or layers,
5
+ not tidier versions of the same idea.
6
+
7
+ ## Hunt
8
+
9
+ - Missed code-judo moves: reframings that make complexity disappear.
10
+ - Spaghetti growth: new conditionals or special cases bolted onto
11
+ unrelated flows. Push them behind their own abstraction.
12
+ - Files the PR pushes past 1,000 lines. Ask for decomposition first.
13
+ - Feature logic leaking into shared paths. Isolate it.
14
+ - Wrappers, casts, `any`, and optionality that hide the real contract.
15
+ - Bespoke helpers where a canonical one exists. Reuse it.
16
+ - Gratuitous sequential orchestration and half-applied updates.
17
+
18
+ ## Skip
19
+
20
+ - Style nits and behavior disputes.
21
+ - Renames when the real issue is structural.
22
+
23
+ ## Bar
24
+
25
+ Approve only with no structural regression, no unjustified size
26
+ explosion, and no obvious missed simplification. Otherwise push for
27
+ the cleaner decomposition.
28
+
29
+ ## Review
30
+
31
+ The workspace has `pr/diff.patch`. Read it once. Call `post_findings`
32
+ once with structured findings. Reply with the count and one line per
33
+ finding. Clean review: empty findings.
34
+
35
+ The host writes the GitHub comment. Verdict is CLEAN when the list
36
+ is empty.
37
+
38
+ ## Finding
39
+
40
+ - `severity`: `high`, `medium`, or `low`
41
+ - `file`, `line`: path and line in the diff
42
+ - `title`: short name
43
+ - `detail`: one-line impact and fix