@cursor/july 0.1.111 → 0.1.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/agent-serve.js +18 -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/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 +142 -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.DxTdhphC.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.QmjDU6Jh.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CdqoBZJX.js → VPLocalSearchBox.CR3KTF0X.js} +1 -1
- package/dist/docs/assets/chunks/{arc.BVX3ycTn.js → arc.CVVqBOdS.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CcChnMxX.js → architectureDiagram-Q4EWVU46.CJHGP4ki.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.xwtXO-yt.js → baseUniq.r7UVVRBP.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CijZ_taK.js → blockDiagram-DXYQGD6D.DKmMaTre.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.0FBvwBvK.js → c4Diagram-AHTNJAMY.DDJsntUO.js} +1 -1
- package/dist/docs/assets/chunks/channel.BjpoSbz_.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CELMmMDA.js → chunk-4BX2VUAB.BK2rKt6W.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C4bhFtSm.js → chunk-4TB4RGXK.DRLV8RnF.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.ZnQ9gRRQ.js → chunk-55IACEB6.DaKjxtb7.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DPlmglG-.js → chunk-EDXVE4YY.C5sPCIT1.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BrUk8pff.js → chunk-FMBD7UC4.CSGWyNTB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CcmWIncu.js → chunk-OYMX7WX6.D5tK9XEr.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D65-cs8I.js → chunk-QZHKN3VN.BeZGd1UZ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.qoXZpG9F.js → chunk-YZCP3GAM.U_tfWwQR.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BgxOlMHw.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BgxOlMHw.js +1 -0
- package/dist/docs/assets/chunks/clone.DRuGBKZC.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.8rYtqudO.js → cose-bilkent-S5V4N54A.DVeRXIb6.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.DrRP1fOh.js → dagre-KV5264BT.BpKJAeRZ.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DHj_xA2_.js → diagram-5BDNPKRD.BQOtrd1Z.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Bz_6nAKj.js → diagram-G4DWMVQ6.CSDAhjPI.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BWA0xSW9.js → diagram-MMDJMWI5.Dpztst2S.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.CpTJLNJI.js → diagram-TYMM5635.qJHRizHR.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.-7AWWSrP.js → erDiagram-SMLLAGMA.vbDotH3l.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BTnQ742_.js → flowDiagram-DWJPFMVM.CqS_ZQr4.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.DTLdR4pN.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CZcNTFZd.js → gitGraphDiagram-UUTBAWPF.D04lnbnr.js} +1 -1
- package/dist/docs/assets/chunks/{graph.V2GLaab4.js → graph.BlfqLJsM.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.7pZOkCCU.js → infoDiagram-42DDH7IO.tAooImWA.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js → ishikawaDiagram-UXIWVN3A.ClUsVqnJ.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BNEgWN1S.js → journeyDiagram-VCZTEJTY.C3tUgyCg.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B-4d4tC7.js → kanban-definition-6JOO6SKY.CtD9-QCe.js} +1 -1
- package/dist/docs/assets/chunks/{layout.Dvbn9nSb.js → layout.D38U-LnT.js} +1 -1
- package/dist/docs/assets/chunks/{linear.D2GM4p4b.js → linear.BJmssyhN.js} +1 -1
- package/dist/docs/assets/chunks/{min.DVBtLK-B.js → min.DNgXoouU.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CnJRI55x.js → mindmap-definition-QFDTVHPH.Dcp6cxeu.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CtoaTFlA.js → pieDiagram-DEJITSTG.CLDw6zIs.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DtT24_vN.js → quadrantDiagram-34T5L4WZ.CYaeeY4c.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CjSO4o8f.js → requirementDiagram-MS252O5E.gMYuRpq2.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.-wWiIVWa.js → sankeyDiagram-XADWPNL6.CZqyHFbc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DSk8s4gX.js → sequenceDiagram-FGHM5R23.BTsCjUDN.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BFKAsdkN.js → stateDiagram-FHFEXIEX.CftT9mLJ.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.-43J68xB.js +1 -0
- package/dist/docs/assets/chunks/{theme.C0MctGaz.js → theme.B_7J9ZsV.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.TUNJbAFe.js → timeline-definition-GMOUNBTQ.DbU3WUNw.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.C-RGNnk4.js → vennDiagram-DHZGUBPP.ixsq-q2u.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.WRXz-Dux.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DH4zt73Y.js → wardleyDiagram-NUSXRM2D.C0ewvgbp.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B-3k6bF6.js → xychartDiagram-5P7HB3ND.nAEhF4bO.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.BYvfZ-PO.js +72 -0
- package/dist/docs/assets/evals.md.BYvfZ-PO.lean.js +1 -0
- package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.js +30 -0
- package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.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_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.CmyrlXfY.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.lean.js → reference_connections.md.CmyrlXfY.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.Ceq-qT8d.js +58 -0
- package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.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.BHsSMMyO.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.e5qitjJt.lean.js → reference_subagents.md.BHsSMMyO.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.js → reference_tools.md.BYzUTeVA.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.lean.js → reference_tools.md.BYzUTeVA.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 +146 -673
- package/dist/docs/guides/agent-to-agent.html +58 -42
- package/dist/docs/guides/agent-to-agent.md +112 -35
- 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/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 +3082 -3104
- package/dist/docs/llms.txt +21 -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 +37 -37
- 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 +127 -199
- 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 +37 -37
- package/dist/docs/reference/tools.html +37 -37
- 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/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/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/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 +17 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +50 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +8 -0
- 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 +94 -39
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +11 -5
- 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-B1c1LeIf.js +67 -0
- package/dist/playground/assets/index-CK2LX3iD.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +9 -0
- 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 +147 -674
- package/docs/guides/agent-to-agent.md +113 -36
- 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/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/evals.md +298 -0
- package/docs/reference/extensions.md +128 -200
- package/docs/reference/hooks.md +34 -34
- 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 +1 -1
- package/skills/github/SKILL.md +21 -13
- package/src/bin/agent-serve.ts +22 -0
- package/src/channels/github/github-channel.ts +29 -19
- package/src/channels/slack/agentic-delivery.ts +2 -0
- package/src/channels/slack/dispatch.ts +126 -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/filesystem.ts +168 -65
- package/src/index.ts +3 -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/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 +78 -1
- package/src/internal/hosted-delivery.ts +8 -0
- package/src/internal/init-project.ts +4 -0
- package/src/internal/server.ts +104 -41
- package/src/internal/session-engine.ts +16 -4
- package/src/internal/skill-catalog.ts +69 -0
- package/src/types.ts +9 -0
- 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/chunks/wardley-RL74JXVD.g5efOWmT.js +0 -162
- 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
|
@@ -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
|
|
|
@@ -236,6 +236,20 @@ export type HostedAdmissionManagedAutomation = {
|
|
|
236
236
|
slackChannels?: string[];
|
|
237
237
|
};
|
|
238
238
|
|
|
239
|
+
/**
|
|
240
|
+
* Trusted control-plane handoff for a Slack placeholder posted at ingress
|
|
241
|
+
* before the Temporal signal. Omitted when no placeholder was posted.
|
|
242
|
+
*/
|
|
243
|
+
export type HostedAdmissionPlatformHandoff = {
|
|
244
|
+
v: 1;
|
|
245
|
+
slackPlaceholder: {
|
|
246
|
+
messageTs: string;
|
|
247
|
+
channelId: string;
|
|
248
|
+
threadTs: string;
|
|
249
|
+
streamed: false;
|
|
250
|
+
};
|
|
251
|
+
};
|
|
252
|
+
|
|
239
253
|
export type HostedAdmission = {
|
|
240
254
|
v: 2;
|
|
241
255
|
channelId: string;
|
|
@@ -251,6 +265,8 @@ export type HostedAdmission = {
|
|
|
251
265
|
mailboxContinuationKey: string;
|
|
252
266
|
payload: unknown;
|
|
253
267
|
managedAutomation?: HostedAdmissionManagedAutomation;
|
|
268
|
+
/** Present only when control-plane Slack fast-act posted a placeholder. */
|
|
269
|
+
platformHandoff?: HostedAdmissionPlatformHandoff;
|
|
254
270
|
};
|
|
255
271
|
|
|
256
272
|
export type HostedAdmissionOutcome =
|
|
@@ -304,12 +320,19 @@ const DELIVERY_KEYS = new Set([
|
|
|
304
320
|
"mailboxContinuationKey",
|
|
305
321
|
"payload",
|
|
306
322
|
"managedAutomation",
|
|
323
|
+
"platformHandoff",
|
|
307
324
|
]);
|
|
308
325
|
const MANAGED_AUTOMATION_KEYS = new Set([
|
|
309
326
|
"automationUuid",
|
|
310
327
|
"mcpServerNames",
|
|
311
328
|
"slackChannels",
|
|
312
329
|
]);
|
|
330
|
+
export const HOSTED_PLATFORM_HANDOFF_KEYS: ReadonlySet<string> = new Set([
|
|
331
|
+
"v",
|
|
332
|
+
"slackPlaceholder",
|
|
333
|
+
]);
|
|
334
|
+
export const HOSTED_SLACK_PLACEHOLDER_HANDOFF_KEYS: ReadonlySet<string> =
|
|
335
|
+
new Set(["messageTs", "channelId", "threadTs", "streamed"]);
|
|
313
336
|
/** More names than any real automation configures is a malformed envelope. */
|
|
314
337
|
const MANAGED_AUTOMATION_MAX_SERVERS = 64;
|
|
315
338
|
/** More channels than the dashboard picker allows is a malformed envelope. */
|
|
@@ -370,6 +393,59 @@ function parseManagedAutomation(
|
|
|
370
393
|
};
|
|
371
394
|
}
|
|
372
395
|
|
|
396
|
+
/**
|
|
397
|
+
* Parse optional control-plane Slack placeholder handoff. Absent → valid;
|
|
398
|
+
* present-but-malformed → invalid (fail closed like managedAutomation).
|
|
399
|
+
*/
|
|
400
|
+
function parsePlatformHandoff(
|
|
401
|
+
value: unknown
|
|
402
|
+
): { platformHandoff?: HostedAdmissionPlatformHandoff } | undefined {
|
|
403
|
+
if (value === undefined) {
|
|
404
|
+
return {};
|
|
405
|
+
}
|
|
406
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
407
|
+
return undefined;
|
|
408
|
+
}
|
|
409
|
+
const body = value as Record<string, unknown>;
|
|
410
|
+
if (
|
|
411
|
+
Object.keys(body).some(key => !HOSTED_PLATFORM_HANDOFF_KEYS.has(key)) ||
|
|
412
|
+
body.v !== 1
|
|
413
|
+
) {
|
|
414
|
+
return undefined;
|
|
415
|
+
}
|
|
416
|
+
const placeholder = body.slackPlaceholder;
|
|
417
|
+
if (
|
|
418
|
+
typeof placeholder !== "object" ||
|
|
419
|
+
placeholder === null ||
|
|
420
|
+
Array.isArray(placeholder)
|
|
421
|
+
) {
|
|
422
|
+
return undefined;
|
|
423
|
+
}
|
|
424
|
+
const slot = placeholder as Record<string, unknown>;
|
|
425
|
+
if (
|
|
426
|
+
Object.keys(slot).some(
|
|
427
|
+
key => !HOSTED_SLACK_PLACEHOLDER_HANDOFF_KEYS.has(key)
|
|
428
|
+
) ||
|
|
429
|
+
!boundedString(slot.messageTs, 64) ||
|
|
430
|
+
!boundedString(slot.channelId, 64) ||
|
|
431
|
+
!boundedString(slot.threadTs, 64) ||
|
|
432
|
+
slot.streamed !== false
|
|
433
|
+
) {
|
|
434
|
+
return undefined;
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
platformHandoff: {
|
|
438
|
+
v: 1,
|
|
439
|
+
slackPlaceholder: {
|
|
440
|
+
messageTs: slot.messageTs,
|
|
441
|
+
channelId: slot.channelId,
|
|
442
|
+
threadTs: slot.threadTs,
|
|
443
|
+
streamed: slot.streamed,
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
|
|
373
449
|
export function parseHostedAdmission(
|
|
374
450
|
value: unknown
|
|
375
451
|
): HostedAdmission | undefined {
|
|
@@ -387,7 +463,8 @@ export function parseHostedAdmission(
|
|
|
387
463
|
!boundedString(body.deliveryId, 256) ||
|
|
388
464
|
(body.sessionMode !== "event" && body.sessionMode !== "continuation") ||
|
|
389
465
|
!boundedString(body.mailboxContinuationKey, 512) ||
|
|
390
|
-
parseManagedAutomation(body.managedAutomation) === undefined
|
|
466
|
+
parseManagedAutomation(body.managedAutomation) === undefined ||
|
|
467
|
+
parsePlatformHandoff(body.platformHandoff) === undefined
|
|
391
468
|
) {
|
|
392
469
|
return undefined;
|
|
393
470
|
}
|
|
@@ -391,6 +391,7 @@ async function runAdmission(
|
|
|
391
391
|
deliveryId: input.delivery.deliveryId,
|
|
392
392
|
args,
|
|
393
393
|
mailboxContinuationKey: input.delivery.mailboxContinuationKey,
|
|
394
|
+
platformHandoff: input.delivery.platformHandoff,
|
|
394
395
|
});
|
|
395
396
|
} catch (error) {
|
|
396
397
|
const mapped = mappedAdmissionFailure(error);
|
|
@@ -948,6 +949,13 @@ export function registerHostedDeliveryRoute(input: {
|
|
|
948
949
|
},
|
|
949
950
|
});
|
|
950
951
|
sessionId = session.id;
|
|
952
|
+
// The pre-turn claim used an empty sessionId. Stamp the
|
|
953
|
+
// engine id now so a dashboard / session-view poll that
|
|
954
|
+
// only has the factory `ses_…` can follow `session-events/`.
|
|
955
|
+
await writeDiag({
|
|
956
|
+
sessionId,
|
|
957
|
+
turnStatus: HOSTED_EXECUTION_DIAG_RUNNING_STATUS,
|
|
958
|
+
});
|
|
951
959
|
const outcome = await session.waitForCompletion();
|
|
952
960
|
completionAt = hostedExecutionNow();
|
|
953
961
|
// Status is the owner turn. waitForCompletion still waited
|
|
@@ -81,6 +81,8 @@ const TEMPLATES: Readonly<Record<TemplateName, TemplateEntry>> = {
|
|
|
81
81
|
"pr-autofixer": { dir: "pr-autofixer" },
|
|
82
82
|
"security-help": { dir: "security-help" },
|
|
83
83
|
"security-reviewer": { dir: "security-reviewer" },
|
|
84
|
+
"thermo-quality-review": { dir: "thermo-quality-review" },
|
|
85
|
+
"thermo-review": { dir: "thermo-review" },
|
|
84
86
|
"triage-linear": { dir: "triage", overlay: "linear" },
|
|
85
87
|
"triage-jira": { dir: "triage", overlay: "jira" },
|
|
86
88
|
};
|
|
@@ -714,6 +716,8 @@ Scaffold a project, then open the playground:
|
|
|
714
716
|
npx ${PACKAGE_NAME} init ./code-wiki --template code-wiki # keep wiki pages current after merge
|
|
715
717
|
npx ${PACKAGE_NAME} init ./agents-md --template agents-md # keep AGENTS.md current from last week's PRs and Slack
|
|
716
718
|
npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
|
|
719
|
+
npx ${PACKAGE_NAME} init ./thermo-review --template thermo-review # review PRs for bugs and breakage
|
|
720
|
+
npx ${PACKAGE_NAME} init ./thermo-quality --template thermo-quality-review # review PRs for code quality
|
|
717
721
|
npx ${PACKAGE_NAME} init ./security-help --template security-help # answer security questions in Slack
|
|
718
722
|
npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
|
|
719
723
|
npx ${PACKAGE_NAME} init ./my-triage --template triage-jira # comment on Jira issues
|
package/src/internal/server.ts
CHANGED
|
@@ -238,6 +238,11 @@ import {
|
|
|
238
238
|
unregisterSessionRunFatalFlush,
|
|
239
239
|
} from "./session-run-log.js";
|
|
240
240
|
import { sessionUrlsForRequest } from "./session-urls.js";
|
|
241
|
+
import {
|
|
242
|
+
readSkillDetail,
|
|
243
|
+
skillListEntry,
|
|
244
|
+
UnknownSkillError,
|
|
245
|
+
} from "./skill-catalog.js";
|
|
241
246
|
import { flushLocalStartLog, selectStartLogStore } from "./start-log-store.js";
|
|
242
247
|
import { catalogDetailEntry, catalogListEntry } from "./tool-catalog.js";
|
|
243
248
|
|
|
@@ -1568,7 +1573,15 @@ function mountAgentRoutes(
|
|
|
1568
1573
|
}
|
|
1569
1574
|
return null;
|
|
1570
1575
|
};
|
|
1571
|
-
|
|
1576
|
+
// A v2 mount served under `--no-control-plane` is a hosted v2 guest: the
|
|
1577
|
+
// hosted control plane drives it through the hosted delivery route below.
|
|
1578
|
+
// Session HTTP is a control-plane surface, so such a guest mounts no
|
|
1579
|
+
// `/v1/session*` or `/v1/sessions` routes — session starts arrive as hosted
|
|
1580
|
+
// admissions (`agentsdk.session` on the built-in http channel) and session
|
|
1581
|
+
// reads come from the control plane's runs surface and durable storage.
|
|
1582
|
+
// Local dev, self-hosted serve, and hosted v1 keep the engine mounts.
|
|
1583
|
+
const hostedV2Guest = noControlPlane === true && isV2Project(project);
|
|
1584
|
+
if (hostedV2Guest) {
|
|
1572
1585
|
registerHostedDeliveryRoute({
|
|
1573
1586
|
router,
|
|
1574
1587
|
base,
|
|
@@ -1747,34 +1760,38 @@ function mountAgentRoutes(
|
|
|
1747
1760
|
},
|
|
1748
1761
|
});
|
|
1749
1762
|
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1763
|
+
// Session list is session surface: not mounted on a hosted v2 guest (the
|
|
1764
|
+
// control plane owns session reads there; see hostedV2Guest above).
|
|
1765
|
+
if (!hostedV2Guest) {
|
|
1766
|
+
router.add({
|
|
1767
|
+
method: "GET",
|
|
1768
|
+
pattern: `${base}/v1/sessions`,
|
|
1769
|
+
auth: httpAuth,
|
|
1770
|
+
handler: async (request, ctx) => {
|
|
1771
|
+
// Same gate as requireSessionOwner / relaxSessionReadAuth: never with
|
|
1772
|
+
// bearer or custom channel auth (strict per-principal isolation).
|
|
1773
|
+
// `--allow-anonymous` alone is a shared-principal trust boundary (corp
|
|
1774
|
+
// Okta ALB); `--dev` alone stays loopback-only.
|
|
1775
|
+
const includeAll =
|
|
1776
|
+
relaxSessionReadAuth &&
|
|
1777
|
+
(relaxSessionReadAuthBeyondLoopback ||
|
|
1778
|
+
(typeof ctx.requestIp === "string" &&
|
|
1779
|
+
isLoopbackAddress(ctx.requestIp)));
|
|
1780
|
+
// `?latest=1` — only the newest visible session. Clients binding a
|
|
1781
|
+
// default session (agsh) do not need the whole list, and on hosted
|
|
1782
|
+
// storage the whole list is a database scan.
|
|
1783
|
+
const latest = new URL(request.url).searchParams.get("latest");
|
|
1784
|
+
const listed =
|
|
1785
|
+
latest === "1" || latest === "true"
|
|
1786
|
+
? await engine.latestSessionWithSource(ctx.auth, { includeAll })
|
|
1787
|
+
: await engine.listSessionsWithSource(ctx.auth, { includeAll });
|
|
1788
|
+
return jsonResponse({
|
|
1789
|
+
sessions: listed.sessions,
|
|
1790
|
+
source: listed.source,
|
|
1791
|
+
});
|
|
1792
|
+
},
|
|
1793
|
+
});
|
|
1794
|
+
}
|
|
1778
1795
|
|
|
1779
1796
|
// Durable artifacts (ctx.artifacts / tag_artifact), newest-updated first.
|
|
1780
1797
|
router.add({
|
|
@@ -2084,6 +2101,45 @@ function mountAgentRoutes(
|
|
|
2084
2101
|
},
|
|
2085
2102
|
});
|
|
2086
2103
|
|
|
2104
|
+
// Deterministic skill reads: the body the harness would receive, plus
|
|
2105
|
+
// resolved sibling files. Read-only, so plain GETs with no session binding.
|
|
2106
|
+
router.add({
|
|
2107
|
+
method: "GET",
|
|
2108
|
+
pattern: `${base}/v1/skills`,
|
|
2109
|
+
auth: httpAuth,
|
|
2110
|
+
handler: async () =>
|
|
2111
|
+
jsonResponse({
|
|
2112
|
+
skills: project.agent.skills.map(skillListEntry),
|
|
2113
|
+
}),
|
|
2114
|
+
});
|
|
2115
|
+
|
|
2116
|
+
router.add({
|
|
2117
|
+
method: "GET",
|
|
2118
|
+
pattern: `${base}/v1/skills/:skillName`,
|
|
2119
|
+
auth: httpAuth,
|
|
2120
|
+
handler: async (_request, ctx) => {
|
|
2121
|
+
const skillName = ctx.params.skillName ?? "";
|
|
2122
|
+
try {
|
|
2123
|
+
return jsonResponse(
|
|
2124
|
+
await readSkillDetail(project.agent.skills, skillName)
|
|
2125
|
+
);
|
|
2126
|
+
} catch (error) {
|
|
2127
|
+
if (error instanceof UnknownSkillError) {
|
|
2128
|
+
return jsonResponse(
|
|
2129
|
+
{
|
|
2130
|
+
ok: false,
|
|
2131
|
+
error: "unknown_skill",
|
|
2132
|
+
message: error.message,
|
|
2133
|
+
availableSkills: error.availableSkillNames,
|
|
2134
|
+
},
|
|
2135
|
+
{ status: 404 }
|
|
2136
|
+
);
|
|
2137
|
+
}
|
|
2138
|
+
throw error;
|
|
2139
|
+
}
|
|
2140
|
+
},
|
|
2141
|
+
});
|
|
2142
|
+
|
|
2087
2143
|
if (playground) {
|
|
2088
2144
|
// Serve the built Vite SPA. `<base href>` is injected so the SPA's relative
|
|
2089
2145
|
// asset URLs resolve under this mount regardless of the trailing slash the
|
|
@@ -2107,18 +2163,25 @@ function mountAgentRoutes(
|
|
|
2107
2163
|
});
|
|
2108
2164
|
}
|
|
2109
2165
|
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2166
|
+
// The built-in HTTP session channel (`/v1/session*`, including the
|
|
2167
|
+
// session-scoped approvals/auths routes) is session surface: not mounted on
|
|
2168
|
+
// a hosted v2 guest (see hostedV2Guest above). The `http` channel itself
|
|
2169
|
+
// stays registered with the hosted delivery route, which is how the control
|
|
2170
|
+
// plane's session starts reach it.
|
|
2171
|
+
if (!hostedV2Guest) {
|
|
2172
|
+
for (const route of buildHttpChannelRoutes({
|
|
2173
|
+
engine,
|
|
2174
|
+
config: project.httpChannel,
|
|
2175
|
+
auth: httpAuth,
|
|
2176
|
+
basePath: base,
|
|
2177
|
+
// Dev playground lists every session (`includeAll`); allow opening them
|
|
2178
|
+
// (see relaxSessionReadAuth above).
|
|
2179
|
+
relaxSessionReadAuth,
|
|
2180
|
+
relaxSessionReadAuthBeyondLoopback,
|
|
2181
|
+
relaxSessionApprovalAuth,
|
|
2182
|
+
})) {
|
|
2183
|
+
router.add(route);
|
|
2184
|
+
}
|
|
2122
2185
|
}
|
|
2123
2186
|
|
|
2124
2187
|
// Playground eval list/run — available without `--dev` (corp / allow-anonymous).
|
|
@@ -1037,6 +1037,11 @@ export class SessionEngine {
|
|
|
1037
1037
|
// on a sessionless pod.
|
|
1038
1038
|
throw new HostedAdmissionLocalSendError();
|
|
1039
1039
|
}
|
|
1040
|
+
if (options.clearCloudOverride === true && options.cloud !== undefined) {
|
|
1041
|
+
throw new Error(
|
|
1042
|
+
"send options cloud and clearCloudOverride cannot be combined"
|
|
1043
|
+
);
|
|
1044
|
+
}
|
|
1040
1045
|
const identity =
|
|
1041
1046
|
channelId === HTTP_CHANNEL_ID
|
|
1042
1047
|
? httpContinuationIdentity(this.project.httpChannel)
|
|
@@ -1127,11 +1132,18 @@ export class SessionEngine {
|
|
|
1127
1132
|
),
|
|
1128
1133
|
}));
|
|
1129
1134
|
}
|
|
1130
|
-
//
|
|
1131
|
-
//
|
|
1132
|
-
//
|
|
1133
|
-
// stale repo/prUrl for the session's lifetime.
|
|
1135
|
+
// A caller can explicitly return a continuation to the agent's
|
|
1136
|
+
// configured runtime. Omission remains sticky for compatibility:
|
|
1137
|
+
// follow-ups that do not know the original attach keep it.
|
|
1134
1138
|
if (
|
|
1139
|
+
sendOptions.clearCloudOverride === true &&
|
|
1140
|
+
record.cloudOverride !== undefined
|
|
1141
|
+
) {
|
|
1142
|
+
record = await this.updateRecord(record.sessionId, current => ({
|
|
1143
|
+
...current,
|
|
1144
|
+
cloudOverride: undefined,
|
|
1145
|
+
}));
|
|
1146
|
+
} else if (
|
|
1135
1147
|
sendOptions.cloud !== undefined &&
|
|
1136
1148
|
JSON.stringify(sendOptions.cloud) !==
|
|
1137
1149
|
JSON.stringify(record.cloudOverride)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic skill reads (`GET /v1/skills`, `GET /v1/skills/:name`,
|
|
3
|
+
* `agent-sdk skill <name>`): the skill body exactly as the harness would
|
|
4
|
+
* receive it, plus resolved sibling files. No model turn, no session.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import type { DiscoveredSkill } from "../types.js";
|
|
9
|
+
import { buildSkillMd } from "./workspace.js";
|
|
10
|
+
|
|
11
|
+
export class UnknownSkillError extends Error {
|
|
12
|
+
constructor(
|
|
13
|
+
skillName: string,
|
|
14
|
+
readonly availableSkillNames: string[]
|
|
15
|
+
) {
|
|
16
|
+
super(`Unknown skill "${skillName}"`);
|
|
17
|
+
this.name = "UnknownSkillError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Light listing entry: routing hint only, like `info` shows. */
|
|
22
|
+
export interface SkillListEntry {
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Full read behind `GET /v1/skills/:name`. */
|
|
28
|
+
export interface SkillDetailEntry extends SkillListEntry {
|
|
29
|
+
/** SKILL.md body without generated frontmatter. */
|
|
30
|
+
markdown: string;
|
|
31
|
+
/** Rendered SKILL.md the harness reads (frontmatter + body). */
|
|
32
|
+
skillMd: string;
|
|
33
|
+
/** Sibling files by package-relative path, with contents resolved. */
|
|
34
|
+
files: Record<string, string>;
|
|
35
|
+
extension?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function skillListEntry(skill: DiscoveredSkill): SkillListEntry {
|
|
39
|
+
return { name: skill.name, description: skill.description };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function readSkillDetail(
|
|
43
|
+
skills: readonly DiscoveredSkill[],
|
|
44
|
+
skillName: string
|
|
45
|
+
): Promise<SkillDetailEntry> {
|
|
46
|
+
const skill = skills.find(s => s.name === skillName);
|
|
47
|
+
if (skill === undefined) {
|
|
48
|
+
throw new UnknownSkillError(
|
|
49
|
+
skillName,
|
|
50
|
+
skills.map(s => s.name)
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
// Null-prototype: authored keys (`defineSkill`) pass through
|
|
54
|
+
// unvalidated, and `__proto__` would silently vanish on a plain object.
|
|
55
|
+
const files: Record<string, string> = Object.create(null);
|
|
56
|
+
for (const [rel, source] of Object.entries(skill.files)) {
|
|
57
|
+
files[rel] =
|
|
58
|
+
"contents" in source
|
|
59
|
+
? source.contents
|
|
60
|
+
: await readFile(source.sourcePath, "utf8");
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
...skillListEntry(skill),
|
|
64
|
+
markdown: skill.markdown,
|
|
65
|
+
skillMd: buildSkillMd(skill),
|
|
66
|
+
files,
|
|
67
|
+
extension: skill.extension,
|
|
68
|
+
};
|
|
69
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -2130,6 +2130,15 @@ export interface SendMessageOptions {
|
|
|
2130
2130
|
* runtime is forced local with no override path.
|
|
2131
2131
|
*/
|
|
2132
2132
|
cloud?: AgentCloudOptions;
|
|
2133
|
+
/**
|
|
2134
|
+
* Clear cloud options retained by an existing continuation session before
|
|
2135
|
+
* starting this turn. Use when a caller intentionally moves a previously
|
|
2136
|
+
* cloud-attached session back to the agent's configured runtime. Cannot be
|
|
2137
|
+
* combined with {@link cloud}.
|
|
2138
|
+
*
|
|
2139
|
+
* On a new session this is a no-op.
|
|
2140
|
+
*/
|
|
2141
|
+
clearCloudOverride?: boolean;
|
|
2133
2142
|
/**
|
|
2134
2143
|
* Seed the Cursor SDK agent id for a **new** session (ignored when the
|
|
2135
2144
|
* continuation token matches an existing session). For cloud agents this
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Thermo quality review
|
|
2
|
+
|
|
3
|
+
Reviews pull requests for structural code quality. Posts one review comment.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx @cursor/july init ./thermo-quality-review --template thermo-quality-review
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Run hosted
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
cd thermo-quality-review
|
|
13
|
+
agent-sdk login
|
|
14
|
+
agent-sdk deploy --cursor-events-repo acme/api
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The deployment watches that repo through your team's Cursor GitHub
|
|
18
|
+
connection. Open a PR to get a review.
|
|
19
|
+
|
|
20
|
+
## Run locally
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
agent-sdk dev --cursor-events --repo acme/api
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or replay a PR without pushing:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
agent-sdk github replay https://github.com/acme/api/pull/12 --dir .
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Files
|
|
33
|
+
|
|
34
|
+
- `agent/instructions.md`: what counts as a finding
|
|
35
|
+
- `evals/review.eval.ts`: two smoke cases
|