@cursor/bdk 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/agent-serve.js +9 -1
- package/dist/channels/slack/attachments.d.ts +2 -1
- package/dist/channels/slack/attachments.d.ts.map +1 -1
- package/dist/channels/slack/attachments.js +19 -9
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +26 -24
- package/dist/channels/slack/thread-context.d.ts +21 -11
- package/dist/channels/slack/thread-context.d.ts.map +1 -1
- package/dist/channels/slack/thread-context.js +75 -27
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BOIHhrKi.js → app.4kQ8Db_q.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.CvuAJ0My.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D49zVZqM.js → VPLocalSearchBox.DY1RwB8Q.js} +1 -1
- package/dist/docs/assets/chunks/{arc.hmjb-sc4.js → arc.CxE_fSPK.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CxEI1KqM.js → architectureDiagram-Q4EWVU46.CPX426ui.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.DHHvBWoV.js → baseUniq.CB52JrKG.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DnXW-3bu.js → blockDiagram-DXYQGD6D.J0cNaQCL.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.e-47O2jM.js → c4Diagram-AHTNJAMY.DJn3vEGT.js} +1 -1
- package/dist/docs/assets/chunks/channel.BoNycAoN.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.3ry4pYXB.js → chunk-4BX2VUAB.Dao618F6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DGIZFRx6.js → chunk-4TB4RGXK.QW8Rhjai.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DKBnqg9U.js → chunk-55IACEB6.DfRLLKF_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BIU8Ue5k.js → chunk-EDXVE4YY.CIV2ApKQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DP-TFhjI.js → chunk-FMBD7UC4.BEheSuxp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Ux0OYj5v.js → chunk-OYMX7WX6.CUN88ENB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BzHMwYox.js → chunk-QZHKN3VN.CgqCs8b_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.D4OGAsSP.js → chunk-YZCP3GAM.iCH0nnTJ.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/clone.Db22cH_-.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Jq_7BUNx.js → cose-bilkent-S5V4N54A.BLcUxhWE.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Di-skR2x.js → dagre-KV5264BT.Ep7LofOm.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DeREHIdH.js → diagram-5BDNPKRD.Bzf4GSQ4.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.C7Kcqxro.js → diagram-G4DWMVQ6.DD6Jh-eM.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BK3eohyo.js → diagram-MMDJMWI5.oOIl8bWd.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.C6TyymXT.js → diagram-TYMM5635.DHs85Ade.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DYGG-gGx.js → erDiagram-SMLLAGMA.BIb5ghCk.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.C9nBcSV4.js → flowDiagram-DWJPFMVM.DV4paY9k.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.wAg_ymsp.js → ganttDiagram-T4ZO3ILL.AyEKA6_v.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.B87j9Oeg.js → gitGraphDiagram-UUTBAWPF.BltiCDFo.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CuFMj31w.js → graph.DzuEYGdC.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.P_mLGumP.js → infoDiagram-42DDH7IO.BV2l981J.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DyuL_MsT.js → ishikawaDiagram-UXIWVN3A.BA4Izf-m.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CtP09IoJ.js → journeyDiagram-VCZTEJTY.DjaFbFS3.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BoeSYPZo.js → kanban-definition-6JOO6SKY.CfTFieDs.js} +1 -1
- package/dist/docs/assets/chunks/{layout.B0lMMtNo.js → layout.DzfWqTBV.js} +1 -1
- package/dist/docs/assets/chunks/{linear.HxRBiAFX.js → linear.BO6mpulV.js} +1 -1
- package/dist/docs/assets/chunks/{min.BGlFFHwS.js → min.BGgTadgT.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.JyLBD9M8.js → mindmap-definition-QFDTVHPH.DPuIXVWY.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DnSmNZF8.js → pieDiagram-DEJITSTG.BOnl3bBg.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CUCnbfCa.js → quadrantDiagram-34T5L4WZ.DNB6Ckdc.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.py0IVUn5.js → requirementDiagram-MS252O5E.D5-Qo7vb.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.Bkc-HWYp.js → sankeyDiagram-XADWPNL6.8t65cesf.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Dqn8Mlv2.js → sequenceDiagram-FGHM5R23.CaG07BdS.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.JikkoQUU.js → stateDiagram-FHFEXIEX.TKOweTB6.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CuqmyQc4.js +1 -0
- package/dist/docs/assets/chunks/{theme.b6HQ6zG_.js → theme.Dx-JhpTB.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BvpSXiBj.js → timeline-definition-GMOUNBTQ.fE53zQ2s.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CU7MVnZx.js → vennDiagram-DHZGUBPP.DJsZZaJg.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.BKwC4ctG.js → wardley-RL74JXVD.844kyrjl.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.BfaF6Uhe.js → wardleyDiagram-NUSXRM2D.CMZ-Ru_t.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Bg5dcpj4.js → xychartDiagram-5P7HB3ND.XXrhBc7a.js} +1 -1
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.js → deployment.md.UhnJIMr-.js} +2 -2
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.lean.js → deployment.md.UhnJIMr-.lean.js} +1 -1
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.js → guides_jev.md.CRcgmjDb.js} +2 -2
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.CRcgmjDb.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.DzGI777n.js → reference_agent-config.md.Cj5uBKp4.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.js → reference_extensions.md.pa2tN-e4.js} +4 -3
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.pa2tN-e4.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/deployment.md +4 -1
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +35 -35
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +37 -37
- package/dist/docs/guides/jev.md +7 -0
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +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 +25 -2
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/agent-config.md +1 -1
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +35 -35
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +39 -38
- package/dist/docs/reference/extensions.md +13 -0
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +35 -35
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +35 -35
- package/dist/extensions/jev/extension.d.ts +3 -0
- package/dist/extensions/jev/extension.d.ts.map +1 -1
- package/dist/extensions/jev/extension.js +10 -1
- package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
- package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
- package/dist/extensions/jev/lib/evaluate.js +6 -2
- package/dist/extensions.d.ts +4 -2
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +5 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +19 -5
- package/dist/internal/discovery/agent-config.d.ts +6 -5
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +29 -28
- package/dist/internal/discovery/agent.js +1 -1
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +12 -0
- package/dist/internal/hosting.d.ts +8 -0
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +24 -0
- package/dist/types.d.ts +18 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +4 -1
- package/docs/guides/jev.md +7 -0
- package/docs/reference/agent-config.md +1 -1
- package/docs/reference/extensions.md +13 -0
- package/package.json +1 -9
- package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +0 -1
- package/dist/docs/assets/chunks/channel.BbOGaJQP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/clone.Co4MBflG.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +0 -1
- package/src/artifacts.ts +0 -68
- package/src/bin/agent-serve.ts +0 -1854
- package/src/channels/bitbucket/api.ts +0 -891
- package/src/channels/bitbucket/binding.ts +0 -417
- package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
- package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
- package/src/channels/bitbucket/checks.ts +0 -146
- package/src/channels/bitbucket/cursor-account.ts +0 -106
- package/src/channels/bitbucket/defaults.ts +0 -100
- package/src/channels/bitbucket/events.ts +0 -74
- package/src/channels/bitbucket/index.ts +0 -51
- package/src/channels/bitbucket/replay.ts +0 -421
- package/src/channels/bitbucket/state.ts +0 -59
- package/src/channels/bitbucket/types.ts +0 -261
- package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
- package/src/channels/change-monitors/index.ts +0 -8
- package/src/channels/change-monitors/types.ts +0 -42
- package/src/channels/checks.ts +0 -185
- package/src/channels/deployments/deployments-channel.ts +0 -224
- package/src/channels/deployments/index.ts +0 -25
- package/src/channels/deployments/types.ts +0 -92
- package/src/channels/github/api.ts +0 -526
- package/src/channels/github/auth.ts +0 -293
- package/src/channels/github/binding.ts +0 -233
- package/src/channels/github/checks.ts +0 -145
- package/src/channels/github/cursor-account.ts +0 -303
- package/src/channels/github/defaults.ts +0 -168
- package/src/channels/github/events.ts +0 -67
- package/src/channels/github/forward.ts +0 -359
- package/src/channels/github/github-channel.ts +0 -2334
- package/src/channels/github/index.ts +0 -54
- package/src/channels/github/progress.ts +0 -365
- package/src/channels/github/replay.ts +0 -372
- package/src/channels/github/state.ts +0 -124
- package/src/channels/github/types.ts +0 -590
- package/src/channels/gitlab/api.ts +0 -329
- package/src/channels/gitlab/binding.ts +0 -231
- package/src/channels/gitlab/checks.ts +0 -228
- package/src/channels/gitlab/cursor-account.ts +0 -105
- package/src/channels/gitlab/defaults.ts +0 -80
- package/src/channels/gitlab/events.ts +0 -37
- package/src/channels/gitlab/gitlab-channel.ts +0 -160
- package/src/channels/gitlab/gitlab-webhook.ts +0 -509
- package/src/channels/gitlab/index.ts +0 -44
- package/src/channels/gitlab/replay.ts +0 -328
- package/src/channels/gitlab/state.ts +0 -55
- package/src/channels/gitlab/types.ts +0 -247
- package/src/channels/issues/index.ts +0 -9
- package/src/channels/issues/issues-channel.ts +0 -45
- package/src/channels/issues/types.ts +0 -38
- package/src/channels/origin/api.ts +0 -507
- package/src/channels/origin/binding.ts +0 -114
- package/src/channels/origin/checks.ts +0 -250
- package/src/channels/origin/cursor-account.ts +0 -58
- package/src/channels/origin/defaults.ts +0 -140
- package/src/channels/origin/events.ts +0 -35
- package/src/channels/origin/index.ts +0 -35
- package/src/channels/origin/origin-channel.ts +0 -815
- package/src/channels/origin/origin-webhook.ts +0 -296
- package/src/channels/origin/reactions.ts +0 -72
- package/src/channels/origin/state.ts +0 -54
- package/src/channels/origin/types.ts +0 -295
- package/src/channels/slack/agentic-delivery.ts +0 -634
- package/src/channels/slack/agentic-posted.ts +0 -135
- package/src/channels/slack/agentic-signals.ts +0 -231
- package/src/channels/slack/api.ts +0 -761
- package/src/channels/slack/approvals.ts +0 -279
- package/src/channels/slack/assistant.ts +0 -76
- package/src/channels/slack/attachments.ts +0 -596
- package/src/channels/slack/auth.ts +0 -127
- package/src/channels/slack/blocks.ts +0 -131
- package/src/channels/slack/bot-mentions.ts +0 -318
- package/src/channels/slack/channel-watch.ts +0 -314
- package/src/channels/slack/cli-project.ts +0 -249
- package/src/channels/slack/code-fences.ts +0 -171
- package/src/channels/slack/constants.ts +0 -38
- package/src/channels/slack/credentials.ts +0 -88
- package/src/channels/slack/defaults.ts +0 -714
- package/src/channels/slack/dispatch.ts +0 -1060
- package/src/channels/slack/doctor.ts +0 -338
- package/src/channels/slack/eval-directive.ts +0 -306
- package/src/channels/slack/event-id-dedupe.ts +0 -30
- package/src/channels/slack/external-policy.ts +0 -75
- package/src/channels/slack/footer.ts +0 -106
- package/src/channels/slack/inbound.ts +0 -416
- package/src/channels/slack/index.ts +0 -53
- package/src/channels/slack/init.ts +0 -169
- package/src/channels/slack/interactive.ts +0 -406
- package/src/channels/slack/links.ts +0 -23
- package/src/channels/slack/live-delivery.ts +0 -489
- package/src/channels/slack/log.ts +0 -70
- package/src/channels/slack/manifest.ts +0 -240
- package/src/channels/slack/message-body.ts +0 -82
- package/src/channels/slack/nudge-carrier.ts +0 -224
- package/src/channels/slack/nudge-store.ts +0 -334
- package/src/channels/slack/paint-start.ts +0 -93
- package/src/channels/slack/placeholder.ts +0 -358
- package/src/channels/slack/pr-ref.ts +0 -74
- package/src/channels/slack/progress-delivery.ts +0 -138
- package/src/channels/slack/reasoning-card.ts +0 -125
- package/src/channels/slack/reasoning-chip.ts +0 -41
- package/src/channels/slack/recording-sink.ts +0 -167
- package/src/channels/slack/redact.ts +0 -6
- package/src/channels/slack/reply-options.ts +0 -279
- package/src/channels/slack/setup.ts +0 -125
- package/src/channels/slack/slack-channel.ts +0 -744
- package/src/channels/slack/socket-mode.ts +0 -140
- package/src/channels/slack/stop.ts +0 -25
- package/src/channels/slack/stream.ts +0 -66
- package/src/channels/slack/thread-context.ts +0 -485
- package/src/channels/slack/tool-approval-events.ts +0 -233
- package/src/channels/slack/tool-cards.ts +0 -198
- package/src/channels/slack/tool-chip.ts +0 -34
- package/src/channels/slack/types.ts +0 -787
- package/src/channels/slack/upload.ts +0 -137
- package/src/channels.ts +0 -543
- package/src/connections.ts +0 -153
- package/src/dashboard-session-url.ts +0 -30
- package/src/evals/assertions.ts +0 -688
- package/src/evals/expect.ts +0 -250
- package/src/evals/judge.ts +0 -329
- package/src/evals/loaders.ts +0 -111
- package/src/evals/matchers.ts +0 -223
- package/src/evals/reporters.ts +0 -257
- package/src/evals/results.ts +0 -130
- package/src/evals/run-facts.ts +0 -306
- package/src/evals.ts +0 -709
- package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
- package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
- package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
- package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
- package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
- package/src/extensions/cursor-grokbot-agents/extension.ts +0 -132
- package/src/extensions/cursor-grokbot-agents/lib/agents.ts +0 -42
- package/src/extensions/cursor-grokbot-agents/lib/backend.ts +0 -208
- package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +0 -74
- package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +0 -260
- package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +0 -21
- package/src/extensions/cursor-grokbot-agents/lib/lock.ts +0 -26
- package/src/extensions/cursor-grokbot-agents/skills/consult.md +0 -40
- package/src/extensions/cursor-grokbot-agents/tools/ask.ts +0 -32
- package/src/extensions/cursor-grokbot-agents/tools/check.ts +0 -25
- package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +0 -17
- package/src/extensions/cursor-grokbot-agents/tools/list.ts +0 -26
- package/src/extensions/improve/extension.ts +0 -69
- package/src/extensions/improve/skills/yourself.ts +0 -50
- package/src/extensions/jev/extension.ts +0 -95
- package/src/extensions/jev/lib/evaluate.ts +0 -266
- package/src/extensions/jev/skills/gated-write.md +0 -25
- package/src/extensions/jev/skills/questions.md +0 -33
- package/src/extensions/jev/tools/evaluate.ts +0 -82
- package/src/extensions/slack-communication/evals/harness.ts +0 -705
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
- package/src/extensions/slack-communication/extension.ts +0 -44
- package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
- package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
- package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
- package/src/extensions/slack-communication/tools/post-card.ts +0 -28
- package/src/extensions/slack-communication/tools/post-file.ts +0 -82
- package/src/extensions/slack-communication/tools/post-update.ts +0 -40
- package/src/extensions/slack-communication/tools/react.ts +0 -30
- package/src/extensions/slack-communication/tools/set-status.ts +0 -21
- package/src/extensions.ts +0 -179
- package/src/files-backends/agent-store-presigned-url.ts +0 -11
- package/src/files-backends/cursor-hosted.ts +0 -1212
- package/src/files-backends/local-fs.ts +0 -163
- package/src/files.ts +0 -293
- package/src/filesystem.ts +0 -2005
- package/src/hooks.ts +0 -30
- package/src/index.ts +0 -259
- package/src/internal/advertise-tools.ts +0 -370
- package/src/internal/approval-gate.ts +0 -103
- package/src/internal/artifacts-store.ts +0 -836
- package/src/internal/as-of.ts +0 -257
- package/src/internal/auth.ts +0 -46
- package/src/internal/authored-alias-hooks.ts +0 -138
- package/src/internal/authored-loaders.ts +0 -188
- package/src/internal/bounded-int.ts +0 -24
- package/src/internal/bounded.ts +0 -25
- package/src/internal/brand.ts +0 -28
- package/src/internal/browser-origin-guard.ts +0 -67
- package/src/internal/builtin-tools/artifacts.ts +0 -62
- package/src/internal/builtin-tools/index.ts +0 -53
- package/src/internal/builtin-tools/reminders.ts +0 -145
- package/src/internal/channel-dispatch.ts +0 -129
- package/src/internal/channel-route-dispatch.ts +0 -58
- package/src/internal/channel-state.ts +0 -83
- package/src/internal/chat-client.ts +0 -594
- package/src/internal/cli-ax.ts +0 -2318
- package/src/internal/cli-bitbucket.ts +0 -438
- package/src/internal/cli-convert-automation.ts +0 -335
- package/src/internal/cli-cursor.ts +0 -282
- package/src/internal/cli-deploy.ts +0 -2519
- package/src/internal/cli-docs.ts +0 -192
- package/src/internal/cli-github.ts +0 -806
- package/src/internal/cli-gitlab.ts +0 -452
- package/src/internal/cli-images.ts +0 -672
- package/src/internal/cli-manifest.ts +0 -56
- package/src/internal/cli-mcp-oauth.ts +0 -396
- package/src/internal/cli-mcp.ts +0 -808
- package/src/internal/cli-skills.ts +0 -98
- package/src/internal/cli-slack-manual.ts +0 -418
- package/src/internal/cli-slack.ts +0 -874
- package/src/internal/cloud-merge.ts +0 -51
- package/src/internal/cloud-turn-cost.ts +0 -159
- package/src/internal/connection-env.ts +0 -106
- package/src/internal/continuation-channel.ts +0 -233
- package/src/internal/continuation-identity.ts +0 -935
- package/src/internal/conversation-mirror.ts +0 -423
- package/src/internal/convert-automation/convert-workflow.ts +0 -1377
- package/src/internal/convert-automation/slug.ts +0 -29
- package/src/internal/convert-automation/types.ts +0 -212
- package/src/internal/cron.ts +0 -76
- package/src/internal/cursor/account-mcp.ts +0 -692
- package/src/internal/cursor/backend-client.ts +0 -984
- package/src/internal/cursor/bound-secret-file.ts +0 -101
- package/src/internal/cursor/credentials.ts +0 -560
- package/src/internal/cursor/cursor-api-transport.ts +0 -65
- package/src/internal/cursor/github-credentials.ts +0 -228
- package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
- package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
- package/src/internal/cursor/hosted-store-secrets.ts +0 -152
- package/src/internal/cursor/session-token.ts +0 -111
- package/src/internal/cursor/store-api-client.ts +0 -323
- package/src/internal/cursor-account-mcp-auth.ts +0 -303
- package/src/internal/cursor-agent-template.ts +0 -50
- package/src/internal/cursor-deployment-relay.ts +0 -315
- package/src/internal/cursor-event-relay.ts +0 -675
- package/src/internal/cursor-relay-core.ts +0 -563
- package/src/internal/deferred-channel-session.ts +0 -61
- package/src/internal/deploy-client.ts +0 -1574
- package/src/internal/deploy-manifest.ts +0 -361
- package/src/internal/deploy-source.ts +0 -144
- package/src/internal/describe-error.ts +0 -32
- package/src/internal/dev-mode.ts +0 -20
- package/src/internal/discovery/agent-config.ts +0 -288
- package/src/internal/discovery/agent.ts +0 -381
- package/src/internal/discovery/channels.ts +0 -100
- package/src/internal/discovery/connections.ts +0 -516
- package/src/internal/discovery/context.ts +0 -38
- package/src/internal/discovery/cursor-plugin.ts +0 -628
- package/src/internal/discovery/extension-overlay.ts +0 -247
- package/src/internal/discovery/extensions.ts +0 -490
- package/src/internal/discovery/fs.ts +0 -103
- package/src/internal/discovery/hooks.ts +0 -63
- package/src/internal/discovery/info.ts +0 -174
- package/src/internal/discovery/instructions.ts +0 -98
- package/src/internal/discovery/modules.ts +0 -107
- package/src/internal/discovery/names.ts +0 -45
- package/src/internal/discovery/project.ts +0 -319
- package/src/internal/discovery/reminders.ts +0 -65
- package/src/internal/discovery/runtime.ts +0 -158
- package/src/internal/discovery/schedules.ts +0 -120
- package/src/internal/discovery/seed-files.ts +0 -34
- package/src/internal/discovery/services.ts +0 -151
- package/src/internal/discovery/skills.ts +0 -174
- package/src/internal/discovery/subagent.ts +0 -138
- package/src/internal/discovery/tools.ts +0 -170
- package/src/internal/discovery.ts +0 -27
- package/src/internal/distribution.ts +0 -126
- package/src/internal/docs-site.ts +0 -248
- package/src/internal/duration.ts +0 -37
- package/src/internal/env-file.ts +0 -83
- package/src/internal/eval-judge-model.ts +0 -142
- package/src/internal/eval-run-store.ts +0 -585
- package/src/internal/eval-runner.ts +0 -823
- package/src/internal/evals-client.ts +0 -475
- package/src/internal/event-log.ts +0 -342
- package/src/internal/event-mapper.ts +0 -811
- package/src/internal/expected-delivery-failure.ts +0 -34
- package/src/internal/factory-resource-channel.ts +0 -103
- package/src/internal/filesystem/errors.ts +0 -207
- package/src/internal/filesystem/format.ts +0 -253
- package/src/internal/filesystem/merge.ts +0 -192
- package/src/internal/filesystem/nearest.ts +0 -112
- package/src/internal/filesystem/scratch.ts +0 -239
- package/src/internal/filesystem/sdk-schemas.ts +0 -204
- package/src/internal/filesystem/tools.ts +0 -804
- package/src/internal/filesystem/walk.ts +0 -366
- package/src/internal/fixtures/units-server.ts +0 -52
- package/src/internal/framework-file-storage.ts +0 -357
- package/src/internal/framework-storage-selection.ts +0 -156
- package/src/internal/frontmatter.ts +0 -108
- package/src/internal/github-fanout.ts +0 -144
- package/src/internal/guest-network.ts +0 -391
- package/src/internal/handleAgentServeTrigger.ts +0 -286
- package/src/internal/host-files.ts +0 -341
- package/src/internal/host-kv.ts +0 -81
- package/src/internal/host-otel.ts +0 -231
- package/src/internal/host-platforms.ts +0 -170
- package/src/internal/hosted-admission-adapter.ts +0 -47
- package/src/internal/hosted-admission-context.ts +0 -37
- package/src/internal/hosted-catch-protocol.ts +0 -112
- package/src/internal/hosted-catch.ts +0 -179
- package/src/internal/hosted-delivery-protocol.ts +0 -824
- package/src/internal/hosted-delivery.ts +0 -1410
- package/src/internal/hosted-execution-diag.ts +0 -291
- package/src/internal/hosted-execution-flush.ts +0 -136
- package/src/internal/hosted-execution-latency.ts +0 -301
- package/src/internal/hosted-managed-automation.ts +0 -116
- package/src/internal/hosting.ts +0 -114
- package/src/internal/http-channel-define.ts +0 -25
- package/src/internal/http-channel.ts +0 -669
- package/src/internal/http-control-plane-session.ts +0 -110
- package/src/internal/ids.ts +0 -39
- package/src/internal/incoming-headers-to-fetch.ts +0 -45
- package/src/internal/init-interview.ts +0 -360
- package/src/internal/init-project.ts +0 -711
- package/src/internal/init-scaffold.ts +0 -182
- package/src/internal/inline-stdio-define-stub.ts +0 -4
- package/src/internal/inline-stdio-mcp.ts +0 -230
- package/src/internal/install-cursor-skills.ts +0 -604
- package/src/internal/is-record.ts +0 -3
- package/src/internal/json-schema.ts +0 -95
- package/src/internal/legacy-command-guard.ts +0 -66
- package/src/internal/listen-port.ts +0 -85
- package/src/internal/local-control-plane.ts +0 -442
- package/src/internal/local-env.ts +0 -59
- package/src/internal/local-ingress.ts +0 -90
- package/src/internal/log-ring.ts +0 -59
- package/src/internal/logs-client.ts +0 -477
- package/src/internal/map-pool.ts +0 -39
- package/src/internal/mcp-endpoint.ts +0 -747
- package/src/internal/mcp-host.ts +0 -509
- package/src/internal/mcp-oauth-on-demand.ts +0 -337
- package/src/internal/mcp-oauth-persist.ts +0 -118
- package/src/internal/mcp-oauth.ts +0 -549
- package/src/internal/net.ts +0 -29
- package/src/internal/open-browser.ts +0 -41
- package/src/internal/otel/attrs.ts +0 -16
- package/src/internal/otel/collector.ts +0 -937
- package/src/internal/otel/config.ts +0 -287
- package/src/internal/otel/http.ts +0 -122
- package/src/internal/otel/mcp.ts +0 -56
- package/src/internal/otel/propagation.ts +0 -17
- package/src/internal/otel/runtime.ts +0 -441
- package/src/internal/package-inline-stdio.ts +0 -114
- package/src/internal/peer-connections.ts +0 -96
- package/src/internal/platform-schedule-sync.ts +0 -75
- package/src/internal/platform-timers.ts +0 -365
- package/src/internal/playground/static.ts +0 -278
- package/src/internal/playground/toolchain.ts +0 -270
- package/src/internal/playground-proxy.ts +0 -564
- package/src/internal/process-memory-telemetry.ts +0 -334
- package/src/internal/project-layout.ts +0 -31
- package/src/internal/prompt-context.ts +0 -116
- package/src/internal/reminder-control-plane-protocol.ts +0 -482
- package/src/internal/reminder-runner.ts +0 -1559
- package/src/internal/reminder-schedule.ts +0 -104
- package/src/internal/reminder-store.ts +0 -176
- package/src/internal/request-error-status.ts +0 -95
- package/src/internal/request-headers.ts +0 -21
- package/src/internal/resolve-prod-target.ts +0 -334
- package/src/internal/resolved-connections.ts +0 -190
- package/src/internal/router.ts +0 -143
- package/src/internal/run-client.ts +0 -354
- package/src/internal/runtime-dispatch-runner.ts +0 -50
- package/src/internal/sanitize-mcp-tool-name.ts +0 -31
- package/src/internal/schedule-runner.ts +0 -154
- package/src/internal/scm/pr-url.ts +0 -245
- package/src/internal/sdk-runner.ts +0 -959
- package/src/internal/serve-restart.ts +0 -113
- package/src/internal/server.ts +0 -3147
- package/src/internal/session-cost.ts +0 -208
- package/src/internal/session-engine.ts +0 -5622
- package/src/internal/session-links.ts +0 -84
- package/src/internal/session-run-log.ts +0 -535
- package/src/internal/session-store.ts +0 -307
- package/src/internal/session-urls.ts +0 -32
- package/src/internal/sessions-client.ts +0 -239
- package/src/internal/skill-catalog.ts +0 -66
- package/src/internal/skills-sync.ts +0 -55
- package/src/internal/slack-provision-client.ts +0 -544
- package/src/internal/slack-thread-key.ts +0 -11
- package/src/internal/sleep.ts +0 -3
- package/src/internal/start-log-store.ts +0 -164
- package/src/internal/steering.ts +0 -17
- package/src/internal/storage-coordinator.ts +0 -800
- package/src/internal/storage-roles.ts +0 -86
- package/src/internal/storage.ts +0 -1
- package/src/internal/store-api-protocol.ts +0 -205
- package/src/internal/store-mirror.ts +0 -73
- package/src/internal/stream-progress.ts +0 -294
- package/src/internal/terminal-style.ts +0 -133
- package/src/internal/testing/factory-resource-fixtures.ts +0 -84
- package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
- package/src/internal/tool-catalog.ts +0 -104
- package/src/internal/tool-policy.ts +0 -222
- package/src/internal/tool-result.ts +0 -50
- package/src/internal/trajectory.ts +0 -418
- package/src/internal/turn-cost.ts +0 -136
- package/src/internal/turn-governor.ts +0 -145
- package/src/internal/turn-lease-store.ts +0 -144
- package/src/internal/turn-outbox.ts +0 -77
- package/src/internal/update-check.ts +0 -517
- package/src/internal/v2-hosting.ts +0 -52
- package/src/internal/workspace-sync.ts +0 -114
- package/src/internal/workspace.ts +0 -505
- package/src/kv/memory-kv.ts +0 -94
- package/src/kv.ts +0 -18
- package/src/memory.ts +0 -487
- package/src/otel-public.ts +0 -24
- package/src/otel.ts +0 -320
- package/src/prompt.ts +0 -80
- package/src/reminders.ts +0 -65
- package/src/schedules.ts +0 -31
- package/src/skills.ts +0 -27
- package/src/storage-backends/cursor-hosted-v2.ts +0 -204
- package/src/storage-backends/cursor-hosted.ts +0 -388
- package/src/storage-backends/file-kv.ts +0 -276
- package/src/storage-protocol.ts +0 -261
- package/src/storage.ts +0 -408
- package/src/tools.ts +0 -166
- package/src/types.ts +0 -3776
- /package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.Cj5uBKp4.lean.js} +0 -0
|
@@ -1,891 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bitbucket REST client for the Bitbucket channel — the `createGitLabClient`
|
|
3
|
-
* analogue, with one `BitbucketApi` facade implemented twice: Cloud 2.0
|
|
4
|
-
* (`https://api.bitbucket.org/2.0/repositories/{workspace}/{slug}/…`) and
|
|
5
|
-
* Data Center 1.0 (`<host>/rest/api/1.0/projects/{KEY}/repos/{slug}/…`).
|
|
6
|
-
* The dialect comes from the delivery payload shape, never a round trip.
|
|
7
|
-
*
|
|
8
|
-
* Two transports:
|
|
9
|
-
*
|
|
10
|
-
* - **Direct**: `Authorization: Bearer` with a repository / workspace /
|
|
11
|
-
* HTTP access token from options or `BITBUCKET_TOKEN`. The base defaults
|
|
12
|
-
* to `BITBUCKET_API_BASE_URL`, else api.bitbucket.org (Cloud). Data Center
|
|
13
|
-
* deploys must configure one; `ctx.bitbucket` never derives the host from
|
|
14
|
-
* the webhook payload — only the replay CLI passes a user-supplied repo URL.
|
|
15
|
-
* - **Proxy** (`--cursor-scm-proxy` with `cursorAccount`): the backend
|
|
16
|
-
* forwarder at `/v0/bitbucket-proxy`. Calls carry the Cursor API key as
|
|
17
|
-
* the bearer plus `x-cursor-bitbucket-repos` naming the repo the call is
|
|
18
|
-
* scoped to; the backend swaps in the tenant's Bitbucket credential and
|
|
19
|
-
* picks the upstream (Cloud 2.0 or the DC host's 1.0) per tenant.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
import type { BitbucketDialect, BitbucketRepositoryRef } from "./types.js";
|
|
23
|
-
|
|
24
|
-
export const DEFAULT_BITBUCKET_CLOUD_API_BASE_URL = "https://api.bitbucket.org/2.0";
|
|
25
|
-
|
|
26
|
-
/** Header the SCM proxy reads to scope a Bitbucket call to one repo. */
|
|
27
|
-
export const CURSOR_BITBUCKET_REPOS_HEADER = "x-cursor-bitbucket-repos";
|
|
28
|
-
|
|
29
|
-
export type BitbucketApiMethod = "DELETE" | "GET" | "PATCH" | "POST" | "PUT";
|
|
30
|
-
|
|
31
|
-
/** Normalized Bitbucket REST failure — the `GitLabApiError` analogue. */
|
|
32
|
-
export class BitbucketApiError extends Error {
|
|
33
|
-
readonly body: unknown;
|
|
34
|
-
readonly method: string;
|
|
35
|
-
readonly path: string;
|
|
36
|
-
readonly status: number;
|
|
37
|
-
|
|
38
|
-
constructor(input: { body: unknown; method: string; path: string; status: number }) {
|
|
39
|
-
super(`Bitbucket ${input.method} ${input.path} failed with HTTP ${input.status}.`);
|
|
40
|
-
this.name = "BitbucketApiError";
|
|
41
|
-
this.body = input.body;
|
|
42
|
-
this.method = input.method;
|
|
43
|
-
this.path = input.path;
|
|
44
|
-
this.status = input.status;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export type BitbucketTokenProvider = () => Promise<string> | string;
|
|
49
|
-
|
|
50
|
-
/** Backend SCM-proxy transport bound by the serve host in proxy mode. */
|
|
51
|
-
export interface BitbucketProxyTransport {
|
|
52
|
-
/** `/v0/bitbucket-proxy` base, see `resolveCursorBitbucketProxyUrl`. */
|
|
53
|
-
apiBaseUrl: string;
|
|
54
|
-
/** Cursor API key sent as the bearer; the proxy swaps in the Bitbucket token. */
|
|
55
|
-
getApiKey: () => Promise<string>;
|
|
56
|
-
/** Static headers added to every call (repo scope when declared). */
|
|
57
|
-
headers?: Readonly<Record<string, string>>;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface BitbucketClientOptions {
|
|
61
|
-
/**
|
|
62
|
-
* REST base, e.g. `https://bitbucket.example.com/rest/api/1.0`. Falls back
|
|
63
|
-
* to `BITBUCKET_API_BASE_URL`.
|
|
64
|
-
*/
|
|
65
|
-
apiBaseUrl?: string;
|
|
66
|
-
/** Access token or provider for direct calls. Falls back to `BITBUCKET_TOKEN`. */
|
|
67
|
-
token?: string | BitbucketTokenProvider;
|
|
68
|
-
/** Route through the Cursor SCM proxy instead of calling Bitbucket directly. */
|
|
69
|
-
proxy?: BitbucketProxyTransport;
|
|
70
|
-
/**
|
|
71
|
-
* Repo (`workspace/slug` or `PROJECT/slug`) every call is scoped to.
|
|
72
|
-
* Proxy mode sends it as `x-cursor-bitbucket-repos` when no static header
|
|
73
|
-
* names one.
|
|
74
|
-
*/
|
|
75
|
-
repo?: string;
|
|
76
|
-
/** Injectable fetch for tests. */
|
|
77
|
-
fetch?: typeof fetch;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export interface BitbucketRequestInput {
|
|
81
|
-
method: BitbucketApiMethod;
|
|
82
|
-
/** Path under the API base, e.g. `/repositories/acme/widgets/pullrequests/7`. */
|
|
83
|
-
path: string;
|
|
84
|
-
query?: Record<string, string | number | boolean | undefined>;
|
|
85
|
-
body?: unknown;
|
|
86
|
-
/**
|
|
87
|
-
* `Accept` header. `application/json` (default) parses the body; anything
|
|
88
|
-
* else (`text/plain` for diffs and raw files) returns the body text.
|
|
89
|
-
*/
|
|
90
|
-
accept?: string;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** Minimal authenticated Bitbucket REST client. */
|
|
94
|
-
export interface BitbucketClient {
|
|
95
|
-
readonly apiBaseUrl: string;
|
|
96
|
-
/** Call a Bitbucket REST path. Throws {@link BitbucketApiError} on non-2xx. */
|
|
97
|
-
request<T = unknown>(input: BitbucketRequestInput): Promise<T>;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function envValue(value: string | undefined): string | undefined {
|
|
101
|
-
const trimmed = value?.trim();
|
|
102
|
-
return trimmed === undefined || trimmed === "" ? undefined : trimmed;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** `BITBUCKET_TOKEN` when set. */
|
|
106
|
-
export function envBitbucketToken(env: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
107
|
-
return envValue(env.BITBUCKET_TOKEN);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* REST base for direct calls: `BITBUCKET_API_BASE_URL`, else api.bitbucket.org
|
|
112
|
-
* 2.0 for Cloud, else `/rest/api/1.0` on `repoHtmlUrl`'s origin. Callers must
|
|
113
|
-
* only pass a `repoHtmlUrl` the operator supplied (the replay CLI), never one
|
|
114
|
-
* read from a delivery payload.
|
|
115
|
-
*/
|
|
116
|
-
export function bitbucketApiBaseUrl(input: {
|
|
117
|
-
dialect: BitbucketDialect;
|
|
118
|
-
repoHtmlUrl?: string;
|
|
119
|
-
env?: NodeJS.ProcessEnv;
|
|
120
|
-
}): string | undefined {
|
|
121
|
-
const fromEnv = envValue((input.env ?? process.env).BITBUCKET_API_BASE_URL);
|
|
122
|
-
if (fromEnv !== undefined) {
|
|
123
|
-
return fromEnv.replace(/\/+$/, "");
|
|
124
|
-
}
|
|
125
|
-
if (input.dialect === "cloud") {
|
|
126
|
-
return DEFAULT_BITBUCKET_CLOUD_API_BASE_URL;
|
|
127
|
-
}
|
|
128
|
-
if (input.repoHtmlUrl !== undefined) {
|
|
129
|
-
try {
|
|
130
|
-
return `${new URL(input.repoHtmlUrl).origin}/rest/api/1.0`;
|
|
131
|
-
} catch {
|
|
132
|
-
// no usable host
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return undefined;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function buildQuery(query: BitbucketRequestInput["query"]): string {
|
|
139
|
-
if (query === undefined) {
|
|
140
|
-
return "";
|
|
141
|
-
}
|
|
142
|
-
const params = new URLSearchParams();
|
|
143
|
-
for (const [key, value] of Object.entries(query)) {
|
|
144
|
-
if (value !== undefined) {
|
|
145
|
-
params.set(key, String(value));
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
const encoded = params.toString();
|
|
149
|
-
return encoded === "" ? "" : `?${encoded}`;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export function createBitbucketClient(options: BitbucketClientOptions = {}): BitbucketClient {
|
|
153
|
-
const fetchImpl = options.fetch ?? fetch;
|
|
154
|
-
const apiBaseUrl =
|
|
155
|
-
options.proxy?.apiBaseUrl ?? options.apiBaseUrl ?? envValue(process.env.BITBUCKET_API_BASE_URL);
|
|
156
|
-
if (apiBaseUrl === undefined || apiBaseUrl.trim() === "") {
|
|
157
|
-
throw new Error(
|
|
158
|
-
"bitbucketChannel: no Bitbucket API base URL (pass apiBaseUrl, set BITBUCKET_API_BASE_URL, or serve with --cursor-scm-proxy and cursorAccount).",
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
const base = apiBaseUrl.replace(/\/+$/, "");
|
|
162
|
-
const repo = options.repo?.trim().replace(/^\/+|\/+$/g, "");
|
|
163
|
-
|
|
164
|
-
const authHeaders = async (): Promise<Record<string, string>> => {
|
|
165
|
-
if (options.proxy !== undefined) {
|
|
166
|
-
const headers: Record<string, string> = {
|
|
167
|
-
authorization: `Bearer ${await options.proxy.getApiKey()}`,
|
|
168
|
-
...options.proxy.headers,
|
|
169
|
-
};
|
|
170
|
-
if (
|
|
171
|
-
(headers[CURSOR_BITBUCKET_REPOS_HEADER] ?? "").trim() === "" &&
|
|
172
|
-
repo !== undefined &&
|
|
173
|
-
repo !== ""
|
|
174
|
-
) {
|
|
175
|
-
headers[CURSOR_BITBUCKET_REPOS_HEADER] = repo.toLowerCase();
|
|
176
|
-
}
|
|
177
|
-
return headers;
|
|
178
|
-
}
|
|
179
|
-
const token =
|
|
180
|
-
typeof options.token === "function"
|
|
181
|
-
? await options.token()
|
|
182
|
-
: (options.token ?? envBitbucketToken());
|
|
183
|
-
if (token === undefined || token === "") {
|
|
184
|
-
throw new Error(
|
|
185
|
-
"bitbucketChannel: no Bitbucket credential available (pass token, set BITBUCKET_TOKEN, or serve with --cursor-scm-proxy and cursorAccount).",
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
return { authorization: `Bearer ${token}` };
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
return {
|
|
192
|
-
apiBaseUrl: base,
|
|
193
|
-
async request<T = unknown>(input: BitbucketRequestInput): Promise<T> {
|
|
194
|
-
const path = input.path.startsWith("/") ? input.path : `/${input.path}`;
|
|
195
|
-
const accept = input.accept ?? "application/json";
|
|
196
|
-
const response = await fetchImpl(`${base}${path}${buildQuery(input.query)}`, {
|
|
197
|
-
method: input.method,
|
|
198
|
-
headers: {
|
|
199
|
-
...(await authHeaders()),
|
|
200
|
-
accept,
|
|
201
|
-
...(input.body === undefined ? {} : { "content-type": "application/json" }),
|
|
202
|
-
},
|
|
203
|
-
body: input.body === undefined ? undefined : JSON.stringify(input.body),
|
|
204
|
-
});
|
|
205
|
-
const text = await response.text();
|
|
206
|
-
let parsed: unknown = text;
|
|
207
|
-
if (accept === "application/json") {
|
|
208
|
-
try {
|
|
209
|
-
parsed = text === "" ? undefined : JSON.parse(text);
|
|
210
|
-
} catch {
|
|
211
|
-
parsed = text;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
if (!response.ok) {
|
|
215
|
-
throw new BitbucketApiError({
|
|
216
|
-
body: parsed,
|
|
217
|
-
method: input.method,
|
|
218
|
-
path,
|
|
219
|
-
status: response.status,
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
return parsed as T;
|
|
223
|
-
},
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// --- BitbucketApi facade -----------------------------------------------------
|
|
228
|
-
|
|
229
|
-
/** Build-status states shared by both dialects (DC `STOPPED` → `CANCELLED`). */
|
|
230
|
-
export type BitbucketBuildStatusState = "INPROGRESS" | "SUCCESSFUL" | "FAILED" | "STOPPED";
|
|
231
|
-
|
|
232
|
-
export interface BitbucketBuildStatusInput {
|
|
233
|
-
sha: string;
|
|
234
|
-
/** Stable key per status row (`cursor/security-review`). */
|
|
235
|
-
key: string;
|
|
236
|
-
state: BitbucketBuildStatusState;
|
|
237
|
-
/** Display name; defaults to {@link key}. */
|
|
238
|
-
name?: string;
|
|
239
|
-
/** "Details" link. Both dialects require one; falls back to the repo URL. */
|
|
240
|
-
url?: string;
|
|
241
|
-
description?: string;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
export interface BitbucketPullRequestCommentInput {
|
|
245
|
-
body: string;
|
|
246
|
-
/**
|
|
247
|
-
* Anchor the comment to a file line. Cloud posts `inline`; Data Center
|
|
248
|
-
* posts an `anchor` on the destination side. Omit for a top-level comment.
|
|
249
|
-
*/
|
|
250
|
-
inline?: { path: string; line?: number };
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** Comment as returned by either dialect, minimally normalized. */
|
|
254
|
-
export interface BitbucketApiComment {
|
|
255
|
-
id: number;
|
|
256
|
-
body: string;
|
|
257
|
-
authorId?: string;
|
|
258
|
-
path?: string;
|
|
259
|
-
line?: number;
|
|
260
|
-
raw: unknown;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/** Pull request as returned by either dialect, minimally normalized. */
|
|
264
|
-
export interface BitbucketApiPullRequest {
|
|
265
|
-
id: number;
|
|
266
|
-
title?: string;
|
|
267
|
-
description?: string;
|
|
268
|
-
state?: string;
|
|
269
|
-
draft?: boolean;
|
|
270
|
-
authorUsername?: string;
|
|
271
|
-
sourceBranch?: string;
|
|
272
|
-
targetBranch?: string;
|
|
273
|
-
headSha?: string;
|
|
274
|
-
baseSha?: string;
|
|
275
|
-
htmlUrl?: string;
|
|
276
|
-
raw: unknown;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
export interface BitbucketApiChangedFile {
|
|
280
|
-
path: string;
|
|
281
|
-
previousPath?: string;
|
|
282
|
-
status: "added" | "modified" | "removed" | "renamed";
|
|
283
|
-
patch?: string;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
export interface BitbucketPullRequestDiffInput {
|
|
287
|
-
headSha?: string;
|
|
288
|
-
baseSha?: string;
|
|
289
|
-
mergeBaseSha?: string;
|
|
290
|
-
mergeBaseResolved?: boolean;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* The handful of operations review products need, implemented once per
|
|
295
|
-
* dialect. `ctx.bitbucket.api` is the repo-bound instance.
|
|
296
|
-
*/
|
|
297
|
-
export interface BitbucketApi {
|
|
298
|
-
readonly dialect: BitbucketDialect;
|
|
299
|
-
readonly repository: BitbucketRepositoryRef;
|
|
300
|
-
getPullRequest(id: number): Promise<BitbucketApiPullRequest>;
|
|
301
|
-
/** Unified diff of the pull request (`text/plain`). */
|
|
302
|
-
getPullRequestDiff(id: number): Promise<string>;
|
|
303
|
-
listPullRequestComments(id: number): Promise<BitbucketApiComment[]>;
|
|
304
|
-
postPullRequestComment(
|
|
305
|
-
id: number,
|
|
306
|
-
input: BitbucketPullRequestCommentInput,
|
|
307
|
-
): Promise<BitbucketApiComment>;
|
|
308
|
-
setBuildStatus(input: BitbucketBuildStatusInput): Promise<unknown>;
|
|
309
|
-
/** Raw file contents at `ref` (branch, tag, or SHA). */
|
|
310
|
-
getFileAtRef(path: string, ref: string): Promise<string>;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
export interface BitbucketPullRequestReadApi {
|
|
314
|
-
getPullRequest(id: number): Promise<BitbucketApiPullRequest>;
|
|
315
|
-
getMergeBaseSha(id: number, base: string, headSha: string): Promise<string | undefined>;
|
|
316
|
-
listChangedFiles(
|
|
317
|
-
id: number,
|
|
318
|
-
input?: BitbucketPullRequestDiffInput,
|
|
319
|
-
): Promise<BitbucketApiChangedFile[]>;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
export interface BitbucketPullRequestReadClient {
|
|
323
|
-
readonly repository: BitbucketRepositoryRef;
|
|
324
|
-
readonly api: Pick<BitbucketApi, "getPullRequest" | "getPullRequestDiff">;
|
|
325
|
-
request<T = unknown>(input: BitbucketRequestInput): Promise<T>;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
export type BitbucketPullRequestReadDiagnostic =
|
|
329
|
-
| { kind: "commit-expansion-failed"; sha: string; error: unknown }
|
|
330
|
-
| { kind: "diff-fallback"; status: number }
|
|
331
|
-
| { kind: "metadata-fallback"; status: number };
|
|
332
|
-
|
|
333
|
-
function asRecord(value: unknown): Record<string, unknown> | undefined {
|
|
334
|
-
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
335
|
-
? (value as Record<string, unknown>)
|
|
336
|
-
: undefined;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
function str(value: unknown): string | undefined {
|
|
340
|
-
return typeof value === "string" && value !== "" ? value : undefined;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
function num(value: unknown): number | undefined {
|
|
344
|
-
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
function errorStatus(error: unknown): number | undefined {
|
|
348
|
-
return num(asRecord(error)?.status);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
function bitbucketAuthorUsername(raw: unknown): string | undefined {
|
|
352
|
-
const author = asRecord(asRecord(raw)?.author);
|
|
353
|
-
const user = asRecord(author?.user);
|
|
354
|
-
return (
|
|
355
|
-
str(author?.nickname) ??
|
|
356
|
-
str(user?.name) ??
|
|
357
|
-
str(user?.slug) ??
|
|
358
|
-
str(author?.display_name) ??
|
|
359
|
-
str(user?.displayName)
|
|
360
|
-
);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
const GIT_PATH_ESCAPES: Readonly<Record<string, string>> = {
|
|
364
|
-
a: "\u0007",
|
|
365
|
-
b: "\b",
|
|
366
|
-
f: "\f",
|
|
367
|
-
n: "\n",
|
|
368
|
-
r: "\r",
|
|
369
|
-
t: "\t",
|
|
370
|
-
v: "\v",
|
|
371
|
-
"\\": "\\",
|
|
372
|
-
'"': '"',
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
function unescapeGitPath(path: string, quoted: boolean): string {
|
|
376
|
-
if (!quoted) {
|
|
377
|
-
return path;
|
|
378
|
-
}
|
|
379
|
-
const bytes: number[] = [];
|
|
380
|
-
let output = "";
|
|
381
|
-
const flush = () => {
|
|
382
|
-
if (bytes.length > 0) {
|
|
383
|
-
output += Buffer.from(bytes).toString("utf8");
|
|
384
|
-
bytes.length = 0;
|
|
385
|
-
}
|
|
386
|
-
};
|
|
387
|
-
for (let index = 0; index < path.length; index += 1) {
|
|
388
|
-
const character = path[index] as string;
|
|
389
|
-
if (character !== "\\") {
|
|
390
|
-
flush();
|
|
391
|
-
output += character;
|
|
392
|
-
continue;
|
|
393
|
-
}
|
|
394
|
-
const octal = /^[0-7]{1,3}/.exec(path.slice(index + 1));
|
|
395
|
-
if (octal !== null) {
|
|
396
|
-
bytes.push(Number.parseInt(octal[0], 8));
|
|
397
|
-
index += octal[0].length;
|
|
398
|
-
continue;
|
|
399
|
-
}
|
|
400
|
-
flush();
|
|
401
|
-
const next = path[index + 1] ?? "";
|
|
402
|
-
output += GIT_PATH_ESCAPES[next] ?? next;
|
|
403
|
-
index += 1;
|
|
404
|
-
}
|
|
405
|
-
flush();
|
|
406
|
-
return output;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
/** Split a Git-style unified diff into normalized changed files. */
|
|
410
|
-
export function splitBitbucketUnifiedDiff(diff: string): BitbucketApiChangedFile[] {
|
|
411
|
-
const files: BitbucketApiChangedFile[] = [];
|
|
412
|
-
const sections = diff.split(/^(?=diff --git )/m).filter(Boolean);
|
|
413
|
-
for (const section of sections) {
|
|
414
|
-
const lines = section.replace(/\n$/, "").split("\n");
|
|
415
|
-
const header = /^diff --git ("?)a\/(.+?)\1 ("?)b\/(.+?)\3$/.exec(lines[0] ?? "");
|
|
416
|
-
if (header === null) {
|
|
417
|
-
continue;
|
|
418
|
-
}
|
|
419
|
-
const oldPath = unescapeGitPath(header[2] ?? "", header[1] !== "");
|
|
420
|
-
const newPath = unescapeGitPath(header[4] ?? "", header[3] !== "");
|
|
421
|
-
let status: BitbucketApiChangedFile["status"] = "modified";
|
|
422
|
-
let bodyStart = 1;
|
|
423
|
-
for (; bodyStart < lines.length; bodyStart += 1) {
|
|
424
|
-
const line = lines[bodyStart] ?? "";
|
|
425
|
-
if (line.startsWith("@@")) {
|
|
426
|
-
break;
|
|
427
|
-
}
|
|
428
|
-
if (line === "--- /dev/null") {
|
|
429
|
-
status = "added";
|
|
430
|
-
} else if (line === "+++ /dev/null") {
|
|
431
|
-
status = "removed";
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
if (status === "modified" && oldPath !== newPath) {
|
|
435
|
-
status = "renamed";
|
|
436
|
-
}
|
|
437
|
-
const patch = lines.slice(bodyStart).join("\n");
|
|
438
|
-
files.push({
|
|
439
|
-
path: newPath,
|
|
440
|
-
previousPath: status === "renamed" ? oldPath : undefined,
|
|
441
|
-
status,
|
|
442
|
-
patch: patch === "" ? undefined : patch,
|
|
443
|
-
});
|
|
444
|
-
}
|
|
445
|
-
return files;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
function encodePath(path: string): string {
|
|
449
|
-
return path
|
|
450
|
-
.split("/")
|
|
451
|
-
.filter(segment => segment !== "")
|
|
452
|
-
.map(segment => encodeURIComponent(segment))
|
|
453
|
-
.join("/");
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
function fallbackUrl(repository: BitbucketRepositoryRef): string {
|
|
457
|
-
return (
|
|
458
|
-
repository.htmlUrl ??
|
|
459
|
-
(repository.dialect === "cloud"
|
|
460
|
-
? `https://bitbucket.org/${repository.fullName}`
|
|
461
|
-
: "https://cursor.com")
|
|
462
|
-
);
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
/** `/repositories/{workspace}/{slug}` — Bitbucket Cloud 2.0. */
|
|
466
|
-
export function bitbucketCloudRepoPath(repository: { owner: string; slug: string }): string {
|
|
467
|
-
return `/repositories/${encodeURIComponent(repository.owner)}/${encodeURIComponent(repository.slug)}`;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
/** `/projects/{KEY}/repos/{slug}` — Bitbucket Data Center 1.0. */
|
|
471
|
-
export function bitbucketDataCenterRepoPath(repository: { owner: string; slug: string }): string {
|
|
472
|
-
return `/projects/${encodeURIComponent(repository.owner)}/repos/${encodeURIComponent(repository.slug)}`;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
export async function expandBitbucketCloudCommitSha(
|
|
476
|
-
bitbucket: Pick<BitbucketClient, "request">,
|
|
477
|
-
repository: Pick<BitbucketRepositoryRef, "owner" | "slug">,
|
|
478
|
-
sha: string | undefined,
|
|
479
|
-
onError?: (error: unknown) => void,
|
|
480
|
-
): Promise<string | undefined> {
|
|
481
|
-
if (sha === undefined || !/^[0-9a-f]{7,39}$/i.test(sha)) {
|
|
482
|
-
return sha;
|
|
483
|
-
}
|
|
484
|
-
try {
|
|
485
|
-
const commit = await bitbucket.request<{ hash?: string }>({
|
|
486
|
-
method: "GET",
|
|
487
|
-
path: `${bitbucketCloudRepoPath(repository)}/commit/${encodeURIComponent(sha)}`,
|
|
488
|
-
});
|
|
489
|
-
return /^[0-9a-f]{40}$/i.test(commit.hash ?? "") ? commit.hash : sha;
|
|
490
|
-
} catch (error) {
|
|
491
|
-
onError?.(error);
|
|
492
|
-
return sha;
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
function bitbucketPullRequestFromRaw(
|
|
497
|
-
raw: Record<string, unknown>,
|
|
498
|
-
id: number,
|
|
499
|
-
htmlUrl?: string,
|
|
500
|
-
): BitbucketApiPullRequest {
|
|
501
|
-
const source = asRecord(raw.source);
|
|
502
|
-
const destination = asRecord(raw.destination);
|
|
503
|
-
return {
|
|
504
|
-
id,
|
|
505
|
-
title: str(raw.title),
|
|
506
|
-
description: str(raw.description),
|
|
507
|
-
state: str(raw.state),
|
|
508
|
-
draft: typeof raw.draft === "boolean" ? raw.draft : undefined,
|
|
509
|
-
authorUsername: bitbucketAuthorUsername(raw),
|
|
510
|
-
sourceBranch: str(asRecord(source?.branch)?.name) ?? str(asRecord(raw.fromRef)?.displayId),
|
|
511
|
-
targetBranch: str(asRecord(destination?.branch)?.name) ?? str(asRecord(raw.toRef)?.displayId),
|
|
512
|
-
headSha: str(asRecord(source?.commit)?.hash) ?? str(asRecord(raw.fromRef)?.latestCommit),
|
|
513
|
-
baseSha: str(asRecord(destination?.commit)?.hash) ?? str(asRecord(raw.toRef)?.latestCommit),
|
|
514
|
-
htmlUrl,
|
|
515
|
-
raw,
|
|
516
|
-
};
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
export function createBitbucketPullRequestReadApi(
|
|
520
|
-
bitbucket: BitbucketPullRequestReadClient,
|
|
521
|
-
options: {
|
|
522
|
-
onDiagnostic?: (diagnostic: BitbucketPullRequestReadDiagnostic) => void;
|
|
523
|
-
} = {},
|
|
524
|
-
): BitbucketPullRequestReadApi {
|
|
525
|
-
const { repository } = bitbucket;
|
|
526
|
-
const repo =
|
|
527
|
-
repository.dialect === "cloud"
|
|
528
|
-
? bitbucketCloudRepoPath(repository)
|
|
529
|
-
: bitbucketDataCenterRepoPath(repository);
|
|
530
|
-
const cloudPullRequestFromActivity = async (
|
|
531
|
-
id: number,
|
|
532
|
-
): Promise<BitbucketApiPullRequest | undefined> => {
|
|
533
|
-
let path = `${repo}/pullrequests/${id}/activity`;
|
|
534
|
-
let query: Record<string, string | number> | undefined = { pagelen: 50 };
|
|
535
|
-
for (let page = 0; page < 20; page += 1) {
|
|
536
|
-
const response = await bitbucket.request<Record<string, unknown>>({
|
|
537
|
-
method: "GET",
|
|
538
|
-
path,
|
|
539
|
-
query,
|
|
540
|
-
});
|
|
541
|
-
for (const value of Array.isArray(response.values) ? response.values : []) {
|
|
542
|
-
const update = asRecord(asRecord(value)?.update);
|
|
543
|
-
if (update !== undefined) {
|
|
544
|
-
return bitbucketPullRequestFromRaw(update, id);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
const next = str(response.next);
|
|
548
|
-
if (next === undefined) {
|
|
549
|
-
return undefined;
|
|
550
|
-
}
|
|
551
|
-
const nextUrl = new URL(next);
|
|
552
|
-
const marker = nextUrl.pathname.indexOf("/repositories/");
|
|
553
|
-
path = marker === -1 ? nextUrl.pathname : nextUrl.pathname.slice(marker);
|
|
554
|
-
query = Object.fromEntries(nextUrl.searchParams.entries());
|
|
555
|
-
}
|
|
556
|
-
return undefined;
|
|
557
|
-
};
|
|
558
|
-
return {
|
|
559
|
-
async getPullRequest(id) {
|
|
560
|
-
let pullRequest: BitbucketApiPullRequest;
|
|
561
|
-
try {
|
|
562
|
-
pullRequest = await bitbucket.api.getPullRequest(id);
|
|
563
|
-
} catch (error) {
|
|
564
|
-
const status = errorStatus(error);
|
|
565
|
-
if (repository.dialect !== "cloud" || status === undefined || status < 500) {
|
|
566
|
-
throw error;
|
|
567
|
-
}
|
|
568
|
-
options.onDiagnostic?.({ kind: "metadata-fallback", status });
|
|
569
|
-
const fallback = await cloudPullRequestFromActivity(id);
|
|
570
|
-
if (fallback === undefined) {
|
|
571
|
-
throw error;
|
|
572
|
-
}
|
|
573
|
-
pullRequest = fallback;
|
|
574
|
-
}
|
|
575
|
-
const normalized = {
|
|
576
|
-
...pullRequest,
|
|
577
|
-
draft: asRecord(pullRequest.raw)?.draft === true,
|
|
578
|
-
authorUsername: bitbucketAuthorUsername(pullRequest.raw),
|
|
579
|
-
};
|
|
580
|
-
if (repository.dialect !== "cloud") {
|
|
581
|
-
return normalized;
|
|
582
|
-
}
|
|
583
|
-
const [headSha, baseSha] = await Promise.all([
|
|
584
|
-
expandBitbucketCloudCommitSha(bitbucket, repository, pullRequest.headSha, error =>
|
|
585
|
-
pullRequest.headSha === undefined
|
|
586
|
-
? undefined
|
|
587
|
-
: options.onDiagnostic?.({
|
|
588
|
-
kind: "commit-expansion-failed",
|
|
589
|
-
sha: pullRequest.headSha,
|
|
590
|
-
error,
|
|
591
|
-
}),
|
|
592
|
-
),
|
|
593
|
-
expandBitbucketCloudCommitSha(bitbucket, repository, pullRequest.baseSha, error =>
|
|
594
|
-
pullRequest.baseSha === undefined
|
|
595
|
-
? undefined
|
|
596
|
-
: options.onDiagnostic?.({
|
|
597
|
-
kind: "commit-expansion-failed",
|
|
598
|
-
sha: pullRequest.baseSha,
|
|
599
|
-
error,
|
|
600
|
-
}),
|
|
601
|
-
),
|
|
602
|
-
]);
|
|
603
|
-
return { ...normalized, headSha, baseSha };
|
|
604
|
-
},
|
|
605
|
-
async getMergeBaseSha(id, base, headSha) {
|
|
606
|
-
if (repository.dialect === "cloud") {
|
|
607
|
-
const commit = await bitbucket.request<{ hash?: string }>({
|
|
608
|
-
method: "GET",
|
|
609
|
-
path: `${repo}/merge-base/${encodeURIComponent(headSha)}..${encodeURIComponent(base)}`,
|
|
610
|
-
});
|
|
611
|
-
return str(commit.hash);
|
|
612
|
-
}
|
|
613
|
-
const commit = await bitbucket.request<{ id?: string }>({
|
|
614
|
-
method: "GET",
|
|
615
|
-
path: `${repo}/pull-requests/${id}/merge-base`,
|
|
616
|
-
});
|
|
617
|
-
return str(commit.id);
|
|
618
|
-
},
|
|
619
|
-
async listChangedFiles(id, input) {
|
|
620
|
-
try {
|
|
621
|
-
return splitBitbucketUnifiedDiff(await bitbucket.api.getPullRequestDiff(id));
|
|
622
|
-
} catch (error) {
|
|
623
|
-
const status = errorStatus(error);
|
|
624
|
-
const comparisonBase = input?.mergeBaseSha ?? input?.baseSha;
|
|
625
|
-
if (
|
|
626
|
-
repository.dialect !== "cloud" ||
|
|
627
|
-
status === undefined ||
|
|
628
|
-
status < 500 ||
|
|
629
|
-
input?.headSha === undefined ||
|
|
630
|
-
comparisonBase === undefined
|
|
631
|
-
) {
|
|
632
|
-
throw error;
|
|
633
|
-
}
|
|
634
|
-
options.onDiagnostic?.({ kind: "diff-fallback", status });
|
|
635
|
-
const diff = await bitbucket.request<string>({
|
|
636
|
-
method: "GET",
|
|
637
|
-
path: `${repo}/diff/${encodeURIComponent(input.headSha)}..${encodeURIComponent(comparisonBase)}`,
|
|
638
|
-
query: { topic: input.mergeBaseResolved === true ? "false" : "true" },
|
|
639
|
-
accept: "text/plain",
|
|
640
|
-
});
|
|
641
|
-
return splitBitbucketUnifiedDiff(diff);
|
|
642
|
-
}
|
|
643
|
-
},
|
|
644
|
-
};
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
export function cloudBitbucketApi(
|
|
648
|
-
client: BitbucketClient,
|
|
649
|
-
repository: BitbucketRepositoryRef,
|
|
650
|
-
): BitbucketApi {
|
|
651
|
-
const repo = bitbucketCloudRepoPath(repository);
|
|
652
|
-
const mapComment = (raw: unknown): BitbucketApiComment => {
|
|
653
|
-
const record = asRecord(raw) ?? {};
|
|
654
|
-
const inline = asRecord(record.inline);
|
|
655
|
-
return {
|
|
656
|
-
id: num(record.id) ?? 0,
|
|
657
|
-
body: str(asRecord(record.content)?.raw) ?? "",
|
|
658
|
-
authorId: str(asRecord(record.user)?.uuid),
|
|
659
|
-
path: str(inline?.path),
|
|
660
|
-
line: num(inline?.to) ?? num(inline?.from),
|
|
661
|
-
raw,
|
|
662
|
-
};
|
|
663
|
-
};
|
|
664
|
-
return {
|
|
665
|
-
dialect: "cloud",
|
|
666
|
-
repository,
|
|
667
|
-
async getPullRequest(id) {
|
|
668
|
-
const raw = await client.request<Record<string, unknown>>({
|
|
669
|
-
method: "GET",
|
|
670
|
-
path: `${repo}/pullrequests/${id}`,
|
|
671
|
-
});
|
|
672
|
-
const source = asRecord(raw.source);
|
|
673
|
-
const destination = asRecord(raw.destination);
|
|
674
|
-
return {
|
|
675
|
-
id: num(raw.id) ?? id,
|
|
676
|
-
title: str(raw.title),
|
|
677
|
-
description: str(raw.description),
|
|
678
|
-
state: str(raw.state),
|
|
679
|
-
sourceBranch: str(asRecord(source?.branch)?.name),
|
|
680
|
-
targetBranch: str(asRecord(destination?.branch)?.name),
|
|
681
|
-
headSha: str(asRecord(source?.commit)?.hash),
|
|
682
|
-
baseSha: str(asRecord(destination?.commit)?.hash),
|
|
683
|
-
htmlUrl: str(asRecord(asRecord(raw.links)?.html)?.href),
|
|
684
|
-
raw,
|
|
685
|
-
};
|
|
686
|
-
},
|
|
687
|
-
getPullRequestDiff: id =>
|
|
688
|
-
client.request<string>({
|
|
689
|
-
method: "GET",
|
|
690
|
-
path: `${repo}/pullrequests/${id}/diff`,
|
|
691
|
-
accept: "text/plain",
|
|
692
|
-
}),
|
|
693
|
-
async listPullRequestComments(id) {
|
|
694
|
-
const comments: BitbucketApiComment[] = [];
|
|
695
|
-
let page: string | undefined = `${repo}/pullrequests/${id}/comments`;
|
|
696
|
-
let query: Record<string, string | number> | undefined = { pagelen: 100 };
|
|
697
|
-
while (page !== undefined) {
|
|
698
|
-
const raw: Record<string, unknown> = await client.request({
|
|
699
|
-
method: "GET",
|
|
700
|
-
path: page,
|
|
701
|
-
query,
|
|
702
|
-
});
|
|
703
|
-
for (const value of Array.isArray(raw.values) ? raw.values : []) {
|
|
704
|
-
comments.push(mapComment(value));
|
|
705
|
-
}
|
|
706
|
-
const next = str(raw.next);
|
|
707
|
-
if (next === undefined) {
|
|
708
|
-
break;
|
|
709
|
-
}
|
|
710
|
-
// `next` is absolute; re-root it under the client base so the proxy
|
|
711
|
-
// (which only forwards paths) keeps working.
|
|
712
|
-
const nextUrl = new URL(next);
|
|
713
|
-
const baseUrl = new URL(`${client.apiBaseUrl}/`);
|
|
714
|
-
page = nextUrl.pathname.startsWith(baseUrl.pathname)
|
|
715
|
-
? nextUrl.pathname.slice(baseUrl.pathname.length - 1)
|
|
716
|
-
: nextUrl.pathname;
|
|
717
|
-
query = Object.fromEntries(nextUrl.searchParams.entries());
|
|
718
|
-
}
|
|
719
|
-
return comments;
|
|
720
|
-
},
|
|
721
|
-
async postPullRequestComment(id, input) {
|
|
722
|
-
const raw = await client.request({
|
|
723
|
-
method: "POST",
|
|
724
|
-
path: `${repo}/pullrequests/${id}/comments`,
|
|
725
|
-
body: {
|
|
726
|
-
content: { raw: input.body },
|
|
727
|
-
...(input.inline === undefined
|
|
728
|
-
? {}
|
|
729
|
-
: {
|
|
730
|
-
inline: {
|
|
731
|
-
path: input.inline.path,
|
|
732
|
-
...(input.inline.line === undefined ? {} : { to: input.inline.line }),
|
|
733
|
-
},
|
|
734
|
-
}),
|
|
735
|
-
},
|
|
736
|
-
});
|
|
737
|
-
return mapComment(raw);
|
|
738
|
-
},
|
|
739
|
-
setBuildStatus: input =>
|
|
740
|
-
client.request({
|
|
741
|
-
method: "POST",
|
|
742
|
-
path: `${repo}/commit/${encodeURIComponent(input.sha)}/statuses/build`,
|
|
743
|
-
body: {
|
|
744
|
-
key: input.key,
|
|
745
|
-
state: input.state,
|
|
746
|
-
name: input.name ?? input.key,
|
|
747
|
-
url: input.url ?? fallbackUrl(repository),
|
|
748
|
-
...(input.description === undefined ? {} : { description: input.description }),
|
|
749
|
-
},
|
|
750
|
-
}),
|
|
751
|
-
getFileAtRef: (path, ref) =>
|
|
752
|
-
client.request<string>({
|
|
753
|
-
method: "GET",
|
|
754
|
-
path: `${repo}/src/${encodeURIComponent(ref)}/${encodePath(path)}`,
|
|
755
|
-
accept: "text/plain",
|
|
756
|
-
}),
|
|
757
|
-
};
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
export function dcBitbucketApi(
|
|
761
|
-
client: BitbucketClient,
|
|
762
|
-
repository: BitbucketRepositoryRef,
|
|
763
|
-
): BitbucketApi {
|
|
764
|
-
const repo = bitbucketDataCenterRepoPath(repository);
|
|
765
|
-
const mapComment = (raw: unknown): BitbucketApiComment => {
|
|
766
|
-
const record = asRecord(raw) ?? {};
|
|
767
|
-
const anchor = asRecord(record.anchor);
|
|
768
|
-
const authorId = num(asRecord(record.author)?.id);
|
|
769
|
-
return {
|
|
770
|
-
id: num(record.id) ?? 0,
|
|
771
|
-
body: str(record.text) ?? "",
|
|
772
|
-
authorId: authorId === undefined ? undefined : String(authorId),
|
|
773
|
-
path: str(anchor?.path),
|
|
774
|
-
line: num(anchor?.line),
|
|
775
|
-
raw,
|
|
776
|
-
};
|
|
777
|
-
};
|
|
778
|
-
return {
|
|
779
|
-
dialect: "data-center",
|
|
780
|
-
repository,
|
|
781
|
-
async getPullRequest(id) {
|
|
782
|
-
const raw = await client.request<Record<string, unknown>>({
|
|
783
|
-
method: "GET",
|
|
784
|
-
path: `${repo}/pull-requests/${id}`,
|
|
785
|
-
});
|
|
786
|
-
const fromRef = asRecord(raw.fromRef);
|
|
787
|
-
const toRef = asRecord(raw.toRef);
|
|
788
|
-
const self = asRecord(raw.links)?.self;
|
|
789
|
-
return {
|
|
790
|
-
id: num(raw.id) ?? id,
|
|
791
|
-
title: str(raw.title),
|
|
792
|
-
description: str(raw.description),
|
|
793
|
-
state: str(raw.state),
|
|
794
|
-
sourceBranch: str(fromRef?.displayId),
|
|
795
|
-
targetBranch: str(toRef?.displayId),
|
|
796
|
-
headSha: str(fromRef?.latestCommit),
|
|
797
|
-
baseSha: str(toRef?.latestCommit),
|
|
798
|
-
htmlUrl: Array.isArray(self) ? str(asRecord(self[0])?.href) : undefined,
|
|
799
|
-
raw,
|
|
800
|
-
};
|
|
801
|
-
},
|
|
802
|
-
// `/pull-requests/{id}.diff` streams the raw unified diff; the sibling
|
|
803
|
-
// `/pull-requests/{id}/diff` route returns a JSON `RestDiff` instead.
|
|
804
|
-
getPullRequestDiff: id =>
|
|
805
|
-
client.request<string>({
|
|
806
|
-
method: "GET",
|
|
807
|
-
path: `${repo}/pull-requests/${id}.diff`,
|
|
808
|
-
accept: "text/plain",
|
|
809
|
-
}),
|
|
810
|
-
async listPullRequestComments(id) {
|
|
811
|
-
const comments: BitbucketApiComment[] = [];
|
|
812
|
-
let start = 0;
|
|
813
|
-
for (;;) {
|
|
814
|
-
const raw = await client.request<Record<string, unknown>>({
|
|
815
|
-
method: "GET",
|
|
816
|
-
path: `${repo}/pull-requests/${id}/activities`,
|
|
817
|
-
query: { limit: 100, start },
|
|
818
|
-
});
|
|
819
|
-
for (const value of Array.isArray(raw.values) ? raw.values : []) {
|
|
820
|
-
const activity = asRecord(value);
|
|
821
|
-
if (activity?.action === "COMMENTED" && activity.comment !== undefined) {
|
|
822
|
-
comments.push(mapComment(activity.comment));
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
const nextStart = num(raw.nextPageStart);
|
|
826
|
-
if (raw.isLastPage !== false || nextStart === undefined) {
|
|
827
|
-
break;
|
|
828
|
-
}
|
|
829
|
-
start = nextStart;
|
|
830
|
-
}
|
|
831
|
-
return comments;
|
|
832
|
-
},
|
|
833
|
-
async postPullRequestComment(id, input) {
|
|
834
|
-
const raw = await client.request({
|
|
835
|
-
method: "POST",
|
|
836
|
-
path: `${repo}/pull-requests/${id}/comments`,
|
|
837
|
-
body: {
|
|
838
|
-
text: input.body,
|
|
839
|
-
...(input.inline === undefined
|
|
840
|
-
? {}
|
|
841
|
-
: {
|
|
842
|
-
anchor: {
|
|
843
|
-
path: input.inline.path,
|
|
844
|
-
diffType: "EFFECTIVE",
|
|
845
|
-
...(input.inline.line === undefined
|
|
846
|
-
? { fileType: "TO" }
|
|
847
|
-
: {
|
|
848
|
-
line: input.inline.line,
|
|
849
|
-
lineType: "CONTEXT",
|
|
850
|
-
fileType: "TO",
|
|
851
|
-
}),
|
|
852
|
-
},
|
|
853
|
-
}),
|
|
854
|
-
},
|
|
855
|
-
});
|
|
856
|
-
return mapComment(raw);
|
|
857
|
-
},
|
|
858
|
-
// Repository-scoped build status (DC 7.14+), which lives under
|
|
859
|
-
// `rest/api/1.0` so the proxy's single upstream base reaches it; the
|
|
860
|
-
// older `rest/build-status/1.0/commits/{sha}` sits outside that base.
|
|
861
|
-
setBuildStatus: input =>
|
|
862
|
-
client.request({
|
|
863
|
-
method: "POST",
|
|
864
|
-
path: `${repo}/commits/${encodeURIComponent(input.sha)}/builds`,
|
|
865
|
-
body: {
|
|
866
|
-
key: input.key,
|
|
867
|
-
state: input.state === "STOPPED" ? "CANCELLED" : input.state,
|
|
868
|
-
name: input.name ?? input.key,
|
|
869
|
-
url: input.url ?? fallbackUrl(repository),
|
|
870
|
-
...(input.description === undefined ? {} : { description: input.description }),
|
|
871
|
-
},
|
|
872
|
-
}),
|
|
873
|
-
getFileAtRef: (path, ref) =>
|
|
874
|
-
client.request<string>({
|
|
875
|
-
method: "GET",
|
|
876
|
-
path: `${repo}/raw/${encodePath(path)}`,
|
|
877
|
-
query: { at: ref },
|
|
878
|
-
accept: "text/plain",
|
|
879
|
-
}),
|
|
880
|
-
};
|
|
881
|
-
}
|
|
882
|
-
|
|
883
|
-
/** Pick the dialect implementation for `repository.dialect`. */
|
|
884
|
-
export function createBitbucketApi(
|
|
885
|
-
client: BitbucketClient,
|
|
886
|
-
repository: BitbucketRepositoryRef,
|
|
887
|
-
): BitbucketApi {
|
|
888
|
-
return repository.dialect === "cloud"
|
|
889
|
-
? cloudBitbucketApi(client, repository)
|
|
890
|
-
: dcBitbucketApi(client, repository);
|
|
891
|
-
}
|