@cursor/bdk 0.2.1 → 0.2.3
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 +1 -6
- package/dist/artifacts.d.ts +5 -2
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +5 -2
- package/dist/bin/agent-serve.js +23 -7
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +36 -5
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +3 -2
- package/dist/channels/slack/types.d.ts +6 -1
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/connections.d.ts +1 -1
- package/dist/connections.js +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.JVQvbRO-.js → app.BOIHhrKi.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BkhY63uW.js → VPLocalSearchBox.D49zVZqM.js} +1 -1
- package/dist/docs/assets/chunks/{arc.Cc1unYd3.js → arc.hmjb-sc4.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CAY_TPVz.js → architectureDiagram-Q4EWVU46.CxEI1KqM.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.my2VD3Xm.js → baseUniq.DHHvBWoV.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CQXAOmqd.js → blockDiagram-DXYQGD6D.DnXW-3bu.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D0AsQFSX.js → c4Diagram-AHTNJAMY.e-47O2jM.js} +1 -1
- package/dist/docs/assets/chunks/channel.BbOGaJQP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DZjhgNls.js → chunk-4BX2VUAB.3ry4pYXB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.qdcp_qbo.js → chunk-4TB4RGXK.DGIZFRx6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BHXoZhJ-.js → chunk-55IACEB6.DKBnqg9U.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.Cds_Vwj3.js → chunk-EDXVE4YY.BIU8Ue5k.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CSl0HknT.js → chunk-FMBD7UC4.DP-TFhjI.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.DJMvAt5N.js → chunk-OYMX7WX6.Ux0OYj5v.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BYQzBK9D.js → chunk-QZHKN3VN.BzHMwYox.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.BAvw7N4o.js → chunk-YZCP3GAM.D4OGAsSP.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +1 -0
- package/dist/docs/assets/chunks/clone.Co4MBflG.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Buf3seya.js → cose-bilkent-S5V4N54A.Jq_7BUNx.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.DMGGa3uA.js → dagre-KV5264BT.Di-skR2x.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DDjnwRmY.js → diagram-5BDNPKRD.DeREHIdH.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.RwyrIr8Q.js → diagram-G4DWMVQ6.C7Kcqxro.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DRvQV16Z.js → diagram-MMDJMWI5.BK3eohyo.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.Dw8W9BTk.js → diagram-TYMM5635.C6TyymXT.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DQT1Hnwf.js → erDiagram-SMLLAGMA.DYGG-gGx.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.6_Aky-ut.js → flowDiagram-DWJPFMVM.C9nBcSV4.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHIwqnqN.js → ganttDiagram-T4ZO3ILL.wAg_ymsp.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CGd_eJbn.js → gitGraphDiagram-UUTBAWPF.B87j9Oeg.js} +1 -1
- package/dist/docs/assets/chunks/{graph.ChMEylkh.js → graph.CuFMj31w.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.Cd4gMyAz.js → infoDiagram-42DDH7IO.P_mLGumP.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.D1uw7MXq.js → ishikawaDiagram-UXIWVN3A.DyuL_MsT.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.AWLXtelc.js → journeyDiagram-VCZTEJTY.CtP09IoJ.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.CagPhAn5.js → kanban-definition-6JOO6SKY.BoeSYPZo.js} +1 -1
- package/dist/docs/assets/chunks/{layout.ClTBBkE_.js → layout.B0lMMtNo.js} +1 -1
- package/dist/docs/assets/chunks/{linear.SwS2rOLA.js → linear.HxRBiAFX.js} +1 -1
- package/dist/docs/assets/chunks/{min.By_x-Btb.js → min.BGlFFHwS.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.By_RAMaP.js → mindmap-definition-QFDTVHPH.JyLBD9M8.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DfAl9sy4.js → pieDiagram-DEJITSTG.DnSmNZF8.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CNuqFRBj.js → quadrantDiagram-34T5L4WZ.CUCnbfCa.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DJ5CmTCl.js → requirementDiagram-MS252O5E.py0IVUn5.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.D-T_AKJj.js → sankeyDiagram-XADWPNL6.Bkc-HWYp.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.BRn9WcrR.js → sequenceDiagram-FGHM5R23.Dqn8Mlv2.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.F12urmm7.js → stateDiagram-FHFEXIEX.JikkoQUU.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +1 -0
- package/dist/docs/assets/chunks/{theme.zK3OJa_C.js → theme.b6HQ6zG_.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.B7GiQBeC.js → timeline-definition-GMOUNBTQ.BvpSXiBj.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.D0niwuY_.js → vennDiagram-DHZGUBPP.CU7MVnZx.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.1zhHNRsx.js → wardley-RL74JXVD.BKwC4ctG.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DKaqpT7K.js → wardleyDiagram-NUSXRM2D.BfaF6Uhe.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.e8BPicch.js → xychartDiagram-5P7HB3ND.Bg5dcpj4.js} +1 -1
- package/dist/docs/assets/{deployment.md.nGo1yIsa.js → deployment.md.BJ8i7Q6p.js} +5 -8
- package/dist/docs/assets/{deployment.md.nGo1yIsa.lean.js → deployment.md.BJ8i7Q6p.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.C2_DSWlE.js → guides_github.md.Bq9kQU9B.js} +9 -3
- package/dist/docs/assets/{guides_github.md.C2_DSWlE.lean.js → guides_github.md.Bq9kQU9B.lean.js} +1 -1
- package/dist/docs/assets/{guides_slack.md.ZbHQETOT.js → guides_slack.md.diqqXTTm.js} +2 -2
- package/dist/docs/assets/{guides_slack.md.ZbHQETOT.lean.js → guides_slack.md.diqqXTTm.lean.js} +1 -1
- package/dist/docs/assets/{quickstart.md.wG4shE1f.js → quickstart.md.CHpHPBUN.js} +5 -3
- package/dist/docs/assets/{quickstart.md.wG4shE1f.lean.js → quickstart.md.CHpHPBUN.lean.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.IFFC5Zln.js → reference_artifacts.md.CQfKq8F2.js} +1 -1
- package/dist/docs/assets/reference_cli.md.DgeLTO18.js +91 -0
- package/dist/docs/assets/reference_cli.md.DgeLTO18.lean.js +1 -0
- package/dist/docs/assets/{reference_connections.md._XpKiOaF.js → reference_connections.md.COq--gAm.js} +7 -3
- package/dist/docs/assets/{reference_connections.md._XpKiOaF.lean.js → reference_connections.md.COq--gAm.lean.js} +1 -1
- package/dist/docs/assets/{reference_evals.md.DqNyHMA6.js → reference_evals.md.CJm3uCUm.js} +4 -4
- package/dist/docs/assets/{reference_evals.md.DqNyHMA6.lean.js → reference_evals.md.CJm3uCUm.lean.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.Dg3dEugd.js → reference_hooks.md.DbthhtIR.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.BtpTjZmh.js → reference_sessions.md.DeRUItHD.js} +1 -1
- package/dist/docs/assets/troubleshooting.md.Cw5PKa3t.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.BzZSu1Gz.lean.js → troubleshooting.md.Cw5PKa3t.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +40 -43
- package/dist/docs/deployment.md +45 -15
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +43 -37
- package/dist/docs/guides/github.md +34 -0
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +37 -37
- package/dist/docs/guides/slack.md +5 -0
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +205 -97
- package/dist/docs/quickstart.html +40 -38
- package/dist/docs/quickstart.md +7 -1
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +37 -37
- package/dist/docs/reference/artifacts.md +1 -1
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +55 -61
- package/dist/docs/reference/cli.md +65 -63
- package/dist/docs/reference/connections.html +42 -38
- package/dist/docs/reference/connections.md +28 -2
- package/dist/docs/reference/evals.html +39 -39
- package/dist/docs/reference/evals.md +6 -7
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +37 -37
- package/dist/docs/reference/hooks.md +3 -2
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +36 -36
- package/dist/docs/reference/sessions.md +4 -3
- package/dist/docs/reference/skills.html +35 -35
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/docs/troubleshooting.md +7 -3
- package/dist/extensions/cursor-cloud-agents/extension.d.ts +16 -4
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +7 -3
- package/dist/extensions/cursor-cloud-agents/lib/channels.d.ts +3 -0
- package/dist/extensions/cursor-cloud-agents/lib/channels.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/channels.js +7 -0
- package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts +4 -2
- package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +21 -12
- package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +2 -0
- package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +3 -1
- package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +2 -0
- package/dist/extensions/cursor-grokbot-agents/extension.d.ts +77 -0
- package/dist/extensions/cursor-grokbot-agents/extension.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/extension.js +63 -0
- package/dist/extensions/cursor-grokbot-agents/lib/agents.d.ts +11 -0
- package/dist/extensions/cursor-grokbot-agents/lib/agents.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +31 -0
- package/dist/extensions/cursor-grokbot-agents/lib/backend.d.ts +56 -0
- package/dist/extensions/cursor-grokbot-agents/lib/backend.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +158 -0
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.d.ts +28 -0
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +59 -0
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.d.ts +53 -0
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +206 -0
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +15 -0
- package/dist/extensions/cursor-grokbot-agents/lib/lock.d.ts +12 -0
- package/dist/extensions/cursor-grokbot-agents/lib/lock.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +25 -0
- package/dist/extensions/cursor-grokbot-agents/skills/consult.md +40 -0
- package/dist/extensions/cursor-grokbot-agents/tools/ask.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/ask.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +37 -0
- package/dist/extensions/cursor-grokbot-agents/tools/check.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/check.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +32 -0
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +24 -0
- package/dist/extensions/cursor-grokbot-agents/tools/list.d.ts +4 -0
- package/dist/extensions/cursor-grokbot-agents/tools/list.d.ts.map +1 -0
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +34 -0
- package/dist/files-backends/cursor-hosted.js +4 -4
- package/dist/internal/artifacts-store.d.ts +12 -2
- package/dist/internal/artifacts-store.d.ts.map +1 -1
- package/dist/internal/artifacts-store.js +8 -4
- package/dist/internal/cli-ax.d.ts +1 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +43 -10
- package/dist/internal/cli-deploy.d.ts +5 -1
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +22 -4
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
- package/dist/internal/cli-mcp-oauth.js +2 -1
- package/dist/internal/cli-skills.d.ts +1 -1
- package/dist/internal/cli-skills.d.ts.map +1 -1
- package/dist/internal/cli-skills.js +5 -5
- package/dist/internal/connection-env.d.ts +31 -0
- package/dist/internal/connection-env.d.ts.map +1 -0
- package/dist/internal/connection-env.js +84 -0
- package/dist/internal/cursor/backend-client.js +5 -0
- package/dist/internal/deploy-client.d.ts +30 -6
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +45 -9
- package/dist/internal/discovery/connections.d.ts.map +1 -1
- package/dist/internal/discovery/connections.js +11 -0
- package/dist/internal/event-mapper.d.ts +46 -4
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +316 -25
- package/dist/internal/hosted-delivery-protocol.d.ts +36 -11
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +31 -8
- package/dist/internal/hosted-delivery.d.ts +2 -2
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +229 -49
- package/dist/internal/hosting.d.ts +2 -2
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +9 -3
- package/dist/internal/install-cursor-skills.d.ts +20 -24
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +50 -48
- package/dist/internal/legacy-command-guard.d.ts +2 -0
- package/dist/internal/legacy-command-guard.d.ts.map +1 -1
- package/dist/internal/legacy-command-guard.js +10 -1
- package/dist/internal/mcp-host.d.ts +6 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +35 -16
- package/dist/internal/sdk-runner.d.ts +2 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +10 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +11 -1
- package/dist/internal/session-engine.d.ts +1 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +33 -8
- package/dist/playground/assets/index-6BbTPnaT.css +1 -0
- package/dist/playground/assets/{index-FFdUqTt_.js → index-CI7FAmOP.js} +43 -43
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +50 -4
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +45 -15
- package/docs/guides/github.md +34 -0
- package/docs/guides/slack.md +5 -0
- package/docs/quickstart.md +7 -1
- package/docs/reference/artifacts.md +1 -1
- package/docs/reference/cli.md +65 -63
- package/docs/reference/connections.md +28 -2
- package/docs/reference/evals.md +6 -7
- package/docs/reference/hooks.md +3 -2
- package/docs/reference/sessions.md +4 -3
- package/docs/troubleshooting.md +7 -3
- package/package.json +2 -4
- package/scripts/install-cursor-skills.mjs +1 -1
- package/skills/create-agent/SKILL.md +1 -1
- package/skills/debug/SKILL.md +1 -1
- package/skills/deploy/SKILL.md +1 -1
- package/skills/evals/SKILL.md +1 -1
- package/skills/framework-map/SKILL.md +1 -1
- package/skills/github/SKILL.md +1 -1
- package/skills/hillclimb/SKILL.md +1 -1
- package/skills/mcp-auth/SKILL.md +1 -1
- package/skills/otel/SKILL.md +1 -1
- package/skills/setup-slack/SKILL.md +1 -1
- package/src/artifacts.ts +5 -2
- package/src/bin/agent-serve.ts +27 -6
- package/src/channels/github/auth.ts +44 -5
- package/src/channels/slack/manifest.ts +2 -1
- package/src/channels/slack/types.ts +6 -1
- package/src/connections.ts +1 -1
- package/src/extensions/cursor-cloud-agents/extension.ts +23 -6
- package/src/extensions/cursor-cloud-agents/lib/channels.ts +11 -0
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +19 -7
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +2 -0
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +3 -1
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +2 -0
- package/src/extensions/cursor-grokbot-agents/extension.ts +132 -0
- package/src/extensions/cursor-grokbot-agents/lib/agents.ts +42 -0
- package/src/extensions/cursor-grokbot-agents/lib/backend.ts +208 -0
- package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +74 -0
- package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +260 -0
- package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +21 -0
- package/src/extensions/cursor-grokbot-agents/lib/lock.ts +26 -0
- package/src/extensions/cursor-grokbot-agents/skills/consult.md +40 -0
- package/src/extensions/cursor-grokbot-agents/tools/ask.ts +32 -0
- package/src/extensions/cursor-grokbot-agents/tools/check.ts +25 -0
- package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +17 -0
- package/src/extensions/cursor-grokbot-agents/tools/list.ts +26 -0
- package/src/files-backends/cursor-hosted.ts +4 -4
- package/src/internal/artifacts-store.ts +14 -3
- package/src/internal/cli-ax.ts +52 -7
- package/src/internal/cli-deploy.ts +39 -6
- package/src/internal/cli-mcp-oauth.ts +2 -1
- package/src/internal/cli-skills.ts +4 -5
- package/src/internal/connection-env.ts +106 -0
- package/src/internal/cursor/backend-client.ts +6 -0
- package/src/internal/deploy-client.ts +79 -9
- package/src/internal/discovery/connections.ts +11 -0
- package/src/internal/event-mapper.ts +367 -36
- package/src/internal/hosted-delivery-protocol.ts +57 -20
- package/src/internal/hosted-delivery.ts +487 -229
- package/src/internal/hosting.ts +10 -3
- package/src/internal/install-cursor-skills.ts +56 -53
- package/src/internal/legacy-command-guard.ts +13 -1
- package/src/internal/mcp-host.ts +45 -17
- package/src/internal/sdk-runner.ts +11 -0
- package/src/internal/server.ts +13 -1
- package/src/internal/session-engine.ts +33 -13
- package/src/types.ts +56 -5
- package/templates/agents-md/bot/lib/collect.ts +1 -4
- package/templates/code-wiki/bot/channels/github.ts +2 -2
- package/templates/demo/bot/channels/github.ts +5 -1
- package/templates/pr-autofixer/bot/lib/start-drive.ts +4 -4
- package/templates/triage/bot/lib/types.ts +6 -6
- package/dist/docs/assets/chunks/@localSearchIndexroot.Caw9W1pM.js +0 -1
- package/dist/docs/assets/chunks/channel.Sapo9HJZ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.NPiy3Hz7.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.NPiy3Hz7.js +0 -1
- package/dist/docs/assets/chunks/clone.zl2qolPE.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2._auCa3fR.js +0 -1
- package/dist/docs/assets/reference_cli.md.BK2QUH67.js +0 -97
- package/dist/docs/assets/reference_cli.md.BK2QUH67.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.BzZSu1Gz.js +0 -1
- package/dist/playground/assets/index-BMV_IcEE.css +0 -1
- /package/dist/docs/assets/{reference_artifacts.md.IFFC5Zln.lean.js → reference_artifacts.md.CQfKq8F2.lean.js} +0 -0
- /package/dist/docs/assets/{reference_hooks.md.Dg3dEugd.lean.js → reference_hooks.md.DbthhtIR.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.BtpTjZmh.lean.js → reference_sessions.md.DeRUItHD.lean.js} +0 -0
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Private control-plane/engine wire contract. Version 2 is unreleased and
|
|
3
|
+
* intentionally strict: unknown fields and modes fail closed. After release,
|
|
4
|
+
* any shape or semantic change must use a new version and a rolling
|
|
5
|
+
* compatibility window. See `docs/agent-serve/hosted-delivery-protocol.md`.
|
|
6
|
+
*/
|
|
1
7
|
export declare const HOSTED_DELIVERY_PROTOCOL_VERSION = 2;
|
|
2
8
|
export declare const HOSTED_DELIVERY_HEADER = "x-agent-sdk-hosted-delivery";
|
|
3
9
|
export declare const HOSTED_ADMISSION_PATH = "/v1/internal/hosted-admission";
|
|
@@ -109,7 +115,7 @@ export type HostedAdmissionPlatformHandoff = {
|
|
|
109
115
|
streamed: false;
|
|
110
116
|
};
|
|
111
117
|
};
|
|
112
|
-
export type
|
|
118
|
+
export type HostedAdmissionInput = {
|
|
113
119
|
v: 2;
|
|
114
120
|
channelId: string;
|
|
115
121
|
/**
|
|
@@ -127,6 +133,15 @@ export type HostedAdmission = {
|
|
|
127
133
|
/** Present only when control-plane Slack fast-act posted a placeholder. */
|
|
128
134
|
platformHandoff?: HostedAdmissionPlatformHandoff;
|
|
129
135
|
};
|
|
136
|
+
export type HostedAdmissionStart = HostedAdmissionInput & {
|
|
137
|
+
mode: "start";
|
|
138
|
+
};
|
|
139
|
+
export type HostedAdmissionStatus = {
|
|
140
|
+
v: 2;
|
|
141
|
+
mode: "status";
|
|
142
|
+
deliveryId: string;
|
|
143
|
+
};
|
|
144
|
+
export type HostedAdmission = HostedAdmissionStart | HostedAdmissionStatus;
|
|
130
145
|
export type HostedAdmissionOutcome = {
|
|
131
146
|
ok: true;
|
|
132
147
|
v: 2;
|
|
@@ -136,6 +151,10 @@ export type HostedAdmissionOutcome = {
|
|
|
136
151
|
v: 2;
|
|
137
152
|
outcome: "send";
|
|
138
153
|
admissionToken: string;
|
|
154
|
+
} | {
|
|
155
|
+
ok: true;
|
|
156
|
+
v: 2;
|
|
157
|
+
outcome: "started" | "running";
|
|
139
158
|
};
|
|
140
159
|
/**
|
|
141
160
|
* Cap on delivery IDs an owner execute may report as consumed (primary +
|
|
@@ -143,18 +162,18 @@ export type HostedAdmissionOutcome = {
|
|
|
143
162
|
* `not_active`.
|
|
144
163
|
*/
|
|
145
164
|
export declare const HOSTED_MAX_CONSUMED_DELIVERY_IDS = 16;
|
|
146
|
-
/** Hosted-execution
|
|
147
|
-
export type HostedExecutionMode = "
|
|
165
|
+
/** Hosted-execution is unary: start/status for owners, enqueue for guests. */
|
|
166
|
+
export type HostedExecutionMode = "enqueue" | "start" | "status";
|
|
148
167
|
export type HostedExecution = {
|
|
149
168
|
v: 2;
|
|
150
169
|
admissionToken: string;
|
|
151
170
|
sessionPublicId: string;
|
|
152
171
|
/**
|
|
153
|
-
* `
|
|
154
|
-
*
|
|
155
|
-
* `
|
|
172
|
+
* `enqueue` injects into an accepting owner or returns `not_active`.
|
|
173
|
+
* `start` launches the owner turn and returns `started` immediately.
|
|
174
|
+
* `status` returns `running` or replays the terminal response.
|
|
156
175
|
*/
|
|
157
|
-
mode
|
|
176
|
+
mode: HostedExecutionMode;
|
|
158
177
|
};
|
|
159
178
|
export type HostedExecutionOutcome = {
|
|
160
179
|
ok: true;
|
|
@@ -162,10 +181,8 @@ export type HostedExecutionOutcome = {
|
|
|
162
181
|
outcome: "send";
|
|
163
182
|
/**
|
|
164
183
|
* Primary delivery id then accepted enqueue ids; length 1..16.
|
|
165
|
-
* Optional for old-guest compatibility; callers must normalize absent
|
|
166
|
-
* lists to `[primaryDeliveryId]`.
|
|
167
184
|
*/
|
|
168
|
-
consumedDeliveryIds
|
|
185
|
+
consumedDeliveryIds: string[];
|
|
169
186
|
} | {
|
|
170
187
|
ok: true;
|
|
171
188
|
v: 2;
|
|
@@ -174,6 +191,14 @@ export type HostedExecutionOutcome = {
|
|
|
174
191
|
ok: true;
|
|
175
192
|
v: 2;
|
|
176
193
|
outcome: "not_active";
|
|
194
|
+
} | {
|
|
195
|
+
ok: true;
|
|
196
|
+
v: 2;
|
|
197
|
+
outcome: "started";
|
|
198
|
+
} | {
|
|
199
|
+
ok: true;
|
|
200
|
+
v: 2;
|
|
201
|
+
outcome: "running";
|
|
177
202
|
};
|
|
178
203
|
export declare const HOSTED_PLATFORM_HANDOFF_KEYS: ReadonlySet<string>;
|
|
179
204
|
export declare const HOSTED_SLACK_PLACEHOLDER_HANDOFF_KEYS: ReadonlySet<string>;
|
|
@@ -184,7 +209,7 @@ export declare function parseHostedExecutionOutcome(value: unknown): HostedExecu
|
|
|
184
209
|
* True when the admission envelope is the reserved internal reminder fire
|
|
185
210
|
* path (not an authored channel event).
|
|
186
211
|
*/
|
|
187
|
-
export declare function isHostedReminderAdmission(delivery:
|
|
212
|
+
export declare function isHostedReminderAdmission(delivery: HostedAdmissionInput): boolean;
|
|
188
213
|
/**
|
|
189
214
|
* Parse `{ reminderId, fireCount }` from a reserved reminder admission
|
|
190
215
|
* payload. Rejects unknown keys and non-integer fireCount.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-delivery-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-delivery-protocol.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hosted-delivery-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-delivery-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Private control-plane/engine wire contract. Version 2 is unreleased and
|
|
3
|
+
* intentionally strict: unknown fields and modes fail closed. After release,
|
|
4
|
+
* any shape or semantic change must use a new version and a rolling
|
|
5
|
+
* compatibility window. See `docs/agent-serve/hosted-delivery-protocol.md`.
|
|
6
|
+
*/
|
|
1
7
|
export const HOSTED_DELIVERY_PROTOCOL_VERSION = 2;
|
|
2
8
|
export const HOSTED_DELIVERY_HEADER = "x-agent-sdk-hosted-delivery";
|
|
3
9
|
export const HOSTED_ADMISSION_PATH = "/v1/internal/hosted-admission";
|
|
@@ -118,6 +124,7 @@ export const HOSTED_REMINDER_EVENT_TYPE = "agent-sdk.reminder/fire";
|
|
|
118
124
|
export const HOSTED_MAX_CONSUMED_DELIVERY_IDS = 16;
|
|
119
125
|
const DELIVERY_KEYS = new Set([
|
|
120
126
|
"v",
|
|
127
|
+
"mode",
|
|
121
128
|
"channelId",
|
|
122
129
|
"channelKind",
|
|
123
130
|
"eventType",
|
|
@@ -222,9 +229,17 @@ export function parseHostedAdmission(value) {
|
|
|
222
229
|
return undefined;
|
|
223
230
|
}
|
|
224
231
|
const body = value;
|
|
232
|
+
if (body.mode === "status") {
|
|
233
|
+
return Object.keys(body).every(key => key === "v" || key === "mode" || key === "deliveryId") &&
|
|
234
|
+
body.v === HOSTED_DELIVERY_PROTOCOL_VERSION &&
|
|
235
|
+
boundedString(body.deliveryId, 256)
|
|
236
|
+
? body
|
|
237
|
+
: undefined;
|
|
238
|
+
}
|
|
225
239
|
if (Object.keys(body).some(key => !DELIVERY_KEYS.has(key)) ||
|
|
226
240
|
!Object.hasOwn(body, "payload") ||
|
|
227
241
|
body.v !== HOSTED_DELIVERY_PROTOCOL_VERSION ||
|
|
242
|
+
body.mode !== "start" ||
|
|
228
243
|
!boundedString(body.channelId, 128) ||
|
|
229
244
|
!boundedString(body.channelKind, 128) ||
|
|
230
245
|
!boundedString(body.eventType, 128) ||
|
|
@@ -250,7 +265,7 @@ export function parseHostedExecution(value) {
|
|
|
250
265
|
!/^ses_[a-f0-9]{24}$/.test(body.sessionPublicId)) {
|
|
251
266
|
return undefined;
|
|
252
267
|
}
|
|
253
|
-
if (body.mode !==
|
|
268
|
+
if (body.mode !== "enqueue" && body.mode !== "start" && body.mode !== "status") {
|
|
254
269
|
return undefined;
|
|
255
270
|
}
|
|
256
271
|
return body;
|
|
@@ -278,7 +293,10 @@ export function parseHostedExecutionOutcome(value) {
|
|
|
278
293
|
body.v !== HOSTED_DELIVERY_PROTOCOL_VERSION) {
|
|
279
294
|
return undefined;
|
|
280
295
|
}
|
|
281
|
-
if (body.outcome === "enqueued" ||
|
|
296
|
+
if (body.outcome === "enqueued" ||
|
|
297
|
+
body.outcome === "not_active" ||
|
|
298
|
+
body.outcome === "started" ||
|
|
299
|
+
body.outcome === "running") {
|
|
282
300
|
if (body.consumedDeliveryIds !== undefined) {
|
|
283
301
|
return undefined;
|
|
284
302
|
}
|
|
@@ -287,10 +305,6 @@ export function parseHostedExecutionOutcome(value) {
|
|
|
287
305
|
if (body.outcome !== "send") {
|
|
288
306
|
return undefined;
|
|
289
307
|
}
|
|
290
|
-
// Old guests omit consumedDeliveryIds; accept and let callers normalize.
|
|
291
|
-
if (body.consumedDeliveryIds === undefined) {
|
|
292
|
-
return { ok: true, v: 2, outcome: "send" };
|
|
293
|
-
}
|
|
294
308
|
const consumedDeliveryIds = parseConsumedDeliveryIds(body.consumedDeliveryIds);
|
|
295
309
|
if (consumedDeliveryIds === undefined) {
|
|
296
310
|
return undefined;
|
|
@@ -499,18 +513,27 @@ export function parseHostedReminderFireDescriptorPayload(value) {
|
|
|
499
513
|
}
|
|
500
514
|
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ protocolVersion: 1, id: body.id, fireCount: body.fireCount, generation: body.generation, purpose: body.purpose, channelId: body.channelId, continuationToken: body.continuationToken }, (target === undefined ? {} : { target })), { scheduleKind: body.scheduleKind, scheduleValue: body.scheduleValue }), (body.intervalMs === undefined ? {} : { intervalMs: body.intervalMs })), (body.prompt === undefined ? {} : { prompt: body.prompt })), (body.handler === undefined ? {} : { handler: body.handler })), (args === undefined ? {} : { args })), { hasRunHandler: body.hasRunHandler, hasUntilFn: body.hasUntilFn }), (body.untilPrompt === undefined ? {} : { untilPrompt: body.untilPrompt })), { busyPolicy: body.busyPolicy, nextFireAtMs: body.nextFireAtMs, claimedAtMs: body.claimedAtMs });
|
|
501
515
|
}
|
|
516
|
+
const HOSTED_ADMISSION_OUTCOME_KEYS = new Set(["ok", "v", "outcome", "admissionToken"]);
|
|
502
517
|
export function parseHostedAdmissionOutcome(value) {
|
|
503
518
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
504
519
|
return undefined;
|
|
505
520
|
}
|
|
506
521
|
const body = value;
|
|
507
|
-
if (body.
|
|
522
|
+
if (Object.keys(body).some(key => !HOSTED_ADMISSION_OUTCOME_KEYS.has(key)) ||
|
|
523
|
+
body.ok !== true ||
|
|
508
524
|
body.v !== HOSTED_DELIVERY_PROTOCOL_VERSION ||
|
|
509
|
-
(body.outcome !== "skip" &&
|
|
525
|
+
(body.outcome !== "skip" &&
|
|
526
|
+
body.outcome !== "send" &&
|
|
527
|
+
body.outcome !== "task" &&
|
|
528
|
+
body.outcome !== "started" &&
|
|
529
|
+
body.outcome !== "running")) {
|
|
510
530
|
return undefined;
|
|
511
531
|
}
|
|
512
532
|
if (body.outcome === "send" && !boundedString(body.admissionToken, 128)) {
|
|
513
533
|
return undefined;
|
|
514
534
|
}
|
|
535
|
+
if (body.outcome !== "send" && Object.hasOwn(body, "admissionToken")) {
|
|
536
|
+
return undefined;
|
|
537
|
+
}
|
|
515
538
|
return body;
|
|
516
539
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { ChannelHandlerArgs, SendMessageOptions } from "../types.js";
|
|
2
2
|
import { type HostedBoundSecretsResult } from "./cursor/hosted-bound-secrets.js";
|
|
3
3
|
import { type GuestNetworkWaitResult } from "./guest-network.js";
|
|
4
|
-
import { type
|
|
4
|
+
import { type HostedAdmissionInput, type HostedReminderFireDescriptorPayload } from "./hosted-delivery-protocol.js";
|
|
5
5
|
import type { LogRingEntry } from "./log-ring.js";
|
|
6
6
|
import type { Router } from "./router.js";
|
|
7
7
|
import type { SessionRunExecutionWrite } from "./session-run-log.js";
|
|
8
8
|
type DispatchInput = {
|
|
9
|
-
delivery:
|
|
9
|
+
delivery: HostedAdmissionInput;
|
|
10
10
|
definition: object;
|
|
11
11
|
args: ChannelHandlerArgs;
|
|
12
12
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-delivery.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-delivery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,kBAAkB,EAAE,kBAAkB,EAAe,MAAM,aAAa,CAAC;AAEnG,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,kCAAkC,CAAC;AAO1C,OAAO,EAKL,KAAK,sBAAsB,EAG5B,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EAQL,KAAK,
|
|
1
|
+
{"version":3,"file":"hosted-delivery.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,29 @@ import { endActiveHttpSpan } from "./otel/http.js";
|
|
|
26
26
|
import { ReminderValidationError, UnknownReminderError } from "./reminder-runner.js";
|
|
27
27
|
import { mapThrownRequestError, statusForThrownRequestError } from "./request-error-status.js";
|
|
28
28
|
import { HostedEnqueueNotActiveError } from "./session-engine.js";
|
|
29
|
+
function responseToReply(response) {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
var _a;
|
|
32
|
+
const value = (yield response.json());
|
|
33
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
34
|
+
throw new Error("Hosted delivery produced a non-object JSON response.");
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
status: response.status,
|
|
38
|
+
body: value,
|
|
39
|
+
serverTiming: (_a = response.headers.get("server-timing")) !== null && _a !== void 0 ? _a : undefined,
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function responseFromReply(reply) {
|
|
44
|
+
return Response.json(reply.body, {
|
|
45
|
+
status: reply.status,
|
|
46
|
+
headers: reply.serverTiming === undefined ? undefined : { "server-timing": reply.serverTiming },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function isTransientRetryReply(reply) {
|
|
50
|
+
return reply.body.retry === HOSTED_GUEST_RETRY_TRANSIENT;
|
|
51
|
+
}
|
|
29
52
|
/**
|
|
30
53
|
* A second `send()` in one delivery is a deterministic authored bug — the
|
|
31
54
|
* wire protocol carries exactly one pending send per delivery — so it must
|
|
@@ -49,6 +72,23 @@ function boundedMessage(text) {
|
|
|
49
72
|
? `${text.slice(0, MAX_ERROR_MESSAGE_LENGTH)}…`
|
|
50
73
|
: text;
|
|
51
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* A channel's non-OK dispatch response body is the only record of why the
|
|
77
|
+
* delivery was refused (e.g. an authored 400 with a validation message).
|
|
78
|
+
* Carry it, bounded, into the terminal channel_dispatch_failed so the
|
|
79
|
+
* control plane's failure log is diagnosable.
|
|
80
|
+
*/
|
|
81
|
+
function channelDispatchDetail(response) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
try {
|
|
84
|
+
const text = (yield response.text()).trim();
|
|
85
|
+
return text === "" ? undefined : boundedMessage(text);
|
|
86
|
+
}
|
|
87
|
+
catch (_a) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
52
92
|
function terminalHostedError(status, error, message) {
|
|
53
93
|
return hostedGuestErrorResponse({
|
|
54
94
|
status,
|
|
@@ -231,7 +271,7 @@ function runAdmission(input, adapter) {
|
|
|
231
271
|
}
|
|
232
272
|
if (!dispatched.ok) {
|
|
233
273
|
return {
|
|
234
|
-
response: terminalHostedError(dispatched.status >= 400 ? dispatched.status : 502, "channel_dispatch_failed"),
|
|
274
|
+
response: terminalHostedError(dispatched.status >= 400 ? dispatched.status : 502, "channel_dispatch_failed", yield channelDispatchDetail(dispatched)),
|
|
235
275
|
};
|
|
236
276
|
}
|
|
237
277
|
try {
|
|
@@ -333,8 +373,11 @@ function logGuestNetworkWait(phase, stats) {
|
|
|
333
373
|
export function registerHostedDeliveryRoute(input) {
|
|
334
374
|
var _a, _b;
|
|
335
375
|
const pending = new Map();
|
|
376
|
+
const admissions = new Map();
|
|
336
377
|
const activeOwners = new Map();
|
|
337
378
|
const pendingTtlMs = 10 * 60000;
|
|
379
|
+
/** Keep an in-flight owner turn addressable for status polls. */
|
|
380
|
+
const ownerTurnPendingTtlMs = 12 * 60 * 60000;
|
|
338
381
|
const waitForNetwork = (_a = input.waitForGuestNetwork) !== null && _a !== void 0 ? _a : (() => waitForGuestNetworkReady());
|
|
339
382
|
const consumeBoundSecrets = (_b = input.consumeBoundSecrets) !== null && _b !== void 0 ? _b : (() => consumeHostedBoundSecrets());
|
|
340
383
|
/**
|
|
@@ -375,8 +418,58 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
375
418
|
pending.delete(token);
|
|
376
419
|
}
|
|
377
420
|
}
|
|
421
|
+
for (const [deliveryId, operation] of admissions) {
|
|
422
|
+
if (operation.expiresAt <= now) {
|
|
423
|
+
admissions.delete(deliveryId);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
378
426
|
};
|
|
379
|
-
|
|
427
|
+
const runAdmissionOperation = (delivery, definition) => __awaiter(this, void 0, void 0, function* () {
|
|
428
|
+
return afterHostedWork(input.flushOtel, () => __awaiter(this, void 0, void 0, function* () {
|
|
429
|
+
const startedAt = performance.now();
|
|
430
|
+
let guestNetwork;
|
|
431
|
+
const finish = (response) => withServerTiming(response, performance.now() - startedAt, guestNetwork);
|
|
432
|
+
try {
|
|
433
|
+
const network = yield finishNetworkWait("admission");
|
|
434
|
+
guestNetwork = network.timing;
|
|
435
|
+
if (network.response !== undefined) {
|
|
436
|
+
return yield responseToReply(finish(network.response));
|
|
437
|
+
}
|
|
438
|
+
if (isHostedReminderAdmission(delivery)) {
|
|
439
|
+
return yield responseToReply(finish(yield dispatchHostedReminderAdmission(input, delivery)));
|
|
440
|
+
}
|
|
441
|
+
if (definition === undefined) {
|
|
442
|
+
return yield responseToReply(finish(terminalHostedError(404, "channel_not_found", `No channel named "${delivery.channelId}" is mounted.`)));
|
|
443
|
+
}
|
|
444
|
+
const admitted = yield dispatchHostedAdmission({
|
|
445
|
+
delivery,
|
|
446
|
+
definition,
|
|
447
|
+
args: input.buildHandlerArgs(delivery.channelId),
|
|
448
|
+
});
|
|
449
|
+
if (admitted.pendingSend === undefined) {
|
|
450
|
+
return yield responseToReply(finish(admitted.response));
|
|
451
|
+
}
|
|
452
|
+
pruneExpired();
|
|
453
|
+
const admissionToken = randomBytes(24).toString("hex");
|
|
454
|
+
pending.set(admissionToken, {
|
|
455
|
+
send: admitted.pendingSend,
|
|
456
|
+
channelKind: delivery.channelKind,
|
|
457
|
+
expiresAt: Date.now() + pendingTtlMs,
|
|
458
|
+
deliveryId: delivery.deliveryId,
|
|
459
|
+
});
|
|
460
|
+
return yield responseToReply(finish(Response.json({
|
|
461
|
+
ok: true,
|
|
462
|
+
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
463
|
+
outcome: "send",
|
|
464
|
+
admissionToken,
|
|
465
|
+
})));
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
return yield responseToReply(finish(terminalHostedError(503, "internal_error", boundedMessage(error instanceof Error ? error.message : String(error)))));
|
|
469
|
+
}
|
|
470
|
+
}));
|
|
471
|
+
});
|
|
472
|
+
// Hosted callers reach this only through Anyrun's signed pod-port URL.
|
|
380
473
|
// The marker is a second, route-specific fence distinct from channel auth.
|
|
381
474
|
const auth = request => {
|
|
382
475
|
if (request.headers.get(HOSTED_DELIVERY_HEADER) !== "1") {
|
|
@@ -394,9 +487,9 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
394
487
|
auth: [auth],
|
|
395
488
|
handler: (request) => __awaiter(this, void 0, void 0, function* () {
|
|
396
489
|
return afterHostedWork(input.flushOtel, () => __awaiter(this, void 0, void 0, function* () {
|
|
490
|
+
var _a;
|
|
397
491
|
const startedAt = performance.now();
|
|
398
|
-
|
|
399
|
-
const finish = (response) => withServerTiming(response, performance.now() - startedAt, guestNetwork);
|
|
492
|
+
const finish = (response) => withServerTiming(response, performance.now() - startedAt);
|
|
400
493
|
const unconsumed = finishBoundSecrets();
|
|
401
494
|
if (unconsumed !== undefined) {
|
|
402
495
|
return finish(unconsumed);
|
|
@@ -412,46 +505,65 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
412
505
|
console.info(`[agent-sdk] hosted admission rejected: envelope failed to parse keys=${JSON.stringify(rawKeys)} hasManagedAutomation=${String(rawKeys.includes("managedAutomation"))}`);
|
|
413
506
|
return finish(terminalHostedError(400, "invalid_hosted_admission", "Expected a supported Agent SDK hosted-admission envelope."));
|
|
414
507
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
if (
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
if (network.response !== undefined) {
|
|
421
|
-
return finish(network.response);
|
|
508
|
+
pruneExpired();
|
|
509
|
+
const existing = admissions.get(delivery.deliveryId);
|
|
510
|
+
if (delivery.mode === "status") {
|
|
511
|
+
if (existing === undefined) {
|
|
512
|
+
return finish(transientHostedError(409, "hosted_admission_unavailable", "No hosted admission is in flight for this delivery."));
|
|
422
513
|
}
|
|
423
|
-
return
|
|
514
|
+
return existing.settledReply === undefined
|
|
515
|
+
? finish(Response.json({
|
|
516
|
+
ok: true,
|
|
517
|
+
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
518
|
+
outcome: "running",
|
|
519
|
+
}))
|
|
520
|
+
: responseFromReply(existing.settledReply);
|
|
424
521
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
522
|
+
if (existing !== undefined) {
|
|
523
|
+
if (existing.settledReply !== undefined && isTransientRetryReply(existing.settledReply)) {
|
|
524
|
+
admissions.delete(delivery.deliveryId);
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
return existing.settledReply === undefined
|
|
528
|
+
? finish(Response.json({
|
|
529
|
+
ok: true,
|
|
530
|
+
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
531
|
+
outcome: "started",
|
|
532
|
+
}))
|
|
533
|
+
: responseFromReply(existing.settledReply);
|
|
534
|
+
}
|
|
428
535
|
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
536
|
+
console.info(`[agent-sdk] hosted admission received deliveryId=${delivery.deliveryId} channelId=${delivery.channelId} channelKind=${delivery.channelKind} eventType=${delivery.eventType} sessionMode=${delivery.sessionMode} managedAutomation=${delivery.managedAutomation === undefined ? "<absent>" : `automationUuid=${delivery.managedAutomation.automationUuid} mcpServerNames=${String(delivery.managedAutomation.mcpServerNames.length)} slackChannels=${delivery.managedAutomation.slackChannels === undefined ? "<absent>" : JSON.stringify(delivery.managedAutomation.slackChannels)}`}`);
|
|
537
|
+
recordHostedManagedAutomation(delivery);
|
|
538
|
+
const reminder = isHostedReminderAdmission(delivery);
|
|
539
|
+
const definition = reminder
|
|
540
|
+
? undefined
|
|
541
|
+
: (_a = input.channels.find(candidate => candidate.id === delivery.channelId)) === null || _a === void 0 ? void 0 : _a.definition;
|
|
542
|
+
if (!reminder && definition === undefined) {
|
|
543
|
+
return finish(terminalHostedError(404, "channel_not_found", `No channel named "${delivery.channelId}" is mounted.`));
|
|
433
544
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
545
|
+
let operation;
|
|
546
|
+
const execution = runAdmissionOperation(delivery, definition).then(reply => {
|
|
547
|
+
operation.settledReply = reply;
|
|
548
|
+
operation.expiresAt = Date.now() + pendingTtlMs;
|
|
549
|
+
return reply;
|
|
438
550
|
});
|
|
439
|
-
|
|
440
|
-
|
|
551
|
+
operation = {
|
|
552
|
+
execution,
|
|
553
|
+
expiresAt: Date.now() + ownerTurnPendingTtlMs,
|
|
554
|
+
};
|
|
555
|
+
admissions.set(delivery.deliveryId, operation);
|
|
556
|
+
const quickReply = yield Promise.race([
|
|
557
|
+
execution,
|
|
558
|
+
new Promise(resolve => setImmediate(() => resolve(undefined))),
|
|
559
|
+
]);
|
|
560
|
+
if (quickReply !== undefined) {
|
|
561
|
+
return responseFromReply(quickReply);
|
|
441
562
|
}
|
|
442
|
-
pruneExpired();
|
|
443
|
-
const admissionToken = randomBytes(24).toString("hex");
|
|
444
|
-
pending.set(admissionToken, {
|
|
445
|
-
send: admitted.pendingSend,
|
|
446
|
-
channelKind: delivery.channelKind,
|
|
447
|
-
expiresAt: Date.now() + pendingTtlMs,
|
|
448
|
-
deliveryId: delivery.deliveryId,
|
|
449
|
-
});
|
|
450
563
|
return finish(Response.json({
|
|
451
564
|
ok: true,
|
|
452
565
|
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
453
|
-
outcome: "
|
|
454
|
-
admissionToken,
|
|
566
|
+
outcome: "started",
|
|
455
567
|
}));
|
|
456
568
|
}));
|
|
457
569
|
}),
|
|
@@ -484,13 +596,40 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
484
596
|
admitted.sessionPublicId !== execution.sessionPublicId) {
|
|
485
597
|
return finish(transientHostedError(409, "hosted_admission_session_mismatch", "The hosted admission token is already bound to another session."));
|
|
486
598
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
599
|
+
if (execution.mode === "start" &&
|
|
600
|
+
admitted.settledReply !== undefined &&
|
|
601
|
+
isTransientRetryReply(admitted.settledReply)) {
|
|
602
|
+
delete admitted.settledReply;
|
|
603
|
+
delete admitted.execution;
|
|
604
|
+
}
|
|
605
|
+
if (execution.mode === "status" ||
|
|
606
|
+
(execution.mode === "start" && admitted.execution !== undefined)) {
|
|
607
|
+
if (admitted.settledReply !== undefined) {
|
|
608
|
+
return responseFromReply(admitted.settledReply);
|
|
609
|
+
}
|
|
610
|
+
if (admitted.execution === undefined) {
|
|
611
|
+
return finish(transientHostedError(409, "hosted_admission_unavailable", "The hosted admission token has no owner turn in flight."));
|
|
612
|
+
}
|
|
613
|
+
if (execution.mode === "start") {
|
|
614
|
+
return finish(Response.json({
|
|
615
|
+
ok: true,
|
|
616
|
+
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
617
|
+
outcome: "started",
|
|
618
|
+
}));
|
|
619
|
+
}
|
|
620
|
+
return finish(Response.json({
|
|
621
|
+
ok: true,
|
|
622
|
+
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
623
|
+
outcome: "running",
|
|
624
|
+
}));
|
|
491
625
|
}
|
|
492
626
|
admitted.sessionPublicId = execution.sessionPublicId;
|
|
493
627
|
if (execution.mode === "enqueue") {
|
|
628
|
+
const network = yield finishNetworkWait("execution");
|
|
629
|
+
guestNetwork = network.timing;
|
|
630
|
+
if (network.response !== undefined) {
|
|
631
|
+
return finish(network.response);
|
|
632
|
+
}
|
|
494
633
|
const enqueueOutcome = yield enqueueIntoActiveOwner({
|
|
495
634
|
activeOwners,
|
|
496
635
|
sessionPublicId: execution.sessionPublicId,
|
|
@@ -500,7 +639,15 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
500
639
|
});
|
|
501
640
|
return finish(Response.json(Object.assign({ ok: true, v: HOSTED_DELIVERY_PROTOCOL_VERSION }, enqueueOutcome)));
|
|
502
641
|
}
|
|
503
|
-
|
|
642
|
+
if (admitted.execution === undefined) {
|
|
643
|
+
admitted.expiresAt = Date.now() + ownerTurnPendingTtlMs;
|
|
644
|
+
}
|
|
645
|
+
(_a = admitted.execution) !== null && _a !== void 0 ? _a : (admitted.execution = afterHostedWork(input.flushOtel, () => __awaiter(this, void 0, void 0, function* () {
|
|
646
|
+
const network = yield finishNetworkWait("execution");
|
|
647
|
+
guestNetwork = network.timing;
|
|
648
|
+
if (network.response !== undefined) {
|
|
649
|
+
return yield responseToReply(finish(network.response));
|
|
650
|
+
}
|
|
504
651
|
const startedAt = performance.now();
|
|
505
652
|
const executionId = hostedExecutionDiagId(execution.admissionToken);
|
|
506
653
|
const sinks = Object.assign(Object.assign(Object.assign(Object.assign({}, (input.stateRoot === undefined ? {} : { stateRoot: input.stateRoot })), (input.persistSessionRun === undefined
|
|
@@ -512,10 +659,10 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
512
659
|
: hostedFailureClassification(fields.failureCode);
|
|
513
660
|
yield flushHostedExecutionRecord(sinks, Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ executionId, sessionPublicId: execution.sessionPublicId, sessionId: fields.sessionId, turnStatus: fields.turnStatus, durationMs: Math.max(0, Math.round(performance.now() - startedAt)) }, (fields.message === undefined ? {} : { message: fields.message })), (fields.abortReason === undefined ? {} : { abortReason: fields.abortReason })), { failureCode: fields.failureCode }), (fields.errorCode === undefined ? {} : { errorCode: fields.errorCode })), { classification }), (fields.error === undefined ? {} : { error: fields.error })));
|
|
514
661
|
});
|
|
515
|
-
// Claim the file before the turn runs.
|
|
516
|
-
//
|
|
517
|
-
//
|
|
518
|
-
//
|
|
662
|
+
// Claim the file before the turn runs. If a later status request
|
|
663
|
+
// fails, the host reads this record while the turn may still be
|
|
664
|
+
// running; the marker prevents it from surfacing the previous
|
|
665
|
+
// delivery's terminal record.
|
|
519
666
|
yield writeDiag({
|
|
520
667
|
sessionId: "",
|
|
521
668
|
turnStatus: HOSTED_EXECUTION_DIAG_RUNNING_STATUS,
|
|
@@ -562,7 +709,10 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
562
709
|
// survive the park just like a finished turn's.
|
|
563
710
|
yield (_a = input.drainSessionDurability) === null || _a === void 0 ? void 0 : _a.call(input, session.id);
|
|
564
711
|
drainAt = hostedExecutionNow();
|
|
565
|
-
const consumedDeliveryIds = [
|
|
712
|
+
const consumedDeliveryIds = [
|
|
713
|
+
owner.primaryDeliveryId,
|
|
714
|
+
...owner.acceptedDeliveryIds,
|
|
715
|
+
];
|
|
566
716
|
if (consumedDeliveryIds.length > HOSTED_MAX_CONSUMED_DELIVERY_IDS) {
|
|
567
717
|
throw new Error(`hosted execute consumedDeliveryIds length ${String(consumedDeliveryIds.length)} exceeds cap ${String(HOSTED_MAX_CONSUMED_DELIVERY_IDS)}`);
|
|
568
718
|
}
|
|
@@ -597,7 +747,7 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
597
747
|
drainAt,
|
|
598
748
|
endedAt: hostedExecutionNow(),
|
|
599
749
|
});
|
|
600
|
-
return reply;
|
|
750
|
+
return yield responseToReply(finish(Response.json(reply.body, { status: reply.status })));
|
|
601
751
|
}
|
|
602
752
|
catch (error) {
|
|
603
753
|
owner.accepting = false;
|
|
@@ -623,9 +773,39 @@ export function registerHostedDeliveryRoute(input) {
|
|
|
623
773
|
}
|
|
624
774
|
}
|
|
625
775
|
}));
|
|
626
|
-
}))(
|
|
627
|
-
|
|
628
|
-
|
|
776
|
+
})).then(reply => {
|
|
777
|
+
admitted.settledReply = reply;
|
|
778
|
+
admitted.expiresAt = Date.now() + pendingTtlMs;
|
|
779
|
+
return reply;
|
|
780
|
+
}, error => {
|
|
781
|
+
admitted.settledReply = {
|
|
782
|
+
status: 503,
|
|
783
|
+
body: {
|
|
784
|
+
ok: false,
|
|
785
|
+
error: "internal_error",
|
|
786
|
+
retry: HOSTED_GUEST_RETRY_TERMINAL,
|
|
787
|
+
classification: hostedFailureClassification("internal_error"),
|
|
788
|
+
message: error instanceof Error ? error.message : String(error),
|
|
789
|
+
},
|
|
790
|
+
};
|
|
791
|
+
admitted.expiresAt = Date.now() + pendingTtlMs;
|
|
792
|
+
return admitted.settledReply;
|
|
793
|
+
}));
|
|
794
|
+
if (execution.mode === "start") {
|
|
795
|
+
const quickReply = yield Promise.race([
|
|
796
|
+
admitted.execution,
|
|
797
|
+
new Promise(resolve => setImmediate(() => resolve(undefined))),
|
|
798
|
+
]);
|
|
799
|
+
if (quickReply !== undefined) {
|
|
800
|
+
return responseFromReply(quickReply);
|
|
801
|
+
}
|
|
802
|
+
return finish(Response.json({
|
|
803
|
+
ok: true,
|
|
804
|
+
v: HOSTED_DELIVERY_PROTOCOL_VERSION,
|
|
805
|
+
outcome: "started",
|
|
806
|
+
}));
|
|
807
|
+
}
|
|
808
|
+
return finish(terminalHostedError(400, "invalid_hosted_execution", "Owner execution requires start or status mode."));
|
|
629
809
|
}));
|
|
630
810
|
}),
|
|
631
811
|
});
|