@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
@@ -15,6 +15,7 @@ import type {
15
15
  DiscoveredSchedule,
16
16
  DiscoveredSkill,
17
17
  DiscoveredTool,
18
+ ExtensionContributionSelection,
18
19
  ExtensionMount,
19
20
  ResolvedAgent,
20
21
  SeedFile,
@@ -450,18 +451,25 @@ async function readExtensionTree(
450
451
  seedFiles: [],
451
452
  };
452
453
  }
453
- return readNativeTree(ctx, root);
454
+ return readNativeTree(ctx, root, mount.contributions);
454
455
  }
455
456
 
456
457
  async function readNativeTree(
457
458
  ctx: DiscoveryContext,
458
- root: string
459
+ root: string,
460
+ contributions?: ExtensionContributionSelection
459
461
  ): Promise<ExtensionTree> {
460
462
  await warnAgentRootOnlySlots(ctx, root);
461
463
  const connections = await loadConnections(ctx, join(root, "mcp-connections"));
462
464
  return {
463
- tools: await loadTools(ctx, join(root, "tools")),
464
- skills: await loadSkills(ctx, join(root, "skills")),
465
+ tools:
466
+ contributions?.tools === false
467
+ ? []
468
+ : await loadTools(ctx, join(root, "tools")),
469
+ skills:
470
+ contributions?.skills === false
471
+ ? []
472
+ : await loadSkills(ctx, join(root, "skills")),
465
473
  connections,
466
474
  hostConnections: await loadHostConnections(ctx, root, connections),
467
475
  overlaidServers: [],
@@ -80,6 +80,7 @@ export function projectInfo(project: AgentProject): AgentProjectInfo {
80
80
  name: connection.name,
81
81
  transport: connectionTransportLabel(connection.transport),
82
82
  advertiseTools: connection.advertiseTools,
83
+ optional: connection.optional,
83
84
  effects: connection.effects,
84
85
  tools: connection.tools,
85
86
  disallowedTools: connection.disallowedTools,
@@ -12,6 +12,7 @@ import { z } from "zod";
12
12
  import {
13
13
  canonicalizeFileSystemToolName,
14
14
  collectGrepMatches,
15
+ FILE_SYSTEM_SCAN_LIMIT,
15
16
  type FileSystem,
16
17
  type FileSystemToolName,
17
18
  fileSystemImage,
@@ -534,6 +535,7 @@ Tool to search for files matching a glob pattern
534
535
  await collectGlob(root, {
535
536
  pattern: globPattern,
536
537
  ...(targetDirectory === undefined ? {} : { dir: targetDirectory }),
538
+ limit: FILE_SYSTEM_SCAN_LIMIT,
537
539
  })
538
540
  ).map(entry => entry.path);
539
541
  return formatGlobOutput(dir, files);
@@ -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
 
@@ -149,6 +149,8 @@ export type HostedGuestError = {
149
149
  classification: HostedFailureClassification;
150
150
  message?: string;
151
151
  turnStatus?: string;
152
+ /** Runner/SDK code (`unknown`, `canceled`, …). Not the human message. */
153
+ errorCode?: string;
152
154
  };
153
155
 
154
156
  /**
@@ -162,6 +164,7 @@ export function hostedGuestErrorResponse(input: {
162
164
  retry: HostedGuestRetryDisposition;
163
165
  message?: string;
164
166
  turnStatus?: string;
167
+ errorCode?: string;
165
168
  }): Response {
166
169
  const body: HostedGuestError = {
167
170
  ok: false,
@@ -170,6 +173,7 @@ export function hostedGuestErrorResponse(input: {
170
173
  classification: hostedFailureClassification(input.error),
171
174
  message: input.message,
172
175
  turnStatus: input.turnStatus,
176
+ errorCode: input.errorCode,
173
177
  };
174
178
  return Response.json(body, { status: input.status });
175
179
  }
@@ -236,6 +240,20 @@ export type HostedAdmissionManagedAutomation = {
236
240
  slackChannels?: string[];
237
241
  };
238
242
 
243
+ /**
244
+ * Trusted control-plane handoff for a Slack placeholder posted at ingress
245
+ * before the Temporal signal. Omitted when no placeholder was posted.
246
+ */
247
+ export type HostedAdmissionPlatformHandoff = {
248
+ v: 1;
249
+ slackPlaceholder: {
250
+ messageTs: string;
251
+ channelId: string;
252
+ threadTs: string;
253
+ streamed: false;
254
+ };
255
+ };
256
+
239
257
  export type HostedAdmission = {
240
258
  v: 2;
241
259
  channelId: string;
@@ -251,6 +269,8 @@ export type HostedAdmission = {
251
269
  mailboxContinuationKey: string;
252
270
  payload: unknown;
253
271
  managedAutomation?: HostedAdmissionManagedAutomation;
272
+ /** Present only when control-plane Slack fast-act posted a placeholder. */
273
+ platformHandoff?: HostedAdmissionPlatformHandoff;
254
274
  };
255
275
 
256
276
  export type HostedAdmissionOutcome =
@@ -304,12 +324,19 @@ const DELIVERY_KEYS = new Set([
304
324
  "mailboxContinuationKey",
305
325
  "payload",
306
326
  "managedAutomation",
327
+ "platformHandoff",
307
328
  ]);
308
329
  const MANAGED_AUTOMATION_KEYS = new Set([
309
330
  "automationUuid",
310
331
  "mcpServerNames",
311
332
  "slackChannels",
312
333
  ]);
334
+ export const HOSTED_PLATFORM_HANDOFF_KEYS: ReadonlySet<string> = new Set([
335
+ "v",
336
+ "slackPlaceholder",
337
+ ]);
338
+ export const HOSTED_SLACK_PLACEHOLDER_HANDOFF_KEYS: ReadonlySet<string> =
339
+ new Set(["messageTs", "channelId", "threadTs", "streamed"]);
313
340
  /** More names than any real automation configures is a malformed envelope. */
314
341
  const MANAGED_AUTOMATION_MAX_SERVERS = 64;
315
342
  /** More channels than the dashboard picker allows is a malformed envelope. */
@@ -370,6 +397,59 @@ function parseManagedAutomation(
370
397
  };
371
398
  }
372
399
 
400
+ /**
401
+ * Parse optional control-plane Slack placeholder handoff. Absent → valid;
402
+ * present-but-malformed → invalid (fail closed like managedAutomation).
403
+ */
404
+ function parsePlatformHandoff(
405
+ value: unknown
406
+ ): { platformHandoff?: HostedAdmissionPlatformHandoff } | undefined {
407
+ if (value === undefined) {
408
+ return {};
409
+ }
410
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
411
+ return undefined;
412
+ }
413
+ const body = value as Record<string, unknown>;
414
+ if (
415
+ Object.keys(body).some(key => !HOSTED_PLATFORM_HANDOFF_KEYS.has(key)) ||
416
+ body.v !== 1
417
+ ) {
418
+ return undefined;
419
+ }
420
+ const placeholder = body.slackPlaceholder;
421
+ if (
422
+ typeof placeholder !== "object" ||
423
+ placeholder === null ||
424
+ Array.isArray(placeholder)
425
+ ) {
426
+ return undefined;
427
+ }
428
+ const slot = placeholder as Record<string, unknown>;
429
+ if (
430
+ Object.keys(slot).some(
431
+ key => !HOSTED_SLACK_PLACEHOLDER_HANDOFF_KEYS.has(key)
432
+ ) ||
433
+ !boundedString(slot.messageTs, 64) ||
434
+ !boundedString(slot.channelId, 64) ||
435
+ !boundedString(slot.threadTs, 64) ||
436
+ slot.streamed !== false
437
+ ) {
438
+ return undefined;
439
+ }
440
+ return {
441
+ platformHandoff: {
442
+ v: 1,
443
+ slackPlaceholder: {
444
+ messageTs: slot.messageTs,
445
+ channelId: slot.channelId,
446
+ threadTs: slot.threadTs,
447
+ streamed: slot.streamed,
448
+ },
449
+ },
450
+ };
451
+ }
452
+
373
453
  export function parseHostedAdmission(
374
454
  value: unknown
375
455
  ): HostedAdmission | undefined {
@@ -387,7 +467,8 @@ export function parseHostedAdmission(
387
467
  !boundedString(body.deliveryId, 256) ||
388
468
  (body.sessionMode !== "event" && body.sessionMode !== "continuation") ||
389
469
  !boundedString(body.mailboxContinuationKey, 512) ||
390
- parseManagedAutomation(body.managedAutomation) === undefined
470
+ parseManagedAutomation(body.managedAutomation) === undefined ||
471
+ parsePlatformHandoff(body.platformHandoff) === undefined
391
472
  ) {
392
473
  return undefined;
393
474
  }
@@ -14,6 +14,7 @@ import {
14
14
  createDeferredChannelSession,
15
15
  DeferredChannelSessionError,
16
16
  } from "./deferred-channel-session.js";
17
+ import { describeErrorCode } from "./describe-error.js";
17
18
  import {
18
19
  formatGuestNetworkServerTiming,
19
20
  GUEST_CONNECT_STALLED,
@@ -391,6 +392,7 @@ async function runAdmission(
391
392
  deliveryId: input.delivery.deliveryId,
392
393
  args,
393
394
  mailboxContinuationKey: input.delivery.mailboxContinuationKey,
395
+ platformHandoff: input.delivery.platformHandoff,
394
396
  });
395
397
  } catch (error) {
396
398
  const mapped = mappedAdmissionFailure(error);
@@ -888,6 +890,7 @@ export function registerHostedDeliveryRoute(input: {
888
890
  | ReturnType<typeof abortReasonFromTurnStatus>
889
891
  | "execute_throw";
890
892
  failureCode?: string;
893
+ errorCode?: string;
891
894
  error?: unknown;
892
895
  }): Promise<void> => {
893
896
  const classification =
@@ -910,6 +913,9 @@ export function registerHostedDeliveryRoute(input: {
910
913
  ? {}
911
914
  : { abortReason: fields.abortReason }),
912
915
  failureCode: fields.failureCode,
916
+ ...(fields.errorCode === undefined
917
+ ? {}
918
+ : { errorCode: fields.errorCode }),
913
919
  classification,
914
920
  ...(fields.error === undefined ? {} : { error: fields.error }),
915
921
  });
@@ -948,6 +954,13 @@ export function registerHostedDeliveryRoute(input: {
948
954
  },
949
955
  });
950
956
  sessionId = session.id;
957
+ // The pre-turn claim used an empty sessionId. Stamp the
958
+ // engine id now so a dashboard / session-view poll that
959
+ // only has the factory `ses_…` can follow `session-events/`.
960
+ await writeDiag({
961
+ sessionId,
962
+ turnStatus: HOSTED_EXECUTION_DIAG_RUNNING_STATUS,
963
+ });
951
964
  const outcome = await session.waitForCompletion();
952
965
  completionAt = hostedExecutionNow();
953
966
  // Status is the owner turn. waitForCompletion still waited
@@ -996,6 +1009,9 @@ export function registerHostedDeliveryRoute(input: {
996
1009
  outcome.cancellationReason
997
1010
  ),
998
1011
  failureCode: hostedFailure?.error,
1012
+ ...(outcome.errorCode === undefined
1013
+ ? {}
1014
+ : { errorCode: outcome.errorCode }),
999
1015
  });
1000
1016
  const reply =
1001
1017
  hostedFailure !== undefined
@@ -1010,6 +1026,9 @@ export function registerHostedDeliveryRoute(input: {
1010
1026
  ),
1011
1027
  turnStatus: outcome.status,
1012
1028
  message: outcome.errorMessage,
1029
+ ...(outcome.errorCode === undefined
1030
+ ? {}
1031
+ : { errorCode: outcome.errorCode }),
1013
1032
  },
1014
1033
  }
1015
1034
  : {
@@ -1039,6 +1058,7 @@ export function registerHostedDeliveryRoute(input: {
1039
1058
  sessionId,
1040
1059
  execution.sessionPublicId
1041
1060
  );
1061
+ const thrownErrorCode = describeErrorCode(error);
1042
1062
  await writeDiag({
1043
1063
  sessionId: "",
1044
1064
  turnStatus: "error",
@@ -1047,6 +1067,9 @@ export function registerHostedDeliveryRoute(input: {
1047
1067
  abortReason: "execute_throw",
1048
1068
  failureCode: "internal_error",
1049
1069
  error,
1070
+ ...(thrownErrorCode === undefined
1071
+ ? {}
1072
+ : { errorCode: thrownErrorCode }),
1050
1073
  });
1051
1074
  const endedAt = hostedExecutionNow();
1052
1075
  // Preserve completion/drain marks when the failure happened
@@ -43,7 +43,8 @@ export type HostedExecutionDiagAbortReason =
43
43
  /**
44
44
  * Bounded guest-side record of one hosted-execution attempt. No prompt,
45
45
  * tool content, or API key — the host copies known keys onto the Temporal
46
- * activity span for Datadog.
46
+ * activity span for Datadog. `errorCode` and `message` are logged ungated;
47
+ * `stack` stays behind the internal-diag gate.
47
48
  */
48
49
  export type HostedExecutionDiag = {
49
50
  v: typeof HOSTED_EXECUTION_DIAG_VERSION;
@@ -62,6 +63,8 @@ export type HostedExecutionDiag = {
62
63
  requestId?: string;
63
64
  abortReason?: HostedExecutionDiagAbortReason;
64
65
  failureCode?: string;
66
+ /** Runner/SDK code for the unfinished turn. Distinct from {@link failureCode}. */
67
+ errorCode?: string;
65
68
  classification?: HostedFailureClassification;
66
69
  };
67
70
 
@@ -82,6 +85,7 @@ const DIAG_KEYS = new Set([
82
85
  "requestId",
83
86
  "abortReason",
84
87
  "failureCode",
88
+ "errorCode",
85
89
  "classification",
86
90
  ]);
87
91
 
@@ -108,9 +112,9 @@ export const HOSTED_ERROR_STACK_LINE_COUNT = 5;
108
112
  export const HOSTED_ERROR_SNIPPET_MAX_CHARS = 700;
109
113
 
110
114
  /**
111
- * Bounded throw text for the hosted 500 body and the on-disk diag `stack`.
112
- * Prefers `Error.stack` (message line + `at` frames) so `last_error` is not
113
- * the generic "Internal server error." when the throw has a stack.
115
+ * Bounded throw text for on-disk diag `stack` (and non-hosted 500 bodies).
116
+ * Prefers `Error.stack` (message line + `at` frames). Hosted HTTP `message`
117
+ * uses {@link hostedErrorMessageOnly} so customer Datadog stays frame-free.
114
118
  */
115
119
  export function hostedErrorStackSnippet(error: unknown): string {
116
120
  if (error instanceof Error) {
@@ -139,6 +143,29 @@ export function hostedErrorStackSnippet(error: unknown): string {
139
143
  : text;
140
144
  }
141
145
 
146
+ /**
147
+ * Guest throw text without `at` frames. Hosted 500 `message` is ungated on
148
+ * TAS (`hostedGuestMessage` / `last_error`); stack frames stay on `stack`.
149
+ */
150
+ export function hostedErrorMessageOnly(error: unknown): string {
151
+ const text =
152
+ error instanceof Error && error.message.trim().length > 0
153
+ ? error.message.trim()
154
+ : String(error).trim();
155
+ if (text.length === 0) {
156
+ return "Internal server error.";
157
+ }
158
+ const firstFrame = text.search(/\n\s+at\s/);
159
+ const message =
160
+ firstFrame === -1 ? text : text.slice(0, firstFrame).trimEnd();
161
+ if (message.length === 0) {
162
+ return "Internal server error.";
163
+ }
164
+ return message.length > HOSTED_ERROR_SNIPPET_MAX_CHARS
165
+ ? `${message.slice(0, HOSTED_ERROR_SNIPPET_MAX_CHARS)}…`
166
+ : message;
167
+ }
168
+
142
169
  export function hostedExecutionDiagPath(stateRoot: string): string {
143
170
  return join(stateRoot, HOSTED_EXECUTION_DIAG_FILENAME);
144
171
  }
@@ -206,6 +233,7 @@ export function parseHostedExecutionDiag(
206
233
  );
207
234
  const requestId = boundedOptionalString(body.requestId, 128);
208
235
  const failureCode = boundedOptionalString(body.failureCode, 64);
236
+ const errorCode = boundedOptionalString(body.errorCode, 64);
209
237
  const classification =
210
238
  body.classification === undefined
211
239
  ? undefined
@@ -243,6 +271,7 @@ export function parseHostedExecutionDiag(
243
271
  ...(requestId === undefined ? {} : { requestId }),
244
272
  ...(abortReason === undefined ? {} : { abortReason }),
245
273
  ...(failureCode === undefined ? {} : { failureCode }),
274
+ ...(errorCode === undefined ? {} : { errorCode }),
246
275
  ...(classification === undefined ? {} : { classification }),
247
276
  };
248
277
  }
@@ -48,6 +48,7 @@ export type HostedExecutionFlushFields = {
48
48
  message?: string;
49
49
  abortReason?: HostedExecutionDiagAbortReason;
50
50
  failureCode?: string;
51
+ errorCode?: string;
51
52
  classification?: HostedFailureClassification;
52
53
  error?: unknown;
53
54
  };
@@ -83,6 +84,9 @@ export async function flushHostedExecutionRecord(
83
84
  ? {}
84
85
  : { abortReason: fields.abortReason }),
85
86
  failureCode: fields.failureCode,
87
+ ...(fields.errorCode === undefined
88
+ ? {}
89
+ : { errorCode: fields.errorCode }),
86
90
  classification: fields.classification,
87
91
  });
88
92
  }
@@ -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