@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,303 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Service-account connector authorization for
|
|
3
|
-
* `defineConnection({ cursorAccount: true })` on hosted deployments.
|
|
4
|
-
*
|
|
5
|
-
* Hosted engines authenticate as their deployment's dedicated service
|
|
6
|
-
* account, whose connector OAuth tokens live backend-side. This flow is the
|
|
7
|
-
* dashboard's Authenticate button as a CLI loop: probe the connectors via
|
|
8
|
-
* `CheckHttpMcpStatus` (which mints a complete OAuth `authUrl` per connector
|
|
9
|
-
* needing auth), open each URL for the human to grant, and poll until the
|
|
10
|
-
* backend reports the token stored. Nothing token-shaped ever touches this
|
|
11
|
-
* process — the cursor.com callback stores tokens against the service
|
|
12
|
-
* account. Used by `agent-sdk mcp oauth <connection>` and the post-deploy
|
|
13
|
-
* hook in `cli-deploy.ts`.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import type {
|
|
17
|
-
AvailableMcpServer,
|
|
18
|
-
CursorBackendClient,
|
|
19
|
-
McpConnectorStatus,
|
|
20
|
-
} from "./cursor/backend-client.js";
|
|
21
|
-
import { LOG_PREFIX } from "./distribution.js";
|
|
22
|
-
import { openBrowser } from "./mcp-oauth.js";
|
|
23
|
-
import { sleep as defaultSleep } from "./sleep.js";
|
|
24
|
-
|
|
25
|
-
const DEFAULT_POLL_INTERVAL_MS = 3_000;
|
|
26
|
-
const DEFAULT_POLL_TIMEOUT_MS = 5 * 60 * 1000;
|
|
27
|
-
|
|
28
|
-
/** Same default the dashboard uses; MCP_OAUTH_REDIRECT_URI overrides for dev. */
|
|
29
|
-
export function mcpOauthRedirectUri(): string {
|
|
30
|
-
const override = process.env.MCP_OAUTH_REDIRECT_URI;
|
|
31
|
-
if (override !== undefined && override.trim() !== "") {
|
|
32
|
-
return override.trim();
|
|
33
|
-
}
|
|
34
|
-
return "https://www.cursor.com/agents/mcp/oauth/callback";
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface AuthorizeCursorAccountConnectorsArgs {
|
|
38
|
-
backendClient: Pick<CursorBackendClient, "getAvailableMcpServers" | "checkHttpMcpStatus">;
|
|
39
|
-
teamId: number;
|
|
40
|
-
slug: string;
|
|
41
|
-
/** The deployment's dedicated service account (`sa_…`). */
|
|
42
|
-
serviceAccountId: string;
|
|
43
|
-
/** Connection name, for log lines. */
|
|
44
|
-
connectionName: string;
|
|
45
|
-
/** The connection's `servers` filter; undefined = every team connector. */
|
|
46
|
-
servers?: string[] | undefined;
|
|
47
|
-
/** Open auth URLs and poll for completion (TTY); false = report only. */
|
|
48
|
-
interactive: boolean;
|
|
49
|
-
out: (text: string) => void;
|
|
50
|
-
err: (text: string) => void;
|
|
51
|
-
/** Test seams. */
|
|
52
|
-
openBrowserImpl?: (url: string) => void;
|
|
53
|
-
sleep?: (ms: number) => Promise<void>;
|
|
54
|
-
pollIntervalMs?: number;
|
|
55
|
-
pollTimeoutMs?: number;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export interface AuthorizeCursorAccountConnectorsResult {
|
|
59
|
-
/** Connectors with a stored credential after the flow. */
|
|
60
|
-
authorized: string[];
|
|
61
|
-
/** Connectors still requiring authorization. */
|
|
62
|
-
pending: string[];
|
|
63
|
-
/** Connectors the backend could not probe. */
|
|
64
|
-
errored: Array<{ name: string; error: string }>;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Authorize the deployment service account for the connection's connectors.
|
|
69
|
-
* Already-authorized connectors are skipped; the rest get a browser OAuth
|
|
70
|
-
* each (sequentially), polled until the backend stores the token.
|
|
71
|
-
*/
|
|
72
|
-
export async function authorizeCursorAccountConnectors(
|
|
73
|
-
args: AuthorizeCursorAccountConnectorsArgs,
|
|
74
|
-
): Promise<AuthorizeCursorAccountConnectorsResult> {
|
|
75
|
-
const { backendClient, teamId, serviceAccountId, connectionName, out, err } = args;
|
|
76
|
-
const open = args.openBrowserImpl ?? openBrowser;
|
|
77
|
-
const sleep = args.sleep ?? defaultSleep;
|
|
78
|
-
const pollIntervalMs = args.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
79
|
-
const pollTimeoutMs = args.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;
|
|
80
|
-
const redirectUri = mcpOauthRedirectUri();
|
|
81
|
-
|
|
82
|
-
// Team-scoped connectors only: the hosted bridge resolves the SA's team
|
|
83
|
-
// servers, so personal connectors can never apply to a deployment.
|
|
84
|
-
const available = (await backendClient.getAvailableMcpServers({ teamId })).filter(
|
|
85
|
-
server => server.isTeamServer,
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
const selected = selectConnectors(available, args.servers);
|
|
89
|
-
for (const missing of selected.unmatched) {
|
|
90
|
-
err(
|
|
91
|
-
`${LOG_PREFIX} Connection "${connectionName}" lists connector ${JSON.stringify(missing)}, but the team has no such connector (dashboard → MCP).\n`,
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
if (selected.servers.length === 0) {
|
|
95
|
-
err(`${LOG_PREFIX} No matching team connectors for connection "${connectionName}".\n`);
|
|
96
|
-
return { authorized: [], pending: [], errored: [] };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const nameById = new Map(selected.servers.map(server => [server.id, server.name]));
|
|
100
|
-
const statuses = await backendClient.checkHttpMcpStatus({
|
|
101
|
-
serverIds: selected.servers.map(server => server.id),
|
|
102
|
-
oauthRedirectUri: redirectUri,
|
|
103
|
-
serviceAccountId,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
const result: AuthorizeCursorAccountConnectorsResult = {
|
|
107
|
-
authorized: [],
|
|
108
|
-
pending: [],
|
|
109
|
-
errored: [],
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
for (const status of statuses) {
|
|
113
|
-
const name = nameById.get(status.id) ?? `#${status.id}`;
|
|
114
|
-
if (!status.requiresAuth) {
|
|
115
|
-
if (status.error !== undefined && status.error !== "") {
|
|
116
|
-
err(`${LOG_PREFIX} ${name}: ${status.error}\n`);
|
|
117
|
-
result.errored.push({ name, error: status.error });
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
out(`${LOG_PREFIX} ${name}: already authorized ✓\n`);
|
|
121
|
-
result.authorized.push(name);
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
if (status.authUrl === undefined || status.authUrl === "") {
|
|
125
|
-
const error = status.error ?? "no authorization URL was minted";
|
|
126
|
-
err(`${LOG_PREFIX} ${name}: ${error}\n`);
|
|
127
|
-
result.errored.push({ name, error });
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
if (!args.interactive) {
|
|
131
|
-
result.pending.push(name);
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
out(
|
|
136
|
-
`${LOG_PREFIX} ${name}: authorization needed. You'll authorize ${name} as yourself; ` +
|
|
137
|
-
`anyone who can talk to this agent can act with that access.\n` +
|
|
138
|
-
`${LOG_PREFIX} Opening (or open manually):\n ${status.authUrl}\n`,
|
|
139
|
-
);
|
|
140
|
-
open(status.authUrl);
|
|
141
|
-
|
|
142
|
-
const authorized = await pollUntilAuthorized({
|
|
143
|
-
backendClient,
|
|
144
|
-
serverId: status.id,
|
|
145
|
-
serviceAccountId,
|
|
146
|
-
redirectUri,
|
|
147
|
-
sleep,
|
|
148
|
-
pollIntervalMs,
|
|
149
|
-
pollTimeoutMs,
|
|
150
|
-
});
|
|
151
|
-
if (authorized) {
|
|
152
|
-
out(`${LOG_PREFIX} ${name}: authorized ✓\n`);
|
|
153
|
-
result.authorized.push(name);
|
|
154
|
-
} else {
|
|
155
|
-
err(`${LOG_PREFIX} ${name}: still waiting on authorization; giving up for now.\n`);
|
|
156
|
-
result.pending.push(name);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return result;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function selectConnectors(
|
|
164
|
-
available: AvailableMcpServer[],
|
|
165
|
-
filter: string[] | undefined,
|
|
166
|
-
): { servers: AvailableMcpServer[]; unmatched: string[] } {
|
|
167
|
-
if (filter === undefined || filter.length === 0) {
|
|
168
|
-
return { servers: available, unmatched: [] };
|
|
169
|
-
}
|
|
170
|
-
const servers: AvailableMcpServer[] = [];
|
|
171
|
-
const seen = new Set<number>();
|
|
172
|
-
const unmatched: string[] = [];
|
|
173
|
-
for (const name of filter) {
|
|
174
|
-
const wanted = name.trim().toLowerCase();
|
|
175
|
-
const matches = available.filter(
|
|
176
|
-
server =>
|
|
177
|
-
server.name.toLowerCase() === wanted || server.serverIdentifier?.toLowerCase() === wanted,
|
|
178
|
-
);
|
|
179
|
-
if (matches.length === 0) {
|
|
180
|
-
unmatched.push(name);
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
for (const match of matches) {
|
|
184
|
-
if (!seen.has(match.id)) {
|
|
185
|
-
seen.add(match.id);
|
|
186
|
-
servers.push(match);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return { servers, unmatched };
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function uniqueConnectorMatch(
|
|
194
|
-
available: AvailableMcpServer[],
|
|
195
|
-
identifier: string,
|
|
196
|
-
): AvailableMcpServer | undefined {
|
|
197
|
-
const wanted = identifier.trim().toLowerCase();
|
|
198
|
-
if (wanted === "") {
|
|
199
|
-
return undefined;
|
|
200
|
-
}
|
|
201
|
-
const byIdentifier = available.filter(
|
|
202
|
-
server => server.serverIdentifier?.toLowerCase() === wanted,
|
|
203
|
-
);
|
|
204
|
-
if (byIdentifier.length === 1) {
|
|
205
|
-
return byIdentifier[0];
|
|
206
|
-
}
|
|
207
|
-
if (byIdentifier.length > 1) {
|
|
208
|
-
return undefined;
|
|
209
|
-
}
|
|
210
|
-
const byName = available.filter(server => server.name.toLowerCase() === wanted);
|
|
211
|
-
if (byName.length === 1) {
|
|
212
|
-
return byName[0];
|
|
213
|
-
}
|
|
214
|
-
return undefined;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Mint OAuth `authUrl`s for connectors matching `identifiers` (name or
|
|
219
|
-
* `serverIdentifier`). Omit `serviceAccountId` to probe the signed-in user
|
|
220
|
-
* (local `serve` preflight). Failures return an empty map so the caller
|
|
221
|
-
* can fall back to the dashboard URL.
|
|
222
|
-
*/
|
|
223
|
-
export async function probeConnectorAuthUrls(args: {
|
|
224
|
-
client: Pick<CursorBackendClient, "getAvailableMcpServers" | "checkHttpMcpStatus">;
|
|
225
|
-
identifiers: readonly string[];
|
|
226
|
-
serviceAccountId?: string;
|
|
227
|
-
}): Promise<Map<string, string>> {
|
|
228
|
-
const urls = new Map<string, string>();
|
|
229
|
-
if (args.identifiers.length === 0) {
|
|
230
|
-
return urls;
|
|
231
|
-
}
|
|
232
|
-
try {
|
|
233
|
-
const available = await args.client.getAvailableMcpServers();
|
|
234
|
-
const matched: AvailableMcpServer[] = [];
|
|
235
|
-
const seen = new Set<number>();
|
|
236
|
-
for (const identifier of args.identifiers) {
|
|
237
|
-
const match = uniqueConnectorMatch(available, identifier);
|
|
238
|
-
if (match === undefined || seen.has(match.id)) {
|
|
239
|
-
continue;
|
|
240
|
-
}
|
|
241
|
-
seen.add(match.id);
|
|
242
|
-
matched.push(match);
|
|
243
|
-
}
|
|
244
|
-
if (matched.length === 0) {
|
|
245
|
-
return urls;
|
|
246
|
-
}
|
|
247
|
-
const statuses = await args.client.checkHttpMcpStatus({
|
|
248
|
-
serverIds: matched.map(server => server.id),
|
|
249
|
-
oauthRedirectUri: mcpOauthRedirectUri(),
|
|
250
|
-
serviceAccountId: args.serviceAccountId,
|
|
251
|
-
});
|
|
252
|
-
const statusById = new Map(statuses.map(status => [status.id, status] as const));
|
|
253
|
-
for (const identifier of args.identifiers) {
|
|
254
|
-
const match = uniqueConnectorMatch(available, identifier);
|
|
255
|
-
if (match === undefined) {
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
const authUrl = statusById.get(match.id)?.authUrl?.trim();
|
|
259
|
-
if (authUrl !== undefined && authUrl !== "") {
|
|
260
|
-
urls.set(identifier, authUrl);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
return urls;
|
|
264
|
-
} catch {
|
|
265
|
-
return urls;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
async function pollUntilAuthorized(args: {
|
|
270
|
-
backendClient: Pick<CursorBackendClient, "checkHttpMcpStatus">;
|
|
271
|
-
serverId: number;
|
|
272
|
-
serviceAccountId: string;
|
|
273
|
-
redirectUri: string;
|
|
274
|
-
sleep: (ms: number) => Promise<void>;
|
|
275
|
-
pollIntervalMs: number;
|
|
276
|
-
pollTimeoutMs: number;
|
|
277
|
-
}): Promise<boolean> {
|
|
278
|
-
const deadline = Date.now() + args.pollTimeoutMs;
|
|
279
|
-
// Each unauthorized probe is a full backend connect to the provider, so
|
|
280
|
-
// back off while the human works through the OAuth pages.
|
|
281
|
-
let intervalMs = args.pollIntervalMs;
|
|
282
|
-
const maxIntervalMs = Math.max(args.pollIntervalMs, 15_000);
|
|
283
|
-
while (Date.now() < deadline) {
|
|
284
|
-
await args.sleep(intervalMs);
|
|
285
|
-
intervalMs = Math.min(intervalMs * 1.5, maxIntervalMs);
|
|
286
|
-
let statuses: McpConnectorStatus[];
|
|
287
|
-
try {
|
|
288
|
-
statuses = await args.backendClient.checkHttpMcpStatus({
|
|
289
|
-
serverIds: [args.serverId],
|
|
290
|
-
oauthRedirectUri: args.redirectUri,
|
|
291
|
-
serviceAccountId: args.serviceAccountId,
|
|
292
|
-
});
|
|
293
|
-
} catch {
|
|
294
|
-
// Transient probe errors; keep polling until the deadline.
|
|
295
|
-
continue;
|
|
296
|
-
}
|
|
297
|
-
const status = statuses.find(entry => entry.id === args.serverId);
|
|
298
|
-
if (status !== undefined && !status.requiresAuth) {
|
|
299
|
-
return true;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
return false;
|
|
303
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
|
|
4
|
-
const MAX = 64;
|
|
5
|
-
const TEMPLATE_NAMES = [
|
|
6
|
-
"agentic-owners",
|
|
7
|
-
"agents-md",
|
|
8
|
-
"code-wiki",
|
|
9
|
-
"demo",
|
|
10
|
-
"grokbot-agents",
|
|
11
|
-
"pr-autofixer",
|
|
12
|
-
"security-help",
|
|
13
|
-
"security-reviewer",
|
|
14
|
-
"thermo-quality-review",
|
|
15
|
-
"thermo-review",
|
|
16
|
-
"triage-linear",
|
|
17
|
-
"triage-jira",
|
|
18
|
-
] as const;
|
|
19
|
-
export type TemplateName = (typeof TEMPLATE_NAMES)[number];
|
|
20
|
-
const NAMES = new Set<string>(TEMPLATE_NAMES);
|
|
21
|
-
|
|
22
|
-
export function canonicalTemplateName(name: string): string {
|
|
23
|
-
return name === "triage" ? "triage-linear" : name;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function isTemplateName(name: string): name is TemplateName {
|
|
27
|
-
return NAMES.has(name);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** Raw scaffold marker. Validation depends on the consuming boundary. */
|
|
31
|
-
export function readCursorAgentTemplate(rootDir: string): string | undefined {
|
|
32
|
-
try {
|
|
33
|
-
const pkg = JSON.parse(readFileSync(join(rootDir, "package.json"), "utf8")) as {
|
|
34
|
-
cursorAgentTemplate?: unknown;
|
|
35
|
-
};
|
|
36
|
-
const stamp = pkg.cursorAgentTemplate;
|
|
37
|
-
return typeof stamp === "string" ? stamp : undefined;
|
|
38
|
-
} catch {
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function readDeployTemplate(rootDir: string): string | undefined {
|
|
44
|
-
const stamp = readCursorAgentTemplate(rootDir);
|
|
45
|
-
if (stamp === undefined || stamp.length === 0 || stamp.length > MAX) {
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
const name = canonicalTemplateName(stamp);
|
|
49
|
-
return isTemplateName(name) ? name : undefined;
|
|
50
|
-
}
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pull relay for `/v0/deployment-events`.
|
|
3
|
-
*
|
|
4
|
-
* A {@link RelayAdapter} over {@link CursorRelayCore} — the same engine the
|
|
5
|
-
* GitHub SCM and Slack relays use, so registration heartbeats, durable
|
|
6
|
-
* offsets, backoff, and bounded dispatch retry are inherited rather than
|
|
7
|
-
* reimplemented. Only the subscribe/poll paths, the registration body, and
|
|
8
|
-
* the per-event filter differ.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type {
|
|
12
|
-
DeploymentEvent,
|
|
13
|
-
DeploymentEventType,
|
|
14
|
-
DeploymentSubscription,
|
|
15
|
-
} from "../channels/deployments/types.js";
|
|
16
|
-
import { CursorRelayCore, type RelayAdapter } from "./cursor-relay-core.js";
|
|
17
|
-
|
|
18
|
-
const DEFAULT_EVENTS: readonly DeploymentEventType[] = ["deployment.succeeded"];
|
|
19
|
-
|
|
20
|
-
/** One page entry: the event fields plus its stream offset, as the sibling
|
|
21
|
-
* providers spell it. */
|
|
22
|
-
export type DeploymentRelayEvent = DeploymentEvent & { offset: string };
|
|
23
|
-
|
|
24
|
-
export interface ResolvedSubscription {
|
|
25
|
-
deploySourceUri: string;
|
|
26
|
-
environments: string[];
|
|
27
|
-
events: Set<DeploymentEventType>;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
interface SubscriptionStatus {
|
|
31
|
-
deploySourceUri: string;
|
|
32
|
-
isSubscribed: boolean;
|
|
33
|
-
detail?: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export type DeploymentSubscriptionSource =
|
|
37
|
-
| readonly ResolvedSubscription[]
|
|
38
|
-
| (() => readonly ResolvedSubscription[]);
|
|
39
|
-
|
|
40
|
-
export interface DeploymentEventRelayOptions {
|
|
41
|
-
baseUrl: string;
|
|
42
|
-
apiKey: string;
|
|
43
|
-
stateDir: string;
|
|
44
|
-
/**
|
|
45
|
-
* Snapshot or a getter. A getter is re-read on every registration
|
|
46
|
-
* heartbeat so a channel that refreshes `deploySourceUris` after start
|
|
47
|
-
* can add sources without restarting the relay.
|
|
48
|
-
*/
|
|
49
|
-
subscriptions: DeploymentSubscriptionSource;
|
|
50
|
-
dispatch: (event: DeploymentEvent) => Promise<void>;
|
|
51
|
-
logger: (line: string) => void;
|
|
52
|
-
fetchImpl?: typeof fetch;
|
|
53
|
-
pollWaitMs?: number;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** Current subscriptions: a live getter, otherwise the snapshot. */
|
|
57
|
-
export function currentDeploymentSubscriptions(
|
|
58
|
-
subscriptions: DeploymentSubscriptionSource,
|
|
59
|
-
): readonly ResolvedSubscription[] {
|
|
60
|
-
return typeof subscriptions === "function" ? subscriptions() : subscriptions;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Normalize the channel's `deploySourceUris` option into concrete
|
|
65
|
-
* subscriptions. An omitted or empty option resolves to none, which callers
|
|
66
|
-
* read as "defer to the deploy scope".
|
|
67
|
-
*/
|
|
68
|
-
export function resolveDeploymentSubscriptions(options: {
|
|
69
|
-
deploySourceUris?: readonly (string | DeploymentSubscription)[];
|
|
70
|
-
environments?: readonly string[];
|
|
71
|
-
events?: readonly DeploymentEventType[];
|
|
72
|
-
}): ResolvedSubscription[] {
|
|
73
|
-
const bySource = new Map<string, ResolvedSubscription>();
|
|
74
|
-
for (const entry of options.deploySourceUris ?? []) {
|
|
75
|
-
const subscription: DeploymentSubscription =
|
|
76
|
-
typeof entry === "string" ? { deploySourceUri: entry } : entry;
|
|
77
|
-
// Case-folded only: `Deployment.deploy_source_uri` has no documented
|
|
78
|
-
// format, and the server keys subscriptions the same way.
|
|
79
|
-
const deploySourceUri = subscription.deploySourceUri.trim().toLowerCase();
|
|
80
|
-
if (deploySourceUri === "") {
|
|
81
|
-
throw new Error(
|
|
82
|
-
`deploymentsChannel: invalid deploy source "${subscription.deploySourceUri}".`,
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
const environments = [
|
|
86
|
-
...new Set(
|
|
87
|
-
(subscription.environments ?? options.environments ?? [])
|
|
88
|
-
.map(value => value.trim())
|
|
89
|
-
.filter(Boolean),
|
|
90
|
-
),
|
|
91
|
-
];
|
|
92
|
-
const events = new Set(subscription.events ?? options.events ?? DEFAULT_EVENTS);
|
|
93
|
-
if (events.size === 0) {
|
|
94
|
-
throw new Error(
|
|
95
|
-
`deploymentsChannel: deploy source "${deploySourceUri}" subscribes to no events.`,
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
// Later entries for the same deploy source widen the earlier one rather
|
|
99
|
-
// than silently replacing it.
|
|
100
|
-
const existing = bySource.get(deploySourceUri);
|
|
101
|
-
if (existing === undefined) {
|
|
102
|
-
bySource.set(deploySourceUri, { deploySourceUri, environments, events });
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
for (const event of events) existing.events.add(event);
|
|
106
|
-
existing.environments =
|
|
107
|
-
existing.environments.length === 0 || environments.length === 0
|
|
108
|
-
? []
|
|
109
|
-
: [...new Set([...existing.environments, ...environments])];
|
|
110
|
-
}
|
|
111
|
-
// Empty means "this channel names nothing". The relay wire reads that as
|
|
112
|
-
// deregistration, hosted admission reads it as "defer to the deploy
|
|
113
|
-
// scope". The host re-resolves on each heartbeat, so a channel that later
|
|
114
|
-
// fills `deploySourceUris` registers without a restart.
|
|
115
|
-
return [...bySource.values()];
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Union per-channel subscriptions, widening events and environments when
|
|
120
|
-
* the same deploy source appears more than once. An empty environment
|
|
121
|
-
* list means every environment and absorbs a narrower list.
|
|
122
|
-
*/
|
|
123
|
-
export function mergeResolvedSubscriptions(
|
|
124
|
-
groups: readonly (readonly ResolvedSubscription[])[],
|
|
125
|
-
): ResolvedSubscription[] {
|
|
126
|
-
const bySource = new Map<string, ResolvedSubscription>();
|
|
127
|
-
for (const group of groups) {
|
|
128
|
-
for (const subscription of group) {
|
|
129
|
-
const existing = bySource.get(subscription.deploySourceUri);
|
|
130
|
-
if (existing === undefined) {
|
|
131
|
-
bySource.set(subscription.deploySourceUri, {
|
|
132
|
-
deploySourceUri: subscription.deploySourceUri,
|
|
133
|
-
environments: [...subscription.environments],
|
|
134
|
-
events: new Set(subscription.events),
|
|
135
|
-
});
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
for (const event of subscription.events) existing.events.add(event);
|
|
139
|
-
existing.environments =
|
|
140
|
-
existing.environments.length === 0 || subscription.environments.length === 0
|
|
141
|
-
? []
|
|
142
|
-
: [...new Set([...existing.environments, ...subscription.environments])];
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return [...bySource.values()];
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/** Whether one confirmed subscription wants this event. */
|
|
149
|
-
export function deploymentEventMatches(
|
|
150
|
-
subscription: ResolvedSubscription,
|
|
151
|
-
envelope: DeploymentEvent,
|
|
152
|
-
): boolean {
|
|
153
|
-
if (!subscription.events.has(envelope.eventType)) {
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
return (
|
|
157
|
-
subscription.environments.length === 0 ||
|
|
158
|
-
subscription.environments.includes(envelope.environment)
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/** One channel the host can deliver a deployment event to. */
|
|
163
|
-
export interface DeploymentDispatchTarget {
|
|
164
|
-
/** Display name for logs, e.g. `executor/deployments`. */
|
|
165
|
-
name: string;
|
|
166
|
-
subscriptions: readonly ResolvedSubscription[];
|
|
167
|
-
deliver: (event: DeploymentEvent) => Promise<unknown>;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Deliver one event to every channel subscribed to it.
|
|
172
|
-
*
|
|
173
|
-
* Each channel is delivered independently: one channel's handler throwing
|
|
174
|
-
* must not skip the channels after it, because the relay core retries the
|
|
175
|
-
* whole dispatch and the channels that already ran would see the event twice.
|
|
176
|
-
* Throws only when every subscribed channel failed, so a retry cannot
|
|
177
|
-
* re-deliver to a channel that succeeded.
|
|
178
|
-
*/
|
|
179
|
-
export async function fanOutDeploymentEvent(input: {
|
|
180
|
-
targets: readonly DeploymentDispatchTarget[];
|
|
181
|
-
event: DeploymentEvent;
|
|
182
|
-
logger: (line: string) => void;
|
|
183
|
-
}): Promise<void> {
|
|
184
|
-
const { event, logger } = input;
|
|
185
|
-
const matched = input.targets.filter(target =>
|
|
186
|
-
target.subscriptions.some(
|
|
187
|
-
subscription =>
|
|
188
|
-
subscription.deploySourceUri === event.deploySourceUri &&
|
|
189
|
-
deploymentEventMatches(subscription, event),
|
|
190
|
-
),
|
|
191
|
-
);
|
|
192
|
-
const failures: string[] = [];
|
|
193
|
-
for (const target of matched) {
|
|
194
|
-
try {
|
|
195
|
-
await target.deliver(event);
|
|
196
|
-
} catch (error) {
|
|
197
|
-
failures.push(target.name);
|
|
198
|
-
logger(
|
|
199
|
-
`[agent-sdk] deployment-events: ${target.name} failed on ${event.eventId}: ${
|
|
200
|
-
error instanceof Error ? error.message : String(error)
|
|
201
|
-
}`,
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
logger(
|
|
206
|
-
`[agent-sdk] deployment-events: ${event.eventType} ${event.deploySourceUri}@${event.deployVersion} (${event.environment}) → ${matched.length - failures.length}/${matched.length} channel(s)`,
|
|
207
|
-
);
|
|
208
|
-
if (failures.length > 0 && failures.length === matched.length) {
|
|
209
|
-
throw new Error(
|
|
210
|
-
`deployment-events: every subscribed channel failed on ${event.eventId} (${failures.join(", ")})`,
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export class DeploymentEventRelay {
|
|
216
|
-
private readonly core: CursorRelayCore<DeploymentRelayEvent>;
|
|
217
|
-
private subscribed = new Map<string, ResolvedSubscription>();
|
|
218
|
-
private readonly loggedSkippedSources = new Set<string>();
|
|
219
|
-
|
|
220
|
-
constructor(private readonly options: DeploymentEventRelayOptions) {
|
|
221
|
-
const adapter: RelayAdapter<DeploymentRelayEvent> = {
|
|
222
|
-
logPrefix: "deployment-events",
|
|
223
|
-
subscribePath: "/v0/deployment-events/subscriptions",
|
|
224
|
-
pollPath: "/v0/deployment-events",
|
|
225
|
-
buildRegistrationBody: consumerId => ({
|
|
226
|
-
consumerId,
|
|
227
|
-
subscriptions: currentDeploymentSubscriptions(options.subscriptions).map(subscription => ({
|
|
228
|
-
deploySourceUri: subscription.deploySourceUri,
|
|
229
|
-
environments: subscription.environments,
|
|
230
|
-
events: [...subscription.events],
|
|
231
|
-
})),
|
|
232
|
-
}),
|
|
233
|
-
// Empty subscriptions drop this consumer's registration on clean stop
|
|
234
|
-
// instead of leaving it to lapse by TTL.
|
|
235
|
-
buildDeregistrationBody: consumerId => ({
|
|
236
|
-
consumerId,
|
|
237
|
-
subscriptions: [],
|
|
238
|
-
}),
|
|
239
|
-
applyRegistrationResponse: json => {
|
|
240
|
-
const result = json as { deploySourceUris?: SubscriptionStatus[] };
|
|
241
|
-
const wantedSubscriptions = currentDeploymentSubscriptions(options.subscriptions);
|
|
242
|
-
this.subscribed = new Map();
|
|
243
|
-
this.loggedSkippedSources.clear();
|
|
244
|
-
const lines: string[] = [];
|
|
245
|
-
const confirmed: string[] = [];
|
|
246
|
-
for (const status of result.deploySourceUris ?? []) {
|
|
247
|
-
const wanted = wantedSubscriptions.find(
|
|
248
|
-
subscription => subscription.deploySourceUri === status.deploySourceUri,
|
|
249
|
-
);
|
|
250
|
-
if (!status.isSubscribed || wanted === undefined) {
|
|
251
|
-
lines.push(
|
|
252
|
-
`not subscribed to ${status.deploySourceUri}: ${status.detail ?? "unknown reason"}`,
|
|
253
|
-
);
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
this.subscribed.set(status.deploySourceUri, wanted);
|
|
257
|
-
confirmed.push(status.deploySourceUri);
|
|
258
|
-
}
|
|
259
|
-
if (confirmed.length > 0) {
|
|
260
|
-
const kinds = [...new Set(wantedSubscriptions.flatMap(s => [...s.events]))];
|
|
261
|
-
lines.push(`subscribed to ${confirmed.join(", ")} for events: ${kinds.join(", ")}`);
|
|
262
|
-
}
|
|
263
|
-
return lines;
|
|
264
|
-
},
|
|
265
|
-
shouldDispatch: event => this.shouldDispatch(event),
|
|
266
|
-
dispatch: ({ offset: _offset, ...envelope }) => options.dispatch(envelope),
|
|
267
|
-
};
|
|
268
|
-
this.core = new CursorRelayCore<DeploymentRelayEvent>({
|
|
269
|
-
baseUrl: options.baseUrl,
|
|
270
|
-
apiKey: options.apiKey,
|
|
271
|
-
stateDir: options.stateDir,
|
|
272
|
-
adapter,
|
|
273
|
-
logger: options.logger,
|
|
274
|
-
...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
|
|
275
|
-
...(options.pollWaitMs === undefined ? {} : { pollWaitMs: options.pollWaitMs }),
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Whether an event from this principal's stream belongs to THIS relay.
|
|
281
|
-
* The stream is per-principal, and one API key can back several relays
|
|
282
|
-
* (other hosts, or an agent running its own alongside the host's), so each
|
|
283
|
-
* one re-checks the events against the subscriptions the server confirmed
|
|
284
|
-
* for it.
|
|
285
|
-
*/
|
|
286
|
-
private shouldDispatch(event: DeploymentRelayEvent): boolean {
|
|
287
|
-
const envelope = event;
|
|
288
|
-
if (
|
|
289
|
-
envelope === null ||
|
|
290
|
-
typeof envelope !== "object" ||
|
|
291
|
-
typeof envelope.deploySourceUri !== "string"
|
|
292
|
-
) {
|
|
293
|
-
return false;
|
|
294
|
-
}
|
|
295
|
-
const subscription = this.subscribed.get(envelope.deploySourceUri);
|
|
296
|
-
if (subscription === undefined) {
|
|
297
|
-
if (!this.loggedSkippedSources.has(envelope.deploySourceUri)) {
|
|
298
|
-
this.loggedSkippedSources.add(envelope.deploySourceUri);
|
|
299
|
-
this.options.logger(
|
|
300
|
-
`[agent-sdk] deployment-events: skipping events for ${envelope.deploySourceUri}: not in this host's subscription (another consumer of this API key likely subscribed it)`,
|
|
301
|
-
);
|
|
302
|
-
}
|
|
303
|
-
return false;
|
|
304
|
-
}
|
|
305
|
-
return deploymentEventMatches(subscription, envelope);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
start(): void {
|
|
309
|
-
this.core.start();
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
async stop(): Promise<void> {
|
|
313
|
-
await this.core.stop();
|
|
314
|
-
}
|
|
315
|
-
}
|