@cursor/bdk 0.2.9 → 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.js +803 -812
- 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.BNhEdGa8.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.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.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.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.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.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.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.js +100 -126
- 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.js +8 -19
- 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.js +73 -90
- 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.js +127 -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.js +231 -273
- 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-Co4CUVTQ.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 +51 -10
- package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
- package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
- 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-C1g_PTTZ.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
package/dist/internal/cli-mcp.js
CHANGED
|
@@ -25,15 +25,6 @@
|
|
|
25
25
|
* stdout is reserved for the MCP wire in serve mode; all logging goes to
|
|
26
26
|
* stderr.
|
|
27
27
|
*/
|
|
28
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
29
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
30
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
31
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
32
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
33
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
34
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
28
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
38
29
|
import { homedir } from "node:os";
|
|
39
30
|
import { dirname, join } from "node:path";
|
|
@@ -52,7 +43,7 @@ const ACCESS_EXPIRY_LEEWAY_MS = 5 * 60 * 1000;
|
|
|
52
43
|
* ~55s, so a healthy turn always responds well inside this; past it the
|
|
53
44
|
* engine is unreachable or hung.
|
|
54
45
|
*/
|
|
55
|
-
const REQUEST_TIMEOUT_MS =
|
|
46
|
+
const REQUEST_TIMEOUT_MS = 120_000;
|
|
56
47
|
/** Attempts per message (initial + retries after refresh/backoff). */
|
|
57
48
|
const FORWARD_ATTEMPTS = 3;
|
|
58
49
|
/**
|
|
@@ -62,123 +53,117 @@ const FORWARD_ATTEMPTS = 3;
|
|
|
62
53
|
* A plain 500 is ambiguous and is surfaced to the client instead.
|
|
63
54
|
*/
|
|
64
55
|
const RETRYABLE_STATUSES = new Set([401, 403, 404, 417, 502, 503, 504]);
|
|
65
|
-
export function cmdMcp(subcommand, options) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
`--store upserts MCP_OAUTH_<NAME>_* secrets on the hosted deployment.\n`);
|
|
81
|
-
return 1;
|
|
82
|
-
}
|
|
83
|
-
const { cmdMcpOauth } = yield import("./cli-mcp-oauth.js");
|
|
84
|
-
return cmdMcpOauth({
|
|
85
|
-
dir: options.dir,
|
|
86
|
-
connection,
|
|
87
|
-
store: options.store,
|
|
88
|
-
slug: options.slug,
|
|
89
|
-
team: options.team,
|
|
90
|
-
apiKey: options.apiKey,
|
|
91
|
-
});
|
|
56
|
+
export async function cmdMcp(subcommand, options) {
|
|
57
|
+
const err = options.err ?? defaultErr;
|
|
58
|
+
if (subcommand === undefined) {
|
|
59
|
+
return cmdMcpServe(options);
|
|
60
|
+
}
|
|
61
|
+
if (subcommand === "install") {
|
|
62
|
+
return cmdMcpInstall(options);
|
|
63
|
+
}
|
|
64
|
+
if (subcommand === "oauth") {
|
|
65
|
+
const connection = options.oauthConnection;
|
|
66
|
+
if (connection === undefined || connection.trim() === "") {
|
|
67
|
+
err(`Usage: ${CLI} mcp oauth <connection> [--dir .] [--store] [--slug <slug>] [--team <id>]\n` +
|
|
68
|
+
`Authorize defineConnection({ url, oauth: true }) (host PKCE).\n` +
|
|
69
|
+
`--store upserts MCP_OAUTH_<NAME>_* secrets on the hosted deployment.\n`);
|
|
70
|
+
return 1;
|
|
92
71
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
72
|
+
const { cmdMcpOauth } = await import("./cli-mcp-oauth.js");
|
|
73
|
+
return cmdMcpOauth({
|
|
74
|
+
dir: options.dir,
|
|
75
|
+
connection,
|
|
76
|
+
store: options.store,
|
|
77
|
+
slug: options.slug,
|
|
78
|
+
team: options.team,
|
|
79
|
+
apiKey: options.apiKey,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
err(`Unknown mcp subcommand "${subcommand}".\n` +
|
|
83
|
+
`Usage: ${CLI} mcp [install|oauth <connection>] --prod [--slug <slug>] | --url <baseUrl>\n`);
|
|
84
|
+
return 1;
|
|
97
85
|
}
|
|
98
86
|
// ============================================================================
|
|
99
87
|
// serve mode: stdio ↔ /v1/mcp
|
|
100
88
|
// ============================================================================
|
|
101
|
-
export function cmdMcpServe(options) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
89
|
+
export async function cmdMcpServe(options) {
|
|
90
|
+
const err = options.err ?? defaultErr;
|
|
91
|
+
const source = buildTargetSource(options, err);
|
|
92
|
+
if (typeof source === "string") {
|
|
93
|
+
err(`${source}\n`);
|
|
94
|
+
return 1;
|
|
95
|
+
}
|
|
96
|
+
// Resolve eagerly: a bad slug / signed-out host / stopped deployment fails
|
|
97
|
+
// fast in the client's MCP server logs instead of on the first tool call.
|
|
98
|
+
let initial;
|
|
99
|
+
try {
|
|
100
|
+
initial = await source.get();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
err(`${describeError(error)}\n`);
|
|
104
|
+
return 1;
|
|
105
|
+
}
|
|
106
|
+
err(`${LOG_PREFIX} mcp: proxying stdio <-> ${initial.mcpUrl}\n`);
|
|
107
|
+
const stdin = options.stdin ?? process.stdin;
|
|
108
|
+
const stdout = options.stdout ?? process.stdout;
|
|
109
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
110
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
111
|
+
const pending = new Set();
|
|
112
|
+
const handleLine = async (line) => {
|
|
113
|
+
const outcome = await forwardMessage({ source, fetchImpl, sleep, line });
|
|
114
|
+
if (outcome.kind === "empty") {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (outcome.kind === "json") {
|
|
118
|
+
writeWireBody(stdout, outcome.body, line, err);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
emitFailure(stdout, line, outcome.message, err);
|
|
122
|
+
};
|
|
123
|
+
await new Promise(done => {
|
|
124
|
+
let buffer = "";
|
|
125
|
+
const enqueueLine = (raw) => {
|
|
126
|
+
const line = raw.trim();
|
|
127
|
+
if (line === "") {
|
|
129
128
|
return;
|
|
130
129
|
}
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
const task = handleLine(line)
|
|
131
|
+
.catch((error) => {
|
|
132
|
+
err(`${LOG_PREFIX} mcp: ${describeError(error)}\n`);
|
|
133
|
+
})
|
|
134
|
+
.finally(() => {
|
|
135
|
+
pending.delete(task);
|
|
136
|
+
});
|
|
137
|
+
pending.add(task);
|
|
138
|
+
};
|
|
139
|
+
const onChunk = (chunk) => {
|
|
140
|
+
buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
141
|
+
let newline = buffer.indexOf("\n");
|
|
142
|
+
while (newline !== -1) {
|
|
143
|
+
const line = buffer.slice(0, newline);
|
|
144
|
+
buffer = buffer.slice(newline + 1);
|
|
145
|
+
newline = buffer.indexOf("\n");
|
|
146
|
+
enqueueLine(line);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
let finished = false;
|
|
150
|
+
const finish = () => {
|
|
151
|
+
if (finished) {
|
|
133
152
|
return;
|
|
134
153
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const task = handleLine(line)
|
|
145
|
-
.catch((error) => {
|
|
146
|
-
err(`${LOG_PREFIX} mcp: ${describeError(error)}\n`);
|
|
147
|
-
})
|
|
148
|
-
.finally(() => {
|
|
149
|
-
pending.delete(task);
|
|
150
|
-
});
|
|
151
|
-
pending.add(task);
|
|
152
|
-
};
|
|
153
|
-
const onChunk = (chunk) => {
|
|
154
|
-
buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
155
|
-
let newline = buffer.indexOf("\n");
|
|
156
|
-
while (newline !== -1) {
|
|
157
|
-
const line = buffer.slice(0, newline);
|
|
158
|
-
buffer = buffer.slice(newline + 1);
|
|
159
|
-
newline = buffer.indexOf("\n");
|
|
160
|
-
enqueueLine(line);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
let finished = false;
|
|
164
|
-
const finish = () => {
|
|
165
|
-
if (finished) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
finished = true;
|
|
169
|
-
enqueueLine(buffer);
|
|
170
|
-
buffer = "";
|
|
171
|
-
done();
|
|
172
|
-
};
|
|
173
|
-
stdin.on("data", onChunk);
|
|
174
|
-
stdin.once("end", finish);
|
|
175
|
-
stdin.once("close", finish);
|
|
176
|
-
stdin.once("error", finish);
|
|
177
|
-
});
|
|
178
|
-
// Drain in-flight turns so piped one-shot usage still sees its replies.
|
|
179
|
-
yield Promise.allSettled([...pending]);
|
|
180
|
-
return 0;
|
|
154
|
+
finished = true;
|
|
155
|
+
enqueueLine(buffer);
|
|
156
|
+
buffer = "";
|
|
157
|
+
done();
|
|
158
|
+
};
|
|
159
|
+
stdin.on("data", onChunk);
|
|
160
|
+
stdin.once("end", finish);
|
|
161
|
+
stdin.once("close", finish);
|
|
162
|
+
stdin.once("error", finish);
|
|
181
163
|
});
|
|
164
|
+
// Drain in-flight turns so piped one-shot usage still sees its replies.
|
|
165
|
+
await Promise.allSettled([...pending]);
|
|
166
|
+
return 0;
|
|
182
167
|
}
|
|
183
168
|
/** Returns a usage error string when the target flags are invalid. */
|
|
184
169
|
function buildTargetSource(options, err) {
|
|
@@ -210,13 +195,12 @@ function createStaticTargetSource(baseUrl, bearerToken) {
|
|
|
210
195
|
};
|
|
211
196
|
}
|
|
212
197
|
function createProdTargetSource(options, err) {
|
|
213
|
-
|
|
214
|
-
const
|
|
215
|
-
const now = (_b = options.now) !== null && _b !== void 0 ? _b : Date.now;
|
|
198
|
+
const resolveImpl = options.resolveProdTargetImpl ?? resolveProdTarget;
|
|
199
|
+
const now = options.now ?? Date.now;
|
|
216
200
|
let cached;
|
|
217
201
|
let inFlight;
|
|
218
|
-
const resolveFresh = () =>
|
|
219
|
-
const prod =
|
|
202
|
+
const resolveFresh = async () => {
|
|
203
|
+
const prod = await resolveImpl({
|
|
220
204
|
dir: options.dir,
|
|
221
205
|
cwd: options.cwd,
|
|
222
206
|
slug: options.slug,
|
|
@@ -234,7 +218,7 @@ function createProdTargetSource(options, err) {
|
|
|
234
218
|
target.expiresAtMs = expiresAtMs;
|
|
235
219
|
}
|
|
236
220
|
return target;
|
|
237
|
-
}
|
|
221
|
+
};
|
|
238
222
|
return {
|
|
239
223
|
canRefresh: true,
|
|
240
224
|
invalidate() {
|
|
@@ -262,68 +246,69 @@ function createProdTargetSource(options, err) {
|
|
|
262
246
|
},
|
|
263
247
|
};
|
|
264
248
|
}
|
|
265
|
-
function forwardMessage(args) {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
continue;
|
|
249
|
+
async function forwardMessage(args) {
|
|
250
|
+
const { source, fetchImpl, sleep, line } = args;
|
|
251
|
+
let lastFailure = "request failed";
|
|
252
|
+
for (let attempt = 0; attempt < FORWARD_ATTEMPTS; attempt++) {
|
|
253
|
+
if (attempt > 0) {
|
|
254
|
+
await sleep(500 * attempt);
|
|
255
|
+
}
|
|
256
|
+
let target;
|
|
257
|
+
try {
|
|
258
|
+
target = await source.get();
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
lastFailure = describeError(error);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
let response;
|
|
265
|
+
try {
|
|
266
|
+
response = await fetchImpl(target.mcpUrl, {
|
|
267
|
+
method: "POST",
|
|
268
|
+
headers: {
|
|
269
|
+
...target.headers,
|
|
270
|
+
"content-type": "application/json",
|
|
271
|
+
// The streamable-HTTP server transport 406s unless the client
|
|
272
|
+
// accepts both, even in JSON response mode.
|
|
273
|
+
accept: "application/json, text/event-stream",
|
|
274
|
+
},
|
|
275
|
+
body: line,
|
|
276
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
source.invalidate();
|
|
281
|
+
if (isTimeoutError(error)) {
|
|
282
|
+
// The turn may have started; retrying could double-send it.
|
|
283
|
+
return {
|
|
284
|
+
kind: "failed",
|
|
285
|
+
message: `no response within ${REQUEST_TIMEOUT_MS / 1000}s (the agent may still be processing; check its sessions)`,
|
|
286
|
+
};
|
|
304
287
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
288
|
+
lastFailure = `request failed: ${describeError(error)}`;
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
if (response.status === 202) {
|
|
292
|
+
// Notification/response-only message: nothing to relay.
|
|
293
|
+
await response.text().catch(() => "");
|
|
294
|
+
return { kind: "empty" };
|
|
295
|
+
}
|
|
296
|
+
const text = await response.text().catch(() => "");
|
|
297
|
+
if (response.ok) {
|
|
298
|
+
if (text.trim() === "") {
|
|
308
299
|
return { kind: "empty" };
|
|
309
300
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
lastFailure = `upstream HTTP ${response.status}${text.trim() === "" ? "" : `: ${truncateForLog(text)}`}`;
|
|
318
|
-
if (RETRYABLE_STATUSES.has(response.status)) {
|
|
319
|
-
// Auth/expiry/hibernation shaped: re-mint credentials and retry.
|
|
320
|
-
source.invalidate();
|
|
321
|
-
continue;
|
|
322
|
-
}
|
|
323
|
-
return { kind: "failed", message: lastFailure };
|
|
301
|
+
return { kind: "json", body: text };
|
|
302
|
+
}
|
|
303
|
+
lastFailure = `upstream HTTP ${response.status}${text.trim() === "" ? "" : `: ${truncateForLog(text)}`}`;
|
|
304
|
+
if (RETRYABLE_STATUSES.has(response.status)) {
|
|
305
|
+
// Auth/expiry/hibernation shaped: re-mint credentials and retry.
|
|
306
|
+
source.invalidate();
|
|
307
|
+
continue;
|
|
324
308
|
}
|
|
325
309
|
return { kind: "failed", message: lastFailure };
|
|
326
|
-
}
|
|
310
|
+
}
|
|
311
|
+
return { kind: "failed", message: lastFailure };
|
|
327
312
|
}
|
|
328
313
|
/**
|
|
329
314
|
* Relay an upstream JSON body onto the stdio wire. The body is re-serialized
|
|
@@ -335,7 +320,7 @@ function writeWireBody(stdout, body, inboundLine, err) {
|
|
|
335
320
|
try {
|
|
336
321
|
parsed = JSON.parse(body);
|
|
337
322
|
}
|
|
338
|
-
catch
|
|
323
|
+
catch {
|
|
339
324
|
emitFailure(stdout, inboundLine, `upstream returned a non-JSON payload: ${truncateForLog(body)}`, err);
|
|
340
325
|
return;
|
|
341
326
|
}
|
|
@@ -365,7 +350,7 @@ function requestIdsOf(line) {
|
|
|
365
350
|
try {
|
|
366
351
|
parsed = JSON.parse(line);
|
|
367
352
|
}
|
|
368
|
-
catch
|
|
353
|
+
catch {
|
|
369
354
|
return [];
|
|
370
355
|
}
|
|
371
356
|
const messages = Array.isArray(parsed) ? parsed : [parsed];
|
|
@@ -380,108 +365,105 @@ function requestIdsOf(line) {
|
|
|
380
365
|
}
|
|
381
366
|
return ids;
|
|
382
367
|
}
|
|
383
|
-
export function cmdMcpInstall(options) {
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
368
|
+
export async function cmdMcpInstall(options) {
|
|
369
|
+
const err = options.err ?? defaultErr;
|
|
370
|
+
const stdout = options.stdout ?? process.stdout;
|
|
371
|
+
if (options.prod === true && options.url !== undefined) {
|
|
372
|
+
err("--prod and --url are mutually exclusive\n");
|
|
373
|
+
return 1;
|
|
374
|
+
}
|
|
375
|
+
if (options.remote === true) {
|
|
376
|
+
if (options.prod !== true) {
|
|
377
|
+
err("--remote requires --prod (the hosted deployment MCP gateway)\n");
|
|
390
378
|
return 1;
|
|
391
379
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
slug = resolveProdSlug({
|
|
405
|
-
dir: options.dir,
|
|
406
|
-
cwd: options.cwd,
|
|
407
|
-
slug: options.slug,
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
catch (error) {
|
|
411
|
-
err(`${describeError(error)}\n`);
|
|
412
|
-
return 1;
|
|
413
|
-
}
|
|
414
|
-
// Verify the deployment resolves before writing config that cannot work.
|
|
415
|
-
const resolveImpl = (_c = options.resolveProdTargetImpl) !== null && _c !== void 0 ? _c : resolveProdTarget;
|
|
416
|
-
try {
|
|
417
|
-
yield resolveImpl({
|
|
418
|
-
dir: options.dir,
|
|
419
|
-
cwd: options.cwd,
|
|
420
|
-
slug,
|
|
421
|
-
team: options.team,
|
|
422
|
-
apiKey: options.apiKey,
|
|
423
|
-
fetchImpl: options.fetchImpl,
|
|
424
|
-
err,
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
catch (error) {
|
|
428
|
-
err(`${describeError(error)}\n`);
|
|
429
|
-
if (error instanceof ProdTargetError && error.notFound) {
|
|
430
|
-
err(`Deploy it first: ${CLI} deploy --slug ${slug}\n`);
|
|
431
|
-
}
|
|
432
|
-
return 1;
|
|
433
|
-
}
|
|
434
|
-
name = resolveServerName(options.name, slug);
|
|
435
|
-
const args = ["mcp", "--prod", "--slug", slug];
|
|
436
|
-
if (options.team !== undefined && options.team !== "") {
|
|
437
|
-
args.push("--team", options.team);
|
|
438
|
-
}
|
|
439
|
-
entry = { command: CLI, args };
|
|
440
|
-
}
|
|
441
|
-
else if (options.url !== undefined) {
|
|
442
|
-
const base = normalizeBaseUrl(options.url);
|
|
443
|
-
if (typeof base !== "string") {
|
|
444
|
-
err(`${base.error}\n`);
|
|
445
|
-
return 1;
|
|
446
|
-
}
|
|
447
|
-
const derived = (_d = options.name) !== null && _d !== void 0 ? _d : deriveNameFromUrl(base);
|
|
448
|
-
if (derived === undefined) {
|
|
449
|
-
err(`Could not derive a server name from ${base}; pass --name <serverName>.\n`);
|
|
450
|
-
return 1;
|
|
451
|
-
}
|
|
452
|
-
name = resolveServerName(derived, derived);
|
|
453
|
-
const args = ["mcp", "--url", base];
|
|
454
|
-
if (options.bearerToken !== undefined && options.bearerToken !== "") {
|
|
455
|
-
args.push("--bearer-token", options.bearerToken);
|
|
456
|
-
err("note: --bearer-token is written to mcp.json in plain text; prefer --prod for hosted agents\n");
|
|
457
|
-
}
|
|
458
|
-
entry = { command: CLI, args };
|
|
380
|
+
return cmdMcpInstallRemote(options);
|
|
381
|
+
}
|
|
382
|
+
let name;
|
|
383
|
+
let entry;
|
|
384
|
+
if (options.prod === true) {
|
|
385
|
+
let slug;
|
|
386
|
+
try {
|
|
387
|
+
slug = resolveProdSlug({
|
|
388
|
+
dir: options.dir,
|
|
389
|
+
cwd: options.cwd,
|
|
390
|
+
slug: options.slug,
|
|
391
|
+
});
|
|
459
392
|
}
|
|
460
|
-
|
|
461
|
-
err(`${
|
|
393
|
+
catch (error) {
|
|
394
|
+
err(`${describeError(error)}\n`);
|
|
462
395
|
return 1;
|
|
463
396
|
}
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
return 0;
|
|
467
|
-
}
|
|
468
|
-
const path = cursorMcpJsonPath();
|
|
397
|
+
// Verify the deployment resolves before writing config that cannot work.
|
|
398
|
+
const resolveImpl = options.resolveProdTargetImpl ?? resolveProdTarget;
|
|
469
399
|
try {
|
|
470
|
-
|
|
400
|
+
await resolveImpl({
|
|
401
|
+
dir: options.dir,
|
|
402
|
+
cwd: options.cwd,
|
|
403
|
+
slug,
|
|
404
|
+
team: options.team,
|
|
405
|
+
apiKey: options.apiKey,
|
|
406
|
+
fetchImpl: options.fetchImpl,
|
|
407
|
+
err,
|
|
408
|
+
});
|
|
471
409
|
}
|
|
472
410
|
catch (error) {
|
|
473
411
|
err(`${describeError(error)}\n`);
|
|
412
|
+
if (error instanceof ProdTargetError && error.notFound) {
|
|
413
|
+
err(`Deploy it first: ${CLI} deploy --slug ${slug}\n`);
|
|
414
|
+
}
|
|
474
415
|
return 1;
|
|
475
416
|
}
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
417
|
+
name = resolveServerName(options.name, slug);
|
|
418
|
+
const args = ["mcp", "--prod", "--slug", slug];
|
|
419
|
+
if (options.team !== undefined && options.team !== "") {
|
|
420
|
+
args.push("--team", options.team);
|
|
479
421
|
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
422
|
+
entry = { command: CLI, args };
|
|
423
|
+
}
|
|
424
|
+
else if (options.url !== undefined) {
|
|
425
|
+
const base = normalizeBaseUrl(options.url);
|
|
426
|
+
if (typeof base !== "string") {
|
|
427
|
+
err(`${base.error}\n`);
|
|
428
|
+
return 1;
|
|
429
|
+
}
|
|
430
|
+
const derived = options.name ?? deriveNameFromUrl(base);
|
|
431
|
+
if (derived === undefined) {
|
|
432
|
+
err(`Could not derive a server name from ${base}; pass --name <serverName>.\n`);
|
|
433
|
+
return 1;
|
|
434
|
+
}
|
|
435
|
+
name = resolveServerName(derived, derived);
|
|
436
|
+
const args = ["mcp", "--url", base];
|
|
437
|
+
if (options.bearerToken !== undefined && options.bearerToken !== "") {
|
|
438
|
+
args.push("--bearer-token", options.bearerToken);
|
|
439
|
+
err("note: --bearer-token is written to mcp.json in plain text; prefer --prod for hosted agents\n");
|
|
440
|
+
}
|
|
441
|
+
entry = { command: CLI, args };
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
err(`${CLI} mcp install requires --prod (hosted deployment) or --url <baseUrl>\n`);
|
|
445
|
+
return 1;
|
|
446
|
+
}
|
|
447
|
+
if (options.print === true) {
|
|
448
|
+
stdout.write(`${JSON.stringify({ mcpServers: { [name]: entry } }, null, 2)}\n`);
|
|
483
449
|
return 0;
|
|
484
|
-
}
|
|
450
|
+
}
|
|
451
|
+
const path = cursorMcpJsonPath();
|
|
452
|
+
try {
|
|
453
|
+
await upsertMcpJsonEntry(path, name, entry);
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
err(`${describeError(error)}\n`);
|
|
457
|
+
return 1;
|
|
458
|
+
}
|
|
459
|
+
if (options.json === true) {
|
|
460
|
+
stdout.write(`${JSON.stringify({ ok: true, path, name, entry })}\n`);
|
|
461
|
+
return 0;
|
|
462
|
+
}
|
|
463
|
+
stdout.write(`Installed MCP server "${name}" in ${path}\n` +
|
|
464
|
+
` ${entry.command} ${entry.args.join(" ")}\n` +
|
|
465
|
+
"Cursor watches this file; the server appears without a restart.\n");
|
|
466
|
+
return 0;
|
|
485
467
|
}
|
|
486
468
|
/**
|
|
487
469
|
* `mcp install --prod --remote` — write a REMOTE HTTP entry pointing at the
|
|
@@ -496,135 +478,128 @@ export function cmdMcpInstall(options) {
|
|
|
496
478
|
* (Glass) can instead use the session gateway surface with no header at all
|
|
497
479
|
* once first-party session attachment ships (see PR follow-ups).
|
|
498
480
|
*/
|
|
499
|
-
function cmdMcpInstallRemote(options) {
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
cwd: options.cwd,
|
|
509
|
-
slug: options.slug,
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
catch (error) {
|
|
513
|
-
err(`${describeError(error)}\n`);
|
|
514
|
-
return 1;
|
|
515
|
-
}
|
|
516
|
-
const resolveAuthImpl = (_c = options.resolveDeployAuthImpl) !== null && _c !== void 0 ? _c : resolveDeployAuth;
|
|
517
|
-
const auth = yield resolveAuthImpl({
|
|
518
|
-
team: options.team,
|
|
519
|
-
apiKey: options.apiKey,
|
|
520
|
-
fetchImpl: options.fetchImpl,
|
|
521
|
-
err,
|
|
481
|
+
async function cmdMcpInstallRemote(options) {
|
|
482
|
+
const err = options.err ?? defaultErr;
|
|
483
|
+
const stdout = options.stdout ?? process.stdout;
|
|
484
|
+
let slug;
|
|
485
|
+
try {
|
|
486
|
+
slug = resolveProdSlug({
|
|
487
|
+
dir: options.dir,
|
|
488
|
+
cwd: options.cwd,
|
|
489
|
+
slug: options.slug,
|
|
522
490
|
});
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
491
|
+
}
|
|
492
|
+
catch (error) {
|
|
493
|
+
err(`${describeError(error)}\n`);
|
|
494
|
+
return 1;
|
|
495
|
+
}
|
|
496
|
+
const resolveAuthImpl = options.resolveDeployAuthImpl ?? resolveDeployAuth;
|
|
497
|
+
const auth = await resolveAuthImpl({
|
|
498
|
+
team: options.team,
|
|
499
|
+
apiKey: options.apiKey,
|
|
500
|
+
fetchImpl: options.fetchImpl,
|
|
501
|
+
err,
|
|
502
|
+
});
|
|
503
|
+
if (typeof auth === "number") {
|
|
504
|
+
return auth;
|
|
505
|
+
}
|
|
506
|
+
try {
|
|
507
|
+
await rejectV2ForLegacyCommand({
|
|
508
|
+
client: auth.client,
|
|
509
|
+
teamId: auth.teamId,
|
|
510
|
+
slug,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
catch (error) {
|
|
514
|
+
err(`${describeError(error)}\n`);
|
|
515
|
+
return 1;
|
|
516
|
+
}
|
|
517
|
+
// Verify the deployment resolves before writing config that cannot work.
|
|
518
|
+
// A 403 here is team membership or cloud-agent entitlement, not an
|
|
519
|
+
// admin-tier read. Still write the entry: calling the gateway only
|
|
520
|
+
// needs the API key.
|
|
521
|
+
try {
|
|
522
|
+
await auth.client.getDeployment({ teamId: auth.teamId, slug });
|
|
523
|
+
}
|
|
524
|
+
catch (error) {
|
|
525
|
+
if (error instanceof DeployApiError && error.status === 403) {
|
|
526
|
+
err(`Could not verify deployment "${slug}" (not authorized for this team); writing the entry anyway.\n`);
|
|
532
527
|
}
|
|
533
|
-
|
|
528
|
+
else {
|
|
534
529
|
err(`${describeError(error)}\n`);
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
// Verify the deployment resolves before writing config that cannot work.
|
|
538
|
-
// A 403 here is team membership or cloud-agent entitlement, not an
|
|
539
|
-
// admin-tier read. Still write the entry: calling the gateway only
|
|
540
|
-
// needs the API key.
|
|
541
|
-
try {
|
|
542
|
-
yield auth.client.getDeployment({ teamId: auth.teamId, slug });
|
|
543
|
-
}
|
|
544
|
-
catch (error) {
|
|
545
|
-
if (error instanceof DeployApiError && error.status === 403) {
|
|
546
|
-
err(`Could not verify deployment "${slug}" (not authorized for this team); writing the entry anyway.\n`);
|
|
547
|
-
}
|
|
548
|
-
else {
|
|
549
|
-
err(`${describeError(error)}\n`);
|
|
550
|
-
if (error instanceof DeployApiError && error.status === 404) {
|
|
551
|
-
err(`Deploy it first: ${CLI} deploy --slug ${slug}\n`);
|
|
552
|
-
}
|
|
553
|
-
return 1;
|
|
530
|
+
if (error instanceof DeployApiError && error.status === 404) {
|
|
531
|
+
err(`Deploy it first: ${CLI} deploy --slug ${slug}\n`);
|
|
554
532
|
}
|
|
555
|
-
}
|
|
556
|
-
const name = resolveServerName(options.name, slug);
|
|
557
|
-
const url = auth.client.mcpGatewayUrl(auth.teamId, slug);
|
|
558
|
-
const entry = {
|
|
559
|
-
url,
|
|
560
|
-
headers: { Authorization: `Bearer ${auth.apiKey}` },
|
|
561
|
-
};
|
|
562
|
-
if (options.print === true) {
|
|
563
|
-
stdout.write(`${JSON.stringify({ mcpServers: { [name]: entry } }, null, 2)}\n`);
|
|
564
|
-
return 0;
|
|
565
|
-
}
|
|
566
|
-
const path = cursorMcpJsonPath();
|
|
567
|
-
try {
|
|
568
|
-
yield upsertMcpJsonEntry(path, name, entry);
|
|
569
|
-
}
|
|
570
|
-
catch (error) {
|
|
571
|
-
err(`${describeError(error)}\n`);
|
|
572
533
|
return 1;
|
|
573
534
|
}
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
535
|
+
}
|
|
536
|
+
const name = resolveServerName(options.name, slug);
|
|
537
|
+
const url = auth.client.mcpGatewayUrl(auth.teamId, slug);
|
|
538
|
+
const entry = {
|
|
539
|
+
url,
|
|
540
|
+
headers: { Authorization: `Bearer ${auth.apiKey}` },
|
|
541
|
+
};
|
|
542
|
+
if (options.print === true) {
|
|
543
|
+
stdout.write(`${JSON.stringify({ mcpServers: { [name]: entry } }, null, 2)}\n`);
|
|
583
544
|
return 0;
|
|
584
|
-
}
|
|
545
|
+
}
|
|
546
|
+
const path = cursorMcpJsonPath();
|
|
547
|
+
try {
|
|
548
|
+
await upsertMcpJsonEntry(path, name, entry);
|
|
549
|
+
}
|
|
550
|
+
catch (error) {
|
|
551
|
+
err(`${describeError(error)}\n`);
|
|
552
|
+
return 1;
|
|
553
|
+
}
|
|
554
|
+
err("note: the API key is written to mcp.json in plain text; it is a durable " +
|
|
555
|
+
"credential for a remote MCP host that cannot spawn the stdio proxy.\n");
|
|
556
|
+
if (options.json === true) {
|
|
557
|
+
stdout.write(`${JSON.stringify({ ok: true, path, name, entry })}\n`);
|
|
558
|
+
return 0;
|
|
559
|
+
}
|
|
560
|
+
stdout.write(`Installed remote MCP server "${name}" in ${path}\n` +
|
|
561
|
+
` ${url}\n` +
|
|
562
|
+
"Cursor watches this file; the server appears without a restart.\n");
|
|
563
|
+
return 0;
|
|
585
564
|
}
|
|
586
565
|
/** `~/.cursor/mcp.json` — the user-level Cursor MCP config. */
|
|
587
|
-
export function cursorMcpJsonPath(home) {
|
|
588
|
-
var _a;
|
|
589
|
-
if (home === void 0) { home = (_a = process.env.HOME) !== null && _a !== void 0 ? _a : homedir(); }
|
|
566
|
+
export function cursorMcpJsonPath(home = process.env.HOME ?? homedir()) {
|
|
590
567
|
const resolved = home.trim() === "" ? homedir() : home;
|
|
591
568
|
return join(resolved, ".cursor", "mcp.json");
|
|
592
569
|
}
|
|
593
|
-
function upsertMcpJsonEntry(path, name, entry) {
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
570
|
+
async function upsertMcpJsonEntry(path, name, entry) {
|
|
571
|
+
let root = {};
|
|
572
|
+
let raw;
|
|
573
|
+
try {
|
|
574
|
+
raw = await readFile(path, "utf8");
|
|
575
|
+
}
|
|
576
|
+
catch {
|
|
577
|
+
raw = undefined;
|
|
578
|
+
}
|
|
579
|
+
if (raw !== undefined && raw.trim() !== "") {
|
|
580
|
+
let parsed;
|
|
597
581
|
try {
|
|
598
|
-
|
|
582
|
+
parsed = JSON.parse(raw);
|
|
599
583
|
}
|
|
600
|
-
catch (
|
|
601
|
-
|
|
584
|
+
catch (error) {
|
|
585
|
+
throw new Error(`${path} is not valid JSON (${describeError(error)}); fix it and re-run.`);
|
|
602
586
|
}
|
|
603
|
-
if (
|
|
604
|
-
|
|
605
|
-
try {
|
|
606
|
-
parsed = JSON.parse(raw);
|
|
607
|
-
}
|
|
608
|
-
catch (error) {
|
|
609
|
-
throw new Error(`${path} is not valid JSON (${describeError(error)}); fix it and re-run.`);
|
|
610
|
-
}
|
|
611
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
612
|
-
throw new Error(`${path} must contain a JSON object; fix it and re-run.`);
|
|
613
|
-
}
|
|
614
|
-
root = parsed;
|
|
587
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
588
|
+
throw new Error(`${path} must contain a JSON object; fix it and re-run.`);
|
|
615
589
|
}
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
});
|
|
590
|
+
root = parsed;
|
|
591
|
+
}
|
|
592
|
+
const existing = root.mcpServers;
|
|
593
|
+
const servers = existing !== null && typeof existing === "object" && !Array.isArray(existing)
|
|
594
|
+
? existing
|
|
595
|
+
: {};
|
|
596
|
+
servers[name] = entry;
|
|
597
|
+
root.mcpServers = servers;
|
|
598
|
+
await mkdir(dirname(path), { recursive: true });
|
|
599
|
+
await writeFile(path, `${JSON.stringify(root, null, 2)}\n`, "utf8");
|
|
625
600
|
}
|
|
626
601
|
function resolveServerName(name, fallback) {
|
|
627
|
-
const trimmed = name
|
|
602
|
+
const trimmed = name?.trim();
|
|
628
603
|
if (trimmed !== undefined && trimmed !== "") {
|
|
629
604
|
return trimmed;
|
|
630
605
|
}
|
|
@@ -657,7 +632,7 @@ function normalizeBaseUrl(raw) {
|
|
|
657
632
|
try {
|
|
658
633
|
parsed = new URL(raw);
|
|
659
634
|
}
|
|
660
|
-
catch
|
|
635
|
+
catch {
|
|
661
636
|
return { error: `invalid --url: ${raw}` };
|
|
662
637
|
}
|
|
663
638
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|