@cursor/july 0.1.109 → 0.1.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/README.md +0 -15
- package/dist/bin/agent-serve.js +99 -67
- 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 +29 -19
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +46 -32
- 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 +560 -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 +44 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +323 -107
- 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 +62 -0
- package/dist/channels/slack/placeholder.d.ts.map +1 -0
- package/dist/channels/slack/placeholder.js +268 -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 +58 -30
- 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.DxTdhphC.js +309 -0
- package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
- package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.QmjDU6Jh.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CVQERt56.js → VPLocalSearchBox.CR3KTF0X.js} +2 -2
- package/dist/docs/assets/chunks/arc.CVVqBOdS.js +1 -0
- package/dist/docs/assets/chunks/architectureDiagram-Q4EWVU46.CJHGP4ki.js +36 -0
- package/dist/docs/assets/chunks/baseUniq.r7UVVRBP.js +1 -0
- package/dist/docs/assets/chunks/blockDiagram-DXYQGD6D.DKmMaTre.js +132 -0
- package/dist/docs/assets/chunks/c4Diagram-AHTNJAMY.DDJsntUO.js +10 -0
- package/dist/docs/assets/chunks/channel.BjpoSbz_.js +1 -0
- package/dist/docs/assets/chunks/chunk-4BX2VUAB.BK2rKt6W.js +1 -0
- package/dist/docs/assets/chunks/chunk-4TB4RGXK.DRLV8RnF.js +206 -0
- package/dist/docs/assets/chunks/chunk-55IACEB6.DaKjxtb7.js +1 -0
- package/dist/docs/assets/chunks/chunk-EDXVE4YY.C5sPCIT1.js +1 -0
- package/dist/docs/assets/chunks/chunk-FMBD7UC4.CSGWyNTB.js +15 -0
- package/dist/docs/assets/chunks/chunk-OYMX7WX6.D5tK9XEr.js +231 -0
- package/dist/docs/assets/chunks/chunk-QZHKN3VN.BeZGd1UZ.js +1 -0
- package/dist/docs/assets/chunks/chunk-YZCP3GAM.U_tfWwQR.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BgxOlMHw.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BgxOlMHw.js +1 -0
- package/dist/docs/assets/chunks/clone.DRuGBKZC.js +1 -0
- package/dist/docs/assets/chunks/cose-bilkent-S5V4N54A.DVeRXIb6.js +1 -0
- package/dist/docs/assets/chunks/cytoscape.esm.BQk4lpUV.js +331 -0
- package/dist/docs/assets/chunks/dagre-KV5264BT.BpKJAeRZ.js +4 -0
- package/dist/docs/assets/chunks/defaultLocale.C4B-KCzX.js +1 -0
- package/dist/docs/assets/chunks/diagram-5BDNPKRD.BQOtrd1Z.js +10 -0
- package/dist/docs/assets/chunks/diagram-G4DWMVQ6.CSDAhjPI.js +24 -0
- package/dist/docs/assets/chunks/diagram-MMDJMWI5.Dpztst2S.js +43 -0
- package/dist/docs/assets/chunks/diagram-TYMM5635.qJHRizHR.js +24 -0
- package/dist/docs/assets/chunks/erDiagram-SMLLAGMA.vbDotH3l.js +85 -0
- package/dist/docs/assets/chunks/flowDiagram-DWJPFMVM.CqS_ZQr4.js +162 -0
- package/dist/docs/assets/chunks/{framework.BCISBCiQ.js → framework.BNw1pucY.js} +6 -6
- package/dist/docs/assets/chunks/ganttDiagram-T4ZO3ILL.DTLdR4pN.js +292 -0
- package/dist/docs/assets/chunks/gitGraphDiagram-UUTBAWPF.D04lnbnr.js +106 -0
- package/dist/docs/assets/chunks/graph.BlfqLJsM.js +1 -0
- package/dist/docs/assets/chunks/infoDiagram-42DDH7IO.tAooImWA.js +2 -0
- package/dist/docs/assets/chunks/init.Gi6I4Gst.js +1 -0
- package/dist/docs/assets/chunks/ishikawaDiagram-UXIWVN3A.ClUsVqnJ.js +70 -0
- package/dist/docs/assets/chunks/journeyDiagram-VCZTEJTY.C3tUgyCg.js +139 -0
- package/dist/docs/assets/chunks/kanban-definition-6JOO6SKY.CtD9-QCe.js +89 -0
- package/dist/docs/assets/chunks/katex.DkKDou_j.js +257 -0
- package/dist/docs/assets/chunks/layout.D38U-LnT.js +1 -0
- package/dist/docs/assets/chunks/linear.BJmssyhN.js +1 -0
- package/dist/docs/assets/chunks/min.DNgXoouU.js +1 -0
- package/dist/docs/assets/chunks/mindmap-definition-QFDTVHPH.Dcp6cxeu.js +96 -0
- package/dist/docs/assets/chunks/ordinal.DBvzRdQf.js +1 -0
- package/dist/docs/assets/chunks/pieDiagram-DEJITSTG.CLDw6zIs.js +30 -0
- package/dist/docs/assets/chunks/quadrantDiagram-34T5L4WZ.CYaeeY4c.js +7 -0
- package/dist/docs/assets/chunks/requirementDiagram-MS252O5E.gMYuRpq2.js +84 -0
- package/dist/docs/assets/chunks/sankeyDiagram-XADWPNL6.CZqyHFbc.js +10 -0
- package/dist/docs/assets/chunks/sequenceDiagram-FGHM5R23.BTsCjUDN.js +157 -0
- package/dist/docs/assets/chunks/stateDiagram-FHFEXIEX.CftT9mLJ.js +1 -0
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.-43J68xB.js +1 -0
- package/dist/docs/assets/chunks/{theme.Dnsd3XOn.js → theme.B_7J9ZsV.js} +2 -2
- package/dist/docs/assets/chunks/timeline-definition-GMOUNBTQ.DbU3WUNw.js +120 -0
- package/dist/docs/assets/chunks/vennDiagram-DHZGUBPP.ixsq-q2u.js +34 -0
- package/dist/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js +1 -0
- package/dist/docs/assets/chunks/wardley-RL74JXVD.WRXz-Dux.js +162 -0
- package/dist/docs/assets/chunks/wardleyDiagram-NUSXRM2D.C0ewvgbp.js +20 -0
- package/dist/docs/assets/chunks/xychartDiagram-5P7HB3ND.nAEhF4bO.js +7 -0
- package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
- package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
- package/dist/docs/assets/evals.md.BYvfZ-PO.js +72 -0
- package/dist/docs/assets/evals.md.BYvfZ-PO.lean.js +1 -0
- package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.js +30 -0
- package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.lean.js +1 -0
- package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
- package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
- package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
- package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
- package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
- package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
- package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
- package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
- package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
- package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
- package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
- package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
- package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
- package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
- package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
- package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
- package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
- package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
- package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
- package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
- package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
- package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
- package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
- package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
- package/dist/docs/assets/index.md.C-t81M5J.js +17 -0
- package/dist/docs/assets/index.md.C-t81M5J.lean.js +1 -0
- package/dist/docs/assets/{quickstart.md.DdQOF7Y8.js → quickstart.md.DAvVhuuU.js} +30 -38
- package/dist/docs/assets/quickstart.md.DAvVhuuU.lean.js +1 -0
- package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.CAo-iK4j.js → reference_channels.md.nFWbzAic.js} +2 -12
- package/dist/docs/assets/{reference_channels.md.CAo-iK4j.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.Deg7849l.js → reference_cli.md.DLWDz9ij.js} +5 -3
- package/dist/docs/assets/{reference_cli.md.Deg7849l.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.BojkC6c5.js → reference_connections.md.CmyrlXfY.js} +4 -4
- package/dist/docs/assets/{reference_connections.md.BojkC6c5.lean.js → reference_connections.md.CmyrlXfY.lean.js} +1 -1
- package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
- package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
- package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.js +58 -0
- package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.lean.js +1 -0
- package/dist/docs/assets/{reference_hooks.md.BlM_bOg6.js → reference_hooks.md.B7uzNENk.js} +3 -3
- package/dist/docs/assets/{reference_hooks.md.BlM_bOg6.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.BwaCo-VO.js → reference_http-api.md.CduHavZ2.js} +3 -3
- package/dist/docs/assets/{reference_http-api.md.BwaCo-VO.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.js → reference_instructions.md.CU1My5My.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.DLnoaczX.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.DLnoaczX.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.BEU8MtQV.js → reference_project-layout.md.BGhgpy9V.js} +3 -3
- package/dist/docs/assets/{reference_project-layout.md.BEU8MtQV.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.js → reference_prompt.md.Ccp0R53H.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.CyXV1MUw.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.CyXV1MUw.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.l2ezAcaN.js → reference_skills.md.DjQkRefx.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.l2ezAcaN.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.CfsIloPm.js → reference_subagents.md.BHsSMMyO.js} +2 -2
- package/dist/docs/assets/{reference_subagents.md.CfsIloPm.lean.js → reference_subagents.md.BHsSMMyO.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.aGrn99hP.js → reference_tools.md.BYzUTeVA.js} +4 -4
- package/dist/docs/assets/{reference_tools.md.aGrn99hP.lean.js → reference_tools.md.BYzUTeVA.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.9M575F5C.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.BZSH4N9z.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
- package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
- package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
- package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
- package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
- package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.js → templates_triage.md.CVGe_FG6.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
- package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
- package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
- package/dist/docs/building-with-agents.html +47 -18
- package/dist/docs/building-with-agents.md +94 -84
- package/dist/docs/deployment.html +62 -48
- package/dist/docs/deployment.md +117 -364
- package/dist/docs/evals.html +88 -194
- package/dist/docs/evals.md +146 -673
- package/dist/docs/guides/agent-to-agent.html +65 -12
- package/dist/docs/guides/agent-to-agent.md +125 -91
- package/dist/docs/guides/bitbucket.html +182 -14
- package/dist/docs/guides/bitbucket.md +249 -48
- package/dist/docs/guides/cloud-agents.html +49 -10
- package/dist/docs/guides/cloud-agents.md +123 -66
- package/dist/docs/guides/convert-automation.html +83 -19
- package/dist/docs/guides/convert-automation.md +156 -147
- package/dist/docs/guides/github.html +187 -62
- package/dist/docs/guides/github.md +260 -245
- package/dist/docs/guides/gitlab.html +187 -15
- package/dist/docs/guides/gitlab.md +249 -50
- package/dist/docs/guides/grokbot-agents.html +51 -11
- package/dist/docs/guides/grokbot-agents.md +116 -63
- package/dist/docs/guides/improve.html +51 -10
- package/dist/docs/guides/improve.md +111 -58
- package/dist/docs/guides/mcp-oauth.html +77 -22
- package/dist/docs/guides/mcp-oauth.md +111 -121
- package/dist/docs/guides/opentelemetry.html +72 -30
- package/dist/docs/guides/opentelemetry.md +105 -187
- package/dist/docs/guides/slack.html +89 -24
- package/dist/docs/guides/slack.md +170 -191
- package/dist/docs/guides/webhooks.html +100 -200
- package/dist/docs/guides/webhooks.md +154 -386
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +47 -11
- package/dist/docs/hillclimbing.md +101 -55
- package/dist/docs/index.html +57 -12
- package/dist/docs/index.md +83 -150
- package/dist/docs/llms-full.txt +6244 -10784
- package/dist/docs/llms.txt +23 -46
- 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 +44 -9
- package/dist/docs/reference/cli.md +2 -16
- package/dist/docs/reference/connections.html +43 -10
- package/dist/docs/reference/connections.md +3 -5
- package/dist/docs/reference/evals.html +116 -0
- package/dist/docs/reference/evals.md +293 -0
- package/dist/docs/reference/extensions.html +83 -54
- package/dist/docs/reference/extensions.md +127 -199
- package/dist/docs/reference/hooks.html +42 -9
- package/dist/docs/reference/hooks.md +34 -36
- 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/thermo-quality-review.html +62 -0
- package/dist/docs/templates/thermo-quality-review.md +75 -0
- package/dist/docs/templates/thermo-review.html +62 -0
- package/dist/docs/templates/thermo-review.md +74 -0
- package/dist/docs/templates/triage.html +41 -8
- package/dist/docs/troubleshooting.html +41 -8
- package/dist/docs/troubleshooting.md +97 -67
- 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/skills/handoff.md +3 -7
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- package/dist/extensions/improve/extension.d.ts +3 -1
- package/dist/extensions/improve/extension.d.ts.map +1 -1
- package/dist/extensions/improve/extension.js +4 -2
- package/dist/extensions/improve/skills/yourself.js +2 -2
- 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 +46 -2
- package/dist/filesystem.d.ts.map +1 -1
- package/dist/filesystem.js +160 -113
- package/dist/index.d.ts +7 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -7
- 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 +7 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +140 -27
- 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 +15 -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-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +2 -0
- package/dist/internal/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 +7 -7
- package/dist/internal/filesystem/walk.d.ts +7 -4
- package/dist/internal/filesystem/walk.d.ts.map +1 -1
- package/dist/internal/filesystem/walk.js +35 -12
- 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 +5 -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 +46 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +126 -9
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +209 -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 +18 -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 +175 -126
- 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 +386 -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/skill-catalog.d.ts +28 -0
- package/dist/internal/skill-catalog.d.ts.map +1 -0
- package/dist/internal/skill-catalog.js +44 -0
- package/dist/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-B1c1LeIf.js +67 -0
- package/dist/playground/assets/index-CK2LX3iD.css +1 -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 +76 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -4
- package/docs/README.md +85 -152
- package/docs/building-with-agents.md +96 -86
- package/docs/deployment.md +118 -365
- package/docs/evals.md +147 -674
- package/docs/guides/agent-to-agent.md +126 -92
- package/docs/guides/bitbucket.md +250 -49
- package/docs/guides/cloud-agents.md +124 -67
- package/docs/guides/convert-automation.md +157 -148
- package/docs/guides/github.md +261 -246
- package/docs/guides/gitlab.md +250 -51
- package/docs/guides/grokbot-agents.md +117 -64
- package/docs/guides/improve.md +112 -59
- package/docs/guides/mcp-oauth.md +112 -122
- package/docs/guides/opentelemetry.md +106 -188
- package/docs/guides/slack.md +171 -192
- package/docs/guides/webhooks.md +155 -387
- package/docs/hillclimbing.md +102 -56
- package/docs/quickstart.md +45 -106
- package/docs/reference/channels.md +0 -16
- package/docs/reference/cli.md +2 -16
- package/docs/reference/connections.md +3 -5
- package/docs/reference/evals.md +298 -0
- package/docs/reference/extensions.md +128 -200
- package/docs/reference/hooks.md +34 -36
- 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/templates/thermo-quality-review.md +80 -0
- package/docs/templates/thermo-review.md +79 -0
- package/docs/troubleshooting.md +98 -68
- package/package.json +55 -37
- package/skills/framework-map/SKILL.md +2 -2
- package/skills/github/SKILL.md +21 -13
- package/skills/otel/SKILL.md +8 -18
- package/src/bin/agent-serve.ts +115 -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 +48 -21
- 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 +661 -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 +419 -168
- 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 +366 -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 +81 -14
- 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/skills/handoff.md +3 -7
- package/src/extensions/cursor-cloud-agents/tools/list.ts +1 -1
- package/src/extensions/improve/extension.ts +4 -2
- package/src/extensions/improve/skills/yourself.ts +2 -2
- 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 +182 -81
- package/src/index.ts +7 -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 +172 -29
- 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 +14 -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-agent-template.ts +2 -0
- 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 +8 -8
- package/src/internal/filesystem/walk.ts +61 -16
- 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 +5 -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 +189 -14
- package/src/internal/hosted-delivery.ts +294 -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 +18 -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 +201 -140
- package/src/internal/session-cost.ts +3 -3
- package/src/internal/session-engine.ts +516 -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/skill-catalog.ts +69 -0
- 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 +91 -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/thermo-quality-review/README.md +35 -0
- package/templates/thermo-quality-review/agent/agent.ts +8 -0
- package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
- package/templates/thermo-quality-review/agent/instructions.md +43 -0
- package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
- package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
- package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
- package/templates/thermo-quality-review/package.json +18 -0
- package/templates/thermo-quality-review/tsconfig.json +12 -0
- package/templates/thermo-review/README.md +35 -0
- package/templates/thermo-review/agent/agent.ts +8 -0
- package/templates/thermo-review/agent/channels/github.ts +42 -0
- package/templates/thermo-review/agent/instructions.md +40 -0
- package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
- package/templates/thermo-review/evals/evals.config.ts +5 -0
- package/templates/thermo-review/evals/review.eval.ts +53 -0
- package/templates/thermo-review/package.json +18 -0
- package/templates/thermo-review/tsconfig.json +12 -0
- package/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/building-with-agents.md.D0KbSkJn.js +0 -13
- package/dist/docs/assets/building-with-agents.md.D0KbSkJn.lean.js +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CFVQ4S17.js +0 -1
- 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/deployment.md.JenwuCCB.js +0 -51
- package/dist/docs/assets/deployment.md.JenwuCCB.lean.js +0 -1
- package/dist/docs/assets/evals.md.C7JLjoEP.js +0 -211
- package/dist/docs/assets/evals.md.C7JLjoEP.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_bitbucket.md.DZPzmUjU.js +0 -10
- package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.lean.js +0 -1
- package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.js +0 -9
- package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.lean.js +0 -1
- package/dist/docs/assets/guides_convert-automation.md.B4sjlodG.js +0 -12
- package/dist/docs/assets/guides_convert-automation.md.B4sjlodG.lean.js +0 -1
- package/dist/docs/assets/guides_github.md.TZaTZlfz.js +0 -64
- package/dist/docs/assets/guides_github.md.TZaTZlfz.lean.js +0 -1
- package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.js +0 -14
- package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.lean.js +0 -1
- package/dist/docs/assets/guides_grokbot-agents.md.DyV-WArv.js +0 -9
- package/dist/docs/assets/guides_grokbot-agents.md.DyV-WArv.lean.js +0 -1
- 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/guides_improve.md.BGVk32bK.js +0 -14
- package/dist/docs/assets/guides_improve.md.BGVk32bK.lean.js +0 -1
- package/dist/docs/assets/guides_mcp-oauth.md.Dp6cDP7f.js +0 -28
- package/dist/docs/assets/guides_mcp-oauth.md.Dp6cDP7f.lean.js +0 -1
- package/dist/docs/assets/guides_opentelemetry.md.SCRMskno.js +0 -26
- package/dist/docs/assets/guides_opentelemetry.md.SCRMskno.lean.js +0 -1
- package/dist/docs/assets/guides_slack.md.D4RVMM4G.js +0 -38
- package/dist/docs/assets/guides_slack.md.D4RVMM4G.lean.js +0 -1
- package/dist/docs/assets/guides_webhooks.md.CJK484ex.js +0 -225
- package/dist/docs/assets/guides_webhooks.md.CJK484ex.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_extensions.md.ZAVUyuEX.js +0 -62
- package/dist/docs/assets/reference_extensions.md.ZAVUyuEX.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/assets/troubleshooting.md.CYEAO9bM.js +0 -1
- package/dist/docs/assets/troubleshooting.md.CYEAO9bM.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),
|
|
@@ -974,6 +1037,11 @@ export class SessionEngine {
|
|
|
974
1037
|
// on a sessionless pod.
|
|
975
1038
|
throw new HostedAdmissionLocalSendError();
|
|
976
1039
|
}
|
|
1040
|
+
if (options.clearCloudOverride === true && options.cloud !== undefined) {
|
|
1041
|
+
throw new Error(
|
|
1042
|
+
"send options cloud and clearCloudOverride cannot be combined"
|
|
1043
|
+
);
|
|
1044
|
+
}
|
|
977
1045
|
const identity =
|
|
978
1046
|
channelId === HTTP_CHANNEL_ID
|
|
979
1047
|
? httpContinuationIdentity(this.project.httpChannel)
|
|
@@ -1039,61 +1107,83 @@ export class SessionEngine {
|
|
|
1039
1107
|
// Refresh harness cwd when the caller supplies a newer worktree (e.g. PR
|
|
1040
1108
|
// synchronize). Leave the durable continuation key unchanged.
|
|
1041
1109
|
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
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1110
|
+
const enqueueOnly = sendOptions.hostedEnqueueOnly === true;
|
|
1111
|
+
if (!enqueueOnly) {
|
|
1112
|
+
const refreshWorkspace =
|
|
1113
|
+
sendOptions.workspaceDir !== undefined &&
|
|
1114
|
+
sendOptions.workspaceDir !== existing.workspaceOverride;
|
|
1115
|
+
if (
|
|
1116
|
+
refreshWorkspace ||
|
|
1117
|
+
sendOptions.workspaceFiles !== undefined ||
|
|
1118
|
+
sendOptions.images !== undefined
|
|
1119
|
+
) {
|
|
1120
|
+
record = await this.updateRecord(existing.sessionId, current => ({
|
|
1121
|
+
...current,
|
|
1122
|
+
workspaceOverride: refreshWorkspace
|
|
1123
|
+
? sendOptions.workspaceDir
|
|
1124
|
+
: current.workspaceOverride,
|
|
1125
|
+
pendingWorkspaceFiles: mergePendingWorkspaceFiles(
|
|
1126
|
+
current.pendingWorkspaceFiles,
|
|
1127
|
+
sendOptions.workspaceFiles
|
|
1128
|
+
),
|
|
1129
|
+
pendingImages: mergePendingImages(
|
|
1130
|
+
current.pendingImages,
|
|
1131
|
+
sendOptions.images
|
|
1132
|
+
),
|
|
1133
|
+
}));
|
|
1134
|
+
}
|
|
1135
|
+
// A caller can explicitly return a continuation to the agent's
|
|
1136
|
+
// configured runtime. Omission remains sticky for compatibility:
|
|
1137
|
+
// follow-ups that do not know the original attach keep it.
|
|
1138
|
+
if (
|
|
1139
|
+
sendOptions.clearCloudOverride === true &&
|
|
1140
|
+
record.cloudOverride !== undefined
|
|
1141
|
+
) {
|
|
1142
|
+
record = await this.updateRecord(record.sessionId, current => ({
|
|
1143
|
+
...current,
|
|
1144
|
+
cloudOverride: undefined,
|
|
1145
|
+
}));
|
|
1146
|
+
} else if (
|
|
1147
|
+
sendOptions.cloud !== undefined &&
|
|
1148
|
+
JSON.stringify(sendOptions.cloud) !==
|
|
1149
|
+
JSON.stringify(record.cloudOverride)
|
|
1150
|
+
) {
|
|
1151
|
+
record = await this.updateRecord(record.sessionId, current => ({
|
|
1152
|
+
...current,
|
|
1153
|
+
cloudOverride: sendOptions.cloud,
|
|
1154
|
+
}));
|
|
1155
|
+
}
|
|
1156
|
+
// Refresh wake-derived channel state (GitHub headSha / refs) without
|
|
1157
|
+
// wiping sticky fields. Null patch values are skipped.
|
|
1158
|
+
if (sendOptions.refreshState !== undefined) {
|
|
1159
|
+
record = await this.updateRecord(record.sessionId, current => ({
|
|
1160
|
+
...current,
|
|
1161
|
+
channelState: mergeChannelStateSkipNull(
|
|
1162
|
+
current.channelState,
|
|
1163
|
+
sendOptions.refreshState
|
|
1164
|
+
),
|
|
1165
|
+
}));
|
|
1166
|
+
}
|
|
1089
1167
|
}
|
|
1090
1168
|
const since = (await this.logs.get(record.sessionId)).count;
|
|
1091
1169
|
const coalesced = await this.startTurn(record.sessionId, message, {
|
|
1092
|
-
admission:
|
|
1170
|
+
admission: enqueueOnly
|
|
1171
|
+
? "coalesce"
|
|
1172
|
+
: (sendOptions.admission ?? "preempt"),
|
|
1093
1173
|
...(sendOptions.coalesceSourceTs === undefined
|
|
1094
1174
|
? {}
|
|
1095
1175
|
: { sourceTs: sendOptions.coalesceSourceTs }),
|
|
1176
|
+
...(enqueueOnly ? { hostedEnqueueOnly: true } : {}),
|
|
1096
1177
|
});
|
|
1178
|
+
if (enqueueOnly && !coalesced) {
|
|
1179
|
+
throw new HostedEnqueueNotActiveError(record.sessionId);
|
|
1180
|
+
}
|
|
1181
|
+
if (!enqueueOnly && coalesced && sendOptions.refreshState !== undefined) {
|
|
1182
|
+
await this.repaintOnCoalescedRefresh(
|
|
1183
|
+
record.sessionId,
|
|
1184
|
+
sendOptions.refreshState
|
|
1185
|
+
);
|
|
1186
|
+
}
|
|
1097
1187
|
return this.channelSession(
|
|
1098
1188
|
record.sessionId,
|
|
1099
1189
|
record,
|
|
@@ -1103,6 +1193,10 @@ export class SessionEngine {
|
|
|
1103
1193
|
);
|
|
1104
1194
|
}
|
|
1105
1195
|
|
|
1196
|
+
if (sendOptions.hostedEnqueueOnly === true) {
|
|
1197
|
+
throw new HostedEnqueueNotActiveError(sendOptions.hostedSessionId);
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1106
1200
|
if (sendOptions.hostedSessionId !== undefined) {
|
|
1107
1201
|
const collision = await this.getOrRestoreSession(
|
|
1108
1202
|
sendOptions.hostedSessionId
|
|
@@ -1171,7 +1265,7 @@ export class SessionEngine {
|
|
|
1171
1265
|
const stale = new Error("stale HTTP continuation");
|
|
1172
1266
|
let previous: string | undefined;
|
|
1173
1267
|
try {
|
|
1174
|
-
await this.updateRecord(sessionId,
|
|
1268
|
+
await this.updateRecord(sessionId, record => {
|
|
1175
1269
|
const expectedChannel =
|
|
1176
1270
|
record.httpContinuationKey === undefined
|
|
1177
1271
|
? record.channelId
|
|
@@ -1194,7 +1288,7 @@ export class SessionEngine {
|
|
|
1194
1288
|
await this.startTurn(sessionId, message);
|
|
1195
1289
|
return next;
|
|
1196
1290
|
} catch (error) {
|
|
1197
|
-
await this.updateRecord(sessionId,
|
|
1291
|
+
await this.updateRecord(sessionId, record =>
|
|
1198
1292
|
record.httpContinuationKey === next
|
|
1199
1293
|
? { ...record, httpContinuationKey: previous }
|
|
1200
1294
|
: record
|
|
@@ -1285,6 +1379,53 @@ export class SessionEngine {
|
|
|
1285
1379
|
// Turn execution
|
|
1286
1380
|
// ==========================================================================
|
|
1287
1381
|
|
|
1382
|
+
/**
|
|
1383
|
+
* Repaint on the follow-up wake without retargeting the live turn.
|
|
1384
|
+
* Persist already took the refresh; in-flight writes stay on the carrier ts.
|
|
1385
|
+
*/
|
|
1386
|
+
private async repaintOnCoalescedRefresh(
|
|
1387
|
+
sessionId: string,
|
|
1388
|
+
patch: JsonValue | undefined
|
|
1389
|
+
): Promise<void> {
|
|
1390
|
+
const live = this.liveTurns.get(sessionId);
|
|
1391
|
+
if (live === undefined || patch === undefined) {
|
|
1392
|
+
return;
|
|
1393
|
+
}
|
|
1394
|
+
const repaintState =
|
|
1395
|
+
mergeChannelStateSkipNull(live.channelState, patch) ?? live.channelState;
|
|
1396
|
+
const record = await this.sessions.get(sessionId);
|
|
1397
|
+
if (record === undefined) {
|
|
1398
|
+
return;
|
|
1399
|
+
}
|
|
1400
|
+
const handler = this.channelEventHandlersFor(record.channelId)?.[
|
|
1401
|
+
"message.received"
|
|
1402
|
+
];
|
|
1403
|
+
if (handler === undefined) {
|
|
1404
|
+
return;
|
|
1405
|
+
}
|
|
1406
|
+
await handler(
|
|
1407
|
+
{
|
|
1408
|
+
type: "message.received",
|
|
1409
|
+
data: { text: "" },
|
|
1410
|
+
index: 0,
|
|
1411
|
+
sessionId,
|
|
1412
|
+
at: new Date().toISOString(),
|
|
1413
|
+
},
|
|
1414
|
+
{
|
|
1415
|
+
channelId: record.channelId,
|
|
1416
|
+
state: repaintState,
|
|
1417
|
+
continuationToken: record.continuationKey,
|
|
1418
|
+
setContinuationToken: (token: string | null) =>
|
|
1419
|
+
this.setContinuationToken(sessionId, token),
|
|
1420
|
+
},
|
|
1421
|
+
{
|
|
1422
|
+
session: live.session,
|
|
1423
|
+
host: this.hostForSession(sessionId),
|
|
1424
|
+
artifacts: this.artifactsApi({ sessionId }),
|
|
1425
|
+
}
|
|
1426
|
+
);
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1288
1429
|
/**
|
|
1289
1430
|
* Admit a turn for `sessionId`.
|
|
1290
1431
|
*
|
|
@@ -1306,7 +1447,12 @@ export class SessionEngine {
|
|
|
1306
1447
|
.catch(() => {})
|
|
1307
1448
|
.then(async () => {
|
|
1308
1449
|
// Another server holds the turn: hand the message to it and coalesce.
|
|
1450
|
+
// Enqueue-only must not report coalesced success without a local
|
|
1451
|
+
// enqueue — the outbox drain may never run on this process.
|
|
1309
1452
|
if (await this.turnLeases.runningElsewhere(sessionId)) {
|
|
1453
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1454
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1455
|
+
}
|
|
1310
1456
|
await this.outbox.post(sessionId, { message, options });
|
|
1311
1457
|
return true;
|
|
1312
1458
|
}
|
|
@@ -1323,7 +1469,7 @@ export class SessionEngine {
|
|
|
1323
1469
|
private drainOutbox(sessionId: string): void {
|
|
1324
1470
|
void this.outbox
|
|
1325
1471
|
.takeAll(sessionId)
|
|
1326
|
-
.then(
|
|
1472
|
+
.then(items => {
|
|
1327
1473
|
for (const item of items) {
|
|
1328
1474
|
void this.startTurn(sessionId, item.message, item.options).catch(
|
|
1329
1475
|
() => {}
|
|
@@ -1337,7 +1483,7 @@ export class SessionEngine {
|
|
|
1337
1483
|
const queue = this.coalesceQueues.get(sessionId) ?? [];
|
|
1338
1484
|
if (
|
|
1339
1485
|
item.sourceTs !== undefined &&
|
|
1340
|
-
queue.some(
|
|
1486
|
+
queue.some(entry => entry.sourceTs === item.sourceTs)
|
|
1341
1487
|
) {
|
|
1342
1488
|
return;
|
|
1343
1489
|
}
|
|
@@ -1418,7 +1564,7 @@ export class SessionEngine {
|
|
|
1418
1564
|
}
|
|
1419
1565
|
const parts = [
|
|
1420
1566
|
"<slack_followups>",
|
|
1421
|
-
|
|
1567
|
+
`${items.length} asks arrived while you were busy.`,
|
|
1422
1568
|
"",
|
|
1423
1569
|
];
|
|
1424
1570
|
for (let i = 0; i < items.length; i++) {
|
|
@@ -1512,11 +1658,21 @@ export class SessionEngine {
|
|
|
1512
1658
|
// enqueue: `drainCoalescedFollowups` reads only this process's queue, so
|
|
1513
1659
|
// the shared nudge store is the carrier. Not redundant with `acquire`
|
|
1514
1660
|
// below — this returns before preempt's `clearCoalesced` drops the queue.
|
|
1661
|
+
// Enqueue-only cannot claim coalesced here: nothing joined a local turn.
|
|
1515
1662
|
if (await this.turnLeases.runningElsewhere(sessionId)) {
|
|
1663
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1664
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1665
|
+
}
|
|
1516
1666
|
this.logger(`[session] coalesce; another server owns ${sessionId}`);
|
|
1517
1667
|
return true;
|
|
1518
1668
|
}
|
|
1519
1669
|
|
|
1670
|
+
// Enqueue-only must never start a turn (or preempt/interrupt). Steer and
|
|
1671
|
+
// coalesce above already returned true when they absorbed the message.
|
|
1672
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1673
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1520
1676
|
// Interrupt any turn in flight and wait for it to settle so the SDK run is
|
|
1521
1677
|
// terminal before this turn's send (the follow-up also force-expires as a
|
|
1522
1678
|
// belt-and-suspenders — see buildTurnRequest). Drain-resume skips interrupt:
|
|
@@ -1545,7 +1701,7 @@ export class SessionEngine {
|
|
|
1545
1701
|
|
|
1546
1702
|
let lifecycleInstalled = false;
|
|
1547
1703
|
try {
|
|
1548
|
-
const record = await this.updateRecord(sessionId,
|
|
1704
|
+
const record = await this.updateRecord(sessionId, current => ({
|
|
1549
1705
|
...current,
|
|
1550
1706
|
turnCount: current.turnCount + 1,
|
|
1551
1707
|
}));
|
|
@@ -1591,6 +1747,7 @@ export class SessionEngine {
|
|
|
1591
1747
|
};
|
|
1592
1748
|
} finally {
|
|
1593
1749
|
clearInterval(poll);
|
|
1750
|
+
this.liveTurns.delete(sessionId);
|
|
1594
1751
|
}
|
|
1595
1752
|
this.lastOutcomes.set(sessionId, outcome);
|
|
1596
1753
|
const wasCurrent = this.activeTurns.get(sessionId) === lifecycle;
|
|
@@ -1600,14 +1757,19 @@ export class SessionEngine {
|
|
|
1600
1757
|
if (this.turnAborts.get(sessionId) === abort) {
|
|
1601
1758
|
this.turnAborts.delete(sessionId);
|
|
1602
1759
|
}
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1760
|
+
// Failed/cancelled owners must not start a coalesced successor.
|
|
1761
|
+
// Hosted execute would then 503 and Temporal/FIFO would re-run the
|
|
1762
|
+
// same follow-ups as full deliveries.
|
|
1763
|
+
if (
|
|
1764
|
+
wasCurrent &&
|
|
1765
|
+
!abort.signal.aborted &&
|
|
1766
|
+
outcome.status === "finished"
|
|
1767
|
+
) {
|
|
1768
|
+
const drain = this.drainCoalescedFollowups(sessionId).catch(error => {
|
|
1769
|
+
this.logger(
|
|
1770
|
+
`[session] coalesce drain failed for ${sessionId}: ${describeError(error)}`
|
|
1771
|
+
);
|
|
1772
|
+
});
|
|
1611
1773
|
this.coalesceDrains.set(sessionId, drain);
|
|
1612
1774
|
try {
|
|
1613
1775
|
await drain;
|
|
@@ -1867,7 +2029,7 @@ export class SessionEngine {
|
|
|
1867
2029
|
if (turn === undefined) {
|
|
1868
2030
|
return tools;
|
|
1869
2031
|
}
|
|
1870
|
-
return tools.map(
|
|
2032
|
+
return tools.map(tool => {
|
|
1871
2033
|
const execute = tool.definition.execute;
|
|
1872
2034
|
if (typeof execute !== "function") {
|
|
1873
2035
|
return tool;
|
|
@@ -2044,6 +2206,13 @@ export class SessionEngine {
|
|
|
2044
2206
|
* Best effort — warming is an optimization, and a turn rebuilds on its own.
|
|
2045
2207
|
*/
|
|
2046
2208
|
async prewarmSharedWorkspace(): Promise<void> {
|
|
2209
|
+
if (this.sharedWarm === undefined) {
|
|
2210
|
+
this.sharedWarm = this.warmSharedWorkspace();
|
|
2211
|
+
}
|
|
2212
|
+
await this.sharedWarm;
|
|
2213
|
+
}
|
|
2214
|
+
|
|
2215
|
+
private async warmSharedWorkspace(): Promise<void> {
|
|
2047
2216
|
const agent = this.project.agent;
|
|
2048
2217
|
const workspaceDir = agent.local?.workspaceDir;
|
|
2049
2218
|
if (
|
|
@@ -2056,6 +2225,15 @@ export class SessionEngine {
|
|
|
2056
2225
|
}
|
|
2057
2226
|
const startedAt = Date.now();
|
|
2058
2227
|
try {
|
|
2228
|
+
await mkdir(workspaceDir, { recursive: true });
|
|
2229
|
+
if (await ownSharedHarness(workspaceDir)) {
|
|
2230
|
+
await materializeWorkspace({
|
|
2231
|
+
agent,
|
|
2232
|
+
workspaceDir,
|
|
2233
|
+
seed: true,
|
|
2234
|
+
stateRoot: this.stateRoot,
|
|
2235
|
+
});
|
|
2236
|
+
}
|
|
2059
2237
|
const harness = resolveHostHarnessToolOptions(agent.allowedTools);
|
|
2060
2238
|
const outcome = await this.runner.prewarm({
|
|
2061
2239
|
workspaceDir,
|
|
@@ -2069,7 +2247,10 @@ export class SessionEngine {
|
|
|
2069
2247
|
// warmed without an identity; the per-send flag still has to match
|
|
2070
2248
|
// the turns' requests or the warmed executor is one no turn asks for.
|
|
2071
2249
|
mcpServers: this.buildMcpServers("local"),
|
|
2072
|
-
...(this.hasAttachedAuthedConnections()
|
|
2250
|
+
...(this.hasAttachedAuthedConnections() ||
|
|
2251
|
+
this.project.agent.connections.some(connection =>
|
|
2252
|
+
isCursorAccountTransport(connection.transport)
|
|
2253
|
+
)
|
|
2073
2254
|
? { perSendMcpServers: true }
|
|
2074
2255
|
: {}),
|
|
2075
2256
|
subagents: buildRunnerSubagents(agent),
|
|
@@ -2113,6 +2294,7 @@ export class SessionEngine {
|
|
|
2113
2294
|
channelState: structuredClone(turnChannelState),
|
|
2114
2295
|
session: this.sessionInfo(record),
|
|
2115
2296
|
};
|
|
2297
|
+
this.liveTurns.set(sessionId, eventContext);
|
|
2116
2298
|
// Hold the open log so tool events append synchronously. Fire-and-forget
|
|
2117
2299
|
// `appendEvent` races parallel tool completions and delays the live stream
|
|
2118
2300
|
// until the next await tick — often after *all* parallel tools finish.
|
|
@@ -2130,7 +2312,7 @@ export class SessionEngine {
|
|
|
2130
2312
|
// Read by closure, so the mapper still sees it while draining after the
|
|
2131
2313
|
// registry entry below is gone.
|
|
2132
2314
|
const stubbed = new Set<string>();
|
|
2133
|
-
const mapper = new TurnEventMapper(emit,
|
|
2315
|
+
const mapper = new TurnEventMapper(emit, callId => stubbed.has(callId));
|
|
2134
2316
|
|
|
2135
2317
|
// Take a turn slot before any work happens. When every slot is busy the
|
|
2136
2318
|
// turn waits FIFO — durable `turn.queued` marks the wait — and a
|
|
@@ -2139,7 +2321,7 @@ export class SessionEngine {
|
|
|
2139
2321
|
const permit = await this.turnGovernor.acquire({
|
|
2140
2322
|
sessionId,
|
|
2141
2323
|
signal,
|
|
2142
|
-
onQueued:
|
|
2324
|
+
onQueued: position => {
|
|
2143
2325
|
const maxRunningTurns = this.turnGovernor.maxRunningTurns ?? 0;
|
|
2144
2326
|
emit({ type: "turn.queued", data: { position, maxRunningTurns } });
|
|
2145
2327
|
this.logger(
|
|
@@ -2155,6 +2337,12 @@ export class SessionEngine {
|
|
|
2155
2337
|
} else {
|
|
2156
2338
|
emit({ type: "turn.started", data: {} });
|
|
2157
2339
|
try {
|
|
2340
|
+
if (
|
|
2341
|
+
record.workspaceOverride === undefined &&
|
|
2342
|
+
this.project.agent.local?.workspaceDir !== undefined
|
|
2343
|
+
) {
|
|
2344
|
+
await this.prewarmSharedWorkspace();
|
|
2345
|
+
}
|
|
2158
2346
|
// Scaffold agent files into the session workspace even when the harness
|
|
2159
2347
|
// cwd is overridden (e.g. a PR worktree).
|
|
2160
2348
|
if (!this.hasRootOverride()) {
|
|
@@ -2199,7 +2387,7 @@ export class SessionEngine {
|
|
|
2199
2387
|
(hasPendingFiles && runtime !== "cloud") ||
|
|
2200
2388
|
(pendingImages !== undefined && pendingImages.length > 0)
|
|
2201
2389
|
) {
|
|
2202
|
-
await this.updateRecord(sessionId,
|
|
2390
|
+
await this.updateRecord(sessionId, current => ({
|
|
2203
2391
|
...current,
|
|
2204
2392
|
pendingWorkspaceFiles:
|
|
2205
2393
|
hasPendingFiles &&
|
|
@@ -2213,48 +2401,39 @@ export class SessionEngine {
|
|
|
2213
2401
|
: current.pendingImages,
|
|
2214
2402
|
}));
|
|
2215
2403
|
}
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2404
|
+
const onUpdate: RunnerTurnRequest["onUpdate"] = async update => {
|
|
2405
|
+
const turn = this.turnRoots.get(sessionId);
|
|
2406
|
+
if (turn !== undefined) {
|
|
2407
|
+
update = await applyWebScratchUpdate({
|
|
2408
|
+
cwd: turn.cwd,
|
|
2409
|
+
root: turn.root,
|
|
2410
|
+
update,
|
|
2411
|
+
});
|
|
2412
|
+
}
|
|
2413
|
+
mapper.handleUpdate(update);
|
|
2414
|
+
// Yield so the HTTP NDJSON writer can flush tool start/result
|
|
2415
|
+
// events while sibling parallel tools are still executing.
|
|
2416
|
+
if (
|
|
2417
|
+
update.type === "tool-call-started" ||
|
|
2418
|
+
update.type === "tool-call-completed" ||
|
|
2419
|
+
// Nested subagent progress (newer SDKs); string check keeps
|
|
2420
|
+
// typecheck green against older published `@cursor/sdk` pins.
|
|
2421
|
+
(update as { type: string }).type === "tool-call-delta"
|
|
2422
|
+
) {
|
|
2423
|
+
// Same boundary the carrier hook runs on, so a drain is visible
|
|
2424
|
+
// by the time this fires.
|
|
2425
|
+
await this.emitDeliveredNudges(record, emit);
|
|
2426
|
+
await yieldEventLoop();
|
|
2427
|
+
}
|
|
2428
|
+
};
|
|
2225
2429
|
const request = await this.buildTurnRequest(
|
|
2226
2430
|
record,
|
|
2227
2431
|
turnId,
|
|
2228
2432
|
message,
|
|
2229
2433
|
isFirstTurn,
|
|
2230
|
-
instructionsInvisibleToHarness,
|
|
2231
2434
|
emit,
|
|
2232
2435
|
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
|
-
},
|
|
2436
|
+
onUpdate,
|
|
2258
2437
|
signal,
|
|
2259
2438
|
pendingImages
|
|
2260
2439
|
);
|
|
@@ -2264,6 +2443,20 @@ export class SessionEngine {
|
|
|
2264
2443
|
outcome = await this.runTurnExecute(record, turnId, () =>
|
|
2265
2444
|
this.runner.runTurn(request)
|
|
2266
2445
|
);
|
|
2446
|
+
// Commit before dropping the turn FS so `ctx.reject` can
|
|
2447
|
+
// re-run the model with tools still mounted.
|
|
2448
|
+
outcome = await this.settleAuthoredResult({
|
|
2449
|
+
record,
|
|
2450
|
+
turnId,
|
|
2451
|
+
emit,
|
|
2452
|
+
eventContext,
|
|
2453
|
+
turnChannelState,
|
|
2454
|
+
harnessCwd,
|
|
2455
|
+
signal,
|
|
2456
|
+
onUpdate,
|
|
2457
|
+
mapper,
|
|
2458
|
+
outcome,
|
|
2459
|
+
});
|
|
2267
2460
|
} finally {
|
|
2268
2461
|
this.activeToolContexts.delete(sessionId);
|
|
2269
2462
|
this.stubbedCallIds.delete(sessionId);
|
|
@@ -2293,7 +2486,7 @@ export class SessionEngine {
|
|
|
2293
2486
|
|
|
2294
2487
|
if (mapper.title !== undefined) {
|
|
2295
2488
|
const title = mapper.title;
|
|
2296
|
-
await this.updateRecord(sessionId,
|
|
2489
|
+
await this.updateRecord(sessionId, current => ({ ...current, title }));
|
|
2297
2490
|
eventContext.session = { ...eventContext.session, title };
|
|
2298
2491
|
}
|
|
2299
2492
|
|
|
@@ -2312,32 +2505,6 @@ export class SessionEngine {
|
|
|
2312
2505
|
outcome = { ...outcome, cost: finalCost };
|
|
2313
2506
|
}
|
|
2314
2507
|
|
|
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
2508
|
if (outcome.status === "finished") {
|
|
2342
2509
|
await this.appendEvent(
|
|
2343
2510
|
sessionId,
|
|
@@ -2407,6 +2574,89 @@ export class SessionEngine {
|
|
|
2407
2574
|
};
|
|
2408
2575
|
}
|
|
2409
2576
|
|
|
2577
|
+
/**
|
|
2578
|
+
* Run `defineResult` while the turn FS and tools are still up.
|
|
2579
|
+
* `ctx.reject` re-invokes `runTurn` on this turnId until commit
|
|
2580
|
+
* succeeds, throws, or the repair budget is gone.
|
|
2581
|
+
*/
|
|
2582
|
+
private async settleAuthoredResult(args: {
|
|
2583
|
+
record: SessionRecord;
|
|
2584
|
+
turnId: string;
|
|
2585
|
+
emit: (payload: SessionEventPayload) => void;
|
|
2586
|
+
eventContext: EventDispatchContext;
|
|
2587
|
+
turnChannelState: JsonValue;
|
|
2588
|
+
harnessCwd: string;
|
|
2589
|
+
signal: AbortSignal;
|
|
2590
|
+
onUpdate: RunnerTurnRequest["onUpdate"];
|
|
2591
|
+
mapper: TurnEventMapper;
|
|
2592
|
+
outcome: TurnOutcome;
|
|
2593
|
+
}): Promise<TurnOutcome> {
|
|
2594
|
+
const authored = this.project.result;
|
|
2595
|
+
if (args.outcome.status !== "finished" || authored === undefined) {
|
|
2596
|
+
return args.outcome;
|
|
2597
|
+
}
|
|
2598
|
+
|
|
2599
|
+
let outcome = args.outcome;
|
|
2600
|
+
let usage = outcome.usage;
|
|
2601
|
+
let repairs = 0;
|
|
2602
|
+
|
|
2603
|
+
while (true) {
|
|
2604
|
+
const settled = await applyAuthoredResult({
|
|
2605
|
+
definition: authored,
|
|
2606
|
+
text: outcome.result ?? args.mapper.pendingText,
|
|
2607
|
+
dryRun: args.record.dryRun === true,
|
|
2608
|
+
ctx: {
|
|
2609
|
+
session: args.eventContext.session,
|
|
2610
|
+
channelState: args.turnChannelState,
|
|
2611
|
+
host: this.hostForSession(args.record.sessionId),
|
|
2612
|
+
artifacts: this.artifactsApi({
|
|
2613
|
+
sessionId: args.record.sessionId,
|
|
2614
|
+
turnId: args.turnId,
|
|
2615
|
+
}),
|
|
2616
|
+
stateRoot: this.stateRoot,
|
|
2617
|
+
workspaceDir: args.harnessCwd,
|
|
2618
|
+
},
|
|
2619
|
+
});
|
|
2620
|
+
if (settled.ok) {
|
|
2621
|
+
return { ...outcome, result: settled.text, usage };
|
|
2622
|
+
}
|
|
2623
|
+
if (settled.kind === "error" || repairs >= RESULT_REPAIR_BUDGET) {
|
|
2624
|
+
return {
|
|
2625
|
+
status: "error",
|
|
2626
|
+
result: outcome.result,
|
|
2627
|
+
errorMessage: `turn output failed: ${settled.message}`,
|
|
2628
|
+
usage,
|
|
2629
|
+
};
|
|
2630
|
+
}
|
|
2631
|
+
repairs += 1;
|
|
2632
|
+
// Close the rejected stream without posting it (empty `stop`)
|
|
2633
|
+
// so Slack does not append a repair onto that block, and so an
|
|
2634
|
+
// empty repair cannot recommit `lastAssistantText`.
|
|
2635
|
+
args.mapper.abandonPendingText();
|
|
2636
|
+
this.logger(
|
|
2637
|
+
`[session] ${args.record.sessionId} ${args.turnId} result rejected; repairing (${repairs}/${RESULT_REPAIR_BUDGET})`
|
|
2638
|
+
);
|
|
2639
|
+
const repairRequest = await this.buildTurnRequest(
|
|
2640
|
+
args.record,
|
|
2641
|
+
args.turnId,
|
|
2642
|
+
resultRepairPrompt(settled.message),
|
|
2643
|
+
false,
|
|
2644
|
+
args.emit,
|
|
2645
|
+
args.eventContext,
|
|
2646
|
+
args.onUpdate,
|
|
2647
|
+
args.signal
|
|
2648
|
+
);
|
|
2649
|
+
const repaired = await this.runTurnExecute(args.record, args.turnId, () =>
|
|
2650
|
+
this.runner.runTurn(repairRequest)
|
|
2651
|
+
);
|
|
2652
|
+
usage = addTurnUsage(usage, repaired.usage);
|
|
2653
|
+
if (repaired.status !== "finished") {
|
|
2654
|
+
return { ...repaired, usage };
|
|
2655
|
+
}
|
|
2656
|
+
outcome = { ...repaired, usage };
|
|
2657
|
+
}
|
|
2658
|
+
}
|
|
2659
|
+
|
|
2410
2660
|
/**
|
|
2411
2661
|
* Sync authored skills onto the Agent Store at `skills/<name>/…` (hosted)
|
|
2412
2662
|
* or `agent-serve/<agent>/skills/<name>/…` (personal-key local+cloud)
|
|
@@ -2499,7 +2749,7 @@ export class SessionEngine {
|
|
|
2499
2749
|
sessionId: string,
|
|
2500
2750
|
pending: NonNullable<SessionRecord["pendingWorkspaceFiles"]>
|
|
2501
2751
|
): Promise<void> {
|
|
2502
|
-
await this.updateRecord(sessionId,
|
|
2752
|
+
await this.updateRecord(sessionId, current => ({
|
|
2503
2753
|
...current,
|
|
2504
2754
|
pendingWorkspaceFiles:
|
|
2505
2755
|
current.pendingWorkspaceFiles === pending
|
|
@@ -2532,7 +2782,7 @@ export class SessionEngine {
|
|
|
2532
2782
|
}
|
|
2533
2783
|
let sync = run().then(
|
|
2534
2784
|
() => true,
|
|
2535
|
-
|
|
2785
|
+
error => {
|
|
2536
2786
|
this.logger(
|
|
2537
2787
|
`[${surface}] ${store.label} sync failed: ${error instanceof Error ? error.message : String(error)}`
|
|
2538
2788
|
);
|
|
@@ -2551,11 +2801,17 @@ export class SessionEngine {
|
|
|
2551
2801
|
/**
|
|
2552
2802
|
* Hosted deployments own the deployment store. Local `serve`/`run` with
|
|
2553
2803
|
* a personal API key writes into the USER store under `agent-serve/`.
|
|
2804
|
+
* A persistent deployment's version container has no cloud store at all:
|
|
2805
|
+
* its state directory is the durable copy, and its service-account key
|
|
2806
|
+
* must not be mistaken for a personal one.
|
|
2554
2807
|
*/
|
|
2555
2808
|
private cloudStore(): CloudStoreTarget | undefined {
|
|
2556
2809
|
const v2Hosting = resolveAgentV2Hosting({
|
|
2557
2810
|
architecture: this.project.agent.architecture,
|
|
2558
2811
|
});
|
|
2812
|
+
if (v2Hosting.kind === "cursor-managed-persistent") {
|
|
2813
|
+
return undefined;
|
|
2814
|
+
}
|
|
2559
2815
|
const deployment = {
|
|
2560
2816
|
mountPath: DEPLOYMENT_STORE_MOUNT_PATH,
|
|
2561
2817
|
skillsPrefix: agentStoreKeys.skillsPrefix(),
|
|
@@ -2600,7 +2856,6 @@ export class SessionEngine {
|
|
|
2600
2856
|
turnId: string,
|
|
2601
2857
|
prompt: string,
|
|
2602
2858
|
isFirstTurn: boolean,
|
|
2603
|
-
instructionsInvisibleToHarness: boolean,
|
|
2604
2859
|
emit: (payload: SessionEventPayload) => void,
|
|
2605
2860
|
eventContext: EventDispatchContext,
|
|
2606
2861
|
onUpdate: RunnerTurnRequest["onUpdate"],
|
|
@@ -2642,7 +2897,7 @@ export class SessionEngine {
|
|
|
2642
2897
|
// agents already fail discovery; this guards hybrid agents' per-send
|
|
2643
2898
|
// cloud sessions.
|
|
2644
2899
|
const perSessionConnection = agent.connections.find(
|
|
2645
|
-
|
|
2900
|
+
connection =>
|
|
2646
2901
|
connection.advertiseTools === true || connection.auth !== undefined
|
|
2647
2902
|
);
|
|
2648
2903
|
if (runtime !== "local" && perSessionConnection !== undefined) {
|
|
@@ -2696,7 +2951,7 @@ export class SessionEngine {
|
|
|
2696
2951
|
: this.withTurnScratchTools(
|
|
2697
2952
|
authoredRoot
|
|
2698
2953
|
? fileTools
|
|
2699
|
-
: fileTools.filter(
|
|
2954
|
+
: fileTools.filter(tool => tool.name !== "SemanticSearch"),
|
|
2700
2955
|
record.sessionId
|
|
2701
2956
|
);
|
|
2702
2957
|
let turnPrompt = prompt;
|
|
@@ -2772,6 +3027,9 @@ export class SessionEngine {
|
|
|
2772
3027
|
}
|
|
2773
3028
|
}
|
|
2774
3029
|
} else if (pending !== undefined && Object.keys(pending).length > 0) {
|
|
3030
|
+
this.logger(
|
|
3031
|
+
`[workspace] no cloud store on this hosting; dropping workspaceFiles for session ${record.sessionId}: ${Object.keys(pending).join(", ")}`
|
|
3032
|
+
);
|
|
2775
3033
|
await this.clearPendingWorkspaceFiles(record.sessionId, pending);
|
|
2776
3034
|
}
|
|
2777
3035
|
if (isFirstTurn && hosted) {
|
|
@@ -2779,36 +3037,26 @@ export class SessionEngine {
|
|
|
2779
3037
|
}
|
|
2780
3038
|
if (preamble !== "" || sections.length > 0) {
|
|
2781
3039
|
turnPrompt = [preamble, ...sections, turnPrompt]
|
|
2782
|
-
.filter(
|
|
3040
|
+
.filter(part => part !== "")
|
|
2783
3041
|
.join("\n\n");
|
|
2784
3042
|
}
|
|
2785
3043
|
} 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}`;
|
|
3044
|
+
// The harness reports no path for a root it never mounted.
|
|
3045
|
+
turnPrompt = `<user_info>\nWorkspace Path: /\n</user_info>\n\n${turnPrompt}`;
|
|
2811
3046
|
}
|
|
3047
|
+
// A virtual root has no scaffold dir either, so its catalog carries the
|
|
3048
|
+
// synthesized file tools and embedded script bodies.
|
|
3049
|
+
const localInstructions =
|
|
3050
|
+
runtime === "local"
|
|
3051
|
+
? authoredRoot
|
|
3052
|
+
? buildAgentsMdContent(
|
|
3053
|
+
{ ...agent, tools: [...agent.tools, ...synthesized] },
|
|
3054
|
+
{ includeScripts: true }
|
|
3055
|
+
)
|
|
3056
|
+
: buildAgentsMdContent(agent, {
|
|
3057
|
+
includeScripts: this.hasBorrowedWorkspace(record),
|
|
3058
|
+
})
|
|
3059
|
+
: undefined;
|
|
2812
3060
|
return {
|
|
2813
3061
|
sessionId: record.sessionId,
|
|
2814
3062
|
...(record.sdkAgentId === undefined
|
|
@@ -2834,15 +3082,18 @@ export class SessionEngine {
|
|
|
2834
3082
|
runtime,
|
|
2835
3083
|
agentName: agent.name,
|
|
2836
3084
|
...(mergedCloud === undefined ? {} : { cloud: mergedCloud }),
|
|
2837
|
-
//
|
|
2838
|
-
// turns carry
|
|
2839
|
-
//
|
|
2840
|
-
// the
|
|
2841
|
-
//
|
|
3085
|
+
// Local turns send the composed instructions as the harness system
|
|
3086
|
+
// prompt; grokbot turns carry them into the hosted session, which
|
|
3087
|
+
// surfaces them in the Sand system prompt. Cloud turns inline them into
|
|
3088
|
+
// the first prompt above instead. Script bodies are embedded whenever
|
|
3089
|
+
// the harness cannot reach the scaffold dir: always for grokbot (the
|
|
3090
|
+
// box never sees the session workspace) and for a borrowed local cwd
|
|
3091
|
+
// (PR worktree, shared checkout); otherwise the catalog references the
|
|
3092
|
+
// on-disk paths under the harness cwd.
|
|
2842
3093
|
instructions:
|
|
2843
3094
|
runtime === "grokbot"
|
|
2844
3095
|
? buildAgentsMdContent(agent, { includeScripts: true })
|
|
2845
|
-
:
|
|
3096
|
+
: localInstructions,
|
|
2846
3097
|
...(runtime === "cloud" && !isCursorHostedFilesAvailable()
|
|
2847
3098
|
? { agentServeAgent: this.project.name }
|
|
2848
3099
|
: {}),
|
|
@@ -2855,7 +3106,11 @@ export class SessionEngine {
|
|
|
2855
3106
|
record.sessionId,
|
|
2856
3107
|
await this.evaluateConnectionAuth(record)
|
|
2857
3108
|
),
|
|
2858
|
-
...(runtime === "local" &&
|
|
3109
|
+
...(runtime === "local" &&
|
|
3110
|
+
(this.hasAttachedAuthedConnections() ||
|
|
3111
|
+
this.project.agent.connections.some(connection =>
|
|
3112
|
+
isCursorAccountTransport(connection.transport)
|
|
3113
|
+
))
|
|
2859
3114
|
? { perSendMcpServers: true }
|
|
2860
3115
|
: {}),
|
|
2861
3116
|
subagents: buildRunnerSubagents(agent),
|
|
@@ -2864,14 +3119,14 @@ export class SessionEngine {
|
|
|
2864
3119
|
// Local follow-ups expire any lingering active run so a preempted turn
|
|
2865
3120
|
// (or one orphaned by a crashed process) never blocks this send.
|
|
2866
3121
|
forceExpireActiveRun: runtime === "local" && !isFirstTurn,
|
|
2867
|
-
onRequestId:
|
|
3122
|
+
onRequestId: requestId => {
|
|
2868
3123
|
emit({ type: "turn.bound", data: { requestId } });
|
|
2869
3124
|
},
|
|
2870
|
-
onSdkAgentId: async
|
|
3125
|
+
onSdkAgentId: async sdkAgentId => {
|
|
2871
3126
|
if (record.sdkAgentId === sdkAgentId) {
|
|
2872
3127
|
return;
|
|
2873
3128
|
}
|
|
2874
|
-
await this.updateRecord(record.sessionId,
|
|
3129
|
+
await this.updateRecord(record.sessionId, current => ({
|
|
2875
3130
|
...current,
|
|
2876
3131
|
sdkAgentId,
|
|
2877
3132
|
}));
|
|
@@ -2973,12 +3228,12 @@ export class SessionEngine {
|
|
|
2973
3228
|
// attached MCP server (each tool appears exactly once).
|
|
2974
3229
|
const advertisedNames = new Set(
|
|
2975
3230
|
this.project.agent.connections
|
|
2976
|
-
.filter(
|
|
2977
|
-
.map(
|
|
3231
|
+
.filter(connection => connection.advertiseTools === true)
|
|
3232
|
+
.map(connection => connection.name)
|
|
2978
3233
|
);
|
|
2979
3234
|
const hostConnectionNames = new Set(
|
|
2980
3235
|
(this.project.agent.hostConnections ?? []).map(
|
|
2981
|
-
|
|
3236
|
+
connection => connection.name
|
|
2982
3237
|
)
|
|
2983
3238
|
);
|
|
2984
3239
|
const bridgedNames = new Set(
|
|
@@ -2992,7 +3247,7 @@ export class SessionEngine {
|
|
|
2992
3247
|
assertCloudCanHonorAccountServersFilters({
|
|
2993
3248
|
runtime,
|
|
2994
3249
|
resolvedConnections: this.resolvedConnections.filter(
|
|
2995
|
-
|
|
3250
|
+
resolved =>
|
|
2996
3251
|
!advertisedNames.has(resolved.name) &&
|
|
2997
3252
|
!hostConnectionNames.has(resolved.name)
|
|
2998
3253
|
),
|
|
@@ -3065,6 +3320,20 @@ export class SessionEngine {
|
|
|
3065
3320
|
}
|
|
3066
3321
|
continue;
|
|
3067
3322
|
}
|
|
3323
|
+
const authored = this.authoredConnection(resolved.name);
|
|
3324
|
+
if (
|
|
3325
|
+
sessionId !== undefined &&
|
|
3326
|
+
authored !== undefined &&
|
|
3327
|
+
isCursorAccountTransport(authored.transport)
|
|
3328
|
+
) {
|
|
3329
|
+
const bound = new URL(url);
|
|
3330
|
+
bound.searchParams.set("agentkitSessionId", sessionId);
|
|
3331
|
+
servers[resolved.name] = {
|
|
3332
|
+
url: bound.toString(),
|
|
3333
|
+
headers: resolved.headers,
|
|
3334
|
+
};
|
|
3335
|
+
continue;
|
|
3336
|
+
}
|
|
3068
3337
|
servers[resolved.name] = {
|
|
3069
3338
|
url,
|
|
3070
3339
|
headers: resolved.headers,
|
|
@@ -3074,7 +3343,7 @@ export class SessionEngine {
|
|
|
3074
3343
|
runtime === "cloud" &&
|
|
3075
3344
|
sessionId !== undefined &&
|
|
3076
3345
|
this.cloudServerToolsConnection !== undefined &&
|
|
3077
|
-
this.project.agent.tools.some(
|
|
3346
|
+
this.project.agent.tools.some(tool => tool.execution === "server")
|
|
3078
3347
|
) {
|
|
3079
3348
|
if (servers[SERVER_TOOLS_MCP_SERVER_NAME] !== undefined) {
|
|
3080
3349
|
throw new Error(
|
|
@@ -3102,7 +3371,7 @@ export class SessionEngine {
|
|
|
3102
3371
|
*/
|
|
3103
3372
|
private hasAttachedAuthedConnections(): boolean {
|
|
3104
3373
|
return this.project.agent.connections.some(
|
|
3105
|
-
|
|
3374
|
+
connection =>
|
|
3106
3375
|
connection.auth !== undefined && connection.advertiseTools !== true
|
|
3107
3376
|
);
|
|
3108
3377
|
}
|
|
@@ -3118,7 +3387,7 @@ export class SessionEngine {
|
|
|
3118
3387
|
record: SessionRecord
|
|
3119
3388
|
): Promise<ReadonlyMap<string, Record<string, string>> | undefined> {
|
|
3120
3389
|
const authed = this.project.agent.connections.filter(
|
|
3121
|
-
|
|
3390
|
+
connection =>
|
|
3122
3391
|
connection.auth !== undefined && connection.advertiseTools !== true
|
|
3123
3392
|
);
|
|
3124
3393
|
if (authed.length === 0) {
|
|
@@ -3234,7 +3503,7 @@ export class SessionEngine {
|
|
|
3234
3503
|
);
|
|
3235
3504
|
}
|
|
3236
3505
|
const tool = this.project.agent.tools.find(
|
|
3237
|
-
|
|
3506
|
+
candidate =>
|
|
3238
3507
|
candidate.name === toolName && candidate.execution === "server"
|
|
3239
3508
|
);
|
|
3240
3509
|
if (tool === undefined) {
|
|
@@ -3481,11 +3750,11 @@ export class SessionEngine {
|
|
|
3481
3750
|
args.sessionId,
|
|
3482
3751
|
pendingRecord
|
|
3483
3752
|
);
|
|
3484
|
-
await this.updateRecord(args.sessionId,
|
|
3753
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3485
3754
|
...current,
|
|
3486
3755
|
pendingApprovals: [
|
|
3487
3756
|
...(current.pendingApprovals ?? []).filter(
|
|
3488
|
-
|
|
3757
|
+
item => item.callId !== args.callId
|
|
3489
3758
|
),
|
|
3490
3759
|
pendingRecord,
|
|
3491
3760
|
],
|
|
@@ -3502,10 +3771,10 @@ export class SessionEngine {
|
|
|
3502
3771
|
`[session] tool ${args.toolName} awaiting approval (${args.callId})`
|
|
3503
3772
|
);
|
|
3504
3773
|
const { decision, by } = await resolutionPromise;
|
|
3505
|
-
await this.updateRecord(args.sessionId,
|
|
3774
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3506
3775
|
...current,
|
|
3507
3776
|
pendingApprovals: (current.pendingApprovals ?? []).filter(
|
|
3508
|
-
|
|
3777
|
+
item => item.callId !== args.callId
|
|
3509
3778
|
),
|
|
3510
3779
|
}));
|
|
3511
3780
|
args.emit({
|
|
@@ -3532,7 +3801,7 @@ export class SessionEngine {
|
|
|
3532
3801
|
) {
|
|
3533
3802
|
return;
|
|
3534
3803
|
}
|
|
3535
|
-
await this.updateRecord(sessionId,
|
|
3804
|
+
await this.updateRecord(sessionId, record => ({
|
|
3536
3805
|
...record,
|
|
3537
3806
|
pendingApprovals: [],
|
|
3538
3807
|
}));
|
|
@@ -3575,8 +3844,8 @@ export class SessionEngine {
|
|
|
3575
3844
|
throw new SessionAuthError(sessionId);
|
|
3576
3845
|
}
|
|
3577
3846
|
const pending =
|
|
3578
|
-
(record.pendingApprovals ?? []).find(
|
|
3579
|
-
this.approvals.list(sessionId).find(
|
|
3847
|
+
(record.pendingApprovals ?? []).find(item => item.callId === callId) ??
|
|
3848
|
+
this.approvals.list(sessionId).find(item => item.callId === callId);
|
|
3580
3849
|
if (pending === undefined) {
|
|
3581
3850
|
throw new ApprovalNotFoundError(sessionId, callId);
|
|
3582
3851
|
}
|
|
@@ -3592,10 +3861,10 @@ export class SessionEngine {
|
|
|
3592
3861
|
sessionId: string,
|
|
3593
3862
|
callId: string
|
|
3594
3863
|
): Promise<void> {
|
|
3595
|
-
await this.updateRecord(sessionId,
|
|
3864
|
+
await this.updateRecord(sessionId, current => ({
|
|
3596
3865
|
...current,
|
|
3597
3866
|
pendingApprovals: (current.pendingApprovals ?? []).filter(
|
|
3598
|
-
|
|
3867
|
+
item => item.callId !== callId
|
|
3599
3868
|
),
|
|
3600
3869
|
}));
|
|
3601
3870
|
}
|
|
@@ -3603,7 +3872,7 @@ export class SessionEngine {
|
|
|
3603
3872
|
private wrapMcp(inner: McpHost): HostMcpRegistry {
|
|
3604
3873
|
return {
|
|
3605
3874
|
names: () => inner.names(),
|
|
3606
|
-
listTools:
|
|
3875
|
+
listTools: name => this.withMcpAuth(name, () => inner.listTools(name)),
|
|
3607
3876
|
callTool: (name, tool, args) =>
|
|
3608
3877
|
this.withMcpAuth(name, () => inner.callTool(name, tool, args)),
|
|
3609
3878
|
};
|
|
@@ -3611,11 +3880,11 @@ export class SessionEngine {
|
|
|
3611
3880
|
|
|
3612
3881
|
private advertiseMcp(): AdvertiseHostMcp {
|
|
3613
3882
|
return {
|
|
3614
|
-
listTools:
|
|
3883
|
+
listTools: name =>
|
|
3615
3884
|
this.withMcpListAuth(name, () => this.mcpHost.listTools(name)),
|
|
3616
3885
|
callTool: (name, tool, args) =>
|
|
3617
3886
|
this.withMcpAuth(name, () => this.mcpHost.callTool(name, tool, args)),
|
|
3618
|
-
oneOff:
|
|
3887
|
+
oneOff: connection => {
|
|
3619
3888
|
const inner = this.mcpHost.oneOff(connection);
|
|
3620
3889
|
return {
|
|
3621
3890
|
listTools: () =>
|
|
@@ -3768,11 +4037,11 @@ export class SessionEngine {
|
|
|
3768
4037
|
requestedAt,
|
|
3769
4038
|
};
|
|
3770
4039
|
const resolutionPromise = this.auths.wait(args.sessionId, pendingRecord);
|
|
3771
|
-
await this.updateRecord(args.sessionId,
|
|
4040
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3772
4041
|
...current,
|
|
3773
4042
|
pendingAuths: [
|
|
3774
4043
|
...(current.pendingAuths ?? []).filter(
|
|
3775
|
-
|
|
4044
|
+
item => item.callId !== args.callId
|
|
3776
4045
|
),
|
|
3777
4046
|
pendingRecord,
|
|
3778
4047
|
],
|
|
@@ -3790,10 +4059,10 @@ export class SessionEngine {
|
|
|
3790
4059
|
`[session] tool ${args.toolName} awaiting MCP auth ${args.connection} (${args.callId})`
|
|
3791
4060
|
);
|
|
3792
4061
|
const { decision, by } = await resolutionPromise;
|
|
3793
|
-
await this.updateRecord(args.sessionId,
|
|
4062
|
+
await this.updateRecord(args.sessionId, current => ({
|
|
3794
4063
|
...current,
|
|
3795
4064
|
pendingAuths: (current.pendingAuths ?? []).filter(
|
|
3796
|
-
|
|
4065
|
+
item => item.callId !== args.callId
|
|
3797
4066
|
),
|
|
3798
4067
|
}));
|
|
3799
4068
|
args.emit({
|
|
@@ -3822,7 +4091,7 @@ export class SessionEngine {
|
|
|
3822
4091
|
) {
|
|
3823
4092
|
return;
|
|
3824
4093
|
}
|
|
3825
|
-
await this.updateRecord(sessionId,
|
|
4094
|
+
await this.updateRecord(sessionId, record => ({
|
|
3826
4095
|
...record,
|
|
3827
4096
|
pendingAuths: [],
|
|
3828
4097
|
}));
|
|
@@ -3856,8 +4125,8 @@ export class SessionEngine {
|
|
|
3856
4125
|
throw new SessionAuthError(sessionId);
|
|
3857
4126
|
}
|
|
3858
4127
|
const pending =
|
|
3859
|
-
(record.pendingAuths ?? []).find(
|
|
3860
|
-
this.auths.list(sessionId).find(
|
|
4128
|
+
(record.pendingAuths ?? []).find(item => item.callId === callId) ??
|
|
4129
|
+
this.auths.list(sessionId).find(item => item.callId === callId);
|
|
3861
4130
|
if (pending === undefined) {
|
|
3862
4131
|
throw new AuthNotFoundError(sessionId, callId);
|
|
3863
4132
|
}
|
|
@@ -3876,10 +4145,10 @@ export class SessionEngine {
|
|
|
3876
4145
|
sessionId: string,
|
|
3877
4146
|
callId: string
|
|
3878
4147
|
): Promise<void> {
|
|
3879
|
-
await this.updateRecord(sessionId,
|
|
4148
|
+
await this.updateRecord(sessionId, current => ({
|
|
3880
4149
|
...current,
|
|
3881
4150
|
pendingAuths: (current.pendingAuths ?? []).filter(
|
|
3882
|
-
|
|
4151
|
+
item => item.callId !== callId
|
|
3883
4152
|
),
|
|
3884
4153
|
}));
|
|
3885
4154
|
}
|
|
@@ -4087,17 +4356,17 @@ export class SessionEngine {
|
|
|
4087
4356
|
}
|
|
4088
4357
|
> {
|
|
4089
4358
|
const authored = this.project.agent.tools.find(
|
|
4090
|
-
|
|
4359
|
+
tool => tool.name === toolName
|
|
4091
4360
|
);
|
|
4092
4361
|
if (authored !== undefined) {
|
|
4093
4362
|
return { tool: authored };
|
|
4094
4363
|
}
|
|
4095
4364
|
const catalog = await this.listCatalogTools(options);
|
|
4096
|
-
const tool = catalog.tools.find(
|
|
4365
|
+
const tool = catalog.tools.find(entry => entry.name === toolName);
|
|
4097
4366
|
if (tool === undefined) {
|
|
4098
4367
|
return {
|
|
4099
4368
|
tool: undefined,
|
|
4100
|
-
availableTools: catalog.tools.map(
|
|
4369
|
+
availableTools: catalog.tools.map(entry => entry.name),
|
|
4101
4370
|
connectionErrors: catalog.connectionErrors,
|
|
4102
4371
|
};
|
|
4103
4372
|
}
|
|
@@ -4139,10 +4408,10 @@ export class SessionEngine {
|
|
|
4139
4408
|
if (native !== undefined) {
|
|
4140
4409
|
return native;
|
|
4141
4410
|
}
|
|
4142
|
-
let tool = this.project.agent.tools.find(
|
|
4411
|
+
let tool = this.project.agent.tools.find(t => t.name === toolName);
|
|
4143
4412
|
if (
|
|
4144
4413
|
tool === undefined &&
|
|
4145
|
-
this.project.agent.connections.some(
|
|
4414
|
+
this.project.agent.connections.some(c => c.advertiseTools === true)
|
|
4146
4415
|
) {
|
|
4147
4416
|
// Advertised passthroughs are ordinary server tools in the session's
|
|
4148
4417
|
// namespace; resolve the live listing so direct calls address them by
|
|
@@ -4153,14 +4422,14 @@ export class SessionEngine {
|
|
|
4153
4422
|
session,
|
|
4154
4423
|
hostMcp: this.advertiseMcp(),
|
|
4155
4424
|
});
|
|
4156
|
-
tool = advertised.find(
|
|
4425
|
+
tool = advertised.find(t => t.name === toolName);
|
|
4157
4426
|
}
|
|
4158
4427
|
if (tool === undefined) {
|
|
4159
4428
|
throw new UnknownToolError(
|
|
4160
4429
|
toolName,
|
|
4161
4430
|
this.project.agent.tools
|
|
4162
|
-
.filter(
|
|
4163
|
-
.map(
|
|
4431
|
+
.filter(t => t.execution === "server")
|
|
4432
|
+
.map(t => t.name)
|
|
4164
4433
|
);
|
|
4165
4434
|
}
|
|
4166
4435
|
const execute = tool.definition.execute;
|
|
@@ -4531,7 +4800,7 @@ export class SessionEngine {
|
|
|
4531
4800
|
): Promise<HostMcpToolInfo | undefined> {
|
|
4532
4801
|
try {
|
|
4533
4802
|
const listed = await this.host.mcp.listTools(connectionName);
|
|
4534
|
-
return listed.find(
|
|
4803
|
+
return listed.find(tool => tool.name === toolName);
|
|
4535
4804
|
} catch {
|
|
4536
4805
|
return undefined;
|
|
4537
4806
|
}
|
|
@@ -4563,7 +4832,7 @@ export class SessionEngine {
|
|
|
4563
4832
|
const chain = this.dispatchChains.get(sessionId) ?? Promise.resolve();
|
|
4564
4833
|
const next = chain
|
|
4565
4834
|
.then(() => this.dispatchEvent(sessionId, event, context))
|
|
4566
|
-
.catch(
|
|
4835
|
+
.catch(error => {
|
|
4567
4836
|
this.logger(
|
|
4568
4837
|
`[agent-sdk] event dispatch failed for ${sessionId}: ${describeError(error)}`
|
|
4569
4838
|
);
|
|
@@ -4630,11 +4899,11 @@ export class SessionEngine {
|
|
|
4630
4899
|
}
|
|
4631
4900
|
if (context === undefined || channelStateBefore === undefined) {
|
|
4632
4901
|
// Handlers mutate live channel state in place; save the current record.
|
|
4633
|
-
await this.updateRecord(sessionId,
|
|
4902
|
+
await this.updateRecord(sessionId, current => ({ ...current }));
|
|
4634
4903
|
} else {
|
|
4635
4904
|
const updatedState = channelCtx.state as JsonValue;
|
|
4636
4905
|
context.channelState = updatedState;
|
|
4637
|
-
await this.updateRecord(sessionId,
|
|
4906
|
+
await this.updateRecord(sessionId, current => ({
|
|
4638
4907
|
...current,
|
|
4639
4908
|
channelState: mergeChannelStateMutation({
|
|
4640
4909
|
current: current.channelState,
|
|
@@ -4718,8 +4987,10 @@ export class SessionEngine {
|
|
|
4718
4987
|
async waitForCompletion(sessionId: string): Promise<TurnOutcome> {
|
|
4719
4988
|
// Drain admission first so pendingTurns → activeTurns is visible before we
|
|
4720
4989
|
// decide the session is idle (reminders use this for queueBehindTurn).
|
|
4721
|
-
//
|
|
4722
|
-
// follow-up
|
|
4990
|
+
// Wait for coalesce drain and any successor turn so hosted execute does
|
|
4991
|
+
// not park mid-follow-up, but report the root turn's outcome: a drained
|
|
4992
|
+
// successor failure must not un-ACK an already-finished owner.
|
|
4993
|
+
let root: TurnOutcome | undefined;
|
|
4723
4994
|
for (;;) {
|
|
4724
4995
|
const chain = this.admissionChains.get(sessionId);
|
|
4725
4996
|
if (chain !== undefined) {
|
|
@@ -4727,14 +4998,15 @@ export class SessionEngine {
|
|
|
4727
4998
|
}
|
|
4728
4999
|
const active = this.activeTurns.get(sessionId);
|
|
4729
5000
|
if (active !== undefined) {
|
|
4730
|
-
await active;
|
|
5001
|
+
const outcome = await active;
|
|
5002
|
+
root ??= outcome;
|
|
4731
5003
|
continue;
|
|
4732
5004
|
}
|
|
4733
5005
|
const dispatch = this.dispatchChains.get(sessionId);
|
|
4734
5006
|
if (dispatch !== undefined) {
|
|
4735
5007
|
await dispatch.catch(() => {});
|
|
4736
5008
|
}
|
|
4737
|
-
return this.lastOutcomes.get(sessionId) ?? { status: "finished" };
|
|
5009
|
+
return root ?? this.lastOutcomes.get(sessionId) ?? { status: "finished" };
|
|
4738
5010
|
}
|
|
4739
5011
|
}
|
|
4740
5012
|
|
|
@@ -4773,7 +5045,7 @@ export class SessionEngine {
|
|
|
4773
5045
|
}
|
|
4774
5046
|
const owned = await this.ownedSessionIds(caller);
|
|
4775
5047
|
return records.filter(
|
|
4776
|
-
|
|
5048
|
+
record => record.sessionId !== undefined && owned.has(record.sessionId)
|
|
4777
5049
|
);
|
|
4778
5050
|
}
|
|
4779
5051
|
|
|
@@ -4810,8 +5082,8 @@ export class SessionEngine {
|
|
|
4810
5082
|
const sessions = await this.sessions.list();
|
|
4811
5083
|
return new Set(
|
|
4812
5084
|
sessions
|
|
4813
|
-
.filter(
|
|
4814
|
-
.map(
|
|
5085
|
+
.filter(record => samePrincipal(record.auth, caller))
|
|
5086
|
+
.map(record => record.sessionId)
|
|
4815
5087
|
);
|
|
4816
5088
|
}
|
|
4817
5089
|
|
|
@@ -4955,8 +5227,8 @@ export class SessionEngine {
|
|
|
4955
5227
|
includeAll: boolean
|
|
4956
5228
|
): SessionSummary[] {
|
|
4957
5229
|
return records
|
|
4958
|
-
.filter(
|
|
4959
|
-
.map(
|
|
5230
|
+
.filter(record => includeAll || samePrincipal(record.auth, caller))
|
|
5231
|
+
.map(record => {
|
|
4960
5232
|
const links = sessionExternalLinks(record);
|
|
4961
5233
|
return {
|
|
4962
5234
|
sessionId: record.sessionId,
|
|
@@ -5015,7 +5287,7 @@ export class SessionEngine {
|
|
|
5015
5287
|
if (existing === undefined) {
|
|
5016
5288
|
throw new Error(`Unknown session: ${sessionId}`);
|
|
5017
5289
|
}
|
|
5018
|
-
const record = await this.updateRecord(sessionId,
|
|
5290
|
+
const record = await this.updateRecord(sessionId, current => ({
|
|
5019
5291
|
...current,
|
|
5020
5292
|
turnCount: current.turnCount + 1,
|
|
5021
5293
|
}));
|
|
@@ -5150,7 +5422,7 @@ export class SessionEngine {
|
|
|
5150
5422
|
return pending;
|
|
5151
5423
|
}
|
|
5152
5424
|
const work = this.runCloudTurnCostBackfill(sessionId)
|
|
5153
|
-
.catch(
|
|
5425
|
+
.catch(error => {
|
|
5154
5426
|
this.logger(
|
|
5155
5427
|
`[agent-sdk] cloud cost backfill failed for ${sessionId}: ${describeError(error)}`
|
|
5156
5428
|
);
|
|
@@ -5165,10 +5437,10 @@ export class SessionEngine {
|
|
|
5165
5437
|
private async runCloudTurnCostBackfill(sessionId: string): Promise<void> {
|
|
5166
5438
|
const log = await this.logs.get(sessionId);
|
|
5167
5439
|
const events = await log.snapshot(0);
|
|
5168
|
-
if (!events.some(
|
|
5440
|
+
if (!events.some(event => isUnpricedCompletedTurn(event))) {
|
|
5169
5441
|
if (
|
|
5170
5442
|
!this.isTurnRunning(sessionId) &&
|
|
5171
|
-
events.some(
|
|
5443
|
+
events.some(event => event.type === "turn.completed")
|
|
5172
5444
|
) {
|
|
5173
5445
|
this.cloudCostBackfillDone.add(sessionId);
|
|
5174
5446
|
}
|
|
@@ -5199,7 +5471,7 @@ export class SessionEngine {
|
|
|
5199
5471
|
log.replace(i, next);
|
|
5200
5472
|
}
|
|
5201
5473
|
if (
|
|
5202
|
-
!(await log.snapshot(0)).some(
|
|
5474
|
+
!(await log.snapshot(0)).some(event => isUnpricedCompletedTurn(event))
|
|
5203
5475
|
) {
|
|
5204
5476
|
this.cloudCostBackfillDone.add(sessionId);
|
|
5205
5477
|
}
|
|
@@ -5210,7 +5482,7 @@ export class SessionEngine {
|
|
|
5210
5482
|
token: string | null
|
|
5211
5483
|
): Promise<void> {
|
|
5212
5484
|
const previous = await this.sessions.get(sessionId);
|
|
5213
|
-
await this.updateRecord(sessionId,
|
|
5485
|
+
await this.updateRecord(sessionId, current => ({
|
|
5214
5486
|
...current,
|
|
5215
5487
|
continuationKey: token,
|
|
5216
5488
|
}));
|
|
@@ -5387,7 +5659,7 @@ export class SessionEngine {
|
|
|
5387
5659
|
// the lazy continuation-lookup path.
|
|
5388
5660
|
const cutoff = Date.now() - policy.maxAgeMs;
|
|
5389
5661
|
const candidates = loaded
|
|
5390
|
-
.map(
|
|
5662
|
+
.map(record => ({
|
|
5391
5663
|
record,
|
|
5392
5664
|
// Numeric timestamp for both the age filter and the sort; a
|
|
5393
5665
|
// non-string updatedAt (e.g. a raw DB Date from an untyped sink)
|
|
@@ -5419,7 +5691,7 @@ export class SessionEngine {
|
|
|
5419
5691
|
) {
|
|
5420
5692
|
const chunk = candidates.slice(i, i + RESTORE_FETCH_CONCURRENCY);
|
|
5421
5693
|
const fetched = await Promise.all(
|
|
5422
|
-
chunk.map(async
|
|
5694
|
+
chunk.map(async record => {
|
|
5423
5695
|
try {
|
|
5424
5696
|
// Local state always wins over the sink.
|
|
5425
5697
|
if ((await this.sessions.get(record.sessionId)) !== undefined) {
|
|
@@ -5676,7 +5948,7 @@ function eventsNdjson(events: SessionEvent[]): string | undefined {
|
|
|
5676
5948
|
if (events.length === 0) {
|
|
5677
5949
|
return undefined;
|
|
5678
5950
|
}
|
|
5679
|
-
return `${events.map(
|
|
5951
|
+
return `${events.map(event => JSON.stringify(event)).join("\n")}\n`;
|
|
5680
5952
|
}
|
|
5681
5953
|
|
|
5682
5954
|
function subagentPrompt(subagent: ResolvedAgent): string {
|
|
@@ -5692,7 +5964,7 @@ function subagentPrompt(subagent: ResolvedAgent): string {
|
|
|
5692
5964
|
* executor that turn will run on.
|
|
5693
5965
|
*/
|
|
5694
5966
|
function buildRunnerSubagents(agent: ResolvedAgent): RunnerSubagent[] {
|
|
5695
|
-
return agent.subagents.map(
|
|
5967
|
+
return agent.subagents.map(subagent => ({
|
|
5696
5968
|
name: subagent.name,
|
|
5697
5969
|
description: subagent.description ?? subagent.name,
|
|
5698
5970
|
prompt: subagentPrompt(subagent),
|
|
@@ -5716,7 +5988,7 @@ async function defaultGetCloudUsage(
|
|
|
5716
5988
|
return {
|
|
5717
5989
|
usage: mapSdkTokenUsage(billed.usage),
|
|
5718
5990
|
cost: billed.cost,
|
|
5719
|
-
runs: billed.runs.map(
|
|
5991
|
+
runs: billed.runs.map(run => ({
|
|
5720
5992
|
runId: run.runId,
|
|
5721
5993
|
usage: mapSdkTokenUsage(run.usage),
|
|
5722
5994
|
cost: run.cost,
|
|
@@ -5768,7 +6040,7 @@ function approvalResolverLabel(auth: AuthContext | null): string | undefined {
|
|
|
5768
6040
|
|
|
5769
6041
|
/** Let the HTTP NDJSON writer flush before the next SDK update. */
|
|
5770
6042
|
function yieldEventLoop(): Promise<void> {
|
|
5771
|
-
return new Promise(
|
|
6043
|
+
return new Promise(resolve => {
|
|
5772
6044
|
setImmediate(resolve);
|
|
5773
6045
|
});
|
|
5774
6046
|
}
|