@cursor/july 0.1.109 → 0.1.111
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/AGENTS.md +1 -1
- package/README.md +0 -15
- package/dist/bin/agent-serve.js +81 -66
- package/dist/channels/bitbucket/api.js +8 -8
- package/dist/channels/bitbucket/binding.js +4 -4
- package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +1 -1
- package/dist/channels/bitbucket/checks.d.ts.map +1 -1
- package/dist/channels/bitbucket/checks.js +1 -1
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/events.js +1 -1
- package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
- package/dist/channels/checks.d.ts.map +1 -1
- package/dist/channels/checks.js +2 -2
- package/dist/channels/deployments/deployments-channel.js +1 -1
- package/dist/channels/github/cursor-account.js +3 -3
- package/dist/channels/github/defaults.d.ts.map +1 -1
- package/dist/channels/github/defaults.js +5 -3
- package/dist/channels/github/events.js +1 -1
- package/dist/channels/github/forward.js +8 -8
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +17 -13
- package/dist/channels/github/progress.d.ts.map +1 -1
- package/dist/channels/github/progress.js +7 -2
- package/dist/channels/github/state.d.ts +6 -0
- package/dist/channels/github/state.d.ts.map +1 -1
- package/dist/channels/github/types.d.ts +6 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/binding.js +4 -4
- package/dist/channels/gitlab/checks.d.ts.map +1 -1
- package/dist/channels/gitlab/checks.js +1 -1
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/events.js +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +1 -1
- package/dist/channels/gitlab/replay.js +2 -2
- package/dist/channels/origin/binding.d.ts +2 -0
- package/dist/channels/origin/binding.d.ts.map +1 -1
- package/dist/channels/origin/binding.js +3 -3
- package/dist/channels/origin/checks.d.ts +19 -7
- package/dist/channels/origin/checks.d.ts.map +1 -1
- package/dist/channels/origin/checks.js +13 -9
- package/dist/channels/origin/cursor-account.js +1 -1
- package/dist/channels/origin/defaults.d.ts.map +1 -1
- package/dist/channels/origin/defaults.js +3 -1
- package/dist/channels/origin/events.js +1 -1
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +2 -1
- package/dist/channels/origin/origin-webhook.js +2 -2
- package/dist/channels/slack/agentic-delivery.d.ts +23 -0
- package/dist/channels/slack/agentic-delivery.d.ts.map +1 -0
- package/dist/channels/slack/agentic-delivery.js +558 -0
- package/dist/channels/slack/agentic-posted.d.ts +30 -0
- package/dist/channels/slack/agentic-posted.d.ts.map +1 -0
- package/dist/channels/slack/agentic-posted.js +102 -0
- package/dist/channels/slack/agentic-signals.d.ts +48 -0
- package/dist/channels/slack/agentic-signals.d.ts.map +1 -0
- package/dist/channels/slack/agentic-signals.js +204 -0
- package/dist/channels/slack/api.d.ts +20 -1
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +43 -11
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/auth.d.ts.map +1 -1
- package/dist/channels/slack/auth.js +3 -1
- package/dist/channels/slack/blocks.js +3 -3
- package/dist/channels/slack/bot-mentions.d.ts.map +1 -1
- package/dist/channels/slack/bot-mentions.js +5 -5
- package/dist/channels/slack/channel-watch.js +1 -1
- package/dist/channels/slack/cli-project.js +3 -3
- package/dist/channels/slack/defaults.d.ts +3 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +90 -29
- package/dist/channels/slack/dispatch.d.ts +34 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +219 -106
- package/dist/channels/slack/doctor.js +1 -1
- package/dist/channels/slack/eval-directive.js +1 -1
- package/dist/channels/slack/external-policy.d.ts +2 -1
- package/dist/channels/slack/external-policy.d.ts.map +1 -1
- package/dist/channels/slack/external-policy.js +13 -2
- package/dist/channels/slack/footer.d.ts +30 -0
- package/dist/channels/slack/footer.d.ts.map +1 -0
- package/dist/channels/slack/footer.js +88 -0
- package/dist/channels/slack/index.d.ts +2 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +2 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +5 -3
- package/dist/channels/slack/live-delivery.d.ts +1 -1
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +20 -6
- package/dist/channels/slack/log.d.ts.map +1 -1
- package/dist/channels/slack/log.js +1 -1
- package/dist/channels/slack/manifest.js +1 -1
- package/dist/channels/slack/nudge-carrier.js +1 -1
- package/dist/channels/slack/nudge-store.js +2 -2
- package/dist/channels/slack/paint-start.d.ts +22 -0
- package/dist/channels/slack/paint-start.d.ts.map +1 -0
- package/dist/channels/slack/paint-start.js +91 -0
- package/dist/channels/slack/placeholder.d.ts +36 -0
- package/dist/channels/slack/placeholder.d.ts.map +1 -0
- package/dist/channels/slack/placeholder.js +240 -0
- package/dist/channels/slack/progress-delivery.d.ts.map +1 -1
- package/dist/channels/slack/progress-delivery.js +13 -4
- package/dist/channels/slack/reasoning-chip.d.ts +8 -0
- package/dist/channels/slack/reasoning-chip.d.ts.map +1 -0
- package/dist/channels/slack/reasoning-chip.js +30 -0
- package/dist/channels/slack/recording-sink.d.ts +29 -0
- package/dist/channels/slack/recording-sink.d.ts.map +1 -0
- package/dist/channels/slack/recording-sink.js +142 -0
- package/dist/channels/slack/reply-options.d.ts +8 -1
- package/dist/channels/slack/reply-options.d.ts.map +1 -1
- package/dist/channels/slack/reply-options.js +59 -14
- package/dist/channels/slack/setup.js +1 -1
- package/dist/channels/slack/slack-channel.d.ts +2 -2
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +55 -20
- package/dist/channels/slack/socket-mode.js +2 -2
- package/dist/channels/slack/thread-context.js +5 -5
- package/dist/channels/slack/tool-approval-events.d.ts +5 -0
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
- package/dist/channels/slack/tool-approval-events.js +50 -38
- package/dist/channels/slack/tool-cards.js +1 -1
- package/dist/channels/slack/tool-chip.d.ts +9 -0
- package/dist/channels/slack/tool-chip.d.ts.map +1 -0
- package/dist/channels/slack/tool-chip.js +25 -0
- package/dist/channels/slack/types.d.ts +49 -7
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.d.ts +13 -0
- package/dist/channels/slack/upload.d.ts.map +1 -0
- package/dist/channels/slack/upload.js +135 -0
- package/dist/channels.d.ts +10 -14
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +9 -21
- package/dist/dashboard-session-url.d.ts +15 -0
- package/dist/dashboard-session-url.d.ts.map +1 -0
- package/dist/dashboard-session-url.js +25 -0
- package/dist/docs/404.html +3 -3
- package/dist/docs/architecture.svg +59 -0
- package/dist/docs/assets/app.Drol6mi6.js +309 -0
- package/dist/docs/assets/{building-with-agents.md.D0KbSkJn.js → building-with-agents.md.CEGVXkmO.js} +2 -2
- package/dist/docs/assets/{building-with-agents.md.D0KbSkJn.lean.js → building-with-agents.md.CEGVXkmO.lean.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CVQERt56.js → VPLocalSearchBox.CdqoBZJX.js} +2 -2
- package/dist/docs/assets/chunks/arc.BVX3ycTn.js +1 -0
- package/dist/docs/assets/chunks/architectureDiagram-Q4EWVU46.CcChnMxX.js +36 -0
- package/dist/docs/assets/chunks/baseUniq.xwtXO-yt.js +1 -0
- package/dist/docs/assets/chunks/blockDiagram-DXYQGD6D.CijZ_taK.js +132 -0
- package/dist/docs/assets/chunks/c4Diagram-AHTNJAMY.0FBvwBvK.js +10 -0
- package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +1 -0
- package/dist/docs/assets/chunks/chunk-4BX2VUAB.CELMmMDA.js +1 -0
- package/dist/docs/assets/chunks/chunk-4TB4RGXK.C4bhFtSm.js +206 -0
- package/dist/docs/assets/chunks/chunk-55IACEB6.ZnQ9gRRQ.js +1 -0
- package/dist/docs/assets/chunks/chunk-EDXVE4YY.DPlmglG-.js +1 -0
- package/dist/docs/assets/chunks/chunk-FMBD7UC4.BrUk8pff.js +15 -0
- package/dist/docs/assets/chunks/chunk-OYMX7WX6.CcmWIncu.js +231 -0
- package/dist/docs/assets/chunks/chunk-QZHKN3VN.D65-cs8I.js +1 -0
- package/dist/docs/assets/chunks/chunk-YZCP3GAM.qoXZpG9F.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +1 -0
- package/dist/docs/assets/chunks/clone.YSt_40_s.js +1 -0
- package/dist/docs/assets/chunks/cose-bilkent-S5V4N54A.8rYtqudO.js +1 -0
- package/dist/docs/assets/chunks/cytoscape.esm.BQk4lpUV.js +331 -0
- package/dist/docs/assets/chunks/dagre-KV5264BT.DrRP1fOh.js +4 -0
- package/dist/docs/assets/chunks/defaultLocale.C4B-KCzX.js +1 -0
- package/dist/docs/assets/chunks/diagram-5BDNPKRD.DHj_xA2_.js +10 -0
- package/dist/docs/assets/chunks/diagram-G4DWMVQ6.Bz_6nAKj.js +24 -0
- package/dist/docs/assets/chunks/diagram-MMDJMWI5.BWA0xSW9.js +43 -0
- package/dist/docs/assets/chunks/diagram-TYMM5635.CpTJLNJI.js +24 -0
- package/dist/docs/assets/chunks/erDiagram-SMLLAGMA.-7AWWSrP.js +85 -0
- package/dist/docs/assets/chunks/flowDiagram-DWJPFMVM.BTnQ742_.js +162 -0
- package/dist/docs/assets/chunks/framework.dypDpWZ3.js +19 -0
- package/dist/docs/assets/chunks/ganttDiagram-T4ZO3ILL.B5_HiiQ5.js +292 -0
- package/dist/docs/assets/chunks/gitGraphDiagram-UUTBAWPF.CZcNTFZd.js +106 -0
- package/dist/docs/assets/chunks/graph.V2GLaab4.js +1 -0
- package/dist/docs/assets/chunks/infoDiagram-42DDH7IO.7pZOkCCU.js +2 -0
- package/dist/docs/assets/chunks/init.Gi6I4Gst.js +1 -0
- package/dist/docs/assets/chunks/ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js +70 -0
- package/dist/docs/assets/chunks/journeyDiagram-VCZTEJTY.BNEgWN1S.js +139 -0
- package/dist/docs/assets/chunks/kanban-definition-6JOO6SKY.B-4d4tC7.js +89 -0
- package/dist/docs/assets/chunks/katex.DkKDou_j.js +257 -0
- package/dist/docs/assets/chunks/layout.Dvbn9nSb.js +1 -0
- package/dist/docs/assets/chunks/linear.D2GM4p4b.js +1 -0
- package/dist/docs/assets/chunks/min.DVBtLK-B.js +1 -0
- package/dist/docs/assets/chunks/mindmap-definition-QFDTVHPH.CnJRI55x.js +96 -0
- package/dist/docs/assets/chunks/ordinal.DBvzRdQf.js +1 -0
- package/dist/docs/assets/chunks/pieDiagram-DEJITSTG.CtoaTFlA.js +30 -0
- package/dist/docs/assets/chunks/quadrantDiagram-34T5L4WZ.DtT24_vN.js +7 -0
- package/dist/docs/assets/chunks/requirementDiagram-MS252O5E.CjSO4o8f.js +84 -0
- package/dist/docs/assets/chunks/sankeyDiagram-XADWPNL6.-wWiIVWa.js +10 -0
- package/dist/docs/assets/chunks/sequenceDiagram-FGHM5R23.DSk8s4gX.js +157 -0
- package/dist/docs/assets/chunks/stateDiagram-FHFEXIEX.BFKAsdkN.js +1 -0
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +1 -0
- package/dist/docs/assets/chunks/{theme.Dnsd3XOn.js → theme.C0MctGaz.js} +2 -2
- package/dist/docs/assets/chunks/timeline-definition-GMOUNBTQ.TUNJbAFe.js +120 -0
- package/dist/docs/assets/chunks/vennDiagram-DHZGUBPP.C-RGNnk4.js +34 -0
- package/dist/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js +1 -0
- package/dist/docs/assets/chunks/wardley-RL74JXVD.g5efOWmT.js +162 -0
- package/dist/docs/assets/chunks/wardleyDiagram-NUSXRM2D.DH4zt73Y.js +20 -0
- package/dist/docs/assets/chunks/xychartDiagram-5P7HB3ND.B-3k6bF6.js +7 -0
- package/dist/docs/assets/{deployment.md.JenwuCCB.js → deployment.md.Dm4Qo3hp.js} +5 -5
- package/dist/docs/assets/{deployment.md.JenwuCCB.lean.js → deployment.md.Dm4Qo3hp.lean.js} +1 -1
- package/dist/docs/assets/{evals.md.C7JLjoEP.js → evals.md.BLDRt5LH.js} +4 -4
- package/dist/docs/assets/{evals.md.C7JLjoEP.lean.js → evals.md.BLDRt5LH.lean.js} +1 -1
- package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +14 -0
- package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +1 -0
- package/dist/docs/assets/{guides_bitbucket.md.DZPzmUjU.js → guides_bitbucket.md.CTpCl__f.js} +1 -1
- package/dist/docs/assets/{guides_bitbucket.md.DZPzmUjU.lean.js → guides_bitbucket.md.CTpCl__f.lean.js} +1 -1
- package/dist/docs/assets/{guides_cloud-agents.md.BsloyHdY.js → guides_cloud-agents.md.lSE_l7lH.js} +2 -2
- package/dist/docs/assets/{guides_cloud-agents.md.BsloyHdY.lean.js → guides_cloud-agents.md.lSE_l7lH.lean.js} +1 -1
- package/dist/docs/assets/{guides_convert-automation.md.B4sjlodG.js → guides_convert-automation.md.Ck6Cr68A.js} +1 -1
- package/dist/docs/assets/{guides_convert-automation.md.B4sjlodG.lean.js → guides_convert-automation.md.Ck6Cr68A.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.TZaTZlfz.js → guides_github.md.D6ER29dG.js} +1 -1
- package/dist/docs/assets/{guides_github.md.TZaTZlfz.lean.js → guides_github.md.D6ER29dG.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.BmqwQfdG.js → guides_gitlab.md.P-TjBnS5.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.BmqwQfdG.lean.js → guides_gitlab.md.P-TjBnS5.lean.js} +1 -1
- package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +9 -0
- package/dist/docs/assets/{guides_grokbot-agents.md.DyV-WArv.lean.js → guides_grokbot-agents.md.WBZIOvkz.lean.js} +1 -1
- package/dist/docs/assets/{guides_improve.md.BGVk32bK.js → guides_improve.md.BKaDuKKK.js} +1 -1
- package/dist/docs/assets/{guides_improve.md.BGVk32bK.lean.js → guides_improve.md.BKaDuKKK.lean.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.Dp6cDP7f.js → guides_mcp-oauth.md.DMNMpXtO.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.Dp6cDP7f.lean.js → guides_mcp-oauth.md.DMNMpXtO.lean.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.SCRMskno.js → guides_opentelemetry.md._CRfDyzH.js} +14 -14
- package/dist/docs/assets/{guides_opentelemetry.md.SCRMskno.lean.js → guides_opentelemetry.md._CRfDyzH.lean.js} +1 -1
- package/dist/docs/assets/{guides_slack.md.D4RVMM4G.js → guides_slack.md.DdT8rmsj.js} +12 -4
- package/dist/docs/assets/{guides_slack.md.D4RVMM4G.lean.js → guides_slack.md.DdT8rmsj.lean.js} +1 -1
- package/dist/docs/assets/{guides_webhooks.md.CJK484ex.js → guides_webhooks.md.aQW10HRe.js} +2 -2
- package/dist/docs/assets/{guides_webhooks.md.CJK484ex.lean.js → guides_webhooks.md.aQW10HRe.lean.js} +1 -1
- package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +1 -0
- package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +1 -0
- package/dist/docs/assets/index.md.BFVyY2KT.js +17 -0
- package/dist/docs/assets/index.md.BFVyY2KT.lean.js +1 -0
- package/dist/docs/assets/{quickstart.md.DdQOF7Y8.js → quickstart.md.D3MjSZN-.js} +30 -38
- package/dist/docs/assets/quickstart.md.D3MjSZN-.lean.js +1 -0
- package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.js → reference_agent-config.md.CfVA-LZJ.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.lean.js → reference_agent-config.md.CfVA-LZJ.lean.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.js → reference_artifacts.md.Vf7qyIZ-.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.lean.js → reference_artifacts.md.Vf7qyIZ-.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.CAo-iK4j.js → reference_channels.md.icqLKcTc.js} +2 -12
- package/dist/docs/assets/{reference_channels.md.CAo-iK4j.lean.js → reference_channels.md.icqLKcTc.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.Deg7849l.js → reference_cli.md.B2dBL6L8.js} +3 -3
- package/dist/docs/assets/{reference_cli.md.Deg7849l.lean.js → reference_cli.md.B2dBL6L8.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.BojkC6c5.js → reference_connections.md.Cb3U_c8n.js} +4 -4
- package/dist/docs/assets/{reference_connections.md.BojkC6c5.lean.js → reference_connections.md.Cb3U_c8n.lean.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.ZAVUyuEX.js → reference_extensions.md.wlFD3cUR.js} +2 -2
- package/dist/docs/assets/{reference_extensions.md.ZAVUyuEX.lean.js → reference_extensions.md.wlFD3cUR.lean.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.BlM_bOg6.js → reference_hooks.md.CZuynAxj.js} +3 -3
- package/dist/docs/assets/{reference_hooks.md.BlM_bOg6.lean.js → reference_hooks.md.CZuynAxj.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.BwaCo-VO.js → reference_http-api.md.DTKcYE6L.js} +3 -3
- package/dist/docs/assets/{reference_http-api.md.BwaCo-VO.lean.js → reference_http-api.md.DTKcYE6L.lean.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.js → reference_instructions.md.D7gkckK-.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.lean.js → reference_instructions.md.D7gkckK-.lean.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.DLnoaczX.js → reference_playground.md.D2YExv5K.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.DLnoaczX.lean.js → reference_playground.md.D2YExv5K.lean.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.BEU8MtQV.js → reference_project-layout.md.DPxbUJyt.js} +3 -3
- package/dist/docs/assets/{reference_project-layout.md.BEU8MtQV.lean.js → reference_project-layout.md.DPxbUJyt.lean.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.js → reference_prompt.md.BQ5uAv1F.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.lean.js → reference_prompt.md.BQ5uAv1F.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.js → reference_schedules.md.BasfZWO-.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.lean.js → reference_schedules.md.BasfZWO-.lean.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.CyXV1MUw.js → reference_sessions.md.YKvIsWAx.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.CyXV1MUw.lean.js → reference_sessions.md.YKvIsWAx.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.l2ezAcaN.js → reference_skills.md.rNgpsGd0.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.l2ezAcaN.lean.js → reference_skills.md.rNgpsGd0.lean.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.CfsIloPm.js → reference_subagents.md.e5qitjJt.js} +2 -2
- package/dist/docs/assets/{reference_subagents.md.CfsIloPm.lean.js → reference_subagents.md.e5qitjJt.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.aGrn99hP.js → reference_tools.md.BdCO2aHZ.js} +4 -4
- package/dist/docs/assets/{reference_tools.md.aGrn99hP.lean.js → reference_tools.md.BdCO2aHZ.lean.js} +1 -1
- package/dist/docs/assets/{style.DCD_zyg3.css → style.Cfo2vbik.css} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.BZSH4N9z.js → templates_agentic-owners.md.Da_AGDlH.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.BZSH4N9z.lean.js → templates_agentic-owners.md.Da_AGDlH.lean.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.js → templates_pr-autofixer.md.DqxocIGh.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.lean.js → templates_pr-autofixer.md.DqxocIGh.lean.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.js → templates_security-reviewer.md.Bhnvd8VE.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.lean.js → templates_security-reviewer.md.Bhnvd8VE.lean.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.js → templates_triage.md.BdBWO9Ic.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.lean.js → templates_triage.md.BdBWO9Ic.lean.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.CYEAO9bM.js → troubleshooting.md.BcgNoYtJ.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.CYEAO9bM.lean.js → troubleshooting.md.BcgNoYtJ.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +41 -8
- package/dist/docs/building-with-agents.md +13 -15
- package/dist/docs/deployment.html +44 -11
- package/dist/docs/deployment.md +6 -7
- package/dist/docs/evals.html +44 -11
- package/dist/docs/evals.md +5 -5
- package/dist/docs/guides/agent-to-agent.html +48 -11
- package/dist/docs/guides/agent-to-agent.md +40 -83
- package/dist/docs/guides/bitbucket.html +41 -8
- package/dist/docs/guides/cloud-agents.html +41 -8
- package/dist/docs/guides/cloud-agents.md +24 -20
- package/dist/docs/guides/convert-automation.html +41 -8
- package/dist/docs/guides/github.html +41 -8
- package/dist/docs/guides/github.md +1 -1
- package/dist/docs/guides/gitlab.html +41 -8
- package/dist/docs/guides/grokbot-agents.html +41 -8
- package/dist/docs/guides/grokbot-agents.md +26 -19
- package/dist/docs/guides/improve.html +41 -8
- package/dist/docs/guides/mcp-oauth.html +41 -8
- package/dist/docs/guides/mcp-oauth.md +1 -1
- package/dist/docs/guides/opentelemetry.html +53 -20
- package/dist/docs/guides/opentelemetry.md +28 -41
- package/dist/docs/guides/slack.html +51 -10
- package/dist/docs/guides/slack.md +53 -4
- package/dist/docs/guides/webhooks.html +42 -9
- package/dist/docs/guides/webhooks.md +3 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +40 -10
- package/dist/docs/hillclimbing.md +5 -5
- package/dist/docs/index.html +57 -12
- package/dist/docs/index.md +81 -150
- package/dist/docs/llms-full.txt +5779 -10297
- package/dist/docs/llms.txt +3 -29
- package/dist/docs/quickstart.html +70 -45
- package/dist/docs/quickstart.md +44 -105
- package/dist/docs/reference/agent-config.html +41 -8
- package/dist/docs/reference/artifacts.html +41 -8
- package/dist/docs/reference/channels.html +41 -18
- package/dist/docs/reference/channels.md +0 -16
- package/dist/docs/reference/cli.html +42 -9
- package/dist/docs/reference/cli.md +0 -16
- package/dist/docs/reference/connections.html +43 -10
- package/dist/docs/reference/connections.md +3 -5
- package/dist/docs/reference/extensions.html +42 -9
- package/dist/docs/reference/extensions.md +2 -2
- package/dist/docs/reference/hooks.html +42 -9
- package/dist/docs/reference/hooks.md +2 -4
- package/dist/docs/reference/http-api.html +42 -9
- package/dist/docs/reference/http-api.md +5 -5
- package/dist/docs/reference/instructions.html +41 -8
- package/dist/docs/reference/playground.html +40 -7
- package/dist/docs/reference/playground.md +2 -2
- package/dist/docs/reference/project-layout.html +42 -9
- package/dist/docs/reference/project-layout.md +3 -4
- package/dist/docs/reference/prompt.html +41 -8
- package/dist/docs/reference/schedules.html +41 -8
- package/dist/docs/reference/sessions.html +40 -7
- package/dist/docs/reference/sessions.md +5 -4
- package/dist/docs/reference/skills.html +41 -8
- package/dist/docs/reference/subagents.html +41 -8
- package/dist/docs/reference/subagents.md +2 -4
- package/dist/docs/reference/tools.html +43 -10
- package/dist/docs/reference/tools.md +2 -5
- package/dist/docs/templates/agentic-owners.html +41 -8
- package/dist/docs/templates/pr-autofixer.html +41 -8
- package/dist/docs/templates/security-reviewer.html +41 -8
- package/dist/docs/templates/triage.html +41 -8
- package/dist/docs/troubleshooting.html +40 -7
- package/dist/docs/troubleshooting.md +1 -2
- package/dist/evals/assertions.js +19 -19
- package/dist/evals/expect.js +1 -1
- package/dist/evals/judge.js +1 -1
- package/dist/evals/reporters.d.ts.map +1 -1
- package/dist/evals/reporters.js +8 -8
- package/dist/evals/run-facts.js +2 -2
- package/dist/evals.d.ts +1 -1
- package/dist/evals.d.ts.map +1 -1
- package/dist/evals.js +7 -7
- package/dist/extensions/cursor-cloud-agents/extension.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +3 -3
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +6 -6
- package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -2
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- package/dist/extensions/improve/skills/yourself.js +1 -1
- package/dist/extensions/slack-communication/extension.d.ts +28 -0
- package/dist/extensions/slack-communication/extension.d.ts.map +1 -0
- package/dist/extensions/slack-communication/extension.js +32 -0
- package/dist/extensions/slack-communication/skills/slack-voice.d.ts +5 -0
- package/dist/extensions/slack-communication/skills/slack-voice.d.ts.map +1 -0
- package/dist/extensions/slack-communication/skills/slack-voice.js +54 -0
- package/dist/extensions/slack-communication/tools/delete-message.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/delete-message.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/delete-message.js +29 -0
- package/dist/extensions/slack-communication/tools/edit-message.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/edit-message.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/edit-message.js +37 -0
- package/dist/extensions/slack-communication/tools/post-card.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/post-card.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/post-card.js +25 -0
- package/dist/extensions/slack-communication/tools/post-file.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/post-file.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/post-file.js +76 -0
- package/dist/extensions/slack-communication/tools/post-update.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/post-update.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/post-update.js +36 -0
- package/dist/extensions/slack-communication/tools/react.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/react.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/react.js +27 -0
- package/dist/extensions/slack-communication/tools/set-status.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/set-status.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/set-status.js +18 -0
- package/dist/files-backends/cursor-hosted.d.ts +18 -6
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +357 -74
- package/dist/files-backends/local-fs.js +1 -1
- package/dist/files.d.ts +15 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/filesystem.d.ts.map +1 -1
- package/dist/filesystem.js +15 -15
- package/dist/index.d.ts +5 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -6
- package/dist/internal/advertise-tools.js +6 -6
- package/dist/internal/approval-gate.js +1 -1
- package/dist/internal/artifacts-store.js +3 -3
- package/dist/internal/as-of.js +2 -2
- package/dist/internal/authored-alias-hooks.js +1 -1
- package/dist/internal/builtin-tools/reminders.js +2 -2
- package/dist/internal/chat-client.js +5 -5
- package/dist/internal/cli-ax.d.ts +1 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +68 -13
- package/dist/internal/cli-bitbucket.js +10 -10
- package/dist/internal/cli-convert-automation.js +2 -2
- package/dist/internal/cli-cursor.d.ts +3 -11
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +5 -10
- package/dist/internal/cli-deploy.d.ts +12 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +328 -96
- package/dist/internal/cli-docs.js +5 -5
- package/dist/internal/cli-github.js +15 -16
- package/dist/internal/cli-gitlab.js +10 -10
- package/dist/internal/cli-manifest.js +1 -1
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
- package/dist/internal/cli-mcp-oauth.js +5 -5
- package/dist/internal/cli-mcp.js +3 -3
- package/dist/internal/cli-skills.js +2 -2
- package/dist/internal/cli-slack.js +5 -5
- package/dist/internal/cloud-turn-cost.js +1 -1
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +14 -9
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +33 -2
- package/dist/internal/convert-automation/convert-workflow.js +25 -24
- package/dist/internal/convert-automation/types.d.ts +8 -0
- package/dist/internal/convert-automation/types.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.d.ts +2 -2
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +32 -27
- package/dist/internal/cursor/backend-client.d.ts +15 -10
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +17 -11
- package/dist/internal/cursor/credentials.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.d.ts +16 -0
- package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +25 -0
- package/dist/internal/cursor-account-mcp-auth.js +9 -9
- package/dist/internal/cursor-deployment-relay.js +9 -9
- package/dist/internal/cursor-event-relay.js +10 -10
- package/dist/internal/cursor-relay-core.js +2 -2
- package/dist/internal/deploy-client.d.ts +106 -9
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +171 -23
- package/dist/internal/deploy-manifest.d.ts +13 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +32 -16
- package/dist/internal/discovery/agent-config.d.ts +5 -0
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +27 -0
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +10 -8
- package/dist/internal/discovery/channels.js +4 -4
- package/dist/internal/discovery/connections.js +4 -4
- package/dist/internal/discovery/cursor-plugin.js +12 -12
- package/dist/internal/discovery/extension-overlay.js +3 -3
- package/dist/internal/discovery/extensions.js +6 -6
- package/dist/internal/discovery/info.js +9 -9
- package/dist/internal/discovery/instructions.js +1 -1
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +4 -4
- package/dist/internal/discovery/services.js +1 -1
- package/dist/internal/discovery/tools.js +1 -1
- package/dist/internal/docs-site.js +2 -2
- package/dist/internal/env-file.js +1 -1
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +7 -7
- package/dist/internal/eval-runner.js +14 -14
- package/dist/internal/evals-client.js +4 -4
- package/dist/internal/event-log.js +8 -8
- package/dist/internal/event-mapper.d.ts +18 -0
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +34 -2
- package/dist/internal/filesystem/format.d.ts.map +1 -1
- package/dist/internal/filesystem/format.js +6 -3
- package/dist/internal/filesystem/scratch.js +3 -3
- package/dist/internal/filesystem/tools.d.ts.map +1 -1
- package/dist/internal/filesystem/tools.js +6 -6
- package/dist/internal/filesystem/walk.js +1 -1
- package/dist/internal/framework-file-storage.d.ts +6 -2
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +91 -2
- package/dist/internal/framework-storage-selection.d.ts +0 -6
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +2 -11
- package/dist/internal/github-fanout.js +3 -3
- package/dist/internal/guest-network.js +4 -4
- package/dist/internal/host-files.js +1 -1
- package/dist/internal/host-kv.js +2 -2
- package/dist/internal/hosted-admission-adapter.d.ts +2 -0
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +2 -4
- package/dist/internal/hosted-catch.js +1 -1
- package/dist/internal/hosted-delivery-protocol.d.ts +29 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +76 -8
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +201 -64
- package/dist/internal/hosted-execution-diag.js +3 -3
- package/dist/internal/hosted-execution-latency.d.ts +80 -0
- package/dist/internal/hosted-execution-latency.d.ts.map +1 -0
- package/dist/internal/hosted-execution-latency.js +220 -0
- package/dist/internal/hosting.d.ts +5 -5
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +5 -6
- package/dist/internal/http-channel-define.d.ts +11 -0
- package/dist/internal/http-channel-define.d.ts.map +1 -0
- package/dist/internal/http-channel-define.js +18 -0
- package/dist/internal/http-channel.d.ts +2 -3
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +3 -4
- package/dist/internal/http-control-plane-session.d.ts +7 -3
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +22 -10
- package/dist/internal/incoming-headers-to-fetch.d.ts +10 -0
- package/dist/internal/incoming-headers-to-fetch.d.ts.map +1 -0
- package/dist/internal/incoming-headers-to-fetch.js +41 -0
- package/dist/internal/init-interview.js +7 -7
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +14 -14
- package/dist/internal/init-scaffold.js +1 -1
- package/dist/internal/inline-stdio-mcp.js +2 -2
- package/dist/internal/install-cursor-skills.js +10 -10
- package/dist/internal/json-schema.js +1 -1
- package/dist/internal/local-control-plane.d.ts.map +1 -1
- package/dist/internal/local-control-plane.js +3 -3
- package/dist/internal/local-env.js +3 -3
- package/dist/internal/log-ring.js +1 -1
- package/dist/internal/logs-client.js +1 -1
- package/dist/internal/mcp-endpoint.js +8 -8
- package/dist/internal/mcp-host.js +4 -4
- package/dist/internal/mcp-oauth-on-demand.js +3 -3
- package/dist/internal/mcp-oauth.js +5 -5
- package/dist/internal/net.js +2 -2
- package/dist/internal/otel/config.js +3 -3
- package/dist/internal/otel/runtime.js +13 -13
- package/dist/internal/peer-connections.js +2 -2
- package/dist/internal/platform-schedule-sync.js +1 -1
- package/dist/internal/platform-timers.js +1 -1
- package/dist/internal/playground/static.js +2 -2
- package/dist/internal/playground/toolchain.js +2 -2
- package/dist/internal/playground-proxy.js +3 -3
- package/dist/internal/process-memory-telemetry.js +1 -1
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +7 -7
- package/dist/internal/reminder-store.js +1 -1
- package/dist/internal/request-error-status.d.ts.map +1 -1
- package/dist/internal/request-error-status.js +9 -0
- package/dist/internal/resolved-connections.js +8 -8
- package/dist/internal/result-output.d.ts +14 -2
- package/dist/internal/result-output.d.ts.map +1 -1
- package/dist/internal/result-output.js +45 -2
- package/dist/internal/router.js +4 -4
- package/dist/internal/run-client.js +2 -2
- package/dist/internal/schedule-runner.js +6 -6
- package/dist/internal/scm/pr-url.d.ts +3 -1
- package/dist/internal/scm/pr-url.d.ts.map +1 -1
- package/dist/internal/scm/pr-url.js +10 -2
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +14 -15
- package/dist/internal/serve-restart.js +1 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +81 -87
- package/dist/internal/session-cost.js +3 -3
- package/dist/internal/session-engine.d.ts +34 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +380 -184
- package/dist/internal/session-run-log.d.ts.map +1 -1
- package/dist/internal/session-run-log.js +4 -4
- package/dist/internal/session-store.d.ts +47 -3
- package/dist/internal/session-store.d.ts.map +1 -1
- package/dist/internal/session-store.js +198 -33
- package/dist/internal/sessions-client.js +3 -3
- package/dist/internal/slack-thread-key.d.ts +7 -0
- package/dist/internal/slack-thread-key.d.ts.map +1 -0
- package/dist/internal/slack-thread-key.js +10 -0
- package/dist/internal/sleep.js +1 -1
- package/dist/internal/storage-coordinator.d.ts +17 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +111 -11
- package/dist/internal/storage.d.ts +2 -0
- package/dist/internal/storage.d.ts.map +1 -0
- package/dist/internal/storage.js +1 -0
- package/dist/internal/store-mirror.js +4 -4
- package/dist/internal/terminal-style.js +2 -2
- package/dist/internal/tool-result.js +3 -3
- package/dist/internal/trajectory.js +7 -7
- package/dist/internal/turn-governor.js +2 -2
- package/dist/internal/turn-outbox.js +1 -1
- package/dist/internal/update-check.js +2 -2
- package/dist/internal/v2-hosting.d.ts +9 -0
- package/dist/internal/v2-hosting.d.ts.map +1 -1
- package/dist/internal/v2-hosting.js +10 -0
- package/dist/internal/workspace.d.ts +13 -10
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +17 -16
- package/dist/kv/memory-kv.d.ts +6 -4
- package/dist/kv/memory-kv.d.ts.map +1 -1
- package/dist/kv/memory-kv.js +9 -7
- package/dist/kv.d.ts +4 -7
- package/dist/kv.d.ts.map +1 -1
- package/dist/kv.js +4 -7
- package/dist/otel-public.d.ts +7 -0
- package/dist/otel-public.d.ts.map +1 -0
- package/dist/otel-public.js +5 -0
- package/dist/otel.d.ts +7 -2
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +7 -2
- package/dist/playground/assets/index-BLlKgZtI.css +1 -0
- package/dist/playground/assets/index-CDS5p9sR.js +67 -0
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +1 -1
- package/dist/result.d.ts +10 -4
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js +9 -3
- package/dist/storage-backends/cursor-hosted-v2.js +2 -2
- package/dist/storage-backends/cursor-hosted.d.ts +5 -17
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +6 -20
- package/dist/storage-backends/file-kv.js +7 -7
- package/dist/storage.d.ts +20 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +7 -6
- package/dist/types.d.ts +67 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -4
- package/docs/README.md +83 -152
- package/docs/building-with-agents.md +13 -15
- package/docs/deployment.md +6 -7
- package/docs/evals.md +5 -5
- package/docs/guides/agent-to-agent.md +41 -84
- package/docs/guides/cloud-agents.md +25 -20
- package/docs/guides/github.md +1 -1
- package/docs/guides/grokbot-agents.md +27 -19
- package/docs/guides/mcp-oauth.md +1 -1
- package/docs/guides/opentelemetry.md +28 -41
- package/docs/guides/slack.md +53 -4
- package/docs/guides/webhooks.md +3 -4
- package/docs/hillclimbing.md +5 -5
- package/docs/quickstart.md +45 -106
- package/docs/reference/channels.md +0 -16
- package/docs/reference/cli.md +0 -16
- package/docs/reference/connections.md +3 -5
- package/docs/reference/extensions.md +2 -2
- package/docs/reference/hooks.md +2 -4
- package/docs/reference/http-api.md +5 -5
- package/docs/reference/playground.md +2 -2
- package/docs/reference/project-layout.md +3 -4
- package/docs/reference/sessions.md +5 -4
- package/docs/reference/subagents.md +2 -4
- package/docs/reference/tools.md +2 -5
- package/docs/troubleshooting.md +1 -2
- package/package.json +55 -37
- package/skills/framework-map/SKILL.md +2 -2
- package/skills/otel/SKILL.md +8 -18
- package/src/bin/agent-serve.ts +93 -72
- package/src/channels/bitbucket/api.ts +8 -8
- package/src/channels/bitbucket/binding.ts +4 -4
- package/src/channels/bitbucket/bitbucket-channel.ts +1 -1
- package/src/channels/bitbucket/bitbucket-webhook.ts +1 -1
- package/src/channels/bitbucket/checks.ts +3 -4
- package/src/channels/bitbucket/cursor-account.ts +1 -1
- package/src/channels/bitbucket/events.ts +1 -1
- package/src/channels/change-monitors/change-monitors-channel.ts +2 -2
- package/src/channels/checks.ts +5 -4
- package/src/channels/deployments/deployments-channel.ts +1 -1
- package/src/channels/github/api.ts +1 -1
- package/src/channels/github/checks.ts +1 -1
- package/src/channels/github/cursor-account.ts +3 -3
- package/src/channels/github/defaults.ts +8 -4
- package/src/channels/github/events.ts +1 -1
- package/src/channels/github/forward.ts +8 -8
- package/src/channels/github/github-channel.ts +19 -2
- package/src/channels/github/progress.ts +7 -2
- package/src/channels/github/state.ts +6 -0
- package/src/channels/github/types.ts +6 -0
- package/src/channels/gitlab/binding.ts +4 -4
- package/src/channels/gitlab/checks.ts +3 -4
- package/src/channels/gitlab/cursor-account.ts +1 -1
- package/src/channels/gitlab/events.ts +1 -1
- package/src/channels/gitlab/gitlab-channel.ts +1 -1
- package/src/channels/gitlab/gitlab-webhook.ts +1 -1
- package/src/channels/gitlab/replay.ts +2 -2
- package/src/channels/origin/binding.ts +6 -3
- package/src/channels/origin/checks.ts +27 -17
- package/src/channels/origin/cursor-account.ts +1 -1
- package/src/channels/origin/defaults.ts +5 -1
- package/src/channels/origin/events.ts +1 -1
- package/src/channels/origin/origin-channel.ts +2 -1
- package/src/channels/origin/origin-webhook.ts +2 -2
- package/src/channels/slack/agentic-delivery.ts +659 -0
- package/src/channels/slack/agentic-posted.ts +148 -0
- package/src/channels/slack/agentic-signals.ts +248 -0
- package/src/channels/slack/api.ts +51 -11
- package/src/channels/slack/approvals.ts +1 -1
- package/src/channels/slack/attachments.ts +1 -1
- package/src/channels/slack/auth.ts +3 -1
- package/src/channels/slack/blocks.ts +3 -3
- package/src/channels/slack/bot-mentions.ts +5 -7
- package/src/channels/slack/channel-watch.ts +1 -1
- package/src/channels/slack/cli-project.ts +3 -3
- package/src/channels/slack/defaults.ts +109 -37
- package/src/channels/slack/dispatch.ts +299 -170
- package/src/channels/slack/doctor.ts +1 -1
- package/src/channels/slack/eval-directive.ts +1 -1
- package/src/channels/slack/external-policy.ts +15 -2
- package/src/channels/slack/footer.ts +108 -0
- package/src/channels/slack/index.ts +2 -0
- package/src/channels/slack/interactive.ts +4 -2
- package/src/channels/slack/live-delivery.ts +23 -7
- package/src/channels/slack/log.ts +1 -1
- package/src/channels/slack/manifest.ts +1 -1
- package/src/channels/slack/nudge-carrier.ts +1 -1
- package/src/channels/slack/nudge-store.ts +2 -2
- package/src/channels/slack/paint-start.ts +93 -0
- package/src/channels/slack/placeholder.ts +315 -0
- package/src/channels/slack/progress-delivery.ts +14 -1
- package/src/channels/slack/reasoning-chip.ts +48 -0
- package/src/channels/slack/recording-sink.ts +176 -0
- package/src/channels/slack/reply-options.ts +71 -15
- package/src/channels/slack/setup.ts +1 -1
- package/src/channels/slack/slack-channel.ts +73 -13
- package/src/channels/slack/socket-mode.ts +2 -2
- package/src/channels/slack/thread-context.ts +5 -5
- package/src/channels/slack/tool-approval-events.ts +54 -38
- package/src/channels/slack/tool-cards.ts +1 -1
- package/src/channels/slack/tool-chip.ts +36 -0
- package/src/channels/slack/types.ts +47 -7
- package/src/channels/slack/upload.ts +142 -0
- package/src/channels.ts +12 -30
- package/src/dashboard-session-url.ts +32 -0
- package/src/evals/assertions.ts +19 -19
- package/src/evals/expect.ts +1 -1
- package/src/evals/judge.ts +1 -1
- package/src/evals/reporters.ts +8 -9
- package/src/evals/run-facts.ts +2 -2
- package/src/evals.ts +7 -10
- package/src/extensions/cursor-cloud-agents/extension.ts +1 -1
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +3 -3
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +1 -1
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +3 -3
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +3 -4
- package/src/extensions/cursor-cloud-agents/tools/list.ts +1 -1
- package/src/extensions/improve/skills/yourself.ts +1 -1
- package/src/extensions/slack-communication/evals/harness.ts +728 -0
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +953 -0
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +194 -0
- package/src/extensions/slack-communication/extension.ts +45 -0
- package/src/extensions/slack-communication/skills/slack-voice.ts +59 -0
- package/src/extensions/slack-communication/tools/delete-message.ts +34 -0
- package/src/extensions/slack-communication/tools/edit-message.ts +42 -0
- package/src/extensions/slack-communication/tools/post-card.ts +28 -0
- package/src/extensions/slack-communication/tools/post-file.ts +85 -0
- package/src/extensions/slack-communication/tools/post-update.ts +41 -0
- package/src/extensions/slack-communication/tools/react.ts +33 -0
- package/src/extensions/slack-communication/tools/set-status.ts +21 -0
- package/src/files-backends/cursor-hosted.ts +502 -98
- package/src/files-backends/local-fs.ts +1 -1
- package/src/files.ts +15 -0
- package/src/filesystem.ts +16 -18
- package/src/index.ts +4 -36
- package/src/internal/advertise-tools.ts +6 -6
- package/src/internal/approval-gate.ts +1 -1
- package/src/internal/artifacts-store.ts +3 -3
- package/src/internal/as-of.ts +2 -2
- package/src/internal/authored-alias-hooks.ts +1 -1
- package/src/internal/authored-loaders.ts +2 -3
- package/src/internal/builtin-tools/reminders.ts +2 -2
- package/src/internal/chat-client.ts +5 -5
- package/src/internal/cli-ax.ts +84 -14
- package/src/internal/cli-bitbucket.ts +11 -11
- package/src/internal/cli-convert-automation.ts +2 -2
- package/src/internal/cli-cursor.ts +5 -16
- package/src/internal/cli-deploy.ts +389 -104
- package/src/internal/cli-docs.ts +5 -5
- package/src/internal/cli-github.ts +16 -19
- package/src/internal/cli-gitlab.ts +11 -11
- package/src/internal/cli-manifest.ts +1 -1
- package/src/internal/cli-mcp-oauth.ts +5 -7
- package/src/internal/cli-mcp.ts +3 -3
- package/src/internal/cli-skills.ts +2 -2
- package/src/internal/cli-slack.ts +5 -5
- package/src/internal/cloud-turn-cost.ts +1 -1
- package/src/internal/continuation-identity.ts +13 -9
- package/src/internal/conversation-mirror.ts +36 -3
- package/src/internal/convert-automation/convert-workflow.ts +27 -27
- package/src/internal/convert-automation/types.ts +9 -0
- package/src/internal/cursor/account-mcp.ts +48 -31
- package/src/internal/cursor/backend-client.ts +28 -17
- package/src/internal/cursor/credentials.ts +1 -1
- package/src/internal/cursor/hosted-store-secrets.ts +34 -0
- package/src/internal/cursor-account-mcp-auth.ts +9 -9
- package/src/internal/cursor-deployment-relay.ts +10 -10
- package/src/internal/cursor-event-relay.ts +10 -10
- package/src/internal/cursor-relay-core.ts +2 -2
- package/src/internal/deploy-client.ts +266 -24
- package/src/internal/deploy-manifest.ts +46 -8
- package/src/internal/discovery/agent-config.ts +34 -0
- package/src/internal/discovery/agent.ts +14 -6
- package/src/internal/discovery/channels.ts +4 -4
- package/src/internal/discovery/connections.ts +4 -4
- package/src/internal/discovery/cursor-plugin.ts +12 -12
- package/src/internal/discovery/extension-overlay.ts +3 -3
- package/src/internal/discovery/extensions.ts +6 -6
- package/src/internal/discovery/info.ts +9 -9
- package/src/internal/discovery/instructions.ts +1 -1
- package/src/internal/discovery/project.ts +4 -4
- package/src/internal/discovery/services.ts +1 -1
- package/src/internal/discovery/tools.ts +1 -1
- package/src/internal/docs-site.ts +2 -2
- package/src/internal/env-file.ts +2 -2
- package/src/internal/eval-run-store.ts +7 -9
- package/src/internal/eval-runner.ts +20 -20
- package/src/internal/evals-client.ts +6 -6
- package/src/internal/event-log.ts +10 -10
- package/src/internal/event-mapper.ts +37 -2
- package/src/internal/filesystem/format.ts +11 -12
- package/src/internal/filesystem/scratch.ts +3 -3
- package/src/internal/filesystem/tools.ts +6 -8
- package/src/internal/filesystem/walk.ts +1 -1
- package/src/internal/framework-file-storage.ts +104 -4
- package/src/internal/framework-storage-selection.ts +2 -12
- package/src/internal/github-fanout.ts +4 -4
- package/src/internal/guest-network.ts +4 -4
- package/src/internal/host-files.ts +1 -1
- package/src/internal/host-kv.ts +2 -2
- package/src/internal/hosted-admission-adapter.ts +2 -0
- package/src/internal/hosted-catch-protocol.ts +3 -5
- package/src/internal/hosted-catch.ts +1 -1
- package/src/internal/hosted-delivery-protocol.ts +111 -13
- package/src/internal/hosted-delivery.ts +286 -81
- package/src/internal/hosted-execution-diag.ts +3 -3
- package/src/internal/hosted-execution-latency.ts +334 -0
- package/src/internal/hosting.ts +5 -6
- package/src/internal/http-channel-define.ts +27 -0
- package/src/internal/http-channel.ts +3 -4
- package/src/internal/http-control-plane-session.ts +24 -11
- package/src/internal/incoming-headers-to-fetch.ts +54 -0
- package/src/internal/init-interview.ts +7 -7
- package/src/internal/init-project.ts +14 -16
- package/src/internal/init-scaffold.ts +1 -1
- package/src/internal/inline-stdio-mcp.ts +2 -2
- package/src/internal/install-cursor-skills.ts +11 -11
- package/src/internal/json-schema.ts +1 -1
- package/src/internal/local-control-plane.ts +4 -5
- package/src/internal/local-env.ts +3 -3
- package/src/internal/log-ring.ts +1 -1
- package/src/internal/logs-client.ts +1 -1
- package/src/internal/mcp-endpoint.ts +10 -10
- package/src/internal/mcp-host.ts +9 -9
- package/src/internal/mcp-oauth-on-demand.ts +3 -3
- package/src/internal/mcp-oauth.ts +5 -5
- package/src/internal/net.ts +2 -2
- package/src/internal/otel/config.ts +3 -3
- package/src/internal/otel/runtime.ts +14 -14
- package/src/internal/peer-connections.ts +2 -2
- package/src/internal/platform-schedule-sync.ts +1 -1
- package/src/internal/platform-timers.ts +1 -1
- package/src/internal/playground/static.ts +2 -2
- package/src/internal/playground/toolchain.ts +2 -2
- package/src/internal/playground-proxy.ts +3 -3
- package/src/internal/process-memory-telemetry.ts +1 -1
- package/src/internal/reminder-runner.ts +8 -10
- package/src/internal/reminder-store.ts +1 -1
- package/src/internal/request-error-status.ts +9 -0
- package/src/internal/resolved-connections.ts +8 -8
- package/src/internal/result-output.ts +62 -5
- package/src/internal/router.ts +4 -4
- package/src/internal/run-client.ts +2 -2
- package/src/internal/schedule-runner.ts +6 -6
- package/src/internal/scm/pr-url.ts +11 -2
- package/src/internal/sdk-runner.ts +14 -28
- package/src/internal/serve-restart.ts +1 -1
- package/src/internal/server.ts +97 -99
- package/src/internal/session-cost.ts +3 -3
- package/src/internal/session-engine.ts +504 -244
- package/src/internal/session-run-log.ts +4 -6
- package/src/internal/session-store.ts +213 -39
- package/src/internal/sessions-client.ts +3 -3
- package/src/internal/slack-thread-key.ts +11 -0
- package/src/internal/sleep.ts +1 -1
- package/src/internal/storage-coordinator.ts +118 -21
- package/src/internal/storage.ts +1 -0
- package/src/internal/store-mirror.ts +4 -4
- package/src/internal/terminal-style.ts +2 -2
- package/src/internal/tool-result.ts +3 -3
- package/src/internal/trajectory.ts +7 -7
- package/src/internal/turn-governor.ts +2 -2
- package/src/internal/turn-outbox.ts +1 -1
- package/src/internal/update-check.ts +2 -2
- package/src/internal/v2-hosting.ts +14 -0
- package/src/internal/workspace.ts +17 -17
- package/src/kv/memory-kv.ts +9 -7
- package/src/kv.ts +4 -7
- package/src/otel-public.ts +24 -0
- package/src/otel.ts +7 -2
- package/src/prompt.ts +1 -1
- package/src/result.ts +10 -8
- package/src/storage-backends/cursor-hosted-v2.ts +2 -2
- package/src/storage-backends/cursor-hosted.ts +6 -23
- package/src/storage-backends/file-kv.ts +7 -7
- package/src/storage.ts +22 -7
- package/src/types.ts +82 -17
- package/templates/agentic-owners/agent/channels/github.ts +3 -6
- package/templates/agentic-owners/agent/lib/github.ts +5 -5
- package/templates/agentic-owners/agent/lib/owners/decision.ts +13 -10
- package/templates/agentic-owners/agent/lib/owners/handles.ts +2 -2
- package/templates/agentic-owners/agent/lib/owners/match.ts +3 -3
- package/templates/agentic-owners/agent/lib/owners/matching.ts +1 -1
- package/templates/agentic-owners/agent/lib/owners/parse.ts +4 -9
- package/templates/agentic-owners/agent/lib/owners/prompt.ts +1 -1
- package/templates/agentic-owners/agent/lib/review.ts +37 -30
- package/templates/agentic-owners/evals/owners.eval.ts +2 -2
- package/templates/agentic-owners/package.json +1 -1
- package/templates/agents-md/agent/lib/collect.ts +16 -10
- package/templates/agents-md/agent/lib/config.ts +1 -1
- package/templates/agents-md/agent/tools/apply_agents.ts +10 -8
- package/templates/agents-md/package.json +1 -1
- package/templates/code-wiki/agent/channels/github.ts +4 -7
- package/templates/code-wiki/agent/lib/repos.ts +1 -1
- package/templates/code-wiki/agent/tools/apply_wiki.ts +3 -4
- package/templates/code-wiki/package.json +1 -1
- package/templates/demo/agent/lib/collect.ts +6 -2
- package/templates/demo/agent/lib/repos.ts +1 -1
- package/templates/demo/agent/tools/record_demo.ts +1 -1
- package/templates/demo/evals/demo.eval.ts +1 -5
- package/templates/demo/package.json +1 -1
- package/templates/grokbot-agents/package.json +1 -1
- package/templates/pr-autofixer/agent/channels/github.ts +16 -13
- package/templates/pr-autofixer/agent/lib/merge-watch.ts +2 -4
- package/templates/pr-autofixer/agent/lib/repos.ts +2 -2
- package/templates/pr-autofixer/agent/lib/webhook-routing.ts +1 -1
- package/templates/pr-autofixer/package.json +1 -1
- package/templates/security-help/agent/lib/repos.ts +1 -1
- package/templates/security-help/package.json +1 -1
- package/templates/security-reviewer/agent/lib/repos.ts +1 -1
- package/templates/security-reviewer/agent/tools/post_findings.ts +1 -3
- package/templates/security-reviewer/package.json +1 -1
- package/templates/triage/agent/lib/actuate.ts +26 -41
- package/templates/triage/agent/lib/parse-queue-event.ts +2 -1
- package/templates/triage/agent/lib/verify-webhook.ts +10 -5
- package/templates/triage/agent/tools/record_triage.ts +1 -4
- package/templates/triage/package.json +1 -1
- package/dist/client.d.ts +0 -14
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -12
- package/dist/docs/assets/app.Cr-wVbnB.js +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CFVQ4S17.js +0 -1
- package/dist/docs/assets/chunks/framework.BCISBCiQ.js +0 -19
- package/dist/docs/assets/concepts.md.B4o63Gul.js +0 -1
- package/dist/docs/assets/concepts.md.B4o63Gul.lean.js +0 -1
- package/dist/docs/assets/guides_agent-to-agent.md.BDb0t1QV.js +0 -10
- package/dist/docs/assets/guides_agent-to-agent.md.BDb0t1QV.lean.js +0 -1
- package/dist/docs/assets/guides_grokbot-agents.md.DyV-WArv.js +0 -9
- package/dist/docs/assets/guides_human-in-the-loop.md.By1G2T3_.js +0 -28
- package/dist/docs/assets/guides_human-in-the-loop.md.By1G2T3_.lean.js +0 -1
- package/dist/docs/assets/hillclimbing.md.BOiVo1tf.js +0 -4
- package/dist/docs/assets/hillclimbing.md.BOiVo1tf.lean.js +0 -1
- package/dist/docs/assets/index.md.DD9Q2XuJ.js +0 -5
- package/dist/docs/assets/index.md.DD9Q2XuJ.lean.js +0 -1
- package/dist/docs/assets/quickstart.md.DdQOF7Y8.lean.js +0 -1
- package/dist/docs/assets/reference_result.md.BK5SxDrf.js +0 -19
- package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.Kctn3OVb.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.Kctn3OVb.lean.js +0 -1
- package/dist/docs/assets/skills_create-agent.md.Q3h6Je-e.js +0 -8
- package/dist/docs/assets/skills_create-agent.md.Q3h6Je-e.lean.js +0 -1
- package/dist/docs/assets/skills_debug.md.CVjCXMFF.js +0 -1
- package/dist/docs/assets/skills_debug.md.CVjCXMFF.lean.js +0 -1
- package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.js +0 -35
- package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.lean.js +0 -1
- package/dist/docs/assets/skills_evals.md.DFxYPErF.js +0 -25
- package/dist/docs/assets/skills_evals.md.DFxYPErF.lean.js +0 -1
- package/dist/docs/assets/skills_framework-map.md.BxLSOhSY.js +0 -1
- package/dist/docs/assets/skills_framework-map.md.BxLSOhSY.lean.js +0 -1
- package/dist/docs/assets/skills_github.md.hgFX_oKY.js +0 -16
- package/dist/docs/assets/skills_github.md.hgFX_oKY.lean.js +0 -1
- package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.js +0 -7
- package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.lean.js +0 -1
- package/dist/docs/assets/skills_index.md.DL7EHaQ-.js +0 -1
- package/dist/docs/assets/skills_index.md.DL7EHaQ-.lean.js +0 -1
- package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.js +0 -18
- package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.lean.js +0 -1
- package/dist/docs/assets/skills_otel.md.B5Ddv1xH.js +0 -8
- package/dist/docs/assets/skills_otel.md.B5Ddv1xH.lean.js +0 -1
- package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.js +0 -20
- package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.lean.js +0 -1
- package/dist/docs/assets/storage.md.BUrhJ-Zz.js +0 -30
- package/dist/docs/assets/storage.md.BUrhJ-Zz.lean.js +0 -1
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.js +0 -2
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.lean.js +0 -1
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.js +0 -2
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.lean.js +0 -1
- package/dist/docs/assets/templates_demo.md.BeQX9V3H.js +0 -4
- package/dist/docs/assets/templates_demo.md.BeQX9V3H.lean.js +0 -1
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.js +0 -3
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.lean.js +0 -1
- package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.js +0 -4
- package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.lean.js +0 -1
- package/dist/docs/concepts.html +0 -27
- package/dist/docs/concepts.md +0 -166
- package/dist/docs/design/filesystem.md +0 -376
- package/dist/docs/design/runtime-abstraction.md +0 -1756
- package/dist/docs/guides/human-in-the-loop.html +0 -54
- package/dist/docs/guides/human-in-the-loop.md +0 -126
- package/dist/docs/reference/result.html +0 -45
- package/dist/docs/reference/result.md +0 -89
- package/dist/docs/scaffolding-agents.html +0 -27
- package/dist/docs/scaffolding-agents.md +0 -130
- package/dist/docs/skills/create-agent.html +0 -34
- package/dist/docs/skills/create-agent.md +0 -160
- package/dist/docs/skills/debug.html +0 -27
- package/dist/docs/skills/debug.md +0 -36
- package/dist/docs/skills/deploy.html +0 -61
- package/dist/docs/skills/deploy.md +0 -161
- package/dist/docs/skills/evals.html +0 -51
- package/dist/docs/skills/evals.md +0 -137
- package/dist/docs/skills/framework-map.html +0 -27
- package/dist/docs/skills/framework-map.md +0 -99
- package/dist/docs/skills/github.html +0 -42
- package/dist/docs/skills/github.md +0 -93
- package/dist/docs/skills/hillclimb.html +0 -33
- package/dist/docs/skills/hillclimb.md +0 -55
- package/dist/docs/skills/index.html +0 -27
- package/dist/docs/skills/index.md +0 -21
- package/dist/docs/skills/mcp-auth.html +0 -44
- package/dist/docs/skills/mcp-auth.md +0 -76
- package/dist/docs/skills/otel.html +0 -34
- package/dist/docs/skills/otel.md +0 -53
- package/dist/docs/skills/setup-slack.html +0 -46
- package/dist/docs/skills/setup-slack.md +0 -141
- package/dist/docs/storage.html +0 -56
- package/dist/docs/storage.md +0 -167
- package/dist/docs/templates/agents-md.html +0 -28
- package/dist/docs/templates/agents-md.md +0 -105
- package/dist/docs/templates/code-wiki.html +0 -28
- package/dist/docs/templates/code-wiki.md +0 -91
- package/dist/docs/templates/demo.html +0 -30
- package/dist/docs/templates/demo.md +0 -80
- package/dist/docs/templates/grokbot-agents.html +0 -29
- package/dist/docs/templates/grokbot-agents.md +0 -48
- package/dist/docs/templates/security-help.html +0 -30
- package/dist/docs/templates/security-help.md +0 -65
- package/dist/internal/tenant-slack/relay.d.ts +0 -75
- package/dist/internal/tenant-slack/relay.d.ts.map +0 -1
- package/dist/internal/tenant-slack/relay.js +0 -148
- package/dist/playground/assets/index-Bhxzrcf6.css +0 -1
- package/dist/playground/assets/index-CqLX5uF3.js +0 -67
- package/docs/concepts.md +0 -171
- package/docs/design/filesystem.md +0 -376
- package/docs/design/runtime-abstraction.md +0 -1756
- package/docs/guides/human-in-the-loop.md +0 -131
- package/docs/reference/result.md +0 -94
- package/docs/scaffolding-agents.md +0 -135
- package/docs/skills/index.md +0 -26
- package/docs/storage.md +0 -172
- package/docs/templates/agents-md.md +0 -110
- package/docs/templates/code-wiki.md +0 -96
- package/docs/templates/demo.md +0 -85
- package/docs/templates/grokbot-agents.md +0 -53
- package/docs/templates/security-help.md +0 -70
- package/src/client.ts +0 -23
- package/src/internal/tenant-slack/relay.ts +0 -203
- package/templates/pr-autofixer/agent/storage.ts +0 -7
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
11
|
-
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
11
|
+
import { access, mkdir, rm, writeFile } from "node:fs/promises";
|
|
12
12
|
import { dirname, join } from "node:path";
|
|
13
13
|
import type { SDKCustomTool, SDKCustomToolResult } from "@cursor/sdk";
|
|
14
14
|
import type { Meter } from "@opentelemetry/api";
|
|
@@ -176,7 +176,12 @@ import {
|
|
|
176
176
|
SCHEDULE_CHANNEL_PREFIX,
|
|
177
177
|
} from "./prompt-context.js";
|
|
178
178
|
import { assertCloudCanHonorAccountServersFilters } from "./resolved-connections.js";
|
|
179
|
-
import {
|
|
179
|
+
import {
|
|
180
|
+
addTurnUsage,
|
|
181
|
+
applyAuthoredResult,
|
|
182
|
+
RESULT_REPAIR_BUDGET,
|
|
183
|
+
resultRepairPrompt,
|
|
184
|
+
} from "./result-output.js";
|
|
180
185
|
import type { AgentRunner, SteerAckOutcome } from "./sdk-runner.js";
|
|
181
186
|
import { sessionExternalLinks } from "./session-links.js";
|
|
182
187
|
import { SessionStore } from "./session-store.js";
|
|
@@ -243,6 +248,21 @@ export class SessionBusyError extends Error {
|
|
|
243
248
|
}
|
|
244
249
|
}
|
|
245
250
|
|
|
251
|
+
/**
|
|
252
|
+
* Hosted enqueue-only admission could not coalesce into an active turn.
|
|
253
|
+
* Distinct from {@link SessionBusyError}: the caller asked not to start work.
|
|
254
|
+
*/
|
|
255
|
+
export class HostedEnqueueNotActiveError extends Error {
|
|
256
|
+
constructor(sessionId?: string) {
|
|
257
|
+
super(
|
|
258
|
+
sessionId === undefined
|
|
259
|
+
? "Hosted enqueue requires an active accepting session"
|
|
260
|
+
: `Hosted enqueue requires an active turn on session ${sessionId}`
|
|
261
|
+
);
|
|
262
|
+
this.name = "HostedEnqueueNotActiveError";
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
246
266
|
// Defined in auth.js (HTTP/session-store callers import it without this
|
|
247
267
|
// module); re-exported here because this is its historical public home.
|
|
248
268
|
export { SessionAuthError } from "./auth.js";
|
|
@@ -414,6 +434,12 @@ export interface EngineSendOptions extends SendMessageOptions {
|
|
|
414
434
|
* authors cannot choose a session id through the public SendMessageOptions.
|
|
415
435
|
*/
|
|
416
436
|
hostedSessionId?: string;
|
|
437
|
+
/**
|
|
438
|
+
* Hosted active-guest enqueue: admit only by coalescing into an already
|
|
439
|
+
* running turn. Never creates a session or starts a turn. Private host
|
|
440
|
+
* plumbing — not part of public SendMessageOptions.
|
|
441
|
+
*/
|
|
442
|
+
hostedEnqueueOnly?: boolean;
|
|
417
443
|
}
|
|
418
444
|
|
|
419
445
|
interface CoalescedQueuedTurn {
|
|
@@ -429,6 +455,39 @@ interface AdmitTurnOptions {
|
|
|
429
455
|
* coalesce drain so asks that arrived during drain are not wiped.
|
|
430
456
|
*/
|
|
431
457
|
retainCoalesced?: boolean;
|
|
458
|
+
/** See {@link EngineSendOptions.hostedEnqueueOnly}. */
|
|
459
|
+
hostedEnqueueOnly?: boolean;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/** Marker that we `git init`'d this shared harness so scaffold is ours to write. */
|
|
463
|
+
const OWNED_HARNESS = join(".agent-serve", "owned-harness");
|
|
464
|
+
|
|
465
|
+
function pathExists(path: string): Promise<boolean> {
|
|
466
|
+
return access(path).then(
|
|
467
|
+
() => true,
|
|
468
|
+
() => false
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Nested dirs get their own git root so the harness does not ripwalk the
|
|
474
|
+
* enclosing checkout. A real `workspaceDir` checkout (already a git root)
|
|
475
|
+
* is left alone.
|
|
476
|
+
*/
|
|
477
|
+
async function ownSharedHarness(dir: string): Promise<boolean> {
|
|
478
|
+
if (await pathExists(join(dir, OWNED_HARNESS))) {
|
|
479
|
+
return true;
|
|
480
|
+
}
|
|
481
|
+
if (!(await isNestedInGitRepo(dir))) {
|
|
482
|
+
return false;
|
|
483
|
+
}
|
|
484
|
+
await ensureOwnGitRoot(dir);
|
|
485
|
+
if (await isNestedInGitRepo(dir)) {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
await mkdir(join(dir, ".agent-serve"), { recursive: true });
|
|
489
|
+
await writeFile(join(dir, OWNED_HARNESS), "");
|
|
490
|
+
return true;
|
|
432
491
|
}
|
|
433
492
|
|
|
434
493
|
export class SessionEngine {
|
|
@@ -493,6 +552,8 @@ export class SessionEngine {
|
|
|
493
552
|
private readonly turnAborts = new Map<string, AbortController>();
|
|
494
553
|
/** Serializes turn admission per session (latest follow-up wins). */
|
|
495
554
|
private readonly admissionChains = new Map<string, Promise<unknown>>();
|
|
555
|
+
/** Live turn snapshot so a coalesced Slack wake can repaint on this process. */
|
|
556
|
+
private readonly liveTurns = new Map<string, EventDispatchContext>();
|
|
496
557
|
/** FIFO turn slots under `concurrency.maxRunningTurns` (unlimited when unset). */
|
|
497
558
|
private readonly turnGovernor: TurnGovernor;
|
|
498
559
|
/**
|
|
@@ -547,6 +608,8 @@ export class SessionEngine {
|
|
|
547
608
|
string,
|
|
548
609
|
{ root: FileSystem; cwd: string }
|
|
549
610
|
>();
|
|
611
|
+
/** In-flight `prewarmSharedWorkspace`; first turn waits so it lands hot. */
|
|
612
|
+
private sharedWarm: Promise<void> | undefined;
|
|
550
613
|
|
|
551
614
|
constructor(options: SessionEngineOptions) {
|
|
552
615
|
this.project = options.project;
|
|
@@ -575,7 +638,7 @@ export class SessionEngine {
|
|
|
575
638
|
);
|
|
576
639
|
this.outbox = new TurnOutbox(join(options.stateRoot, "outbox"));
|
|
577
640
|
this.logs = new EventLogStore(
|
|
578
|
-
|
|
641
|
+
sessionId => this.sessions.eventFilePath(sessionId),
|
|
579
642
|
(sessionId, error) =>
|
|
580
643
|
this.logger(
|
|
581
644
|
`[agent-sdk] failed to persist events for ${sessionId}: ${describeError(error)}`
|
|
@@ -635,7 +698,7 @@ export class SessionEngine {
|
|
|
635
698
|
...options.project.agent.connections,
|
|
636
699
|
...(options.project.agent.hostConnections ?? []),
|
|
637
700
|
].filter(
|
|
638
|
-
|
|
701
|
+
connection => !isSymbolicConnectionTransport(connection.transport)
|
|
639
702
|
)
|
|
640
703
|
);
|
|
641
704
|
const basePlatforms = options.platforms ?? createHostPlatforms();
|
|
@@ -688,8 +751,8 @@ export class SessionEngine {
|
|
|
688
751
|
|
|
689
752
|
private authoredConnection(name: string): DiscoveredConnection | undefined {
|
|
690
753
|
return (
|
|
691
|
-
this.project.agent.connections.find(
|
|
692
|
-
this.project.agent.hostConnections?.find(
|
|
754
|
+
this.project.agent.connections.find(item => item.name === name) ??
|
|
755
|
+
this.project.agent.hostConnections?.find(item => item.name === name)
|
|
693
756
|
);
|
|
694
757
|
}
|
|
695
758
|
|
|
@@ -758,7 +821,7 @@ export class SessionEngine {
|
|
|
758
821
|
*/
|
|
759
822
|
artifactsApi(binding?: { sessionId: string; turnId?: string }): ArtifactsApi {
|
|
760
823
|
return {
|
|
761
|
-
tag: async
|
|
824
|
+
tag: async input => {
|
|
762
825
|
if (binding === undefined) {
|
|
763
826
|
return this.tagArtifact(input);
|
|
764
827
|
}
|
|
@@ -776,7 +839,7 @@ export class SessionEngine {
|
|
|
776
839
|
turnId: input.turnId ?? binding.turnId,
|
|
777
840
|
});
|
|
778
841
|
},
|
|
779
|
-
list:
|
|
842
|
+
list: filter => this.artifactsStore.list(filter),
|
|
780
843
|
};
|
|
781
844
|
}
|
|
782
845
|
|
|
@@ -925,11 +988,11 @@ export class SessionEngine {
|
|
|
925
988
|
|
|
926
989
|
private slackNudgeHostApi(): SlackNudgeHostApi {
|
|
927
990
|
return {
|
|
928
|
-
append:
|
|
929
|
-
drainFormatted:
|
|
991
|
+
append: input => this.nudgeStore.append(input),
|
|
992
|
+
drainFormatted: continuationKey =>
|
|
930
993
|
this.nudgeStore.drainFormatted(continuationKey),
|
|
931
|
-
clear:
|
|
932
|
-
hasUndelivered:
|
|
994
|
+
clear: continuationKey => this.nudgeStore.clear(continuationKey),
|
|
995
|
+
hasUndelivered: continuationKey =>
|
|
933
996
|
this.nudgeStore.hasUndelivered(continuationKey),
|
|
934
997
|
isDelivered: (continuationKey, sourceTs) =>
|
|
935
998
|
this.nudgeStore.isDelivered(continuationKey, sourceTs),
|
|
@@ -1039,61 +1102,76 @@ export class SessionEngine {
|
|
|
1039
1102
|
// Refresh harness cwd when the caller supplies a newer worktree (e.g. PR
|
|
1040
1103
|
// synchronize). Leave the durable continuation key unchanged.
|
|
1041
1104
|
let record = existing;
|
|
1042
|
-
const
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
:
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
current
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1105
|
+
const enqueueOnly = sendOptions.hostedEnqueueOnly === true;
|
|
1106
|
+
if (!enqueueOnly) {
|
|
1107
|
+
const refreshWorkspace =
|
|
1108
|
+
sendOptions.workspaceDir !== undefined &&
|
|
1109
|
+
sendOptions.workspaceDir !== existing.workspaceOverride;
|
|
1110
|
+
if (
|
|
1111
|
+
refreshWorkspace ||
|
|
1112
|
+
sendOptions.workspaceFiles !== undefined ||
|
|
1113
|
+
sendOptions.images !== undefined
|
|
1114
|
+
) {
|
|
1115
|
+
record = await this.updateRecord(existing.sessionId, current => ({
|
|
1116
|
+
...current,
|
|
1117
|
+
workspaceOverride: refreshWorkspace
|
|
1118
|
+
? sendOptions.workspaceDir
|
|
1119
|
+
: current.workspaceOverride,
|
|
1120
|
+
pendingWorkspaceFiles: mergePendingWorkspaceFiles(
|
|
1121
|
+
current.pendingWorkspaceFiles,
|
|
1122
|
+
sendOptions.workspaceFiles
|
|
1123
|
+
),
|
|
1124
|
+
pendingImages: mergePendingImages(
|
|
1125
|
+
current.pendingImages,
|
|
1126
|
+
sendOptions.images
|
|
1127
|
+
),
|
|
1128
|
+
}));
|
|
1129
|
+
}
|
|
1130
|
+
// Refresh the cloud attach the same way: a follow-up send carries the
|
|
1131
|
+
// caller's CURRENT cloud options (e.g. a PR attach re-derived per wake),
|
|
1132
|
+
// and the first send's snapshot must not pin this session's turns to a
|
|
1133
|
+
// stale repo/prUrl for the session's lifetime.
|
|
1134
|
+
if (
|
|
1135
|
+
sendOptions.cloud !== undefined &&
|
|
1136
|
+
JSON.stringify(sendOptions.cloud) !==
|
|
1137
|
+
JSON.stringify(record.cloudOverride)
|
|
1138
|
+
) {
|
|
1139
|
+
record = await this.updateRecord(record.sessionId, current => ({
|
|
1140
|
+
...current,
|
|
1141
|
+
cloudOverride: sendOptions.cloud,
|
|
1142
|
+
}));
|
|
1143
|
+
}
|
|
1144
|
+
// Refresh wake-derived channel state (GitHub headSha / refs) without
|
|
1145
|
+
// wiping sticky fields. Null patch values are skipped.
|
|
1146
|
+
if (sendOptions.refreshState !== undefined) {
|
|
1147
|
+
record = await this.updateRecord(record.sessionId, current => ({
|
|
1148
|
+
...current,
|
|
1149
|
+
channelState: mergeChannelStateSkipNull(
|
|
1150
|
+
current.channelState,
|
|
1151
|
+
sendOptions.refreshState
|
|
1152
|
+
),
|
|
1153
|
+
}));
|
|
1154
|
+
}
|
|
1089
1155
|
}
|
|
1090
1156
|
const since = (await this.logs.get(record.sessionId)).count;
|
|
1091
1157
|
const coalesced = await this.startTurn(record.sessionId, message, {
|
|
1092
|
-
admission:
|
|
1158
|
+
admission: enqueueOnly
|
|
1159
|
+
? "coalesce"
|
|
1160
|
+
: (sendOptions.admission ?? "preempt"),
|
|
1093
1161
|
...(sendOptions.coalesceSourceTs === undefined
|
|
1094
1162
|
? {}
|
|
1095
1163
|
: { sourceTs: sendOptions.coalesceSourceTs }),
|
|
1164
|
+
...(enqueueOnly ? { hostedEnqueueOnly: true } : {}),
|
|
1096
1165
|
});
|
|
1166
|
+
if (enqueueOnly && !coalesced) {
|
|
1167
|
+
throw new HostedEnqueueNotActiveError(record.sessionId);
|
|
1168
|
+
}
|
|
1169
|
+
if (!enqueueOnly && coalesced && sendOptions.refreshState !== undefined) {
|
|
1170
|
+
await this.repaintOnCoalescedRefresh(
|
|
1171
|
+
record.sessionId,
|
|
1172
|
+
sendOptions.refreshState
|
|
1173
|
+
);
|
|
1174
|
+
}
|
|
1097
1175
|
return this.channelSession(
|
|
1098
1176
|
record.sessionId,
|
|
1099
1177
|
record,
|
|
@@ -1103,6 +1181,10 @@ export class SessionEngine {
|
|
|
1103
1181
|
);
|
|
1104
1182
|
}
|
|
1105
1183
|
|
|
1184
|
+
if (sendOptions.hostedEnqueueOnly === true) {
|
|
1185
|
+
throw new HostedEnqueueNotActiveError(sendOptions.hostedSessionId);
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1106
1188
|
if (sendOptions.hostedSessionId !== undefined) {
|
|
1107
1189
|
const collision = await this.getOrRestoreSession(
|
|
1108
1190
|
sendOptions.hostedSessionId
|
|
@@ -1171,7 +1253,7 @@ export class SessionEngine {
|
|
|
1171
1253
|
const stale = new Error("stale HTTP continuation");
|
|
1172
1254
|
let previous: string | undefined;
|
|
1173
1255
|
try {
|
|
1174
|
-
await this.updateRecord(sessionId,
|
|
1256
|
+
await this.updateRecord(sessionId, record => {
|
|
1175
1257
|
const expectedChannel =
|
|
1176
1258
|
record.httpContinuationKey === undefined
|
|
1177
1259
|
? record.channelId
|
|
@@ -1194,7 +1276,7 @@ export class SessionEngine {
|
|
|
1194
1276
|
await this.startTurn(sessionId, message);
|
|
1195
1277
|
return next;
|
|
1196
1278
|
} catch (error) {
|
|
1197
|
-
await this.updateRecord(sessionId,
|
|
1279
|
+
await this.updateRecord(sessionId, record =>
|
|
1198
1280
|
record.httpContinuationKey === next
|
|
1199
1281
|
? { ...record, httpContinuationKey: previous }
|
|
1200
1282
|
: record
|
|
@@ -1285,6 +1367,53 @@ export class SessionEngine {
|
|
|
1285
1367
|
// Turn execution
|
|
1286
1368
|
// ==========================================================================
|
|
1287
1369
|
|
|
1370
|
+
/**
|
|
1371
|
+
* Repaint on the follow-up wake without retargeting the live turn.
|
|
1372
|
+
* Persist already took the refresh; in-flight writes stay on the carrier ts.
|
|
1373
|
+
*/
|
|
1374
|
+
private async repaintOnCoalescedRefresh(
|
|
1375
|
+
sessionId: string,
|
|
1376
|
+
patch: JsonValue | undefined
|
|
1377
|
+
): Promise<void> {
|
|
1378
|
+
const live = this.liveTurns.get(sessionId);
|
|
1379
|
+
if (live === undefined || patch === undefined) {
|
|
1380
|
+
return;
|
|
1381
|
+
}
|
|
1382
|
+
const repaintState =
|
|
1383
|
+
mergeChannelStateSkipNull(live.channelState, patch) ?? live.channelState;
|
|
1384
|
+
const record = await this.sessions.get(sessionId);
|
|
1385
|
+
if (record === undefined) {
|
|
1386
|
+
return;
|
|
1387
|
+
}
|
|
1388
|
+
const handler = this.channelEventHandlersFor(record.channelId)?.[
|
|
1389
|
+
"message.received"
|
|
1390
|
+
];
|
|
1391
|
+
if (handler === undefined) {
|
|
1392
|
+
return;
|
|
1393
|
+
}
|
|
1394
|
+
await handler(
|
|
1395
|
+
{
|
|
1396
|
+
type: "message.received",
|
|
1397
|
+
data: { text: "" },
|
|
1398
|
+
index: 0,
|
|
1399
|
+
sessionId,
|
|
1400
|
+
at: new Date().toISOString(),
|
|
1401
|
+
},
|
|
1402
|
+
{
|
|
1403
|
+
channelId: record.channelId,
|
|
1404
|
+
state: repaintState,
|
|
1405
|
+
continuationToken: record.continuationKey,
|
|
1406
|
+
setContinuationToken: (token: string | null) =>
|
|
1407
|
+
this.setContinuationToken(sessionId, token),
|
|
1408
|
+
},
|
|
1409
|
+
{
|
|
1410
|
+
session: live.session,
|
|
1411
|
+
host: this.hostForSession(sessionId),
|
|
1412
|
+
artifacts: this.artifactsApi({ sessionId }),
|
|
1413
|
+
}
|
|
1414
|
+
);
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1288
1417
|
/**
|
|
1289
1418
|
* Admit a turn for `sessionId`.
|
|
1290
1419
|
*
|
|
@@ -1306,7 +1435,12 @@ export class SessionEngine {
|
|
|
1306
1435
|
.catch(() => {})
|
|
1307
1436
|
.then(async () => {
|
|
1308
1437
|
// Another server holds the turn: hand the message to it and coalesce.
|
|
1438
|
+
// Enqueue-only must not report coalesced success without a local
|
|
1439
|
+
// enqueue — the outbox drain may never run on this process.
|
|
1309
1440
|
if (await this.turnLeases.runningElsewhere(sessionId)) {
|
|
1441
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1442
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1443
|
+
}
|
|
1310
1444
|
await this.outbox.post(sessionId, { message, options });
|
|
1311
1445
|
return true;
|
|
1312
1446
|
}
|
|
@@ -1323,7 +1457,7 @@ export class SessionEngine {
|
|
|
1323
1457
|
private drainOutbox(sessionId: string): void {
|
|
1324
1458
|
void this.outbox
|
|
1325
1459
|
.takeAll(sessionId)
|
|
1326
|
-
.then(
|
|
1460
|
+
.then(items => {
|
|
1327
1461
|
for (const item of items) {
|
|
1328
1462
|
void this.startTurn(sessionId, item.message, item.options).catch(
|
|
1329
1463
|
() => {}
|
|
@@ -1337,7 +1471,7 @@ export class SessionEngine {
|
|
|
1337
1471
|
const queue = this.coalesceQueues.get(sessionId) ?? [];
|
|
1338
1472
|
if (
|
|
1339
1473
|
item.sourceTs !== undefined &&
|
|
1340
|
-
queue.some(
|
|
1474
|
+
queue.some(entry => entry.sourceTs === item.sourceTs)
|
|
1341
1475
|
) {
|
|
1342
1476
|
return;
|
|
1343
1477
|
}
|
|
@@ -1418,7 +1552,7 @@ export class SessionEngine {
|
|
|
1418
1552
|
}
|
|
1419
1553
|
const parts = [
|
|
1420
1554
|
"<slack_followups>",
|
|
1421
|
-
|
|
1555
|
+
`${items.length} asks arrived while you were busy.`,
|
|
1422
1556
|
"",
|
|
1423
1557
|
];
|
|
1424
1558
|
for (let i = 0; i < items.length; i++) {
|
|
@@ -1512,11 +1646,21 @@ export class SessionEngine {
|
|
|
1512
1646
|
// enqueue: `drainCoalescedFollowups` reads only this process's queue, so
|
|
1513
1647
|
// the shared nudge store is the carrier. Not redundant with `acquire`
|
|
1514
1648
|
// below — this returns before preempt's `clearCoalesced` drops the queue.
|
|
1649
|
+
// Enqueue-only cannot claim coalesced here: nothing joined a local turn.
|
|
1515
1650
|
if (await this.turnLeases.runningElsewhere(sessionId)) {
|
|
1651
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1652
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1653
|
+
}
|
|
1516
1654
|
this.logger(`[session] coalesce; another server owns ${sessionId}`);
|
|
1517
1655
|
return true;
|
|
1518
1656
|
}
|
|
1519
1657
|
|
|
1658
|
+
// Enqueue-only must never start a turn (or preempt/interrupt). Steer and
|
|
1659
|
+
// coalesce above already returned true when they absorbed the message.
|
|
1660
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1661
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1520
1664
|
// Interrupt any turn in flight and wait for it to settle so the SDK run is
|
|
1521
1665
|
// terminal before this turn's send (the follow-up also force-expires as a
|
|
1522
1666
|
// belt-and-suspenders — see buildTurnRequest). Drain-resume skips interrupt:
|
|
@@ -1545,7 +1689,7 @@ export class SessionEngine {
|
|
|
1545
1689
|
|
|
1546
1690
|
let lifecycleInstalled = false;
|
|
1547
1691
|
try {
|
|
1548
|
-
const record = await this.updateRecord(sessionId,
|
|
1692
|
+
const record = await this.updateRecord(sessionId, current => ({
|
|
1549
1693
|
...current,
|
|
1550
1694
|
turnCount: current.turnCount + 1,
|
|
1551
1695
|
}));
|
|
@@ -1591,6 +1735,7 @@ export class SessionEngine {
|
|
|
1591
1735
|
};
|
|
1592
1736
|
} finally {
|
|
1593
1737
|
clearInterval(poll);
|
|
1738
|
+
this.liveTurns.delete(sessionId);
|
|
1594
1739
|
}
|
|
1595
1740
|
this.lastOutcomes.set(sessionId, outcome);
|
|
1596
1741
|
const wasCurrent = this.activeTurns.get(sessionId) === lifecycle;
|
|
@@ -1600,14 +1745,19 @@ export class SessionEngine {
|
|
|
1600
1745
|
if (this.turnAborts.get(sessionId) === abort) {
|
|
1601
1746
|
this.turnAborts.delete(sessionId);
|
|
1602
1747
|
}
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1748
|
+
// Failed/cancelled owners must not start a coalesced successor.
|
|
1749
|
+
// Hosted execute would then 503 and Temporal/FIFO would re-run the
|
|
1750
|
+
// same follow-ups as full deliveries.
|
|
1751
|
+
if (
|
|
1752
|
+
wasCurrent &&
|
|
1753
|
+
!abort.signal.aborted &&
|
|
1754
|
+
outcome.status === "finished"
|
|
1755
|
+
) {
|
|
1756
|
+
const drain = this.drainCoalescedFollowups(sessionId).catch(error => {
|
|
1757
|
+
this.logger(
|
|
1758
|
+
`[session] coalesce drain failed for ${sessionId}: ${describeError(error)}`
|
|
1759
|
+
);
|
|
1760
|
+
});
|
|
1611
1761
|
this.coalesceDrains.set(sessionId, drain);
|
|
1612
1762
|
try {
|
|
1613
1763
|
await drain;
|
|
@@ -1867,7 +2017,7 @@ export class SessionEngine {
|
|
|
1867
2017
|
if (turn === undefined) {
|
|
1868
2018
|
return tools;
|
|
1869
2019
|
}
|
|
1870
|
-
return tools.map(
|
|
2020
|
+
return tools.map(tool => {
|
|
1871
2021
|
const execute = tool.definition.execute;
|
|
1872
2022
|
if (typeof execute !== "function") {
|
|
1873
2023
|
return tool;
|
|
@@ -2044,6 +2194,13 @@ export class SessionEngine {
|
|
|
2044
2194
|
* Best effort — warming is an optimization, and a turn rebuilds on its own.
|
|
2045
2195
|
*/
|
|
2046
2196
|
async prewarmSharedWorkspace(): Promise<void> {
|
|
2197
|
+
if (this.sharedWarm === undefined) {
|
|
2198
|
+
this.sharedWarm = this.warmSharedWorkspace();
|
|
2199
|
+
}
|
|
2200
|
+
await this.sharedWarm;
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2203
|
+
private async warmSharedWorkspace(): Promise<void> {
|
|
2047
2204
|
const agent = this.project.agent;
|
|
2048
2205
|
const workspaceDir = agent.local?.workspaceDir;
|
|
2049
2206
|
if (
|
|
@@ -2056,6 +2213,15 @@ export class SessionEngine {
|
|
|
2056
2213
|
}
|
|
2057
2214
|
const startedAt = Date.now();
|
|
2058
2215
|
try {
|
|
2216
|
+
await mkdir(workspaceDir, { recursive: true });
|
|
2217
|
+
if (await ownSharedHarness(workspaceDir)) {
|
|
2218
|
+
await materializeWorkspace({
|
|
2219
|
+
agent,
|
|
2220
|
+
workspaceDir,
|
|
2221
|
+
seed: true,
|
|
2222
|
+
stateRoot: this.stateRoot,
|
|
2223
|
+
});
|
|
2224
|
+
}
|
|
2059
2225
|
const harness = resolveHostHarnessToolOptions(agent.allowedTools);
|
|
2060
2226
|
const outcome = await this.runner.prewarm({
|
|
2061
2227
|
workspaceDir,
|
|
@@ -2069,7 +2235,10 @@ export class SessionEngine {
|
|
|
2069
2235
|
// warmed without an identity; the per-send flag still has to match
|
|
2070
2236
|
// the turns' requests or the warmed executor is one no turn asks for.
|
|
2071
2237
|
mcpServers: this.buildMcpServers("local"),
|
|
2072
|
-
...(this.hasAttachedAuthedConnections()
|
|
2238
|
+
...(this.hasAttachedAuthedConnections() ||
|
|
2239
|
+
this.project.agent.connections.some(connection =>
|
|
2240
|
+
isCursorAccountTransport(connection.transport)
|
|
2241
|
+
)
|
|
2073
2242
|
? { perSendMcpServers: true }
|
|
2074
2243
|
: {}),
|
|
2075
2244
|
subagents: buildRunnerSubagents(agent),
|
|
@@ -2113,6 +2282,7 @@ export class SessionEngine {
|
|
|
2113
2282
|
channelState: structuredClone(turnChannelState),
|
|
2114
2283
|
session: this.sessionInfo(record),
|
|
2115
2284
|
};
|
|
2285
|
+
this.liveTurns.set(sessionId, eventContext);
|
|
2116
2286
|
// Hold the open log so tool events append synchronously. Fire-and-forget
|
|
2117
2287
|
// `appendEvent` races parallel tool completions and delays the live stream
|
|
2118
2288
|
// until the next await tick — often after *all* parallel tools finish.
|
|
@@ -2130,7 +2300,7 @@ export class SessionEngine {
|
|
|
2130
2300
|
// Read by closure, so the mapper still sees it while draining after the
|
|
2131
2301
|
// registry entry below is gone.
|
|
2132
2302
|
const stubbed = new Set<string>();
|
|
2133
|
-
const mapper = new TurnEventMapper(emit,
|
|
2303
|
+
const mapper = new TurnEventMapper(emit, callId => stubbed.has(callId));
|
|
2134
2304
|
|
|
2135
2305
|
// Take a turn slot before any work happens. When every slot is busy the
|
|
2136
2306
|
// turn waits FIFO — durable `turn.queued` marks the wait — and a
|
|
@@ -2139,7 +2309,7 @@ export class SessionEngine {
|
|
|
2139
2309
|
const permit = await this.turnGovernor.acquire({
|
|
2140
2310
|
sessionId,
|
|
2141
2311
|
signal,
|
|
2142
|
-
onQueued:
|
|
2312
|
+
onQueued: position => {
|
|
2143
2313
|
const maxRunningTurns = this.turnGovernor.maxRunningTurns ?? 0;
|
|
2144
2314
|
emit({ type: "turn.queued", data: { position, maxRunningTurns } });
|
|
2145
2315
|
this.logger(
|
|
@@ -2155,6 +2325,12 @@ export class SessionEngine {
|
|
|
2155
2325
|
} else {
|
|
2156
2326
|
emit({ type: "turn.started", data: {} });
|
|
2157
2327
|
try {
|
|
2328
|
+
if (
|
|
2329
|
+
record.workspaceOverride === undefined &&
|
|
2330
|
+
this.project.agent.local?.workspaceDir !== undefined
|
|
2331
|
+
) {
|
|
2332
|
+
await this.prewarmSharedWorkspace();
|
|
2333
|
+
}
|
|
2158
2334
|
// Scaffold agent files into the session workspace even when the harness
|
|
2159
2335
|
// cwd is overridden (e.g. a PR worktree).
|
|
2160
2336
|
if (!this.hasRootOverride()) {
|
|
@@ -2199,7 +2375,7 @@ export class SessionEngine {
|
|
|
2199
2375
|
(hasPendingFiles && runtime !== "cloud") ||
|
|
2200
2376
|
(pendingImages !== undefined && pendingImages.length > 0)
|
|
2201
2377
|
) {
|
|
2202
|
-
await this.updateRecord(sessionId,
|
|
2378
|
+
await this.updateRecord(sessionId, current => ({
|
|
2203
2379
|
...current,
|
|
2204
2380
|
pendingWorkspaceFiles:
|
|
2205
2381
|
hasPendingFiles &&
|
|
@@ -2213,48 +2389,39 @@ export class SessionEngine {
|
|
|
2213
2389
|
: current.pendingImages,
|
|
2214
2390
|
}));
|
|
2215
2391
|
}
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2392
|
+
const onUpdate: RunnerTurnRequest["onUpdate"] = async update => {
|
|
2393
|
+
const turn = this.turnRoots.get(sessionId);
|
|
2394
|
+
if (turn !== undefined) {
|
|
2395
|
+
update = await applyWebScratchUpdate({
|
|
2396
|
+
cwd: turn.cwd,
|
|
2397
|
+
root: turn.root,
|
|
2398
|
+
update,
|
|
2399
|
+
});
|
|
2400
|
+
}
|
|
2401
|
+
mapper.handleUpdate(update);
|
|
2402
|
+
// Yield so the HTTP NDJSON writer can flush tool start/result
|
|
2403
|
+
// events while sibling parallel tools are still executing.
|
|
2404
|
+
if (
|
|
2405
|
+
update.type === "tool-call-started" ||
|
|
2406
|
+
update.type === "tool-call-completed" ||
|
|
2407
|
+
// Nested subagent progress (newer SDKs); string check keeps
|
|
2408
|
+
// typecheck green against older published `@cursor/sdk` pins.
|
|
2409
|
+
(update as { type: string }).type === "tool-call-delta"
|
|
2410
|
+
) {
|
|
2411
|
+
// Same boundary the carrier hook runs on, so a drain is visible
|
|
2412
|
+
// by the time this fires.
|
|
2413
|
+
await this.emitDeliveredNudges(record, emit);
|
|
2414
|
+
await yieldEventLoop();
|
|
2415
|
+
}
|
|
2416
|
+
};
|
|
2225
2417
|
const request = await this.buildTurnRequest(
|
|
2226
2418
|
record,
|
|
2227
2419
|
turnId,
|
|
2228
2420
|
message,
|
|
2229
2421
|
isFirstTurn,
|
|
2230
|
-
instructionsInvisibleToHarness,
|
|
2231
2422
|
emit,
|
|
2232
2423
|
eventContext,
|
|
2233
|
-
|
|
2234
|
-
const turn = this.turnRoots.get(sessionId);
|
|
2235
|
-
if (turn !== undefined) {
|
|
2236
|
-
update = await applyWebScratchUpdate({
|
|
2237
|
-
cwd: turn.cwd,
|
|
2238
|
-
root: turn.root,
|
|
2239
|
-
update,
|
|
2240
|
-
});
|
|
2241
|
-
}
|
|
2242
|
-
mapper.handleUpdate(update);
|
|
2243
|
-
// Yield so the HTTP NDJSON writer can flush tool start/result
|
|
2244
|
-
// events while sibling parallel tools are still executing.
|
|
2245
|
-
if (
|
|
2246
|
-
update.type === "tool-call-started" ||
|
|
2247
|
-
update.type === "tool-call-completed" ||
|
|
2248
|
-
// Nested subagent progress (newer SDKs); string check keeps
|
|
2249
|
-
// typecheck green against older published `@cursor/sdk` pins.
|
|
2250
|
-
(update as { type: string }).type === "tool-call-delta"
|
|
2251
|
-
) {
|
|
2252
|
-
// Same boundary the carrier hook runs on, so a drain is visible
|
|
2253
|
-
// by the time this fires.
|
|
2254
|
-
await this.emitDeliveredNudges(record, emit);
|
|
2255
|
-
await yieldEventLoop();
|
|
2256
|
-
}
|
|
2257
|
-
},
|
|
2424
|
+
onUpdate,
|
|
2258
2425
|
signal,
|
|
2259
2426
|
pendingImages
|
|
2260
2427
|
);
|
|
@@ -2264,6 +2431,20 @@ export class SessionEngine {
|
|
|
2264
2431
|
outcome = await this.runTurnExecute(record, turnId, () =>
|
|
2265
2432
|
this.runner.runTurn(request)
|
|
2266
2433
|
);
|
|
2434
|
+
// Commit before dropping the turn FS so `ctx.reject` can
|
|
2435
|
+
// re-run the model with tools still mounted.
|
|
2436
|
+
outcome = await this.settleAuthoredResult({
|
|
2437
|
+
record,
|
|
2438
|
+
turnId,
|
|
2439
|
+
emit,
|
|
2440
|
+
eventContext,
|
|
2441
|
+
turnChannelState,
|
|
2442
|
+
harnessCwd,
|
|
2443
|
+
signal,
|
|
2444
|
+
onUpdate,
|
|
2445
|
+
mapper,
|
|
2446
|
+
outcome,
|
|
2447
|
+
});
|
|
2267
2448
|
} finally {
|
|
2268
2449
|
this.activeToolContexts.delete(sessionId);
|
|
2269
2450
|
this.stubbedCallIds.delete(sessionId);
|
|
@@ -2293,7 +2474,7 @@ export class SessionEngine {
|
|
|
2293
2474
|
|
|
2294
2475
|
if (mapper.title !== undefined) {
|
|
2295
2476
|
const title = mapper.title;
|
|
2296
|
-
await this.updateRecord(sessionId,
|
|
2477
|
+
await this.updateRecord(sessionId, current => ({ ...current, title }));
|
|
2297
2478
|
eventContext.session = { ...eventContext.session, title };
|
|
2298
2479
|
}
|
|
2299
2480
|
|
|
@@ -2312,32 +2493,6 @@ export class SessionEngine {
|
|
|
2312
2493
|
outcome = { ...outcome, cost: finalCost };
|
|
2313
2494
|
}
|
|
2314
2495
|
|
|
2315
|
-
const authored = this.project.result;
|
|
2316
|
-
if (outcome.status === "finished" && authored !== undefined) {
|
|
2317
|
-
const settled = await applyAuthoredResult({
|
|
2318
|
-
definition: authored,
|
|
2319
|
-
text: finalResult,
|
|
2320
|
-
dryRun: record.dryRun === true,
|
|
2321
|
-
ctx: {
|
|
2322
|
-
session: eventContext.session,
|
|
2323
|
-
channelState: turnChannelState,
|
|
2324
|
-
host: this.hostForSession(sessionId),
|
|
2325
|
-
artifacts: this.artifactsApi({ sessionId, turnId }),
|
|
2326
|
-
stateRoot: this.stateRoot,
|
|
2327
|
-
workspaceDir: harnessCwd,
|
|
2328
|
-
},
|
|
2329
|
-
});
|
|
2330
|
-
if (!settled.ok) {
|
|
2331
|
-
outcome = {
|
|
2332
|
-
status: "error",
|
|
2333
|
-
result: finalResult,
|
|
2334
|
-
errorMessage: `turn output failed: ${settled.message}`,
|
|
2335
|
-
usage: finalUsage,
|
|
2336
|
-
cost: finalCost,
|
|
2337
|
-
};
|
|
2338
|
-
}
|
|
2339
|
-
}
|
|
2340
|
-
|
|
2341
2496
|
if (outcome.status === "finished") {
|
|
2342
2497
|
await this.appendEvent(
|
|
2343
2498
|
sessionId,
|
|
@@ -2407,6 +2562,89 @@ export class SessionEngine {
|
|
|
2407
2562
|
};
|
|
2408
2563
|
}
|
|
2409
2564
|
|
|
2565
|
+
/**
|
|
2566
|
+
* Run `defineResult` while the turn FS and tools are still up.
|
|
2567
|
+
* `ctx.reject` re-invokes `runTurn` on this turnId until commit
|
|
2568
|
+
* succeeds, throws, or the repair budget is gone.
|
|
2569
|
+
*/
|
|
2570
|
+
private async settleAuthoredResult(args: {
|
|
2571
|
+
record: SessionRecord;
|
|
2572
|
+
turnId: string;
|
|
2573
|
+
emit: (payload: SessionEventPayload) => void;
|
|
2574
|
+
eventContext: EventDispatchContext;
|
|
2575
|
+
turnChannelState: JsonValue;
|
|
2576
|
+
harnessCwd: string;
|
|
2577
|
+
signal: AbortSignal;
|
|
2578
|
+
onUpdate: RunnerTurnRequest["onUpdate"];
|
|
2579
|
+
mapper: TurnEventMapper;
|
|
2580
|
+
outcome: TurnOutcome;
|
|
2581
|
+
}): Promise<TurnOutcome> {
|
|
2582
|
+
const authored = this.project.result;
|
|
2583
|
+
if (args.outcome.status !== "finished" || authored === undefined) {
|
|
2584
|
+
return args.outcome;
|
|
2585
|
+
}
|
|
2586
|
+
|
|
2587
|
+
let outcome = args.outcome;
|
|
2588
|
+
let usage = outcome.usage;
|
|
2589
|
+
let repairs = 0;
|
|
2590
|
+
|
|
2591
|
+
while (true) {
|
|
2592
|
+
const settled = await applyAuthoredResult({
|
|
2593
|
+
definition: authored,
|
|
2594
|
+
text: outcome.result ?? args.mapper.pendingText,
|
|
2595
|
+
dryRun: args.record.dryRun === true,
|
|
2596
|
+
ctx: {
|
|
2597
|
+
session: args.eventContext.session,
|
|
2598
|
+
channelState: args.turnChannelState,
|
|
2599
|
+
host: this.hostForSession(args.record.sessionId),
|
|
2600
|
+
artifacts: this.artifactsApi({
|
|
2601
|
+
sessionId: args.record.sessionId,
|
|
2602
|
+
turnId: args.turnId,
|
|
2603
|
+
}),
|
|
2604
|
+
stateRoot: this.stateRoot,
|
|
2605
|
+
workspaceDir: args.harnessCwd,
|
|
2606
|
+
},
|
|
2607
|
+
});
|
|
2608
|
+
if (settled.ok) {
|
|
2609
|
+
return { ...outcome, result: settled.text, usage };
|
|
2610
|
+
}
|
|
2611
|
+
if (settled.kind === "error" || repairs >= RESULT_REPAIR_BUDGET) {
|
|
2612
|
+
return {
|
|
2613
|
+
status: "error",
|
|
2614
|
+
result: outcome.result,
|
|
2615
|
+
errorMessage: `turn output failed: ${settled.message}`,
|
|
2616
|
+
usage,
|
|
2617
|
+
};
|
|
2618
|
+
}
|
|
2619
|
+
repairs += 1;
|
|
2620
|
+
// Close the rejected stream without posting it (empty `stop`)
|
|
2621
|
+
// so Slack does not append a repair onto that block, and so an
|
|
2622
|
+
// empty repair cannot recommit `lastAssistantText`.
|
|
2623
|
+
args.mapper.abandonPendingText();
|
|
2624
|
+
this.logger(
|
|
2625
|
+
`[session] ${args.record.sessionId} ${args.turnId} result rejected; repairing (${repairs}/${RESULT_REPAIR_BUDGET})`
|
|
2626
|
+
);
|
|
2627
|
+
const repairRequest = await this.buildTurnRequest(
|
|
2628
|
+
args.record,
|
|
2629
|
+
args.turnId,
|
|
2630
|
+
resultRepairPrompt(settled.message),
|
|
2631
|
+
false,
|
|
2632
|
+
args.emit,
|
|
2633
|
+
args.eventContext,
|
|
2634
|
+
args.onUpdate,
|
|
2635
|
+
args.signal
|
|
2636
|
+
);
|
|
2637
|
+
const repaired = await this.runTurnExecute(args.record, args.turnId, () =>
|
|
2638
|
+
this.runner.runTurn(repairRequest)
|
|
2639
|
+
);
|
|
2640
|
+
usage = addTurnUsage(usage, repaired.usage);
|
|
2641
|
+
if (repaired.status !== "finished") {
|
|
2642
|
+
return { ...repaired, usage };
|
|
2643
|
+
}
|
|
2644
|
+
outcome = { ...repaired, usage };
|
|
2645
|
+
}
|
|
2646
|
+
}
|
|
2647
|
+
|
|
2410
2648
|
/**
|
|
2411
2649
|
* Sync authored skills onto the Agent Store at `skills/<name>/…` (hosted)
|
|
2412
2650
|
* or `agent-serve/<agent>/skills/<name>/…` (personal-key local+cloud)
|
|
@@ -2499,7 +2737,7 @@ export class SessionEngine {
|
|
|
2499
2737
|
sessionId: string,
|
|
2500
2738
|
pending: NonNullable<SessionRecord["pendingWorkspaceFiles"]>
|
|
2501
2739
|
): Promise<void> {
|
|
2502
|
-
await this.updateRecord(sessionId,
|
|
2740
|
+
await this.updateRecord(sessionId, current => ({
|
|
2503
2741
|
...current,
|
|
2504
2742
|
pendingWorkspaceFiles:
|
|
2505
2743
|
current.pendingWorkspaceFiles === pending
|
|
@@ -2532,7 +2770,7 @@ export class SessionEngine {
|
|
|
2532
2770
|
}
|
|
2533
2771
|
let sync = run().then(
|
|
2534
2772
|
() => true,
|
|
2535
|
-
|
|
2773
|
+
error => {
|
|
2536
2774
|
this.logger(
|
|
2537
2775
|
`[${surface}] ${store.label} sync failed: ${error instanceof Error ? error.message : String(error)}`
|
|
2538
2776
|
);
|
|
@@ -2551,11 +2789,17 @@ export class SessionEngine {
|
|
|
2551
2789
|
/**
|
|
2552
2790
|
* Hosted deployments own the deployment store. Local `serve`/`run` with
|
|
2553
2791
|
* a personal API key writes into the USER store under `agent-serve/`.
|
|
2792
|
+
* A persistent deployment's version container has no cloud store at all:
|
|
2793
|
+
* its state directory is the durable copy, and its service-account key
|
|
2794
|
+
* must not be mistaken for a personal one.
|
|
2554
2795
|
*/
|
|
2555
2796
|
private cloudStore(): CloudStoreTarget | undefined {
|
|
2556
2797
|
const v2Hosting = resolveAgentV2Hosting({
|
|
2557
2798
|
architecture: this.project.agent.architecture,
|
|
2558
2799
|
});
|
|
2800
|
+
if (v2Hosting.kind === "cursor-managed-persistent") {
|
|
2801
|
+
return undefined;
|
|
2802
|
+
}
|
|
2559
2803
|
const deployment = {
|
|
2560
2804
|
mountPath: DEPLOYMENT_STORE_MOUNT_PATH,
|
|
2561
2805
|
skillsPrefix: agentStoreKeys.skillsPrefix(),
|
|
@@ -2600,7 +2844,6 @@ export class SessionEngine {
|
|
|
2600
2844
|
turnId: string,
|
|
2601
2845
|
prompt: string,
|
|
2602
2846
|
isFirstTurn: boolean,
|
|
2603
|
-
instructionsInvisibleToHarness: boolean,
|
|
2604
2847
|
emit: (payload: SessionEventPayload) => void,
|
|
2605
2848
|
eventContext: EventDispatchContext,
|
|
2606
2849
|
onUpdate: RunnerTurnRequest["onUpdate"],
|
|
@@ -2642,7 +2885,7 @@ export class SessionEngine {
|
|
|
2642
2885
|
// agents already fail discovery; this guards hybrid agents' per-send
|
|
2643
2886
|
// cloud sessions.
|
|
2644
2887
|
const perSessionConnection = agent.connections.find(
|
|
2645
|
-
|
|
2888
|
+
connection =>
|
|
2646
2889
|
connection.advertiseTools === true || connection.auth !== undefined
|
|
2647
2890
|
);
|
|
2648
2891
|
if (runtime !== "local" && perSessionConnection !== undefined) {
|
|
@@ -2696,7 +2939,7 @@ export class SessionEngine {
|
|
|
2696
2939
|
: this.withTurnScratchTools(
|
|
2697
2940
|
authoredRoot
|
|
2698
2941
|
? fileTools
|
|
2699
|
-
: fileTools.filter(
|
|
2942
|
+
: fileTools.filter(tool => tool.name !== "SemanticSearch"),
|
|
2700
2943
|
record.sessionId
|
|
2701
2944
|
);
|
|
2702
2945
|
let turnPrompt = prompt;
|
|
@@ -2772,6 +3015,9 @@ export class SessionEngine {
|
|
|
2772
3015
|
}
|
|
2773
3016
|
}
|
|
2774
3017
|
} else if (pending !== undefined && Object.keys(pending).length > 0) {
|
|
3018
|
+
this.logger(
|
|
3019
|
+
`[workspace] no cloud store on this hosting; dropping workspaceFiles for session ${record.sessionId}: ${Object.keys(pending).join(", ")}`
|
|
3020
|
+
);
|
|
2775
3021
|
await this.clearPendingWorkspaceFiles(record.sessionId, pending);
|
|
2776
3022
|
}
|
|
2777
3023
|
if (isFirstTurn && hosted) {
|
|
@@ -2779,36 +3025,26 @@ export class SessionEngine {
|
|
|
2779
3025
|
}
|
|
2780
3026
|
if (preamble !== "" || sections.length > 0) {
|
|
2781
3027
|
turnPrompt = [preamble, ...sections, turnPrompt]
|
|
2782
|
-
.filter(
|
|
3028
|
+
.filter(part => part !== "")
|
|
2783
3029
|
.join("\n\n");
|
|
2784
3030
|
}
|
|
2785
3031
|
} else if (isFirstTurn && runtime === "local" && authoredRoot) {
|
|
2786
|
-
//
|
|
2787
|
-
|
|
2788
|
-
const preamble = buildAgentsMdContent(
|
|
2789
|
-
{ ...agent, tools: [...agent.tools, ...synthesized] },
|
|
2790
|
-
{ includeScripts: true }
|
|
2791
|
-
);
|
|
2792
|
-
const workspaceInfo = `<user_info>\nWorkspace Path: /\n</user_info>`;
|
|
2793
|
-
turnPrompt =
|
|
2794
|
-
preamble === ""
|
|
2795
|
-
? `${workspaceInfo}\n\n${turnPrompt}`
|
|
2796
|
-
: `${workspaceInfo}\n\n${preamble}\n\n${turnPrompt}`;
|
|
2797
|
-
} else if (
|
|
2798
|
-
isFirstTurn &&
|
|
2799
|
-
runtime === "local" &&
|
|
2800
|
-
instructionsInvisibleToHarness
|
|
2801
|
-
) {
|
|
2802
|
-
// Local workspace whose AGENTS.md the harness will not load. With a
|
|
2803
|
-
// borrowed harness cwd, agent tool scripts live only in the durable
|
|
2804
|
-
// scaffold dir — embed bodies like cloud. Otherwise the catalog can
|
|
2805
|
-
// reference on-disk paths under the harness cwd. Grokbot turns are
|
|
2806
|
-
// excluded: their instructions ride the request's `instructions`
|
|
2807
|
-
// field into the Sand system prompt instead.
|
|
2808
|
-
const includeScripts = this.hasBorrowedWorkspace(record);
|
|
2809
|
-
const preamble = buildAgentsMdContent(agent, { includeScripts });
|
|
2810
|
-
turnPrompt = `${preamble}\n\n${turnPrompt}`;
|
|
3032
|
+
// The harness reports no path for a root it never mounted.
|
|
3033
|
+
turnPrompt = `<user_info>\nWorkspace Path: /\n</user_info>\n\n${turnPrompt}`;
|
|
2811
3034
|
}
|
|
3035
|
+
// A virtual root has no scaffold dir either, so its catalog carries the
|
|
3036
|
+
// synthesized file tools and embedded script bodies.
|
|
3037
|
+
const localInstructions =
|
|
3038
|
+
runtime === "local"
|
|
3039
|
+
? authoredRoot
|
|
3040
|
+
? buildAgentsMdContent(
|
|
3041
|
+
{ ...agent, tools: [...agent.tools, ...synthesized] },
|
|
3042
|
+
{ includeScripts: true }
|
|
3043
|
+
)
|
|
3044
|
+
: buildAgentsMdContent(agent, {
|
|
3045
|
+
includeScripts: this.hasBorrowedWorkspace(record),
|
|
3046
|
+
})
|
|
3047
|
+
: undefined;
|
|
2812
3048
|
return {
|
|
2813
3049
|
sessionId: record.sessionId,
|
|
2814
3050
|
...(record.sdkAgentId === undefined
|
|
@@ -2834,15 +3070,18 @@ export class SessionEngine {
|
|
|
2834
3070
|
runtime,
|
|
2835
3071
|
agentName: agent.name,
|
|
2836
3072
|
...(mergedCloud === undefined ? {} : { cloud: mergedCloud }),
|
|
2837
|
-
//
|
|
2838
|
-
// turns carry
|
|
2839
|
-
//
|
|
2840
|
-
// the
|
|
2841
|
-
//
|
|
3073
|
+
// Local turns send the composed instructions as the harness system
|
|
3074
|
+
// prompt; grokbot turns carry them into the hosted session, which
|
|
3075
|
+
// surfaces them in the Sand system prompt. Cloud turns inline them into
|
|
3076
|
+
// the first prompt above instead. Script bodies are embedded whenever
|
|
3077
|
+
// the harness cannot reach the scaffold dir: always for grokbot (the
|
|
3078
|
+
// box never sees the session workspace) and for a borrowed local cwd
|
|
3079
|
+
// (PR worktree, shared checkout); otherwise the catalog references the
|
|
3080
|
+
// on-disk paths under the harness cwd.
|
|
2842
3081
|
instructions:
|
|
2843
3082
|
runtime === "grokbot"
|
|
2844
3083
|
? buildAgentsMdContent(agent, { includeScripts: true })
|
|
2845
|
-
:
|
|
3084
|
+
: localInstructions,
|
|
2846
3085
|
...(runtime === "cloud" && !isCursorHostedFilesAvailable()
|
|
2847
3086
|
? { agentServeAgent: this.project.name }
|
|
2848
3087
|
: {}),
|
|
@@ -2855,7 +3094,11 @@ export class SessionEngine {
|
|
|
2855
3094
|
record.sessionId,
|
|
2856
3095
|
await this.evaluateConnectionAuth(record)
|
|
2857
3096
|
),
|
|
2858
|
-
...(runtime === "local" &&
|
|
3097
|
+
...(runtime === "local" &&
|
|
3098
|
+
(this.hasAttachedAuthedConnections() ||
|
|
3099
|
+
this.project.agent.connections.some(connection =>
|
|
3100
|
+
isCursorAccountTransport(connection.transport)
|
|
3101
|
+
))
|
|
2859
3102
|
? { perSendMcpServers: true }
|
|
2860
3103
|
: {}),
|
|
2861
3104
|
subagents: buildRunnerSubagents(agent),
|
|
@@ -2864,14 +3107,14 @@ export class SessionEngine {
|
|
|
2864
3107
|
// Local follow-ups expire any lingering active run so a preempted turn
|
|
2865
3108
|
// (or one orphaned by a crashed process) never blocks this send.
|
|
2866
3109
|
forceExpireActiveRun: runtime === "local" && !isFirstTurn,
|
|
2867
|
-
onRequestId:
|
|
3110
|
+
onRequestId: requestId => {
|
|
2868
3111
|
emit({ type: "turn.bound", data: { requestId } });
|
|
2869
3112
|
},
|
|
2870
|
-
onSdkAgentId: async
|
|
3113
|
+
onSdkAgentId: async sdkAgentId => {
|
|
2871
3114
|
if (record.sdkAgentId === sdkAgentId) {
|
|
2872
3115
|
return;
|
|
2873
3116
|
}
|
|
2874
|
-
await this.updateRecord(record.sessionId,
|
|
3117
|
+
await this.updateRecord(record.sessionId, current => ({
|
|
2875
3118
|
...current,
|
|
2876
3119
|
sdkAgentId,
|
|
2877
3120
|
}));
|
|
@@ -2973,12 +3216,12 @@ export class SessionEngine {
|
|
|
2973
3216
|
// attached MCP server (each tool appears exactly once).
|
|
2974
3217
|
const advertisedNames = new Set(
|
|
2975
3218
|
this.project.agent.connections
|
|
2976
|
-
.filter(
|
|
2977
|
-
.map(
|
|
3219
|
+
.filter(connection => connection.advertiseTools === true)
|
|
3220
|
+
.map(connection => connection.name)
|
|
2978
3221
|
);
|
|
2979
3222
|
const hostConnectionNames = new Set(
|
|
2980
3223
|
(this.project.agent.hostConnections ?? []).map(
|
|
2981
|
-
|
|
3224
|
+
connection => connection.name
|
|
2982
3225
|
)
|
|
2983
3226
|
);
|
|
2984
3227
|
const bridgedNames = new Set(
|
|
@@ -2992,7 +3235,7 @@ export class SessionEngine {
|
|
|
2992
3235
|
assertCloudCanHonorAccountServersFilters({
|
|
2993
3236
|
runtime,
|
|
2994
3237
|
resolvedConnections: this.resolvedConnections.filter(
|
|
2995
|
-
|
|
3238
|
+
resolved =>
|
|
2996
3239
|
!advertisedNames.has(resolved.name) &&
|
|
2997
3240
|
!hostConnectionNames.has(resolved.name)
|
|
2998
3241
|
),
|
|
@@ -3065,6 +3308,20 @@ export class SessionEngine {
|
|
|
3065
3308
|
}
|
|
3066
3309
|
continue;
|
|
3067
3310
|
}
|
|
3311
|
+
const authored = this.authoredConnection(resolved.name);
|
|
3312
|
+
if (
|
|
3313
|
+
sessionId !== undefined &&
|
|
3314
|
+
authored !== undefined &&
|
|
3315
|
+
isCursorAccountTransport(authored.transport)
|
|
3316
|
+
) {
|
|
3317
|
+
const bound = new URL(url);
|
|
3318
|
+
bound.searchParams.set("agentkitSessionId", sessionId);
|
|
3319
|
+
servers[resolved.name] = {
|
|
3320
|
+
url: bound.toString(),
|
|
3321
|
+
headers: resolved.headers,
|
|
3322
|
+
};
|
|
3323
|
+
continue;
|
|
3324
|
+
}
|
|
3068
3325
|
servers[resolved.name] = {
|
|
3069
3326
|
url,
|
|
3070
3327
|
headers: resolved.headers,
|
|
@@ -3074,7 +3331,7 @@ export class SessionEngine {
|
|
|
3074
3331
|
runtime === "cloud" &&
|
|
3075
3332
|
sessionId !== undefined &&
|
|
3076
3333
|
this.cloudServerToolsConnection !== undefined &&
|
|
3077
|
-
this.project.agent.tools.some(
|
|
3334
|
+
this.project.agent.tools.some(tool => tool.execution === "server")
|
|
3078
3335
|
) {
|
|
3079
3336
|
if (servers[SERVER_TOOLS_MCP_SERVER_NAME] !== undefined) {
|
|
3080
3337
|
throw new Error(
|
|
@@ -3102,7 +3359,7 @@ export class SessionEngine {
|
|
|
3102
3359
|
*/
|
|
3103
3360
|
private hasAttachedAuthedConnections(): boolean {
|
|
3104
3361
|
return this.project.agent.connections.some(
|
|
3105
|
-
|
|
3362
|
+
connection =>
|
|
3106
3363
|
connection.auth !== undefined && connection.advertiseTools !== true
|
|
3107
3364
|
);
|
|
3108
3365
|
}
|
|
@@ -3118,7 +3375,7 @@ export class SessionEngine {
|
|
|
3118
3375
|
record: SessionRecord
|
|
3119
3376
|
): Promise<ReadonlyMap<string, Record<string, string>> | undefined> {
|
|
3120
3377
|
const authed = this.project.agent.connections.filter(
|
|
3121
|
-
|
|
3378
|
+
connection =>
|
|
3122
3379
|
connection.auth !== undefined && connection.advertiseTools !== true
|
|
3123
3380
|
);
|
|
3124
3381
|
if (authed.length === 0) {
|
|
@@ -3234,7 +3491,7 @@ export class SessionEngine {
|
|
|
3234
3491
|
);
|
|
3235
3492
|
}
|
|
3236
3493
|
const tool = this.project.agent.tools.find(
|
|
3237
|
-
|
|
3494
|
+
candidate =>
|
|
3238
3495
|
candidate.name === toolName && candidate.execution === "server"
|
|
3239
3496
|
);
|
|
3240
3497
|
if (tool === undefined) {
|
|
@@ -3481,11 +3738,11 @@ export class SessionEngine {
|
|
|
3481
3738
|
args.sessionId,
|
|
3482
3739
|
pendingRecord
|
|
3483
3740
|
);
|
|
3484
|
-
await this.updateRecord(args.sessionId,
|
|
3741
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3485
3742
|
...current,
|
|
3486
3743
|
pendingApprovals: [
|
|
3487
3744
|
...(current.pendingApprovals ?? []).filter(
|
|
3488
|
-
|
|
3745
|
+
item => item.callId !== args.callId
|
|
3489
3746
|
),
|
|
3490
3747
|
pendingRecord,
|
|
3491
3748
|
],
|
|
@@ -3502,10 +3759,10 @@ export class SessionEngine {
|
|
|
3502
3759
|
`[session] tool ${args.toolName} awaiting approval (${args.callId})`
|
|
3503
3760
|
);
|
|
3504
3761
|
const { decision, by } = await resolutionPromise;
|
|
3505
|
-
await this.updateRecord(args.sessionId,
|
|
3762
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3506
3763
|
...current,
|
|
3507
3764
|
pendingApprovals: (current.pendingApprovals ?? []).filter(
|
|
3508
|
-
|
|
3765
|
+
item => item.callId !== args.callId
|
|
3509
3766
|
),
|
|
3510
3767
|
}));
|
|
3511
3768
|
args.emit({
|
|
@@ -3532,7 +3789,7 @@ export class SessionEngine {
|
|
|
3532
3789
|
) {
|
|
3533
3790
|
return;
|
|
3534
3791
|
}
|
|
3535
|
-
await this.updateRecord(sessionId,
|
|
3792
|
+
await this.updateRecord(sessionId, record => ({
|
|
3536
3793
|
...record,
|
|
3537
3794
|
pendingApprovals: [],
|
|
3538
3795
|
}));
|
|
@@ -3575,8 +3832,8 @@ export class SessionEngine {
|
|
|
3575
3832
|
throw new SessionAuthError(sessionId);
|
|
3576
3833
|
}
|
|
3577
3834
|
const pending =
|
|
3578
|
-
(record.pendingApprovals ?? []).find(
|
|
3579
|
-
this.approvals.list(sessionId).find(
|
|
3835
|
+
(record.pendingApprovals ?? []).find(item => item.callId === callId) ??
|
|
3836
|
+
this.approvals.list(sessionId).find(item => item.callId === callId);
|
|
3580
3837
|
if (pending === undefined) {
|
|
3581
3838
|
throw new ApprovalNotFoundError(sessionId, callId);
|
|
3582
3839
|
}
|
|
@@ -3592,10 +3849,10 @@ export class SessionEngine {
|
|
|
3592
3849
|
sessionId: string,
|
|
3593
3850
|
callId: string
|
|
3594
3851
|
): Promise<void> {
|
|
3595
|
-
await this.updateRecord(sessionId,
|
|
3852
|
+
await this.updateRecord(sessionId, current => ({
|
|
3596
3853
|
...current,
|
|
3597
3854
|
pendingApprovals: (current.pendingApprovals ?? []).filter(
|
|
3598
|
-
|
|
3855
|
+
item => item.callId !== callId
|
|
3599
3856
|
),
|
|
3600
3857
|
}));
|
|
3601
3858
|
}
|
|
@@ -3603,7 +3860,7 @@ export class SessionEngine {
|
|
|
3603
3860
|
private wrapMcp(inner: McpHost): HostMcpRegistry {
|
|
3604
3861
|
return {
|
|
3605
3862
|
names: () => inner.names(),
|
|
3606
|
-
listTools:
|
|
3863
|
+
listTools: name => this.withMcpAuth(name, () => inner.listTools(name)),
|
|
3607
3864
|
callTool: (name, tool, args) =>
|
|
3608
3865
|
this.withMcpAuth(name, () => inner.callTool(name, tool, args)),
|
|
3609
3866
|
};
|
|
@@ -3611,11 +3868,11 @@ export class SessionEngine {
|
|
|
3611
3868
|
|
|
3612
3869
|
private advertiseMcp(): AdvertiseHostMcp {
|
|
3613
3870
|
return {
|
|
3614
|
-
listTools:
|
|
3871
|
+
listTools: name =>
|
|
3615
3872
|
this.withMcpListAuth(name, () => this.mcpHost.listTools(name)),
|
|
3616
3873
|
callTool: (name, tool, args) =>
|
|
3617
3874
|
this.withMcpAuth(name, () => this.mcpHost.callTool(name, tool, args)),
|
|
3618
|
-
oneOff:
|
|
3875
|
+
oneOff: connection => {
|
|
3619
3876
|
const inner = this.mcpHost.oneOff(connection);
|
|
3620
3877
|
return {
|
|
3621
3878
|
listTools: () =>
|
|
@@ -3768,11 +4025,11 @@ export class SessionEngine {
|
|
|
3768
4025
|
requestedAt,
|
|
3769
4026
|
};
|
|
3770
4027
|
const resolutionPromise = this.auths.wait(args.sessionId, pendingRecord);
|
|
3771
|
-
await this.updateRecord(args.sessionId,
|
|
4028
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3772
4029
|
...current,
|
|
3773
4030
|
pendingAuths: [
|
|
3774
4031
|
...(current.pendingAuths ?? []).filter(
|
|
3775
|
-
|
|
4032
|
+
item => item.callId !== args.callId
|
|
3776
4033
|
),
|
|
3777
4034
|
pendingRecord,
|
|
3778
4035
|
],
|
|
@@ -3790,10 +4047,10 @@ export class SessionEngine {
|
|
|
3790
4047
|
`[session] tool ${args.toolName} awaiting MCP auth ${args.connection} (${args.callId})`
|
|
3791
4048
|
);
|
|
3792
4049
|
const { decision, by } = await resolutionPromise;
|
|
3793
|
-
await this.updateRecord(args.sessionId,
|
|
4050
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3794
4051
|
...current,
|
|
3795
4052
|
pendingAuths: (current.pendingAuths ?? []).filter(
|
|
3796
|
-
|
|
4053
|
+
item => item.callId !== args.callId
|
|
3797
4054
|
),
|
|
3798
4055
|
}));
|
|
3799
4056
|
args.emit({
|
|
@@ -3822,7 +4079,7 @@ export class SessionEngine {
|
|
|
3822
4079
|
) {
|
|
3823
4080
|
return;
|
|
3824
4081
|
}
|
|
3825
|
-
await this.updateRecord(sessionId,
|
|
4082
|
+
await this.updateRecord(sessionId, record => ({
|
|
3826
4083
|
...record,
|
|
3827
4084
|
pendingAuths: [],
|
|
3828
4085
|
}));
|
|
@@ -3856,8 +4113,8 @@ export class SessionEngine {
|
|
|
3856
4113
|
throw new SessionAuthError(sessionId);
|
|
3857
4114
|
}
|
|
3858
4115
|
const pending =
|
|
3859
|
-
(record.pendingAuths ?? []).find(
|
|
3860
|
-
this.auths.list(sessionId).find(
|
|
4116
|
+
(record.pendingAuths ?? []).find(item => item.callId === callId) ??
|
|
4117
|
+
this.auths.list(sessionId).find(item => item.callId === callId);
|
|
3861
4118
|
if (pending === undefined) {
|
|
3862
4119
|
throw new AuthNotFoundError(sessionId, callId);
|
|
3863
4120
|
}
|
|
@@ -3876,10 +4133,10 @@ export class SessionEngine {
|
|
|
3876
4133
|
sessionId: string,
|
|
3877
4134
|
callId: string
|
|
3878
4135
|
): Promise<void> {
|
|
3879
|
-
await this.updateRecord(sessionId,
|
|
4136
|
+
await this.updateRecord(sessionId, current => ({
|
|
3880
4137
|
...current,
|
|
3881
4138
|
pendingAuths: (current.pendingAuths ?? []).filter(
|
|
3882
|
-
|
|
4139
|
+
item => item.callId !== callId
|
|
3883
4140
|
),
|
|
3884
4141
|
}));
|
|
3885
4142
|
}
|
|
@@ -4087,17 +4344,17 @@ export class SessionEngine {
|
|
|
4087
4344
|
}
|
|
4088
4345
|
> {
|
|
4089
4346
|
const authored = this.project.agent.tools.find(
|
|
4090
|
-
|
|
4347
|
+
tool => tool.name === toolName
|
|
4091
4348
|
);
|
|
4092
4349
|
if (authored !== undefined) {
|
|
4093
4350
|
return { tool: authored };
|
|
4094
4351
|
}
|
|
4095
4352
|
const catalog = await this.listCatalogTools(options);
|
|
4096
|
-
const tool = catalog.tools.find(
|
|
4353
|
+
const tool = catalog.tools.find(entry => entry.name === toolName);
|
|
4097
4354
|
if (tool === undefined) {
|
|
4098
4355
|
return {
|
|
4099
4356
|
tool: undefined,
|
|
4100
|
-
availableTools: catalog.tools.map(
|
|
4357
|
+
availableTools: catalog.tools.map(entry => entry.name),
|
|
4101
4358
|
connectionErrors: catalog.connectionErrors,
|
|
4102
4359
|
};
|
|
4103
4360
|
}
|
|
@@ -4139,10 +4396,10 @@ export class SessionEngine {
|
|
|
4139
4396
|
if (native !== undefined) {
|
|
4140
4397
|
return native;
|
|
4141
4398
|
}
|
|
4142
|
-
let tool = this.project.agent.tools.find(
|
|
4399
|
+
let tool = this.project.agent.tools.find(t => t.name === toolName);
|
|
4143
4400
|
if (
|
|
4144
4401
|
tool === undefined &&
|
|
4145
|
-
this.project.agent.connections.some(
|
|
4402
|
+
this.project.agent.connections.some(c => c.advertiseTools === true)
|
|
4146
4403
|
) {
|
|
4147
4404
|
// Advertised passthroughs are ordinary server tools in the session's
|
|
4148
4405
|
// namespace; resolve the live listing so direct calls address them by
|
|
@@ -4153,14 +4410,14 @@ export class SessionEngine {
|
|
|
4153
4410
|
session,
|
|
4154
4411
|
hostMcp: this.advertiseMcp(),
|
|
4155
4412
|
});
|
|
4156
|
-
tool = advertised.find(
|
|
4413
|
+
tool = advertised.find(t => t.name === toolName);
|
|
4157
4414
|
}
|
|
4158
4415
|
if (tool === undefined) {
|
|
4159
4416
|
throw new UnknownToolError(
|
|
4160
4417
|
toolName,
|
|
4161
4418
|
this.project.agent.tools
|
|
4162
|
-
.filter(
|
|
4163
|
-
.map(
|
|
4419
|
+
.filter(t => t.execution === "server")
|
|
4420
|
+
.map(t => t.name)
|
|
4164
4421
|
);
|
|
4165
4422
|
}
|
|
4166
4423
|
const execute = tool.definition.execute;
|
|
@@ -4531,7 +4788,7 @@ export class SessionEngine {
|
|
|
4531
4788
|
): Promise<HostMcpToolInfo | undefined> {
|
|
4532
4789
|
try {
|
|
4533
4790
|
const listed = await this.host.mcp.listTools(connectionName);
|
|
4534
|
-
return listed.find(
|
|
4791
|
+
return listed.find(tool => tool.name === toolName);
|
|
4535
4792
|
} catch {
|
|
4536
4793
|
return undefined;
|
|
4537
4794
|
}
|
|
@@ -4563,7 +4820,7 @@ export class SessionEngine {
|
|
|
4563
4820
|
const chain = this.dispatchChains.get(sessionId) ?? Promise.resolve();
|
|
4564
4821
|
const next = chain
|
|
4565
4822
|
.then(() => this.dispatchEvent(sessionId, event, context))
|
|
4566
|
-
.catch(
|
|
4823
|
+
.catch(error => {
|
|
4567
4824
|
this.logger(
|
|
4568
4825
|
`[agent-sdk] event dispatch failed for ${sessionId}: ${describeError(error)}`
|
|
4569
4826
|
);
|
|
@@ -4630,11 +4887,11 @@ export class SessionEngine {
|
|
|
4630
4887
|
}
|
|
4631
4888
|
if (context === undefined || channelStateBefore === undefined) {
|
|
4632
4889
|
// Handlers mutate live channel state in place; save the current record.
|
|
4633
|
-
await this.updateRecord(sessionId,
|
|
4890
|
+
await this.updateRecord(sessionId, current => ({ ...current }));
|
|
4634
4891
|
} else {
|
|
4635
4892
|
const updatedState = channelCtx.state as JsonValue;
|
|
4636
4893
|
context.channelState = updatedState;
|
|
4637
|
-
await this.updateRecord(sessionId,
|
|
4894
|
+
await this.updateRecord(sessionId, current => ({
|
|
4638
4895
|
...current,
|
|
4639
4896
|
channelState: mergeChannelStateMutation({
|
|
4640
4897
|
current: current.channelState,
|
|
@@ -4718,8 +4975,10 @@ export class SessionEngine {
|
|
|
4718
4975
|
async waitForCompletion(sessionId: string): Promise<TurnOutcome> {
|
|
4719
4976
|
// Drain admission first so pendingTurns → activeTurns is visible before we
|
|
4720
4977
|
// decide the session is idle (reminders use this for queueBehindTurn).
|
|
4721
|
-
//
|
|
4722
|
-
// follow-up
|
|
4978
|
+
// Wait for coalesce drain and any successor turn so hosted execute does
|
|
4979
|
+
// not park mid-follow-up, but report the root turn's outcome: a drained
|
|
4980
|
+
// successor failure must not un-ACK an already-finished owner.
|
|
4981
|
+
let root: TurnOutcome | undefined;
|
|
4723
4982
|
for (;;) {
|
|
4724
4983
|
const chain = this.admissionChains.get(sessionId);
|
|
4725
4984
|
if (chain !== undefined) {
|
|
@@ -4727,14 +4986,15 @@ export class SessionEngine {
|
|
|
4727
4986
|
}
|
|
4728
4987
|
const active = this.activeTurns.get(sessionId);
|
|
4729
4988
|
if (active !== undefined) {
|
|
4730
|
-
await active;
|
|
4989
|
+
const outcome = await active;
|
|
4990
|
+
root ??= outcome;
|
|
4731
4991
|
continue;
|
|
4732
4992
|
}
|
|
4733
4993
|
const dispatch = this.dispatchChains.get(sessionId);
|
|
4734
4994
|
if (dispatch !== undefined) {
|
|
4735
4995
|
await dispatch.catch(() => {});
|
|
4736
4996
|
}
|
|
4737
|
-
return this.lastOutcomes.get(sessionId) ?? { status: "finished" };
|
|
4997
|
+
return root ?? this.lastOutcomes.get(sessionId) ?? { status: "finished" };
|
|
4738
4998
|
}
|
|
4739
4999
|
}
|
|
4740
5000
|
|
|
@@ -4773,7 +5033,7 @@ export class SessionEngine {
|
|
|
4773
5033
|
}
|
|
4774
5034
|
const owned = await this.ownedSessionIds(caller);
|
|
4775
5035
|
return records.filter(
|
|
4776
|
-
|
|
5036
|
+
record => record.sessionId !== undefined && owned.has(record.sessionId)
|
|
4777
5037
|
);
|
|
4778
5038
|
}
|
|
4779
5039
|
|
|
@@ -4810,8 +5070,8 @@ export class SessionEngine {
|
|
|
4810
5070
|
const sessions = await this.sessions.list();
|
|
4811
5071
|
return new Set(
|
|
4812
5072
|
sessions
|
|
4813
|
-
.filter(
|
|
4814
|
-
.map(
|
|
5073
|
+
.filter(record => samePrincipal(record.auth, caller))
|
|
5074
|
+
.map(record => record.sessionId)
|
|
4815
5075
|
);
|
|
4816
5076
|
}
|
|
4817
5077
|
|
|
@@ -4955,8 +5215,8 @@ export class SessionEngine {
|
|
|
4955
5215
|
includeAll: boolean
|
|
4956
5216
|
): SessionSummary[] {
|
|
4957
5217
|
return records
|
|
4958
|
-
.filter(
|
|
4959
|
-
.map(
|
|
5218
|
+
.filter(record => includeAll || samePrincipal(record.auth, caller))
|
|
5219
|
+
.map(record => {
|
|
4960
5220
|
const links = sessionExternalLinks(record);
|
|
4961
5221
|
return {
|
|
4962
5222
|
sessionId: record.sessionId,
|
|
@@ -5015,7 +5275,7 @@ export class SessionEngine {
|
|
|
5015
5275
|
if (existing === undefined) {
|
|
5016
5276
|
throw new Error(`Unknown session: ${sessionId}`);
|
|
5017
5277
|
}
|
|
5018
|
-
const record = await this.updateRecord(sessionId,
|
|
5278
|
+
const record = await this.updateRecord(sessionId, current => ({
|
|
5019
5279
|
...current,
|
|
5020
5280
|
turnCount: current.turnCount + 1,
|
|
5021
5281
|
}));
|
|
@@ -5150,7 +5410,7 @@ export class SessionEngine {
|
|
|
5150
5410
|
return pending;
|
|
5151
5411
|
}
|
|
5152
5412
|
const work = this.runCloudTurnCostBackfill(sessionId)
|
|
5153
|
-
.catch(
|
|
5413
|
+
.catch(error => {
|
|
5154
5414
|
this.logger(
|
|
5155
5415
|
`[agent-sdk] cloud cost backfill failed for ${sessionId}: ${describeError(error)}`
|
|
5156
5416
|
);
|
|
@@ -5165,10 +5425,10 @@ export class SessionEngine {
|
|
|
5165
5425
|
private async runCloudTurnCostBackfill(sessionId: string): Promise<void> {
|
|
5166
5426
|
const log = await this.logs.get(sessionId);
|
|
5167
5427
|
const events = await log.snapshot(0);
|
|
5168
|
-
if (!events.some(
|
|
5428
|
+
if (!events.some(event => isUnpricedCompletedTurn(event))) {
|
|
5169
5429
|
if (
|
|
5170
5430
|
!this.isTurnRunning(sessionId) &&
|
|
5171
|
-
events.some(
|
|
5431
|
+
events.some(event => event.type === "turn.completed")
|
|
5172
5432
|
) {
|
|
5173
5433
|
this.cloudCostBackfillDone.add(sessionId);
|
|
5174
5434
|
}
|
|
@@ -5199,7 +5459,7 @@ export class SessionEngine {
|
|
|
5199
5459
|
log.replace(i, next);
|
|
5200
5460
|
}
|
|
5201
5461
|
if (
|
|
5202
|
-
!(await log.snapshot(0)).some(
|
|
5462
|
+
!(await log.snapshot(0)).some(event => isUnpricedCompletedTurn(event))
|
|
5203
5463
|
) {
|
|
5204
5464
|
this.cloudCostBackfillDone.add(sessionId);
|
|
5205
5465
|
}
|
|
@@ -5210,7 +5470,7 @@ export class SessionEngine {
|
|
|
5210
5470
|
token: string | null
|
|
5211
5471
|
): Promise<void> {
|
|
5212
5472
|
const previous = await this.sessions.get(sessionId);
|
|
5213
|
-
await this.updateRecord(sessionId,
|
|
5473
|
+
await this.updateRecord(sessionId, current => ({
|
|
5214
5474
|
...current,
|
|
5215
5475
|
continuationKey: token,
|
|
5216
5476
|
}));
|
|
@@ -5387,7 +5647,7 @@ export class SessionEngine {
|
|
|
5387
5647
|
// the lazy continuation-lookup path.
|
|
5388
5648
|
const cutoff = Date.now() - policy.maxAgeMs;
|
|
5389
5649
|
const candidates = loaded
|
|
5390
|
-
.map(
|
|
5650
|
+
.map(record => ({
|
|
5391
5651
|
record,
|
|
5392
5652
|
// Numeric timestamp for both the age filter and the sort; a
|
|
5393
5653
|
// non-string updatedAt (e.g. a raw DB Date from an untyped sink)
|
|
@@ -5419,7 +5679,7 @@ export class SessionEngine {
|
|
|
5419
5679
|
) {
|
|
5420
5680
|
const chunk = candidates.slice(i, i + RESTORE_FETCH_CONCURRENCY);
|
|
5421
5681
|
const fetched = await Promise.all(
|
|
5422
|
-
chunk.map(async
|
|
5682
|
+
chunk.map(async record => {
|
|
5423
5683
|
try {
|
|
5424
5684
|
// Local state always wins over the sink.
|
|
5425
5685
|
if ((await this.sessions.get(record.sessionId)) !== undefined) {
|
|
@@ -5676,7 +5936,7 @@ function eventsNdjson(events: SessionEvent[]): string | undefined {
|
|
|
5676
5936
|
if (events.length === 0) {
|
|
5677
5937
|
return undefined;
|
|
5678
5938
|
}
|
|
5679
|
-
return `${events.map(
|
|
5939
|
+
return `${events.map(event => JSON.stringify(event)).join("\n")}\n`;
|
|
5680
5940
|
}
|
|
5681
5941
|
|
|
5682
5942
|
function subagentPrompt(subagent: ResolvedAgent): string {
|
|
@@ -5692,7 +5952,7 @@ function subagentPrompt(subagent: ResolvedAgent): string {
|
|
|
5692
5952
|
* executor that turn will run on.
|
|
5693
5953
|
*/
|
|
5694
5954
|
function buildRunnerSubagents(agent: ResolvedAgent): RunnerSubagent[] {
|
|
5695
|
-
return agent.subagents.map(
|
|
5955
|
+
return agent.subagents.map(subagent => ({
|
|
5696
5956
|
name: subagent.name,
|
|
5697
5957
|
description: subagent.description ?? subagent.name,
|
|
5698
5958
|
prompt: subagentPrompt(subagent),
|
|
@@ -5716,7 +5976,7 @@ async function defaultGetCloudUsage(
|
|
|
5716
5976
|
return {
|
|
5717
5977
|
usage: mapSdkTokenUsage(billed.usage),
|
|
5718
5978
|
cost: billed.cost,
|
|
5719
|
-
runs: billed.runs.map(
|
|
5979
|
+
runs: billed.runs.map(run => ({
|
|
5720
5980
|
runId: run.runId,
|
|
5721
5981
|
usage: mapSdkTokenUsage(run.usage),
|
|
5722
5982
|
cost: run.cost,
|
|
@@ -5768,7 +6028,7 @@ function approvalResolverLabel(auth: AuthContext | null): string | undefined {
|
|
|
5768
6028
|
|
|
5769
6029
|
/** Let the HTTP NDJSON writer flush before the next SDK update. */
|
|
5770
6030
|
function yieldEventLoop(): Promise<void> {
|
|
5771
|
-
return new Promise(
|
|
6031
|
+
return new Promise(resolve => {
|
|
5772
6032
|
setImmediate(resolve);
|
|
5773
6033
|
});
|
|
5774
6034
|
}
|