@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,334 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve a hosted (managed) agent-sdk deployment into a base URL +
|
|
3
|
-
* request headers for chat/run/call/eval `--prod`.
|
|
4
|
-
*
|
|
5
|
-
* Uses short-lived `engineAccess` from the deployment status route
|
|
6
|
-
* (Cursor API key on the management API; `X-Anyrun-Port-Token` on the
|
|
7
|
-
* engine). Alias tokens are out of scope here.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { basename, resolve } from "node:path";
|
|
11
|
-
import { type ResolvedDeployAuth, resolveDeployAuth } from "./cli-deploy.js";
|
|
12
|
-
import { cursorWebsiteUrl } from "./cursor/credentials.js";
|
|
13
|
-
import {
|
|
14
|
-
DeployApiError,
|
|
15
|
-
type DeploymentDetail,
|
|
16
|
-
slugFromDirectoryName,
|
|
17
|
-
validateDeploymentSlug,
|
|
18
|
-
} from "./deploy-client.js";
|
|
19
|
-
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
20
|
-
import { deploymentArchitecture, rejectV2ForLegacyCommand } from "./legacy-command-guard.js";
|
|
21
|
-
import { sleep as defaultSleep } from "./sleep.js";
|
|
22
|
-
import { stderrPalette } from "./terminal-style.js";
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Interactive CLI keep-alive for hosted engines. Without these, a hibernated
|
|
26
|
-
* Anyrun pod returns 417 `pod_hibernated` and never wakes. Matches the
|
|
27
|
-
* cloud-agent interactive keep-alive shape (lower ≤ upper, seconds).
|
|
28
|
-
*/
|
|
29
|
-
export const PROD_ENGINE_WAKE_HEADERS: Readonly<Record<string, string>> = {
|
|
30
|
-
"x-anyrun-hibernation-lower-bound-s": "1800",
|
|
31
|
-
"x-anyrun-hibernation-upper-bound-s": "3600",
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export interface ResolveProdTargetOptions {
|
|
35
|
-
dir: string;
|
|
36
|
-
cwd?: string;
|
|
37
|
-
/** Explicit deployment slug; otherwise derived from `--dir` basename. */
|
|
38
|
-
slug?: string;
|
|
39
|
-
team?: string;
|
|
40
|
-
apiKey?: string;
|
|
41
|
-
fetchImpl?: typeof fetch;
|
|
42
|
-
err?: (text: string) => void;
|
|
43
|
-
/** Skip when the caller already ran {@link rejectV2ForLegacyCommand}. */
|
|
44
|
-
skipLegacyArchitectureCheck?: boolean;
|
|
45
|
-
/** Test seam for reachability-retry backoff. */
|
|
46
|
-
sleep?: (ms: number) => Promise<void>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface ResolvedProdTarget {
|
|
50
|
-
agentUrl: string;
|
|
51
|
-
headers: Record<string, string>;
|
|
52
|
-
slug: string;
|
|
53
|
-
expiresAt: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Thrown when a hosted deployment cannot be resolved. `notFound` is true
|
|
58
|
-
* when the deployment does not exist, so callers can suggest deploying
|
|
59
|
-
* (or running locally) instead of surfacing a bare API error.
|
|
60
|
-
*/
|
|
61
|
-
export class ProdTargetError extends Error {
|
|
62
|
-
constructor(
|
|
63
|
-
message: string,
|
|
64
|
-
readonly options: { slug: string; notFound?: boolean } = { slug: "" },
|
|
65
|
-
) {
|
|
66
|
-
super(message);
|
|
67
|
-
this.name = "ProdTargetError";
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
get slug(): string {
|
|
71
|
-
return this.options.slug;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
get notFound(): boolean {
|
|
75
|
-
return this.options.notFound === true;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Look up a running deployment and return its engineAccess URL/headers.
|
|
81
|
-
* Throws {@link Error} with a CLI-ready message on failure.
|
|
82
|
-
*/
|
|
83
|
-
export async function resolveProdTarget(
|
|
84
|
-
options: ResolveProdTargetOptions,
|
|
85
|
-
): Promise<ResolvedProdTarget> {
|
|
86
|
-
const err = options.err ?? ((text: string) => void process.stderr.write(text));
|
|
87
|
-
const slug = resolveProdSlug(options);
|
|
88
|
-
const auth = await resolveDeployAuth({
|
|
89
|
-
team: options.team,
|
|
90
|
-
apiKey: options.apiKey,
|
|
91
|
-
fetchImpl: options.fetchImpl,
|
|
92
|
-
err,
|
|
93
|
-
});
|
|
94
|
-
if (typeof auth === "number") {
|
|
95
|
-
// Not "--prod": `eval` resolves the hosted deployment by default,
|
|
96
|
-
// without any flag.
|
|
97
|
-
throw new Error(
|
|
98
|
-
`Could not resolve Cursor credentials/team for the hosted deployment (see above).`,
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
if (options.skipLegacyArchitectureCheck !== true) {
|
|
102
|
-
await rejectV2ForLegacyCommand({
|
|
103
|
-
client: auth.client,
|
|
104
|
-
teamId: auth.teamId,
|
|
105
|
-
slug,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// A hibernated engine can briefly omit engineAccess while getPod fails
|
|
110
|
-
// during wake. Retry a few times before surfacing "not reachable yet".
|
|
111
|
-
const maxReachabilityAttempts = 5;
|
|
112
|
-
const sleep = options.sleep ?? defaultSleep;
|
|
113
|
-
let detail: DeploymentDetail | undefined;
|
|
114
|
-
for (let attempt = 0; attempt < maxReachabilityAttempts; attempt++) {
|
|
115
|
-
try {
|
|
116
|
-
detail = await auth.client.getDeployment({
|
|
117
|
-
teamId: auth.teamId,
|
|
118
|
-
slug,
|
|
119
|
-
});
|
|
120
|
-
} catch (error) {
|
|
121
|
-
if (error instanceof DeployApiError) {
|
|
122
|
-
throw new ProdTargetError(`Deployment "${slug}" (team ${auth.teamId}): ${error.message}`, {
|
|
123
|
-
slug,
|
|
124
|
-
notFound: error.status === 404,
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
throw error;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// `degraded` still serves the previous ACTIVE engine; allow runtime access
|
|
131
|
-
// when the control plane minted engineAccess for it.
|
|
132
|
-
const statusOk = detail.status === "running" || detail.status === "degraded";
|
|
133
|
-
if (!statusOk) {
|
|
134
|
-
const lastError =
|
|
135
|
-
detail.lastError === null || detail.lastError === undefined
|
|
136
|
-
? ""
|
|
137
|
-
: ` ${sanitizeCustomerFacingDetail(detail.lastError)}`;
|
|
138
|
-
throw new Error(
|
|
139
|
-
`Deployment "${slug}" is ${detail.status}, not running.${lastError}\n` +
|
|
140
|
-
`Deploy or wait: \`${CLI} deploy --slug ${slug}\` / \`${CLI} deployment ${slug}\``,
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
if (detail.engineAccess !== null && detail.engineAccess !== undefined) {
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
if (attempt + 1 < maxReachabilityAttempts) {
|
|
147
|
-
if (attempt === 0) {
|
|
148
|
-
err(
|
|
149
|
-
`${stderrPalette().dim(`Deployment "${slug}" is waking; waiting for engine access…`)}\n`,
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
await sleep(1000 * (attempt + 1));
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (detail === undefined) {
|
|
157
|
-
throw new Error(`Deployment "${slug}" lookup failed.`);
|
|
158
|
-
}
|
|
159
|
-
const access = detail.engineAccess;
|
|
160
|
-
if (access === null || access === undefined) {
|
|
161
|
-
throw new Error(
|
|
162
|
-
`Deployment "${slug}" is ${detail.status} but is not reachable yet. ` +
|
|
163
|
-
`Try \`${CLI} deployment ${slug}\` or redeploy.`,
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
err(`${stderrPalette().dim(`Using hosted deployment "${slug}".`)}\n`);
|
|
168
|
-
|
|
169
|
-
return {
|
|
170
|
-
agentUrl: access.url.replace(/\/$/, ""),
|
|
171
|
-
headers: {
|
|
172
|
-
...access.headers,
|
|
173
|
-
...PROD_ENGINE_WAKE_HEADERS,
|
|
174
|
-
},
|
|
175
|
-
slug,
|
|
176
|
-
expiresAt: access.expiresAt,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export interface ResolvedProdAliasPlayground {
|
|
181
|
-
/** Hosted playground URL on the API alias (SPA owns alias-token sign-in). */
|
|
182
|
-
playgroundUrl: string;
|
|
183
|
-
slug: string;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export interface ResolvedProdPlayground {
|
|
187
|
-
playgroundUrl: string;
|
|
188
|
-
slug: string;
|
|
189
|
-
architecture: "v1" | "v2";
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export async function resolveProdPlaygroundUrl(
|
|
193
|
-
options: ResolveProdTargetOptions & { sessionId?: string },
|
|
194
|
-
): Promise<ResolvedProdPlayground> {
|
|
195
|
-
const err = options.err ?? ((text: string) => void process.stderr.write(text));
|
|
196
|
-
const slug = resolveProdSlug(options);
|
|
197
|
-
const auth = await resolveDeployAuth({
|
|
198
|
-
team: options.team,
|
|
199
|
-
apiKey: options.apiKey,
|
|
200
|
-
fetchImpl: options.fetchImpl,
|
|
201
|
-
err,
|
|
202
|
-
});
|
|
203
|
-
if (typeof auth === "number") {
|
|
204
|
-
throw new Error(
|
|
205
|
-
`Could not resolve Cursor credentials/team for the hosted deployment (see above).`,
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
const architecture = await deploymentArchitecture({
|
|
209
|
-
client: auth.client,
|
|
210
|
-
teamId: auth.teamId,
|
|
211
|
-
slug,
|
|
212
|
-
});
|
|
213
|
-
if (architecture === "v2") {
|
|
214
|
-
const playgroundUrl = new URL(
|
|
215
|
-
`/dashboard/deployed-agents/${encodeURIComponent(slug)}/playground`,
|
|
216
|
-
cursorWebsiteUrl(),
|
|
217
|
-
);
|
|
218
|
-
const sessionId = options.sessionId?.trim();
|
|
219
|
-
if (sessionId !== undefined && sessionId !== "") {
|
|
220
|
-
playgroundUrl.searchParams.set("sessionId", sessionId);
|
|
221
|
-
}
|
|
222
|
-
err(`${stderrPalette().dim(`Using hosted deployment "${slug}".`)}\n`);
|
|
223
|
-
return {
|
|
224
|
-
playgroundUrl: playgroundUrl.toString(),
|
|
225
|
-
slug,
|
|
226
|
-
architecture,
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
const resolved = await resolveProdAliasPlaygroundUrlWithAuth(options, auth, slug, err);
|
|
231
|
-
return { ...resolved, architecture };
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Look up a running deployment and return its stable alias playground URL.
|
|
236
|
-
* Does not mint `engineAccess` — the browser signs in with the alias token.
|
|
237
|
-
* Throws {@link Error} with a CLI-ready message on failure.
|
|
238
|
-
*/
|
|
239
|
-
export async function resolveProdAliasPlaygroundUrl(
|
|
240
|
-
options: ResolveProdTargetOptions & { sessionId?: string },
|
|
241
|
-
): Promise<ResolvedProdAliasPlayground> {
|
|
242
|
-
const err = options.err ?? ((text: string) => void process.stderr.write(text));
|
|
243
|
-
const slug = resolveProdSlug(options);
|
|
244
|
-
const auth = await resolveDeployAuth({
|
|
245
|
-
team: options.team,
|
|
246
|
-
apiKey: options.apiKey,
|
|
247
|
-
fetchImpl: options.fetchImpl,
|
|
248
|
-
err,
|
|
249
|
-
});
|
|
250
|
-
if (typeof auth === "number") {
|
|
251
|
-
throw new Error(
|
|
252
|
-
`Could not resolve Cursor credentials/team for the hosted deployment (see above).`,
|
|
253
|
-
);
|
|
254
|
-
}
|
|
255
|
-
await rejectV2ForLegacyCommand({
|
|
256
|
-
client: auth.client,
|
|
257
|
-
teamId: auth.teamId,
|
|
258
|
-
slug,
|
|
259
|
-
});
|
|
260
|
-
return resolveProdAliasPlaygroundUrlWithAuth(options, auth, slug, err);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
async function resolveProdAliasPlaygroundUrlWithAuth(
|
|
264
|
-
options: ResolveProdTargetOptions & { sessionId?: string },
|
|
265
|
-
auth: ResolvedDeployAuth,
|
|
266
|
-
slug: string,
|
|
267
|
-
err: (text: string) => void,
|
|
268
|
-
): Promise<ResolvedProdAliasPlayground> {
|
|
269
|
-
let detail: DeploymentDetail;
|
|
270
|
-
try {
|
|
271
|
-
detail = await auth.client.getDeployment({
|
|
272
|
-
teamId: auth.teamId,
|
|
273
|
-
slug,
|
|
274
|
-
});
|
|
275
|
-
} catch (error) {
|
|
276
|
-
if (error instanceof DeployApiError) {
|
|
277
|
-
throw new Error(`Deployment "${slug}" (team ${auth.teamId}): ${error.message}`);
|
|
278
|
-
}
|
|
279
|
-
throw error;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const statusOk = detail.status === "running" || detail.status === "degraded";
|
|
283
|
-
if (!statusOk) {
|
|
284
|
-
const lastError =
|
|
285
|
-
detail.lastError === null || detail.lastError === undefined
|
|
286
|
-
? ""
|
|
287
|
-
: ` ${sanitizeCustomerFacingDetail(detail.lastError)}`;
|
|
288
|
-
throw new Error(
|
|
289
|
-
`Deployment "${slug}" is ${detail.status}, not running.${lastError}\n` +
|
|
290
|
-
`Deploy or wait: \`${CLI} deploy --slug ${slug}\` / \`${CLI} deployment ${slug}\``,
|
|
291
|
-
);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const aliasBase = auth.client.aliasUrl(detail.engineAlias).replace(/\/$/, "");
|
|
295
|
-
const base = `${aliasBase}/playground`;
|
|
296
|
-
const sessionId =
|
|
297
|
-
options.sessionId !== undefined && options.sessionId.trim() !== ""
|
|
298
|
-
? options.sessionId.trim()
|
|
299
|
-
: undefined;
|
|
300
|
-
const playgroundUrl =
|
|
301
|
-
sessionId === undefined ? base : `${base}?sessionId=${encodeURIComponent(sessionId)}`;
|
|
302
|
-
|
|
303
|
-
err(`${stderrPalette().dim(`Using hosted deployment "${slug}".`)}\n`);
|
|
304
|
-
|
|
305
|
-
return { playgroundUrl, slug };
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/** Strip obvious hosting internals from customer-facing error fragments. */
|
|
309
|
-
function sanitizeCustomerFacingDetail(message: string): string {
|
|
310
|
-
return message
|
|
311
|
-
.replace(/https?:\/\/\S+/gi, "[url]")
|
|
312
|
-
.replace(/\bpod-[a-z0-9]+\b/gi, "[runtime]")
|
|
313
|
-
.replace(/\banyrun\b/gi, "runtime")
|
|
314
|
-
.replace(/\bcursorvm\.com\b/gi, "host");
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
/** Resolve the deployment slug the same way `deploy` does for a single dir. */
|
|
318
|
-
export function resolveProdSlug(options: { dir: string; cwd?: string; slug?: string }): string {
|
|
319
|
-
if (options.slug !== undefined && options.slug !== "") {
|
|
320
|
-
const slugError = validateDeploymentSlug(options.slug);
|
|
321
|
-
if (slugError !== undefined) {
|
|
322
|
-
throw new Error(slugError);
|
|
323
|
-
}
|
|
324
|
-
return options.slug;
|
|
325
|
-
}
|
|
326
|
-
const dir = resolve(options.cwd ?? process.cwd(), options.dir);
|
|
327
|
-
const derived = slugFromDirectoryName(basename(dir));
|
|
328
|
-
if (derived === undefined) {
|
|
329
|
-
throw new Error(
|
|
330
|
-
`Could not derive a deployment slug from the directory name ${JSON.stringify(basename(dir))}; pass --slug.`,
|
|
331
|
-
);
|
|
332
|
-
}
|
|
333
|
-
return derived;
|
|
334
|
-
}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Serve-time connection resolution for one mounted agent: once the host is
|
|
3
|
-
* listening (port known), symbolic transports — peers and the Cursor
|
|
4
|
-
* account bridge — resolve to concrete URLs and join the engine's
|
|
5
|
-
* resolved-connection set. Local turns call both over loopback; cloud
|
|
6
|
-
* turns use the serve `publicUrl` for peers and the account's native
|
|
7
|
-
* connectors instead of the bridge.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { type AgentProject, isHostOauthConnectionTransport } from "../types.js";
|
|
11
|
-
import {
|
|
12
|
-
type CursorAccountConnectionRef,
|
|
13
|
-
type CursorAccountMcpBridge,
|
|
14
|
-
resolveCursorAccountConnections,
|
|
15
|
-
} from "./cursor/account-mcp.js";
|
|
16
|
-
import { type PeerConnectionRef, resolvePeerConnections } from "./peer-connections.js";
|
|
17
|
-
import type { EngineResolvedConnection } from "./session-engine.js";
|
|
18
|
-
|
|
19
|
-
/** Fail fast before listen when static cloud config cannot honor `servers`. */
|
|
20
|
-
export function validateMountConnectionsConfig(args: {
|
|
21
|
-
slug: string;
|
|
22
|
-
project: AgentProject;
|
|
23
|
-
accountRefs?: CursorAccountConnectionRef[];
|
|
24
|
-
publicUrl?: string;
|
|
25
|
-
/**
|
|
26
|
-
* True when serve has a cloud tools URL (`--cloud-tools-url`, always set on
|
|
27
|
-
* managed hosting): cloud turns then reach filtered account connections
|
|
28
|
-
* through the host connection bridge on the tool MCP endpoint, so the
|
|
29
|
-
* filter is honored host-side and no `--public-url` is needed.
|
|
30
|
-
*/
|
|
31
|
-
cloudToolsBridge?: boolean;
|
|
32
|
-
}): void {
|
|
33
|
-
if (args.accountRefs === undefined || args.accountRefs.length === 0) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const agent = args.project.agent;
|
|
37
|
-
const cloudCapable = agent.runtime === "cloud" || agent.cloud !== undefined;
|
|
38
|
-
if (!cloudCapable || args.publicUrl !== undefined || args.cloudToolsBridge === true) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const label = args.slug === "" ? args.project.name : args.slug;
|
|
42
|
-
const hostConnectionNames = new Set(
|
|
43
|
-
(args.project.agent.hostConnections ?? []).map(connection => connection.name),
|
|
44
|
-
);
|
|
45
|
-
const filteredRefs = args.accountRefs.filter(
|
|
46
|
-
ref => ref.servers !== undefined && !hostConnectionNames.has(ref.name),
|
|
47
|
-
);
|
|
48
|
-
if (filteredRefs.length === 0) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
throw new Error(
|
|
52
|
-
`[agent-sdk] agent "${label}" has Cursor account MCP connections with \`servers\` filters (${filteredRefs
|
|
53
|
-
.map(ref => ref.name)
|
|
54
|
-
.join(
|
|
55
|
-
", ",
|
|
56
|
-
)}) but no --public-url; cloud-runtime turns cannot honor those filters without a public bridge URL. Set --public-url or remove the \`servers\` filter.`,
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** Fail closed when a cloud turn cannot honor a `servers` filter. */
|
|
61
|
-
export function assertCloudCanHonorAccountServersFilters(args: {
|
|
62
|
-
runtime: "local" | "cloud";
|
|
63
|
-
resolvedConnections: readonly EngineResolvedConnection[];
|
|
64
|
-
/**
|
|
65
|
-
* Connection names this cloud turn reaches through the host connection
|
|
66
|
-
* bridge (tool MCP endpoint). The filter is honored on the serve host
|
|
67
|
-
* there, so a missing `cloudUrl` is not a fail-open.
|
|
68
|
-
*/
|
|
69
|
-
bridgedNames?: ReadonlySet<string>;
|
|
70
|
-
}): void {
|
|
71
|
-
if (args.runtime !== "cloud") {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const blocked = args.resolvedConnections.filter(
|
|
75
|
-
connection =>
|
|
76
|
-
connection.accountServersFilter !== undefined &&
|
|
77
|
-
connection.cloudUrl === undefined &&
|
|
78
|
-
args.bridgedNames?.has(connection.name) !== true,
|
|
79
|
-
);
|
|
80
|
-
if (blocked.length === 0) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
throw new Error(
|
|
84
|
-
`[agent-sdk] cloud turn cannot honor Cursor account \`servers\` filters (${blocked
|
|
85
|
-
.map(connection => connection.name)
|
|
86
|
-
.join(
|
|
87
|
-
", ",
|
|
88
|
-
)}) without --public-url; set --public-url so cloud turns reach the filtered account bridge instead of falling back to native connectors.`,
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/** Fail closed when anonymous HTTP admission would expose account connectors. */
|
|
93
|
-
export function assertAccountConnectionsNotAnonymous(args: {
|
|
94
|
-
allowAnonymous?: boolean;
|
|
95
|
-
/**
|
|
96
|
-
* Opt in when every admitted caller is already trusted (e.g. behind an
|
|
97
|
-
* authenticating proxy / hosted alias token). Same trust model as
|
|
98
|
-
* `--allow-anonymous-cursor-github`.
|
|
99
|
-
*/
|
|
100
|
-
allowAnonymousCursorAccountMcp?: boolean;
|
|
101
|
-
hasAccountConnections: boolean;
|
|
102
|
-
}): void {
|
|
103
|
-
if (args.allowAnonymous !== true || !args.hasAccountConnections) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
if (args.allowAnonymousCursorAccountMcp === true) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
throw new Error(
|
|
110
|
-
"[agent-sdk] --allow-anonymous cannot be used with Cursor account MCP connections (defineConnection({ cursorAccount: true })); use --bearer-token, or opt in with --allow-anonymous-cursor-account-mcp behind a trusted boundary.",
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function resolveMountConnections(args: {
|
|
115
|
-
slug: string;
|
|
116
|
-
project: AgentProject;
|
|
117
|
-
serverUrl: string;
|
|
118
|
-
peerRefs?: PeerConnectionRef[];
|
|
119
|
-
accountRefs?: CursorAccountConnectionRef[];
|
|
120
|
-
accountBridge?: CursorAccountMcpBridge;
|
|
121
|
-
publicUrl?: string;
|
|
122
|
-
authToken?: string;
|
|
123
|
-
/** See {@link validateMountConnectionsConfig}. */
|
|
124
|
-
cloudToolsBridge?: boolean;
|
|
125
|
-
logger: (line: string) => void;
|
|
126
|
-
}): EngineResolvedConnection[] {
|
|
127
|
-
const agent = args.project.agent;
|
|
128
|
-
const cloudCapable = agent.runtime === "cloud" || agent.cloud !== undefined;
|
|
129
|
-
const label = args.slug === "" ? args.project.name : args.slug;
|
|
130
|
-
const resolved: EngineResolvedConnection[] = [];
|
|
131
|
-
|
|
132
|
-
if (cloudCapable) {
|
|
133
|
-
const hostOauthNames = agent.connections
|
|
134
|
-
.filter(connection => isHostOauthConnectionTransport(connection.transport))
|
|
135
|
-
.map(connection => connection.name);
|
|
136
|
-
if (hostOauthNames.length > 0) {
|
|
137
|
-
args.logger(
|
|
138
|
-
args.cloudToolsBridge === true
|
|
139
|
-
? `[agent-sdk] agent "${label}": host-OAuth MCP connections (${hostOauthNames.join(
|
|
140
|
-
", ",
|
|
141
|
-
)}) reach cloud turns through the host connection bridge; their tokens stay on this serve host.`
|
|
142
|
-
: `[agent-sdk] warning: agent "${label}" has host-OAuth MCP connections (${hostOauthNames.join(
|
|
143
|
-
", ",
|
|
144
|
-
)}) whose tokens live on this serve host; cloud-runtime turns omit them. Serve with a cloud tools URL so they reach turns through the host connection bridge, or drop \`oauth\` and authorize the server another way.`,
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (args.peerRefs !== undefined && args.peerRefs.length > 0) {
|
|
150
|
-
const peers = resolvePeerConnections({
|
|
151
|
-
refs: args.peerRefs,
|
|
152
|
-
serverUrl: args.serverUrl,
|
|
153
|
-
...(args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl }),
|
|
154
|
-
...(args.authToken === undefined ? {} : { authToken: args.authToken }),
|
|
155
|
-
});
|
|
156
|
-
resolved.push(...peers);
|
|
157
|
-
if (cloudCapable && args.publicUrl === undefined) {
|
|
158
|
-
args.logger(
|
|
159
|
-
`[agent-sdk] warning: agent "${label}" has peer MCP connections (${peers
|
|
160
|
-
.map(peer => peer.name)
|
|
161
|
-
.join(
|
|
162
|
-
", ",
|
|
163
|
-
)}) but no --public-url; cloud-runtime turns cannot reach this host's loopback address, so peers are omitted from cloud turns.`,
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (args.accountRefs !== undefined && args.accountBridge !== undefined) {
|
|
169
|
-
resolved.push(
|
|
170
|
-
...resolveCursorAccountConnections({
|
|
171
|
-
refs: args.accountRefs,
|
|
172
|
-
serverUrl: args.serverUrl,
|
|
173
|
-
basePath: args.slug === "" ? "" : `/${args.slug}`,
|
|
174
|
-
bridgeSecret: args.accountBridge.secret,
|
|
175
|
-
...(args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl }),
|
|
176
|
-
}),
|
|
177
|
-
);
|
|
178
|
-
// Non-blocking startup DX: connector statuses land in the serve log.
|
|
179
|
-
args.accountBridge.logPreflight(args.accountRefs);
|
|
180
|
-
if (cloudCapable && args.publicUrl === undefined) {
|
|
181
|
-
args.logger(
|
|
182
|
-
args.cloudToolsBridge === true
|
|
183
|
-
? `[agent-sdk] agent "${label}": cloud-runtime turns reach filtered account connections through the host connection bridge (unfiltered ones fall back to the account's native connectors).`
|
|
184
|
-
: `[agent-sdk] agent "${label}": cloud-runtime turns omit the account bridge without --public-url (cloud agents fall back to the account's native connectors).`,
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return resolved;
|
|
190
|
-
}
|
package/src/internal/router.ts
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tiny path router: literal segments, `:param` captures, and a trailing
|
|
3
|
-
* `*param` catch-all, compiled once at server startup.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { AuthContext, AuthPolicy, RouteMethod } from "../types.js";
|
|
7
|
-
|
|
8
|
-
export interface ServerRouteContext {
|
|
9
|
-
params: Record<string, string>;
|
|
10
|
-
requestIp: string | null;
|
|
11
|
-
/** Resolved by the route's auth chain ("none" routes see null). */
|
|
12
|
-
auth: AuthContext | null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export type ServerRouteHandler = (
|
|
16
|
-
request: Request,
|
|
17
|
-
ctx: ServerRouteContext,
|
|
18
|
-
) => Response | Promise<Response>;
|
|
19
|
-
|
|
20
|
-
export interface ServerRoute {
|
|
21
|
-
method: RouteMethod;
|
|
22
|
-
/** Path pattern, e.g. `/v1/session/:sessionId/stream`. */
|
|
23
|
-
pattern: string;
|
|
24
|
-
/** Auth chain for the route; "none" mounts the route unauthenticated. */
|
|
25
|
-
auth: AuthPolicy[] | "none";
|
|
26
|
-
handler: ServerRouteHandler;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
type Segment =
|
|
30
|
-
| { kind: "literal"; value: string }
|
|
31
|
-
| { kind: "param"; name: string }
|
|
32
|
-
/** Trailing catch-all (`*name`): matches zero or more remaining segments. */
|
|
33
|
-
| { kind: "rest"; name: string };
|
|
34
|
-
|
|
35
|
-
interface CompiledRoute {
|
|
36
|
-
route: ServerRoute;
|
|
37
|
-
segments: Segment[];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface RouteMatch {
|
|
41
|
-
route: ServerRoute;
|
|
42
|
-
params: Record<string, string>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export class Router {
|
|
46
|
-
private readonly routes: CompiledRoute[] = [];
|
|
47
|
-
|
|
48
|
-
add(route: ServerRoute): void {
|
|
49
|
-
this.routes.push({ route, segments: compilePattern(route.pattern) });
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
match(method: string, pathname: string): RouteMatch | undefined {
|
|
53
|
-
const direct = this.matchExact(method, pathname);
|
|
54
|
-
if (direct !== undefined) {
|
|
55
|
-
return direct;
|
|
56
|
-
}
|
|
57
|
-
// HTTP: HEAD may be served by the corresponding GET handler (wget --spider,
|
|
58
|
-
// some load-balancer probes). Without this, GET-only routes return 405.
|
|
59
|
-
if (method === "HEAD") {
|
|
60
|
-
return this.matchExact("GET", pathname);
|
|
61
|
-
}
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
private matchExact(method: string, pathname: string): RouteMatch | undefined {
|
|
66
|
-
const pathSegments = splitPath(pathname);
|
|
67
|
-
for (const { route, segments } of this.routes) {
|
|
68
|
-
if (route.method !== method) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
const params = matchSegments(segments, pathSegments);
|
|
72
|
-
if (params !== undefined) {
|
|
73
|
-
return { route, params };
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** True when the path matches some route with a different method. */
|
|
80
|
-
hasPath(pathname: string): boolean {
|
|
81
|
-
const pathSegments = splitPath(pathname);
|
|
82
|
-
return this.routes.some(({ segments }) => matchSegments(segments, pathSegments) !== undefined);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function compilePattern(pattern: string): Segment[] {
|
|
87
|
-
const segments: Segment[] = splitPath(pattern).map(part =>
|
|
88
|
-
part.startsWith(":")
|
|
89
|
-
? { kind: "param", name: part.slice(1) }
|
|
90
|
-
: part.startsWith("*")
|
|
91
|
-
? { kind: "rest", name: part.slice(1) }
|
|
92
|
-
: { kind: "literal", value: part },
|
|
93
|
-
);
|
|
94
|
-
const restIndex = segments.findIndex(segment => segment.kind === "rest");
|
|
95
|
-
if (restIndex !== -1 && restIndex !== segments.length - 1) {
|
|
96
|
-
throw new Error(
|
|
97
|
-
`Route pattern "${pattern}" may only use a catch-all (*name) as the last segment.`,
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
return segments;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function splitPath(path: string): string[] {
|
|
104
|
-
return path.split("/").filter(part => part !== "");
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function matchSegments(
|
|
108
|
-
segments: Segment[],
|
|
109
|
-
pathSegments: string[],
|
|
110
|
-
): Record<string, string> | undefined {
|
|
111
|
-
const last = segments[segments.length - 1];
|
|
112
|
-
const hasRest = last !== undefined && last.kind === "rest";
|
|
113
|
-
if (hasRest) {
|
|
114
|
-
if (pathSegments.length < segments.length - 1) {
|
|
115
|
-
return undefined;
|
|
116
|
-
}
|
|
117
|
-
} else if (segments.length !== pathSegments.length) {
|
|
118
|
-
return undefined;
|
|
119
|
-
}
|
|
120
|
-
const params: Record<string, string> = {};
|
|
121
|
-
const fixedCount = hasRest ? segments.length - 1 : segments.length;
|
|
122
|
-
for (let i = 0; i < fixedCount; i++) {
|
|
123
|
-
const segment = segments[i];
|
|
124
|
-
const value = pathSegments[i];
|
|
125
|
-
if (segment === undefined || value === undefined) {
|
|
126
|
-
return undefined;
|
|
127
|
-
}
|
|
128
|
-
if (segment.kind === "literal") {
|
|
129
|
-
if (segment.value !== value) {
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
132
|
-
} else if (segment.kind === "param") {
|
|
133
|
-
params[segment.name] = decodeURIComponent(value);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
if (hasRest) {
|
|
137
|
-
params[last.name] = pathSegments
|
|
138
|
-
.slice(fixedCount)
|
|
139
|
-
.map(value => decodeURIComponent(value))
|
|
140
|
-
.join("/");
|
|
141
|
-
}
|
|
142
|
-
return params;
|
|
143
|
-
}
|