@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
|
@@ -9,7 +9,9 @@ import {
|
|
|
9
9
|
normalizeIdentity,
|
|
10
10
|
} from "../../internal/continuation-identity.js";
|
|
11
11
|
import { isDeferredChannelSession } from "../../internal/deferred-channel-session.js";
|
|
12
|
+
import type { HostedAdmissionPlatformHandoff } from "../../internal/hosted-delivery-protocol.js";
|
|
12
13
|
import { routeLocalIngressContinuation } from "../../internal/local-ingress.js";
|
|
14
|
+
import { mapThrownRequestError } from "../../internal/request-error-status.js";
|
|
13
15
|
import { isSlackImChannel } from "../../internal/slack-thread-key.js";
|
|
14
16
|
import { steeringEnabled } from "../../internal/steering.js";
|
|
15
17
|
import type {
|
|
@@ -49,7 +51,12 @@ import {
|
|
|
49
51
|
} from "./inbound.js";
|
|
50
52
|
import { defaultSlackLog, type SlackLog } from "./log.js";
|
|
51
53
|
import { paintTurnStart, retractTurnStart } from "./paint-start.js";
|
|
52
|
-
import {
|
|
54
|
+
import {
|
|
55
|
+
adoptPlaceholder,
|
|
56
|
+
retractPlaceholderMessage,
|
|
57
|
+
retractPlaceholderSlot,
|
|
58
|
+
startPlaceholder,
|
|
59
|
+
} from "./placeholder.js";
|
|
53
60
|
import { isWholeMessageStop } from "./stop.js";
|
|
54
61
|
import {
|
|
55
62
|
loadSlackThreadContextBlock,
|
|
@@ -219,9 +226,16 @@ export interface SlackInboundDispatchDeps extends SlackContinuationProbes {
|
|
|
219
226
|
* Static replaceable first message. Fired with `send()`
|
|
220
227
|
* locally, and on hosted admission when the continuation already
|
|
221
228
|
* exists (warm / coalesced follow-up). Cold hosted posts it on
|
|
222
|
-
* `turn.started
|
|
229
|
+
* `turn.started` unless {@link platformHandoff} already seeded the
|
|
230
|
+
* slot from a control-plane post. Overlay claims that slot.
|
|
223
231
|
*/
|
|
224
232
|
placeholder?: string;
|
|
233
|
+
/**
|
|
234
|
+
* Trusted control-plane handoff (Slack placeholder ts). Hosted
|
|
235
|
+
* admission passes this so the guest adopts the CP-posted message
|
|
236
|
+
* instead of posting a duplicate.
|
|
237
|
+
*/
|
|
238
|
+
platformHandoff?: HostedAdmissionPlatformHandoff;
|
|
225
239
|
/**
|
|
226
240
|
* When false, skip the built-in `eval` directive. Defaults to true when
|
|
227
241
|
* `host.evals` is present; only ever runs on mentions and DMs.
|
|
@@ -307,6 +321,7 @@ function scheduleInbound(
|
|
|
307
321
|
handler: SlackMessageHandler;
|
|
308
322
|
evalCommandsEnabled?: boolean;
|
|
309
323
|
eventId?: string;
|
|
324
|
+
platformHandoff?: HostedAdmissionPlatformHandoff;
|
|
310
325
|
}
|
|
311
326
|
): void {
|
|
312
327
|
deps.waitUntil(
|
|
@@ -327,6 +342,9 @@ function scheduleInbound(
|
|
|
327
342
|
blockExternals: deps.blockExternals,
|
|
328
343
|
...inboundContinuation(deps),
|
|
329
344
|
...(args.eventId === undefined ? {} : { eventId: args.eventId }),
|
|
345
|
+
...(args.platformHandoff === undefined
|
|
346
|
+
? {}
|
|
347
|
+
: { platformHandoff: args.platformHandoff }),
|
|
330
348
|
})
|
|
331
349
|
);
|
|
332
350
|
}
|
|
@@ -388,6 +406,8 @@ export async function dispatchInboundMessage(args: {
|
|
|
388
406
|
ack?: string;
|
|
389
407
|
/** See {@link SlackInboundDispatchDeps.placeholder}. */
|
|
390
408
|
placeholder?: string;
|
|
409
|
+
/** See {@link SlackInboundDispatchDeps.platformHandoff}. */
|
|
410
|
+
platformHandoff?: HostedAdmissionPlatformHandoff;
|
|
391
411
|
/** See {@link SlackInboundDispatchDeps.propagateHandlerErrors}. */
|
|
392
412
|
propagateHandlerErrors?: boolean;
|
|
393
413
|
}): Promise<void> {
|
|
@@ -413,6 +433,69 @@ export async function dispatchInboundMessage(args: {
|
|
|
413
433
|
team: message.teamId,
|
|
414
434
|
});
|
|
415
435
|
|
|
436
|
+
const handoff = args.platformHandoff?.slackPlaceholder;
|
|
437
|
+
const handoffInThread =
|
|
438
|
+
kind !== "channel_post" &&
|
|
439
|
+
handoff !== undefined &&
|
|
440
|
+
handoff.channelId === message.channelId &&
|
|
441
|
+
handoff.threadTs === message.threadTs
|
|
442
|
+
? handoff
|
|
443
|
+
: undefined;
|
|
444
|
+
const matchedHandoff =
|
|
445
|
+
args.placeholder !== undefined ? handoffInThread : undefined;
|
|
446
|
+
let adoptedPlaceholder = false;
|
|
447
|
+
let handoffRetracted = false;
|
|
448
|
+
const retractUnadoptedHandoff = async (): Promise<void> => {
|
|
449
|
+
if (matchedHandoff === undefined || handoffRetracted) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
handoffRetracted = true;
|
|
453
|
+
await retractPlaceholderMessage({
|
|
454
|
+
botToken: args.credentials?.botToken,
|
|
455
|
+
channelId: matchedHandoff.channelId,
|
|
456
|
+
ts: matchedHandoff.messageTs,
|
|
457
|
+
streamed: matchedHandoff.streamed,
|
|
458
|
+
log,
|
|
459
|
+
});
|
|
460
|
+
};
|
|
461
|
+
const adoptMatchedHandoff = async (): Promise<void> => {
|
|
462
|
+
if (matchedHandoff === undefined) {
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
const adoption = adoptPlaceholder({
|
|
466
|
+
channelId: matchedHandoff.channelId,
|
|
467
|
+
threadTs: matchedHandoff.threadTs,
|
|
468
|
+
ts: matchedHandoff.messageTs,
|
|
469
|
+
streamed: matchedHandoff.streamed,
|
|
470
|
+
});
|
|
471
|
+
if (adoption === "adopted") {
|
|
472
|
+
adoptedPlaceholder = true;
|
|
473
|
+
log.info("placeholder adopted from control-plane handoff", {
|
|
474
|
+
channel: message.channelId,
|
|
475
|
+
thread_ts: message.threadTs,
|
|
476
|
+
message_ts: matchedHandoff.messageTs,
|
|
477
|
+
});
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
if (adoption === "occupied") {
|
|
481
|
+
// Another delivery owns this thread's slot. Remove only this delivery's
|
|
482
|
+
// redundant CP post.
|
|
483
|
+
await retractUnadoptedHandoff();
|
|
484
|
+
}
|
|
485
|
+
};
|
|
486
|
+
const retractAdoptedPlaceholder = async (): Promise<void> => {
|
|
487
|
+
if (!adoptedPlaceholder) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
adoptedPlaceholder = false;
|
|
491
|
+
await retractPlaceholderSlot({
|
|
492
|
+
channelId: message.channelId,
|
|
493
|
+
threadTs: message.threadTs,
|
|
494
|
+
botToken: args.credentials?.botToken,
|
|
495
|
+
log,
|
|
496
|
+
});
|
|
497
|
+
};
|
|
498
|
+
|
|
416
499
|
const userId = message.author?.userId ?? "";
|
|
417
500
|
const teamId = message.teamId;
|
|
418
501
|
let membership: Promise<boolean> | undefined;
|
|
@@ -425,6 +508,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
425
508
|
user: userId,
|
|
426
509
|
event_id: args.eventId,
|
|
427
510
|
});
|
|
511
|
+
await retractUnadoptedHandoff();
|
|
428
512
|
return;
|
|
429
513
|
}
|
|
430
514
|
membership = isExternalSlackSender({
|
|
@@ -463,6 +547,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
463
547
|
) {
|
|
464
548
|
if (membership !== undefined && (await membership)) {
|
|
465
549
|
dropExternal();
|
|
550
|
+
await retractUnadoptedHandoff();
|
|
466
551
|
return;
|
|
467
552
|
}
|
|
468
553
|
log.info("stop directive", {
|
|
@@ -484,6 +569,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
484
569
|
} catch {
|
|
485
570
|
// best-effort status
|
|
486
571
|
}
|
|
572
|
+
await retractUnadoptedHandoff();
|
|
487
573
|
return;
|
|
488
574
|
}
|
|
489
575
|
|
|
@@ -501,6 +587,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
501
587
|
if (evalDirective !== null && args.host.evals !== undefined) {
|
|
502
588
|
if (membership !== undefined && (await membership)) {
|
|
503
589
|
dropExternal();
|
|
590
|
+
await retractUnadoptedHandoff();
|
|
504
591
|
return;
|
|
505
592
|
}
|
|
506
593
|
log.info("eval directive", {
|
|
@@ -516,6 +603,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
516
603
|
evals: args.host.evals,
|
|
517
604
|
binding,
|
|
518
605
|
});
|
|
606
|
+
await retractUnadoptedHandoff();
|
|
519
607
|
return;
|
|
520
608
|
}
|
|
521
609
|
|
|
@@ -530,8 +618,12 @@ export async function dispatchInboundMessage(args: {
|
|
|
530
618
|
event_id: args.eventId,
|
|
531
619
|
});
|
|
532
620
|
if (args.propagateHandlerErrors === true) {
|
|
621
|
+
if (mapThrownRequestError(error)?.retry !== "transient") {
|
|
622
|
+
await retractUnadoptedHandoff();
|
|
623
|
+
}
|
|
533
624
|
throw error;
|
|
534
625
|
}
|
|
626
|
+
await retractUnadoptedHandoff();
|
|
535
627
|
return;
|
|
536
628
|
}
|
|
537
629
|
if (decision === null || decision === undefined) {
|
|
@@ -541,6 +633,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
541
633
|
thread_ts: message.threadTs,
|
|
542
634
|
event_id: args.eventId,
|
|
543
635
|
});
|
|
636
|
+
await retractUnadoptedHandoff();
|
|
544
637
|
return;
|
|
545
638
|
}
|
|
546
639
|
|
|
@@ -560,6 +653,8 @@ export async function dispatchInboundMessage(args: {
|
|
|
560
653
|
return;
|
|
561
654
|
}
|
|
562
655
|
|
|
656
|
+
await adoptMatchedHandoff();
|
|
657
|
+
|
|
563
658
|
const painted =
|
|
564
659
|
args.ack === undefined
|
|
565
660
|
? undefined
|
|
@@ -580,8 +675,12 @@ export async function dispatchInboundMessage(args: {
|
|
|
580
675
|
});
|
|
581
676
|
}
|
|
582
677
|
|
|
678
|
+
// A control-plane placeholder is turn scaffolding, not thread history: the
|
|
679
|
+
// guest posts the reply over that exact ts, so hydrating it would feed the
|
|
680
|
+
// model its own "still working" line as an already-sent reply.
|
|
583
681
|
const excludeThreadTimestamps = [
|
|
584
682
|
message.ts,
|
|
683
|
+
...(handoffInThread === undefined ? [] : [handoffInThread.messageTs]),
|
|
585
684
|
...(decision.excludeThreadTimestamps ?? []),
|
|
586
685
|
];
|
|
587
686
|
const mergeMessages = [triggeringMergeMessage(message)];
|
|
@@ -639,6 +738,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
639
738
|
});
|
|
640
739
|
}
|
|
641
740
|
await args.host.slackNudges?.releaseAsk(message.channelId, message.ts);
|
|
741
|
+
await retractAdoptedPlaceholder();
|
|
642
742
|
return;
|
|
643
743
|
}
|
|
644
744
|
if (message.files !== undefined && message.files.length > 0) {
|
|
@@ -688,8 +788,10 @@ export async function dispatchInboundMessage(args: {
|
|
|
688
788
|
hosted &&
|
|
689
789
|
hasPlaceholder &&
|
|
690
790
|
(message.ts !== message.threadTs || continuationExists);
|
|
791
|
+
// Adopted slots already exist in Slack; skip a second post. Cold hosted
|
|
792
|
+
// without a handoff still defers to `turn.started`.
|
|
691
793
|
const placeholder =
|
|
692
|
-
hasPlaceholder && (!hosted || hostedFollowup)
|
|
794
|
+
!adoptedPlaceholder && hasPlaceholder && (!hosted || hostedFollowup)
|
|
693
795
|
? startPlaceholder({
|
|
694
796
|
line: placeholderLine,
|
|
695
797
|
botToken: args.credentials?.botToken,
|
|
@@ -700,7 +802,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
700
802
|
recipientTeamId: message.teamId,
|
|
701
803
|
})
|
|
702
804
|
: undefined;
|
|
703
|
-
const posted = placeholder !== undefined;
|
|
805
|
+
const posted = adoptedPlaceholder || placeholder !== undefined;
|
|
704
806
|
const state = emptySlackChannelState({
|
|
705
807
|
channelId: message.channelId,
|
|
706
808
|
threadTs: message.threadTs,
|
|
@@ -811,6 +913,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
811
913
|
if (placeholder !== undefined) {
|
|
812
914
|
await placeholder.retract();
|
|
813
915
|
}
|
|
916
|
+
await retractAdoptedPlaceholder();
|
|
814
917
|
if (painted !== undefined) {
|
|
815
918
|
await painted;
|
|
816
919
|
await retractTurnStart({
|
|
@@ -850,6 +953,21 @@ export function dispatchInboundFromEventBody(
|
|
|
850
953
|
): boolean {
|
|
851
954
|
const log = deps.log ?? defaultSlackLog;
|
|
852
955
|
let eventId: string | undefined;
|
|
956
|
+
const retractUnscheduledHandoff = (): void => {
|
|
957
|
+
const placeholder = deps.platformHandoff?.slackPlaceholder;
|
|
958
|
+
if (placeholder === undefined) {
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
deps.waitUntil(
|
|
962
|
+
retractPlaceholderMessage({
|
|
963
|
+
botToken: deps.credentials?.botToken,
|
|
964
|
+
channelId: placeholder.channelId,
|
|
965
|
+
ts: placeholder.messageTs,
|
|
966
|
+
streamed: placeholder.streamed,
|
|
967
|
+
log,
|
|
968
|
+
})
|
|
969
|
+
);
|
|
970
|
+
};
|
|
853
971
|
|
|
854
972
|
if (body !== null && typeof body === "object" && !Array.isArray(body)) {
|
|
855
973
|
const root = body as { event_id?: unknown };
|
|
@@ -857,6 +975,7 @@ export function dispatchInboundFromEventBody(
|
|
|
857
975
|
eventId = root.event_id;
|
|
858
976
|
if (!deps.eventIds.tryHandle(root.event_id)) {
|
|
859
977
|
log.debug("inbound dedupe drop", { event_id: eventId });
|
|
978
|
+
retractUnscheduledHandoff();
|
|
860
979
|
return false;
|
|
861
980
|
}
|
|
862
981
|
}
|
|
@@ -868,6 +987,7 @@ export function dispatchInboundFromEventBody(
|
|
|
868
987
|
if (mention !== null) {
|
|
869
988
|
if (deps.mentionsEnabled === false) {
|
|
870
989
|
log.debug("inbound ignored (mentions disabled)", { event_id: eventId });
|
|
990
|
+
retractUnscheduledHandoff();
|
|
871
991
|
return false;
|
|
872
992
|
}
|
|
873
993
|
if (mention.author?.isBot === true) {
|
|
@@ -885,6 +1005,7 @@ export function dispatchInboundFromEventBody(
|
|
|
885
1005
|
from_bot: mention.author.botId ?? mention.author.userId,
|
|
886
1006
|
reason: verdict.reason,
|
|
887
1007
|
});
|
|
1008
|
+
retractUnscheduledHandoff();
|
|
888
1009
|
return false;
|
|
889
1010
|
}
|
|
890
1011
|
}
|
|
@@ -894,6 +1015,7 @@ export function dispatchInboundFromEventBody(
|
|
|
894
1015
|
handler: deps.onAppMention,
|
|
895
1016
|
evalCommandsEnabled: deps.evalCommandsEnabled,
|
|
896
1017
|
eventId,
|
|
1018
|
+
platformHandoff: deps.platformHandoff,
|
|
897
1019
|
});
|
|
898
1020
|
return true;
|
|
899
1021
|
}
|
|
@@ -904,6 +1026,7 @@ export function dispatchInboundFromEventBody(
|
|
|
904
1026
|
log.debug("inbound ignored (direct messages disabled)", {
|
|
905
1027
|
event_id: eventId,
|
|
906
1028
|
});
|
|
1029
|
+
retractUnscheduledHandoff();
|
|
907
1030
|
return false;
|
|
908
1031
|
}
|
|
909
1032
|
scheduleInbound(deps, log, {
|
|
@@ -912,12 +1035,14 @@ export function dispatchInboundFromEventBody(
|
|
|
912
1035
|
handler: deps.onDirectMessage,
|
|
913
1036
|
evalCommandsEnabled: deps.evalCommandsEnabled,
|
|
914
1037
|
eventId,
|
|
1038
|
+
platformHandoff: deps.platformHandoff,
|
|
915
1039
|
});
|
|
916
1040
|
return true;
|
|
917
1041
|
}
|
|
918
1042
|
|
|
919
1043
|
const reaction = parseReactionAddedEvent(body);
|
|
920
1044
|
if (reaction !== null && deps.onReactionAdded !== undefined) {
|
|
1045
|
+
retractUnscheduledHandoff();
|
|
921
1046
|
scheduleInbound(deps, log, {
|
|
922
1047
|
kind: "reaction_added",
|
|
923
1048
|
message: reaction,
|
|
@@ -982,6 +1107,7 @@ export function dispatchInboundFromEventBody(
|
|
|
982
1107
|
includeBotAuthored: true,
|
|
983
1108
|
});
|
|
984
1109
|
if (channelEvent !== null) {
|
|
1110
|
+
retractUnscheduledHandoff();
|
|
985
1111
|
return deps.channelWatch.handle(channelEvent, eventId);
|
|
986
1112
|
}
|
|
987
1113
|
}
|
|
@@ -990,5 +1116,6 @@ export function dispatchInboundFromEventBody(
|
|
|
990
1116
|
...describeSlackEventShape(body),
|
|
991
1117
|
event_id: eventId,
|
|
992
1118
|
});
|
|
1119
|
+
retractUnscheduledHandoff();
|
|
993
1120
|
return false;
|
|
994
1121
|
}
|
|
@@ -122,6 +122,16 @@ async function retractKey(key: string, args: FinishArgs): Promise<void> {
|
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
+
/** Retract only one thread's slot; admission cleanup must not sweep DM peers. */
|
|
126
|
+
export async function retractPlaceholderSlot(args: {
|
|
127
|
+
channelId: string;
|
|
128
|
+
threadTs: string;
|
|
129
|
+
botToken: SlackBotToken | undefined;
|
|
130
|
+
log?: SlackLog;
|
|
131
|
+
}): Promise<void> {
|
|
132
|
+
await retractKey(slotKey(args.channelId, args.threadTs), args);
|
|
133
|
+
}
|
|
134
|
+
|
|
125
135
|
export async function finishPlaceholder(args: {
|
|
126
136
|
channelId: string;
|
|
127
137
|
threadTs: string;
|
|
@@ -155,6 +165,47 @@ export function startPlaceholder(args: {
|
|
|
155
165
|
};
|
|
156
166
|
}
|
|
157
167
|
|
|
168
|
+
/**
|
|
169
|
+
* Seed the in-process placeholder slot with a control-plane-posted message
|
|
170
|
+
* ts so the first agentic update overlays that exact Slack message.
|
|
171
|
+
*/
|
|
172
|
+
export type PlaceholderAdoption = "adopted" | "already_adopted" | "occupied";
|
|
173
|
+
|
|
174
|
+
export function adoptPlaceholder(args: {
|
|
175
|
+
channelId: string;
|
|
176
|
+
threadTs: string;
|
|
177
|
+
ts: string;
|
|
178
|
+
streamed?: boolean;
|
|
179
|
+
}): PlaceholderAdoption {
|
|
180
|
+
const key = slotKey(args.channelId, args.threadTs);
|
|
181
|
+
const existing = slots.get(key);
|
|
182
|
+
if (
|
|
183
|
+
existing !== undefined &&
|
|
184
|
+
!existing.claimed &&
|
|
185
|
+
existing.ts === args.ts &&
|
|
186
|
+
existing.streamed === (args.streamed === true)
|
|
187
|
+
) {
|
|
188
|
+
return "already_adopted";
|
|
189
|
+
}
|
|
190
|
+
if (!openPlaceholder(key)) {
|
|
191
|
+
return "occupied";
|
|
192
|
+
}
|
|
193
|
+
return rememberPlaceholder(key, args.ts, args.streamed === true)
|
|
194
|
+
? "adopted"
|
|
195
|
+
: "occupied";
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** Delete a control-plane placeholder that this process could not adopt. */
|
|
199
|
+
export async function retractPlaceholderMessage(args: {
|
|
200
|
+
botToken: SlackBotToken | undefined;
|
|
201
|
+
channelId: string;
|
|
202
|
+
ts: string;
|
|
203
|
+
streamed: boolean;
|
|
204
|
+
log?: SlackLog;
|
|
205
|
+
}): Promise<void> {
|
|
206
|
+
await retractPosted(args);
|
|
207
|
+
}
|
|
208
|
+
|
|
158
209
|
async function postPlaceholder(args: {
|
|
159
210
|
line: string;
|
|
160
211
|
botToken: SlackBotToken | undefined;
|
|
@@ -259,6 +259,7 @@ export function slackChannel(
|
|
|
259
259
|
continuationToken: string
|
|
260
260
|
) => Promise<string | undefined>;
|
|
261
261
|
interruptContinuation?: (continuationToken: string) => Promise<boolean>;
|
|
262
|
+
platformHandoff?: SlackInboundDispatchDeps["platformHandoff"];
|
|
262
263
|
}): SlackInboundDispatchDeps {
|
|
263
264
|
return {
|
|
264
265
|
send: args.send,
|
|
@@ -280,6 +281,9 @@ export function slackChannel(
|
|
|
280
281
|
ack: reply.ack,
|
|
281
282
|
placeholder: reply.placeholder,
|
|
282
283
|
blockExternals,
|
|
284
|
+
...(args.platformHandoff === undefined
|
|
285
|
+
? {}
|
|
286
|
+
: { platformHandoff: args.platformHandoff }),
|
|
283
287
|
...(args.hasContinuationSession === undefined
|
|
284
288
|
? {}
|
|
285
289
|
: { hasContinuationSession: args.hasContinuationSession }),
|
|
@@ -319,7 +323,9 @@ export function slackChannel(
|
|
|
319
323
|
ack: reply.ack ?? DEFAULT_ACK,
|
|
320
324
|
...(reply.placeholder === undefined
|
|
321
325
|
? {}
|
|
322
|
-
: {
|
|
326
|
+
: {
|
|
327
|
+
placeholder: reply.placeholder,
|
|
328
|
+
}),
|
|
323
329
|
},
|
|
324
330
|
}
|
|
325
331
|
: {}),
|
|
@@ -654,7 +660,7 @@ export function slackChannel(
|
|
|
654
660
|
// claim already dedupes Slack retries, and on a warm pod the local set
|
|
655
661
|
// would otherwise swallow the control plane's own retry of a delivery
|
|
656
662
|
// that failed after the id was marked handled.
|
|
657
|
-
dispatch: async ({ payload, args }) => {
|
|
663
|
+
dispatch: async ({ payload, args, platformHandoff }) => {
|
|
658
664
|
const dispatched = dispatchInboundFromEventBody(
|
|
659
665
|
payload,
|
|
660
666
|
inboundDeps({
|
|
@@ -668,6 +674,7 @@ export function slackChannel(
|
|
|
668
674
|
isContinuationBusy: args.isContinuationBusy,
|
|
669
675
|
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
670
676
|
interruptContinuation: args.interruptContinuation,
|
|
677
|
+
...(platformHandoff === undefined ? {} : { platformHandoff }),
|
|
671
678
|
})
|
|
672
679
|
);
|
|
673
680
|
return skipped(dispatched ? "not_engaged" : "not_dispatchable");
|
|
@@ -16,17 +16,13 @@ The result carries `agentId` (`bc-...`) and a `url`. Report both in full. Never
|
|
|
16
16
|
|
|
17
17
|
## Look an agent up by id
|
|
18
18
|
|
|
19
|
-
Call `get` with the `agent_id`. It returns the agent's `status` (`creating`, `running`, `finished`, `error`, or `
|
|
19
|
+
Call `get` with the `agent_id`. It returns the agent's `status` (`creating`, `running`, `finished`, `error`, `expired`, or `unknown`), its `branch` and pull request `prUrl` once pushed, change counts, a `summary` when one exists, and an `error` when it failed. A run takes minutes: check when asked or when you need the result, not in a tight loop. The final report itself comes from `dump`.
|
|
20
20
|
|
|
21
21
|
## Read what it did
|
|
22
22
|
|
|
23
|
-
To read the report or understand what was done, call `dump` with the `agent_id`.
|
|
23
|
+
To read the report or understand what was done, call `dump` with the `agent_id`. Once a transcript exists, it writes the agent's whole conversation to `cloud-agent-transcripts/<agent_id>.jsonl` in your workspace and returns the absolute `path` plus `finalMessage`. Before any transcript exists, either value may be absent; wait for output instead of inventing a report.
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
- `grep '"toolCalls"' <path>` shows the commands and edits it made.
|
|
27
|
-
- `grep '"role":"user"' <path>` shows every prompt it received, including replies.
|
|
28
|
-
|
|
29
|
-
Use `dump` before summarizing an agent's work for a person, and to understand a failure before replying with a fix.
|
|
25
|
+
Use `finalMessage` as the agent's report. Read the returned transcript path when you need its prompts, reasoning, or tool calls, then inspect the resulting branch or pull request before claiming exact code changes. The transcript is evidence of what the agent did, not a canonical diff.
|
|
30
26
|
|
|
31
27
|
## Reply
|
|
32
28
|
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* repository, so changing how it behaves is a change to that source: a
|
|
4
4
|
* one-off Cursor cloud agent does the coding on a branch and opens a pull
|
|
5
5
|
* request, the agent that mounted this writes the brief and reports the
|
|
6
|
-
* pull request
|
|
6
|
+
* pull request. Durable behavior changes only after review, merge, and
|
|
7
|
+
* deployment. A cloud-runtime turn may edit its ephemeral checkout while
|
|
8
|
+
* preparing the pull request.
|
|
7
9
|
*
|
|
8
10
|
* ```ts
|
|
9
11
|
* // agent/extensions/improve.ts
|
|
@@ -52,7 +54,7 @@ const line = z.string().trim().min(1);
|
|
|
52
54
|
const improve: Extension<ImproveConfig, ImproveOptions> = defineExtension({
|
|
53
55
|
root: import.meta.dirname,
|
|
54
56
|
description:
|
|
55
|
-
"
|
|
57
|
+
"Propose changes to your own source through a branch and pull request; durable behavior changes after review and deployment.",
|
|
56
58
|
config: z.object({
|
|
57
59
|
repo: z.string().url(),
|
|
58
60
|
path: z
|
|
@@ -29,7 +29,7 @@ Under \`${path}/agent/\`:
|
|
|
29
29
|
${treeNotes}
|
|
30
30
|
## The change is made on a clean checkout
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Durable source changes happen on a branch from a clean checkout of ${repo} at \`${ref}\`, never by mutating a deployed local-runtime copy. When your own turn runs on a cloud VM with that repository checked out, its ephemeral tree is the checkout: branch there. Otherwise hand the coding to a one-off Cursor cloud agent through the cloud agents extension, with \`launch\` under its mount namespace, \`repo\` set to ${repo}, and \`starting_ref\` to \`${ref}\`. One agent per change; steer it with \`reply\` instead of launching another.
|
|
33
33
|
|
|
34
34
|
## The brief
|
|
35
35
|
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jev decisions as an extension. Mount it and the agent can ask Jev for
|
|
3
|
+
* typed boolean, choice, and score answers, then call `decide` from your
|
|
4
|
+
* own channel hooks and tools before they start a turn or write.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* // agent/extensions/jev.ts
|
|
8
|
+
* import jev from "@cursor/july/extensions/jev";
|
|
9
|
+
*
|
|
10
|
+
* export default jev();
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* Contributes `<namespace>__evaluate` plus the `questions` and
|
|
14
|
+
* `gated-write` skills (the namespace is the mount filename). Auth is
|
|
15
|
+
* `TYPESAFE_API_KEY`. The default model is `jev-latest`. Custom tools
|
|
16
|
+
* import `decide`, `above`, and `needsHuman` from this same module. Set
|
|
17
|
+
* `harnessTools` or `skills` to false when the agent should not see those
|
|
18
|
+
* contributions.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
import { defineExtension } from "../../extensions.js";
|
|
23
|
+
import type { Extension } from "../../types.js";
|
|
24
|
+
import { DEFAULT_EVALUATION_MODEL } from "./lib/evaluate.js";
|
|
25
|
+
|
|
26
|
+
/** Mount options; every field is optional. */
|
|
27
|
+
export interface JevOptions {
|
|
28
|
+
/** TypeSafe API key. Defaults to `TYPESAFE_API_KEY`. */
|
|
29
|
+
apiKey?: string;
|
|
30
|
+
/** TypeSafe model id. Defaults to `jev-latest`. */
|
|
31
|
+
model?: string;
|
|
32
|
+
/** Mount the namespaced `evaluate` harness tool. Defaults to true. */
|
|
33
|
+
harnessTools?: boolean;
|
|
34
|
+
/** Mount the `questions` and `gated-write` skills. Defaults to true. */
|
|
35
|
+
skills?: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** {@link JevOptions} with defaults applied. */
|
|
39
|
+
export interface JevConfig {
|
|
40
|
+
apiKey?: string;
|
|
41
|
+
model: string;
|
|
42
|
+
harnessTools: boolean;
|
|
43
|
+
skills: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const config: z.ZodType<JevConfig, z.ZodTypeDef, JevOptions | undefined> = z
|
|
47
|
+
.object({
|
|
48
|
+
apiKey: z.string().min(1).optional(),
|
|
49
|
+
model: z.string().min(1).optional(),
|
|
50
|
+
harnessTools: z.boolean().default(true),
|
|
51
|
+
skills: z.boolean().default(true),
|
|
52
|
+
})
|
|
53
|
+
.default({})
|
|
54
|
+
.transform(options => ({
|
|
55
|
+
apiKey: options.apiKey,
|
|
56
|
+
model: options.model ?? DEFAULT_EVALUATION_MODEL,
|
|
57
|
+
harnessTools: options.harnessTools,
|
|
58
|
+
skills: options.skills,
|
|
59
|
+
}));
|
|
60
|
+
|
|
61
|
+
const jev: Extension<JevConfig, JevOptions | undefined> = defineExtension({
|
|
62
|
+
root: import.meta.dirname,
|
|
63
|
+
description: "Ask Jev for typed choice, score, and boolean answers.",
|
|
64
|
+
config,
|
|
65
|
+
contributions: options => ({
|
|
66
|
+
tools: options.harnessTools,
|
|
67
|
+
skills: options.skills,
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
export type {
|
|
72
|
+
AnswersFor,
|
|
73
|
+
BooleanAnswer,
|
|
74
|
+
BooleanQuestion,
|
|
75
|
+
ChoiceAnswer,
|
|
76
|
+
ChoiceQuestion,
|
|
77
|
+
EvaluateArgs,
|
|
78
|
+
EvaluateResult,
|
|
79
|
+
EvaluationAnswer,
|
|
80
|
+
EvaluationQuestion,
|
|
81
|
+
EvaluationState,
|
|
82
|
+
QuestionMap,
|
|
83
|
+
ScoreAnswer,
|
|
84
|
+
ScoreQuestion,
|
|
85
|
+
} from "./lib/evaluate.js";
|
|
86
|
+
export {
|
|
87
|
+
above,
|
|
88
|
+
DEFAULT_EVALUATION_MODEL,
|
|
89
|
+
DEFAULT_HUMAN_THRESHOLD,
|
|
90
|
+
decide,
|
|
91
|
+
evaluate,
|
|
92
|
+
needsHuman,
|
|
93
|
+
} from "./lib/evaluate.js";
|
|
94
|
+
|
|
95
|
+
export default jev;
|