@cursor/bdk 0.2.8 → 0.2.10
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/dist/artifacts.js +3 -5
- package/dist/bin/agent-serve.d.ts +1 -0
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +820 -807
- package/dist/channels/bitbucket/api.js +305 -321
- package/dist/channels/bitbucket/binding.js +97 -61
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
- package/dist/channels/bitbucket/checks.js +9 -21
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/defaults.js +14 -4
- package/dist/channels/bitbucket/events.js +1 -2
- package/dist/channels/bitbucket/index.d.ts +6 -2
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +6 -2
- package/dist/channels/bitbucket/replay.js +80 -56
- package/dist/channels/bitbucket/state.js +16 -7
- package/dist/channels/bitbucket/types.d.ts +11 -2
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/checks.js +18 -28
- package/dist/channels/deployments/deployments-channel.js +26 -34
- package/dist/channels/github/api.js +216 -210
- package/dist/channels/github/auth.d.ts +5 -1
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +157 -174
- package/dist/channels/github/binding.js +48 -39
- package/dist/channels/github/checks.js +9 -14
- package/dist/channels/github/cursor-account.js +6 -11
- package/dist/channels/github/defaults.js +105 -130
- package/dist/channels/github/forward.js +13 -17
- package/dist/channels/github/github-channel.d.ts +43 -2
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1228 -958
- package/dist/channels/github/progress.js +145 -146
- package/dist/channels/github/replay.js +30 -39
- package/dist/channels/github/state.js +40 -16
- package/dist/channels/github/types.d.ts +30 -6
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +100 -114
- package/dist/channels/gitlab/binding.js +52 -33
- package/dist/channels/gitlab/checks.js +28 -29
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/defaults.js +9 -3
- package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +95 -42
- package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +282 -249
- package/dist/channels/gitlab/index.d.ts +6 -2
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +6 -2
- package/dist/channels/gitlab/replay.js +50 -27
- package/dist/channels/gitlab/state.js +14 -6
- package/dist/channels/gitlab/types.d.ts +13 -2
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/api.js +100 -116
- package/dist/channels/origin/binding.js +15 -16
- package/dist/channels/origin/checks.js +30 -28
- package/dist/channels/origin/defaults.js +50 -65
- package/dist/channels/origin/origin-channel.js +266 -272
- package/dist/channels/origin/origin-webhook.js +70 -88
- package/dist/channels/origin/reactions.js +9 -21
- package/dist/channels/origin/state.js +13 -5
- package/dist/channels/slack/agentic-delivery.js +426 -478
- package/dist/channels/slack/agentic-posted.js +9 -10
- package/dist/channels/slack/agentic-signals.js +2 -3
- package/dist/channels/slack/api.js +417 -427
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/assistant.js +37 -47
- package/dist/channels/slack/attachments.js +188 -206
- package/dist/channels/slack/auth.js +8 -6
- package/dist/channels/slack/bot-mentions.js +31 -45
- package/dist/channels/slack/channel-watch.js +42 -48
- package/dist/channels/slack/cli-project.js +112 -137
- package/dist/channels/slack/code-fences.js +3 -5
- package/dist/channels/slack/constants.js +2 -2
- package/dist/channels/slack/credentials.js +23 -38
- package/dist/channels/slack/defaults.js +292 -331
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +533 -460
- package/dist/channels/slack/doctor.js +200 -214
- package/dist/channels/slack/eval-directive.js +79 -96
- package/dist/channels/slack/event-id-dedupe.js +1 -1
- package/dist/channels/slack/external-policy.js +26 -39
- package/dist/channels/slack/footer.js +28 -41
- package/dist/channels/slack/inbound.d.ts +1 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +50 -31
- package/dist/channels/slack/init.d.ts +1 -5
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +42 -59
- package/dist/channels/slack/interactive.d.ts +9 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +160 -162
- package/dist/channels/slack/links.js +1 -2
- package/dist/channels/slack/live-delivery.js +172 -190
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +44 -23
- package/dist/channels/slack/message-body.js +2 -2
- package/dist/channels/slack/nudge-carrier.js +30 -42
- package/dist/channels/slack/nudge-store.js +164 -191
- package/dist/channels/slack/paint-start.js +66 -81
- package/dist/channels/slack/placeholder.js +123 -152
- package/dist/channels/slack/pr-ref.js +1 -1
- package/dist/channels/slack/progress-delivery.js +65 -78
- package/dist/channels/slack/reasoning-card.js +36 -49
- package/dist/channels/slack/recording-sink.js +12 -24
- package/dist/channels/slack/reply-options.js +7 -12
- package/dist/channels/slack/self-identity.js +27 -35
- package/dist/channels/slack/sender-name.d.ts +12 -3
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +57 -61
- package/dist/channels/slack/setup.js +2 -4
- package/dist/channels/slack/slack-channel.d.ts +6 -4
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +441 -308
- package/dist/channels/slack/socket-mode.js +38 -52
- package/dist/channels/slack/thread-context.js +143 -160
- package/dist/channels/slack/tool-approval-events.js +149 -166
- package/dist/channels/slack/tool-cards.js +6 -11
- package/dist/channels/slack/tool-chip.js +1 -2
- package/dist/channels/slack/types.d.ts +15 -17
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.js +84 -97
- package/dist/channels/slack/user-info.js +27 -41
- package/dist/channels.js +9 -20
- package/dist/dashboard-session-url.js +3 -4
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.oyjtOr3W.js → app.DXI7bwox.js} +4 -4
- package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
- package/dist/docs/assets/chunks/{theme.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
- package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
- package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
- package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/building-with-agents.md +2 -0
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +7 -0
- package/dist/docs/evals.html +36 -36
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +38 -38
- package/dist/docs/guides/bitbucket.md +9 -1
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +39 -39
- package/dist/docs/guides/github.md +20 -4
- package/dist/docs/guides/gitlab.html +38 -38
- package/dist/docs/guides/gitlab.md +9 -1
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/migrate.html +66 -0
- package/dist/docs/guides/migrate.md +122 -0
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- 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 +214 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +39 -38
- package/dist/docs/reference/cli.md +39 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +35 -35
- 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/grokbot-agents.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 +1 -0
- package/dist/evals/assertions.js +20 -34
- package/dist/evals/expect.js +3 -6
- package/dist/evals/judge.js +5 -8
- package/dist/evals/loaders.js +45 -62
- package/dist/evals/matchers.js +2 -3
- package/dist/evals/reporters.js +43 -67
- package/dist/evals/results.js +1 -1
- package/dist/evals/run-facts.js +5 -6
- package/dist/evals.js +27 -15
- package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +0 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
- package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
- package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
- package/dist/extensions/jev/extension.js +3 -3
- package/dist/extensions/jev/lib/evaluate.js +43 -60
- package/dist/extensions/jev/tools/evaluate.js +6 -17
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions.js +3 -5
- package/dist/files-backends/cursor-hosted.js +504 -523
- package/dist/files-backends/local-fs.js +72 -134
- package/dist/files.js +3 -3
- package/dist/filesystem.js +562 -861
- package/dist/index.js +16 -35
- package/dist/internal/advertise-tools.js +74 -86
- package/dist/internal/artifacts-store.js +298 -361
- package/dist/internal/as-of.js +2 -4
- package/dist/internal/authored-alias-hooks.js +6 -4
- package/dist/internal/authored-loaders.js +37 -52
- package/dist/internal/bounded-int.js +1 -2
- package/dist/internal/bounded.js +13 -24
- package/dist/internal/brand.js +1 -1
- package/dist/internal/browser-origin-guard.js +4 -4
- package/dist/internal/builtin-tools/artifacts.js +15 -27
- package/dist/internal/builtin-tools/index.js +2 -3
- package/dist/internal/builtin-tools/reminders.js +33 -52
- package/dist/internal/channel-architecture.d.ts +21 -0
- package/dist/internal/channel-architecture.d.ts.map +1 -0
- package/dist/internal/channel-architecture.js +41 -0
- package/dist/internal/channel-dispatch.js +3 -4
- package/dist/internal/channel-route-dispatch.js +40 -51
- package/dist/internal/channel-state.js +1 -1
- package/dist/internal/chat-client.js +319 -340
- package/dist/internal/cli-ax.js +1262 -1294
- package/dist/internal/cli-bitbucket.js +244 -272
- package/dist/internal/cli-convert-automation.js +137 -151
- package/dist/internal/cli-cursor.js +126 -147
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +1457 -1507
- package/dist/internal/cli-docs.js +130 -147
- package/dist/internal/cli-github.js +437 -476
- package/dist/internal/cli-gitlab.js +259 -288
- package/dist/internal/cli-images.js +266 -334
- package/dist/internal/cli-manifest.js +25 -37
- package/dist/internal/cli-mcp-oauth.js +228 -247
- package/dist/internal/cli-mcp.js +358 -383
- package/dist/internal/cli-migrate.d.ts +18 -0
- package/dist/internal/cli-migrate.d.ts.map +1 -0
- package/dist/internal/cli-migrate.js +136 -0
- package/dist/internal/cli-skills.js +35 -47
- package/dist/internal/cli-slack-manual.d.ts +0 -1
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +175 -204
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +416 -456
- package/dist/internal/cloud-merge.js +7 -3
- package/dist/internal/cloud-turn-cost.js +8 -1
- package/dist/internal/connection-env.js +5 -6
- package/dist/internal/continuation-channel.js +10 -7
- package/dist/internal/continuation-identity.js +85 -67
- package/dist/internal/conversation-mirror.js +112 -131
- package/dist/internal/convert-automation/convert-workflow.js +21 -31
- package/dist/internal/cron.js +3 -3
- package/dist/internal/cursor/account-mcp.js +147 -146
- package/dist/internal/cursor/backend-client.js +290 -320
- package/dist/internal/cursor/bound-secret-file.js +3 -3
- package/dist/internal/cursor/credentials.d.ts +1 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +130 -142
- package/dist/internal/cursor/cursor-api-transport.js +4 -8
- package/dist/internal/cursor/github-credentials.js +91 -108
- package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
- package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +5 -9
- package/dist/internal/cursor/session-token.js +36 -48
- package/dist/internal/cursor/store-api-client.js +77 -92
- package/dist/internal/cursor-account-mcp-auth.js +132 -149
- package/dist/internal/cursor-agent-template.js +1 -1
- package/dist/internal/cursor-deployment-relay.js +33 -54
- package/dist/internal/cursor-event-relay.js +65 -59
- package/dist/internal/cursor-relay-core.js +258 -286
- package/dist/internal/deferred-channel-session.js +3 -12
- package/dist/internal/deploy-client.js +410 -475
- package/dist/internal/deploy-manifest.d.ts +17 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +71 -21
- package/dist/internal/deploy-source.js +31 -43
- package/dist/internal/discovery/agent-config.js +45 -59
- package/dist/internal/discovery/agent.js +276 -280
- package/dist/internal/discovery/channels.js +67 -80
- package/dist/internal/discovery/connections.js +286 -296
- package/dist/internal/discovery/context.js +2 -13
- package/dist/internal/discovery/cursor-plugin.js +223 -259
- package/dist/internal/discovery/extension-overlay.js +104 -131
- package/dist/internal/discovery/extensions.js +276 -281
- package/dist/internal/discovery/fs.js +56 -79
- package/dist/internal/discovery/hooks.js +39 -50
- package/dist/internal/discovery/info.js +17 -19
- package/dist/internal/discovery/instructions.js +58 -71
- package/dist/internal/discovery/modules.js +45 -58
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +192 -215
- package/dist/internal/discovery/reminders.js +41 -52
- package/dist/internal/discovery/runtime.js +1 -1
- package/dist/internal/discovery/schedules.js +71 -82
- package/dist/internal/discovery/seed-files.js +21 -32
- package/dist/internal/discovery/services.js +74 -96
- package/dist/internal/discovery/skills.js +77 -94
- package/dist/internal/discovery/subagent.js +79 -95
- package/dist/internal/discovery/tools.js +12 -23
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +30 -45
- package/dist/internal/duration.js +1 -1
- package/dist/internal/env-file.js +48 -64
- package/dist/internal/eval-judge-model.js +17 -28
- package/dist/internal/eval-run-store.js +265 -254
- package/dist/internal/eval-runner.d.ts +8 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +406 -408
- package/dist/internal/eval-transport.d.ts +24 -0
- package/dist/internal/eval-transport.d.ts.map +1 -0
- package/dist/internal/eval-transport.js +22 -0
- package/dist/internal/evals-client.js +242 -246
- package/dist/internal/event-log.js +72 -120
- package/dist/internal/event-mapper.js +30 -31
- package/dist/internal/factory-resource-channel.js +16 -30
- package/dist/internal/filesystem/errors.js +6 -6
- package/dist/internal/filesystem/format.js +10 -13
- package/dist/internal/filesystem/merge.js +52 -94
- package/dist/internal/filesystem/nearest.js +15 -27
- package/dist/internal/filesystem/scratch.js +65 -85
- package/dist/internal/filesystem/tools.js +221 -241
- package/dist/internal/filesystem/walk.js +76 -143
- package/dist/internal/framework-file-storage.js +118 -139
- package/dist/internal/framework-storage-selection.js +21 -13
- package/dist/internal/frontmatter.js +4 -6
- package/dist/internal/github-fanout.js +50 -64
- package/dist/internal/guest-network.js +96 -109
- package/dist/internal/handleAgentServeTrigger.js +121 -126
- package/dist/internal/host-files.js +73 -88
- package/dist/internal/host-kv.js +21 -36
- package/dist/internal/host-otel.js +22 -19
- package/dist/internal/host-platforms.js +49 -63
- package/dist/internal/hosted-catch-protocol.d.ts +1 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +1 -0
- package/dist/internal/hosted-catch.d.ts +5 -3
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +84 -93
- package/dist/internal/hosted-delivery-protocol.js +32 -8
- package/dist/internal/hosted-delivery.d.ts +13 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +614 -584
- package/dist/internal/hosted-eval-cases.d.ts +21 -0
- package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
- package/dist/internal/hosted-eval-cases.js +162 -0
- package/dist/internal/hosted-execution-diag.js +38 -30
- package/dist/internal/hosted-execution-flush.js +75 -66
- package/dist/internal/hosted-execution-latency.js +16 -8
- package/dist/internal/hosted-managed-automation.js +2 -2
- package/dist/internal/hosting.js +2 -3
- package/dist/internal/http-channel-define.js +4 -1
- package/dist/internal/http-channel.js +101 -112
- package/dist/internal/http-control-plane-session.d.ts +18 -1
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +66 -32
- package/dist/internal/incoming-headers-to-fetch.js +1 -2
- package/dist/internal/init-interview.js +73 -93
- package/dist/internal/init-project.js +182 -214
- package/dist/internal/init-scaffold.js +10 -21
- package/dist/internal/inline-stdio-mcp.js +80 -86
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +238 -274
- package/dist/internal/legacy-command-guard.js +18 -31
- package/dist/internal/listen-port.js +34 -45
- package/dist/internal/local-control-plane.js +293 -307
- package/dist/internal/local-env.js +1 -1
- package/dist/internal/local-ingress.js +15 -9
- package/dist/internal/log-ring.js +1 -2
- package/dist/internal/logs-client.js +207 -227
- package/dist/internal/map-pool.js +24 -38
- package/dist/internal/mcp-endpoint.js +204 -180
- package/dist/internal/mcp-host.js +165 -168
- package/dist/internal/mcp-oauth-on-demand.js +170 -207
- package/dist/internal/mcp-oauth-persist.js +15 -29
- package/dist/internal/mcp-oauth.js +209 -266
- package/dist/internal/named-webhook-secret.d.ts +39 -0
- package/dist/internal/named-webhook-secret.d.ts.map +1 -0
- package/dist/internal/named-webhook-secret.js +47 -0
- package/dist/internal/open-browser.js +2 -3
- package/dist/internal/otel/collector.js +104 -68
- package/dist/internal/otel/config.js +24 -37
- package/dist/internal/otel/http.js +5 -7
- package/dist/internal/otel/mcp.js +3 -12
- package/dist/internal/otel/runtime.js +69 -83
- package/dist/internal/package-inline-stdio.js +57 -65
- package/dist/internal/peer-connections.js +9 -5
- package/dist/internal/platform-schedule-sync.js +39 -54
- package/dist/internal/platform-timers.js +176 -210
- package/dist/internal/playground/static.js +1 -2
- package/dist/internal/playground/toolchain.js +37 -53
- package/dist/internal/playground-proxy.js +230 -270
- package/dist/internal/process-memory-telemetry.js +33 -51
- package/dist/internal/prompt-context.js +3 -6
- package/dist/internal/reminder-control-plane-protocol.js +46 -13
- package/dist/internal/reminder-runner.js +770 -785
- package/dist/internal/reminder-schedule.js +1 -1
- package/dist/internal/reminder-store.js +57 -78
- package/dist/internal/request-error-status.js +1 -3
- package/dist/internal/request-headers.js +2 -2
- package/dist/internal/resolve-prod-target.js +119 -135
- package/dist/internal/resolved-connections.js +16 -6
- package/dist/internal/run-client.js +221 -229
- package/dist/internal/runtime-dispatch-runner.js +18 -43
- package/dist/internal/schedule-runner.js +49 -58
- package/dist/internal/scm/pr-url.js +7 -6
- package/dist/internal/sdk-runner.js +388 -363
- package/dist/internal/serve-restart.js +26 -39
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +1283 -1244
- package/dist/internal/session-cost.js +7 -9
- package/dist/internal/session-engine.d.ts +3 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +2801 -2777
- package/dist/internal/session-links.js +12 -16
- package/dist/internal/session-run-log.js +134 -82
- package/dist/internal/session-store.js +133 -164
- package/dist/internal/sessions-client.js +97 -118
- package/dist/internal/skill-catalog.js +18 -23
- package/dist/internal/skills-sync.js +16 -30
- package/dist/internal/slack-provision-client.js +90 -116
- package/dist/internal/start-log-store.js +48 -67
- package/dist/internal/steering.js +1 -2
- package/dist/internal/storage-coordinator.js +160 -196
- package/dist/internal/store-mirror.js +16 -30
- package/dist/internal/stream-progress.js +6 -8
- package/dist/internal/terminal-style.js +3 -4
- package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
- package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
- package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
- package/dist/internal/tool-catalog.js +11 -5
- package/dist/internal/tool-result.js +1 -1
- package/dist/internal/trajectory.js +19 -22
- package/dist/internal/turn-cost.js +52 -62
- package/dist/internal/turn-governor.js +5 -8
- package/dist/internal/turn-lease-store.js +85 -105
- package/dist/internal/turn-outbox.js +28 -43
- package/dist/internal/update-check.js +231 -259
- package/dist/internal/v2-hosting.js +1 -2
- package/dist/internal/workspace-sync.js +25 -41
- package/dist/internal/workspace.js +111 -139
- package/dist/kv/memory-kv.js +27 -51
- package/dist/memory.js +106 -148
- package/dist/otel.js +5 -8
- package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
- package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +2 -4
- package/dist/storage-backends/cursor-hosted-v2.js +53 -83
- package/dist/storage-backends/cursor-hosted.js +105 -145
- package/dist/storage-backends/file-kv.js +100 -128
- package/dist/storage-protocol.js +3 -5
- package/dist/storage.js +17 -26
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -18
- package/docs/building-with-agents.md +2 -0
- package/docs/deployment.md +7 -0
- package/docs/guides/bitbucket.md +9 -1
- package/docs/guides/github.md +20 -4
- package/docs/guides/gitlab.md +9 -1
- package/docs/guides/migrate.md +127 -0
- package/docs/reference/cli.md +39 -0
- package/docs/troubleshooting.md +1 -0
- package/package.json +1 -1
- package/skills/debug/SKILL.md +1 -0
- package/skills/github/SKILL.md +23 -0
- package/skills/migrate-v2/SKILL.md +264 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
- package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
- package/dist/playground/assets/index-DPKLl4C_.css +0 -1
- /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
- /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -13,15 +13,6 @@
|
|
|
13
13
|
* a short-lived access token (`POST /auth/exchange_user_api_key`, ~1h),
|
|
14
14
|
* cached until shortly before expiry and re-exchanged once on a 401.
|
|
15
15
|
*/
|
|
16
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
-
});
|
|
24
|
-
};
|
|
25
16
|
import { randomUUID } from "node:crypto";
|
|
26
17
|
import { z } from "zod";
|
|
27
18
|
import { describeError } from "../describe-error.js";
|
|
@@ -30,9 +21,9 @@ import { boundedToolAnnotations } from "../mcp-host.js";
|
|
|
30
21
|
import { CURSOR_SESSION_EXCHANGE_PATH, CursorSessionExchangeError, exchangeCursorApiKeyForSession, SESSION_TOKEN_EXPIRY_LEEWAY_MS, } from "./session-token.js";
|
|
31
22
|
const CLIENT_VERSION = "agent-serve-0.1.0";
|
|
32
23
|
const DASHBOARD_SERVICE = "DashboardService";
|
|
33
|
-
const LIST_TIMEOUT_MS =
|
|
24
|
+
const LIST_TIMEOUT_MS = 60_000;
|
|
34
25
|
/** Backend-executed tools call out to third-party servers; be generous. */
|
|
35
|
-
const EXECUTE_TIMEOUT_MS =
|
|
26
|
+
const EXECUTE_TIMEOUT_MS = 120_000;
|
|
36
27
|
export class CursorBackendError extends Error {
|
|
37
28
|
constructor(message, status, retryAfterMs) {
|
|
38
29
|
super(message);
|
|
@@ -160,117 +151,113 @@ const executeResponseSchema = z.object({
|
|
|
160
151
|
// Shared request machinery (used by the client and the login-time mint)
|
|
161
152
|
// ============================================================================
|
|
162
153
|
/** One DashboardService Connect-JSON POST; auth is the caller's bearer. */
|
|
163
|
-
function connectRpc(args) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
154
|
+
async function connectRpc(args) {
|
|
155
|
+
try {
|
|
156
|
+
return await args.fetchImpl(`${args.backendUrl}/aiserver.v1.${args.service}/${args.method}`, {
|
|
157
|
+
method: "POST",
|
|
158
|
+
headers: {
|
|
159
|
+
"content-type": "application/json",
|
|
160
|
+
authorization: `Bearer ${args.bearer}`,
|
|
161
|
+
"x-ghost-mode": "true",
|
|
162
|
+
"x-cursor-client-version": CLIENT_VERSION,
|
|
163
|
+
"x-cursor-client-type": "agent-serve",
|
|
164
|
+
"x-request-id": randomUUID(),
|
|
165
|
+
...args.extraHeaders,
|
|
166
|
+
},
|
|
167
|
+
body: JSON.stringify(args.body ?? {}),
|
|
168
|
+
signal: AbortSignal.timeout(args.timeoutMs),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
throw new CursorBackendError(`Cursor backend request ${args.method} failed: ${describeError(error)}`);
|
|
173
|
+
}
|
|
178
174
|
}
|
|
179
175
|
/** Drain and parse an RPC response; maps non-2xx to a CursorBackendError. */
|
|
180
|
-
function parseRpcResponse(method, response) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
});
|
|
176
|
+
async function parseRpcResponse(method, response) {
|
|
177
|
+
const text = await response.text();
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
throw new CursorBackendError(`Cursor backend ${method} failed (${response.status}): ${connectErrorMessage(text)}`, response.status);
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
return JSON.parse(text);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
throw new CursorBackendError(`Cursor backend ${method} returned a non-JSON response.`);
|
|
186
|
+
}
|
|
193
187
|
}
|
|
194
188
|
export class CursorBackendClient {
|
|
195
189
|
constructor(options) {
|
|
196
|
-
var _a, _b, _c;
|
|
197
190
|
this.backendUrl = options.backendUrl.endsWith("/")
|
|
198
191
|
? options.backendUrl.slice(0, -1)
|
|
199
192
|
: options.backendUrl;
|
|
200
|
-
this.resolveApiKey =
|
|
201
|
-
this.logger =
|
|
202
|
-
this.fetchImpl =
|
|
193
|
+
this.resolveApiKey = options.getApiKey ?? (() => options.apiKey);
|
|
194
|
+
this.logger = options.logger ?? (() => { });
|
|
195
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
203
196
|
}
|
|
204
197
|
currentApiKey() {
|
|
205
198
|
return this.resolveApiKey().trim();
|
|
206
199
|
}
|
|
207
200
|
/** Who this API key acts as. */
|
|
208
|
-
getMe() {
|
|
209
|
-
return
|
|
210
|
-
return getMeResponseSchema.parse(yield this.rpc("GetMe", {}));
|
|
211
|
-
});
|
|
201
|
+
async getMe() {
|
|
202
|
+
return getMeResponseSchema.parse(await this.rpc("GetMe", {}));
|
|
212
203
|
}
|
|
213
204
|
/**
|
|
214
205
|
* The account's MCP connectors with live status and backend-prefixed tool
|
|
215
206
|
* definitions. `serverIdentifiers` restricts discovery (empty = all
|
|
216
207
|
* HTTP/SSE servers on the account).
|
|
217
208
|
*/
|
|
218
|
-
listAccountMcpTools(serverIdentifiers) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
209
|
+
async listAccountMcpTools(serverIdentifiers) {
|
|
210
|
+
const raw = await this.rpc("ListSandMcpTools", { serverIdentifiers: [...serverIdentifiers] }, LIST_TIMEOUT_MS);
|
|
211
|
+
const parsed = listSandMcpToolsResponseSchema.parse(raw);
|
|
212
|
+
return (parsed.servers ?? []).map(server => ({
|
|
213
|
+
serverIdentifier: server.serverIdentifier,
|
|
214
|
+
status: server.status,
|
|
215
|
+
tools: (server.tools ?? []).map(tool => {
|
|
216
|
+
const outputSchema = parseOutputSchemaJson(tool.outputSchemaJson);
|
|
217
|
+
const annotations = parseAnnotationsJson(tool.annotationsJson);
|
|
218
|
+
return {
|
|
219
|
+
name: tool.name,
|
|
220
|
+
description: tool.description ?? "",
|
|
221
|
+
inputSchema: normalizeInputSchema(tool.inputSchema),
|
|
222
|
+
...(outputSchema === undefined ? {} : { outputSchema }),
|
|
223
|
+
...(annotations === undefined ? {} : { annotations }),
|
|
224
|
+
};
|
|
225
|
+
}),
|
|
226
|
+
}));
|
|
234
227
|
}
|
|
235
228
|
/**
|
|
236
229
|
* Execute one connector tool **on the Cursor backend** with the account's
|
|
237
230
|
* stored OAuth credentials. `toolName` is the fully-qualified name from
|
|
238
231
|
* {@link listAccountMcpTools}.
|
|
239
232
|
*/
|
|
240
|
-
executeAccountMcpTool(args) {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
const parsed = executeResponseSchema.parse(raw);
|
|
250
|
-
return toCallResult((_a = parsed.result) !== null && _a !== void 0 ? _a : {});
|
|
251
|
-
});
|
|
233
|
+
async executeAccountMcpTool(args) {
|
|
234
|
+
const raw = await this.rpc("ExecuteSandMcpTool", {
|
|
235
|
+
serverIdentifier: args.serverIdentifier,
|
|
236
|
+
toolName: args.toolName,
|
|
237
|
+
args: args.args,
|
|
238
|
+
toolCallId: randomUUID(),
|
|
239
|
+
}, EXECUTE_TIMEOUT_MS);
|
|
240
|
+
const parsed = executeResponseSchema.parse(raw);
|
|
241
|
+
return toCallResult(parsed.result ?? {});
|
|
252
242
|
}
|
|
253
243
|
/**
|
|
254
244
|
* The account's dashboard MCP connector listing (id + name per server).
|
|
255
245
|
* `teamId` pins the ambient team so team-scoped connectors resolve for
|
|
256
246
|
* multi-team accounts.
|
|
257
247
|
*/
|
|
258
|
-
getAvailableMcpServers(options) {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
const raw = yield this.rpc("GetAvailableMcpServers", {}, LIST_TIMEOUT_MS, {
|
|
262
|
-
teamId: options === null || options === void 0 ? void 0 : options.teamId,
|
|
263
|
-
});
|
|
264
|
-
const parsed = getAvailableMcpServersResponseSchema.parse(raw);
|
|
265
|
-
return ((_a = parsed.servers) !== null && _a !== void 0 ? _a : [])
|
|
266
|
-
.filter(server => server.id !== undefined && server.id > 0)
|
|
267
|
-
.map(server => { var _a; return ({
|
|
268
|
-
id: server.id,
|
|
269
|
-
name: (_a = server.name) !== null && _a !== void 0 ? _a : "",
|
|
270
|
-
isTeamServer: server.isTeamServer === true,
|
|
271
|
-
serverIdentifier: server.serverIdentifier,
|
|
272
|
-
}); });
|
|
248
|
+
async getAvailableMcpServers(options) {
|
|
249
|
+
const raw = await this.rpc("GetAvailableMcpServers", {}, LIST_TIMEOUT_MS, {
|
|
250
|
+
teamId: options?.teamId,
|
|
273
251
|
});
|
|
252
|
+
const parsed = getAvailableMcpServersResponseSchema.parse(raw);
|
|
253
|
+
return (parsed.servers ?? [])
|
|
254
|
+
.filter(server => server.id !== undefined && server.id > 0)
|
|
255
|
+
.map(server => ({
|
|
256
|
+
id: server.id,
|
|
257
|
+
name: server.name ?? "",
|
|
258
|
+
isTeamServer: server.isTeamServer === true,
|
|
259
|
+
serverIdentifier: server.serverIdentifier,
|
|
260
|
+
}));
|
|
274
261
|
}
|
|
275
262
|
/**
|
|
276
263
|
* Probe connectors and mint OAuth `authUrl`s where authorization is
|
|
@@ -278,56 +265,50 @@ export class CursorBackendClient {
|
|
|
278
265
|
* flow for a hosted deployment's service account. Omit it to probe the
|
|
279
266
|
* signed-in user (local `serve` preflight).
|
|
280
267
|
*/
|
|
281
|
-
checkHttpMcpStatus(args) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
error: status.error,
|
|
295
|
-
}); });
|
|
296
|
-
});
|
|
268
|
+
async checkHttpMcpStatus(args) {
|
|
269
|
+
const raw = await this.rpc("CheckHttpMcpStatus", {
|
|
270
|
+
serverIds: args.serverIds,
|
|
271
|
+
oauthRedirectUri: args.oauthRedirectUri,
|
|
272
|
+
serviceAccountId: args.serviceAccountId,
|
|
273
|
+
}, LIST_TIMEOUT_MS);
|
|
274
|
+
const parsed = checkHttpMcpStatusResponseSchema.parse(raw);
|
|
275
|
+
return (parsed.statuses ?? []).map(status => ({
|
|
276
|
+
id: status.id ?? 0,
|
|
277
|
+
requiresAuth: status.requiresAuth === true,
|
|
278
|
+
authUrl: status.authUrl,
|
|
279
|
+
error: status.error,
|
|
280
|
+
}));
|
|
297
281
|
}
|
|
298
282
|
/** Mint a short-lived GitHub token scoped to the requested repositories. */
|
|
299
|
-
getGithubToken(repos, options) {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
}
|
|
329
|
-
return githubTokenResponseSchema.parse(parsed);
|
|
330
|
-
});
|
|
283
|
+
async getGithubToken(repos, options) {
|
|
284
|
+
const permissions = options?.permissions ?? "pr-write";
|
|
285
|
+
let response;
|
|
286
|
+
try {
|
|
287
|
+
response = await this.fetchImpl(`${this.backendUrl}/v0/scm-events/github-token`, {
|
|
288
|
+
method: "POST",
|
|
289
|
+
headers: {
|
|
290
|
+
"content-type": "application/json",
|
|
291
|
+
authorization: `Bearer ${this.currentApiKey()}`,
|
|
292
|
+
},
|
|
293
|
+
body: JSON.stringify({ repos: [...repos], permissions }),
|
|
294
|
+
signal: AbortSignal.timeout(30_000),
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
throw new CursorBackendError(`Cursor GitHub credential request failed: ${describeError(error)}`);
|
|
299
|
+
}
|
|
300
|
+
const text = await response.text();
|
|
301
|
+
if (!response.ok) {
|
|
302
|
+
throw new CursorBackendError(describeGithubTokenHttpFailure(response.status, text), response.status, retryAfterMsFromResponse(response));
|
|
303
|
+
}
|
|
304
|
+
let parsed;
|
|
305
|
+
try {
|
|
306
|
+
parsed = JSON.parse(text);
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
throw new CursorBackendError("Cursor backend returned a non-JSON GitHub credential response.");
|
|
310
|
+
}
|
|
311
|
+
return githubTokenResponseSchema.parse(parsed);
|
|
331
312
|
}
|
|
332
313
|
/**
|
|
333
314
|
* Resolve the proxied clone target for a GitHub (GHES) / GitLab /
|
|
@@ -336,44 +317,42 @@ export class CursorBackendClient {
|
|
|
336
317
|
* returned remote lives on the backend and takes this client's API key,
|
|
337
318
|
* never a provider token.
|
|
338
319
|
*/
|
|
339
|
-
getScmCloneTarget(provider, repo) {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
};
|
|
376
|
-
});
|
|
320
|
+
async getScmCloneTarget(provider, repo) {
|
|
321
|
+
const label = SCM_CLONE_PROVIDER_LABELS[provider];
|
|
322
|
+
let response;
|
|
323
|
+
try {
|
|
324
|
+
response = await this.fetchImpl(`${this.backendUrl}/v0/scm-events/${provider}-clone-target`, {
|
|
325
|
+
method: "POST",
|
|
326
|
+
headers: {
|
|
327
|
+
"content-type": "application/json",
|
|
328
|
+
authorization: `Bearer ${this.currentApiKey()}`,
|
|
329
|
+
},
|
|
330
|
+
body: JSON.stringify({ repo }),
|
|
331
|
+
signal: AbortSignal.timeout(30_000),
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
throw new CursorBackendError(`Cursor ${label} clone target request failed: ${describeError(error)}`);
|
|
336
|
+
}
|
|
337
|
+
const text = await response.text();
|
|
338
|
+
if (!response.ok) {
|
|
339
|
+
throw new CursorBackendError(describeGithubTokenHttpFailure(response.status, text, label), response.status, retryAfterMsFromResponse(response));
|
|
340
|
+
}
|
|
341
|
+
let parsed;
|
|
342
|
+
try {
|
|
343
|
+
parsed = JSON.parse(text);
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
throw new CursorBackendError(`Cursor backend returned a non-JSON ${label} clone target response.`);
|
|
347
|
+
}
|
|
348
|
+
const body = scmCloneTargetResponseSchema.parse(parsed);
|
|
349
|
+
return {
|
|
350
|
+
remoteUrl: `${this.backendUrl}${body.clone.remotePath}`,
|
|
351
|
+
token: this.currentApiKey(),
|
|
352
|
+
expiresAt: body.expiresAt,
|
|
353
|
+
username: body.clone.username,
|
|
354
|
+
authMode: body.clone.authMode,
|
|
355
|
+
};
|
|
377
356
|
}
|
|
378
357
|
/**
|
|
379
358
|
* One unary Connect-JSON call on `aiserver.v1.<service>` with the same
|
|
@@ -383,50 +362,46 @@ export class CursorBackendClient {
|
|
|
383
362
|
serviceRpc(service, method, body, timeoutMs = LIST_TIMEOUT_MS) {
|
|
384
363
|
return this.rpc(method, body, timeoutMs, { service });
|
|
385
364
|
}
|
|
386
|
-
rpc(
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
body,
|
|
421
|
-
timeoutMs,
|
|
422
|
-
extraHeaders,
|
|
423
|
-
});
|
|
424
|
-
if (second.status === 401 && ((_b = this.token) === null || _b === void 0 ? void 0 : _b.value) === retryBearer) {
|
|
425
|
-
// The freshly minted token was rejected too; do not keep serving it.
|
|
426
|
-
this.token = undefined;
|
|
427
|
-
}
|
|
428
|
-
return parseRpcResponse(method, second);
|
|
365
|
+
async rpc(method, body, timeoutMs = LIST_TIMEOUT_MS, options) {
|
|
366
|
+
const service = options?.service ?? DASHBOARD_SERVICE;
|
|
367
|
+
const extraHeaders = options?.teamId === undefined ? undefined : { "x-cursor-team-id": String(options.teamId) };
|
|
368
|
+
const bearer = await this.getAccessToken();
|
|
369
|
+
const first = await connectRpc({
|
|
370
|
+
fetchImpl: this.fetchImpl,
|
|
371
|
+
backendUrl: this.backendUrl,
|
|
372
|
+
service,
|
|
373
|
+
method,
|
|
374
|
+
bearer,
|
|
375
|
+
body,
|
|
376
|
+
timeoutMs,
|
|
377
|
+
extraHeaders,
|
|
378
|
+
});
|
|
379
|
+
if (first.status !== 401) {
|
|
380
|
+
return parseRpcResponse(method, first);
|
|
381
|
+
}
|
|
382
|
+
// The token aged out server-side. Drain the rejected body (keeps the
|
|
383
|
+
// connection reusable), drop the token — unless a concurrent retry
|
|
384
|
+
// already minted a newer one — and retry once.
|
|
385
|
+
await drainResponseBody(first);
|
|
386
|
+
if (this.token?.value === bearer) {
|
|
387
|
+
this.token = undefined;
|
|
388
|
+
}
|
|
389
|
+
const retryBearer = await this.getAccessToken();
|
|
390
|
+
const second = await connectRpc({
|
|
391
|
+
fetchImpl: this.fetchImpl,
|
|
392
|
+
backendUrl: this.backendUrl,
|
|
393
|
+
service,
|
|
394
|
+
method,
|
|
395
|
+
bearer: retryBearer,
|
|
396
|
+
body,
|
|
397
|
+
timeoutMs,
|
|
398
|
+
extraHeaders,
|
|
429
399
|
});
|
|
400
|
+
if (second.status === 401 && this.token?.value === retryBearer) {
|
|
401
|
+
// The freshly minted token was rejected too; do not keep serving it.
|
|
402
|
+
this.token = undefined;
|
|
403
|
+
}
|
|
404
|
+
return parseRpcResponse(method, second);
|
|
430
405
|
}
|
|
431
406
|
/**
|
|
432
407
|
* Serve a cached access token for the account, exchanging the API key
|
|
@@ -453,58 +428,53 @@ export class CursorBackendClient {
|
|
|
453
428
|
}
|
|
454
429
|
return this.tokenExchange;
|
|
455
430
|
}
|
|
456
|
-
exchangeApiKey() {
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
if (error
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
throw new CursorBackendError("Cursor API key exchange returned no access token.");
|
|
475
|
-
}
|
|
476
|
-
throw new CursorBackendError(error.status === 401
|
|
477
|
-
? `The Cursor API key was rejected. Run \`${CLI} login\` again or update CURSOR_API_KEY.`
|
|
478
|
-
: `Cursor API key exchange failed (${error.status}).`, error.status);
|
|
431
|
+
async exchangeApiKey() {
|
|
432
|
+
const apiKey = this.currentApiKey();
|
|
433
|
+
let session;
|
|
434
|
+
try {
|
|
435
|
+
session = await exchangeCursorApiKeyForSession({
|
|
436
|
+
exchangeUrl: `${this.backendUrl}${CURSOR_SESSION_EXCHANGE_PATH}`,
|
|
437
|
+
apiKey,
|
|
438
|
+
fetchImpl: this.fetchImpl,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
if (error instanceof CursorSessionExchangeError) {
|
|
443
|
+
if (error.status === undefined) {
|
|
444
|
+
throw new CursorBackendError(`Could not reach the Cursor backend at ${this.backendUrl}: ${error.message}`);
|
|
445
|
+
}
|
|
446
|
+
if (error.status >= 200 && error.status < 300) {
|
|
447
|
+
// 2xx without a token in the body.
|
|
448
|
+
throw new CursorBackendError("Cursor API key exchange returned no access token.");
|
|
479
449
|
}
|
|
480
|
-
throw error
|
|
450
|
+
throw new CursorBackendError(error.status === 401
|
|
451
|
+
? `The Cursor API key was rejected. Run \`${CLI} login\` again or update CURSOR_API_KEY.`
|
|
452
|
+
: `Cursor API key exchange failed (${error.status}).`, error.status);
|
|
481
453
|
}
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
454
|
+
throw error;
|
|
455
|
+
}
|
|
456
|
+
this.token = { value: session.token, expiresAtMs: session.expiresAtMs };
|
|
457
|
+
this.lastExchangedApiKey = apiKey;
|
|
458
|
+
this.logger("[bdk] cursor account: minted a fresh access token");
|
|
459
|
+
return session.token;
|
|
487
460
|
}
|
|
488
461
|
}
|
|
489
462
|
/**
|
|
490
463
|
* Mint a named user API key from a short-lived login session token. Used
|
|
491
464
|
* exactly once per `agent-sdk login`; the session token is then discarded.
|
|
492
465
|
*/
|
|
493
|
-
export function createUserApiKeyWithSessionToken(args) {
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
body: { name: args.keyName },
|
|
503
|
-
timeoutMs: 30000,
|
|
504
|
-
});
|
|
505
|
-
const raw = yield parseRpcResponse("CreateUserApiKey", response);
|
|
506
|
-
return createUserApiKeyResponseSchema.parse(raw).apiKey;
|
|
466
|
+
export async function createUserApiKeyWithSessionToken(args) {
|
|
467
|
+
const response = await connectRpc({
|
|
468
|
+
fetchImpl: args.fetchImpl ?? fetch,
|
|
469
|
+
backendUrl: args.backendUrl.endsWith("/") ? args.backendUrl.slice(0, -1) : args.backendUrl,
|
|
470
|
+
service: DASHBOARD_SERVICE,
|
|
471
|
+
method: "CreateUserApiKey",
|
|
472
|
+
bearer: args.sessionToken,
|
|
473
|
+
body: { name: args.keyName },
|
|
474
|
+
timeoutMs: 30_000,
|
|
507
475
|
});
|
|
476
|
+
const raw = await parseRpcResponse("CreateUserApiKey", response);
|
|
477
|
+
return createUserApiKeyResponseSchema.parse(raw).apiKey;
|
|
508
478
|
}
|
|
509
479
|
const API_KEY_PREFIX = "crsr_";
|
|
510
480
|
/** Matches dashboard `maskApiKey` (`crsr_...abcd`). */
|
|
@@ -527,39 +497,36 @@ const listUserApiKeysResponseSchema = z.object({
|
|
|
527
497
|
* so replica lag after `CreateUserApiKey` can only skip the cleanup, not
|
|
528
498
|
* revoke an older same-named key.
|
|
529
499
|
*/
|
|
530
|
-
export function revokeMintedUserApiKey(args) {
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
body: {},
|
|
542
|
-
timeoutMs: 30000,
|
|
543
|
-
});
|
|
544
|
-
const listed = listUserApiKeysResponseSchema.parse(yield parseRpcResponse("ListUserApiKeys", listResponse));
|
|
545
|
-
const masked = maskApiKey(args.apiKey);
|
|
546
|
-
const match = ((_b = listed.apiKeys) !== null && _b !== void 0 ? _b : []).find(key => key.name === args.keyName && key.maskedKey === masked);
|
|
547
|
-
if (match === undefined) {
|
|
548
|
-
// CreateUserApiKey writes the primary while ListUserApiKeys may read a
|
|
549
|
-
// lagging replica — skip rather than touch any other key.
|
|
550
|
-
return;
|
|
551
|
-
}
|
|
552
|
-
const revokeResponse = yield connectRpc({
|
|
553
|
-
fetchImpl,
|
|
554
|
-
backendUrl,
|
|
555
|
-
service: DASHBOARD_SERVICE,
|
|
556
|
-
method: "RevokeUserApiKey",
|
|
557
|
-
bearer: args.sessionToken,
|
|
558
|
-
body: { id: match.id },
|
|
559
|
-
timeoutMs: 30000,
|
|
560
|
-
});
|
|
561
|
-
yield drainResponseBody(revokeResponse);
|
|
500
|
+
export async function revokeMintedUserApiKey(args) {
|
|
501
|
+
const fetchImpl = args.fetchImpl ?? fetch;
|
|
502
|
+
const backendUrl = args.backendUrl.endsWith("/") ? args.backendUrl.slice(0, -1) : args.backendUrl;
|
|
503
|
+
const listResponse = await connectRpc({
|
|
504
|
+
fetchImpl,
|
|
505
|
+
backendUrl,
|
|
506
|
+
service: DASHBOARD_SERVICE,
|
|
507
|
+
method: "ListUserApiKeys",
|
|
508
|
+
bearer: args.sessionToken,
|
|
509
|
+
body: {},
|
|
510
|
+
timeoutMs: 30_000,
|
|
562
511
|
});
|
|
512
|
+
const listed = listUserApiKeysResponseSchema.parse(await parseRpcResponse("ListUserApiKeys", listResponse));
|
|
513
|
+
const masked = maskApiKey(args.apiKey);
|
|
514
|
+
const match = (listed.apiKeys ?? []).find(key => key.name === args.keyName && key.maskedKey === masked);
|
|
515
|
+
if (match === undefined) {
|
|
516
|
+
// CreateUserApiKey writes the primary while ListUserApiKeys may read a
|
|
517
|
+
// lagging replica — skip rather than touch any other key.
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
const revokeResponse = await connectRpc({
|
|
521
|
+
fetchImpl,
|
|
522
|
+
backendUrl,
|
|
523
|
+
service: DASHBOARD_SERVICE,
|
|
524
|
+
method: "RevokeUserApiKey",
|
|
525
|
+
bearer: args.sessionToken,
|
|
526
|
+
body: { id: match.id },
|
|
527
|
+
timeoutMs: 30_000,
|
|
528
|
+
});
|
|
529
|
+
await drainResponseBody(revokeResponse);
|
|
563
530
|
}
|
|
564
531
|
// ============================================================================
|
|
565
532
|
// Helpers
|
|
@@ -568,7 +535,7 @@ function safeJsonParse(text) {
|
|
|
568
535
|
try {
|
|
569
536
|
return JSON.parse(text);
|
|
570
537
|
}
|
|
571
|
-
catch
|
|
538
|
+
catch {
|
|
572
539
|
return undefined;
|
|
573
540
|
}
|
|
574
541
|
}
|
|
@@ -592,7 +559,7 @@ function parseOutputSchemaJson(outputSchemaJson) {
|
|
|
592
559
|
try {
|
|
593
560
|
parsed = JSON.parse(outputSchemaJson);
|
|
594
561
|
}
|
|
595
|
-
catch
|
|
562
|
+
catch {
|
|
596
563
|
return undefined;
|
|
597
564
|
}
|
|
598
565
|
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
|
|
@@ -612,26 +579,33 @@ function parseAnnotationsJson(annotationsJson) {
|
|
|
612
579
|
try {
|
|
613
580
|
parsed = JSON.parse(annotationsJson);
|
|
614
581
|
}
|
|
615
|
-
catch
|
|
582
|
+
catch {
|
|
616
583
|
return undefined;
|
|
617
584
|
}
|
|
618
585
|
return boundedToolAnnotations(parsed);
|
|
619
586
|
}
|
|
620
587
|
function toCallResult(result) {
|
|
621
|
-
var _a;
|
|
622
588
|
if (result.success !== undefined) {
|
|
623
589
|
const content = [];
|
|
624
|
-
for (const item of
|
|
590
|
+
for (const item of result.success.content ?? []) {
|
|
625
591
|
if (item.text !== undefined) {
|
|
626
592
|
content.push({ type: "text", text: item.text.text });
|
|
627
593
|
}
|
|
628
594
|
else if (item.image !== undefined) {
|
|
629
|
-
content.push(
|
|
595
|
+
content.push({
|
|
596
|
+
type: "image",
|
|
597
|
+
data: item.image.data,
|
|
598
|
+
...(item.image.mimeType === undefined ? {} : { mimeType: item.image.mimeType }),
|
|
599
|
+
});
|
|
630
600
|
}
|
|
631
601
|
}
|
|
632
|
-
return
|
|
633
|
-
|
|
634
|
-
:
|
|
602
|
+
return {
|
|
603
|
+
content,
|
|
604
|
+
isError: result.success.isError === true,
|
|
605
|
+
...(result.success.structuredContent === undefined
|
|
606
|
+
? {}
|
|
607
|
+
: { structuredContent: result.success.structuredContent }),
|
|
608
|
+
};
|
|
635
609
|
}
|
|
636
610
|
return {
|
|
637
611
|
content: [{ type: "text", text: describeFailure(result) }],
|
|
@@ -639,21 +613,20 @@ function toCallResult(result) {
|
|
|
639
613
|
};
|
|
640
614
|
}
|
|
641
615
|
function describeFailure(result) {
|
|
642
|
-
var _a, _b, _c, _d, _e, _f;
|
|
643
616
|
if (result.error !== undefined) {
|
|
644
|
-
return
|
|
617
|
+
return result.error.error ?? "The tool call failed.";
|
|
645
618
|
}
|
|
646
619
|
if (result.permissionDenied !== undefined) {
|
|
647
|
-
return
|
|
620
|
+
return result.permissionDenied.error ?? "Permission denied.";
|
|
648
621
|
}
|
|
649
622
|
if (result.rejected !== undefined) {
|
|
650
623
|
return `The tool call was rejected${result.rejected.reason === undefined ? "" : `: ${result.rejected.reason}`}.`;
|
|
651
624
|
}
|
|
652
625
|
if (result.toolNotFound !== undefined) {
|
|
653
|
-
return `Unknown tool "${
|
|
626
|
+
return `Unknown tool "${result.toolNotFound.name ?? ""}". Available: ${(result.toolNotFound.availableTools ?? []).join(", ") || "(none)"}.`;
|
|
654
627
|
}
|
|
655
628
|
if (result.serverNotFound !== undefined) {
|
|
656
|
-
return `Unknown MCP server "${
|
|
629
|
+
return `Unknown MCP server "${result.serverNotFound.name ?? ""}". Available: ${(result.serverNotFound.availableServers ?? []).join(", ") || "(none)"}.`;
|
|
657
630
|
}
|
|
658
631
|
return "The tool call returned no result.";
|
|
659
632
|
}
|
|
@@ -668,7 +641,7 @@ function connectErrorMessage(bodyText) {
|
|
|
668
641
|
}
|
|
669
642
|
return bodyText.slice(0, 300) || "(empty response body)";
|
|
670
643
|
}
|
|
671
|
-
const MAX_GITHUB_TOKEN_RETRY_AFTER_MS = 60 *
|
|
644
|
+
const MAX_GITHUB_TOKEN_RETRY_AFTER_MS = 60 * 60_000;
|
|
672
645
|
/**
|
|
673
646
|
* Prefer the backend's actionable denial message. Only a true 401 on this
|
|
674
647
|
* route means the Cursor API key itself was rejected — GitHub-connection
|
|
@@ -705,21 +678,18 @@ function githubTokenErrorFromBody(bodyText) {
|
|
|
705
678
|
return undefined;
|
|
706
679
|
}
|
|
707
680
|
function retryAfterMsFromResponse(response) {
|
|
708
|
-
|
|
709
|
-
const retryAfter = Number((_a = response.headers.get("retry-after")) !== null && _a !== void 0 ? _a : "");
|
|
681
|
+
const retryAfter = Number(response.headers.get("retry-after") ?? "");
|
|
710
682
|
if (!Number.isFinite(retryAfter) || retryAfter <= 0) {
|
|
711
683
|
return undefined;
|
|
712
684
|
}
|
|
713
685
|
return Math.min(retryAfter * 1000, MAX_GITHUB_TOKEN_RETRY_AFTER_MS);
|
|
714
686
|
}
|
|
715
687
|
/** Release undici/fetch connection slots on responses we will not parse. */
|
|
716
|
-
function drainResponseBody(response) {
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
}
|
|
724
|
-
});
|
|
688
|
+
async function drainResponseBody(response) {
|
|
689
|
+
try {
|
|
690
|
+
await response.arrayBuffer();
|
|
691
|
+
}
|
|
692
|
+
catch {
|
|
693
|
+
// Best-effort; the socket may already be closed.
|
|
694
|
+
}
|
|
725
695
|
}
|