@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,1504 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thin client for the Agent Serve deployment management API
|
|
3
|
-
* (`/internal/agent-serve/deployments` on the Cursor backend) and the v2
|
|
4
|
-
* AgentSDK accept path (`/internal/agentsdk/deployments`). Pure
|
|
5
|
-
* request/response + error mapping — no console I/O, no polling loops;
|
|
6
|
-
* rendering lives in `cli-deploy.ts`.
|
|
7
|
-
*
|
|
8
|
-
* Auth is the user API key sent directly as the bearer (the routes are
|
|
9
|
-
* `wrapUserApiRoute` on the backend); there is no token exchange here.
|
|
10
|
-
* The endpoints are gated on the `agent_serve_mvp` Statsig gate and 404
|
|
11
|
-
* when it is off — the error mapping says so instead of "not found".
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { z } from "zod";
|
|
15
|
-
import {
|
|
16
|
-
MAX_SECRET_VALUE_BYTES,
|
|
17
|
-
MAX_SECRETS,
|
|
18
|
-
validateEgressDomain,
|
|
19
|
-
validateSettableSecretName,
|
|
20
|
-
} from "./hosting.js";
|
|
21
|
-
|
|
22
|
-
export type DeploymentStatus =
|
|
23
|
-
| "pending"
|
|
24
|
-
| "deploying"
|
|
25
|
-
| "running"
|
|
26
|
-
| "degraded"
|
|
27
|
-
| "failed"
|
|
28
|
-
| "stopping"
|
|
29
|
-
| "stopped"
|
|
30
|
-
| "deleting";
|
|
31
|
-
|
|
32
|
-
/** Customer-safe deploy progress (no hosting phase / infra names). */
|
|
33
|
-
export type DeploymentProgress =
|
|
34
|
-
| "queued"
|
|
35
|
-
| "preparing"
|
|
36
|
-
| "creating"
|
|
37
|
-
| "building"
|
|
38
|
-
| "starting"
|
|
39
|
-
| "finalizing"
|
|
40
|
-
| "running"
|
|
41
|
-
| "failed"
|
|
42
|
-
| "stopping"
|
|
43
|
-
| "stopped"
|
|
44
|
-
| "deleting"
|
|
45
|
-
| "degraded";
|
|
46
|
-
|
|
47
|
-
export const TERMINAL_DEPLOY_STATUSES: ReadonlySet<DeploymentStatus> = new Set([
|
|
48
|
-
"running",
|
|
49
|
-
"degraded",
|
|
50
|
-
"failed",
|
|
51
|
-
"stopped",
|
|
52
|
-
]);
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* What gets deployed. Today the control plane builds the engine itself from
|
|
56
|
-
* a git ref, so the only member is the slug/git-ref shape. When
|
|
57
|
-
* artifact-based deploys ship ("build locally + upload"), add an
|
|
58
|
-
* `{ kind: "artifact", ... }` member here and a branch in
|
|
59
|
-
* {@link AgentServeDeployClient.deploy} — the command surface and everything
|
|
60
|
-
* downstream stays unchanged.
|
|
61
|
-
*/
|
|
62
|
-
export type DeploySource = {
|
|
63
|
-
kind: "git-ref";
|
|
64
|
-
gitRepoUrl: string;
|
|
65
|
-
gitRef?: string;
|
|
66
|
-
agentPath?: string;
|
|
67
|
-
/** Repos whose SCM events the deployed engine pulls (`owner/name`). */
|
|
68
|
-
cursorEventRepos?: string[];
|
|
69
|
-
/**
|
|
70
|
-
* Egress allowlist for the engine pod.
|
|
71
|
-
*/
|
|
72
|
-
egressAllowedDomains?: string[];
|
|
73
|
-
/**
|
|
74
|
-
* `/v1/channels/…` subtrees the stable alias serves WITHOUT
|
|
75
|
-
* `X-Agent-Alias-Token` (channels authored with `publicEndpoint()`).
|
|
76
|
-
*/
|
|
77
|
-
publicRoutePaths?: string[];
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const SLUG_PATTERN = /^[a-z0-9_-]{1,64}$/;
|
|
81
|
-
|
|
82
|
-
/** Returns a human error message, or undefined when the slug is valid. */
|
|
83
|
-
export function validateDeploymentSlug(slug: string): string | undefined {
|
|
84
|
-
if (SLUG_PATTERN.test(slug)) {
|
|
85
|
-
return undefined;
|
|
86
|
-
}
|
|
87
|
-
return `Invalid slug ${JSON.stringify(slug)}: use lowercase letters, digits, '-' or '_' (max 64 chars)`;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** Derive a valid slug from a directory name, or undefined if impossible. */
|
|
91
|
-
export function slugFromDirectoryName(name: string): string | undefined {
|
|
92
|
-
const slug = name
|
|
93
|
-
.toLowerCase()
|
|
94
|
-
.replace(/[^a-z0-9_-]+/g, "-")
|
|
95
|
-
.replace(/^-+|-+$/g, "")
|
|
96
|
-
.slice(0, 64);
|
|
97
|
-
return SLUG_PATTERN.test(slug) ? slug : undefined;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export class DeployApiError extends Error {
|
|
101
|
-
constructor(
|
|
102
|
-
message: string,
|
|
103
|
-
readonly status: number,
|
|
104
|
-
/** Seconds to wait before retrying (from `Retry-After` on 429s). */
|
|
105
|
-
readonly retryAfterSeconds?: number,
|
|
106
|
-
) {
|
|
107
|
-
super(message);
|
|
108
|
-
this.name = "DeployApiError";
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// ============================================================================
|
|
113
|
-
// Response shapes (backend `serializeDeployment` + route-specific bodies).
|
|
114
|
-
// Interfaces are hand-written (the package compiles with
|
|
115
|
-
// --isolatedDeclarations, so exported types cannot be z.infer of an
|
|
116
|
-
// unannotated schema); the zod schemas below stay module-internal.
|
|
117
|
-
// ============================================================================
|
|
118
|
-
|
|
119
|
-
export interface DeployAccepted {
|
|
120
|
-
id: number;
|
|
121
|
-
slug: string;
|
|
122
|
-
teamId: number;
|
|
123
|
-
status: string;
|
|
124
|
-
generation: number;
|
|
125
|
-
deploymentKind: string;
|
|
126
|
-
engineAlias: string;
|
|
127
|
-
/** Present exactly once, on the deploy that minted the record. */
|
|
128
|
-
aliasToken?: string;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export interface Deployment {
|
|
132
|
-
id: number;
|
|
133
|
-
slug: string;
|
|
134
|
-
teamId: number;
|
|
135
|
-
deploymentKind: string;
|
|
136
|
-
gitRepoUrl?: string | null;
|
|
137
|
-
gitRef?: string;
|
|
138
|
-
agentPath?: string;
|
|
139
|
-
desiredState?: string;
|
|
140
|
-
status: DeploymentStatus;
|
|
141
|
-
/**
|
|
142
|
-
* Customer-safe deploy progress (no hosting internals). Present on newer
|
|
143
|
-
* backends; older responses omit it.
|
|
144
|
-
*/
|
|
145
|
-
progress?: DeploymentProgress;
|
|
146
|
-
/**
|
|
147
|
-
* Live step while the deploy converges (e.g. "Checking out source…").
|
|
148
|
-
* Null when running / stopped or when only a failure is on the row.
|
|
149
|
-
* Present on newer backends; older responses omit it.
|
|
150
|
-
*/
|
|
151
|
-
statusMessage?: string | null;
|
|
152
|
-
generation: number;
|
|
153
|
-
observedGeneration?: number | null;
|
|
154
|
-
engineGeneration?: number | null;
|
|
155
|
-
publicId?: string;
|
|
156
|
-
engineUrl?: string | null;
|
|
157
|
-
/** Anyrun pod id for the active engine, when coordinates are known. */
|
|
158
|
-
enginePodId?: string | null;
|
|
159
|
-
lastError?: string | null;
|
|
160
|
-
engineAlias: string;
|
|
161
|
-
desiredUpdatedAt?: string;
|
|
162
|
-
lastReconciledAt?: string | null;
|
|
163
|
-
/** SCM-event repos configured on the deployment (`owner/name`). */
|
|
164
|
-
cursorEventRepos?: string[];
|
|
165
|
-
/** Normalized egress allowlist for the engine pod. */
|
|
166
|
-
egressAllowedDomains?: string[];
|
|
167
|
-
/** Channel subtrees the alias serves without `X-Agent-Alias-Token`. */
|
|
168
|
-
publicRoutePaths?: string[];
|
|
169
|
-
/** Service-account id (`sa_…`); null on legacy rows. */
|
|
170
|
-
serviceAccountId?: string | number | null;
|
|
171
|
-
/**
|
|
172
|
-
* The durable file store's address on `/v0/agent-serve-files` (also pinned
|
|
173
|
-
* into the pod env as `AGENT_SERVE_STORE_SOURCE_ID`).
|
|
174
|
-
*/
|
|
175
|
-
agentStoreSourceId?: string;
|
|
176
|
-
/** Masked pod credential; the raw key is never returned. */
|
|
177
|
-
podCredentialMaskedKey?: string | null;
|
|
178
|
-
/** Names of the secrets set on the deployment (values never returned). */
|
|
179
|
-
secretNames?: string[];
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/** Short-lived direct pod access minted by the status route. */
|
|
183
|
-
export interface EngineAccess {
|
|
184
|
-
url: string;
|
|
185
|
-
headers: Record<string, string>;
|
|
186
|
-
expiresAt: string;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
export interface DeploymentDetail extends Deployment {
|
|
190
|
-
engineAccess?: EngineAccess | null;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* The deployment's dedicated service-account id (`sa_…`), or undefined for
|
|
195
|
-
* legacy rows that predate service-account-backed deploys. Normalizes the
|
|
196
|
-
* wire shape (string in prod, number in old fixtures, null when unset).
|
|
197
|
-
*/
|
|
198
|
-
export function deploymentServiceAccountId(
|
|
199
|
-
deployment: Pick<Deployment, "serviceAccountId">,
|
|
200
|
-
): string | undefined {
|
|
201
|
-
const raw = deployment.serviceAccountId;
|
|
202
|
-
if (raw === null || raw === undefined) {
|
|
203
|
-
return undefined;
|
|
204
|
-
}
|
|
205
|
-
const id = String(raw).trim();
|
|
206
|
-
return id === "" ? undefined : id;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export interface StopAccepted {
|
|
210
|
-
id: number;
|
|
211
|
-
status: string;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
export type DeleteAccepted = StopAccepted;
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* `POST /internal/agentsdk/deployments` 202 body. Distinct from v1
|
|
218
|
-
* {@link DeployAccepted}: the v2 control plane returns catalog ids, not
|
|
219
|
-
* an engine alias or one-shot alias token.
|
|
220
|
-
*/
|
|
221
|
-
export interface AgentkitDeployAccepted {
|
|
222
|
-
applicationId: string;
|
|
223
|
-
releaseId: string;
|
|
224
|
-
status: string;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* One release component of a v2 multi-component deploy: a stable key (the
|
|
229
|
-
* child agent's slug) plus that agent's directory relative to the repo
|
|
230
|
-
* root.
|
|
231
|
-
*/
|
|
232
|
-
export interface AgentkitDeployComponent {
|
|
233
|
-
componentKey: string;
|
|
234
|
-
agentPath?: string;
|
|
235
|
-
persistent?: boolean;
|
|
236
|
-
/** Team container image (`agent-sdk images push`) this component runs in. */
|
|
237
|
-
image?: string;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/** Customer-visible v2 deploy status (`GET /internal/agentsdk/deployments/:slug`). */
|
|
241
|
-
export type AgentkitCustomerStatus = "pending" | "deploying" | "running" | "failed" | "stopped";
|
|
242
|
-
|
|
243
|
-
export type AgentkitDeployProgress =
|
|
244
|
-
| "queued"
|
|
245
|
-
| "creating"
|
|
246
|
-
| "building"
|
|
247
|
-
| "starting"
|
|
248
|
-
| "finalizing"
|
|
249
|
-
| "running"
|
|
250
|
-
| "failed"
|
|
251
|
-
| "stopped";
|
|
252
|
-
|
|
253
|
-
export interface AgentkitDeployStatus {
|
|
254
|
-
applicationId: string;
|
|
255
|
-
releaseId: string;
|
|
256
|
-
slug: string;
|
|
257
|
-
teamId: number;
|
|
258
|
-
status: AgentkitCustomerStatus;
|
|
259
|
-
progress: AgentkitDeployProgress;
|
|
260
|
-
statusMessage: string | null;
|
|
261
|
-
/** Why the bake failed. Null/absent unless `status` is `failed`. */
|
|
262
|
-
lastError?: string | null;
|
|
263
|
-
/**
|
|
264
|
-
* `owner/name` scopes the deployment's GitHub/Origin channels watch.
|
|
265
|
-
* Absent on control planes that predate the field.
|
|
266
|
-
*/
|
|
267
|
-
repositories?: string[];
|
|
268
|
-
/** Names of application-scoped secrets (values are never returned). */
|
|
269
|
-
secretNames?: string[];
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/** One v2 application from `GET /internal/agentsdk/deployments`. */
|
|
273
|
-
export interface AgentkitDeploymentListItem {
|
|
274
|
-
architecture: "v2";
|
|
275
|
-
applicationId: string;
|
|
276
|
-
releaseId: string;
|
|
277
|
-
slug: string;
|
|
278
|
-
teamId: number;
|
|
279
|
-
status: AgentkitCustomerStatus;
|
|
280
|
-
deployments: Array<{ desiredUpdatedAt: string }>;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
export const TERMINAL_AGENTKIT_DEPLOY_STATUSES: ReadonlySet<AgentkitCustomerStatus> = new Set([
|
|
284
|
-
"running",
|
|
285
|
-
"failed",
|
|
286
|
-
"stopped",
|
|
287
|
-
]);
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* `POST /internal/agentsdk/deployments/:slug/stop` 202 body. Like v1
|
|
291
|
-
* {@link StopAccepted} but keyed by catalog ids instead of the numeric
|
|
292
|
-
* deployment row id.
|
|
293
|
-
*/
|
|
294
|
-
export interface AgentkitStopAccepted {
|
|
295
|
-
applicationId: string;
|
|
296
|
-
releaseId: string;
|
|
297
|
-
status: string;
|
|
298
|
-
/**
|
|
299
|
-
* `"global"` when the backend stopped every tenant install of a
|
|
300
|
-
* multi-tenant app. Resume with `start <slug>`.
|
|
301
|
-
*/
|
|
302
|
-
scope?: "global";
|
|
303
|
-
deployLocked?: boolean;
|
|
304
|
-
cancellation?: AgentkitCancelRunsResult;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
export interface AgentkitGlobalSuspensionAccepted {
|
|
308
|
-
applicationId: string;
|
|
309
|
-
status: "running" | "stopped";
|
|
310
|
-
cancellation?: AgentkitCancelRunsResult;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
export interface AgentkitCancelRunsResult {
|
|
314
|
-
batchesStarted: number;
|
|
315
|
-
failed: number;
|
|
316
|
-
sessionsMarkedFailed?: number;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
const agentkitCancelRunsResultSchema: z.ZodType<AgentkitCancelRunsResult> = z.object({
|
|
320
|
-
batchesStarted: z.number().int().nonnegative(),
|
|
321
|
-
failed: z.number().int().nonnegative(),
|
|
322
|
-
sessionsMarkedFailed: z.number().int().nonnegative().optional(),
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
const agentkitEventRepositoriesSchema = z.object({
|
|
326
|
-
repositories: z.array(z.string()),
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
const agentkitInstallReleaseSchema = z.object({
|
|
330
|
-
releaseId: z.string(),
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* `POST /internal/agentsdk/deployments/:slug/sessions` 202 body. A hosted v2
|
|
335
|
-
* session start is a Temporal delivery: a fresh start allocates `ses_…`
|
|
336
|
-
* only after admission (poll the session list), so the ack is the delivery
|
|
337
|
-
* and workflow ids. `sessionId` is present only when the call resumed one.
|
|
338
|
-
*/
|
|
339
|
-
export interface AgentkitStartSessionAccepted {
|
|
340
|
-
deliveryId: string;
|
|
341
|
-
workflowId: string;
|
|
342
|
-
sessionMode: "event" | "continuation";
|
|
343
|
-
sessionId?: string;
|
|
344
|
-
dryRun?: true;
|
|
345
|
-
asOf?: string;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* One hosted execution of a v2 session: a pod wake that ran (or tried to
|
|
350
|
-
* run) a turn. `turnStatus` is the engine's outcome (`finished`, `error`,
|
|
351
|
-
* `running`, …); `processDeath` marks an entry flushed from a crash handler.
|
|
352
|
-
*/
|
|
353
|
-
export interface AgentkitSessionRun {
|
|
354
|
-
executionId: string;
|
|
355
|
-
writtenAt: string;
|
|
356
|
-
turnStatus: string;
|
|
357
|
-
durationMs: number;
|
|
358
|
-
message?: string;
|
|
359
|
-
error?: { name: string; message: string; stack?: string };
|
|
360
|
-
processDeath?: boolean;
|
|
361
|
-
logs: Array<{ index: number; at: string; line: string }>;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* `GET /internal/agentsdk/deployments/:slug/sessions/:sessionId/runs` body.
|
|
366
|
-
* A v2 deployment has no resident engine to query, so these durable
|
|
367
|
-
* control-plane snapshots are the session's history.
|
|
368
|
-
*/
|
|
369
|
-
export interface AgentkitSessionRuns {
|
|
370
|
-
executions: AgentkitSessionRun[];
|
|
371
|
-
/** Engine start.log tee; null when the framework store has no snapshot. */
|
|
372
|
-
startLog: string | null;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/** One secret's metadata from the list endpoint — names only, never values. */
|
|
376
|
-
export interface SecretInfo {
|
|
377
|
-
name: string;
|
|
378
|
-
createdAt: string;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
/** One pushed container image (`agent-sdk images list`). */
|
|
382
|
-
export interface ContainerImageInfo {
|
|
383
|
-
name: string;
|
|
384
|
-
sizeBytes: number;
|
|
385
|
-
sha256: string | null;
|
|
386
|
-
dockerImageId: string | null;
|
|
387
|
-
platform: string | null;
|
|
388
|
-
pushedByUserId: number | null;
|
|
389
|
-
pushedAt: string;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/** Phase one of `images push`: an open multipart upload and its presigned part URLs. */
|
|
393
|
-
export interface ContainerImageUpload {
|
|
394
|
-
name: string;
|
|
395
|
-
uploadId: string;
|
|
396
|
-
partSizeBytes: number;
|
|
397
|
-
parts: Array<{ partNumber: number; url: string }>;
|
|
398
|
-
expiresAt: string;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* `GET /internal/agent-serve/automations/:uuid/export` response
|
|
403
|
-
* (backend `agentServeAutomationExport.ts`). Name + transport references
|
|
404
|
-
* only — the backend never exports URLs or credential material.
|
|
405
|
-
*/
|
|
406
|
-
export interface AutomationExportMcpServer {
|
|
407
|
-
id?: string;
|
|
408
|
-
name: string;
|
|
409
|
-
transportType: "http" | "sse" | "stdio";
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
export interface AutomationExport {
|
|
413
|
-
automation: {
|
|
414
|
-
uuid: string;
|
|
415
|
-
name: string;
|
|
416
|
-
enabled: boolean;
|
|
417
|
-
scope: string;
|
|
418
|
-
webUrl: string;
|
|
419
|
-
};
|
|
420
|
-
/** The Workflow as generic proto3 JSON. */
|
|
421
|
-
workflow: Record<string, unknown>;
|
|
422
|
-
mcpServers: AutomationExportMcpServer[];
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// All response schemas are `.passthrough()`: the backend keeps growing the
|
|
426
|
-
// deployment payload (serviceAccountId, egressAllowedDomains, secret
|
|
427
|
-
// metadata, ...) and unknown fields must flow through untouched — both so
|
|
428
|
-
// parsing never breaks on a newer backend and so `--json` output stays
|
|
429
|
-
// faithful to the API instead of silently dropping fields.
|
|
430
|
-
const deployAcceptedSchema = z
|
|
431
|
-
.object({
|
|
432
|
-
id: z.number(),
|
|
433
|
-
slug: z.string(),
|
|
434
|
-
teamId: z.number(),
|
|
435
|
-
status: z.string(),
|
|
436
|
-
generation: z.number(),
|
|
437
|
-
deploymentKind: z.string(),
|
|
438
|
-
engineAlias: z.string(),
|
|
439
|
-
aliasToken: z.string().optional(),
|
|
440
|
-
})
|
|
441
|
-
.passthrough();
|
|
442
|
-
|
|
443
|
-
const agentkitDeployAcceptedSchema = z
|
|
444
|
-
.object({
|
|
445
|
-
applicationId: z.string().min(1),
|
|
446
|
-
releaseId: z.string().min(1),
|
|
447
|
-
status: z.string(),
|
|
448
|
-
})
|
|
449
|
-
.passthrough();
|
|
450
|
-
|
|
451
|
-
const agentkitDeployStatusSchema = z
|
|
452
|
-
.object({
|
|
453
|
-
applicationId: z.string().min(1),
|
|
454
|
-
releaseId: z.string().min(1),
|
|
455
|
-
slug: z.string().min(1),
|
|
456
|
-
teamId: z.number(),
|
|
457
|
-
status: z.enum(["pending", "deploying", "running", "failed", "stopped"]),
|
|
458
|
-
progress: z.enum([
|
|
459
|
-
"queued",
|
|
460
|
-
"creating",
|
|
461
|
-
"building",
|
|
462
|
-
"starting",
|
|
463
|
-
"finalizing",
|
|
464
|
-
"running",
|
|
465
|
-
"failed",
|
|
466
|
-
"stopped",
|
|
467
|
-
]),
|
|
468
|
-
statusMessage: z.string().nullable(),
|
|
469
|
-
// Optional: backends that predate the v2 bake-failure column omit it.
|
|
470
|
-
lastError: z.string().nullable().optional(),
|
|
471
|
-
secretNames: z.array(z.string()).optional(),
|
|
472
|
-
})
|
|
473
|
-
.passthrough();
|
|
474
|
-
|
|
475
|
-
const agentkitDeploymentListItemSchema = z
|
|
476
|
-
.object({
|
|
477
|
-
architecture: z.literal("v2"),
|
|
478
|
-
applicationId: z.string().min(1),
|
|
479
|
-
releaseId: z.string().min(1),
|
|
480
|
-
slug: z.string().min(1),
|
|
481
|
-
teamId: z.number(),
|
|
482
|
-
status: agentkitDeployStatusSchema.shape.status,
|
|
483
|
-
deployments: z.array(z.object({ desiredUpdatedAt: z.string() }).passthrough()),
|
|
484
|
-
})
|
|
485
|
-
.passthrough();
|
|
486
|
-
|
|
487
|
-
const agentkitDeploymentListResponseSchema = z.object({
|
|
488
|
-
deployments: z.array(agentkitDeploymentListItemSchema),
|
|
489
|
-
nextPageToken: z.string().nullable(),
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
const agentkitStopAcceptedSchema = z
|
|
493
|
-
.object({
|
|
494
|
-
applicationId: z.string().min(1),
|
|
495
|
-
releaseId: z.string().min(1),
|
|
496
|
-
status: z.string(),
|
|
497
|
-
// Tolerate scope values a newer backend may add: parse only "global",
|
|
498
|
-
// drop anything else rather than failing the stop response.
|
|
499
|
-
scope: z.literal("global").optional().catch(undefined),
|
|
500
|
-
deployLocked: z.boolean().optional(),
|
|
501
|
-
cancellation: agentkitCancelRunsResultSchema.optional(),
|
|
502
|
-
})
|
|
503
|
-
.passthrough();
|
|
504
|
-
|
|
505
|
-
const agentkitGlobalSuspensionAcceptedSchema = z
|
|
506
|
-
.object({
|
|
507
|
-
applicationId: z.string().min(1),
|
|
508
|
-
status: z.enum(["running", "stopped"]),
|
|
509
|
-
cancellation: agentkitCancelRunsResultSchema.optional(),
|
|
510
|
-
})
|
|
511
|
-
.passthrough();
|
|
512
|
-
|
|
513
|
-
const agentkitStartSessionAcceptedSchema = z
|
|
514
|
-
.object({
|
|
515
|
-
deliveryId: z.string().min(1),
|
|
516
|
-
workflowId: z.string().min(1),
|
|
517
|
-
sessionMode: z.enum(["event", "continuation"]),
|
|
518
|
-
sessionId: z.string().min(1).optional(),
|
|
519
|
-
dryRun: z.literal(true).optional(),
|
|
520
|
-
asOf: z.string().min(1).optional(),
|
|
521
|
-
})
|
|
522
|
-
.passthrough();
|
|
523
|
-
|
|
524
|
-
const agentkitSessionRunsSchema = z
|
|
525
|
-
.object({
|
|
526
|
-
executions: z.array(
|
|
527
|
-
z
|
|
528
|
-
.object({
|
|
529
|
-
executionId: z.string().min(1),
|
|
530
|
-
writtenAt: z.string(),
|
|
531
|
-
turnStatus: z.string(),
|
|
532
|
-
durationMs: z.number().nonnegative(),
|
|
533
|
-
message: z.string().optional(),
|
|
534
|
-
error: z
|
|
535
|
-
.object({
|
|
536
|
-
name: z.string(),
|
|
537
|
-
message: z.string(),
|
|
538
|
-
stack: z.string().optional(),
|
|
539
|
-
})
|
|
540
|
-
.passthrough()
|
|
541
|
-
.optional(),
|
|
542
|
-
processDeath: z.boolean().optional(),
|
|
543
|
-
logs: z.array(
|
|
544
|
-
z
|
|
545
|
-
.object({
|
|
546
|
-
index: z.number(),
|
|
547
|
-
at: z.string(),
|
|
548
|
-
line: z.string(),
|
|
549
|
-
})
|
|
550
|
-
.passthrough(),
|
|
551
|
-
),
|
|
552
|
-
})
|
|
553
|
-
.passthrough(),
|
|
554
|
-
),
|
|
555
|
-
startLog: z.string().nullable(),
|
|
556
|
-
})
|
|
557
|
-
.passthrough();
|
|
558
|
-
|
|
559
|
-
const deploymentSchema = z.object({
|
|
560
|
-
id: z.number(),
|
|
561
|
-
slug: z.string(),
|
|
562
|
-
teamId: z.number(),
|
|
563
|
-
deploymentKind: z.string(),
|
|
564
|
-
gitRepoUrl: z.string().nullable().optional(),
|
|
565
|
-
gitRef: z.string().optional(),
|
|
566
|
-
agentPath: z.string().optional(),
|
|
567
|
-
desiredState: z.string().optional(),
|
|
568
|
-
status: z.enum([
|
|
569
|
-
"pending",
|
|
570
|
-
"deploying",
|
|
571
|
-
"running",
|
|
572
|
-
"degraded",
|
|
573
|
-
"failed",
|
|
574
|
-
"stopping",
|
|
575
|
-
"stopped",
|
|
576
|
-
"deleting",
|
|
577
|
-
]),
|
|
578
|
-
progress: z
|
|
579
|
-
.enum([
|
|
580
|
-
"queued",
|
|
581
|
-
"preparing",
|
|
582
|
-
"creating",
|
|
583
|
-
"building",
|
|
584
|
-
"starting",
|
|
585
|
-
"finalizing",
|
|
586
|
-
"running",
|
|
587
|
-
"failed",
|
|
588
|
-
"stopping",
|
|
589
|
-
"stopped",
|
|
590
|
-
"deleting",
|
|
591
|
-
"degraded",
|
|
592
|
-
])
|
|
593
|
-
.optional(),
|
|
594
|
-
statusMessage: z.string().nullable().optional(),
|
|
595
|
-
generation: z.number(),
|
|
596
|
-
observedGeneration: z.number().nullable().optional(),
|
|
597
|
-
engineGeneration: z.number().nullable().optional(),
|
|
598
|
-
publicId: z.string().optional(),
|
|
599
|
-
engineUrl: z.string().nullable().optional(),
|
|
600
|
-
enginePodId: z.string().nullable().optional(),
|
|
601
|
-
lastError: z.string().nullable().optional(),
|
|
602
|
-
engineAlias: z.string(),
|
|
603
|
-
desiredUpdatedAt: z.string().optional(),
|
|
604
|
-
lastReconciledAt: z.string().nullable().optional(),
|
|
605
|
-
cursorEventRepos: z.array(z.string()).optional(),
|
|
606
|
-
egressAllowedDomains: z.array(z.string()).optional(),
|
|
607
|
-
publicRoutePaths: z.array(z.string()).optional(),
|
|
608
|
-
// String ids (`sa_…`) in prod; older mocks/fixtures used numbers. Null on
|
|
609
|
-
// legacy rows that predate service-account-backed deploys.
|
|
610
|
-
serviceAccountId: z.union([z.string(), z.number()]).nullable().optional(),
|
|
611
|
-
agentStoreSourceId: z.string().optional(),
|
|
612
|
-
podCredentialMaskedKey: z.string().nullable().optional(),
|
|
613
|
-
secretNames: z.array(z.string()).optional(),
|
|
614
|
-
});
|
|
615
|
-
|
|
616
|
-
const deploymentListItemSchema = deploymentSchema.passthrough();
|
|
617
|
-
|
|
618
|
-
const deploymentDetailSchema = deploymentSchema
|
|
619
|
-
.extend({
|
|
620
|
-
engineAccess: z
|
|
621
|
-
.object({
|
|
622
|
-
url: z.string(),
|
|
623
|
-
headers: z.record(z.string()),
|
|
624
|
-
expiresAt: z.string(),
|
|
625
|
-
})
|
|
626
|
-
.nullable()
|
|
627
|
-
.optional(),
|
|
628
|
-
})
|
|
629
|
-
.passthrough();
|
|
630
|
-
|
|
631
|
-
const listResponseSchema = z.object({
|
|
632
|
-
deployments: z.array(deploymentListItemSchema),
|
|
633
|
-
});
|
|
634
|
-
|
|
635
|
-
const stopAcceptedSchema = z
|
|
636
|
-
.object({
|
|
637
|
-
id: z.number(),
|
|
638
|
-
status: z.string(),
|
|
639
|
-
})
|
|
640
|
-
.passthrough();
|
|
641
|
-
|
|
642
|
-
const rotateResponseSchema = z
|
|
643
|
-
.object({
|
|
644
|
-
aliasToken: z.string().min(1),
|
|
645
|
-
})
|
|
646
|
-
.passthrough();
|
|
647
|
-
|
|
648
|
-
const setSecretsResponseSchema = z
|
|
649
|
-
.object({
|
|
650
|
-
secretNames: z.array(z.string()),
|
|
651
|
-
})
|
|
652
|
-
.passthrough();
|
|
653
|
-
|
|
654
|
-
const listSecretsResponseSchema = z
|
|
655
|
-
.object({
|
|
656
|
-
secrets: z.array(z.object({ name: z.string(), createdAt: z.string() }).passthrough()),
|
|
657
|
-
})
|
|
658
|
-
.passthrough();
|
|
659
|
-
|
|
660
|
-
const containerImageSchema = z
|
|
661
|
-
.object({
|
|
662
|
-
name: z.string(),
|
|
663
|
-
sizeBytes: z.number(),
|
|
664
|
-
sha256: z.string().nullable(),
|
|
665
|
-
dockerImageId: z.string().nullable(),
|
|
666
|
-
platform: z.string().nullable(),
|
|
667
|
-
pushedByUserId: z.number().nullable(),
|
|
668
|
-
pushedAt: z.string(),
|
|
669
|
-
})
|
|
670
|
-
.passthrough();
|
|
671
|
-
|
|
672
|
-
const listContainerImagesResponseSchema = z
|
|
673
|
-
.object({ images: z.array(containerImageSchema), limit: z.number() })
|
|
674
|
-
.passthrough();
|
|
675
|
-
|
|
676
|
-
const containerImageUploadSchema = z
|
|
677
|
-
.object({
|
|
678
|
-
name: z.string(),
|
|
679
|
-
uploadId: z.string(),
|
|
680
|
-
partSizeBytes: z.number().int().positive(),
|
|
681
|
-
parts: z.array(z.object({ partNumber: z.number().int().positive(), url: z.string() })),
|
|
682
|
-
expiresAt: z.string(),
|
|
683
|
-
})
|
|
684
|
-
.passthrough();
|
|
685
|
-
|
|
686
|
-
const automationExportSchema = z
|
|
687
|
-
.object({
|
|
688
|
-
automation: z
|
|
689
|
-
.object({
|
|
690
|
-
uuid: z.string(),
|
|
691
|
-
name: z.string(),
|
|
692
|
-
enabled: z.boolean(),
|
|
693
|
-
scope: z.string(),
|
|
694
|
-
webUrl: z.string(),
|
|
695
|
-
})
|
|
696
|
-
.passthrough(),
|
|
697
|
-
workflow: z.record(z.unknown()),
|
|
698
|
-
mcpServers: z.array(
|
|
699
|
-
z
|
|
700
|
-
.object({
|
|
701
|
-
id: z.string().optional(),
|
|
702
|
-
name: z.string(),
|
|
703
|
-
transportType: z.enum(["http", "sse", "stdio"]),
|
|
704
|
-
})
|
|
705
|
-
.passthrough(),
|
|
706
|
-
),
|
|
707
|
-
})
|
|
708
|
-
.passthrough();
|
|
709
|
-
|
|
710
|
-
// ============================================================================
|
|
711
|
-
// Client
|
|
712
|
-
// ============================================================================
|
|
713
|
-
|
|
714
|
-
export interface AgentServeDeployClientOptions {
|
|
715
|
-
backendUrl: string;
|
|
716
|
-
apiKey: string;
|
|
717
|
-
/** Test seam; defaults to global fetch. */
|
|
718
|
-
fetchImpl?: typeof fetch;
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
export class AgentServeDeployClient {
|
|
722
|
-
private readonly backendUrl: string;
|
|
723
|
-
private readonly apiKey: string;
|
|
724
|
-
private readonly fetchImpl: typeof fetch;
|
|
725
|
-
|
|
726
|
-
constructor(options: AgentServeDeployClientOptions) {
|
|
727
|
-
this.backendUrl = options.backendUrl.endsWith("/")
|
|
728
|
-
? options.backendUrl.slice(0, -1)
|
|
729
|
-
: options.backendUrl;
|
|
730
|
-
this.apiKey = options.apiKey;
|
|
731
|
-
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
/** Create or redeploy; 202 means accepted, not running (poll status). */
|
|
735
|
-
async deploy(args: {
|
|
736
|
-
teamId: number;
|
|
737
|
-
slug: string;
|
|
738
|
-
source: DeploySource;
|
|
739
|
-
template?: string;
|
|
740
|
-
}): Promise<DeployAccepted> {
|
|
741
|
-
const slugError = validateDeploymentSlug(args.slug);
|
|
742
|
-
if (slugError !== undefined) {
|
|
743
|
-
throw new DeployApiError(slugError, 400);
|
|
744
|
-
}
|
|
745
|
-
for (const domain of args.source.egressAllowedDomains ?? []) {
|
|
746
|
-
const domainError = validateEgressDomain(domain);
|
|
747
|
-
if (domainError !== undefined) {
|
|
748
|
-
throw new DeployApiError(domainError, 400);
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
// Only the git-ref member exists today; a future artifact member would
|
|
752
|
-
// upload the build first and post a different body from this branch.
|
|
753
|
-
const body: Record<string, unknown> = {
|
|
754
|
-
teamId: args.teamId,
|
|
755
|
-
slug: args.slug,
|
|
756
|
-
gitRepoUrl: args.source.gitRepoUrl,
|
|
757
|
-
...(args.source.gitRef === undefined ? {} : { gitRef: args.source.gitRef }),
|
|
758
|
-
...(args.source.agentPath === undefined ? {} : { agentPath: args.source.agentPath }),
|
|
759
|
-
...(args.source.cursorEventRepos === undefined
|
|
760
|
-
? {}
|
|
761
|
-
: { cursorEventRepos: args.source.cursorEventRepos }),
|
|
762
|
-
...(args.source.egressAllowedDomains === undefined
|
|
763
|
-
? {}
|
|
764
|
-
: { egressAllowedDomains: args.source.egressAllowedDomains }),
|
|
765
|
-
// JSON.stringify drops undefined keys.
|
|
766
|
-
publicRoutePaths: args.source.publicRoutePaths,
|
|
767
|
-
template: args.template,
|
|
768
|
-
};
|
|
769
|
-
const send = (): Promise<unknown> =>
|
|
770
|
-
this.request({
|
|
771
|
-
method: "POST",
|
|
772
|
-
path: "/internal/agent-serve/deployments",
|
|
773
|
-
body,
|
|
774
|
-
context: { verb: "deploy", slug: args.slug },
|
|
775
|
-
});
|
|
776
|
-
let raw: unknown;
|
|
777
|
-
try {
|
|
778
|
-
raw = await send();
|
|
779
|
-
} catch (error) {
|
|
780
|
-
const unsupportedTemplate =
|
|
781
|
-
args.template !== undefined &&
|
|
782
|
-
error instanceof DeployApiError &&
|
|
783
|
-
error.status === 400 &&
|
|
784
|
-
error.message.toLowerCase().includes("template") &&
|
|
785
|
-
/unrecognized|unknown/i.test(error.message);
|
|
786
|
-
if (!unsupportedTemplate) {
|
|
787
|
-
throw error;
|
|
788
|
-
}
|
|
789
|
-
delete body.template;
|
|
790
|
-
raw = await send();
|
|
791
|
-
}
|
|
792
|
-
return deployAcceptedSchema.parse(raw);
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
/**
|
|
796
|
-
* Create or redeploy onto the v2 control plane
|
|
797
|
-
* (`POST /internal/agentsdk/deployments`). 202 means accepted; poll
|
|
798
|
-
* {@link getAgentkitDeploy} until a terminal status. `components` deploys
|
|
799
|
-
* one application with several release components (one per agent
|
|
800
|
-
* directory); it is mutually exclusive with `agentPath`.
|
|
801
|
-
*/
|
|
802
|
-
async deployAgentkit(args: {
|
|
803
|
-
teamId: number;
|
|
804
|
-
slug: string;
|
|
805
|
-
gitRepoUrl: string;
|
|
806
|
-
gitRef?: string;
|
|
807
|
-
agentPath?: string;
|
|
808
|
-
components?: AgentkitDeployComponent[];
|
|
809
|
-
repositories?: string[];
|
|
810
|
-
/** Redeploy an existing Cursor-managed (multi-tenant) product. */
|
|
811
|
-
multiTenant?: boolean;
|
|
812
|
-
persistent?: boolean;
|
|
813
|
-
/** Single-agent `hosting.image`; components carry their own. */
|
|
814
|
-
image?: string;
|
|
815
|
-
}): Promise<AgentkitDeployAccepted> {
|
|
816
|
-
const slugError = validateDeploymentSlug(args.slug);
|
|
817
|
-
if (slugError !== undefined) {
|
|
818
|
-
throw new DeployApiError(slugError, 400);
|
|
819
|
-
}
|
|
820
|
-
for (const component of args.components ?? []) {
|
|
821
|
-
const keyError = validateDeploymentSlug(component.componentKey);
|
|
822
|
-
if (keyError !== undefined) {
|
|
823
|
-
throw new DeployApiError(
|
|
824
|
-
`Invalid component key ${JSON.stringify(component.componentKey)}: use lowercase letters, digits, '-' or '_' (max 64 chars)`,
|
|
825
|
-
400,
|
|
826
|
-
);
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
const raw = await this.request({
|
|
830
|
-
method: "POST",
|
|
831
|
-
path: "/internal/agentsdk/deployments",
|
|
832
|
-
body: {
|
|
833
|
-
teamId: args.teamId,
|
|
834
|
-
slug: args.slug,
|
|
835
|
-
gitRepoUrl: args.gitRepoUrl,
|
|
836
|
-
gitRef: args.gitRef,
|
|
837
|
-
agentPath: args.agentPath,
|
|
838
|
-
components: args.components,
|
|
839
|
-
repositories:
|
|
840
|
-
args.repositories !== undefined && args.repositories.length > 0
|
|
841
|
-
? args.repositories
|
|
842
|
-
: undefined,
|
|
843
|
-
...(args.multiTenant === true ? { multiTenant: true } : {}),
|
|
844
|
-
persistent: args.persistent,
|
|
845
|
-
...(args.image === undefined ? {} : { image: args.image }),
|
|
846
|
-
},
|
|
847
|
-
context: { verb: "deploy", slug: args.slug },
|
|
848
|
-
});
|
|
849
|
-
return agentkitDeployAcceptedSchema.parse(raw);
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
async getAgentkitDeploy(args: { teamId: number; slug: string }): Promise<AgentkitDeployStatus> {
|
|
853
|
-
const raw = await this.request({
|
|
854
|
-
method: "GET",
|
|
855
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}?teamId=${args.teamId}`,
|
|
856
|
-
context: { verb: "get deployment", slug: args.slug },
|
|
857
|
-
});
|
|
858
|
-
return agentkitDeployStatusSchema.parse(raw);
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
/**
|
|
862
|
-
* Stop a v2 deployment (`POST /internal/agentsdk/deployments/:slug/stop`).
|
|
863
|
-
* 202 means accepted; poll {@link getAgentkitDeploy} until `stopped`.
|
|
864
|
-
*/
|
|
865
|
-
async stopAgentkit(args: {
|
|
866
|
-
teamId: number;
|
|
867
|
-
slug: string;
|
|
868
|
-
cancelRuns?: boolean;
|
|
869
|
-
}): Promise<AgentkitStopAccepted> {
|
|
870
|
-
const raw = await this.request({
|
|
871
|
-
method: "POST",
|
|
872
|
-
path:
|
|
873
|
-
`/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/stop?teamId=${args.teamId}` +
|
|
874
|
-
(args.cancelRuns === true ? "&cancelRuns=true" : ""),
|
|
875
|
-
context: { verb: "stop", slug: args.slug },
|
|
876
|
-
});
|
|
877
|
-
return agentkitStopAcceptedSchema.parse(raw);
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
/**
|
|
881
|
-
* Start a v2 deployment (`POST /internal/agentsdk/deployments/:slug/start`).
|
|
882
|
-
* Older backends only expose `/global-resume`; fall back there.
|
|
883
|
-
*/
|
|
884
|
-
async startAgentkit(args: {
|
|
885
|
-
teamId: number;
|
|
886
|
-
slug: string;
|
|
887
|
-
}): Promise<AgentkitGlobalSuspensionAccepted> {
|
|
888
|
-
const encoded = encodeURIComponent(args.slug);
|
|
889
|
-
try {
|
|
890
|
-
const raw = await this.request({
|
|
891
|
-
method: "POST",
|
|
892
|
-
path: `/internal/agentsdk/deployments/${encoded}/start?teamId=${args.teamId}`,
|
|
893
|
-
context: { verb: "start", slug: args.slug },
|
|
894
|
-
});
|
|
895
|
-
return agentkitGlobalSuspensionAcceptedSchema.parse(raw);
|
|
896
|
-
} catch (error) {
|
|
897
|
-
if (!(error instanceof DeployApiError) || error.status !== 404) {
|
|
898
|
-
throw error;
|
|
899
|
-
}
|
|
900
|
-
const raw = await this.request({
|
|
901
|
-
method: "POST",
|
|
902
|
-
path: `/internal/agentsdk/deployments/${encoded}/global-resume?teamId=${args.teamId}`,
|
|
903
|
-
context: { verb: "start", slug: args.slug },
|
|
904
|
-
});
|
|
905
|
-
return agentkitGlobalSuspensionAcceptedSchema.parse(raw);
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
async setAgentkitGlobalSuspension(args: {
|
|
910
|
-
teamId: number;
|
|
911
|
-
slug: string;
|
|
912
|
-
suspended: boolean;
|
|
913
|
-
cancelRuns?: boolean;
|
|
914
|
-
}): Promise<AgentkitGlobalSuspensionAccepted> {
|
|
915
|
-
const action = args.suspended ? "global-stop" : "global-resume";
|
|
916
|
-
const cancelQuery =
|
|
917
|
-
args.suspended === true && args.cancelRuns === true ? "&cancelRuns=true" : "";
|
|
918
|
-
const raw = await this.request({
|
|
919
|
-
method: "POST",
|
|
920
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/${action}?teamId=${args.teamId}${cancelQuery}`,
|
|
921
|
-
context: {
|
|
922
|
-
verb: args.suspended ? "globally stop" : "globally resume",
|
|
923
|
-
slug: args.slug,
|
|
924
|
-
},
|
|
925
|
-
});
|
|
926
|
-
return agentkitGlobalSuspensionAcceptedSchema.parse(raw);
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
async killAgentkit(args: { teamId: number; slug: string }): Promise<AgentkitStopAccepted> {
|
|
930
|
-
const raw = await this.request({
|
|
931
|
-
method: "POST",
|
|
932
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/kill?teamId=${args.teamId}`,
|
|
933
|
-
context: { verb: "kill", slug: args.slug },
|
|
934
|
-
});
|
|
935
|
-
return agentkitStopAcceptedSchema.parse(raw);
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
async unlockAgentkitDeploys(args: {
|
|
939
|
-
teamId: number;
|
|
940
|
-
slug: string;
|
|
941
|
-
}): Promise<{ applicationId: string; deployLocked: boolean }> {
|
|
942
|
-
const raw = await this.request({
|
|
943
|
-
method: "POST",
|
|
944
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/unlock-deploys?teamId=${args.teamId}`,
|
|
945
|
-
context: { verb: "unlock deploys", slug: args.slug },
|
|
946
|
-
});
|
|
947
|
-
return z
|
|
948
|
-
.object({
|
|
949
|
-
applicationId: z.string().min(1),
|
|
950
|
-
deployLocked: z.literal(false),
|
|
951
|
-
})
|
|
952
|
-
.parse(raw);
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
async cancelAgentkitRuns(args: {
|
|
956
|
-
teamId: number;
|
|
957
|
-
slug: string;
|
|
958
|
-
}): Promise<AgentkitCancelRunsResult> {
|
|
959
|
-
const raw = await this.request({
|
|
960
|
-
method: "POST",
|
|
961
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/cancel-runs?teamId=${args.teamId}`,
|
|
962
|
-
context: { verb: "cancel runs", slug: args.slug },
|
|
963
|
-
});
|
|
964
|
-
return agentkitCancelRunsResultSchema.parse(raw);
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
/**
|
|
968
|
-
* Repoint a v2 install's event repositories
|
|
969
|
-
* (`PUT /internal/agentsdk/deployments/:slug/event-repositories`). Deploy
|
|
970
|
-
* cannot carry these for a multi-tenant product.
|
|
971
|
-
*/
|
|
972
|
-
async setAgentkitEventRepositories(args: {
|
|
973
|
-
teamId: number;
|
|
974
|
-
slug: string;
|
|
975
|
-
repositories: string[];
|
|
976
|
-
}): Promise<string[]> {
|
|
977
|
-
const raw = await this.request({
|
|
978
|
-
method: "PUT",
|
|
979
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/event-repositories?teamId=${args.teamId}`,
|
|
980
|
-
body: { repositories: args.repositories },
|
|
981
|
-
context: { verb: "set event repositories", slug: args.slug },
|
|
982
|
-
});
|
|
983
|
-
return agentkitEventRepositoriesSchema.parse(raw).repositories;
|
|
984
|
-
}
|
|
985
|
-
|
|
986
|
-
/**
|
|
987
|
-
* Pin a v2 install onto a release
|
|
988
|
-
* (`PUT /internal/agentsdk/deployments/:slug/release`), newest ready one
|
|
989
|
-
* when neither selector is given. A multi-tenant deploy leaves tenants
|
|
990
|
-
* on the release they were installed on.
|
|
991
|
-
*/
|
|
992
|
-
async upgradeAgentkitInstall(args: {
|
|
993
|
-
teamId: number;
|
|
994
|
-
slug: string;
|
|
995
|
-
releaseId?: string;
|
|
996
|
-
version?: string;
|
|
997
|
-
}): Promise<string> {
|
|
998
|
-
const raw = await this.request({
|
|
999
|
-
method: "PUT",
|
|
1000
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/release?teamId=${args.teamId}`,
|
|
1001
|
-
body: {
|
|
1002
|
-
...(args.releaseId === undefined ? {} : { releaseId: args.releaseId }),
|
|
1003
|
-
...(args.version === undefined ? {} : { version: args.version }),
|
|
1004
|
-
},
|
|
1005
|
-
context: { verb: "upgrade", slug: args.slug },
|
|
1006
|
-
});
|
|
1007
|
-
return agentkitInstallReleaseSchema.parse(raw).releaseId;
|
|
1008
|
-
}
|
|
1009
|
-
|
|
1010
|
-
/**
|
|
1011
|
-
* Delete a v2 deployment (`DELETE /internal/agentsdk/deployments/:slug`).
|
|
1012
|
-
* 202 means accepted; poll {@link getAgentkitDeploy} until 404.
|
|
1013
|
-
*/
|
|
1014
|
-
async deleteAgentkit(args: { teamId: number; slug: string }): Promise<AgentkitStopAccepted> {
|
|
1015
|
-
const raw = await this.request({
|
|
1016
|
-
method: "DELETE",
|
|
1017
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}?teamId=${args.teamId}`,
|
|
1018
|
-
context: { verb: "delete", slug: args.slug },
|
|
1019
|
-
});
|
|
1020
|
-
return agentkitStopAcceptedSchema.parse(raw);
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
/**
|
|
1024
|
-
* Start (or, with `sessionId`, resume) a hosted v2 session through the
|
|
1025
|
-
* control plane (`POST /internal/agentsdk/deployments/:slug/sessions`).
|
|
1026
|
-
* Does not talk to the v1 engine alias or `/engine/*`.
|
|
1027
|
-
*/
|
|
1028
|
-
async startSession(args: {
|
|
1029
|
-
teamId: number;
|
|
1030
|
-
slug: string;
|
|
1031
|
-
message: string;
|
|
1032
|
-
sessionId?: string;
|
|
1033
|
-
dryRun?: boolean;
|
|
1034
|
-
asOf?: string;
|
|
1035
|
-
componentKey?: string;
|
|
1036
|
-
}): Promise<AgentkitStartSessionAccepted> {
|
|
1037
|
-
const raw = await this.request({
|
|
1038
|
-
method: "POST",
|
|
1039
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/sessions`,
|
|
1040
|
-
body: {
|
|
1041
|
-
teamId: args.teamId,
|
|
1042
|
-
message: args.message,
|
|
1043
|
-
sessionId: args.sessionId,
|
|
1044
|
-
dryRun: args.dryRun === true ? true : undefined,
|
|
1045
|
-
asOf: args.asOf,
|
|
1046
|
-
componentKey: args.componentKey,
|
|
1047
|
-
},
|
|
1048
|
-
context: { verb: "start session", slug: args.slug },
|
|
1049
|
-
});
|
|
1050
|
-
return agentkitStartSessionAcceptedSchema.parse(raw);
|
|
1051
|
-
}
|
|
1052
|
-
|
|
1053
|
-
/** Hosted executions and the start-log tee for one v2 session. */
|
|
1054
|
-
async getAgentkitSessionRuns(args: {
|
|
1055
|
-
teamId: number;
|
|
1056
|
-
slug: string;
|
|
1057
|
-
sessionId: string;
|
|
1058
|
-
}): Promise<AgentkitSessionRuns> {
|
|
1059
|
-
const raw = await this.request({
|
|
1060
|
-
method: "GET",
|
|
1061
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/sessions/${encodeURIComponent(args.sessionId)}/runs?teamId=${args.teamId}`,
|
|
1062
|
-
context: { verb: "get session runs", slug: args.slug },
|
|
1063
|
-
});
|
|
1064
|
-
return agentkitSessionRunsSchema.parse(raw);
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
async listDeployments(args: { teamId: number }): Promise<Deployment[]> {
|
|
1068
|
-
const raw = await this.request({
|
|
1069
|
-
method: "GET",
|
|
1070
|
-
path: `/internal/agent-serve/deployments?teamId=${args.teamId}`,
|
|
1071
|
-
context: { verb: "list deployments" },
|
|
1072
|
-
});
|
|
1073
|
-
return listResponseSchema.parse(raw).deployments;
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1076
|
-
async listAgentkitDeployments(args: { teamId: number }): Promise<AgentkitDeploymentListItem[]> {
|
|
1077
|
-
const deployments: AgentkitDeploymentListItem[] = [];
|
|
1078
|
-
let pageToken: string | null = null;
|
|
1079
|
-
do {
|
|
1080
|
-
const qs =
|
|
1081
|
-
`teamId=${args.teamId}&pageSize=100` +
|
|
1082
|
-
(pageToken === null ? "" : `&pageToken=${encodeURIComponent(pageToken)}`);
|
|
1083
|
-
const page = agentkitDeploymentListResponseSchema.parse(
|
|
1084
|
-
await this.request({
|
|
1085
|
-
method: "GET",
|
|
1086
|
-
path: `/internal/agentsdk/deployments?${qs}`,
|
|
1087
|
-
context: { verb: "list architecture v2 deployments" },
|
|
1088
|
-
}),
|
|
1089
|
-
);
|
|
1090
|
-
deployments.push(...page.deployments);
|
|
1091
|
-
pageToken = page.nextPageToken;
|
|
1092
|
-
} while (pageToken !== null);
|
|
1093
|
-
return deployments;
|
|
1094
|
-
}
|
|
1095
|
-
|
|
1096
|
-
async getDeployment(args: { teamId: number; slug: string }): Promise<DeploymentDetail> {
|
|
1097
|
-
const raw = await this.request({
|
|
1098
|
-
method: "GET",
|
|
1099
|
-
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}?teamId=${args.teamId}`,
|
|
1100
|
-
context: { verb: "get deployment", slug: args.slug },
|
|
1101
|
-
});
|
|
1102
|
-
return deploymentDetailSchema.parse(raw);
|
|
1103
|
-
}
|
|
1104
|
-
|
|
1105
|
-
async stopDeployment(args: { teamId: number; slug: string }): Promise<StopAccepted> {
|
|
1106
|
-
const raw = await this.request({
|
|
1107
|
-
method: "POST",
|
|
1108
|
-
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/stop?teamId=${args.teamId}`,
|
|
1109
|
-
context: { verb: "stop", slug: args.slug },
|
|
1110
|
-
});
|
|
1111
|
-
return stopAcceptedSchema.parse(raw);
|
|
1112
|
-
}
|
|
1113
|
-
|
|
1114
|
-
async deleteDeployment(args: { teamId: number; slug: string }): Promise<DeleteAccepted> {
|
|
1115
|
-
const raw = await this.request({
|
|
1116
|
-
method: "DELETE",
|
|
1117
|
-
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}?teamId=${args.teamId}`,
|
|
1118
|
-
context: { verb: "delete", slug: args.slug },
|
|
1119
|
-
});
|
|
1120
|
-
return stopAcceptedSchema.parse(raw);
|
|
1121
|
-
}
|
|
1122
|
-
|
|
1123
|
-
/** Returns the new alias token exactly once; the old one dies now. */
|
|
1124
|
-
async rotateAliasToken(args: { teamId: number; slug: string }): Promise<string> {
|
|
1125
|
-
const raw = await this.request({
|
|
1126
|
-
method: "POST",
|
|
1127
|
-
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/rotate-alias-token?teamId=${args.teamId}`,
|
|
1128
|
-
context: { verb: "rotate alias token", slug: args.slug },
|
|
1129
|
-
});
|
|
1130
|
-
return rotateResponseSchema.parse(raw).aliasToken;
|
|
1131
|
-
}
|
|
1132
|
-
|
|
1133
|
-
/** Rotate the alias token on an AgentSDK v2 deployment. */
|
|
1134
|
-
async rotateAgentsdkAliasToken(args: { teamId: number; slug: string }): Promise<string> {
|
|
1135
|
-
const raw = await this.request({
|
|
1136
|
-
method: "POST",
|
|
1137
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/rotate-alias-token?teamId=${args.teamId}`,
|
|
1138
|
-
context: { verb: "rotate alias token", slug: args.slug },
|
|
1139
|
-
});
|
|
1140
|
-
return rotateResponseSchema.parse(raw).aliasToken;
|
|
1141
|
-
}
|
|
1142
|
-
|
|
1143
|
-
/**
|
|
1144
|
-
* Upsert secrets by name (unlisted names stay untouched). Returns the
|
|
1145
|
-
* post-write union of secret names, sorted. Validates names and value
|
|
1146
|
-
* sizes client-side with the backend's grammar before any network call.
|
|
1147
|
-
*/
|
|
1148
|
-
async setSecrets(args: {
|
|
1149
|
-
teamId: number;
|
|
1150
|
-
slug: string;
|
|
1151
|
-
secrets: Array<{ name: string; value: string }>;
|
|
1152
|
-
}): Promise<string[]> {
|
|
1153
|
-
this.validateSecrets(args.secrets);
|
|
1154
|
-
const raw = await this.request({
|
|
1155
|
-
method: "PUT",
|
|
1156
|
-
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/secrets`,
|
|
1157
|
-
body: { teamId: args.teamId, secrets: args.secrets },
|
|
1158
|
-
context: { verb: "set secrets", slug: args.slug },
|
|
1159
|
-
});
|
|
1160
|
-
return setSecretsResponseSchema.parse(raw).secretNames;
|
|
1161
|
-
}
|
|
1162
|
-
|
|
1163
|
-
/** Upsert application-scoped secrets on an AgentSDK v2 deployment. */
|
|
1164
|
-
async setAgentkitSecrets(args: {
|
|
1165
|
-
teamId: number;
|
|
1166
|
-
slug: string;
|
|
1167
|
-
secrets: Array<{ name: string; value: string }>;
|
|
1168
|
-
}): Promise<string[]> {
|
|
1169
|
-
this.validateSecrets(args.secrets);
|
|
1170
|
-
const raw = await this.request({
|
|
1171
|
-
method: "PUT",
|
|
1172
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/secrets`,
|
|
1173
|
-
body: { teamId: args.teamId, secrets: args.secrets },
|
|
1174
|
-
context: { verb: "set secrets", slug: args.slug },
|
|
1175
|
-
});
|
|
1176
|
-
return setSecretsResponseSchema.parse(raw).secretNames;
|
|
1177
|
-
}
|
|
1178
|
-
|
|
1179
|
-
/** Secret names + creation times; values are never returned. */
|
|
1180
|
-
async listSecrets(args: { teamId: number; slug: string }): Promise<SecretInfo[]> {
|
|
1181
|
-
const raw = await this.request({
|
|
1182
|
-
method: "GET",
|
|
1183
|
-
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/secrets?teamId=${args.teamId}`,
|
|
1184
|
-
context: { verb: "list secrets", slug: args.slug },
|
|
1185
|
-
});
|
|
1186
|
-
return listSecretsResponseSchema.parse(raw).secrets;
|
|
1187
|
-
}
|
|
1188
|
-
|
|
1189
|
-
/** Secret names + creation times for an AgentSDK v2 application. */
|
|
1190
|
-
async listAgentkitSecrets(args: { teamId: number; slug: string }): Promise<SecretInfo[]> {
|
|
1191
|
-
const raw = await this.request({
|
|
1192
|
-
method: "GET",
|
|
1193
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/secrets?teamId=${args.teamId}`,
|
|
1194
|
-
context: { verb: "list secrets", slug: args.slug },
|
|
1195
|
-
});
|
|
1196
|
-
return listSecretsResponseSchema.parse(raw).secrets;
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
/** Remove one secret by name; 404 when it is not set. */
|
|
1200
|
-
async deleteSecret(args: { teamId: number; slug: string; name: string }): Promise<void> {
|
|
1201
|
-
const nameError = validateSettableSecretName(args.name);
|
|
1202
|
-
if (nameError !== undefined) {
|
|
1203
|
-
throw new DeployApiError(nameError, 400);
|
|
1204
|
-
}
|
|
1205
|
-
await this.request({
|
|
1206
|
-
method: "DELETE",
|
|
1207
|
-
path: `/internal/agent-serve/deployments/${encodeURIComponent(args.slug)}/secrets/${encodeURIComponent(args.name)}?teamId=${args.teamId}`,
|
|
1208
|
-
context: { verb: "unset secret", slug: args.slug },
|
|
1209
|
-
});
|
|
1210
|
-
}
|
|
1211
|
-
|
|
1212
|
-
/** Remove one application-scoped secret from an AgentSDK v2 deployment. */
|
|
1213
|
-
async deleteAgentkitSecret(args: { teamId: number; slug: string; name: string }): Promise<void> {
|
|
1214
|
-
const nameError = validateSettableSecretName(args.name);
|
|
1215
|
-
if (nameError !== undefined) {
|
|
1216
|
-
throw new DeployApiError(nameError, 400);
|
|
1217
|
-
}
|
|
1218
|
-
await this.request({
|
|
1219
|
-
method: "DELETE",
|
|
1220
|
-
path: `/internal/agentsdk/deployments/${encodeURIComponent(args.slug)}/secrets/${encodeURIComponent(args.name)}?teamId=${args.teamId}`,
|
|
1221
|
-
context: { verb: "unset secret", slug: args.slug },
|
|
1222
|
-
});
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
private validateSecrets(secrets: Array<{ name: string; value: string }>): void {
|
|
1226
|
-
for (const { name, value } of secrets) {
|
|
1227
|
-
const nameError = validateSettableSecretName(name);
|
|
1228
|
-
if (nameError !== undefined) {
|
|
1229
|
-
throw new DeployApiError(nameError, 400);
|
|
1230
|
-
}
|
|
1231
|
-
if (Buffer.byteLength(value, "utf8") > MAX_SECRET_VALUE_BYTES) {
|
|
1232
|
-
throw new DeployApiError(
|
|
1233
|
-
`The value for ${name} is too large (max ${MAX_SECRET_VALUE_BYTES} bytes).`,
|
|
1234
|
-
400,
|
|
1235
|
-
);
|
|
1236
|
-
}
|
|
1237
|
-
}
|
|
1238
|
-
if (secrets.length > MAX_SECRETS) {
|
|
1239
|
-
throw new DeployApiError(
|
|
1240
|
-
`Too many secrets in one request (${secrets.length}); deployments hold at most ${MAX_SECRETS}.`,
|
|
1241
|
-
400,
|
|
1242
|
-
);
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
|
|
1246
|
-
/**
|
|
1247
|
-
* Read an Automation's exported workflow definition for
|
|
1248
|
-
* `convert-automation`. Missing, no-access, and gate-off all surface as
|
|
1249
|
-
* indistinguishable 404s on the backend, so they map to one message here
|
|
1250
|
-
* (the wrong-host 404 hint from {@link mapErrorResponse} passes through).
|
|
1251
|
-
*/
|
|
1252
|
-
async exportAutomation(args: { uuid: string }): Promise<AutomationExport> {
|
|
1253
|
-
let raw: unknown;
|
|
1254
|
-
try {
|
|
1255
|
-
raw = await this.request({
|
|
1256
|
-
method: "GET",
|
|
1257
|
-
path: `/internal/agent-serve/automations/${encodeURIComponent(args.uuid)}/export`,
|
|
1258
|
-
context: { verb: "export automation" },
|
|
1259
|
-
});
|
|
1260
|
-
} catch (error) {
|
|
1261
|
-
if (
|
|
1262
|
-
error instanceof DeployApiError &&
|
|
1263
|
-
error.status === 404 &&
|
|
1264
|
-
!error.message.includes("api.cursor.com")
|
|
1265
|
-
) {
|
|
1266
|
-
throw new DeployApiError(
|
|
1267
|
-
`Automation ${args.uuid} was not found or you don't have access to it (the agent_serve_mvp feature gate may also be off for your team).`,
|
|
1268
|
-
404,
|
|
1269
|
-
);
|
|
1270
|
-
}
|
|
1271
|
-
throw error;
|
|
1272
|
-
}
|
|
1273
|
-
return automationExportSchema.parse(raw);
|
|
1274
|
-
}
|
|
1275
|
-
|
|
1276
|
-
/** Full URL of the stable engine alias for a deployment. */
|
|
1277
|
-
aliasUrl(engineAlias: string): string {
|
|
1278
|
-
return `${this.backendUrl}${engineAlias}`;
|
|
1279
|
-
}
|
|
1280
|
-
|
|
1281
|
-
/**
|
|
1282
|
-
* Stable remote MCP gateway URL for a deployment, on the user-API-key
|
|
1283
|
-
* surface (headless / CLI, `agent-sdk login` credential). The gateway
|
|
1284
|
-
* mints/refreshes engineAccess server-side and proxies `/v1/mcp` to the
|
|
1285
|
-
* pod, so a signed-in client never sees a pod hostname or port token.
|
|
1286
|
-
*/
|
|
1287
|
-
mcpGatewayUrl(teamId: number, slug: string): string {
|
|
1288
|
-
return `${this.backendUrl}/internal/agent-serve/mcp/${teamId}/${encodeURIComponent(slug)}`;
|
|
1289
|
-
}
|
|
1290
|
-
|
|
1291
|
-
/** Team container images, newest first, with the per-team cap. */
|
|
1292
|
-
async listContainerImages(args: {
|
|
1293
|
-
teamId: number;
|
|
1294
|
-
}): Promise<{ images: ContainerImageInfo[]; limit: number }> {
|
|
1295
|
-
const raw = await this.request({
|
|
1296
|
-
method: "GET",
|
|
1297
|
-
path: `/internal/agentsdk/images?teamId=${args.teamId}`,
|
|
1298
|
-
context: { verb: "list images" },
|
|
1299
|
-
});
|
|
1300
|
-
return listContainerImagesResponseSchema.parse(raw);
|
|
1301
|
-
}
|
|
1302
|
-
|
|
1303
|
-
/** Start (or restart) the upload for `name`; 409 when a new name would exceed the cap. */
|
|
1304
|
-
async beginContainerImageUpload(args: {
|
|
1305
|
-
teamId: number;
|
|
1306
|
-
name: string;
|
|
1307
|
-
sizeBytes: number;
|
|
1308
|
-
sha256: string;
|
|
1309
|
-
dockerImageId?: string;
|
|
1310
|
-
platform?: string;
|
|
1311
|
-
}): Promise<ContainerImageUpload> {
|
|
1312
|
-
const { name, ...body } = args;
|
|
1313
|
-
const raw = await this.request({
|
|
1314
|
-
method: "POST",
|
|
1315
|
-
path: `/internal/agentsdk/images/${encodeURIComponent(name)}/begin`,
|
|
1316
|
-
body,
|
|
1317
|
-
context: { verb: "push image" },
|
|
1318
|
-
});
|
|
1319
|
-
return containerImageUploadSchema.parse(raw);
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
|
-
/** Every part is uploaded: complete the object and mark the image ready. */
|
|
1323
|
-
async finalizeContainerImage(args: {
|
|
1324
|
-
teamId: number;
|
|
1325
|
-
name: string;
|
|
1326
|
-
uploadId: string;
|
|
1327
|
-
parts: Array<{ partNumber: number; etag: string }>;
|
|
1328
|
-
}): Promise<ContainerImageInfo> {
|
|
1329
|
-
const raw = await this.request({
|
|
1330
|
-
method: "POST",
|
|
1331
|
-
path: `/internal/agentsdk/images/${encodeURIComponent(args.name)}/finalize`,
|
|
1332
|
-
body: { teamId: args.teamId, uploadId: args.uploadId, parts: args.parts },
|
|
1333
|
-
context: { verb: "push image" },
|
|
1334
|
-
});
|
|
1335
|
-
return z.object({ image: containerImageSchema }).passthrough().parse(raw).image;
|
|
1336
|
-
}
|
|
1337
|
-
|
|
1338
|
-
/** Remove one image and its tarball; 404 when there is none by that name. */
|
|
1339
|
-
async deleteContainerImage(args: { teamId: number; name: string }): Promise<void> {
|
|
1340
|
-
await this.request({
|
|
1341
|
-
method: "DELETE",
|
|
1342
|
-
path: `/internal/agentsdk/images/${encodeURIComponent(args.name)}?teamId=${args.teamId}`,
|
|
1343
|
-
context: { verb: "remove image" },
|
|
1344
|
-
});
|
|
1345
|
-
}
|
|
1346
|
-
|
|
1347
|
-
private async request(args: {
|
|
1348
|
-
method: "GET" | "POST" | "PUT" | "DELETE";
|
|
1349
|
-
path: string;
|
|
1350
|
-
body?: unknown;
|
|
1351
|
-
context: { verb: string; slug?: string };
|
|
1352
|
-
}): Promise<unknown> {
|
|
1353
|
-
let response: Response;
|
|
1354
|
-
try {
|
|
1355
|
-
response = await this.fetchImpl(`${this.backendUrl}${args.path}`, {
|
|
1356
|
-
method: args.method,
|
|
1357
|
-
headers: {
|
|
1358
|
-
accept: "application/json",
|
|
1359
|
-
authorization: `Bearer ${this.apiKey}`,
|
|
1360
|
-
...(args.body === undefined ? {} : { "content-type": "application/json" }),
|
|
1361
|
-
},
|
|
1362
|
-
...(args.body === undefined ? {} : { body: JSON.stringify(args.body) }),
|
|
1363
|
-
signal: AbortSignal.timeout(60_000),
|
|
1364
|
-
});
|
|
1365
|
-
} catch (error) {
|
|
1366
|
-
throw new DeployApiError(
|
|
1367
|
-
`Could not reach the Cursor backend at ${this.backendUrl}: ${
|
|
1368
|
-
error instanceof Error ? error.message : String(error)
|
|
1369
|
-
}`,
|
|
1370
|
-
0,
|
|
1371
|
-
);
|
|
1372
|
-
}
|
|
1373
|
-
const text = await response.text();
|
|
1374
|
-
if (!response.ok) {
|
|
1375
|
-
throw mapErrorResponse(response, text, args.context);
|
|
1376
|
-
}
|
|
1377
|
-
try {
|
|
1378
|
-
return JSON.parse(text) as unknown;
|
|
1379
|
-
} catch {
|
|
1380
|
-
throw new DeployApiError(
|
|
1381
|
-
`The Cursor backend returned a non-JSON response to ${args.context.verb}.`,
|
|
1382
|
-
response.status,
|
|
1383
|
-
);
|
|
1384
|
-
}
|
|
1385
|
-
}
|
|
1386
|
-
}
|
|
1387
|
-
|
|
1388
|
-
const MCP_GATEWAY_PATH = /^\/internal\/agent-serve\/mcp\/(\d+)\/([^/]+)(?:\/tools)?\/?$/;
|
|
1389
|
-
|
|
1390
|
-
/**
|
|
1391
|
-
* Inverse of {@link AgentServeDeployClient.mcpGatewayUrl}. Also accepts
|
|
1392
|
-
* the hosted `--cloud-tools-url` form (`…/tools`).
|
|
1393
|
-
*/
|
|
1394
|
-
export function parseAgentServeMcpGatewayUrl(
|
|
1395
|
-
url: string,
|
|
1396
|
-
): { teamId: number; slug: string } | undefined {
|
|
1397
|
-
let parsed: URL;
|
|
1398
|
-
try {
|
|
1399
|
-
parsed = new URL(url);
|
|
1400
|
-
} catch {
|
|
1401
|
-
return undefined;
|
|
1402
|
-
}
|
|
1403
|
-
const match = MCP_GATEWAY_PATH.exec(parsed.pathname);
|
|
1404
|
-
if (match === null) {
|
|
1405
|
-
return undefined;
|
|
1406
|
-
}
|
|
1407
|
-
const teamId = Number.parseInt(match[1]!, 10);
|
|
1408
|
-
if (!Number.isInteger(teamId) || teamId <= 0) {
|
|
1409
|
-
return undefined;
|
|
1410
|
-
}
|
|
1411
|
-
const slug = decodeURIComponent(match[2]!);
|
|
1412
|
-
if (validateDeploymentSlug(slug) !== undefined) {
|
|
1413
|
-
return undefined;
|
|
1414
|
-
}
|
|
1415
|
-
return { teamId, slug };
|
|
1416
|
-
}
|
|
1417
|
-
|
|
1418
|
-
// ============================================================================
|
|
1419
|
-
// Error mapping (HTTP → actionable human messages)
|
|
1420
|
-
// ============================================================================
|
|
1421
|
-
|
|
1422
|
-
function serverErrorText(bodyText: string): string | undefined {
|
|
1423
|
-
try {
|
|
1424
|
-
const parsed = JSON.parse(bodyText) as { error?: unknown };
|
|
1425
|
-
if (typeof parsed.error === "string" && parsed.error !== "") {
|
|
1426
|
-
return parsed.error;
|
|
1427
|
-
}
|
|
1428
|
-
} catch {
|
|
1429
|
-
// Non-JSON body — fall through.
|
|
1430
|
-
}
|
|
1431
|
-
return undefined;
|
|
1432
|
-
}
|
|
1433
|
-
|
|
1434
|
-
function mapErrorResponse(
|
|
1435
|
-
response: Response,
|
|
1436
|
-
bodyText: string,
|
|
1437
|
-
context: { verb: string; slug?: string },
|
|
1438
|
-
): DeployApiError {
|
|
1439
|
-
const serverError = serverErrorText(bodyText);
|
|
1440
|
-
const slugPart = context.slug === undefined ? "" : ` "${context.slug}"`;
|
|
1441
|
-
switch (response.status) {
|
|
1442
|
-
case 400:
|
|
1443
|
-
return new DeployApiError(
|
|
1444
|
-
serverError ?? `The ${context.verb} request was rejected as invalid.`,
|
|
1445
|
-
400,
|
|
1446
|
-
);
|
|
1447
|
-
case 401:
|
|
1448
|
-
return new DeployApiError(
|
|
1449
|
-
"The Cursor API key was rejected. Run `agent-sdk login` again or update CURSOR_API_KEY.",
|
|
1450
|
-
401,
|
|
1451
|
-
);
|
|
1452
|
-
case 403:
|
|
1453
|
-
return new DeployApiError(
|
|
1454
|
-
`${serverError ?? "Not authorized"} — deploying needs team membership and the cloud-agent entitlement on that team.`,
|
|
1455
|
-
403,
|
|
1456
|
-
);
|
|
1457
|
-
case 404: {
|
|
1458
|
-
// Fastify's route-not-found envelope means we hit the wrong host
|
|
1459
|
-
// (api2 vs api.cursor.com), not a missing deployment / closed gate.
|
|
1460
|
-
if (/Route \S+ not found/i.test(bodyText)) {
|
|
1461
|
-
return new DeployApiError(
|
|
1462
|
-
`Agent Serve deploy API not found on this host — use the default api.cursor.com (unset CURSOR_API_BASE_URL), or point CURSOR_API_BASE_URL at a backend that mounts /internal/agent-serve/* and /internal/agentsdk/*.`,
|
|
1463
|
-
404,
|
|
1464
|
-
);
|
|
1465
|
-
}
|
|
1466
|
-
return new DeployApiError(
|
|
1467
|
-
context.slug === undefined
|
|
1468
|
-
? `Not found — the agent_serve_mvp feature gate may not be enabled for your team.`
|
|
1469
|
-
: `Deployment${slugPart} was not found — check the slug and --team, or the agent_serve_mvp feature gate may not be enabled for your team.`,
|
|
1470
|
-
404,
|
|
1471
|
-
);
|
|
1472
|
-
}
|
|
1473
|
-
case 409:
|
|
1474
|
-
// The server's 409 body distinguishes real conflicts (CAS races,
|
|
1475
|
-
// "still deploying", architecture-v2 slugs on the v1 surface); keep
|
|
1476
|
-
// its message when present.
|
|
1477
|
-
return new DeployApiError(
|
|
1478
|
-
serverError ??
|
|
1479
|
-
`A concurrent deploy or stop is changing deployment${slugPart}; retry in a moment.`,
|
|
1480
|
-
409,
|
|
1481
|
-
);
|
|
1482
|
-
case 429: {
|
|
1483
|
-
const retryAfterHeader = response.headers.get("retry-after");
|
|
1484
|
-
const retryAfterSeconds =
|
|
1485
|
-
retryAfterHeader !== null && /^\d+$/.test(retryAfterHeader)
|
|
1486
|
-
? Number(retryAfterHeader)
|
|
1487
|
-
: undefined;
|
|
1488
|
-
return new DeployApiError(
|
|
1489
|
-
`${serverError ?? "Rate limited"}${
|
|
1490
|
-
retryAfterSeconds === undefined ? "" : ` — retry in ${retryAfterSeconds}s`
|
|
1491
|
-
}`,
|
|
1492
|
-
429,
|
|
1493
|
-
retryAfterSeconds,
|
|
1494
|
-
);
|
|
1495
|
-
}
|
|
1496
|
-
default:
|
|
1497
|
-
return new DeployApiError(
|
|
1498
|
-
`The ${context.verb} request failed (${response.status}): ${
|
|
1499
|
-
serverError ?? bodyText.slice(0, 300) ?? "(empty body)"
|
|
1500
|
-
}`,
|
|
1501
|
-
response.status,
|
|
1502
|
-
);
|
|
1503
|
-
}
|
|
1504
|
-
}
|