@cursor/bdk 0.2.2 → 0.2.4
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/dist/bin/agent-serve.js +32 -8
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +36 -5
- package/dist/channels/slack/attachments.d.ts +2 -1
- package/dist/channels/slack/attachments.d.ts.map +1 -1
- package/dist/channels/slack/attachments.js +19 -9
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +26 -24
- package/dist/channels/slack/thread-context.d.ts +21 -11
- package/dist/channels/slack/thread-context.d.ts.map +1 -1
- package/dist/channels/slack/thread-context.js +75 -27
- 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.DtYVVVyK.js → app.4kQ8Db_q.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.CvuAJ0My.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D47xT7J4.js → VPLocalSearchBox.DY1RwB8Q.js} +1 -1
- package/dist/docs/assets/chunks/{arc.CDJ6xzxR.js → arc.CxE_fSPK.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.l1Xnjd3N.js → architectureDiagram-Q4EWVU46.CPX426ui.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.x-finShZ.js → baseUniq.CB52JrKG.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.COC3qynH.js → blockDiagram-DXYQGD6D.J0cNaQCL.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.DdQO850E.js → c4Diagram-AHTNJAMY.DJn3vEGT.js} +1 -1
- package/dist/docs/assets/chunks/channel.BoNycAoN.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.Dpn8omLk.js → chunk-4BX2VUAB.Dao618F6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C0XWStUN.js → chunk-4TB4RGXK.QW8Rhjai.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DsKSZfIM.js → chunk-55IACEB6.DfRLLKF_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.dNU6JDu6.js → chunk-EDXVE4YY.CIV2ApKQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DN41fxKE.js → chunk-FMBD7UC4.BEheSuxp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.COpKCZus.js → chunk-OYMX7WX6.CUN88ENB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.HDB-azx2.js → chunk-QZHKN3VN.CgqCs8b_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DEeX_a2j.js → chunk-YZCP3GAM.iCH0nnTJ.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/clone.Db22cH_-.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.C3yGL2A8.js → cose-bilkent-S5V4N54A.BLcUxhWE.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Bpl24en4.js → dagre-KV5264BT.Ep7LofOm.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.nFco6seU.js → diagram-5BDNPKRD.Bzf4GSQ4.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DXhA6DWR.js → diagram-G4DWMVQ6.DD6Jh-eM.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.8GoOYcwk.js → diagram-MMDJMWI5.oOIl8bWd.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.DDBlqvlJ.js → diagram-TYMM5635.DHs85Ade.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.vl_N81P4.js → erDiagram-SMLLAGMA.BIb5ghCk.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.Cteg8g7I.js → flowDiagram-DWJPFMVM.DV4paY9k.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.D4aMhlMM.js → ganttDiagram-T4ZO3ILL.AyEKA6_v.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DF_J0D4q.js → gitGraphDiagram-UUTBAWPF.BltiCDFo.js} +1 -1
- package/dist/docs/assets/chunks/{graph.DJs0LDCf.js → graph.DzuEYGdC.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.Bb-4RQwg.js → infoDiagram-42DDH7IO.BV2l981J.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DEtQRSbc.js → ishikawaDiagram-UXIWVN3A.BA4Izf-m.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.DhQQ75FA.js → journeyDiagram-VCZTEJTY.DjaFbFS3.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.C4gEw3Rk.js → kanban-definition-6JOO6SKY.CfTFieDs.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DT-PGlXa.js → layout.DzfWqTBV.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BMMe__JW.js → linear.BO6mpulV.js} +1 -1
- package/dist/docs/assets/chunks/{min.XyaU9K9Q.js → min.BGgTadgT.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CbBM6xZ-.js → mindmap-definition-QFDTVHPH.DPuIXVWY.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DFJoIVou.js → pieDiagram-DEJITSTG.BOnl3bBg.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CQjkDYqb.js → quadrantDiagram-34T5L4WZ.DNB6Ckdc.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.D-mK-JQu.js → requirementDiagram-MS252O5E.D5-Qo7vb.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BStQInpd.js → sankeyDiagram-XADWPNL6.8t65cesf.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.CA_eooPJ.js → sequenceDiagram-FGHM5R23.CaG07BdS.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BXl-b7ad.js → stateDiagram-FHFEXIEX.TKOweTB6.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CuqmyQc4.js +1 -0
- package/dist/docs/assets/chunks/{theme.q37tOs4x.js → theme.Dx-JhpTB.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.vjuaGOSe.js → timeline-definition-GMOUNBTQ.fE53zQ2s.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BxduJl-F.js → vennDiagram-DHZGUBPP.DJsZZaJg.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.844kyrjl.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D1z3ds0D.js → wardleyDiagram-NUSXRM2D.CMZ-Ru_t.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CRU5Ti9b.js → xychartDiagram-5P7HB3ND.XXrhBc7a.js} +1 -1
- package/dist/docs/assets/{deployment.md.nGo1yIsa.js → deployment.md.UhnJIMr-.js} +6 -9
- package/dist/docs/assets/{deployment.md.nGo1yIsa.lean.js → deployment.md.UhnJIMr-.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_jev.md.BNDm14Gy.js → guides_jev.md.CRcgmjDb.js} +2 -2
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.CRcgmjDb.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_agent-config.md.DzGI777n.js → reference_agent-config.md.Cj5uBKp4.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.CFMNPreZ.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_extensions.md.CPPrkWlJ.js → reference_extensions.md.pa2tN-e4.js} +4 -3
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.pa2tN-e4.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.CRFTxt9M.js → reference_skills.md.Cy00QMKS.js} +3 -3
- package/dist/docs/assets/{reference_skills.md.CRFTxt9M.lean.js → reference_skills.md.Cy00QMKS.lean.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 +41 -44
- package/dist/docs/deployment.md +49 -16
- 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 +37 -37
- package/dist/docs/guides/jev.md +7 -0
- 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 +223 -94
- package/dist/docs/quickstart.html +40 -38
- package/dist/docs/quickstart.md +7 -1
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/agent-config.md +1 -1
- 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 +39 -38
- package/dist/docs/reference/extensions.md +13 -0
- package/dist/docs/reference/hooks.html +35 -35
- 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 +35 -35
- package/dist/docs/reference/skills.html +38 -38
- 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-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/extensions/jev/extension.d.ts +3 -0
- package/dist/extensions/jev/extension.d.ts.map +1 -1
- package/dist/extensions/jev/extension.js +10 -1
- package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
- package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
- package/dist/extensions/jev/lib/evaluate.js +6 -2
- package/dist/extensions.d.ts +4 -2
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +5 -2
- 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 +41 -9
- 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/agent-config.d.ts +6 -5
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +29 -28
- package/dist/internal/discovery/agent.js +1 -1
- package/dist/internal/discovery/connections.d.ts.map +1 -1
- package/dist/internal/discovery/connections.js +11 -0
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +12 -0
- 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 +228 -48
- package/dist/internal/hosting.d.ts +10 -2
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +33 -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.map +1 -1
- package/dist/internal/session-engine.js +9 -5
- package/dist/types.d.ts +29 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +49 -16
- package/docs/guides/github.md +34 -0
- package/docs/guides/jev.md +7 -0
- package/docs/guides/slack.md +5 -0
- package/docs/quickstart.md +7 -1
- package/docs/reference/agent-config.md +1 -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/extensions.md +13 -0
- package/docs/troubleshooting.md +7 -3
- package/package.json +1 -11
- 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/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.BgTA2tV1.js +0 -1
- package/dist/docs/assets/chunks/channel.B2nMEx82.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D8iCH2ve.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D8iCH2ve.js +0 -1
- package/dist/docs/assets/chunks/clone.5XNLjby0.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.yGM2uLZQ.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DKfyIejL.js +0 -162
- 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/src/artifacts.ts +0 -68
- package/src/bin/agent-serve.ts +0 -1833
- package/src/channels/bitbucket/api.ts +0 -891
- package/src/channels/bitbucket/binding.ts +0 -417
- package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
- package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
- package/src/channels/bitbucket/checks.ts +0 -146
- package/src/channels/bitbucket/cursor-account.ts +0 -106
- package/src/channels/bitbucket/defaults.ts +0 -100
- package/src/channels/bitbucket/events.ts +0 -74
- package/src/channels/bitbucket/index.ts +0 -51
- package/src/channels/bitbucket/replay.ts +0 -421
- package/src/channels/bitbucket/state.ts +0 -59
- package/src/channels/bitbucket/types.ts +0 -261
- package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
- package/src/channels/change-monitors/index.ts +0 -8
- package/src/channels/change-monitors/types.ts +0 -42
- package/src/channels/checks.ts +0 -185
- package/src/channels/deployments/deployments-channel.ts +0 -224
- package/src/channels/deployments/index.ts +0 -25
- package/src/channels/deployments/types.ts +0 -92
- package/src/channels/github/api.ts +0 -526
- package/src/channels/github/auth.ts +0 -254
- package/src/channels/github/binding.ts +0 -233
- package/src/channels/github/checks.ts +0 -145
- package/src/channels/github/cursor-account.ts +0 -303
- package/src/channels/github/defaults.ts +0 -168
- package/src/channels/github/events.ts +0 -67
- package/src/channels/github/forward.ts +0 -359
- package/src/channels/github/github-channel.ts +0 -2334
- package/src/channels/github/index.ts +0 -54
- package/src/channels/github/progress.ts +0 -365
- package/src/channels/github/replay.ts +0 -372
- package/src/channels/github/state.ts +0 -124
- package/src/channels/github/types.ts +0 -590
- package/src/channels/gitlab/api.ts +0 -329
- package/src/channels/gitlab/binding.ts +0 -231
- package/src/channels/gitlab/checks.ts +0 -228
- package/src/channels/gitlab/cursor-account.ts +0 -105
- package/src/channels/gitlab/defaults.ts +0 -80
- package/src/channels/gitlab/events.ts +0 -37
- package/src/channels/gitlab/gitlab-channel.ts +0 -160
- package/src/channels/gitlab/gitlab-webhook.ts +0 -509
- package/src/channels/gitlab/index.ts +0 -44
- package/src/channels/gitlab/replay.ts +0 -328
- package/src/channels/gitlab/state.ts +0 -55
- package/src/channels/gitlab/types.ts +0 -247
- package/src/channels/issues/index.ts +0 -9
- package/src/channels/issues/issues-channel.ts +0 -45
- package/src/channels/issues/types.ts +0 -38
- package/src/channels/origin/api.ts +0 -507
- package/src/channels/origin/binding.ts +0 -114
- package/src/channels/origin/checks.ts +0 -250
- package/src/channels/origin/cursor-account.ts +0 -58
- package/src/channels/origin/defaults.ts +0 -140
- package/src/channels/origin/events.ts +0 -35
- package/src/channels/origin/index.ts +0 -35
- package/src/channels/origin/origin-channel.ts +0 -815
- package/src/channels/origin/origin-webhook.ts +0 -296
- package/src/channels/origin/reactions.ts +0 -72
- package/src/channels/origin/state.ts +0 -54
- package/src/channels/origin/types.ts +0 -295
- package/src/channels/slack/agentic-delivery.ts +0 -634
- package/src/channels/slack/agentic-posted.ts +0 -135
- package/src/channels/slack/agentic-signals.ts +0 -231
- package/src/channels/slack/api.ts +0 -761
- package/src/channels/slack/approvals.ts +0 -279
- package/src/channels/slack/assistant.ts +0 -76
- package/src/channels/slack/attachments.ts +0 -596
- package/src/channels/slack/auth.ts +0 -127
- package/src/channels/slack/blocks.ts +0 -131
- package/src/channels/slack/bot-mentions.ts +0 -318
- package/src/channels/slack/channel-watch.ts +0 -314
- package/src/channels/slack/cli-project.ts +0 -249
- package/src/channels/slack/code-fences.ts +0 -171
- package/src/channels/slack/constants.ts +0 -38
- package/src/channels/slack/credentials.ts +0 -88
- package/src/channels/slack/defaults.ts +0 -714
- package/src/channels/slack/dispatch.ts +0 -1060
- package/src/channels/slack/doctor.ts +0 -338
- package/src/channels/slack/eval-directive.ts +0 -306
- package/src/channels/slack/event-id-dedupe.ts +0 -30
- package/src/channels/slack/external-policy.ts +0 -75
- package/src/channels/slack/footer.ts +0 -106
- package/src/channels/slack/inbound.ts +0 -416
- package/src/channels/slack/index.ts +0 -53
- package/src/channels/slack/init.ts +0 -169
- package/src/channels/slack/interactive.ts +0 -406
- package/src/channels/slack/links.ts +0 -23
- package/src/channels/slack/live-delivery.ts +0 -489
- package/src/channels/slack/log.ts +0 -70
- package/src/channels/slack/manifest.ts +0 -240
- package/src/channels/slack/message-body.ts +0 -82
- package/src/channels/slack/nudge-carrier.ts +0 -224
- package/src/channels/slack/nudge-store.ts +0 -334
- package/src/channels/slack/paint-start.ts +0 -93
- package/src/channels/slack/placeholder.ts +0 -358
- package/src/channels/slack/pr-ref.ts +0 -74
- package/src/channels/slack/progress-delivery.ts +0 -138
- package/src/channels/slack/reasoning-card.ts +0 -125
- package/src/channels/slack/reasoning-chip.ts +0 -41
- package/src/channels/slack/recording-sink.ts +0 -167
- package/src/channels/slack/redact.ts +0 -6
- package/src/channels/slack/reply-options.ts +0 -279
- package/src/channels/slack/setup.ts +0 -125
- package/src/channels/slack/slack-channel.ts +0 -744
- package/src/channels/slack/socket-mode.ts +0 -140
- package/src/channels/slack/stop.ts +0 -25
- package/src/channels/slack/stream.ts +0 -66
- package/src/channels/slack/thread-context.ts +0 -485
- package/src/channels/slack/tool-approval-events.ts +0 -233
- package/src/channels/slack/tool-cards.ts +0 -198
- package/src/channels/slack/tool-chip.ts +0 -34
- package/src/channels/slack/types.ts +0 -787
- package/src/channels/slack/upload.ts +0 -137
- package/src/channels.ts +0 -543
- package/src/connections.ts +0 -153
- package/src/dashboard-session-url.ts +0 -30
- package/src/evals/assertions.ts +0 -688
- package/src/evals/expect.ts +0 -250
- package/src/evals/judge.ts +0 -329
- package/src/evals/loaders.ts +0 -111
- package/src/evals/matchers.ts +0 -223
- package/src/evals/reporters.ts +0 -257
- package/src/evals/results.ts +0 -130
- package/src/evals/run-facts.ts +0 -306
- package/src/evals.ts +0 -709
- package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
- package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
- package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
- package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
- package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
- package/src/extensions/improve/extension.ts +0 -69
- package/src/extensions/improve/skills/yourself.ts +0 -50
- package/src/extensions/jev/extension.ts +0 -95
- package/src/extensions/jev/lib/evaluate.ts +0 -266
- package/src/extensions/jev/skills/gated-write.md +0 -25
- package/src/extensions/jev/skills/questions.md +0 -33
- package/src/extensions/jev/tools/evaluate.ts +0 -82
- package/src/extensions/slack-communication/evals/harness.ts +0 -705
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
- package/src/extensions/slack-communication/extension.ts +0 -44
- package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
- package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
- package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
- package/src/extensions/slack-communication/tools/post-card.ts +0 -28
- package/src/extensions/slack-communication/tools/post-file.ts +0 -82
- package/src/extensions/slack-communication/tools/post-update.ts +0 -40
- package/src/extensions/slack-communication/tools/react.ts +0 -30
- package/src/extensions/slack-communication/tools/set-status.ts +0 -21
- package/src/extensions.ts +0 -179
- package/src/files-backends/agent-store-presigned-url.ts +0 -11
- package/src/files-backends/cursor-hosted.ts +0 -1212
- package/src/files-backends/local-fs.ts +0 -163
- package/src/files.ts +0 -293
- package/src/filesystem.ts +0 -2005
- package/src/hooks.ts +0 -30
- package/src/index.ts +0 -259
- package/src/internal/advertise-tools.ts +0 -370
- package/src/internal/approval-gate.ts +0 -103
- package/src/internal/artifacts-store.ts +0 -836
- package/src/internal/as-of.ts +0 -257
- package/src/internal/auth.ts +0 -46
- package/src/internal/authored-alias-hooks.ts +0 -138
- package/src/internal/authored-loaders.ts +0 -188
- package/src/internal/bounded-int.ts +0 -24
- package/src/internal/bounded.ts +0 -25
- package/src/internal/brand.ts +0 -28
- package/src/internal/browser-origin-guard.ts +0 -67
- package/src/internal/builtin-tools/artifacts.ts +0 -62
- package/src/internal/builtin-tools/index.ts +0 -53
- package/src/internal/builtin-tools/reminders.ts +0 -145
- package/src/internal/channel-dispatch.ts +0 -129
- package/src/internal/channel-route-dispatch.ts +0 -58
- package/src/internal/channel-state.ts +0 -83
- package/src/internal/chat-client.ts +0 -594
- package/src/internal/cli-ax.ts +0 -2273
- package/src/internal/cli-bitbucket.ts +0 -438
- package/src/internal/cli-convert-automation.ts +0 -335
- package/src/internal/cli-cursor.ts +0 -282
- package/src/internal/cli-deploy.ts +0 -2486
- package/src/internal/cli-docs.ts +0 -192
- package/src/internal/cli-github.ts +0 -806
- package/src/internal/cli-gitlab.ts +0 -452
- package/src/internal/cli-images.ts +0 -672
- package/src/internal/cli-manifest.ts +0 -56
- package/src/internal/cli-mcp-oauth.ts +0 -395
- package/src/internal/cli-mcp.ts +0 -808
- package/src/internal/cli-skills.ts +0 -99
- package/src/internal/cli-slack-manual.ts +0 -418
- package/src/internal/cli-slack.ts +0 -874
- package/src/internal/cloud-merge.ts +0 -51
- package/src/internal/cloud-turn-cost.ts +0 -159
- package/src/internal/continuation-channel.ts +0 -233
- package/src/internal/continuation-identity.ts +0 -935
- package/src/internal/conversation-mirror.ts +0 -423
- package/src/internal/convert-automation/convert-workflow.ts +0 -1377
- package/src/internal/convert-automation/slug.ts +0 -29
- package/src/internal/convert-automation/types.ts +0 -212
- package/src/internal/cron.ts +0 -76
- package/src/internal/cursor/account-mcp.ts +0 -692
- package/src/internal/cursor/backend-client.ts +0 -978
- package/src/internal/cursor/bound-secret-file.ts +0 -101
- package/src/internal/cursor/credentials.ts +0 -560
- package/src/internal/cursor/cursor-api-transport.ts +0 -65
- package/src/internal/cursor/github-credentials.ts +0 -228
- package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
- package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
- package/src/internal/cursor/hosted-store-secrets.ts +0 -152
- package/src/internal/cursor/session-token.ts +0 -111
- package/src/internal/cursor/store-api-client.ts +0 -323
- package/src/internal/cursor-account-mcp-auth.ts +0 -303
- package/src/internal/cursor-agent-template.ts +0 -50
- package/src/internal/cursor-deployment-relay.ts +0 -315
- package/src/internal/cursor-event-relay.ts +0 -675
- package/src/internal/cursor-relay-core.ts +0 -563
- package/src/internal/deferred-channel-session.ts +0 -61
- package/src/internal/deploy-client.ts +0 -1504
- package/src/internal/deploy-manifest.ts +0 -361
- package/src/internal/deploy-source.ts +0 -144
- package/src/internal/describe-error.ts +0 -32
- package/src/internal/dev-mode.ts +0 -20
- package/src/internal/discovery/agent-config.ts +0 -288
- package/src/internal/discovery/agent.ts +0 -381
- package/src/internal/discovery/channels.ts +0 -100
- package/src/internal/discovery/connections.ts +0 -505
- package/src/internal/discovery/context.ts +0 -38
- package/src/internal/discovery/cursor-plugin.ts +0 -628
- package/src/internal/discovery/extension-overlay.ts +0 -247
- package/src/internal/discovery/extensions.ts +0 -490
- package/src/internal/discovery/fs.ts +0 -103
- package/src/internal/discovery/hooks.ts +0 -63
- package/src/internal/discovery/info.ts +0 -174
- package/src/internal/discovery/instructions.ts +0 -98
- package/src/internal/discovery/modules.ts +0 -107
- package/src/internal/discovery/names.ts +0 -45
- package/src/internal/discovery/project.ts +0 -319
- package/src/internal/discovery/reminders.ts +0 -65
- package/src/internal/discovery/runtime.ts +0 -158
- package/src/internal/discovery/schedules.ts +0 -120
- package/src/internal/discovery/seed-files.ts +0 -34
- package/src/internal/discovery/services.ts +0 -151
- package/src/internal/discovery/skills.ts +0 -174
- package/src/internal/discovery/subagent.ts +0 -138
- package/src/internal/discovery/tools.ts +0 -170
- package/src/internal/discovery.ts +0 -27
- package/src/internal/distribution.ts +0 -126
- package/src/internal/docs-site.ts +0 -248
- package/src/internal/duration.ts +0 -37
- package/src/internal/env-file.ts +0 -83
- package/src/internal/eval-judge-model.ts +0 -142
- package/src/internal/eval-run-store.ts +0 -585
- package/src/internal/eval-runner.ts +0 -823
- package/src/internal/evals-client.ts +0 -475
- package/src/internal/event-log.ts +0 -342
- package/src/internal/event-mapper.ts +0 -811
- package/src/internal/expected-delivery-failure.ts +0 -34
- package/src/internal/factory-resource-channel.ts +0 -103
- package/src/internal/filesystem/errors.ts +0 -207
- package/src/internal/filesystem/format.ts +0 -253
- package/src/internal/filesystem/merge.ts +0 -192
- package/src/internal/filesystem/nearest.ts +0 -112
- package/src/internal/filesystem/scratch.ts +0 -239
- package/src/internal/filesystem/sdk-schemas.ts +0 -204
- package/src/internal/filesystem/tools.ts +0 -804
- package/src/internal/filesystem/walk.ts +0 -366
- package/src/internal/fixtures/units-server.ts +0 -52
- package/src/internal/framework-file-storage.ts +0 -357
- package/src/internal/framework-storage-selection.ts +0 -156
- package/src/internal/frontmatter.ts +0 -108
- package/src/internal/github-fanout.ts +0 -144
- package/src/internal/guest-network.ts +0 -391
- package/src/internal/handleAgentServeTrigger.ts +0 -286
- package/src/internal/host-files.ts +0 -341
- package/src/internal/host-kv.ts +0 -81
- package/src/internal/host-otel.ts +0 -231
- package/src/internal/host-platforms.ts +0 -170
- package/src/internal/hosted-admission-adapter.ts +0 -47
- package/src/internal/hosted-admission-context.ts +0 -37
- package/src/internal/hosted-catch-protocol.ts +0 -112
- package/src/internal/hosted-catch.ts +0 -179
- package/src/internal/hosted-delivery-protocol.ts +0 -787
- package/src/internal/hosted-delivery.ts +0 -1152
- package/src/internal/hosted-execution-diag.ts +0 -291
- package/src/internal/hosted-execution-flush.ts +0 -136
- package/src/internal/hosted-execution-latency.ts +0 -301
- package/src/internal/hosted-managed-automation.ts +0 -116
- package/src/internal/hosting.ts +0 -107
- package/src/internal/http-channel-define.ts +0 -25
- package/src/internal/http-channel.ts +0 -669
- package/src/internal/http-control-plane-session.ts +0 -110
- package/src/internal/ids.ts +0 -39
- package/src/internal/incoming-headers-to-fetch.ts +0 -45
- package/src/internal/init-interview.ts +0 -360
- package/src/internal/init-project.ts +0 -711
- package/src/internal/init-scaffold.ts +0 -182
- package/src/internal/inline-stdio-define-stub.ts +0 -4
- package/src/internal/inline-stdio-mcp.ts +0 -230
- package/src/internal/install-cursor-skills.ts +0 -601
- package/src/internal/is-record.ts +0 -3
- package/src/internal/json-schema.ts +0 -95
- package/src/internal/legacy-command-guard.ts +0 -54
- package/src/internal/listen-port.ts +0 -85
- package/src/internal/local-control-plane.ts +0 -442
- package/src/internal/local-env.ts +0 -59
- package/src/internal/local-ingress.ts +0 -90
- package/src/internal/log-ring.ts +0 -59
- package/src/internal/logs-client.ts +0 -477
- package/src/internal/map-pool.ts +0 -39
- package/src/internal/mcp-endpoint.ts +0 -747
- package/src/internal/mcp-host.ts +0 -481
- package/src/internal/mcp-oauth-on-demand.ts +0 -337
- package/src/internal/mcp-oauth-persist.ts +0 -118
- package/src/internal/mcp-oauth.ts +0 -549
- package/src/internal/net.ts +0 -29
- package/src/internal/open-browser.ts +0 -41
- package/src/internal/otel/attrs.ts +0 -16
- package/src/internal/otel/collector.ts +0 -937
- package/src/internal/otel/config.ts +0 -287
- package/src/internal/otel/http.ts +0 -122
- package/src/internal/otel/mcp.ts +0 -56
- package/src/internal/otel/propagation.ts +0 -17
- package/src/internal/otel/runtime.ts +0 -441
- package/src/internal/package-inline-stdio.ts +0 -114
- package/src/internal/peer-connections.ts +0 -96
- package/src/internal/platform-schedule-sync.ts +0 -75
- package/src/internal/platform-timers.ts +0 -365
- package/src/internal/playground/static.ts +0 -278
- package/src/internal/playground/toolchain.ts +0 -270
- package/src/internal/playground-proxy.ts +0 -564
- package/src/internal/process-memory-telemetry.ts +0 -334
- package/src/internal/project-layout.ts +0 -31
- package/src/internal/prompt-context.ts +0 -116
- package/src/internal/reminder-control-plane-protocol.ts +0 -482
- package/src/internal/reminder-runner.ts +0 -1559
- package/src/internal/reminder-schedule.ts +0 -104
- package/src/internal/reminder-store.ts +0 -176
- package/src/internal/request-error-status.ts +0 -95
- package/src/internal/request-headers.ts +0 -21
- package/src/internal/resolve-prod-target.ts +0 -334
- package/src/internal/resolved-connections.ts +0 -190
- package/src/internal/router.ts +0 -143
- package/src/internal/run-client.ts +0 -354
- package/src/internal/runtime-dispatch-runner.ts +0 -50
- package/src/internal/sanitize-mcp-tool-name.ts +0 -31
- package/src/internal/schedule-runner.ts +0 -154
- package/src/internal/scm/pr-url.ts +0 -245
- package/src/internal/sdk-runner.ts +0 -948
- package/src/internal/serve-restart.ts +0 -113
- package/src/internal/server.ts +0 -3135
- package/src/internal/session-cost.ts +0 -208
- package/src/internal/session-engine.ts +0 -5618
- package/src/internal/session-links.ts +0 -84
- package/src/internal/session-run-log.ts +0 -535
- package/src/internal/session-store.ts +0 -307
- package/src/internal/session-urls.ts +0 -32
- package/src/internal/sessions-client.ts +0 -239
- package/src/internal/skill-catalog.ts +0 -66
- package/src/internal/skills-sync.ts +0 -55
- package/src/internal/slack-provision-client.ts +0 -544
- package/src/internal/slack-thread-key.ts +0 -11
- package/src/internal/sleep.ts +0 -3
- package/src/internal/start-log-store.ts +0 -164
- package/src/internal/steering.ts +0 -17
- package/src/internal/storage-coordinator.ts +0 -800
- package/src/internal/storage-roles.ts +0 -86
- package/src/internal/storage.ts +0 -1
- package/src/internal/store-api-protocol.ts +0 -205
- package/src/internal/store-mirror.ts +0 -73
- package/src/internal/stream-progress.ts +0 -294
- package/src/internal/terminal-style.ts +0 -133
- package/src/internal/testing/factory-resource-fixtures.ts +0 -84
- package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
- package/src/internal/tool-catalog.ts +0 -104
- package/src/internal/tool-policy.ts +0 -222
- package/src/internal/tool-result.ts +0 -50
- package/src/internal/trajectory.ts +0 -418
- package/src/internal/turn-cost.ts +0 -136
- package/src/internal/turn-governor.ts +0 -145
- package/src/internal/turn-lease-store.ts +0 -144
- package/src/internal/turn-outbox.ts +0 -77
- package/src/internal/update-check.ts +0 -517
- package/src/internal/v2-hosting.ts +0 -52
- package/src/internal/workspace-sync.ts +0 -114
- package/src/internal/workspace.ts +0 -505
- package/src/kv/memory-kv.ts +0 -94
- package/src/kv.ts +0 -18
- package/src/memory.ts +0 -487
- package/src/otel-public.ts +0 -24
- package/src/otel.ts +0 -320
- package/src/prompt.ts +0 -80
- package/src/reminders.ts +0 -65
- package/src/schedules.ts +0 -31
- package/src/skills.ts +0 -27
- package/src/storage-backends/cursor-hosted-v2.ts +0 -204
- package/src/storage-backends/cursor-hosted.ts +0 -388
- package/src/storage-backends/file-kv.ts +0 -276
- package/src/storage-protocol.ts +0 -261
- package/src/storage.ts +0 -408
- package/src/tools.ts +0 -166
- package/src/types.ts +0 -3766
- /package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.Cj5uBKp4.lean.js} +0 -0
- /package/dist/docs/assets/{reference_artifacts.md.CFMNPreZ.lean.js → reference_artifacts.md.CQfKq8F2.lean.js} +0 -0
|
@@ -1,747 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-agent MCP surface: every mounted agent is also a Model Context
|
|
3
|
-
* Protocol server over streamable HTTP at `<base>/v1/mcp`, so other agents
|
|
4
|
-
* (peer MCP connections) and ordinary MCP clients can delegate work to it.
|
|
5
|
-
*
|
|
6
|
-
* The endpoint is stateless (a fresh `McpServer` + transport per POST, JSON
|
|
7
|
-
* response mode): session identity travels in tool arguments, not in MCP
|
|
8
|
-
* transport session headers, so any number of hosts can sit in front of it.
|
|
9
|
-
*
|
|
10
|
-
* Tools:
|
|
11
|
-
* - `ask` — start (or continue, via `sessionId`) a conversation with this
|
|
12
|
-
* agent; runs a model turn in the agent's own context and returns the
|
|
13
|
-
* reply. Bounded wait: long turns return `status: "running"`.
|
|
14
|
-
* - `check` — wait for / poll a running session started by `ask`.
|
|
15
|
-
* - `call_tool` — call one of the agent's deterministic server tools
|
|
16
|
-
* directly (no model turn). Registered only when server tools exist.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import type { SDKCustomToolContent, SDKCustomToolResult, SDKJsonValue } from "@cursor/sdk";
|
|
20
|
-
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
21
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
22
|
-
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
23
|
-
import {
|
|
24
|
-
CallToolRequestSchema,
|
|
25
|
-
type CallToolResult,
|
|
26
|
-
ListToolsRequestSchema,
|
|
27
|
-
} from "@modelcontextprotocol/sdk/types.js";
|
|
28
|
-
import { z } from "zod";
|
|
29
|
-
import type { AgentProject, AuthContext, SessionRecord, TurnOutcome } from "../types.js";
|
|
30
|
-
import { samePrincipal } from "./auth.js";
|
|
31
|
-
import { describeError } from "./describe-error.js";
|
|
32
|
-
import {
|
|
33
|
-
SessionBusyError,
|
|
34
|
-
type SessionEngine,
|
|
35
|
-
ToolInputError,
|
|
36
|
-
ToolNotDirectlyCallableError,
|
|
37
|
-
UnknownSessionError,
|
|
38
|
-
UnknownToolError,
|
|
39
|
-
} from "./session-engine.js";
|
|
40
|
-
|
|
41
|
-
/** Channel id recorded on sessions created through the MCP surface. */
|
|
42
|
-
export const MCP_CHANNEL_ID = "mcp";
|
|
43
|
-
|
|
44
|
-
/** Mount path of the MCP surface, relative to the agent base. */
|
|
45
|
-
export const MCP_ENDPOINT_PATH = "/v1/mcp";
|
|
46
|
-
/** Direct authored server tools used by this agent's cloud turns. */
|
|
47
|
-
export const TOOL_MCP_ENDPOINT_PATH = "/v1/mcp/tools";
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Bounded waits stay below the MCP client default request timeout (60s) so
|
|
51
|
-
* a long model turn degrades to `status: "running"` instead of a client
|
|
52
|
-
* timeout that loses the session id.
|
|
53
|
-
*/
|
|
54
|
-
const MAX_WAIT_SECONDS = 55;
|
|
55
|
-
const DEFAULT_WAIT_SECONDS = 50;
|
|
56
|
-
|
|
57
|
-
export interface AgentMcpEndpoint {
|
|
58
|
-
/**
|
|
59
|
-
* Handle one HTTP request to the MCP mount. `auth` is the principal
|
|
60
|
-
* resolved by the route auth chain; sessions created through `ask` bind
|
|
61
|
-
* to it, and follow-ups enforce the same principal.
|
|
62
|
-
*/
|
|
63
|
-
handle(request: Request, auth: AuthContext | null): Promise<Response>;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** Minimal shape both `McpServer` and the low-level `Server` satisfy. */
|
|
67
|
-
interface ConnectableMcpServer {
|
|
68
|
-
connect(transport: WebStandardStreamableHTTPServerTransport): Promise<void>;
|
|
69
|
-
close(): Promise<void>;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Serve one stateless streamable-HTTP MCP request: a fresh server +
|
|
74
|
-
* transport per POST, JSON response mode, spec-compliant 405 on other
|
|
75
|
-
* methods. Shared by the per-agent MCP endpoint and the Cursor account
|
|
76
|
-
* bridge so the subtle transport/error plumbing exists once.
|
|
77
|
-
*
|
|
78
|
-
* Origin MCP in `backend/server/src/origin/mcp/originMcpHttpHandler.ts`
|
|
79
|
-
* is not a 1:1 copy: it races `request.signal` so a tool that ignores abort
|
|
80
|
-
* cannot hang, while this helper has no such backstop and still leaks an
|
|
81
|
-
* unsettled promise. backend/server cannot import `@cursor/bdk` internals,
|
|
82
|
-
* so Origin diverges on purpose. Do not extract a shared package, and do
|
|
83
|
-
* not port the abort race here, in that stack.
|
|
84
|
-
*/
|
|
85
|
-
export async function handleStatelessMcpRequest(args: {
|
|
86
|
-
request: Request;
|
|
87
|
-
/** Builds the per-request MCP server (tools close over request state). */
|
|
88
|
-
buildServer: () => ConnectableMcpServer;
|
|
89
|
-
/** Label used in the failure log line, e.g. `"mcp endpoint"`. */
|
|
90
|
-
label: string;
|
|
91
|
-
logger?: (line: string) => void;
|
|
92
|
-
}): Promise<Response> {
|
|
93
|
-
const logger = args.logger ?? (() => {});
|
|
94
|
-
if (args.request.method !== "POST") {
|
|
95
|
-
// Stateless server: no server-initiated SSE stream (GET) and no
|
|
96
|
-
// transport sessions to delete (DELETE). 405 per the MCP spec;
|
|
97
|
-
// clients treat it as "streaming unsupported" and carry on.
|
|
98
|
-
return new Response(
|
|
99
|
-
JSON.stringify({
|
|
100
|
-
jsonrpc: "2.0",
|
|
101
|
-
error: { code: -32000, message: "Method not allowed." },
|
|
102
|
-
id: null,
|
|
103
|
-
}),
|
|
104
|
-
{
|
|
105
|
-
status: 405,
|
|
106
|
-
headers: { "content-type": "application/json", allow: "POST" },
|
|
107
|
-
},
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
const server = args.buildServer();
|
|
111
|
-
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
112
|
-
sessionIdGenerator: undefined,
|
|
113
|
-
enableJsonResponse: true,
|
|
114
|
-
});
|
|
115
|
-
try {
|
|
116
|
-
await server.connect(transport);
|
|
117
|
-
// JSON-response mode materializes the full body before resolving,
|
|
118
|
-
// so closing in `finally` never truncates a streamed response.
|
|
119
|
-
return await transport.handleRequest(args.request);
|
|
120
|
-
} catch (error) {
|
|
121
|
-
logger(`[agent-sdk] ${args.label} request failed: ${describeError(error)}`);
|
|
122
|
-
return new Response(
|
|
123
|
-
JSON.stringify({
|
|
124
|
-
jsonrpc: "2.0",
|
|
125
|
-
error: { code: -32603, message: "Internal server error." },
|
|
126
|
-
id: null,
|
|
127
|
-
}),
|
|
128
|
-
{ status: 500, headers: { "content-type": "application/json" } },
|
|
129
|
-
);
|
|
130
|
-
} finally {
|
|
131
|
-
void server.close().catch(() => {});
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/** Tool names the MCP surface exposes for `project` (info projection). */
|
|
136
|
-
export function mcpEndpointToolNames(project: AgentProject): string[] {
|
|
137
|
-
const names = ["ask", "check"];
|
|
138
|
-
if (project.agent.tools.some(tool => tool.execution === "server")) {
|
|
139
|
-
names.push("call_tool");
|
|
140
|
-
}
|
|
141
|
-
return names;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export function createAgentMcpEndpoint(args: {
|
|
145
|
-
engine: SessionEngine;
|
|
146
|
-
logger?: (line: string) => void;
|
|
147
|
-
}): AgentMcpEndpoint {
|
|
148
|
-
const { engine, logger } = args;
|
|
149
|
-
|
|
150
|
-
return {
|
|
151
|
-
handle(request, auth): Promise<Response> {
|
|
152
|
-
return handleStatelessMcpRequest({
|
|
153
|
-
request,
|
|
154
|
-
buildServer: () => buildAgentMcpServer(engine, auth),
|
|
155
|
-
label: "mcp endpoint",
|
|
156
|
-
...(logger === undefined ? {} : { logger }),
|
|
157
|
-
});
|
|
158
|
-
},
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export function createToolMcpEndpoint(args: {
|
|
163
|
-
engine: SessionEngine;
|
|
164
|
-
logger?: (line: string) => void;
|
|
165
|
-
}): AgentMcpEndpoint {
|
|
166
|
-
const { engine, logger } = args;
|
|
167
|
-
return {
|
|
168
|
-
handle(request): Promise<Response> {
|
|
169
|
-
const url = new URL(request.url);
|
|
170
|
-
const sessionId = url.searchParams.get("agentkitSessionId");
|
|
171
|
-
// `connection=<name>` serves a host connection bridge instead of the
|
|
172
|
-
// authored server tools: same endpoint, same auth, same session
|
|
173
|
-
// binding, but tools/list and tools/call forward to `host.mcp` for
|
|
174
|
-
// that connection (see buildConnectionBridgeMcpServer).
|
|
175
|
-
const connection = url.searchParams.get("connection");
|
|
176
|
-
return handleStatelessMcpRequest({
|
|
177
|
-
request,
|
|
178
|
-
buildServer: () =>
|
|
179
|
-
connection === null
|
|
180
|
-
? buildToolMcpServer(engine, sessionId)
|
|
181
|
-
: buildConnectionBridgeMcpServer(engine, sessionId, connection),
|
|
182
|
-
label:
|
|
183
|
-
connection === null
|
|
184
|
-
? "tool mcp endpoint"
|
|
185
|
-
: `connection bridge mcp endpoint (${connection})`,
|
|
186
|
-
...(logger === undefined ? {} : { logger }),
|
|
187
|
-
});
|
|
188
|
-
},
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function buildToolMcpServer(engine: SessionEngine, sessionId: string | null): Server {
|
|
193
|
-
const server = new Server(
|
|
194
|
-
{ name: `${engine.project.name}:tools`, version: "0.1.0" },
|
|
195
|
-
{
|
|
196
|
-
capabilities: { tools: {} },
|
|
197
|
-
instructions:
|
|
198
|
-
"Direct tools implemented by the AgentSDK deployment for its active cloud turn.",
|
|
199
|
-
},
|
|
200
|
-
);
|
|
201
|
-
const tools = engine.project.agent.tools.filter(tool => tool.execution === "server");
|
|
202
|
-
server.setRequestHandler(ListToolsRequestSchema, () =>
|
|
203
|
-
Promise.resolve({
|
|
204
|
-
tools: tools.map(tool => ({
|
|
205
|
-
name: tool.name,
|
|
206
|
-
description: tool.description,
|
|
207
|
-
inputSchema: tool.inputSchema,
|
|
208
|
-
...(tool.outputSchema === undefined ? {} : { outputSchema: tool.outputSchema }),
|
|
209
|
-
})),
|
|
210
|
-
}),
|
|
211
|
-
);
|
|
212
|
-
server.setRequestHandler(CallToolRequestSchema, async request => {
|
|
213
|
-
if (sessionId === null || sessionId === "") {
|
|
214
|
-
return errorResult("Missing AgentSDK session binding.");
|
|
215
|
-
}
|
|
216
|
-
const tool = tools.find(candidate => candidate.name === request.params.name);
|
|
217
|
-
if (tool === undefined) {
|
|
218
|
-
return errorResult(`Unknown server tool "${request.params.name}".`);
|
|
219
|
-
}
|
|
220
|
-
const result = await engine.callActiveServerTool(
|
|
221
|
-
sessionId,
|
|
222
|
-
tool.name,
|
|
223
|
-
request.params.arguments ?? {},
|
|
224
|
-
);
|
|
225
|
-
return sdkResultToMcpResult(result);
|
|
226
|
-
});
|
|
227
|
-
return server;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Host connection bridge: one authored MCP connection served to a cloud turn
|
|
232
|
-
* over the tool MCP endpoint. Listing and calling forward to the host-side
|
|
233
|
-
* client (`host.mcp`), where the connection's credential — account bridge
|
|
234
|
-
* secret or host OAuth token — actually lives, so nothing key-shaped ever
|
|
235
|
-
* travels in the turn's MCP config or lands on the VM.
|
|
236
|
-
*
|
|
237
|
-
* The engine gates access twice, mirroring the authored server-tool path:
|
|
238
|
-
* only bridgeable names (`isCloudBridgedConnection`) — unknown names
|
|
239
|
-
* stay unreachable from a VM even with a valid endpoint credential —
|
|
240
|
-
* and only while the bound session has a turn
|
|
241
|
-
* in flight (`hasActiveTurn`), so a credential that persists on a VM after
|
|
242
|
-
* its turn cannot keep calling host connectors. Listing forwards per
|
|
243
|
-
* request, so a server that adds tools mid-session (`tools/list_changed`,
|
|
244
|
-
* e.g. Datadog's skills-first mode) is picked up on the next list instead
|
|
245
|
-
* of never.
|
|
246
|
-
*/
|
|
247
|
-
function buildConnectionBridgeMcpServer(
|
|
248
|
-
engine: SessionEngine,
|
|
249
|
-
sessionId: string | null,
|
|
250
|
-
connectionName: string,
|
|
251
|
-
): Server {
|
|
252
|
-
const server = new Server(
|
|
253
|
-
{
|
|
254
|
-
name: `${engine.project.name}:bridge:${connectionName}`,
|
|
255
|
-
version: "0.1.0",
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
capabilities: { tools: {} },
|
|
259
|
-
instructions: `Tools from the "${connectionName}" MCP connection, listed and called on the serve host where its credential lives.`,
|
|
260
|
-
},
|
|
261
|
-
);
|
|
262
|
-
const rejected = (): string | undefined => {
|
|
263
|
-
if (sessionId === null || sessionId === "") {
|
|
264
|
-
return "Missing AgentSDK session binding.";
|
|
265
|
-
}
|
|
266
|
-
if (!engine.isCloudBridgedConnection(connectionName)) {
|
|
267
|
-
return `MCP connection "${connectionName}" is not bridged to cloud turns.`;
|
|
268
|
-
}
|
|
269
|
-
if (!engine.hasActiveTurn(sessionId)) {
|
|
270
|
-
return `Session ${sessionId} has no active turn for connection "${connectionName}".`;
|
|
271
|
-
}
|
|
272
|
-
return undefined;
|
|
273
|
-
};
|
|
274
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
275
|
-
const reason = rejected();
|
|
276
|
-
if (reason !== undefined) {
|
|
277
|
-
throw new Error(reason);
|
|
278
|
-
}
|
|
279
|
-
const tools = await engine.runWithMcpPark(sessionId ?? "", "tools/list", () =>
|
|
280
|
-
engine.host.mcp.listTools(connectionName),
|
|
281
|
-
);
|
|
282
|
-
return {
|
|
283
|
-
tools: tools.map(tool => ({
|
|
284
|
-
name: tool.name,
|
|
285
|
-
...(tool.description === undefined ? {} : { description: tool.description }),
|
|
286
|
-
inputSchema: tool.inputSchema ?? { type: "object" },
|
|
287
|
-
...(tool.outputSchema === undefined ? {} : { outputSchema: tool.outputSchema }),
|
|
288
|
-
// Already bounded to the MCP-spec fields at listing time (mcp-host).
|
|
289
|
-
...(tool.annotations === undefined ? {} : { annotations: tool.annotations }),
|
|
290
|
-
})),
|
|
291
|
-
};
|
|
292
|
-
});
|
|
293
|
-
server.setRequestHandler(CallToolRequestSchema, async request => {
|
|
294
|
-
const reason = rejected();
|
|
295
|
-
if (reason !== undefined) {
|
|
296
|
-
return errorResult(reason);
|
|
297
|
-
}
|
|
298
|
-
// The one tool path that never reaches `executeServerTool`, so it asks
|
|
299
|
-
// the policy itself.
|
|
300
|
-
const answer = await engine.bridgedCallAnswer({
|
|
301
|
-
sessionId: sessionId ?? "",
|
|
302
|
-
connectionName,
|
|
303
|
-
toolName: request.params.name,
|
|
304
|
-
input: request.params.arguments,
|
|
305
|
-
});
|
|
306
|
-
if (answer.answered) {
|
|
307
|
-
return sdkResultToMcpResult(answer.result);
|
|
308
|
-
}
|
|
309
|
-
try {
|
|
310
|
-
const result = await engine.runWithMcpPark(sessionId ?? "", request.params.name, () =>
|
|
311
|
-
engine.host.mcp.callTool(
|
|
312
|
-
connectionName,
|
|
313
|
-
request.params.name,
|
|
314
|
-
request.params.arguments ?? {},
|
|
315
|
-
),
|
|
316
|
-
);
|
|
317
|
-
return {
|
|
318
|
-
// The host client already speaks MCP, so the content array is valid
|
|
319
|
-
// CallToolResult content; HostMcpCallResult just types the tail of
|
|
320
|
-
// the union open-endedly.
|
|
321
|
-
content: result.content as CallToolResult["content"],
|
|
322
|
-
...(result.isError === undefined ? {} : { isError: result.isError }),
|
|
323
|
-
...(result.structuredContent === undefined
|
|
324
|
-
? {}
|
|
325
|
-
: { structuredContent: result.structuredContent }),
|
|
326
|
-
};
|
|
327
|
-
} catch (error) {
|
|
328
|
-
return errorResult(
|
|
329
|
-
`MCP connection "${connectionName}" is not reachable from the serve host: ${describeError(error)}`,
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
return server;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// ============================================================================
|
|
337
|
-
// Server construction (per request; tools close over the caller principal)
|
|
338
|
-
// ============================================================================
|
|
339
|
-
|
|
340
|
-
function buildAgentMcpServer(engine: SessionEngine, auth: AuthContext | null): McpServer {
|
|
341
|
-
const project = engine.project;
|
|
342
|
-
const agent = project.agent;
|
|
343
|
-
const server = new McpServer(
|
|
344
|
-
{ name: project.name, version: "0.1.0" },
|
|
345
|
-
{ instructions: buildInstructions(project) },
|
|
346
|
-
);
|
|
347
|
-
|
|
348
|
-
server.registerTool(
|
|
349
|
-
"ask",
|
|
350
|
-
{
|
|
351
|
-
description: buildAskDescription(project),
|
|
352
|
-
inputSchema: {
|
|
353
|
-
message: z.string().describe("The message or task for this agent."),
|
|
354
|
-
sessionId: z
|
|
355
|
-
.string()
|
|
356
|
-
.optional()
|
|
357
|
-
.describe(
|
|
358
|
-
"Existing session to follow up on (from a previous ask). Omit to start a fresh session with fresh context.",
|
|
359
|
-
),
|
|
360
|
-
waitSeconds: z
|
|
361
|
-
.number()
|
|
362
|
-
.min(0)
|
|
363
|
-
.max(MAX_WAIT_SECONDS)
|
|
364
|
-
.optional()
|
|
365
|
-
.describe(
|
|
366
|
-
`How long to wait for the turn to finish before returning status "running" (default ${DEFAULT_WAIT_SECONDS}).`,
|
|
367
|
-
),
|
|
368
|
-
},
|
|
369
|
-
},
|
|
370
|
-
async ({ message, sessionId, waitSeconds }) => {
|
|
371
|
-
try {
|
|
372
|
-
const targetSessionId = await (sessionId === undefined
|
|
373
|
-
? startSession(engine, auth, message)
|
|
374
|
-
: followUpSession(engine, auth, sessionId, message));
|
|
375
|
-
const payload = await waitForReply(
|
|
376
|
-
engine,
|
|
377
|
-
targetSessionId,
|
|
378
|
-
waitSeconds ?? DEFAULT_WAIT_SECONDS,
|
|
379
|
-
);
|
|
380
|
-
return toToolResult(payload);
|
|
381
|
-
} catch (error) {
|
|
382
|
-
return errorResult(describeError(error));
|
|
383
|
-
}
|
|
384
|
-
},
|
|
385
|
-
);
|
|
386
|
-
|
|
387
|
-
server.registerTool(
|
|
388
|
-
"check",
|
|
389
|
-
{
|
|
390
|
-
description:
|
|
391
|
-
'Wait for (or poll) a session started with ask. Returns the final reply once the turn completes, or status "running" to keep waiting. Use waitSeconds: 0 for a non-blocking poll.',
|
|
392
|
-
inputSchema: {
|
|
393
|
-
sessionId: z.string().describe("Session id returned by ask."),
|
|
394
|
-
waitSeconds: z
|
|
395
|
-
.number()
|
|
396
|
-
.min(0)
|
|
397
|
-
.max(MAX_WAIT_SECONDS)
|
|
398
|
-
.optional()
|
|
399
|
-
.describe(
|
|
400
|
-
`How long to wait for the running turn before returning status "running" (default ${DEFAULT_WAIT_SECONDS}).`,
|
|
401
|
-
),
|
|
402
|
-
},
|
|
403
|
-
},
|
|
404
|
-
async ({ sessionId, waitSeconds }) => {
|
|
405
|
-
try {
|
|
406
|
-
await requireOwnedSession(engine, auth, sessionId);
|
|
407
|
-
const payload = await waitForReply(engine, sessionId, waitSeconds ?? DEFAULT_WAIT_SECONDS);
|
|
408
|
-
return toToolResult(payload);
|
|
409
|
-
} catch (error) {
|
|
410
|
-
return errorResult(describeError(error));
|
|
411
|
-
}
|
|
412
|
-
},
|
|
413
|
-
);
|
|
414
|
-
|
|
415
|
-
const serverTools = agent.tools.filter(tool => tool.execution === "server");
|
|
416
|
-
if (serverTools.length > 0) {
|
|
417
|
-
server.registerTool(
|
|
418
|
-
"call_tool",
|
|
419
|
-
{
|
|
420
|
-
description: `Call one of this agent's deterministic server tools directly (no model turn decides anything). Available tools: ${serverTools
|
|
421
|
-
.map(tool => tool.name)
|
|
422
|
-
.join(", ")}.`,
|
|
423
|
-
inputSchema: {
|
|
424
|
-
toolName: z.string().describe("Name of the server tool to call."),
|
|
425
|
-
input: z
|
|
426
|
-
.record(z.unknown())
|
|
427
|
-
.optional()
|
|
428
|
-
.describe("Tool input, validated against the tool's schema."),
|
|
429
|
-
sessionId: z
|
|
430
|
-
.string()
|
|
431
|
-
.optional()
|
|
432
|
-
.describe(
|
|
433
|
-
"Run the tool inside an existing session (recorded on its event stream). Omit for an ephemeral scratch workspace.",
|
|
434
|
-
),
|
|
435
|
-
},
|
|
436
|
-
},
|
|
437
|
-
async ({ toolName, input, sessionId }) => {
|
|
438
|
-
try {
|
|
439
|
-
if (sessionId !== undefined) {
|
|
440
|
-
await requireOwnedSession(engine, auth, sessionId);
|
|
441
|
-
}
|
|
442
|
-
const outcome = await engine.callTool(toolName, input ?? {}, {
|
|
443
|
-
auth,
|
|
444
|
-
...(sessionId === undefined ? {} : { sessionId }),
|
|
445
|
-
});
|
|
446
|
-
return {
|
|
447
|
-
content: [
|
|
448
|
-
{
|
|
449
|
-
type: "text" as const,
|
|
450
|
-
text: JSON.stringify({
|
|
451
|
-
toolName: outcome.toolName,
|
|
452
|
-
isError: outcome.isError,
|
|
453
|
-
result: outcome.result,
|
|
454
|
-
durationMs: outcome.durationMs,
|
|
455
|
-
...(outcome.errorMessage === undefined
|
|
456
|
-
? {}
|
|
457
|
-
: { errorMessage: outcome.errorMessage }),
|
|
458
|
-
}),
|
|
459
|
-
},
|
|
460
|
-
],
|
|
461
|
-
...(outcome.isError ? { isError: true as const } : {}),
|
|
462
|
-
};
|
|
463
|
-
} catch (error) {
|
|
464
|
-
if (error instanceof UnknownToolError) {
|
|
465
|
-
return errorResult(
|
|
466
|
-
`${error.message}. Available tools: ${error.availableToolNames.join(", ") || "(none)"}.`,
|
|
467
|
-
);
|
|
468
|
-
}
|
|
469
|
-
if (
|
|
470
|
-
error instanceof ToolNotDirectlyCallableError ||
|
|
471
|
-
error instanceof ToolInputError ||
|
|
472
|
-
error instanceof SessionBusyError ||
|
|
473
|
-
error instanceof UnknownSessionError
|
|
474
|
-
) {
|
|
475
|
-
return errorResult(error.message);
|
|
476
|
-
}
|
|
477
|
-
return errorResult(describeError(error));
|
|
478
|
-
}
|
|
479
|
-
},
|
|
480
|
-
);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
return server;
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
function buildInstructions(project: AgentProject): string {
|
|
487
|
-
const agent = project.agent;
|
|
488
|
-
const parts = [
|
|
489
|
-
`This MCP server fronts the Cursor agent "${project.name}".`,
|
|
490
|
-
...(agent.description === undefined ? [] : [agent.description]),
|
|
491
|
-
'Delegate a task with the ask tool: each call without a sessionId starts a fresh session (fresh context); pass the returned sessionId to continue the same conversation. When ask returns status "running", call check with that sessionId to keep waiting for the reply.',
|
|
492
|
-
];
|
|
493
|
-
return parts.join(" ");
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
function buildAskDescription(project: AgentProject): string {
|
|
497
|
-
const description = project.agent.description;
|
|
498
|
-
const purpose =
|
|
499
|
-
description === undefined || description.trim() === ""
|
|
500
|
-
? `the "${project.name}" agent`
|
|
501
|
-
: `the "${project.name}" agent — ${description.trim()}`;
|
|
502
|
-
return `Send a message to ${purpose}. Runs a full model turn in that agent's own context and returns its reply. Omit sessionId to start a fresh session; pass it to follow up. Long turns return status "running" — call check with the sessionId to keep waiting.`;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
// ============================================================================
|
|
506
|
-
// Session helpers
|
|
507
|
-
// ============================================================================
|
|
508
|
-
|
|
509
|
-
async function startSession(
|
|
510
|
-
engine: SessionEngine,
|
|
511
|
-
auth: AuthContext | null,
|
|
512
|
-
message: string,
|
|
513
|
-
): Promise<string> {
|
|
514
|
-
const session = await engine.send(MCP_CHANNEL_ID, message, { auth });
|
|
515
|
-
return session.id;
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
async function followUpSession(
|
|
519
|
-
engine: SessionEngine,
|
|
520
|
-
auth: AuthContext | null,
|
|
521
|
-
sessionId: string,
|
|
522
|
-
message: string,
|
|
523
|
-
): Promise<string> {
|
|
524
|
-
const record = await requireOwnedSession(engine, auth, sessionId);
|
|
525
|
-
if (record.mode === "task") {
|
|
526
|
-
throw new Error(
|
|
527
|
-
`Session ${sessionId} is a fire-and-forget task session; it does not accept follow-ups.`,
|
|
528
|
-
);
|
|
529
|
-
}
|
|
530
|
-
if (record.continuationKey === null) {
|
|
531
|
-
throw new Error(
|
|
532
|
-
`Session ${sessionId} is not addressable for follow-ups (no active continuation).`,
|
|
533
|
-
);
|
|
534
|
-
}
|
|
535
|
-
// Send as the session owner after the ownership gate above, mirroring the
|
|
536
|
-
// HTTP follow-up route (machine callers address sessions by id; the HTTP
|
|
537
|
-
// continuation token is not rotated).
|
|
538
|
-
await engine.send(record.channelId, message, {
|
|
539
|
-
auth: record.auth,
|
|
540
|
-
continuationToken: record.continuationKey,
|
|
541
|
-
});
|
|
542
|
-
return sessionId;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
async function requireOwnedSession(
|
|
546
|
-
engine: SessionEngine,
|
|
547
|
-
auth: AuthContext | null,
|
|
548
|
-
sessionId: string,
|
|
549
|
-
): Promise<SessionRecord> {
|
|
550
|
-
const record = await engine.sessions.get(sessionId);
|
|
551
|
-
if (record === undefined) {
|
|
552
|
-
throw new UnknownSessionError(sessionId);
|
|
553
|
-
}
|
|
554
|
-
if (!samePrincipal(record.auth, auth)) {
|
|
555
|
-
throw new Error(
|
|
556
|
-
`Session ${sessionId} belongs to a different principal; use the credentials that created it.`,
|
|
557
|
-
);
|
|
558
|
-
}
|
|
559
|
-
return record;
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
interface ReplyPayload {
|
|
563
|
-
status: "completed" | "running" | "error" | "cancelled";
|
|
564
|
-
sessionId: string;
|
|
565
|
-
reply?: string;
|
|
566
|
-
errorMessage?: string;
|
|
567
|
-
note?: string;
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
async function waitForReply(
|
|
571
|
-
engine: SessionEngine,
|
|
572
|
-
sessionId: string,
|
|
573
|
-
waitSeconds: number,
|
|
574
|
-
): Promise<ReplyPayload> {
|
|
575
|
-
const waitMs = Math.max(0, Math.min(waitSeconds, MAX_WAIT_SECONDS)) * 1000;
|
|
576
|
-
const outcome = await raceTimeout(engine.waitForCompletion(sessionId), waitMs);
|
|
577
|
-
if (outcome === undefined) {
|
|
578
|
-
return {
|
|
579
|
-
status: "running",
|
|
580
|
-
sessionId,
|
|
581
|
-
note: `The turn is still running. Call check with { "sessionId": "${sessionId}" } to keep waiting.`,
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
return toReplyPayload(engine, sessionId, outcome);
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
async function toReplyPayload(
|
|
588
|
-
engine: SessionEngine,
|
|
589
|
-
sessionId: string,
|
|
590
|
-
outcome: TurnOutcome,
|
|
591
|
-
): Promise<ReplyPayload> {
|
|
592
|
-
if (outcome.status === "finished") {
|
|
593
|
-
let reply = outcome.result;
|
|
594
|
-
if (reply === undefined || reply === "") {
|
|
595
|
-
// The engine's in-memory outcome is gone after a host restart; fall
|
|
596
|
-
// back to the durable event log for the last completed turn.
|
|
597
|
-
reply = await latestReplyFromEvents(engine, sessionId);
|
|
598
|
-
}
|
|
599
|
-
return {
|
|
600
|
-
status: "completed",
|
|
601
|
-
sessionId,
|
|
602
|
-
...(reply === undefined ? {} : { reply }),
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
if (outcome.status === "cancelled") {
|
|
606
|
-
return {
|
|
607
|
-
status: "cancelled",
|
|
608
|
-
sessionId,
|
|
609
|
-
errorMessage: outcome.errorMessage ?? "The turn was cancelled.",
|
|
610
|
-
};
|
|
611
|
-
}
|
|
612
|
-
return {
|
|
613
|
-
status: "error",
|
|
614
|
-
sessionId,
|
|
615
|
-
errorMessage: outcome.errorMessage ?? "The turn failed.",
|
|
616
|
-
};
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
async function latestReplyFromEvents(
|
|
620
|
-
engine: SessionEngine,
|
|
621
|
-
sessionId: string,
|
|
622
|
-
): Promise<string | undefined> {
|
|
623
|
-
let events: Awaited<ReturnType<SessionEngine["listEvents"]>>;
|
|
624
|
-
try {
|
|
625
|
-
events = await engine.listEvents(sessionId);
|
|
626
|
-
} catch {
|
|
627
|
-
return undefined;
|
|
628
|
-
}
|
|
629
|
-
for (let i = events.length - 1; i >= 0; i--) {
|
|
630
|
-
const event = events[i];
|
|
631
|
-
if (event === undefined) {
|
|
632
|
-
continue;
|
|
633
|
-
}
|
|
634
|
-
if (event.type === "turn.completed" && event.data.result !== undefined) {
|
|
635
|
-
return event.data.result;
|
|
636
|
-
}
|
|
637
|
-
if (event.type === "message.completed" && event.data.text !== "") {
|
|
638
|
-
return event.data.text;
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
return undefined;
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
// ============================================================================
|
|
645
|
-
// Result shaping
|
|
646
|
-
// ============================================================================
|
|
647
|
-
|
|
648
|
-
interface McpToolResult {
|
|
649
|
-
content: Array<{ type: "text"; text: string }>;
|
|
650
|
-
isError?: true;
|
|
651
|
-
[key: string]: unknown;
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
function toToolResult(payload: ReplyPayload): McpToolResult {
|
|
655
|
-
return {
|
|
656
|
-
content: [{ type: "text", text: JSON.stringify(payload) }],
|
|
657
|
-
...(payload.status === "error" ? { isError: true as const } : {}),
|
|
658
|
-
};
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
function errorResult(message: string): McpToolResult {
|
|
662
|
-
return {
|
|
663
|
-
content: [{ type: "text", text: message }],
|
|
664
|
-
isError: true,
|
|
665
|
-
};
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
function sdkResultToMcpResult(result: SDKCustomToolResult) {
|
|
669
|
-
if (isSdkToolEnvelope(result)) {
|
|
670
|
-
return {
|
|
671
|
-
content: result.content.map(toMcpContent),
|
|
672
|
-
...(result.isError === true ? { isError: true } : {}),
|
|
673
|
-
...(result.structuredContent === undefined
|
|
674
|
-
? {}
|
|
675
|
-
: { structuredContent: result.structuredContent }),
|
|
676
|
-
};
|
|
677
|
-
}
|
|
678
|
-
if (typeof result === "string") {
|
|
679
|
-
return { content: [{ type: "text" as const, text: result }] };
|
|
680
|
-
}
|
|
681
|
-
return {
|
|
682
|
-
content: [{ type: "text" as const, text: JSON.stringify(result) }],
|
|
683
|
-
...(isJsonObject(result) ? { structuredContent: result } : {}),
|
|
684
|
-
};
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
function toMcpContent(content: SDKCustomToolContent) {
|
|
688
|
-
if (content.type === "text") {
|
|
689
|
-
return content;
|
|
690
|
-
}
|
|
691
|
-
return {
|
|
692
|
-
type: "image" as const,
|
|
693
|
-
data: content.data,
|
|
694
|
-
mimeType: content.mimeType ?? "application/octet-stream",
|
|
695
|
-
};
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
function isSdkToolEnvelope(
|
|
699
|
-
result: SDKCustomToolResult,
|
|
700
|
-
): result is Extract<SDKCustomToolResult, { content: unknown }> {
|
|
701
|
-
return (
|
|
702
|
-
typeof result === "object" &&
|
|
703
|
-
result !== null &&
|
|
704
|
-
!Array.isArray(result) &&
|
|
705
|
-
"content" in result &&
|
|
706
|
-
Array.isArray(result.content) &&
|
|
707
|
-
result.content.every(isSdkToolContent)
|
|
708
|
-
);
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
function isSdkToolContent(value: unknown): value is SDKCustomToolContent {
|
|
712
|
-
if (typeof value !== "object" || value === null || !("type" in value)) {
|
|
713
|
-
return false;
|
|
714
|
-
}
|
|
715
|
-
if (value.type === "text") {
|
|
716
|
-
return "text" in value && typeof value.text === "string";
|
|
717
|
-
}
|
|
718
|
-
return (
|
|
719
|
-
value.type === "image" &&
|
|
720
|
-
"data" in value &&
|
|
721
|
-
typeof value.data === "string" &&
|
|
722
|
-
(!("mimeType" in value) || value.mimeType === undefined || typeof value.mimeType === "string")
|
|
723
|
-
);
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
function isJsonObject(value: SDKJsonValue): value is Record<string, SDKJsonValue> {
|
|
727
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
/** Resolve to the promise value, or undefined once `ms` elapses first. */
|
|
731
|
-
function raceTimeout<T>(promise: Promise<T>, ms: number): Promise<T | undefined> {
|
|
732
|
-
return new Promise<T | undefined>((resolve, reject) => {
|
|
733
|
-
const timer = setTimeout(() => {
|
|
734
|
-
resolve(undefined);
|
|
735
|
-
}, ms);
|
|
736
|
-
promise.then(
|
|
737
|
-
value => {
|
|
738
|
-
clearTimeout(timer);
|
|
739
|
-
resolve(value);
|
|
740
|
-
},
|
|
741
|
-
(error: unknown) => {
|
|
742
|
-
clearTimeout(timer);
|
|
743
|
-
reject(error instanceof Error ? error : new Error(String(error)));
|
|
744
|
-
},
|
|
745
|
-
);
|
|
746
|
-
});
|
|
747
|
-
}
|