@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.
- package/README.md +4 -0
- package/dist/bin/agent-serve.js +20 -4
- package/dist/channels/checks.d.ts +10 -0
- package/dist/channels/checks.d.ts.map +1 -1
- package/dist/channels/github/github-channel.d.ts +29 -19
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +29 -19
- package/dist/channels/origin/checks.d.ts +1 -1
- package/dist/channels/origin/checks.d.ts.map +1 -1
- package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
- package/dist/channels/slack/agentic-delivery.js +2 -0
- package/dist/channels/slack/dispatch.d.ts +11 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +146 -39
- package/dist/channels/slack/placeholder.d.ts +26 -0
- package/dist/channels/slack/placeholder.d.ts.map +1 -1
- package/dist/channels/slack/placeholder.js +28 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +9 -16
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.Drol6mi6.js → app.CAeK13eM.js} +4 -4
- package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
- package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.Ck9E52Ls.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CdqoBZJX.js → VPLocalSearchBox.C9LbPHod.js} +1 -1
- package/dist/docs/assets/chunks/{arc.BVX3ycTn.js → arc.CmMq2zmS.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CcChnMxX.js → architectureDiagram-Q4EWVU46.CCXB8Uj5.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.xwtXO-yt.js → baseUniq.CyQo6eLe.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CijZ_taK.js → blockDiagram-DXYQGD6D.JYq6w91N.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.0FBvwBvK.js → c4Diagram-AHTNJAMY.BRV8GPJJ.js} +1 -1
- package/dist/docs/assets/chunks/channel.BHiYmnZ4.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CELMmMDA.js → chunk-4BX2VUAB.Bv4ooYQR.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C4bhFtSm.js → chunk-4TB4RGXK.t4JtKPcj.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.ZnQ9gRRQ.js → chunk-55IACEB6.34lCHj9Y.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DPlmglG-.js → chunk-EDXVE4YY.BSwrPNrt.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BrUk8pff.js → chunk-FMBD7UC4.Beeun-R-.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CcmWIncu.js → chunk-OYMX7WX6.BUUFUcJc.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D65-cs8I.js → chunk-QZHKN3VN.B2XjHzN_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.qoXZpG9F.js → chunk-YZCP3GAM.CLYG8znk.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Degh8l90.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Degh8l90.js +1 -0
- package/dist/docs/assets/chunks/clone.BIywbczV.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.8rYtqudO.js → cose-bilkent-S5V4N54A.DVEa6fZp.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.DrRP1fOh.js → dagre-KV5264BT.C9PZQK-S.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DHj_xA2_.js → diagram-5BDNPKRD.DoN0uv3Y.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Bz_6nAKj.js → diagram-G4DWMVQ6.Czv3duqx.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BWA0xSW9.js → diagram-MMDJMWI5.BinJ5kWb.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.CpTJLNJI.js → diagram-TYMM5635.DW326M4K.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.-7AWWSrP.js → erDiagram-SMLLAGMA.U2pR_OA7.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BTnQ742_.js → flowDiagram-DWJPFMVM.ByWJXeYK.js} +1 -1
- package/dist/docs/assets/chunks/framework.BNw1pucY.js +19 -0
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B5_HiiQ5.js → ganttDiagram-T4ZO3ILL.OquF0Rtg.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CZcNTFZd.js → gitGraphDiagram-UUTBAWPF.Bpn01P7X.js} +1 -1
- package/dist/docs/assets/chunks/{graph.V2GLaab4.js → graph.CNRB6ETL.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.7pZOkCCU.js → infoDiagram-42DDH7IO.CqhknMWi.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js → ishikawaDiagram-UXIWVN3A.C6xpR2af.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BNEgWN1S.js → journeyDiagram-VCZTEJTY.Cg5f7oB3.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B-4d4tC7.js → kanban-definition-6JOO6SKY.Cx9YTwlU.js} +1 -1
- package/dist/docs/assets/chunks/{layout.Dvbn9nSb.js → layout.ljS-wFtK.js} +1 -1
- package/dist/docs/assets/chunks/{linear.D2GM4p4b.js → linear.jSxNrsFC.js} +1 -1
- package/dist/docs/assets/chunks/{min.DVBtLK-B.js → min.Cum8AlQw.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CnJRI55x.js → mindmap-definition-QFDTVHPH.BLiysLpe.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CtoaTFlA.js → pieDiagram-DEJITSTG.BoIDyuKF.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DtT24_vN.js → quadrantDiagram-34T5L4WZ.DLkpDytR.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CjSO4o8f.js → requirementDiagram-MS252O5E.DqTVqSu2.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.-wWiIVWa.js → sankeyDiagram-XADWPNL6.CG_6FF7j.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DSk8s4gX.js → sequenceDiagram-FGHM5R23.BIp9602K.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BFKAsdkN.js → stateDiagram-FHFEXIEX.COSXsD9I.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.qrxrbFsX.js +1 -0
- package/dist/docs/assets/chunks/{theme.C0MctGaz.js → theme.CXJ7PNwy.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.TUNJbAFe.js → timeline-definition-GMOUNBTQ.CXdVqkLq.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.C-RGNnk4.js → vennDiagram-DHZGUBPP.CZxGuc4r.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.g5efOWmT.js → wardley-RL74JXVD.3oVgfqQk.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DH4zt73Y.js → wardleyDiagram-NUSXRM2D.6_irCgGJ.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B-3k6bF6.js → xychartDiagram-5P7HB3ND.TRPe92m3.js} +1 -1
- package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
- package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
- package/dist/docs/assets/evals.md.D3Y3Aixt.js +72 -0
- package/dist/docs/assets/evals.md.D3Y3Aixt.lean.js +1 -0
- package/dist/docs/assets/guides_agent-to-agent.md.CD4T5FIl.js +41 -0
- package/dist/docs/assets/guides_agent-to-agent.md.CD4T5FIl.lean.js +1 -0
- package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
- package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
- package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
- package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
- package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
- package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
- package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
- package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
- package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
- package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
- package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
- package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
- package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
- package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
- package/dist/docs/assets/guides_jev.md.F5fAkkfN.js +189 -0
- package/dist/docs/assets/guides_jev.md.F5fAkkfN.lean.js +1 -0
- package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
- package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
- package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
- package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
- package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
- package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
- package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
- package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
- package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
- package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
- package/dist/docs/assets/{index.md.BFVyY2KT.js → index.md.C-t81M5J.js} +2 -2
- package/dist/docs/assets/{index.md.BFVyY2KT.lean.js → index.md.C-t81M5J.lean.js} +1 -1
- package/dist/docs/assets/{quickstart.md.D3MjSZN-.js → quickstart.md.DAvVhuuU.js} +1 -1
- package/dist/docs/assets/{quickstart.md.D3MjSZN-.lean.js → quickstart.md.DAvVhuuU.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.icqLKcTc.js → reference_channels.md.nFWbzAic.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.icqLKcTc.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.B2dBL6L8.js → reference_cli.md.DLWDz9ij.js} +3 -1
- package/dist/docs/assets/{reference_cli.md.B2dBL6L8.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.js → reference_connections.md.Je9dMsdd.js} +2 -2
- package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.lean.js → reference_connections.md.Je9dMsdd.lean.js} +1 -1
- package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
- package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
- package/dist/docs/assets/reference_extensions.md.Cv5aLCz_.js +58 -0
- package/dist/docs/assets/reference_extensions.md.Cv5aLCz_.lean.js +1 -0
- package/dist/docs/assets/{reference_hooks.md.CZuynAxj.js → reference_hooks.md.B7uzNENk.js} +2 -2
- package/dist/docs/assets/{reference_hooks.md.CZuynAxj.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.js → reference_http-api.md.CduHavZ2.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.D7gkckK-.js → reference_instructions.md.CU1My5My.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.D7gkckK-.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.D2YExv5K.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.D2YExv5K.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.js → reference_project-layout.md.BGhgpy9V.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.js → reference_prompt.md.Ccp0R53H.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.BasfZWO-.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.BasfZWO-.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.rNgpsGd0.js → reference_skills.md.DjQkRefx.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.rNgpsGd0.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.e5qitjJt.js → reference_subagents.md.Dl16gcBj.js} +2 -2
- package/dist/docs/assets/{reference_subagents.md.e5qitjJt.lean.js → reference_subagents.md.Dl16gcBj.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.js → reference_tools.md.B1dH1lpa.js} +3 -3
- package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.lean.js → reference_tools.md.B1dH1lpa.lean.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.js → templates_agentic-owners.md.9M575F5C.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
- package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
- package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
- package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
- package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
- package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.js → templates_triage.md.CVGe_FG6.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
- package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
- package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
- package/dist/docs/building-with-agents.html +44 -48
- package/dist/docs/building-with-agents.md +94 -82
- package/dist/docs/deployment.html +59 -78
- package/dist/docs/deployment.md +117 -363
- package/dist/docs/evals.html +85 -224
- package/dist/docs/evals.md +149 -673
- package/dist/docs/guides/agent-to-agent.html +74 -47
- package/dist/docs/guides/agent-to-agent.md +128 -46
- package/dist/docs/guides/bitbucket.html +179 -44
- package/dist/docs/guides/bitbucket.md +249 -48
- package/dist/docs/guides/cloud-agents.html +46 -40
- package/dist/docs/guides/cloud-agents.md +119 -66
- package/dist/docs/guides/convert-automation.html +80 -49
- package/dist/docs/guides/convert-automation.md +156 -147
- package/dist/docs/guides/github.html +184 -92
- package/dist/docs/guides/github.md +260 -245
- package/dist/docs/guides/gitlab.html +184 -45
- package/dist/docs/guides/gitlab.md +249 -50
- package/dist/docs/guides/grokbot-agents.html +48 -41
- package/dist/docs/guides/grokbot-agents.md +99 -53
- package/dist/docs/guides/improve.html +48 -40
- package/dist/docs/guides/improve.md +111 -58
- package/dist/docs/guides/jev.html +248 -0
- package/dist/docs/guides/jev.md +348 -0
- package/dist/docs/guides/mcp-oauth.html +74 -52
- package/dist/docs/guides/mcp-oauth.md +111 -121
- package/dist/docs/guides/opentelemetry.html +63 -54
- package/dist/docs/guides/opentelemetry.md +96 -165
- package/dist/docs/guides/slack.html +83 -59
- package/dist/docs/guides/slack.md +157 -227
- package/dist/docs/guides/webhooks.html +97 -230
- package/dist/docs/guides/webhooks.md +154 -385
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +44 -38
- package/dist/docs/hillclimbing.md +101 -55
- package/dist/docs/index.html +38 -38
- package/dist/docs/index.md +2 -0
- package/dist/docs/llms-full.txt +3490 -3146
- package/dist/docs/llms.txt +22 -18
- package/dist/docs/quickstart.html +37 -37
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/artifacts.html +38 -38
- package/dist/docs/reference/channels.html +37 -37
- package/dist/docs/reference/cli.html +39 -37
- package/dist/docs/reference/cli.md +2 -0
- package/dist/docs/reference/connections.html +38 -38
- package/dist/docs/reference/connections.md +1 -1
- package/dist/docs/reference/evals.html +116 -0
- package/dist/docs/reference/evals.md +293 -0
- package/dist/docs/reference/extensions.html +80 -84
- package/dist/docs/reference/extensions.md +131 -202
- package/dist/docs/reference/hooks.html +39 -39
- package/dist/docs/reference/hooks.md +34 -34
- package/dist/docs/reference/http-api.html +37 -37
- package/dist/docs/reference/instructions.html +37 -37
- package/dist/docs/reference/playground.html +37 -37
- package/dist/docs/reference/project-layout.html +37 -37
- package/dist/docs/reference/prompt.html +37 -37
- package/dist/docs/reference/schedules.html +37 -37
- package/dist/docs/reference/sessions.html +37 -37
- package/dist/docs/reference/skills.html +37 -37
- package/dist/docs/reference/subagents.html +38 -38
- package/dist/docs/reference/subagents.md +1 -1
- package/dist/docs/reference/tools.html +38 -38
- package/dist/docs/reference/tools.md +4 -0
- package/dist/docs/templates/agentic-owners.html +38 -38
- package/dist/docs/templates/pr-autofixer.html +37 -37
- package/dist/docs/templates/security-reviewer.html +38 -38
- package/dist/docs/templates/thermo-quality-review.html +62 -0
- package/dist/docs/templates/thermo-quality-review.md +75 -0
- package/dist/docs/templates/thermo-review.html +62 -0
- package/dist/docs/templates/thermo-review.md +74 -0
- package/dist/docs/templates/triage.html +37 -37
- package/dist/docs/troubleshooting.html +38 -38
- package/dist/docs/troubleshooting.md +97 -66
- package/dist/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
- package/dist/extensions/improve/extension.d.ts +3 -1
- package/dist/extensions/improve/extension.d.ts.map +1 -1
- package/dist/extensions/improve/extension.js +4 -2
- package/dist/extensions/improve/skills/yourself.js +1 -1
- package/dist/extensions/jev/extension.d.ts +43 -0
- package/dist/extensions/jev/extension.d.ts.map +1 -0
- package/dist/extensions/jev/extension.js +47 -0
- package/dist/extensions/jev/lib/evaluate.d.ts +101 -0
- package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -0
- package/dist/extensions/jev/lib/evaluate.js +167 -0
- package/dist/extensions/jev/skills/gated-write.md +25 -0
- package/dist/extensions/jev/skills/questions.md +33 -0
- package/dist/extensions/jev/tools/evaluate.d.ts +4 -0
- package/dist/extensions/jev/tools/evaluate.d.ts.map +1 -0
- package/dist/extensions/jev/tools/evaluate.js +88 -0
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +2 -0
- package/dist/filesystem.d.ts +46 -2
- package/dist/filesystem.d.ts.map +1 -1
- package/dist/filesystem.js +149 -102
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +6 -0
- package/dist/internal/cli-ax.d.ts +6 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +72 -14
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +1 -0
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +2 -0
- package/dist/internal/discovery/connections.d.ts.map +1 -1
- package/dist/internal/discovery/connections.js +18 -0
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +8 -4
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +1 -0
- package/dist/internal/filesystem/tools.d.ts.map +1 -1
- package/dist/internal/filesystem/tools.js +2 -2
- package/dist/internal/filesystem/walk.d.ts +7 -4
- package/dist/internal/filesystem/walk.d.ts.map +1 -1
- package/dist/internal/filesystem/walk.js +34 -11
- package/dist/internal/hosted-admission-adapter.d.ts +3 -0
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.d.ts +20 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +51 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +23 -25
- package/dist/internal/hosted-execution-diag.d.ts +12 -4
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
- package/dist/internal/hosted-execution-diag.js +26 -4
- package/dist/internal/hosted-execution-flush.d.ts +1 -0
- package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
- package/dist/internal/hosted-execution-flush.js +4 -2
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +4 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +111 -48
- package/dist/internal/session-engine.d.ts +4 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +39 -9
- package/dist/internal/skill-catalog.d.ts +28 -0
- package/dist/internal/skill-catalog.d.ts.map +1 -0
- package/dist/internal/skill-catalog.js +44 -0
- package/dist/playground/assets/index-DSMAewbx.css +1 -0
- package/dist/playground/assets/index-De_lpFxE.js +67 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +32 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +2 -0
- package/docs/building-with-agents.md +96 -84
- package/docs/deployment.md +118 -364
- package/docs/evals.md +149 -673
- package/docs/guides/agent-to-agent.md +130 -48
- package/docs/guides/bitbucket.md +250 -49
- package/docs/guides/cloud-agents.md +119 -67
- package/docs/guides/convert-automation.md +157 -148
- package/docs/guides/github.md +261 -246
- package/docs/guides/gitlab.md +250 -51
- package/docs/guides/grokbot-agents.md +100 -55
- package/docs/guides/improve.md +112 -59
- package/docs/guides/jev.md +353 -0
- package/docs/guides/mcp-oauth.md +112 -122
- package/docs/guides/opentelemetry.md +97 -166
- package/docs/guides/slack.md +158 -228
- package/docs/guides/webhooks.md +155 -386
- package/docs/hillclimbing.md +102 -56
- package/docs/reference/cli.md +2 -0
- package/docs/reference/connections.md +1 -1
- package/docs/reference/evals.md +298 -0
- package/docs/reference/extensions.md +132 -203
- package/docs/reference/hooks.md +34 -34
- package/docs/reference/subagents.md +1 -1
- package/docs/reference/tools.md +4 -0
- package/docs/templates/thermo-quality-review.md +80 -0
- package/docs/templates/thermo-review.md +79 -0
- package/docs/troubleshooting.md +98 -67
- package/package.json +8 -1
- package/skills/github/SKILL.md +21 -13
- package/src/bin/agent-serve.ts +24 -3
- package/src/channels/checks.ts +8 -0
- package/src/channels/github/github-channel.ts +29 -19
- package/src/channels/origin/checks.ts +3 -1
- package/src/channels/slack/agentic-delivery.ts +2 -0
- package/src/channels/slack/dispatch.ts +131 -4
- package/src/channels/slack/placeholder.ts +51 -0
- package/src/channels/slack/slack-channel.ts +9 -2
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
- package/src/extensions/improve/extension.ts +4 -2
- package/src/extensions/improve/skills/yourself.ts +1 -1
- package/src/extensions/jev/extension.ts +95 -0
- package/src/extensions/jev/lib/evaluate.ts +289 -0
- package/src/extensions/jev/skills/gated-write.md +25 -0
- package/src/extensions/jev/skills/questions.md +33 -0
- package/src/extensions/jev/tools/evaluate.ts +90 -0
- package/src/extensions.ts +2 -0
- package/src/filesystem.ts +168 -65
- package/src/index.ts +3 -0
- package/src/internal/advertise-tools.ts +6 -0
- package/src/internal/cli-ax.ts +88 -15
- package/src/internal/continuation-identity.ts +1 -0
- package/src/internal/cursor-agent-template.ts +2 -0
- package/src/internal/discovery/connections.ts +21 -0
- package/src/internal/discovery/extensions.ts +12 -4
- package/src/internal/discovery/info.ts +1 -0
- package/src/internal/filesystem/tools.ts +2 -0
- package/src/internal/filesystem/walk.ts +60 -15
- package/src/internal/hosted-admission-adapter.ts +3 -0
- package/src/internal/hosted-delivery-protocol.ts +82 -1
- package/src/internal/hosted-delivery.ts +23 -0
- package/src/internal/hosted-execution-diag.ts +33 -4
- package/src/internal/hosted-execution-flush.ts +4 -0
- package/src/internal/init-project.ts +4 -0
- package/src/internal/server.ts +130 -53
- package/src/internal/session-engine.ts +46 -8
- package/src/internal/skill-catalog.ts +69 -0
- package/src/types.ts +33 -3
- package/templates/thermo-quality-review/README.md +35 -0
- package/templates/thermo-quality-review/agent/agent.ts +8 -0
- package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
- package/templates/thermo-quality-review/agent/instructions.md +43 -0
- package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
- package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
- package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
- package/templates/thermo-quality-review/package.json +18 -0
- package/templates/thermo-quality-review/tsconfig.json +12 -0
- package/templates/thermo-review/README.md +35 -0
- package/templates/thermo-review/agent/agent.ts +8 -0
- package/templates/thermo-review/agent/channels/github.ts +42 -0
- package/templates/thermo-review/agent/instructions.md +40 -0
- package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
- package/templates/thermo-review/evals/evals.config.ts +5 -0
- package/templates/thermo-review/evals/review.eval.ts +53 -0
- package/templates/thermo-review/package.json +18 -0
- package/templates/thermo-review/tsconfig.json +12 -0
- package/dist/docs/assets/building-with-agents.md.CEGVXkmO.js +0 -13
- package/dist/docs/assets/building-with-agents.md.CEGVXkmO.lean.js +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +0 -1
- package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +0 -1
- package/dist/docs/assets/chunks/clone.YSt_40_s.js +0 -1
- package/dist/docs/assets/chunks/framework.dypDpWZ3.js +0 -19
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +0 -1
- package/dist/docs/assets/deployment.md.Dm4Qo3hp.js +0 -51
- package/dist/docs/assets/deployment.md.Dm4Qo3hp.lean.js +0 -1
- package/dist/docs/assets/evals.md.BLDRt5LH.js +0 -211
- package/dist/docs/assets/evals.md.BLDRt5LH.lean.js +0 -1
- package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +0 -14
- package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +0 -1
- package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.js +0 -10
- package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.lean.js +0 -1
- package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.js +0 -9
- package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.lean.js +0 -1
- package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.js +0 -12
- package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.lean.js +0 -1
- package/dist/docs/assets/guides_github.md.D6ER29dG.js +0 -64
- package/dist/docs/assets/guides_github.md.D6ER29dG.lean.js +0 -1
- package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.js +0 -14
- package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.lean.js +0 -1
- package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +0 -9
- package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.lean.js +0 -1
- package/dist/docs/assets/guides_improve.md.BKaDuKKK.js +0 -14
- package/dist/docs/assets/guides_improve.md.BKaDuKKK.lean.js +0 -1
- package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.js +0 -28
- package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.lean.js +0 -1
- package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.js +0 -26
- package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.lean.js +0 -1
- package/dist/docs/assets/guides_slack.md.DdT8rmsj.js +0 -46
- package/dist/docs/assets/guides_slack.md.DdT8rmsj.lean.js +0 -1
- package/dist/docs/assets/guides_webhooks.md.aQW10HRe.js +0 -225
- package/dist/docs/assets/guides_webhooks.md.aQW10HRe.lean.js +0 -1
- package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +0 -1
- package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +0 -1
- package/dist/docs/assets/reference_extensions.md.wlFD3cUR.js +0 -62
- package/dist/docs/assets/reference_extensions.md.wlFD3cUR.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.js +0 -1
- package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.lean.js +0 -1
- package/dist/playground/assets/index-BLlKgZtI.css +0 -1
- 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:
|
|
464
|
-
|
|
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 {
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
|
112
|
-
* Prefers `Error.stack` (message line + `at` frames)
|
|
113
|
-
*
|
|
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
|