@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
|
@@ -16,7 +16,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
16
16
|
});
|
|
17
17
|
};
|
|
18
18
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
19
|
-
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
19
|
+
import { access, mkdir, rm, writeFile } from "node:fs/promises";
|
|
20
20
|
import { dirname, join } from "node:path";
|
|
21
21
|
import { SLACK_CHANNEL_ID } from "../channels/slack/constants.js";
|
|
22
22
|
import { materializeSlackNudgeCarrier } from "../channels/slack/nudge-carrier.js";
|
|
@@ -57,7 +57,7 @@ import { McpOauthOnDemandHub } from "./mcp-oauth-on-demand.js";
|
|
|
57
57
|
import { shouldStartProcessMemoryTelemetry, startProcessMemoryTelemetry, } from "./process-memory-telemetry.js";
|
|
58
58
|
import { buildSessionContextBlock, SCHEDULE_CHANNEL_PREFIX, } from "./prompt-context.js";
|
|
59
59
|
import { assertCloudCanHonorAccountServersFilters } from "./resolved-connections.js";
|
|
60
|
-
import { applyAuthoredResult } from "./result-output.js";
|
|
60
|
+
import { addTurnUsage, applyAuthoredResult, RESULT_REPAIR_BUDGET, resultRepairPrompt, } from "./result-output.js";
|
|
61
61
|
import { sessionExternalLinks } from "./session-links.js";
|
|
62
62
|
import { SessionStore } from "./session-store.js";
|
|
63
63
|
import { syncSkillsToStore } from "./skills-sync.js";
|
|
@@ -81,6 +81,18 @@ export class SessionBusyError extends Error {
|
|
|
81
81
|
this.name = "SessionBusyError";
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Hosted enqueue-only admission could not coalesce into an active turn.
|
|
86
|
+
* Distinct from {@link SessionBusyError}: the caller asked not to start work.
|
|
87
|
+
*/
|
|
88
|
+
export class HostedEnqueueNotActiveError extends Error {
|
|
89
|
+
constructor(sessionId) {
|
|
90
|
+
super(sessionId === undefined
|
|
91
|
+
? "Hosted enqueue requires an active accepting session"
|
|
92
|
+
: `Hosted enqueue requires an active turn on session ${sessionId}`);
|
|
93
|
+
this.name = "HostedEnqueueNotActiveError";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
84
96
|
// Defined in auth.js (HTTP/session-store callers import it without this
|
|
85
97
|
// module); re-exported here because this is its historical public home.
|
|
86
98
|
export { SessionAuthError } from "./auth.js";
|
|
@@ -158,6 +170,33 @@ export class AuthInterruptedError extends Error {
|
|
|
158
170
|
}
|
|
159
171
|
}
|
|
160
172
|
const mcpAuthAls = new AsyncLocalStorage();
|
|
173
|
+
/** Marker that we `git init`'d this shared harness so scaffold is ours to write. */
|
|
174
|
+
const OWNED_HARNESS = join(".agent-serve", "owned-harness");
|
|
175
|
+
function pathExists(path) {
|
|
176
|
+
return access(path).then(() => true, () => false);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Nested dirs get their own git root so the harness does not ripwalk the
|
|
180
|
+
* enclosing checkout. A real `workspaceDir` checkout (already a git root)
|
|
181
|
+
* is left alone.
|
|
182
|
+
*/
|
|
183
|
+
function ownSharedHarness(dir) {
|
|
184
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
+
if (yield pathExists(join(dir, OWNED_HARNESS))) {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
if (!(yield isNestedInGitRepo(dir))) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
yield ensureOwnGitRoot(dir);
|
|
192
|
+
if (yield isNestedInGitRepo(dir)) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
yield mkdir(join(dir, ".agent-serve"), { recursive: true });
|
|
196
|
+
yield writeFile(join(dir, OWNED_HARNESS), "");
|
|
197
|
+
return true;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
161
200
|
export class SessionEngine {
|
|
162
201
|
constructor(options) {
|
|
163
202
|
var _a, _b, _c, _d, _e;
|
|
@@ -197,6 +236,8 @@ export class SessionEngine {
|
|
|
197
236
|
this.turnAborts = new Map();
|
|
198
237
|
/** Serializes turn admission per session (latest follow-up wins). */
|
|
199
238
|
this.admissionChains = new Map();
|
|
239
|
+
/** Live turn snapshot so a coalesced Slack wake can repaint on this process. */
|
|
240
|
+
this.liveTurns = new Map();
|
|
200
241
|
/**
|
|
201
242
|
* Per-session coalesce queue for `admission: "coalesce"` (Slack). Drained
|
|
202
243
|
* into one follow-up turn when the active turn finishes without interrupt.
|
|
@@ -245,7 +286,7 @@ export class SessionEngine {
|
|
|
245
286
|
this.askDedupe = new SlackAskDedupeStore(join(options.stateRoot, "slack-asks"));
|
|
246
287
|
this.turnLeases = new TurnLeaseStore(join(options.stateRoot, "turn-leases"));
|
|
247
288
|
this.outbox = new TurnOutbox(join(options.stateRoot, "outbox"));
|
|
248
|
-
this.logs = new EventLogStore(
|
|
289
|
+
this.logs = new EventLogStore(sessionId => this.sessions.eventFilePath(sessionId), (sessionId, error) => this.logger(`[agent-sdk] failed to persist events for ${sessionId}: ${describeError(error)}`));
|
|
249
290
|
// Framework session state (records, event chunks, continuations) is
|
|
250
291
|
// mirrored to whatever this selects; see framework-storage-selection.ts
|
|
251
292
|
// for why the choice does not belong to the agent author.
|
|
@@ -289,7 +330,7 @@ export class SessionEngine {
|
|
|
289
330
|
this.mcpHost = new McpHost([
|
|
290
331
|
...options.project.agent.connections,
|
|
291
332
|
...((_d = options.project.agent.hostConnections) !== null && _d !== void 0 ? _d : []),
|
|
292
|
-
].filter(
|
|
333
|
+
].filter(connection => !isSymbolicConnectionTransport(connection.transport)));
|
|
293
334
|
const basePlatforms = (_e = options.platforms) !== null && _e !== void 0 ? _e : createHostPlatforms();
|
|
294
335
|
const slackBinding = resolveDedicatedSlackHostBinding(options.project.channels);
|
|
295
336
|
this.platforms =
|
|
@@ -333,7 +374,7 @@ export class SessionEngine {
|
|
|
333
374
|
authoredConnection(name) {
|
|
334
375
|
var _a;
|
|
335
376
|
var _b;
|
|
336
|
-
return ((_b = this.project.agent.connections.find(
|
|
377
|
+
return ((_b = this.project.agent.connections.find(item => item.name === name)) !== null && _b !== void 0 ? _b : (_a = this.project.agent.hostConnections) === null || _a === void 0 ? void 0 : _a.find(item => item.name === name));
|
|
337
378
|
}
|
|
338
379
|
setCloudServerToolsConnection(connection) {
|
|
339
380
|
this.cloudServerToolsConnection = connection;
|
|
@@ -398,7 +439,7 @@ export class SessionEngine {
|
|
|
398
439
|
}
|
|
399
440
|
return this.tagArtifact(Object.assign(Object.assign({}, input), { sessionId: binding.sessionId, turnId: (_a = input.turnId) !== null && _a !== void 0 ? _a : binding.turnId }));
|
|
400
441
|
}),
|
|
401
|
-
list:
|
|
442
|
+
list: filter => this.artifactsStore.list(filter),
|
|
402
443
|
};
|
|
403
444
|
}
|
|
404
445
|
/**
|
|
@@ -536,10 +577,10 @@ export class SessionEngine {
|
|
|
536
577
|
}
|
|
537
578
|
slackNudgeHostApi() {
|
|
538
579
|
return {
|
|
539
|
-
append:
|
|
540
|
-
drainFormatted:
|
|
541
|
-
clear:
|
|
542
|
-
hasUndelivered:
|
|
580
|
+
append: input => this.nudgeStore.append(input),
|
|
581
|
+
drainFormatted: continuationKey => this.nudgeStore.drainFormatted(continuationKey),
|
|
582
|
+
clear: continuationKey => this.nudgeStore.clear(continuationKey),
|
|
583
|
+
hasUndelivered: continuationKey => this.nudgeStore.hasUndelivered(continuationKey),
|
|
543
584
|
isDelivered: (continuationKey, sourceTs) => this.nudgeStore.isDelivered(continuationKey, sourceTs),
|
|
544
585
|
tryClaimAsk: (channelId, messageTs) => this.askDedupe.tryClaim(channelId, messageTs),
|
|
545
586
|
releaseAsk: (channelId, messageTs) => this.askDedupe.release(channelId, messageTs),
|
|
@@ -575,6 +616,9 @@ export class SessionEngine {
|
|
|
575
616
|
// on a sessionless pod.
|
|
576
617
|
throw new HostedAdmissionLocalSendError();
|
|
577
618
|
}
|
|
619
|
+
if (options.clearCloudOverride === true && options.cloud !== undefined) {
|
|
620
|
+
throw new Error("send options cloud and clearCloudOverride cannot be combined");
|
|
621
|
+
}
|
|
578
622
|
const identity = channelId === HTTP_CHANNEL_ID
|
|
579
623
|
? httpContinuationIdentity(this.project.httpChannel)
|
|
580
624
|
: channelContinuationIdentity(this.channelsById.get(channelId));
|
|
@@ -620,35 +664,52 @@ export class SessionEngine {
|
|
|
620
664
|
// Refresh harness cwd when the caller supplies a newer worktree (e.g. PR
|
|
621
665
|
// synchronize). Leave the durable continuation key unchanged.
|
|
622
666
|
let record = existing;
|
|
623
|
-
const
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
667
|
+
const enqueueOnly = sendOptions.hostedEnqueueOnly === true;
|
|
668
|
+
if (!enqueueOnly) {
|
|
669
|
+
const refreshWorkspace = sendOptions.workspaceDir !== undefined &&
|
|
670
|
+
sendOptions.workspaceDir !== existing.workspaceOverride;
|
|
671
|
+
if (refreshWorkspace ||
|
|
672
|
+
sendOptions.workspaceFiles !== undefined ||
|
|
673
|
+
sendOptions.images !== undefined) {
|
|
674
|
+
record = yield this.updateRecord(existing.sessionId, current => (Object.assign(Object.assign({}, current), { workspaceOverride: refreshWorkspace
|
|
675
|
+
? sendOptions.workspaceDir
|
|
676
|
+
: current.workspaceOverride, pendingWorkspaceFiles: mergePendingWorkspaceFiles(current.pendingWorkspaceFiles, sendOptions.workspaceFiles), pendingImages: mergePendingImages(current.pendingImages, sendOptions.images) })));
|
|
677
|
+
}
|
|
678
|
+
// A caller can explicitly return a continuation to the agent's
|
|
679
|
+
// configured runtime. Omission remains sticky for compatibility:
|
|
680
|
+
// follow-ups that do not know the original attach keep it.
|
|
681
|
+
if (sendOptions.clearCloudOverride === true &&
|
|
682
|
+
record.cloudOverride !== undefined) {
|
|
683
|
+
record = yield this.updateRecord(record.sessionId, current => (Object.assign(Object.assign({}, current), { cloudOverride: undefined })));
|
|
684
|
+
}
|
|
685
|
+
else if (sendOptions.cloud !== undefined &&
|
|
686
|
+
JSON.stringify(sendOptions.cloud) !==
|
|
687
|
+
JSON.stringify(record.cloudOverride)) {
|
|
688
|
+
record = yield this.updateRecord(record.sessionId, current => (Object.assign(Object.assign({}, current), { cloudOverride: sendOptions.cloud })));
|
|
689
|
+
}
|
|
690
|
+
// Refresh wake-derived channel state (GitHub headSha / refs) without
|
|
691
|
+
// wiping sticky fields. Null patch values are skipped.
|
|
692
|
+
if (sendOptions.refreshState !== undefined) {
|
|
693
|
+
record = yield this.updateRecord(record.sessionId, current => (Object.assign(Object.assign({}, current), { channelState: mergeChannelStateSkipNull(current.channelState, sendOptions.refreshState) })));
|
|
694
|
+
}
|
|
645
695
|
}
|
|
646
696
|
const since = (yield this.logs.get(record.sessionId)).count;
|
|
647
|
-
const coalesced = yield this.startTurn(record.sessionId, message, Object.assign({ admission:
|
|
697
|
+
const coalesced = yield this.startTurn(record.sessionId, message, Object.assign(Object.assign({ admission: enqueueOnly
|
|
698
|
+
? "coalesce"
|
|
699
|
+
: ((_d = sendOptions.admission) !== null && _d !== void 0 ? _d : "preempt") }, (sendOptions.coalesceSourceTs === undefined
|
|
648
700
|
? {}
|
|
649
|
-
: { sourceTs: sendOptions.coalesceSourceTs })));
|
|
701
|
+
: { sourceTs: sendOptions.coalesceSourceTs })), (enqueueOnly ? { hostedEnqueueOnly: true } : {})));
|
|
702
|
+
if (enqueueOnly && !coalesced) {
|
|
703
|
+
throw new HostedEnqueueNotActiveError(record.sessionId);
|
|
704
|
+
}
|
|
705
|
+
if (!enqueueOnly && coalesced && sendOptions.refreshState !== undefined) {
|
|
706
|
+
yield this.repaintOnCoalescedRefresh(record.sessionId, sendOptions.refreshState);
|
|
707
|
+
}
|
|
650
708
|
return this.channelSession(record.sessionId, record, false, coalesced, since);
|
|
651
709
|
}
|
|
710
|
+
if (sendOptions.hostedEnqueueOnly === true) {
|
|
711
|
+
throw new HostedEnqueueNotActiveError(sendOptions.hostedSessionId);
|
|
712
|
+
}
|
|
652
713
|
if (sendOptions.hostedSessionId !== undefined) {
|
|
653
714
|
const collision = yield this.getOrRestoreSession(sendOptions.hostedSessionId);
|
|
654
715
|
if (collision !== undefined) {
|
|
@@ -706,7 +767,7 @@ export class SessionEngine {
|
|
|
706
767
|
const stale = new Error("stale HTTP continuation");
|
|
707
768
|
let previous;
|
|
708
769
|
try {
|
|
709
|
-
yield this.updateRecord(sessionId,
|
|
770
|
+
yield this.updateRecord(sessionId, record => {
|
|
710
771
|
var _a;
|
|
711
772
|
const expectedChannel = record.httpContinuationKey === undefined
|
|
712
773
|
? record.channelId
|
|
@@ -730,7 +791,7 @@ export class SessionEngine {
|
|
|
730
791
|
return next;
|
|
731
792
|
}
|
|
732
793
|
catch (error) {
|
|
733
|
-
yield this.updateRecord(sessionId,
|
|
794
|
+
yield this.updateRecord(sessionId, record => record.httpContinuationKey === next
|
|
734
795
|
? Object.assign(Object.assign({}, record), { httpContinuationKey: previous }) : record);
|
|
735
796
|
throw error;
|
|
736
797
|
}
|
|
@@ -793,6 +854,45 @@ export class SessionEngine {
|
|
|
793
854
|
// ==========================================================================
|
|
794
855
|
// Turn execution
|
|
795
856
|
// ==========================================================================
|
|
857
|
+
/**
|
|
858
|
+
* Repaint on the follow-up wake without retargeting the live turn.
|
|
859
|
+
* Persist already took the refresh; in-flight writes stay on the carrier ts.
|
|
860
|
+
*/
|
|
861
|
+
repaintOnCoalescedRefresh(sessionId, patch) {
|
|
862
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
863
|
+
var _a;
|
|
864
|
+
var _b;
|
|
865
|
+
const live = this.liveTurns.get(sessionId);
|
|
866
|
+
if (live === undefined || patch === undefined) {
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
const repaintState = (_b = mergeChannelStateSkipNull(live.channelState, patch)) !== null && _b !== void 0 ? _b : live.channelState;
|
|
870
|
+
const record = yield this.sessions.get(sessionId);
|
|
871
|
+
if (record === undefined) {
|
|
872
|
+
return;
|
|
873
|
+
}
|
|
874
|
+
const handler = (_a = this.channelEventHandlersFor(record.channelId)) === null || _a === void 0 ? void 0 : _a["message.received"];
|
|
875
|
+
if (handler === undefined) {
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
878
|
+
yield handler({
|
|
879
|
+
type: "message.received",
|
|
880
|
+
data: { text: "" },
|
|
881
|
+
index: 0,
|
|
882
|
+
sessionId,
|
|
883
|
+
at: new Date().toISOString(),
|
|
884
|
+
}, {
|
|
885
|
+
channelId: record.channelId,
|
|
886
|
+
state: repaintState,
|
|
887
|
+
continuationToken: record.continuationKey,
|
|
888
|
+
setContinuationToken: (token) => this.setContinuationToken(sessionId, token),
|
|
889
|
+
}, {
|
|
890
|
+
session: live.session,
|
|
891
|
+
host: this.hostForSession(sessionId),
|
|
892
|
+
artifacts: this.artifactsApi({ sessionId }),
|
|
893
|
+
});
|
|
894
|
+
});
|
|
895
|
+
}
|
|
796
896
|
/**
|
|
797
897
|
* Admit a turn for `sessionId`.
|
|
798
898
|
*
|
|
@@ -811,7 +911,12 @@ export class SessionEngine {
|
|
|
811
911
|
.catch(() => { })
|
|
812
912
|
.then(() => __awaiter(this, void 0, void 0, function* () {
|
|
813
913
|
// Another server holds the turn: hand the message to it and coalesce.
|
|
914
|
+
// Enqueue-only must not report coalesced success without a local
|
|
915
|
+
// enqueue — the outbox drain may never run on this process.
|
|
814
916
|
if (yield this.turnLeases.runningElsewhere(sessionId)) {
|
|
917
|
+
if (options.hostedEnqueueOnly === true) {
|
|
918
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
919
|
+
}
|
|
815
920
|
yield this.outbox.post(sessionId, { message, options });
|
|
816
921
|
return true;
|
|
817
922
|
}
|
|
@@ -824,7 +929,7 @@ export class SessionEngine {
|
|
|
824
929
|
drainOutbox(sessionId) {
|
|
825
930
|
void this.outbox
|
|
826
931
|
.takeAll(sessionId)
|
|
827
|
-
.then(
|
|
932
|
+
.then(items => {
|
|
828
933
|
for (const item of items) {
|
|
829
934
|
void this.startTurn(sessionId, item.message, item.options).catch(() => { });
|
|
830
935
|
}
|
|
@@ -835,7 +940,7 @@ export class SessionEngine {
|
|
|
835
940
|
var _a;
|
|
836
941
|
const queue = (_a = this.coalesceQueues.get(sessionId)) !== null && _a !== void 0 ? _a : [];
|
|
837
942
|
if (item.sourceTs !== undefined &&
|
|
838
|
-
queue.some(
|
|
943
|
+
queue.some(entry => entry.sourceTs === item.sourceTs)) {
|
|
839
944
|
return;
|
|
840
945
|
}
|
|
841
946
|
queue.push(item);
|
|
@@ -905,7 +1010,7 @@ export class SessionEngine {
|
|
|
905
1010
|
}
|
|
906
1011
|
const parts = [
|
|
907
1012
|
"<slack_followups>",
|
|
908
|
-
|
|
1013
|
+
`${items.length} asks arrived while you were busy.`,
|
|
909
1014
|
"",
|
|
910
1015
|
];
|
|
911
1016
|
for (let i = 0; i < items.length; i++) {
|
|
@@ -988,10 +1093,19 @@ export class SessionEngine {
|
|
|
988
1093
|
// enqueue: `drainCoalescedFollowups` reads only this process's queue, so
|
|
989
1094
|
// the shared nudge store is the carrier. Not redundant with `acquire`
|
|
990
1095
|
// below — this returns before preempt's `clearCoalesced` drops the queue.
|
|
1096
|
+
// Enqueue-only cannot claim coalesced here: nothing joined a local turn.
|
|
991
1097
|
if (yield this.turnLeases.runningElsewhere(sessionId)) {
|
|
1098
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1099
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1100
|
+
}
|
|
992
1101
|
this.logger(`[session] coalesce; another server owns ${sessionId}`);
|
|
993
1102
|
return true;
|
|
994
1103
|
}
|
|
1104
|
+
// Enqueue-only must never start a turn (or preempt/interrupt). Steer and
|
|
1105
|
+
// coalesce above already returned true when they absorbed the message.
|
|
1106
|
+
if (options.hostedEnqueueOnly === true) {
|
|
1107
|
+
throw new HostedEnqueueNotActiveError(sessionId);
|
|
1108
|
+
}
|
|
995
1109
|
// Interrupt any turn in flight and wait for it to settle so the SDK run is
|
|
996
1110
|
// terminal before this turn's send (the follow-up also force-expires as a
|
|
997
1111
|
// belt-and-suspenders — see buildTurnRequest). Drain-resume skips interrupt:
|
|
@@ -1020,7 +1134,7 @@ export class SessionEngine {
|
|
|
1020
1134
|
this.pendingTurns.add(sessionId);
|
|
1021
1135
|
let lifecycleInstalled = false;
|
|
1022
1136
|
try {
|
|
1023
|
-
const record = yield this.updateRecord(sessionId,
|
|
1137
|
+
const record = yield this.updateRecord(sessionId, current => (Object.assign(Object.assign({}, current), { turnCount: current.turnCount + 1 })));
|
|
1024
1138
|
const turnId = `turn_${record.turnCount}`;
|
|
1025
1139
|
const isFirstTurn = record.turnCount === 1;
|
|
1026
1140
|
yield this.appendEvent(sessionId, {
|
|
@@ -1057,6 +1171,7 @@ export class SessionEngine {
|
|
|
1057
1171
|
}
|
|
1058
1172
|
finally {
|
|
1059
1173
|
clearInterval(poll);
|
|
1174
|
+
this.liveTurns.delete(sessionId);
|
|
1060
1175
|
}
|
|
1061
1176
|
this.lastOutcomes.set(sessionId, outcome);
|
|
1062
1177
|
const wasCurrent = this.activeTurns.get(sessionId) === lifecycle;
|
|
@@ -1066,8 +1181,13 @@ export class SessionEngine {
|
|
|
1066
1181
|
if (this.turnAborts.get(sessionId) === abort) {
|
|
1067
1182
|
this.turnAborts.delete(sessionId);
|
|
1068
1183
|
}
|
|
1069
|
-
|
|
1070
|
-
|
|
1184
|
+
// Failed/cancelled owners must not start a coalesced successor.
|
|
1185
|
+
// Hosted execute would then 503 and Temporal/FIFO would re-run the
|
|
1186
|
+
// same follow-ups as full deliveries.
|
|
1187
|
+
if (wasCurrent &&
|
|
1188
|
+
!abort.signal.aborted &&
|
|
1189
|
+
outcome.status === "finished") {
|
|
1190
|
+
const drain = this.drainCoalescedFollowups(sessionId).catch(error => {
|
|
1071
1191
|
this.logger(`[session] coalesce drain failed for ${sessionId}: ${describeError(error)}`);
|
|
1072
1192
|
});
|
|
1073
1193
|
this.coalesceDrains.set(sessionId, drain);
|
|
@@ -1291,7 +1411,7 @@ export class SessionEngine {
|
|
|
1291
1411
|
if (turn === undefined) {
|
|
1292
1412
|
return tools;
|
|
1293
1413
|
}
|
|
1294
|
-
return tools.map(
|
|
1414
|
+
return tools.map(tool => {
|
|
1295
1415
|
const execute = tool.definition.execute;
|
|
1296
1416
|
if (typeof execute !== "function") {
|
|
1297
1417
|
return tool;
|
|
@@ -1449,6 +1569,14 @@ export class SessionEngine {
|
|
|
1449
1569
|
* Best effort — warming is an optimization, and a turn rebuilds on its own.
|
|
1450
1570
|
*/
|
|
1451
1571
|
prewarmSharedWorkspace() {
|
|
1572
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1573
|
+
if (this.sharedWarm === undefined) {
|
|
1574
|
+
this.sharedWarm = this.warmSharedWorkspace();
|
|
1575
|
+
}
|
|
1576
|
+
yield this.sharedWarm;
|
|
1577
|
+
});
|
|
1578
|
+
}
|
|
1579
|
+
warmSharedWorkspace() {
|
|
1452
1580
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1453
1581
|
var _a, _b;
|
|
1454
1582
|
const agent = this.project.agent;
|
|
@@ -1461,6 +1589,15 @@ export class SessionEngine {
|
|
|
1461
1589
|
}
|
|
1462
1590
|
const startedAt = Date.now();
|
|
1463
1591
|
try {
|
|
1592
|
+
yield mkdir(workspaceDir, { recursive: true });
|
|
1593
|
+
if (yield ownSharedHarness(workspaceDir)) {
|
|
1594
|
+
yield materializeWorkspace({
|
|
1595
|
+
agent,
|
|
1596
|
+
workspaceDir,
|
|
1597
|
+
seed: true,
|
|
1598
|
+
stateRoot: this.stateRoot,
|
|
1599
|
+
});
|
|
1600
|
+
}
|
|
1464
1601
|
const harness = resolveHostHarnessToolOptions(agent.allowedTools);
|
|
1465
1602
|
const outcome = yield this.runner.prewarm(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ workspaceDir, runnerStateDir: join(this.stateRoot, "runner"), sandbox: ((_b = agent.local) === null || _b === void 0 ? void 0 : _b.sandbox) === true }, (harness.tools === undefined ? {} : { tools: harness.tools })), (harness.disallowedTools === undefined
|
|
1466
1603
|
? {}
|
|
@@ -1468,7 +1605,8 @@ export class SessionEngine {
|
|
|
1468
1605
|
// No session yet, so auth'd connections are omitted rather than
|
|
1469
1606
|
// warmed without an identity; the per-send flag still has to match
|
|
1470
1607
|
// the turns' requests or the warmed executor is one no turn asks for.
|
|
1471
|
-
mcpServers: this.buildMcpServers("local") }), (this.hasAttachedAuthedConnections()
|
|
1608
|
+
mcpServers: this.buildMcpServers("local") }), (this.hasAttachedAuthedConnections() ||
|
|
1609
|
+
this.project.agent.connections.some(connection => isCursorAccountTransport(connection.transport))
|
|
1472
1610
|
? { perSendMcpServers: true }
|
|
1473
1611
|
: {})), { subagents: buildRunnerSubagents(agent) }), (agent.model === undefined ? {} : { model: agent.model })));
|
|
1474
1612
|
// Report what happened rather than that the call returned: a runner
|
|
@@ -1492,15 +1630,17 @@ export class SessionEngine {
|
|
|
1492
1630
|
}
|
|
1493
1631
|
executeTurn(record, turnId, message, isFirstTurn, signal) {
|
|
1494
1632
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1495
|
-
var _a
|
|
1633
|
+
var _a;
|
|
1634
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
1496
1635
|
const sessionId = record.sessionId;
|
|
1497
1636
|
const workspaceDir = this.scaffoldDir(record);
|
|
1498
1637
|
const harnessCwd = this.harnessCwd(record);
|
|
1499
|
-
const turnChannelState = structuredClone((
|
|
1638
|
+
const turnChannelState = structuredClone((_b = record.channelState) !== null && _b !== void 0 ? _b : null);
|
|
1500
1639
|
const eventContext = {
|
|
1501
1640
|
channelState: structuredClone(turnChannelState),
|
|
1502
1641
|
session: this.sessionInfo(record),
|
|
1503
1642
|
};
|
|
1643
|
+
this.liveTurns.set(sessionId, eventContext);
|
|
1504
1644
|
// Hold the open log so tool events append synchronously. Fire-and-forget
|
|
1505
1645
|
// `appendEvent` races parallel tool completions and delays the live stream
|
|
1506
1646
|
// until the next await tick — often after *all* parallel tools finish.
|
|
@@ -1517,7 +1657,7 @@ export class SessionEngine {
|
|
|
1517
1657
|
// Read by closure, so the mapper still sees it while draining after the
|
|
1518
1658
|
// registry entry below is gone.
|
|
1519
1659
|
const stubbed = new Set();
|
|
1520
|
-
const mapper = new TurnEventMapper(emit,
|
|
1660
|
+
const mapper = new TurnEventMapper(emit, callId => stubbed.has(callId));
|
|
1521
1661
|
// Take a turn slot before any work happens. When every slot is busy the
|
|
1522
1662
|
// turn waits FIFO — durable `turn.queued` marks the wait — and a
|
|
1523
1663
|
// preempting follow-up (or interrupt) resolves the wait as cancelled
|
|
@@ -1525,7 +1665,7 @@ export class SessionEngine {
|
|
|
1525
1665
|
const permit = yield this.turnGovernor.acquire({
|
|
1526
1666
|
sessionId,
|
|
1527
1667
|
signal,
|
|
1528
|
-
onQueued:
|
|
1668
|
+
onQueued: position => {
|
|
1529
1669
|
var _a;
|
|
1530
1670
|
const maxRunningTurns = (_a = this.turnGovernor.maxRunningTurns) !== null && _a !== void 0 ? _a : 0;
|
|
1531
1671
|
emit({ type: "turn.queued", data: { position, maxRunningTurns } });
|
|
@@ -1540,6 +1680,10 @@ export class SessionEngine {
|
|
|
1540
1680
|
else {
|
|
1541
1681
|
emit({ type: "turn.started", data: {} });
|
|
1542
1682
|
try {
|
|
1683
|
+
if (record.workspaceOverride === undefined &&
|
|
1684
|
+
((_a = this.project.agent.local) === null || _a === void 0 ? void 0 : _a.workspaceDir) !== undefined) {
|
|
1685
|
+
yield this.prewarmSharedWorkspace();
|
|
1686
|
+
}
|
|
1543
1687
|
// Scaffold agent files into the session workspace even when the harness
|
|
1544
1688
|
// cwd is overridden (e.g. a PR worktree).
|
|
1545
1689
|
if (!this.hasRootOverride()) {
|
|
@@ -1573,7 +1717,7 @@ export class SessionEngine {
|
|
|
1573
1717
|
if (hasPendingFiles && runtime !== "cloud") {
|
|
1574
1718
|
const root = yield this.resolveFileSystem({
|
|
1575
1719
|
sessionId,
|
|
1576
|
-
continuationKey: (
|
|
1720
|
+
continuationKey: (_c = record.continuationKey) !== null && _c !== void 0 ? _c : undefined,
|
|
1577
1721
|
cache: true,
|
|
1578
1722
|
cwd: harnessCwd,
|
|
1579
1723
|
});
|
|
@@ -1581,7 +1725,7 @@ export class SessionEngine {
|
|
|
1581
1725
|
}
|
|
1582
1726
|
if ((hasPendingFiles && runtime !== "cloud") ||
|
|
1583
1727
|
(pendingImages !== undefined && pendingImages.length > 0)) {
|
|
1584
|
-
yield this.updateRecord(sessionId,
|
|
1728
|
+
yield this.updateRecord(sessionId, current => (Object.assign(Object.assign({}, current), { pendingWorkspaceFiles: hasPendingFiles &&
|
|
1585
1729
|
runtime !== "cloud" &&
|
|
1586
1730
|
current.pendingWorkspaceFiles === pendingFiles
|
|
1587
1731
|
? undefined
|
|
@@ -1589,15 +1733,7 @@ export class SessionEngine {
|
|
|
1589
1733
|
? undefined
|
|
1590
1734
|
: current.pendingImages })));
|
|
1591
1735
|
}
|
|
1592
|
-
|
|
1593
|
-
// workspace is its own project root. When the harness cwd is borrowed
|
|
1594
|
-
// (PR worktree, shared checkout) the scaffold lands elsewhere, and a
|
|
1595
|
-
// workspace nested inside a git repo re-roots harness rules at that
|
|
1596
|
-
// repo — in both cases deliver instructions inline on the first turn.
|
|
1597
|
-
const instructionsInvisibleToHarness = isFirstTurn &&
|
|
1598
|
-
(this.hasBorrowedWorkspace(record) ||
|
|
1599
|
-
(yield isNestedInGitRepo(harnessCwd)));
|
|
1600
|
-
const request = yield this.buildTurnRequest(record, turnId, message, isFirstTurn, instructionsInvisibleToHarness, emit, eventContext, (update) => __awaiter(this, void 0, void 0, function* () {
|
|
1736
|
+
const onUpdate = (update) => __awaiter(this, void 0, void 0, function* () {
|
|
1601
1737
|
const turn = this.turnRoots.get(sessionId);
|
|
1602
1738
|
if (turn !== undefined) {
|
|
1603
1739
|
update = yield applyWebScratchUpdate({
|
|
@@ -1619,11 +1755,26 @@ export class SessionEngine {
|
|
|
1619
1755
|
yield this.emitDeliveredNudges(record, emit);
|
|
1620
1756
|
yield yieldEventLoop();
|
|
1621
1757
|
}
|
|
1622
|
-
})
|
|
1758
|
+
});
|
|
1759
|
+
const request = yield this.buildTurnRequest(record, turnId, message, isFirstTurn, emit, eventContext, onUpdate, signal, pendingImages);
|
|
1623
1760
|
this.activeToolContexts.set(sessionId, { record, turnId, emit });
|
|
1624
1761
|
this.stubbedCallIds.set(sessionId, stubbed);
|
|
1625
1762
|
try {
|
|
1626
1763
|
outcome = yield this.runTurnExecute(record, turnId, () => this.runner.runTurn(request));
|
|
1764
|
+
// Commit before dropping the turn FS so `ctx.reject` can
|
|
1765
|
+
// re-run the model with tools still mounted.
|
|
1766
|
+
outcome = yield this.settleAuthoredResult({
|
|
1767
|
+
record,
|
|
1768
|
+
turnId,
|
|
1769
|
+
emit,
|
|
1770
|
+
eventContext,
|
|
1771
|
+
turnChannelState,
|
|
1772
|
+
harnessCwd,
|
|
1773
|
+
signal,
|
|
1774
|
+
onUpdate,
|
|
1775
|
+
mapper,
|
|
1776
|
+
outcome,
|
|
1777
|
+
});
|
|
1627
1778
|
}
|
|
1628
1779
|
finally {
|
|
1629
1780
|
this.activeToolContexts.delete(sessionId);
|
|
@@ -1654,47 +1805,22 @@ export class SessionEngine {
|
|
|
1654
1805
|
mapper.finish();
|
|
1655
1806
|
if (mapper.title !== undefined) {
|
|
1656
1807
|
const title = mapper.title;
|
|
1657
|
-
yield this.updateRecord(sessionId,
|
|
1808
|
+
yield this.updateRecord(sessionId, current => (Object.assign(Object.assign({}, current), { title })));
|
|
1658
1809
|
eventContext.session = Object.assign(Object.assign({}, eventContext.session), { title });
|
|
1659
1810
|
}
|
|
1660
|
-
const finalResult = (
|
|
1661
|
-
const finalUsage = (
|
|
1811
|
+
const finalResult = (_d = outcome.result) !== null && _d !== void 0 ? _d : mapper.finalText;
|
|
1812
|
+
const finalUsage = (_e = outcome.usage) !== null && _e !== void 0 ? _e : mapper.usage;
|
|
1662
1813
|
const finalCost = finalUsage === undefined
|
|
1663
1814
|
? undefined
|
|
1664
1815
|
: yield this.estimateTurnCost({
|
|
1665
|
-
model: (
|
|
1816
|
+
model: (_f = this.project.agent.model) !== null && _f !== void 0 ? _f : DEFAULT_MODEL,
|
|
1666
1817
|
usage: finalUsage,
|
|
1667
1818
|
agentId: record.sdkAgentId,
|
|
1668
|
-
conversationId: (
|
|
1819
|
+
conversationId: (_g = record.sdkAgentId) !== null && _g !== void 0 ? _g : sessionId,
|
|
1669
1820
|
});
|
|
1670
1821
|
if (finalCost !== undefined) {
|
|
1671
1822
|
outcome = Object.assign(Object.assign({}, outcome), { cost: finalCost });
|
|
1672
1823
|
}
|
|
1673
|
-
const authored = this.project.result;
|
|
1674
|
-
if (outcome.status === "finished" && authored !== undefined) {
|
|
1675
|
-
const settled = yield applyAuthoredResult({
|
|
1676
|
-
definition: authored,
|
|
1677
|
-
text: finalResult,
|
|
1678
|
-
dryRun: record.dryRun === true,
|
|
1679
|
-
ctx: {
|
|
1680
|
-
session: eventContext.session,
|
|
1681
|
-
channelState: turnChannelState,
|
|
1682
|
-
host: this.hostForSession(sessionId),
|
|
1683
|
-
artifacts: this.artifactsApi({ sessionId, turnId }),
|
|
1684
|
-
stateRoot: this.stateRoot,
|
|
1685
|
-
workspaceDir: harnessCwd,
|
|
1686
|
-
},
|
|
1687
|
-
});
|
|
1688
|
-
if (!settled.ok) {
|
|
1689
|
-
outcome = {
|
|
1690
|
-
status: "error",
|
|
1691
|
-
result: finalResult,
|
|
1692
|
-
errorMessage: `turn output failed: ${settled.message}`,
|
|
1693
|
-
usage: finalUsage,
|
|
1694
|
-
cost: finalCost,
|
|
1695
|
-
};
|
|
1696
|
-
}
|
|
1697
|
-
}
|
|
1698
1824
|
if (outcome.status === "finished") {
|
|
1699
1825
|
yield this.appendEvent(sessionId, {
|
|
1700
1826
|
type: "turn.completed",
|
|
@@ -1715,21 +1841,21 @@ export class SessionEngine {
|
|
|
1715
1841
|
status: outcome.status,
|
|
1716
1842
|
message: interrupted
|
|
1717
1843
|
? "turn interrupted"
|
|
1718
|
-
: ((
|
|
1844
|
+
: ((_h = outcome.errorMessage) !== null && _h !== void 0 ? _h : (outcome.status === "cancelled"
|
|
1719
1845
|
? "turn cancelled"
|
|
1720
1846
|
: "turn failed")),
|
|
1721
1847
|
},
|
|
1722
1848
|
}, eventContext);
|
|
1723
1849
|
}
|
|
1724
1850
|
const current = yield this.sessions.get(sessionId);
|
|
1725
|
-
const mode = (
|
|
1851
|
+
const mode = (_j = current === null || current === void 0 ? void 0 : current.mode) !== null && _j !== void 0 ? _j : record.mode;
|
|
1726
1852
|
if (mode === "task") {
|
|
1727
1853
|
yield this.appendEvent(sessionId, outcome.status === "finished"
|
|
1728
1854
|
? { type: "session.completed", turnId, data: {} }
|
|
1729
1855
|
: {
|
|
1730
1856
|
type: "session.failed",
|
|
1731
1857
|
turnId,
|
|
1732
|
-
data: { message: (
|
|
1858
|
+
data: { message: (_k = outcome.errorMessage) !== null && _k !== void 0 ? _k : "task failed" },
|
|
1733
1859
|
}, eventContext);
|
|
1734
1860
|
yield this.wipeCloudSessionWorkspace(sessionId);
|
|
1735
1861
|
}
|
|
@@ -1743,6 +1869,65 @@ export class SessionEngine {
|
|
|
1743
1869
|
return Object.assign(Object.assign({}, outcome), { result: finalResult, usage: finalUsage });
|
|
1744
1870
|
});
|
|
1745
1871
|
}
|
|
1872
|
+
/**
|
|
1873
|
+
* Run `defineResult` while the turn FS and tools are still up.
|
|
1874
|
+
* `ctx.reject` re-invokes `runTurn` on this turnId until commit
|
|
1875
|
+
* succeeds, throws, or the repair budget is gone.
|
|
1876
|
+
*/
|
|
1877
|
+
settleAuthoredResult(args) {
|
|
1878
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1879
|
+
var _a;
|
|
1880
|
+
const authored = this.project.result;
|
|
1881
|
+
if (args.outcome.status !== "finished" || authored === undefined) {
|
|
1882
|
+
return args.outcome;
|
|
1883
|
+
}
|
|
1884
|
+
let outcome = args.outcome;
|
|
1885
|
+
let usage = outcome.usage;
|
|
1886
|
+
let repairs = 0;
|
|
1887
|
+
while (true) {
|
|
1888
|
+
const settled = yield applyAuthoredResult({
|
|
1889
|
+
definition: authored,
|
|
1890
|
+
text: (_a = outcome.result) !== null && _a !== void 0 ? _a : args.mapper.pendingText,
|
|
1891
|
+
dryRun: args.record.dryRun === true,
|
|
1892
|
+
ctx: {
|
|
1893
|
+
session: args.eventContext.session,
|
|
1894
|
+
channelState: args.turnChannelState,
|
|
1895
|
+
host: this.hostForSession(args.record.sessionId),
|
|
1896
|
+
artifacts: this.artifactsApi({
|
|
1897
|
+
sessionId: args.record.sessionId,
|
|
1898
|
+
turnId: args.turnId,
|
|
1899
|
+
}),
|
|
1900
|
+
stateRoot: this.stateRoot,
|
|
1901
|
+
workspaceDir: args.harnessCwd,
|
|
1902
|
+
},
|
|
1903
|
+
});
|
|
1904
|
+
if (settled.ok) {
|
|
1905
|
+
return Object.assign(Object.assign({}, outcome), { result: settled.text, usage });
|
|
1906
|
+
}
|
|
1907
|
+
if (settled.kind === "error" || repairs >= RESULT_REPAIR_BUDGET) {
|
|
1908
|
+
return {
|
|
1909
|
+
status: "error",
|
|
1910
|
+
result: outcome.result,
|
|
1911
|
+
errorMessage: `turn output failed: ${settled.message}`,
|
|
1912
|
+
usage,
|
|
1913
|
+
};
|
|
1914
|
+
}
|
|
1915
|
+
repairs += 1;
|
|
1916
|
+
// Close the rejected stream without posting it (empty `stop`)
|
|
1917
|
+
// so Slack does not append a repair onto that block, and so an
|
|
1918
|
+
// empty repair cannot recommit `lastAssistantText`.
|
|
1919
|
+
args.mapper.abandonPendingText();
|
|
1920
|
+
this.logger(`[session] ${args.record.sessionId} ${args.turnId} result rejected; repairing (${repairs}/${RESULT_REPAIR_BUDGET})`);
|
|
1921
|
+
const repairRequest = yield this.buildTurnRequest(args.record, args.turnId, resultRepairPrompt(settled.message), false, args.emit, args.eventContext, args.onUpdate, args.signal);
|
|
1922
|
+
const repaired = yield this.runTurnExecute(args.record, args.turnId, () => this.runner.runTurn(repairRequest));
|
|
1923
|
+
usage = addTurnUsage(usage, repaired.usage);
|
|
1924
|
+
if (repaired.status !== "finished") {
|
|
1925
|
+
return Object.assign(Object.assign({}, repaired), { usage });
|
|
1926
|
+
}
|
|
1927
|
+
outcome = Object.assign(Object.assign({}, repaired), { usage });
|
|
1928
|
+
}
|
|
1929
|
+
});
|
|
1930
|
+
}
|
|
1746
1931
|
/**
|
|
1747
1932
|
* Sync authored skills onto the Agent Store at `skills/<name>/…` (hosted)
|
|
1748
1933
|
* or `agent-serve/<agent>/skills/<name>/…` (personal-key local+cloud)
|
|
@@ -1821,7 +2006,7 @@ export class SessionEngine {
|
|
|
1821
2006
|
}
|
|
1822
2007
|
clearPendingWorkspaceFiles(sessionId, pending) {
|
|
1823
2008
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1824
|
-
yield this.updateRecord(sessionId,
|
|
2009
|
+
yield this.updateRecord(sessionId, current => (Object.assign(Object.assign({}, current), { pendingWorkspaceFiles: current.pendingWorkspaceFiles === pending
|
|
1825
2010
|
? undefined
|
|
1826
2011
|
: current.pendingWorkspaceFiles })));
|
|
1827
2012
|
});
|
|
@@ -1843,7 +2028,7 @@ export class SessionEngine {
|
|
|
1843
2028
|
if (inFlight !== undefined) {
|
|
1844
2029
|
return inFlight;
|
|
1845
2030
|
}
|
|
1846
|
-
let sync = run().then(() => true,
|
|
2031
|
+
let sync = run().then(() => true, error => {
|
|
1847
2032
|
this.logger(`[${surface}] ${store.label} sync failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
1848
2033
|
return false;
|
|
1849
2034
|
});
|
|
@@ -1858,11 +2043,17 @@ export class SessionEngine {
|
|
|
1858
2043
|
/**
|
|
1859
2044
|
* Hosted deployments own the deployment store. Local `serve`/`run` with
|
|
1860
2045
|
* a personal API key writes into the USER store under `agent-serve/`.
|
|
2046
|
+
* A persistent deployment's version container has no cloud store at all:
|
|
2047
|
+
* its state directory is the durable copy, and its service-account key
|
|
2048
|
+
* must not be mistaken for a personal one.
|
|
1861
2049
|
*/
|
|
1862
2050
|
cloudStore() {
|
|
1863
2051
|
const v2Hosting = resolveAgentV2Hosting({
|
|
1864
2052
|
architecture: this.project.agent.architecture,
|
|
1865
2053
|
});
|
|
2054
|
+
if (v2Hosting.kind === "cursor-managed-persistent") {
|
|
2055
|
+
return undefined;
|
|
2056
|
+
}
|
|
1866
2057
|
const deployment = {
|
|
1867
2058
|
mountPath: DEPLOYMENT_STORE_MOUNT_PATH,
|
|
1868
2059
|
skillsPrefix: agentStoreKeys.skillsPrefix(),
|
|
@@ -1892,7 +2083,7 @@ export class SessionEngine {
|
|
|
1892
2083
|
}
|
|
1893
2084
|
return undefined;
|
|
1894
2085
|
}
|
|
1895
|
-
buildTurnRequest(record, turnId, prompt, isFirstTurn,
|
|
2086
|
+
buildTurnRequest(record, turnId, prompt, isFirstTurn, emit, eventContext, onUpdate, signal, images) {
|
|
1896
2087
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1897
2088
|
var _a, _b, _c;
|
|
1898
2089
|
var _d;
|
|
@@ -1926,7 +2117,7 @@ export class SessionEngine {
|
|
|
1926
2117
|
// per-session tools or identity is worse than a refused one. Non-local
|
|
1927
2118
|
// agents already fail discovery; this guards hybrid agents' per-send
|
|
1928
2119
|
// cloud sessions.
|
|
1929
|
-
const perSessionConnection = agent.connections.find(
|
|
2120
|
+
const perSessionConnection = agent.connections.find(connection => connection.advertiseTools === true || connection.auth !== undefined);
|
|
1930
2121
|
if (runtime !== "local" && perSessionConnection !== undefined) {
|
|
1931
2122
|
throw new Error(`Agent "${agent.name}" connection "${perSessionConnection.name}" uses advertiseTools/auth, which only run on local turns. Refusing the session rather than running it without the connection's tools or identity.`);
|
|
1932
2123
|
}
|
|
@@ -1967,7 +2158,7 @@ export class SessionEngine {
|
|
|
1967
2158
|
? []
|
|
1968
2159
|
: this.withTurnScratchTools(authoredRoot
|
|
1969
2160
|
? fileTools
|
|
1970
|
-
: fileTools.filter(
|
|
2161
|
+
: fileTools.filter(tool => tool.name !== "SemanticSearch"), record.sessionId);
|
|
1971
2162
|
let turnPrompt = prompt;
|
|
1972
2163
|
if (isFirstTurn) {
|
|
1973
2164
|
const contextBlock = buildSessionContextBlock({
|
|
@@ -2029,6 +2220,7 @@ export class SessionEngine {
|
|
|
2029
2220
|
}
|
|
2030
2221
|
}
|
|
2031
2222
|
else if (pending !== undefined && Object.keys(pending).length > 0) {
|
|
2223
|
+
this.logger(`[workspace] no cloud store on this hosting; dropping workspaceFiles for session ${record.sessionId}: ${Object.keys(pending).join(", ")}`);
|
|
2032
2224
|
yield this.clearPendingWorkspaceFiles(record.sessionId, pending);
|
|
2033
2225
|
}
|
|
2034
2226
|
if (isFirstTurn && hosted) {
|
|
@@ -2036,33 +2228,23 @@ export class SessionEngine {
|
|
|
2036
2228
|
}
|
|
2037
2229
|
if (preamble !== "" || sections.length > 0) {
|
|
2038
2230
|
turnPrompt = [preamble, ...sections, turnPrompt]
|
|
2039
|
-
.filter(
|
|
2231
|
+
.filter(part => part !== "")
|
|
2040
2232
|
.join("\n\n");
|
|
2041
2233
|
}
|
|
2042
2234
|
}
|
|
2043
2235
|
else if (isFirstTurn && runtime === "local" && authoredRoot) {
|
|
2044
|
-
//
|
|
2045
|
-
|
|
2046
|
-
const preamble = buildAgentsMdContent(Object.assign(Object.assign({}, agent), { tools: [...agent.tools, ...synthesized] }), { includeScripts: true });
|
|
2047
|
-
const workspaceInfo = `<user_info>\nWorkspace Path: /\n</user_info>`;
|
|
2048
|
-
turnPrompt =
|
|
2049
|
-
preamble === ""
|
|
2050
|
-
? `${workspaceInfo}\n\n${turnPrompt}`
|
|
2051
|
-
: `${workspaceInfo}\n\n${preamble}\n\n${turnPrompt}`;
|
|
2052
|
-
}
|
|
2053
|
-
else if (isFirstTurn &&
|
|
2054
|
-
runtime === "local" &&
|
|
2055
|
-
instructionsInvisibleToHarness) {
|
|
2056
|
-
// Local workspace whose AGENTS.md the harness will not load. With a
|
|
2057
|
-
// borrowed harness cwd, agent tool scripts live only in the durable
|
|
2058
|
-
// scaffold dir — embed bodies like cloud. Otherwise the catalog can
|
|
2059
|
-
// reference on-disk paths under the harness cwd. Grokbot turns are
|
|
2060
|
-
// excluded: their instructions ride the request's `instructions`
|
|
2061
|
-
// field into the Sand system prompt instead.
|
|
2062
|
-
const includeScripts = this.hasBorrowedWorkspace(record);
|
|
2063
|
-
const preamble = buildAgentsMdContent(agent, { includeScripts });
|
|
2064
|
-
turnPrompt = `${preamble}\n\n${turnPrompt}`;
|
|
2236
|
+
// The harness reports no path for a root it never mounted.
|
|
2237
|
+
turnPrompt = `<user_info>\nWorkspace Path: /\n</user_info>\n\n${turnPrompt}`;
|
|
2065
2238
|
}
|
|
2239
|
+
// A virtual root has no scaffold dir either, so its catalog carries the
|
|
2240
|
+
// synthesized file tools and embedded script bodies.
|
|
2241
|
+
const localInstructions = runtime === "local"
|
|
2242
|
+
? authoredRoot
|
|
2243
|
+
? buildAgentsMdContent(Object.assign(Object.assign({}, agent), { tools: [...agent.tools, ...synthesized] }), { includeScripts: true })
|
|
2244
|
+
: buildAgentsMdContent(agent, {
|
|
2245
|
+
includeScripts: this.hasBorrowedWorkspace(record),
|
|
2246
|
+
})
|
|
2247
|
+
: undefined;
|
|
2066
2248
|
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ sessionId: record.sessionId }, (record.sdkAgentId === undefined
|
|
2067
2249
|
? {}
|
|
2068
2250
|
: { sdkAgentId: record.sdkAgentId })), { workspaceDir: this.harnessCwd(record), sandbox: authoredRoot ? false : ((_c = agent.local) === null || _c === void 0 ? void 0 : _c.sandbox) === true }), (runtime === "local" && harnessTools !== undefined
|
|
@@ -2071,30 +2253,35 @@ export class SessionEngine {
|
|
|
2071
2253
|
: { tools: harnessTools.tools })), (harnessTools.disallowedTools === undefined
|
|
2072
2254
|
? {}
|
|
2073
2255
|
: { disallowedTools: harnessTools.disallowedTools })) : {})), { runnerStateDir: join(this.stateRoot, "runner"), prompt: turnPrompt, isFirstTurn }), (images !== undefined && images.length > 0 ? { images } : {})), (agent.model === undefined ? {} : { model: agent.model })), { runtime, agentName: agent.name }), (mergedCloud === undefined ? {} : { cloud: mergedCloud })), {
|
|
2074
|
-
//
|
|
2075
|
-
// turns carry
|
|
2076
|
-
//
|
|
2077
|
-
// the
|
|
2078
|
-
//
|
|
2256
|
+
// Local turns send the composed instructions as the harness system
|
|
2257
|
+
// prompt; grokbot turns carry them into the hosted session, which
|
|
2258
|
+
// surfaces them in the Sand system prompt. Cloud turns inline them into
|
|
2259
|
+
// the first prompt above instead. Script bodies are embedded whenever
|
|
2260
|
+
// the harness cannot reach the scaffold dir: always for grokbot (the
|
|
2261
|
+
// box never sees the session workspace) and for a borrowed local cwd
|
|
2262
|
+
// (PR worktree, shared checkout); otherwise the catalog references the
|
|
2263
|
+
// on-disk paths under the harness cwd.
|
|
2079
2264
|
instructions: runtime === "grokbot"
|
|
2080
2265
|
? buildAgentsMdContent(agent, { includeScripts: true })
|
|
2081
|
-
:
|
|
2266
|
+
: localInstructions }), (runtime === "cloud" && !isCursorHostedFilesAvailable()
|
|
2082
2267
|
? { agentServeAgent: this.project.name }
|
|
2083
2268
|
: {})), { customTools: runtime === "local"
|
|
2084
2269
|
? yield this.buildCustomTools(record, turnId, emit, synthesized)
|
|
2085
|
-
: {}, mcpServers: this.buildMcpServers(runtime, record.sessionId, yield this.evaluateConnectionAuth(record)) }), (runtime === "local" &&
|
|
2270
|
+
: {}, mcpServers: this.buildMcpServers(runtime, record.sessionId, yield this.evaluateConnectionAuth(record)) }), (runtime === "local" &&
|
|
2271
|
+
(this.hasAttachedAuthedConnections() ||
|
|
2272
|
+
this.project.agent.connections.some(connection => isCursorAccountTransport(connection.transport)))
|
|
2086
2273
|
? { perSendMcpServers: true }
|
|
2087
2274
|
: {})), { subagents: buildRunnerSubagents(agent), onUpdate,
|
|
2088
2275
|
signal,
|
|
2089
2276
|
// Local follow-ups expire any lingering active run so a preempted turn
|
|
2090
2277
|
// (or one orphaned by a crashed process) never blocks this send.
|
|
2091
|
-
forceExpireActiveRun: runtime === "local" && !isFirstTurn, onRequestId:
|
|
2278
|
+
forceExpireActiveRun: runtime === "local" && !isFirstTurn, onRequestId: requestId => {
|
|
2092
2279
|
emit({ type: "turn.bound", data: { requestId } });
|
|
2093
2280
|
}, onSdkAgentId: (sdkAgentId) => __awaiter(this, void 0, void 0, function* () {
|
|
2094
2281
|
if (record.sdkAgentId === sdkAgentId) {
|
|
2095
2282
|
return;
|
|
2096
2283
|
}
|
|
2097
|
-
yield this.updateRecord(record.sessionId,
|
|
2284
|
+
yield this.updateRecord(record.sessionId, current => (Object.assign(Object.assign({}, current), { sdkAgentId })));
|
|
2098
2285
|
record.sdkAgentId = sdkAgentId;
|
|
2099
2286
|
eventContext.session = Object.assign(Object.assign({}, eventContext.session), { sdkAgentId });
|
|
2100
2287
|
yield this.appendEvent(record.sessionId, {
|
|
@@ -2173,9 +2360,9 @@ export class SessionEngine {
|
|
|
2173
2360
|
// Advertised connections surface as named server tools instead of an
|
|
2174
2361
|
// attached MCP server (each tool appears exactly once).
|
|
2175
2362
|
const advertisedNames = new Set(this.project.agent.connections
|
|
2176
|
-
.filter(
|
|
2177
|
-
.map(
|
|
2178
|
-
const hostConnectionNames = new Set(((_a = this.project.agent.hostConnections) !== null && _a !== void 0 ? _a : []).map(
|
|
2363
|
+
.filter(connection => connection.advertiseTools === true)
|
|
2364
|
+
.map(connection => connection.name));
|
|
2365
|
+
const hostConnectionNames = new Set(((_a = this.project.agent.hostConnections) !== null && _a !== void 0 ? _a : []).map(connection => connection.name));
|
|
2179
2366
|
const bridgedNames = new Set(runtime === "cloud" &&
|
|
2180
2367
|
sessionId !== undefined &&
|
|
2181
2368
|
this.cloudServerToolsConnection !== undefined &&
|
|
@@ -2184,7 +2371,7 @@ export class SessionEngine {
|
|
|
2184
2371
|
: []);
|
|
2185
2372
|
assertCloudCanHonorAccountServersFilters({
|
|
2186
2373
|
runtime,
|
|
2187
|
-
resolvedConnections: this.resolvedConnections.filter(
|
|
2374
|
+
resolvedConnections: this.resolvedConnections.filter(resolved => !advertisedNames.has(resolved.name) &&
|
|
2188
2375
|
!hostConnectionNames.has(resolved.name)),
|
|
2189
2376
|
bridgedNames,
|
|
2190
2377
|
});
|
|
@@ -2245,6 +2432,18 @@ export class SessionEngine {
|
|
|
2245
2432
|
}
|
|
2246
2433
|
continue;
|
|
2247
2434
|
}
|
|
2435
|
+
const authored = this.authoredConnection(resolved.name);
|
|
2436
|
+
if (sessionId !== undefined &&
|
|
2437
|
+
authored !== undefined &&
|
|
2438
|
+
isCursorAccountTransport(authored.transport)) {
|
|
2439
|
+
const bound = new URL(url);
|
|
2440
|
+
bound.searchParams.set("agentkitSessionId", sessionId);
|
|
2441
|
+
servers[resolved.name] = {
|
|
2442
|
+
url: bound.toString(),
|
|
2443
|
+
headers: resolved.headers,
|
|
2444
|
+
};
|
|
2445
|
+
continue;
|
|
2446
|
+
}
|
|
2248
2447
|
servers[resolved.name] = {
|
|
2249
2448
|
url,
|
|
2250
2449
|
headers: resolved.headers,
|
|
@@ -2253,7 +2452,7 @@ export class SessionEngine {
|
|
|
2253
2452
|
if (runtime === "cloud" &&
|
|
2254
2453
|
sessionId !== undefined &&
|
|
2255
2454
|
this.cloudServerToolsConnection !== undefined &&
|
|
2256
|
-
this.project.agent.tools.some(
|
|
2455
|
+
this.project.agent.tools.some(tool => tool.execution === "server")) {
|
|
2257
2456
|
if (servers[SERVER_TOOLS_MCP_SERVER_NAME] !== undefined) {
|
|
2258
2457
|
throw new Error(`MCP connection name "${SERVER_TOOLS_MCP_SERVER_NAME}" is reserved for authored server tools on cloud turns.`);
|
|
2259
2458
|
}
|
|
@@ -2273,7 +2472,7 @@ export class SessionEngine {
|
|
|
2273
2472
|
* ride every send instead of being pinned on the cached agent handle.
|
|
2274
2473
|
*/
|
|
2275
2474
|
hasAttachedAuthedConnections() {
|
|
2276
|
-
return this.project.agent.connections.some(
|
|
2475
|
+
return this.project.agent.connections.some(connection => connection.auth !== undefined && connection.advertiseTools !== true);
|
|
2277
2476
|
}
|
|
2278
2477
|
/**
|
|
2279
2478
|
* Evaluate per-session connection auth (`defineConnection({ auth })`)
|
|
@@ -2284,7 +2483,7 @@ export class SessionEngine {
|
|
|
2284
2483
|
*/
|
|
2285
2484
|
evaluateConnectionAuth(record) {
|
|
2286
2485
|
return __awaiter(this, void 0, void 0, function* () {
|
|
2287
|
-
const authed = this.project.agent.connections.filter(
|
|
2486
|
+
const authed = this.project.agent.connections.filter(connection => connection.auth !== undefined && connection.advertiseTools !== true);
|
|
2288
2487
|
if (authed.length === 0) {
|
|
2289
2488
|
return undefined;
|
|
2290
2489
|
}
|
|
@@ -2372,7 +2571,7 @@ export class SessionEngine {
|
|
|
2372
2571
|
if (active === undefined) {
|
|
2373
2572
|
return toolErrorResult(`Session ${sessionId} has no active turn for tool "${toolName}".`);
|
|
2374
2573
|
}
|
|
2375
|
-
const tool = this.project.agent.tools.find(
|
|
2574
|
+
const tool = this.project.agent.tools.find(candidate => candidate.name === toolName && candidate.execution === "server");
|
|
2376
2575
|
if (tool === undefined) {
|
|
2377
2576
|
return toolErrorResult(`Unknown server tool "${toolName}".`);
|
|
2378
2577
|
}
|
|
@@ -2526,8 +2725,8 @@ export class SessionEngine {
|
|
|
2526
2725
|
requestedAt,
|
|
2527
2726
|
};
|
|
2528
2727
|
const resolutionPromise = this.approvals.wait(args.sessionId, pendingRecord);
|
|
2529
|
-
yield this.updateRecord(args.sessionId,
|
|
2530
|
-
...((_a = current.pendingApprovals) !== null && _a !== void 0 ? _a : []).filter(
|
|
2728
|
+
yield this.updateRecord(args.sessionId, current => { var _a; return (Object.assign(Object.assign({}, current), { pendingApprovals: [
|
|
2729
|
+
...((_a = current.pendingApprovals) !== null && _a !== void 0 ? _a : []).filter(item => item.callId !== args.callId),
|
|
2531
2730
|
pendingRecord,
|
|
2532
2731
|
] })); });
|
|
2533
2732
|
args.emit({
|
|
@@ -2540,7 +2739,7 @@ export class SessionEngine {
|
|
|
2540
2739
|
});
|
|
2541
2740
|
this.logger(`[session] tool ${args.toolName} awaiting approval (${args.callId})`);
|
|
2542
2741
|
const { decision, by } = yield resolutionPromise;
|
|
2543
|
-
yield this.updateRecord(args.sessionId,
|
|
2742
|
+
yield this.updateRecord(args.sessionId, current => { var _a; return (Object.assign(Object.assign({}, current), { pendingApprovals: ((_a = current.pendingApprovals) !== null && _a !== void 0 ? _a : []).filter(item => item.callId !== args.callId) })); });
|
|
2544
2743
|
args.emit({
|
|
2545
2744
|
type: "action.approval_resolved",
|
|
2546
2745
|
data: Object.assign({ callId: args.callId, toolName: args.toolName, decision }, (by === undefined ? {} : { by })),
|
|
@@ -2557,7 +2756,7 @@ export class SessionEngine {
|
|
|
2557
2756
|
current.pendingApprovals.length === 0) {
|
|
2558
2757
|
return;
|
|
2559
2758
|
}
|
|
2560
|
-
yield this.updateRecord(sessionId,
|
|
2759
|
+
yield this.updateRecord(sessionId, record => (Object.assign(Object.assign({}, record), { pendingApprovals: [] })));
|
|
2561
2760
|
});
|
|
2562
2761
|
}
|
|
2563
2762
|
/** Pending tool approvals for a session (live waiters ∪ persisted). */
|
|
@@ -2594,7 +2793,7 @@ export class SessionEngine {
|
|
|
2594
2793
|
if (!samePrincipal(record.auth, ownershipAuth)) {
|
|
2595
2794
|
throw new SessionAuthError(sessionId);
|
|
2596
2795
|
}
|
|
2597
|
-
const pending = (_b = ((_a = record.pendingApprovals) !== null && _a !== void 0 ? _a : []).find(
|
|
2796
|
+
const pending = (_b = ((_a = record.pendingApprovals) !== null && _a !== void 0 ? _a : []).find(item => item.callId === callId)) !== null && _b !== void 0 ? _b : this.approvals.list(sessionId).find(item => item.callId === callId);
|
|
2598
2797
|
if (pending === undefined) {
|
|
2599
2798
|
throw new ApprovalNotFoundError(sessionId, callId);
|
|
2600
2799
|
}
|
|
@@ -2608,21 +2807,21 @@ export class SessionEngine {
|
|
|
2608
2807
|
}
|
|
2609
2808
|
removePendingApproval(sessionId, callId) {
|
|
2610
2809
|
return __awaiter(this, void 0, void 0, function* () {
|
|
2611
|
-
yield this.updateRecord(sessionId,
|
|
2810
|
+
yield this.updateRecord(sessionId, current => { var _a; return (Object.assign(Object.assign({}, current), { pendingApprovals: ((_a = current.pendingApprovals) !== null && _a !== void 0 ? _a : []).filter(item => item.callId !== callId) })); });
|
|
2612
2811
|
});
|
|
2613
2812
|
}
|
|
2614
2813
|
wrapMcp(inner) {
|
|
2615
2814
|
return {
|
|
2616
2815
|
names: () => inner.names(),
|
|
2617
|
-
listTools:
|
|
2816
|
+
listTools: name => this.withMcpAuth(name, () => inner.listTools(name)),
|
|
2618
2817
|
callTool: (name, tool, args) => this.withMcpAuth(name, () => inner.callTool(name, tool, args)),
|
|
2619
2818
|
};
|
|
2620
2819
|
}
|
|
2621
2820
|
advertiseMcp() {
|
|
2622
2821
|
return {
|
|
2623
|
-
listTools:
|
|
2822
|
+
listTools: name => this.withMcpListAuth(name, () => this.mcpHost.listTools(name)),
|
|
2624
2823
|
callTool: (name, tool, args) => this.withMcpAuth(name, () => this.mcpHost.callTool(name, tool, args)),
|
|
2625
|
-
oneOff:
|
|
2824
|
+
oneOff: connection => {
|
|
2626
2825
|
const inner = this.mcpHost.oneOff(connection);
|
|
2627
2826
|
return {
|
|
2628
2827
|
listTools: () => this.withMcpListAuth(connection.name, () => inner.listTools()),
|
|
@@ -2743,8 +2942,8 @@ export class SessionEngine {
|
|
|
2743
2942
|
requestedAt,
|
|
2744
2943
|
};
|
|
2745
2944
|
const resolutionPromise = this.auths.wait(args.sessionId, pendingRecord);
|
|
2746
|
-
yield this.updateRecord(args.sessionId,
|
|
2747
|
-
...((_a = current.pendingAuths) !== null && _a !== void 0 ? _a : []).filter(
|
|
2945
|
+
yield this.updateRecord(args.sessionId, current => { var _a; return (Object.assign(Object.assign({}, current), { pendingAuths: [
|
|
2946
|
+
...((_a = current.pendingAuths) !== null && _a !== void 0 ? _a : []).filter(item => item.callId !== args.callId),
|
|
2748
2947
|
pendingRecord,
|
|
2749
2948
|
] })); });
|
|
2750
2949
|
args.emit({
|
|
@@ -2758,7 +2957,7 @@ export class SessionEngine {
|
|
|
2758
2957
|
});
|
|
2759
2958
|
this.logger(`[session] tool ${args.toolName} awaiting MCP auth ${args.connection} (${args.callId})`);
|
|
2760
2959
|
const { decision, by } = yield resolutionPromise;
|
|
2761
|
-
yield this.updateRecord(args.sessionId,
|
|
2960
|
+
yield this.updateRecord(args.sessionId, current => { var _a; return (Object.assign(Object.assign({}, current), { pendingAuths: ((_a = current.pendingAuths) !== null && _a !== void 0 ? _a : []).filter(item => item.callId !== args.callId) })); });
|
|
2762
2961
|
args.emit({
|
|
2763
2962
|
type: "action.auth_resolved",
|
|
2764
2963
|
data: {
|
|
@@ -2782,7 +2981,7 @@ export class SessionEngine {
|
|
|
2782
2981
|
current.pendingAuths.length === 0) {
|
|
2783
2982
|
return;
|
|
2784
2983
|
}
|
|
2785
|
-
yield this.updateRecord(sessionId,
|
|
2984
|
+
yield this.updateRecord(sessionId, record => (Object.assign(Object.assign({}, record), { pendingAuths: [] })));
|
|
2786
2985
|
});
|
|
2787
2986
|
}
|
|
2788
2987
|
listPendingAuths(sessionId) {
|
|
@@ -2810,7 +3009,7 @@ export class SessionEngine {
|
|
|
2810
3009
|
if (!samePrincipal(record.auth, ownershipAuth)) {
|
|
2811
3010
|
throw new SessionAuthError(sessionId);
|
|
2812
3011
|
}
|
|
2813
|
-
const pending = (_b = ((_a = record.pendingAuths) !== null && _a !== void 0 ? _a : []).find(
|
|
3012
|
+
const pending = (_b = ((_a = record.pendingAuths) !== null && _a !== void 0 ? _a : []).find(item => item.callId === callId)) !== null && _b !== void 0 ? _b : this.auths.list(sessionId).find(item => item.callId === callId);
|
|
2814
3013
|
if (pending === undefined) {
|
|
2815
3014
|
throw new AuthNotFoundError(sessionId, callId);
|
|
2816
3015
|
}
|
|
@@ -2827,7 +3026,7 @@ export class SessionEngine {
|
|
|
2827
3026
|
}
|
|
2828
3027
|
removePendingAuth(sessionId, callId) {
|
|
2829
3028
|
return __awaiter(this, void 0, void 0, function* () {
|
|
2830
|
-
yield this.updateRecord(sessionId,
|
|
3029
|
+
yield this.updateRecord(sessionId, current => { var _a; return (Object.assign(Object.assign({}, current), { pendingAuths: ((_a = current.pendingAuths) !== null && _a !== void 0 ? _a : []).filter(item => item.callId !== callId) })); });
|
|
2831
3030
|
});
|
|
2832
3031
|
}
|
|
2833
3032
|
runWithMcpPark(sessionId, toolName, fn) {
|
|
@@ -2977,16 +3176,16 @@ export class SessionEngine {
|
|
|
2977
3176
|
*/
|
|
2978
3177
|
describeCatalogTool(toolName_1) {
|
|
2979
3178
|
return __awaiter(this, arguments, void 0, function* (toolName, options = {}) {
|
|
2980
|
-
const authored = this.project.agent.tools.find(
|
|
3179
|
+
const authored = this.project.agent.tools.find(tool => tool.name === toolName);
|
|
2981
3180
|
if (authored !== undefined) {
|
|
2982
3181
|
return { tool: authored };
|
|
2983
3182
|
}
|
|
2984
3183
|
const catalog = yield this.listCatalogTools(options);
|
|
2985
|
-
const tool = catalog.tools.find(
|
|
3184
|
+
const tool = catalog.tools.find(entry => entry.name === toolName);
|
|
2986
3185
|
if (tool === undefined) {
|
|
2987
3186
|
return {
|
|
2988
3187
|
tool: undefined,
|
|
2989
|
-
availableTools: catalog.tools.map(
|
|
3188
|
+
availableTools: catalog.tools.map(entry => entry.name),
|
|
2990
3189
|
connectionErrors: catalog.connectionErrors,
|
|
2991
3190
|
};
|
|
2992
3191
|
}
|
|
@@ -3024,9 +3223,9 @@ export class SessionEngine {
|
|
|
3024
3223
|
if (native !== undefined) {
|
|
3025
3224
|
return native;
|
|
3026
3225
|
}
|
|
3027
|
-
let tool = this.project.agent.tools.find(
|
|
3226
|
+
let tool = this.project.agent.tools.find(t => t.name === toolName);
|
|
3028
3227
|
if (tool === undefined &&
|
|
3029
|
-
this.project.agent.connections.some(
|
|
3228
|
+
this.project.agent.connections.some(c => c.advertiseTools === true)) {
|
|
3030
3229
|
// Advertised passthroughs are ordinary server tools in the session's
|
|
3031
3230
|
// namespace; resolve the live listing so direct calls address them by
|
|
3032
3231
|
// the same model-facing name a turn would. A listing failure fails
|
|
@@ -3036,12 +3235,12 @@ export class SessionEngine {
|
|
|
3036
3235
|
session,
|
|
3037
3236
|
hostMcp: this.advertiseMcp(),
|
|
3038
3237
|
});
|
|
3039
|
-
tool = advertised.find(
|
|
3238
|
+
tool = advertised.find(t => t.name === toolName);
|
|
3040
3239
|
}
|
|
3041
3240
|
if (tool === undefined) {
|
|
3042
3241
|
throw new UnknownToolError(toolName, this.project.agent.tools
|
|
3043
|
-
.filter(
|
|
3044
|
-
.map(
|
|
3242
|
+
.filter(t => t.execution === "server")
|
|
3243
|
+
.map(t => t.name));
|
|
3045
3244
|
}
|
|
3046
3245
|
const execute = tool.definition.execute;
|
|
3047
3246
|
if (tool.execution !== "server" || typeof execute !== "function") {
|
|
@@ -3320,7 +3519,7 @@ export class SessionEngine {
|
|
|
3320
3519
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3321
3520
|
try {
|
|
3322
3521
|
const listed = yield this.host.mcp.listTools(connectionName);
|
|
3323
|
-
return listed.find(
|
|
3522
|
+
return listed.find(tool => tool.name === toolName);
|
|
3324
3523
|
}
|
|
3325
3524
|
catch (_a) {
|
|
3326
3525
|
return undefined;
|
|
@@ -3347,7 +3546,7 @@ export class SessionEngine {
|
|
|
3347
3546
|
const chain = (_b = this.dispatchChains.get(sessionId)) !== null && _b !== void 0 ? _b : Promise.resolve();
|
|
3348
3547
|
const next = chain
|
|
3349
3548
|
.then(() => this.dispatchEvent(sessionId, event, context))
|
|
3350
|
-
.catch(
|
|
3549
|
+
.catch(error => {
|
|
3351
3550
|
this.logger(`[agent-sdk] event dispatch failed for ${sessionId}: ${describeError(error)}`);
|
|
3352
3551
|
})
|
|
3353
3552
|
.then(() => {
|
|
@@ -3406,12 +3605,12 @@ export class SessionEngine {
|
|
|
3406
3605
|
}
|
|
3407
3606
|
if (context === undefined || channelStateBefore === undefined) {
|
|
3408
3607
|
// Handlers mutate live channel state in place; save the current record.
|
|
3409
|
-
yield this.updateRecord(sessionId,
|
|
3608
|
+
yield this.updateRecord(sessionId, current => (Object.assign({}, current)));
|
|
3410
3609
|
}
|
|
3411
3610
|
else {
|
|
3412
3611
|
const updatedState = channelCtx.state;
|
|
3413
3612
|
context.channelState = updatedState;
|
|
3414
|
-
yield this.updateRecord(sessionId,
|
|
3613
|
+
yield this.updateRecord(sessionId, current => (Object.assign(Object.assign({}, current), { channelState: mergeChannelStateMutation({
|
|
3415
3614
|
current: current.channelState,
|
|
3416
3615
|
before: channelStateBefore,
|
|
3417
3616
|
after: updatedState,
|
|
@@ -3484,8 +3683,10 @@ export class SessionEngine {
|
|
|
3484
3683
|
var _a;
|
|
3485
3684
|
// Drain admission first so pendingTurns → activeTurns is visible before we
|
|
3486
3685
|
// decide the session is idle (reminders use this for queueBehindTurn).
|
|
3487
|
-
//
|
|
3488
|
-
// follow-up
|
|
3686
|
+
// Wait for coalesce drain and any successor turn so hosted execute does
|
|
3687
|
+
// not park mid-follow-up, but report the root turn's outcome: a drained
|
|
3688
|
+
// successor failure must not un-ACK an already-finished owner.
|
|
3689
|
+
let root;
|
|
3489
3690
|
for (;;) {
|
|
3490
3691
|
const chain = this.admissionChains.get(sessionId);
|
|
3491
3692
|
if (chain !== undefined) {
|
|
@@ -3493,14 +3694,15 @@ export class SessionEngine {
|
|
|
3493
3694
|
}
|
|
3494
3695
|
const active = this.activeTurns.get(sessionId);
|
|
3495
3696
|
if (active !== undefined) {
|
|
3496
|
-
yield active;
|
|
3697
|
+
const outcome = yield active;
|
|
3698
|
+
root !== null && root !== void 0 ? root : (root = outcome);
|
|
3497
3699
|
continue;
|
|
3498
3700
|
}
|
|
3499
3701
|
const dispatch = this.dispatchChains.get(sessionId);
|
|
3500
3702
|
if (dispatch !== undefined) {
|
|
3501
3703
|
yield dispatch.catch(() => { });
|
|
3502
3704
|
}
|
|
3503
|
-
return (_a = this.lastOutcomes.get(sessionId)) !== null && _a !== void 0 ? _a : { status: "finished" };
|
|
3705
|
+
return (_a = root !== null && root !== void 0 ? root : this.lastOutcomes.get(sessionId)) !== null && _a !== void 0 ? _a : { status: "finished" };
|
|
3504
3706
|
}
|
|
3505
3707
|
});
|
|
3506
3708
|
}
|
|
@@ -3534,7 +3736,7 @@ export class SessionEngine {
|
|
|
3534
3736
|
return records;
|
|
3535
3737
|
}
|
|
3536
3738
|
const owned = yield this.ownedSessionIds(caller);
|
|
3537
|
-
return records.filter(
|
|
3739
|
+
return records.filter(record => record.sessionId !== undefined && owned.has(record.sessionId));
|
|
3538
3740
|
});
|
|
3539
3741
|
}
|
|
3540
3742
|
/**
|
|
@@ -3565,8 +3767,8 @@ export class SessionEngine {
|
|
|
3565
3767
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3566
3768
|
const sessions = yield this.sessions.list();
|
|
3567
3769
|
return new Set(sessions
|
|
3568
|
-
.filter(
|
|
3569
|
-
.map(
|
|
3770
|
+
.filter(record => samePrincipal(record.auth, caller))
|
|
3771
|
+
.map(record => record.sessionId));
|
|
3570
3772
|
});
|
|
3571
3773
|
}
|
|
3572
3774
|
/**
|
|
@@ -3686,8 +3888,8 @@ export class SessionEngine {
|
|
|
3686
3888
|
}
|
|
3687
3889
|
summarizeSessionRecords(records, caller, includeAll) {
|
|
3688
3890
|
return records
|
|
3689
|
-
.filter(
|
|
3690
|
-
.map(
|
|
3891
|
+
.filter(record => includeAll || samePrincipal(record.auth, caller))
|
|
3892
|
+
.map(record => {
|
|
3691
3893
|
var _a;
|
|
3692
3894
|
const links = sessionExternalLinks(record);
|
|
3693
3895
|
return {
|
|
@@ -3737,7 +3939,7 @@ export class SessionEngine {
|
|
|
3737
3939
|
if (existing === undefined) {
|
|
3738
3940
|
throw new Error(`Unknown session: ${sessionId}`);
|
|
3739
3941
|
}
|
|
3740
|
-
const record = yield this.updateRecord(sessionId,
|
|
3942
|
+
const record = yield this.updateRecord(sessionId, current => (Object.assign(Object.assign({}, current), { turnCount: current.turnCount + 1 })));
|
|
3741
3943
|
const turnId = `turn_${record.turnCount}`;
|
|
3742
3944
|
yield this.appendEvent(sessionId, {
|
|
3743
3945
|
type: "turn.started",
|
|
@@ -3852,7 +4054,7 @@ export class SessionEngine {
|
|
|
3852
4054
|
return pending;
|
|
3853
4055
|
}
|
|
3854
4056
|
const work = this.runCloudTurnCostBackfill(sessionId)
|
|
3855
|
-
.catch(
|
|
4057
|
+
.catch(error => {
|
|
3856
4058
|
this.logger(`[agent-sdk] cloud cost backfill failed for ${sessionId}: ${describeError(error)}`);
|
|
3857
4059
|
})
|
|
3858
4060
|
.finally(() => {
|
|
@@ -3867,9 +4069,9 @@ export class SessionEngine {
|
|
|
3867
4069
|
var _b, _c;
|
|
3868
4070
|
const log = yield this.logs.get(sessionId);
|
|
3869
4071
|
const events = yield log.snapshot(0);
|
|
3870
|
-
if (!events.some(
|
|
4072
|
+
if (!events.some(event => isUnpricedCompletedTurn(event))) {
|
|
3871
4073
|
if (!this.isTurnRunning(sessionId) &&
|
|
3872
|
-
events.some(
|
|
4074
|
+
events.some(event => event.type === "turn.completed")) {
|
|
3873
4075
|
this.cloudCostBackfillDone.add(sessionId);
|
|
3874
4076
|
}
|
|
3875
4077
|
return;
|
|
@@ -3896,7 +4098,7 @@ export class SessionEngine {
|
|
|
3896
4098
|
}
|
|
3897
4099
|
log.replace(i, next);
|
|
3898
4100
|
}
|
|
3899
|
-
if (!(yield log.snapshot(0)).some(
|
|
4101
|
+
if (!(yield log.snapshot(0)).some(event => isUnpricedCompletedTurn(event))) {
|
|
3900
4102
|
this.cloudCostBackfillDone.add(sessionId);
|
|
3901
4103
|
}
|
|
3902
4104
|
});
|
|
@@ -3905,7 +4107,7 @@ export class SessionEngine {
|
|
|
3905
4107
|
return __awaiter(this, void 0, void 0, function* () {
|
|
3906
4108
|
var _a;
|
|
3907
4109
|
const previous = yield this.sessions.get(sessionId);
|
|
3908
|
-
yield this.updateRecord(sessionId,
|
|
4110
|
+
yield this.updateRecord(sessionId, current => (Object.assign(Object.assign({}, current), { continuationKey: token })));
|
|
3909
4111
|
// Keep armed reminders addressed at the conversation across channel
|
|
3910
4112
|
// continuation rotation.
|
|
3911
4113
|
if ((previous === null || previous === void 0 ? void 0 : previous.continuationKey) != null &&
|
|
@@ -4020,7 +4222,7 @@ export class SessionEngine {
|
|
|
4020
4222
|
// the lazy continuation-lookup path.
|
|
4021
4223
|
const cutoff = Date.now() - policy.maxAgeMs;
|
|
4022
4224
|
const candidates = loaded
|
|
4023
|
-
.map(
|
|
4225
|
+
.map(record => ({
|
|
4024
4226
|
record,
|
|
4025
4227
|
// Numeric timestamp for both the age filter and the sort; a
|
|
4026
4228
|
// non-string updatedAt (e.g. a raw DB Date from an untyped sink)
|
|
@@ -4256,7 +4458,7 @@ function eventsNdjson(events) {
|
|
|
4256
4458
|
if (events.length === 0) {
|
|
4257
4459
|
return undefined;
|
|
4258
4460
|
}
|
|
4259
|
-
return `${events.map(
|
|
4461
|
+
return `${events.map(event => JSON.stringify(event)).join("\n")}\n`;
|
|
4260
4462
|
}
|
|
4261
4463
|
function subagentPrompt(subagent) {
|
|
4262
4464
|
var _a;
|
|
@@ -4271,7 +4473,7 @@ function subagentPrompt(subagent) {
|
|
|
4271
4473
|
* executor that turn will run on.
|
|
4272
4474
|
*/
|
|
4273
4475
|
function buildRunnerSubagents(agent) {
|
|
4274
|
-
return agent.subagents.map(
|
|
4476
|
+
return agent.subagents.map(subagent => { var _a; return (Object.assign({ name: subagent.name, description: (_a = subagent.description) !== null && _a !== void 0 ? _a : subagent.name, prompt: subagentPrompt(subagent) }, (subagent.model === undefined ? {} : { model: subagent.model }))); });
|
|
4275
4477
|
}
|
|
4276
4478
|
function toolErrorResult(message) {
|
|
4277
4479
|
return {
|
|
@@ -4287,7 +4489,7 @@ function defaultGetCloudUsage(sdkAgentId) {
|
|
|
4287
4489
|
return {
|
|
4288
4490
|
usage: mapSdkTokenUsage(billed.usage),
|
|
4289
4491
|
cost: billed.cost,
|
|
4290
|
-
runs: billed.runs.map(
|
|
4492
|
+
runs: billed.runs.map(run => ({
|
|
4291
4493
|
runId: run.runId,
|
|
4292
4494
|
usage: mapSdkTokenUsage(run.usage),
|
|
4293
4495
|
cost: run.cost,
|
|
@@ -4333,7 +4535,7 @@ function approvalResolverLabel(auth) {
|
|
|
4333
4535
|
}
|
|
4334
4536
|
/** Let the HTTP NDJSON writer flush before the next SDK update. */
|
|
4335
4537
|
function yieldEventLoop() {
|
|
4336
|
-
return new Promise(
|
|
4538
|
+
return new Promise(resolve => {
|
|
4337
4539
|
setImmediate(resolve);
|
|
4338
4540
|
});
|
|
4339
4541
|
}
|