@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
|
@@ -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,68 @@ export async function dispatchInboundMessage(args: {
|
|
|
413
433
|
team: message.teamId,
|
|
414
434
|
});
|
|
415
435
|
|
|
436
|
+
const handoff = args.platformHandoff?.slackPlaceholder;
|
|
437
|
+
const matchedHandoff =
|
|
438
|
+
args.placeholder !== undefined &&
|
|
439
|
+
kind !== "channel_post" &&
|
|
440
|
+
handoff !== undefined &&
|
|
441
|
+
handoff.channelId === message.channelId &&
|
|
442
|
+
handoff.threadTs === message.threadTs
|
|
443
|
+
? handoff
|
|
444
|
+
: undefined;
|
|
445
|
+
let adoptedPlaceholder = false;
|
|
446
|
+
let handoffRetracted = false;
|
|
447
|
+
const retractUnadoptedHandoff = async (): Promise<void> => {
|
|
448
|
+
if (matchedHandoff === undefined || handoffRetracted) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
handoffRetracted = true;
|
|
452
|
+
await retractPlaceholderMessage({
|
|
453
|
+
botToken: args.credentials?.botToken,
|
|
454
|
+
channelId: matchedHandoff.channelId,
|
|
455
|
+
ts: matchedHandoff.messageTs,
|
|
456
|
+
streamed: matchedHandoff.streamed,
|
|
457
|
+
log,
|
|
458
|
+
});
|
|
459
|
+
};
|
|
460
|
+
const adoptMatchedHandoff = async (): Promise<void> => {
|
|
461
|
+
if (matchedHandoff === undefined) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
const adoption = adoptPlaceholder({
|
|
465
|
+
channelId: matchedHandoff.channelId,
|
|
466
|
+
threadTs: matchedHandoff.threadTs,
|
|
467
|
+
ts: matchedHandoff.messageTs,
|
|
468
|
+
streamed: matchedHandoff.streamed,
|
|
469
|
+
});
|
|
470
|
+
if (adoption === "adopted") {
|
|
471
|
+
adoptedPlaceholder = true;
|
|
472
|
+
log.info("placeholder adopted from control-plane handoff", {
|
|
473
|
+
channel: message.channelId,
|
|
474
|
+
thread_ts: message.threadTs,
|
|
475
|
+
message_ts: matchedHandoff.messageTs,
|
|
476
|
+
});
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
if (adoption === "occupied") {
|
|
480
|
+
// Another delivery owns this thread's slot. Remove only this delivery's
|
|
481
|
+
// redundant CP post.
|
|
482
|
+
await retractUnadoptedHandoff();
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
const retractAdoptedPlaceholder = async (): Promise<void> => {
|
|
486
|
+
if (!adoptedPlaceholder) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
adoptedPlaceholder = false;
|
|
490
|
+
await retractPlaceholderSlot({
|
|
491
|
+
channelId: message.channelId,
|
|
492
|
+
threadTs: message.threadTs,
|
|
493
|
+
botToken: args.credentials?.botToken,
|
|
494
|
+
log,
|
|
495
|
+
});
|
|
496
|
+
};
|
|
497
|
+
|
|
416
498
|
const userId = message.author?.userId ?? "";
|
|
417
499
|
const teamId = message.teamId;
|
|
418
500
|
let membership: Promise<boolean> | undefined;
|
|
@@ -425,6 +507,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
425
507
|
user: userId,
|
|
426
508
|
event_id: args.eventId,
|
|
427
509
|
});
|
|
510
|
+
await retractUnadoptedHandoff();
|
|
428
511
|
return;
|
|
429
512
|
}
|
|
430
513
|
membership = isExternalSlackSender({
|
|
@@ -463,6 +546,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
463
546
|
) {
|
|
464
547
|
if (membership !== undefined && (await membership)) {
|
|
465
548
|
dropExternal();
|
|
549
|
+
await retractUnadoptedHandoff();
|
|
466
550
|
return;
|
|
467
551
|
}
|
|
468
552
|
log.info("stop directive", {
|
|
@@ -484,6 +568,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
484
568
|
} catch {
|
|
485
569
|
// best-effort status
|
|
486
570
|
}
|
|
571
|
+
await retractUnadoptedHandoff();
|
|
487
572
|
return;
|
|
488
573
|
}
|
|
489
574
|
|
|
@@ -501,6 +586,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
501
586
|
if (evalDirective !== null && args.host.evals !== undefined) {
|
|
502
587
|
if (membership !== undefined && (await membership)) {
|
|
503
588
|
dropExternal();
|
|
589
|
+
await retractUnadoptedHandoff();
|
|
504
590
|
return;
|
|
505
591
|
}
|
|
506
592
|
log.info("eval directive", {
|
|
@@ -516,6 +602,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
516
602
|
evals: args.host.evals,
|
|
517
603
|
binding,
|
|
518
604
|
});
|
|
605
|
+
await retractUnadoptedHandoff();
|
|
519
606
|
return;
|
|
520
607
|
}
|
|
521
608
|
|
|
@@ -530,8 +617,12 @@ export async function dispatchInboundMessage(args: {
|
|
|
530
617
|
event_id: args.eventId,
|
|
531
618
|
});
|
|
532
619
|
if (args.propagateHandlerErrors === true) {
|
|
620
|
+
if (mapThrownRequestError(error)?.retry !== "transient") {
|
|
621
|
+
await retractUnadoptedHandoff();
|
|
622
|
+
}
|
|
533
623
|
throw error;
|
|
534
624
|
}
|
|
625
|
+
await retractUnadoptedHandoff();
|
|
535
626
|
return;
|
|
536
627
|
}
|
|
537
628
|
if (decision === null || decision === undefined) {
|
|
@@ -541,6 +632,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
541
632
|
thread_ts: message.threadTs,
|
|
542
633
|
event_id: args.eventId,
|
|
543
634
|
});
|
|
635
|
+
await retractUnadoptedHandoff();
|
|
544
636
|
return;
|
|
545
637
|
}
|
|
546
638
|
|
|
@@ -560,6 +652,8 @@ export async function dispatchInboundMessage(args: {
|
|
|
560
652
|
return;
|
|
561
653
|
}
|
|
562
654
|
|
|
655
|
+
await adoptMatchedHandoff();
|
|
656
|
+
|
|
563
657
|
const painted =
|
|
564
658
|
args.ack === undefined
|
|
565
659
|
? undefined
|
|
@@ -639,6 +733,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
639
733
|
});
|
|
640
734
|
}
|
|
641
735
|
await args.host.slackNudges?.releaseAsk(message.channelId, message.ts);
|
|
736
|
+
await retractAdoptedPlaceholder();
|
|
642
737
|
return;
|
|
643
738
|
}
|
|
644
739
|
if (message.files !== undefined && message.files.length > 0) {
|
|
@@ -688,8 +783,10 @@ export async function dispatchInboundMessage(args: {
|
|
|
688
783
|
hosted &&
|
|
689
784
|
hasPlaceholder &&
|
|
690
785
|
(message.ts !== message.threadTs || continuationExists);
|
|
786
|
+
// Adopted slots already exist in Slack; skip a second post. Cold hosted
|
|
787
|
+
// without a handoff still defers to `turn.started`.
|
|
691
788
|
const placeholder =
|
|
692
|
-
hasPlaceholder && (!hosted || hostedFollowup)
|
|
789
|
+
!adoptedPlaceholder && hasPlaceholder && (!hosted || hostedFollowup)
|
|
693
790
|
? startPlaceholder({
|
|
694
791
|
line: placeholderLine,
|
|
695
792
|
botToken: args.credentials?.botToken,
|
|
@@ -700,7 +797,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
700
797
|
recipientTeamId: message.teamId,
|
|
701
798
|
})
|
|
702
799
|
: undefined;
|
|
703
|
-
const posted = placeholder !== undefined;
|
|
800
|
+
const posted = adoptedPlaceholder || placeholder !== undefined;
|
|
704
801
|
const state = emptySlackChannelState({
|
|
705
802
|
channelId: message.channelId,
|
|
706
803
|
threadTs: message.threadTs,
|
|
@@ -811,6 +908,7 @@ export async function dispatchInboundMessage(args: {
|
|
|
811
908
|
if (placeholder !== undefined) {
|
|
812
909
|
await placeholder.retract();
|
|
813
910
|
}
|
|
911
|
+
await retractAdoptedPlaceholder();
|
|
814
912
|
if (painted !== undefined) {
|
|
815
913
|
await painted;
|
|
816
914
|
await retractTurnStart({
|
|
@@ -850,6 +948,21 @@ export function dispatchInboundFromEventBody(
|
|
|
850
948
|
): boolean {
|
|
851
949
|
const log = deps.log ?? defaultSlackLog;
|
|
852
950
|
let eventId: string | undefined;
|
|
951
|
+
const retractUnscheduledHandoff = (): void => {
|
|
952
|
+
const placeholder = deps.platformHandoff?.slackPlaceholder;
|
|
953
|
+
if (placeholder === undefined) {
|
|
954
|
+
return;
|
|
955
|
+
}
|
|
956
|
+
deps.waitUntil(
|
|
957
|
+
retractPlaceholderMessage({
|
|
958
|
+
botToken: deps.credentials?.botToken,
|
|
959
|
+
channelId: placeholder.channelId,
|
|
960
|
+
ts: placeholder.messageTs,
|
|
961
|
+
streamed: placeholder.streamed,
|
|
962
|
+
log,
|
|
963
|
+
})
|
|
964
|
+
);
|
|
965
|
+
};
|
|
853
966
|
|
|
854
967
|
if (body !== null && typeof body === "object" && !Array.isArray(body)) {
|
|
855
968
|
const root = body as { event_id?: unknown };
|
|
@@ -857,6 +970,7 @@ export function dispatchInboundFromEventBody(
|
|
|
857
970
|
eventId = root.event_id;
|
|
858
971
|
if (!deps.eventIds.tryHandle(root.event_id)) {
|
|
859
972
|
log.debug("inbound dedupe drop", { event_id: eventId });
|
|
973
|
+
retractUnscheduledHandoff();
|
|
860
974
|
return false;
|
|
861
975
|
}
|
|
862
976
|
}
|
|
@@ -868,6 +982,7 @@ export function dispatchInboundFromEventBody(
|
|
|
868
982
|
if (mention !== null) {
|
|
869
983
|
if (deps.mentionsEnabled === false) {
|
|
870
984
|
log.debug("inbound ignored (mentions disabled)", { event_id: eventId });
|
|
985
|
+
retractUnscheduledHandoff();
|
|
871
986
|
return false;
|
|
872
987
|
}
|
|
873
988
|
if (mention.author?.isBot === true) {
|
|
@@ -885,6 +1000,7 @@ export function dispatchInboundFromEventBody(
|
|
|
885
1000
|
from_bot: mention.author.botId ?? mention.author.userId,
|
|
886
1001
|
reason: verdict.reason,
|
|
887
1002
|
});
|
|
1003
|
+
retractUnscheduledHandoff();
|
|
888
1004
|
return false;
|
|
889
1005
|
}
|
|
890
1006
|
}
|
|
@@ -894,6 +1010,7 @@ export function dispatchInboundFromEventBody(
|
|
|
894
1010
|
handler: deps.onAppMention,
|
|
895
1011
|
evalCommandsEnabled: deps.evalCommandsEnabled,
|
|
896
1012
|
eventId,
|
|
1013
|
+
platformHandoff: deps.platformHandoff,
|
|
897
1014
|
});
|
|
898
1015
|
return true;
|
|
899
1016
|
}
|
|
@@ -904,6 +1021,7 @@ export function dispatchInboundFromEventBody(
|
|
|
904
1021
|
log.debug("inbound ignored (direct messages disabled)", {
|
|
905
1022
|
event_id: eventId,
|
|
906
1023
|
});
|
|
1024
|
+
retractUnscheduledHandoff();
|
|
907
1025
|
return false;
|
|
908
1026
|
}
|
|
909
1027
|
scheduleInbound(deps, log, {
|
|
@@ -912,12 +1030,14 @@ export function dispatchInboundFromEventBody(
|
|
|
912
1030
|
handler: deps.onDirectMessage,
|
|
913
1031
|
evalCommandsEnabled: deps.evalCommandsEnabled,
|
|
914
1032
|
eventId,
|
|
1033
|
+
platformHandoff: deps.platformHandoff,
|
|
915
1034
|
});
|
|
916
1035
|
return true;
|
|
917
1036
|
}
|
|
918
1037
|
|
|
919
1038
|
const reaction = parseReactionAddedEvent(body);
|
|
920
1039
|
if (reaction !== null && deps.onReactionAdded !== undefined) {
|
|
1040
|
+
retractUnscheduledHandoff();
|
|
921
1041
|
scheduleInbound(deps, log, {
|
|
922
1042
|
kind: "reaction_added",
|
|
923
1043
|
message: reaction,
|
|
@@ -982,6 +1102,7 @@ export function dispatchInboundFromEventBody(
|
|
|
982
1102
|
includeBotAuthored: true,
|
|
983
1103
|
});
|
|
984
1104
|
if (channelEvent !== null) {
|
|
1105
|
+
retractUnscheduledHandoff();
|
|
985
1106
|
return deps.channelWatch.handle(channelEvent, eventId);
|
|
986
1107
|
}
|
|
987
1108
|
}
|
|
@@ -990,5 +1111,6 @@ export function dispatchInboundFromEventBody(
|
|
|
990
1111
|
...describeSlackEventShape(body),
|
|
991
1112
|
event_id: eventId,
|
|
992
1113
|
});
|
|
1114
|
+
retractUnscheduledHandoff();
|
|
993
1115
|
return false;
|
|
994
1116
|
}
|
|
@@ -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
|
|