@cursor/bdk 0.2.9 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts.js +3 -5
- package/dist/bin/agent-serve.js +803 -812
- package/dist/channels/bitbucket/api.js +305 -321
- package/dist/channels/bitbucket/binding.js +97 -61
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
- package/dist/channels/bitbucket/checks.js +9 -21
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/defaults.js +14 -4
- package/dist/channels/bitbucket/events.js +1 -2
- package/dist/channels/bitbucket/index.d.ts +6 -2
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +6 -2
- package/dist/channels/bitbucket/replay.js +80 -56
- package/dist/channels/bitbucket/state.js +16 -7
- package/dist/channels/bitbucket/types.d.ts +11 -2
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/checks.js +18 -28
- package/dist/channels/deployments/deployments-channel.js +26 -34
- package/dist/channels/github/api.js +216 -210
- package/dist/channels/github/auth.d.ts +5 -1
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +157 -174
- package/dist/channels/github/binding.js +48 -39
- package/dist/channels/github/checks.js +9 -14
- package/dist/channels/github/cursor-account.js +6 -11
- package/dist/channels/github/defaults.js +105 -130
- package/dist/channels/github/forward.js +13 -17
- package/dist/channels/github/github-channel.d.ts +43 -2
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1228 -958
- package/dist/channels/github/progress.js +145 -146
- package/dist/channels/github/replay.js +30 -39
- package/dist/channels/github/state.js +40 -16
- package/dist/channels/github/types.d.ts +30 -6
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +100 -114
- package/dist/channels/gitlab/binding.js +52 -33
- package/dist/channels/gitlab/checks.js +28 -29
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/defaults.js +9 -3
- package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +95 -42
- package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +282 -249
- package/dist/channels/gitlab/index.d.ts +6 -2
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +6 -2
- package/dist/channels/gitlab/replay.js +50 -27
- package/dist/channels/gitlab/state.js +14 -6
- package/dist/channels/gitlab/types.d.ts +13 -2
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/api.js +100 -116
- package/dist/channels/origin/binding.js +15 -16
- package/dist/channels/origin/checks.js +30 -28
- package/dist/channels/origin/defaults.js +50 -65
- package/dist/channels/origin/origin-channel.js +266 -272
- package/dist/channels/origin/origin-webhook.js +70 -88
- package/dist/channels/origin/reactions.js +9 -21
- package/dist/channels/origin/state.js +13 -5
- package/dist/channels/slack/agentic-delivery.js +426 -478
- package/dist/channels/slack/agentic-posted.js +9 -10
- package/dist/channels/slack/agentic-signals.js +2 -3
- package/dist/channels/slack/api.js +417 -427
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/assistant.js +37 -47
- package/dist/channels/slack/attachments.js +188 -206
- package/dist/channels/slack/auth.js +8 -6
- package/dist/channels/slack/bot-mentions.js +31 -45
- package/dist/channels/slack/channel-watch.js +42 -48
- package/dist/channels/slack/cli-project.js +112 -137
- package/dist/channels/slack/code-fences.js +3 -5
- package/dist/channels/slack/constants.js +2 -2
- package/dist/channels/slack/credentials.js +23 -38
- package/dist/channels/slack/defaults.js +292 -331
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +533 -460
- package/dist/channels/slack/doctor.js +200 -214
- package/dist/channels/slack/eval-directive.js +79 -96
- package/dist/channels/slack/event-id-dedupe.js +1 -1
- package/dist/channels/slack/external-policy.js +26 -39
- package/dist/channels/slack/footer.js +28 -41
- package/dist/channels/slack/inbound.d.ts +1 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +50 -31
- package/dist/channels/slack/init.d.ts +1 -5
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +42 -59
- package/dist/channels/slack/interactive.d.ts +9 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +160 -162
- package/dist/channels/slack/links.js +1 -2
- package/dist/channels/slack/live-delivery.js +172 -190
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +44 -23
- package/dist/channels/slack/message-body.js +2 -2
- package/dist/channels/slack/nudge-carrier.js +30 -42
- package/dist/channels/slack/nudge-store.js +164 -191
- package/dist/channels/slack/paint-start.js +66 -81
- package/dist/channels/slack/placeholder.js +123 -152
- package/dist/channels/slack/pr-ref.js +1 -1
- package/dist/channels/slack/progress-delivery.js +65 -78
- package/dist/channels/slack/reasoning-card.js +36 -49
- package/dist/channels/slack/recording-sink.js +12 -24
- package/dist/channels/slack/reply-options.js +7 -12
- package/dist/channels/slack/self-identity.js +27 -35
- package/dist/channels/slack/sender-name.d.ts +12 -3
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +57 -61
- package/dist/channels/slack/setup.js +2 -4
- package/dist/channels/slack/slack-channel.d.ts +6 -4
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +441 -308
- package/dist/channels/slack/socket-mode.js +38 -52
- package/dist/channels/slack/thread-context.js +143 -160
- package/dist/channels/slack/tool-approval-events.js +149 -166
- package/dist/channels/slack/tool-cards.js +6 -11
- package/dist/channels/slack/tool-chip.js +1 -2
- package/dist/channels/slack/types.d.ts +15 -17
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.js +84 -97
- package/dist/channels/slack/user-info.js +27 -41
- package/dist/channels.js +9 -20
- package/dist/dashboard-session-url.js +3 -4
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
- package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
- package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
- package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
- package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
- package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/building-with-agents.md +2 -0
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +7 -0
- package/dist/docs/evals.html +36 -36
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +38 -38
- package/dist/docs/guides/bitbucket.md +9 -1
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +39 -39
- package/dist/docs/guides/github.md +20 -4
- package/dist/docs/guides/gitlab.html +38 -38
- package/dist/docs/guides/gitlab.md +9 -1
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/migrate.html +66 -0
- package/dist/docs/guides/migrate.md +122 -0
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +214 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +39 -38
- package/dist/docs/reference/cli.md +39 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +38 -38
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/docs/troubleshooting.md +1 -0
- package/dist/evals/assertions.js +20 -34
- package/dist/evals/expect.js +3 -6
- package/dist/evals/judge.js +5 -8
- package/dist/evals/loaders.js +45 -62
- package/dist/evals/matchers.js +2 -3
- package/dist/evals/reporters.js +43 -67
- package/dist/evals/results.js +1 -1
- package/dist/evals/run-facts.js +5 -6
- package/dist/evals.js +27 -15
- package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
- package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
- package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
- package/dist/extensions/jev/extension.js +3 -3
- package/dist/extensions/jev/lib/evaluate.js +43 -60
- package/dist/extensions/jev/tools/evaluate.js +6 -17
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions.js +3 -5
- package/dist/files-backends/cursor-hosted.js +504 -523
- package/dist/files-backends/local-fs.js +72 -134
- package/dist/files.js +3 -3
- package/dist/filesystem.js +562 -861
- package/dist/index.js +16 -35
- package/dist/internal/advertise-tools.js +74 -86
- package/dist/internal/artifacts-store.js +298 -361
- package/dist/internal/as-of.js +2 -4
- package/dist/internal/authored-alias-hooks.js +6 -4
- package/dist/internal/authored-loaders.js +37 -52
- package/dist/internal/bounded-int.js +1 -2
- package/dist/internal/bounded.js +13 -24
- package/dist/internal/brand.js +1 -1
- package/dist/internal/browser-origin-guard.js +4 -4
- package/dist/internal/builtin-tools/artifacts.js +15 -27
- package/dist/internal/builtin-tools/index.js +2 -3
- package/dist/internal/builtin-tools/reminders.js +33 -52
- package/dist/internal/channel-architecture.d.ts +21 -0
- package/dist/internal/channel-architecture.d.ts.map +1 -0
- package/dist/internal/channel-architecture.js +41 -0
- package/dist/internal/channel-dispatch.js +3 -4
- package/dist/internal/channel-route-dispatch.js +40 -51
- package/dist/internal/channel-state.js +1 -1
- package/dist/internal/chat-client.js +319 -340
- package/dist/internal/cli-ax.js +1262 -1294
- package/dist/internal/cli-bitbucket.js +244 -272
- package/dist/internal/cli-convert-automation.js +137 -151
- package/dist/internal/cli-cursor.js +126 -147
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +1457 -1507
- package/dist/internal/cli-docs.js +130 -147
- package/dist/internal/cli-github.js +437 -476
- package/dist/internal/cli-gitlab.js +259 -288
- package/dist/internal/cli-images.js +266 -334
- package/dist/internal/cli-manifest.js +25 -37
- package/dist/internal/cli-mcp-oauth.js +228 -247
- package/dist/internal/cli-mcp.js +358 -383
- package/dist/internal/cli-migrate.js +73 -90
- package/dist/internal/cli-skills.js +35 -47
- package/dist/internal/cli-slack-manual.d.ts +0 -1
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +175 -204
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +416 -456
- package/dist/internal/cloud-merge.js +7 -3
- package/dist/internal/cloud-turn-cost.js +8 -1
- package/dist/internal/connection-env.js +5 -6
- package/dist/internal/continuation-channel.js +10 -7
- package/dist/internal/continuation-identity.js +85 -67
- package/dist/internal/conversation-mirror.js +112 -131
- package/dist/internal/convert-automation/convert-workflow.js +21 -31
- package/dist/internal/cron.js +3 -3
- package/dist/internal/cursor/account-mcp.js +147 -146
- package/dist/internal/cursor/backend-client.js +290 -320
- package/dist/internal/cursor/bound-secret-file.js +3 -3
- package/dist/internal/cursor/credentials.js +127 -142
- package/dist/internal/cursor/cursor-api-transport.js +4 -8
- package/dist/internal/cursor/github-credentials.js +91 -108
- package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
- package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +5 -9
- package/dist/internal/cursor/session-token.js +36 -48
- package/dist/internal/cursor/store-api-client.js +77 -92
- package/dist/internal/cursor-account-mcp-auth.js +132 -149
- package/dist/internal/cursor-agent-template.js +1 -1
- package/dist/internal/cursor-deployment-relay.js +33 -54
- package/dist/internal/cursor-event-relay.js +65 -59
- package/dist/internal/cursor-relay-core.js +258 -286
- package/dist/internal/deferred-channel-session.js +3 -12
- package/dist/internal/deploy-client.js +410 -475
- package/dist/internal/deploy-manifest.d.ts +17 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +71 -21
- package/dist/internal/deploy-source.js +31 -43
- package/dist/internal/discovery/agent-config.js +45 -59
- package/dist/internal/discovery/agent.js +276 -280
- package/dist/internal/discovery/channels.js +67 -80
- package/dist/internal/discovery/connections.js +286 -296
- package/dist/internal/discovery/context.js +2 -13
- package/dist/internal/discovery/cursor-plugin.js +223 -259
- package/dist/internal/discovery/extension-overlay.js +104 -131
- package/dist/internal/discovery/extensions.js +276 -281
- package/dist/internal/discovery/fs.js +56 -79
- package/dist/internal/discovery/hooks.js +39 -50
- package/dist/internal/discovery/info.js +17 -19
- package/dist/internal/discovery/instructions.js +58 -71
- package/dist/internal/discovery/modules.js +45 -58
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +192 -215
- package/dist/internal/discovery/reminders.js +41 -52
- package/dist/internal/discovery/runtime.js +1 -1
- package/dist/internal/discovery/schedules.js +71 -82
- package/dist/internal/discovery/seed-files.js +21 -32
- package/dist/internal/discovery/services.js +74 -96
- package/dist/internal/discovery/skills.js +77 -94
- package/dist/internal/discovery/subagent.js +79 -95
- package/dist/internal/discovery/tools.js +12 -23
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +30 -45
- package/dist/internal/duration.js +1 -1
- package/dist/internal/env-file.js +48 -64
- package/dist/internal/eval-judge-model.js +17 -28
- package/dist/internal/eval-run-store.js +265 -254
- package/dist/internal/eval-runner.d.ts +8 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +406 -408
- package/dist/internal/eval-transport.d.ts +24 -0
- package/dist/internal/eval-transport.d.ts.map +1 -0
- package/dist/internal/eval-transport.js +22 -0
- package/dist/internal/evals-client.js +242 -246
- package/dist/internal/event-log.js +72 -120
- package/dist/internal/event-mapper.js +30 -31
- package/dist/internal/factory-resource-channel.js +16 -30
- package/dist/internal/filesystem/errors.js +6 -6
- package/dist/internal/filesystem/format.js +10 -13
- package/dist/internal/filesystem/merge.js +52 -94
- package/dist/internal/filesystem/nearest.js +15 -27
- package/dist/internal/filesystem/scratch.js +65 -85
- package/dist/internal/filesystem/tools.js +221 -241
- package/dist/internal/filesystem/walk.js +76 -143
- package/dist/internal/framework-file-storage.js +118 -139
- package/dist/internal/framework-storage-selection.js +21 -13
- package/dist/internal/frontmatter.js +4 -6
- package/dist/internal/github-fanout.js +50 -64
- package/dist/internal/guest-network.js +96 -109
- package/dist/internal/handleAgentServeTrigger.js +121 -126
- package/dist/internal/host-files.js +73 -88
- package/dist/internal/host-kv.js +21 -36
- package/dist/internal/host-otel.js +22 -19
- package/dist/internal/host-platforms.js +49 -63
- package/dist/internal/hosted-catch-protocol.d.ts +1 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +1 -0
- package/dist/internal/hosted-catch.d.ts +5 -3
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +84 -93
- package/dist/internal/hosted-delivery-protocol.js +32 -8
- package/dist/internal/hosted-delivery.d.ts +13 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +614 -584
- package/dist/internal/hosted-eval-cases.d.ts +21 -0
- package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
- package/dist/internal/hosted-eval-cases.js +162 -0
- package/dist/internal/hosted-execution-diag.js +38 -30
- package/dist/internal/hosted-execution-flush.js +75 -66
- package/dist/internal/hosted-execution-latency.js +16 -8
- package/dist/internal/hosted-managed-automation.js +2 -2
- package/dist/internal/hosting.js +2 -3
- package/dist/internal/http-channel-define.js +4 -1
- package/dist/internal/http-channel.js +101 -112
- package/dist/internal/http-control-plane-session.d.ts +18 -1
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +66 -32
- package/dist/internal/incoming-headers-to-fetch.js +1 -2
- package/dist/internal/init-interview.js +73 -93
- package/dist/internal/init-project.js +182 -214
- package/dist/internal/init-scaffold.js +10 -21
- package/dist/internal/inline-stdio-mcp.js +80 -86
- package/dist/internal/install-cursor-skills.js +231 -273
- package/dist/internal/legacy-command-guard.js +18 -31
- package/dist/internal/listen-port.js +34 -45
- package/dist/internal/local-control-plane.js +293 -307
- package/dist/internal/local-env.js +1 -1
- package/dist/internal/local-ingress.js +15 -9
- package/dist/internal/log-ring.js +1 -2
- package/dist/internal/logs-client.js +207 -227
- package/dist/internal/map-pool.js +24 -38
- package/dist/internal/mcp-endpoint.js +204 -180
- package/dist/internal/mcp-host.js +165 -168
- package/dist/internal/mcp-oauth-on-demand.js +170 -207
- package/dist/internal/mcp-oauth-persist.js +15 -29
- package/dist/internal/mcp-oauth.js +209 -266
- package/dist/internal/named-webhook-secret.d.ts +39 -0
- package/dist/internal/named-webhook-secret.d.ts.map +1 -0
- package/dist/internal/named-webhook-secret.js +47 -0
- package/dist/internal/open-browser.js +2 -3
- package/dist/internal/otel/collector.js +104 -68
- package/dist/internal/otel/config.js +24 -37
- package/dist/internal/otel/http.js +5 -7
- package/dist/internal/otel/mcp.js +3 -12
- package/dist/internal/otel/runtime.js +69 -83
- package/dist/internal/package-inline-stdio.js +57 -65
- package/dist/internal/peer-connections.js +9 -5
- package/dist/internal/platform-schedule-sync.js +39 -54
- package/dist/internal/platform-timers.js +176 -210
- package/dist/internal/playground/static.js +1 -2
- package/dist/internal/playground/toolchain.js +37 -53
- package/dist/internal/playground-proxy.js +230 -270
- package/dist/internal/process-memory-telemetry.js +33 -51
- package/dist/internal/prompt-context.js +3 -6
- package/dist/internal/reminder-control-plane-protocol.js +46 -13
- package/dist/internal/reminder-runner.js +770 -785
- package/dist/internal/reminder-schedule.js +1 -1
- package/dist/internal/reminder-store.js +57 -78
- package/dist/internal/request-error-status.js +1 -3
- package/dist/internal/request-headers.js +2 -2
- package/dist/internal/resolve-prod-target.js +119 -135
- package/dist/internal/resolved-connections.js +16 -6
- package/dist/internal/run-client.js +221 -229
- package/dist/internal/runtime-dispatch-runner.js +18 -43
- package/dist/internal/schedule-runner.js +49 -58
- package/dist/internal/scm/pr-url.js +7 -6
- package/dist/internal/sdk-runner.js +388 -363
- package/dist/internal/serve-restart.js +26 -39
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +1283 -1244
- package/dist/internal/session-cost.js +7 -9
- package/dist/internal/session-engine.d.ts +3 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +2801 -2777
- package/dist/internal/session-links.js +12 -16
- package/dist/internal/session-run-log.js +134 -82
- package/dist/internal/session-store.js +133 -164
- package/dist/internal/sessions-client.js +97 -118
- package/dist/internal/skill-catalog.js +18 -23
- package/dist/internal/skills-sync.js +16 -30
- package/dist/internal/slack-provision-client.js +90 -116
- package/dist/internal/start-log-store.js +48 -67
- package/dist/internal/steering.js +1 -2
- package/dist/internal/storage-coordinator.js +160 -196
- package/dist/internal/store-mirror.js +16 -30
- package/dist/internal/stream-progress.js +6 -8
- package/dist/internal/terminal-style.js +3 -4
- package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
- package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
- package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
- package/dist/internal/tool-catalog.js +11 -5
- package/dist/internal/tool-result.js +1 -1
- package/dist/internal/trajectory.js +19 -22
- package/dist/internal/turn-cost.js +52 -62
- package/dist/internal/turn-governor.js +5 -8
- package/dist/internal/turn-lease-store.js +85 -105
- package/dist/internal/turn-outbox.js +28 -43
- package/dist/internal/update-check.js +231 -259
- package/dist/internal/v2-hosting.js +1 -2
- package/dist/internal/workspace-sync.js +25 -41
- package/dist/internal/workspace.js +111 -139
- package/dist/kv/memory-kv.js +27 -51
- package/dist/memory.js +106 -148
- package/dist/otel.js +5 -8
- package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
- package/dist/playground/assets/{index-Co4CUVTQ.js → index-JekUQERK.js} +45 -45
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +2 -4
- package/dist/storage-backends/cursor-hosted-v2.js +53 -83
- package/dist/storage-backends/cursor-hosted.js +105 -145
- package/dist/storage-backends/file-kv.js +100 -128
- package/dist/storage-protocol.js +3 -5
- package/dist/storage.js +17 -26
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -18
- package/docs/building-with-agents.md +2 -0
- package/docs/deployment.md +7 -0
- package/docs/guides/bitbucket.md +9 -1
- package/docs/guides/github.md +20 -4
- package/docs/guides/gitlab.md +9 -1
- package/docs/guides/migrate.md +127 -0
- package/docs/reference/cli.md +39 -0
- package/docs/troubleshooting.md +1 -0
- package/package.json +1 -1
- package/skills/debug/SKILL.md +1 -0
- package/skills/github/SKILL.md +23 -0
- package/skills/migrate-v2/SKILL.md +51 -10
- package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
- package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
- package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
- /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
- /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -7,33 +7,24 @@
|
|
|
7
7
|
* as data or closures on a {@link RelayAdapter}, so this engine is written
|
|
8
8
|
* once and tested through each provider's relay.
|
|
9
9
|
*/
|
|
10
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
11
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
12
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
13
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
14
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
15
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
16
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
17
|
-
});
|
|
18
|
-
};
|
|
19
10
|
import { randomUUID } from "node:crypto";
|
|
20
11
|
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
21
12
|
import { join } from "node:path";
|
|
22
13
|
import { LOG_PREFIX } from "./distribution.js";
|
|
23
14
|
const OFFSET_SNAPSHOT_VERSION = 1;
|
|
24
|
-
const DEFAULT_POLL_WAIT_MS =
|
|
15
|
+
const DEFAULT_POLL_WAIT_MS = 25_000;
|
|
25
16
|
const DEFAULT_POLL_LIMIT = 100;
|
|
26
17
|
const DEFAULT_REGISTER_INTERVAL_MS = 5 * 60 * 1000;
|
|
27
18
|
const CONSUMER_ID_PATTERN = /^[a-zA-Z0-9_-]{1,64}$/;
|
|
28
19
|
const DEFAULT_IDLE_POLL_DELAY_MS = 250;
|
|
29
|
-
const MIN_BACKOFF_MS =
|
|
30
|
-
const MAX_BACKOFF_MS =
|
|
31
|
-
const AUTH_FAILURE_BACKOFF_MS =
|
|
20
|
+
const MIN_BACKOFF_MS = 1_000;
|
|
21
|
+
const MAX_BACKOFF_MS = 30_000;
|
|
22
|
+
const AUTH_FAILURE_BACKOFF_MS = 60_000;
|
|
32
23
|
/** Attempts per event before the offset advances past it. */
|
|
33
24
|
const DISPATCH_ATTEMPTS = 3;
|
|
34
|
-
const DISPATCH_RETRY_DELAYS_MS = [250,
|
|
25
|
+
const DISPATCH_RETRY_DELAYS_MS = [250, 1_000];
|
|
35
26
|
/** Budget for the best-effort deregistration PUT during stop(). */
|
|
36
|
-
const DEREGISTER_TIMEOUT_MS =
|
|
27
|
+
const DEREGISTER_TIMEOUT_MS = 1_500;
|
|
37
28
|
/** Durable offset snapshot under `<stateDir>/offset.json`. */
|
|
38
29
|
export class RelayOffsetStore {
|
|
39
30
|
constructor(stateDir) {
|
|
@@ -42,34 +33,30 @@ export class RelayOffsetStore {
|
|
|
42
33
|
get filePath() {
|
|
43
34
|
return join(this.stateDir, "offset.json");
|
|
44
35
|
}
|
|
45
|
-
load() {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return parsed.offset;
|
|
52
|
-
}
|
|
53
|
-
return undefined;
|
|
36
|
+
async load() {
|
|
37
|
+
try {
|
|
38
|
+
const raw = await readFile(this.filePath, "utf8");
|
|
39
|
+
const parsed = JSON.parse(raw);
|
|
40
|
+
if (parsed.version === OFFSET_SNAPSHOT_VERSION && typeof parsed.offset === "string") {
|
|
41
|
+
return parsed.offset;
|
|
54
42
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
59
48
|
}
|
|
60
|
-
save(offset) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
yield rename(tmpPath, this.filePath);
|
|
72
|
-
});
|
|
49
|
+
async save(offset) {
|
|
50
|
+
await mkdir(this.stateDir, { recursive: true });
|
|
51
|
+
const snapshot = {
|
|
52
|
+
version: OFFSET_SNAPSHOT_VERSION,
|
|
53
|
+
offset,
|
|
54
|
+
updatedAt: new Date().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
// Write-then-rename so a crash mid-write never corrupts the snapshot.
|
|
57
|
+
const tmpPath = `${this.filePath}.tmp`;
|
|
58
|
+
await writeFile(tmpPath, JSON.stringify(snapshot, null, 2), "utf8");
|
|
59
|
+
await rename(tmpPath, this.filePath);
|
|
73
60
|
}
|
|
74
61
|
}
|
|
75
62
|
/** Compare stream offsets (`<ms>-<seq>`). */
|
|
@@ -96,11 +83,10 @@ export const AGENT_SERVE_GENERATION_HEADER = "x-agent-serve-generation";
|
|
|
96
83
|
/** Must match server-shared `AGENT_SERVE_GENERATION_ENV_VAR`. */
|
|
97
84
|
export const AGENT_SERVE_GENERATION_ENV_VAR = "AGENT_SERVE_GENERATION";
|
|
98
85
|
export function resolveAgentServeDeploymentGeneration(explicit) {
|
|
99
|
-
var _a;
|
|
100
86
|
if (explicit !== undefined && Number.isSafeInteger(explicit) && explicit > 0) {
|
|
101
87
|
return explicit;
|
|
102
88
|
}
|
|
103
|
-
const raw =
|
|
89
|
+
const raw = process.env[AGENT_SERVE_GENERATION_ENV_VAR]?.trim();
|
|
104
90
|
if (raw === undefined || raw.length === 0) {
|
|
105
91
|
return undefined;
|
|
106
92
|
}
|
|
@@ -115,14 +101,13 @@ export function resolveAgentServeDeploymentGeneration(explicit) {
|
|
|
115
101
|
}
|
|
116
102
|
export class CursorRelayCore {
|
|
117
103
|
constructor(options) {
|
|
118
|
-
var _a;
|
|
119
104
|
this.options = options;
|
|
120
105
|
this.running = false;
|
|
121
106
|
this.consumerId = "";
|
|
122
107
|
/** Whether any registration succeeded (gates the stop-time deregister). */
|
|
123
108
|
this.registeredOnce = false;
|
|
124
109
|
this.offsetStore = new RelayOffsetStore(options.stateDir);
|
|
125
|
-
this.fetchImpl =
|
|
110
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
126
111
|
this.deploymentGeneration = resolveAgentServeDeploymentGeneration(options.deploymentGeneration);
|
|
127
112
|
}
|
|
128
113
|
start() {
|
|
@@ -137,19 +122,16 @@ export class CursorRelayCore {
|
|
|
137
122
|
* registration succeeded — anchoring "now" while unsubscribed would
|
|
138
123
|
* silently miss every delivery in between.
|
|
139
124
|
*/
|
|
140
|
-
run() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
(_b = (_a = this.registerTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
151
|
-
yield this.consumeLoop();
|
|
152
|
-
});
|
|
125
|
+
async run() {
|
|
126
|
+
await this.resolveConsumerId();
|
|
127
|
+
const registered = await this.registerUntilSuccess();
|
|
128
|
+
if (!registered)
|
|
129
|
+
return;
|
|
130
|
+
this.registerTimer = setInterval(() => {
|
|
131
|
+
this.heartbeatPromise = this.registerOnce();
|
|
132
|
+
}, DEFAULT_REGISTER_INTERVAL_MS);
|
|
133
|
+
this.registerTimer.unref?.();
|
|
134
|
+
await this.consumeLoop();
|
|
153
135
|
}
|
|
154
136
|
/**
|
|
155
137
|
* Durable consumer identity for this state root (memoized), so this host's
|
|
@@ -157,63 +139,57 @@ export class CursorRelayCore {
|
|
|
157
139
|
* survive restarts. Public so callers can bind transports with it before
|
|
158
140
|
* `start()` (the Slack relay proxies outbound calls under this id).
|
|
159
141
|
*/
|
|
160
|
-
resolveConsumerId() {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return existing;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
catch (_a) {
|
|
174
|
-
// Missing or unreadable: mint below.
|
|
175
|
-
}
|
|
176
|
-
const minted = randomUUID();
|
|
177
|
-
try {
|
|
178
|
-
yield mkdir(this.options.stateDir, { recursive: true });
|
|
179
|
-
const tmpPath = `${filePath}.tmp`;
|
|
180
|
-
yield writeFile(tmpPath, `${minted}\n`, "utf8");
|
|
181
|
-
yield rename(tmpPath, filePath);
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
this.log(`could not persist consumer id (${describeRelayError(error)}); using an ephemeral one for this run`);
|
|
142
|
+
async resolveConsumerId() {
|
|
143
|
+
if (this.consumerId !== "") {
|
|
144
|
+
return this.consumerId;
|
|
145
|
+
}
|
|
146
|
+
const filePath = join(this.options.stateDir, "consumer-id");
|
|
147
|
+
try {
|
|
148
|
+
const existing = (await readFile(filePath, "utf8")).trim();
|
|
149
|
+
if (CONSUMER_ID_PATTERN.test(existing)) {
|
|
150
|
+
this.consumerId = existing;
|
|
151
|
+
return existing;
|
|
185
152
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Missing or unreadable: mint below.
|
|
156
|
+
}
|
|
157
|
+
const minted = randomUUID();
|
|
158
|
+
try {
|
|
159
|
+
await mkdir(this.options.stateDir, { recursive: true });
|
|
160
|
+
const tmpPath = `${filePath}.tmp`;
|
|
161
|
+
await writeFile(tmpPath, `${minted}\n`, "utf8");
|
|
162
|
+
await rename(tmpPath, filePath);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
this.log(`could not persist consumer id (${describeRelayError(error)}); using an ephemeral one for this run`);
|
|
166
|
+
}
|
|
167
|
+
this.consumerId = minted;
|
|
168
|
+
return minted;
|
|
189
169
|
}
|
|
190
|
-
stop() {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
this.
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
// aborted); let it settle so it cannot land after the deregistration.
|
|
214
|
-
yield (_c = this.heartbeatPromise) === null || _c === void 0 ? void 0 : _c.catch(() => { });
|
|
215
|
-
yield this.deregister();
|
|
216
|
-
});
|
|
170
|
+
async stop() {
|
|
171
|
+
if (!this.running)
|
|
172
|
+
return;
|
|
173
|
+
this.running = false;
|
|
174
|
+
if (this.registerTimer !== undefined) {
|
|
175
|
+
clearInterval(this.registerTimer);
|
|
176
|
+
this.registerTimer = undefined;
|
|
177
|
+
}
|
|
178
|
+
this.abort?.abort();
|
|
179
|
+
// Bounded wait: server close must never hang on a poll that ignores the
|
|
180
|
+
// abort (offsets are saved as events are processed, so cutting the loop
|
|
181
|
+
// loose loses nothing).
|
|
182
|
+
await Promise.race([
|
|
183
|
+
this.consumePromise?.catch(() => { }),
|
|
184
|
+
new Promise(resolve => {
|
|
185
|
+
const timer = setTimeout(resolve, 2_000);
|
|
186
|
+
timer.unref?.();
|
|
187
|
+
}),
|
|
188
|
+
]);
|
|
189
|
+
// A heartbeat re-registration may be in flight (its fetch was just
|
|
190
|
+
// aborted); let it settle so it cannot land after the deregistration.
|
|
191
|
+
await this.heartbeatPromise?.catch(() => { });
|
|
192
|
+
await this.deregister();
|
|
217
193
|
}
|
|
218
194
|
/**
|
|
219
195
|
* Best-effort empty-scope PUT on clean stop, so this consumer's
|
|
@@ -222,102 +198,106 @@ export class CursorRelayCore {
|
|
|
222
198
|
* live and makes name routing ambiguous for a redeployed sibling with a
|
|
223
199
|
* fresh consumer id. Failures only log — the TTL still cleans up.
|
|
224
200
|
*/
|
|
225
|
-
deregister() {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
201
|
+
async deregister() {
|
|
202
|
+
const adapter = this.options.adapter;
|
|
203
|
+
if (adapter.buildDeregistrationBody === undefined ||
|
|
204
|
+
!this.registeredOnce ||
|
|
205
|
+
this.consumerId === "") {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const url = `${this.options.baseUrl.replace(/\/+$/, "")}${adapter.subscribePath}`;
|
|
209
|
+
const controller = new AbortController();
|
|
210
|
+
const timer = setTimeout(() => controller.abort(), DEREGISTER_TIMEOUT_MS);
|
|
211
|
+
timer.unref?.();
|
|
212
|
+
try {
|
|
213
|
+
const response = await this.fetchImpl(url, {
|
|
214
|
+
method: "PUT",
|
|
215
|
+
headers: {
|
|
216
|
+
authorization: `Bearer ${this.options.apiKey}`,
|
|
217
|
+
"content-type": "application/json",
|
|
218
|
+
...(this.deploymentGeneration === undefined
|
|
242
219
|
? {}
|
|
243
220
|
: {
|
|
244
221
|
[AGENT_SERVE_GENERATION_HEADER]: String(this.deploymentGeneration),
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
else {
|
|
253
|
-
this.log(`deregistration failed: ${response.status} (registration lapses by TTL)`);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
catch (error) {
|
|
257
|
-
this.log(`deregistration failed: ${describeRelayError(error)} (registration lapses by TTL)`);
|
|
222
|
+
}),
|
|
223
|
+
},
|
|
224
|
+
body: JSON.stringify(adapter.buildDeregistrationBody(this.consumerId)),
|
|
225
|
+
signal: controller.signal,
|
|
226
|
+
});
|
|
227
|
+
if (response.ok) {
|
|
228
|
+
this.log("deregistered on shutdown");
|
|
258
229
|
}
|
|
259
|
-
|
|
260
|
-
|
|
230
|
+
else {
|
|
231
|
+
this.log(`deregistration failed: ${response.status} (registration lapses by TTL)`);
|
|
261
232
|
}
|
|
262
|
-
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
this.log(`deregistration failed: ${describeRelayError(error)} (registration lapses by TTL)`);
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
clearTimeout(timer);
|
|
239
|
+
}
|
|
263
240
|
}
|
|
264
241
|
log(line) {
|
|
265
242
|
this.options.logger(`${LOG_PREFIX} ${this.options.adapter.logPrefix}: ${line}`);
|
|
266
243
|
}
|
|
267
|
-
request(method, path, body) {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
244
|
+
async request(method, path, body) {
|
|
245
|
+
const url = `${this.options.baseUrl.replace(/\/+$/, "")}${path}`;
|
|
246
|
+
return this.fetchImpl(url, {
|
|
247
|
+
method,
|
|
248
|
+
headers: {
|
|
249
|
+
authorization: `Bearer ${this.options.apiKey}`,
|
|
250
|
+
...(body === undefined ? {} : { "content-type": "application/json" }),
|
|
251
|
+
...(this.deploymentGeneration === undefined
|
|
271
252
|
? {}
|
|
272
253
|
: {
|
|
273
254
|
[AGENT_SERVE_GENERATION_HEADER]: String(this.deploymentGeneration),
|
|
274
|
-
})
|
|
255
|
+
}),
|
|
256
|
+
},
|
|
257
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
258
|
+
...(this.abort === undefined ? {} : { signal: this.abort.signal }),
|
|
275
259
|
});
|
|
276
260
|
}
|
|
277
261
|
/** Retry registration with backoff until it succeeds or the relay stops. */
|
|
278
|
-
registerUntilSuccess() {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
return true;
|
|
284
|
-
}
|
|
285
|
-
yield this.sleep(backoffMs);
|
|
286
|
-
backoffMs = Math.min(backoffMs * 2, MAX_BACKOFF_MS);
|
|
262
|
+
async registerUntilSuccess() {
|
|
263
|
+
let backoffMs = MIN_BACKOFF_MS;
|
|
264
|
+
while (this.running) {
|
|
265
|
+
if (await this.registerOnce()) {
|
|
266
|
+
return true;
|
|
287
267
|
}
|
|
288
|
-
|
|
289
|
-
|
|
268
|
+
await this.sleep(backoffMs);
|
|
269
|
+
backoffMs = Math.min(backoffMs * 2, MAX_BACKOFF_MS);
|
|
270
|
+
}
|
|
271
|
+
return false;
|
|
290
272
|
}
|
|
291
273
|
/**
|
|
292
274
|
* Register (or refresh) via the adapter. Returns true when the server
|
|
293
275
|
* accepted the registration (individual scopes may still have failed
|
|
294
276
|
* validation — the adapter logs those).
|
|
295
277
|
*/
|
|
296
|
-
registerOnce() {
|
|
297
|
-
|
|
298
|
-
|
|
278
|
+
async registerOnce() {
|
|
279
|
+
if (!this.running)
|
|
280
|
+
return false;
|
|
281
|
+
try {
|
|
282
|
+
const response = await this.request("PUT", this.options.adapter.subscribePath, this.options.adapter.buildRegistrationBody(this.consumerId));
|
|
283
|
+
if (!response.ok) {
|
|
284
|
+
const text = await response.text().catch(() => "");
|
|
285
|
+
this.logRegistrationOutcome([
|
|
286
|
+
`registration failed: ${response.status} ${text.slice(0, 300)}`,
|
|
287
|
+
]);
|
|
299
288
|
return false;
|
|
300
|
-
try {
|
|
301
|
-
const response = yield this.request("PUT", this.options.adapter.subscribePath, this.options.adapter.buildRegistrationBody(this.consumerId));
|
|
302
|
-
if (!response.ok) {
|
|
303
|
-
const text = yield response.text().catch(() => "");
|
|
304
|
-
this.logRegistrationOutcome([
|
|
305
|
-
`registration failed: ${response.status} ${text.slice(0, 300)}`,
|
|
306
|
-
]);
|
|
307
|
-
return false;
|
|
308
|
-
}
|
|
309
|
-
const json = (yield response.json());
|
|
310
|
-
this.logRegistrationOutcome(this.options.adapter.applyRegistrationResponse(json));
|
|
311
|
-
this.registeredOnce = true;
|
|
312
|
-
return true;
|
|
313
289
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
290
|
+
const json = (await response.json());
|
|
291
|
+
this.logRegistrationOutcome(this.options.adapter.applyRegistrationResponse(json));
|
|
292
|
+
this.registeredOnce = true;
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
if (this.isAbort(error))
|
|
318
297
|
return false;
|
|
319
|
-
}
|
|
320
|
-
|
|
298
|
+
this.logRegistrationOutcome([`registration error: ${describeRelayError(error)}`]);
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
321
301
|
}
|
|
322
302
|
/** Log registration outcome lines only when they change (heartbeat-quiet). */
|
|
323
303
|
logRegistrationOutcome(lines) {
|
|
@@ -329,80 +309,77 @@ export class CursorRelayCore {
|
|
|
329
309
|
this.log(line);
|
|
330
310
|
}
|
|
331
311
|
}
|
|
332
|
-
consumeLoop() {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
if (!anchorResponse.ok) {
|
|
345
|
-
backoffMs = yield this.backoffAfterHttpFailure(anchorResponse, backoffMs);
|
|
346
|
-
continue;
|
|
347
|
-
}
|
|
348
|
-
const anchor = (yield anchorResponse.json());
|
|
349
|
-
offset = anchor.nextOffset;
|
|
350
|
-
yield this.offsetStore.save(offset);
|
|
351
|
-
this.log(`anchored at offset "${offset}"`);
|
|
352
|
-
backoffMs = MIN_BACKOFF_MS;
|
|
353
|
-
continue;
|
|
354
|
-
}
|
|
355
|
-
const query = new URLSearchParams({
|
|
356
|
-
after: offset,
|
|
357
|
-
limit: String(DEFAULT_POLL_LIMIT),
|
|
358
|
-
waitMs: String((_a = this.options.pollWaitMs) !== null && _a !== void 0 ? _a : DEFAULT_POLL_WAIT_MS),
|
|
359
|
-
});
|
|
360
|
-
const response = yield this.request("GET", `${this.options.adapter.pollPath}?${query.toString()}`);
|
|
361
|
-
if (!response.ok) {
|
|
362
|
-
backoffMs = yield this.backoffAfterHttpFailure(response, backoffMs);
|
|
312
|
+
async consumeLoop() {
|
|
313
|
+
let backoffMs = MIN_BACKOFF_MS;
|
|
314
|
+
let offset = await this.offsetStore.load();
|
|
315
|
+
let announcedGap = false;
|
|
316
|
+
while (this.running) {
|
|
317
|
+
try {
|
|
318
|
+
if (offset === undefined) {
|
|
319
|
+
// First run: anchor at "now" so the agent does not replay (and
|
|
320
|
+
// react to) the retained backlog of old events.
|
|
321
|
+
const anchorResponse = await this.request("GET", `${this.options.adapter.pollPath}?after=%24&limit=1`);
|
|
322
|
+
if (!anchorResponse.ok) {
|
|
323
|
+
backoffMs = await this.backoffAfterHttpFailure(anchorResponse, backoffMs);
|
|
363
324
|
continue;
|
|
364
325
|
}
|
|
365
|
-
const
|
|
326
|
+
const anchor = (await anchorResponse.json());
|
|
327
|
+
offset = anchor.nextOffset;
|
|
328
|
+
await this.offsetStore.save(offset);
|
|
329
|
+
this.log(`anchored at offset "${offset}"`);
|
|
366
330
|
backoffMs = MIN_BACKOFF_MS;
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
const query = new URLSearchParams({
|
|
334
|
+
after: offset,
|
|
335
|
+
limit: String(DEFAULT_POLL_LIMIT),
|
|
336
|
+
waitMs: String(this.options.pollWaitMs ?? DEFAULT_POLL_WAIT_MS),
|
|
337
|
+
});
|
|
338
|
+
const response = await this.request("GET", `${this.options.adapter.pollPath}?${query.toString()}`);
|
|
339
|
+
if (!response.ok) {
|
|
340
|
+
backoffMs = await this.backoffAfterHttpFailure(response, backoffMs);
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const poll = (await response.json());
|
|
344
|
+
backoffMs = MIN_BACKOFF_MS;
|
|
345
|
+
if (poll.gapDetected && !announcedGap) {
|
|
346
|
+
announcedGap = true;
|
|
347
|
+
this.log("gap detected: events may have been trimmed while this host was offline; resuming from the oldest retained event");
|
|
348
|
+
}
|
|
349
|
+
if (poll.events.length > 0) {
|
|
350
|
+
announcedGap = false;
|
|
351
|
+
}
|
|
352
|
+
for (const event of poll.events) {
|
|
353
|
+
if (!this.running)
|
|
354
|
+
break;
|
|
355
|
+
// At-least-once dedupe: never re-dispatch at or before the last
|
|
356
|
+
// processed offset (reads are exclusive-after, so this only fires
|
|
357
|
+
// on replay after a crash between dispatch and save).
|
|
358
|
+
if (compareStreamOffsets(event.offset, offset) <= 0)
|
|
359
|
+
continue;
|
|
360
|
+
if (this.options.adapter.shouldDispatch(event)) {
|
|
361
|
+
await this.dispatchWithRetry(event);
|
|
395
362
|
}
|
|
363
|
+
offset = event.offset;
|
|
396
364
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
365
|
+
if (poll.nextOffset !== "" && compareStreamOffsets(poll.nextOffset, offset) > 0) {
|
|
366
|
+
offset = poll.nextOffset;
|
|
367
|
+
}
|
|
368
|
+
if (poll.events.length > 0) {
|
|
369
|
+
await this.offsetStore.save(offset);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
await this.sleep(DEFAULT_IDLE_POLL_DELAY_MS);
|
|
403
373
|
}
|
|
404
374
|
}
|
|
405
|
-
|
|
375
|
+
catch (error) {
|
|
376
|
+
if (this.isAbort(error))
|
|
377
|
+
return;
|
|
378
|
+
this.log(`poll error: ${describeRelayError(error)}`);
|
|
379
|
+
await this.sleep(backoffMs);
|
|
380
|
+
backoffMs = Math.min(backoffMs * 2, MAX_BACKOFF_MS);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
406
383
|
}
|
|
407
384
|
/**
|
|
408
385
|
* Dispatch one event with a small bounded retry before the offset advances
|
|
@@ -411,57 +388,52 @@ export class CursorRelayCore {
|
|
|
411
388
|
* only costs {@link DISPATCH_ATTEMPTS} tries and is then skipped, keeping
|
|
412
389
|
* at-least-once semantics without a retry loop.
|
|
413
390
|
*/
|
|
414
|
-
dispatchWithRetry(event) {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
391
|
+
async dispatchWithRetry(event) {
|
|
392
|
+
for (let attempt = 1; attempt <= DISPATCH_ATTEMPTS; attempt++) {
|
|
393
|
+
if (attempt > 1 && !this.running) {
|
|
394
|
+
this.log(`dispatch abandoned at offset ${event.offset}: relay stopping`);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
try {
|
|
398
|
+
await this.options.adapter.dispatch(event);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
if (attempt === DISPATCH_ATTEMPTS) {
|
|
403
|
+
this.log(`dispatch failed at offset ${event.offset} after ${attempt} attempts: ${describeRelayError(error)}`);
|
|
423
404
|
return;
|
|
424
405
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
this.log(`dispatch failed at offset ${event.offset} after ${attempt} attempts: ${describeRelayError(error)}`);
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
this.log(`dispatch attempt ${attempt} failed at offset ${event.offset}: ${describeRelayError(error)}; retrying`);
|
|
431
|
-
yield this.sleep(DISPATCH_RETRY_DELAYS_MS[Math.min(attempt - 1, DISPATCH_RETRY_DELAYS_MS.length - 1)]);
|
|
432
|
-
}
|
|
406
|
+
this.log(`dispatch attempt ${attempt} failed at offset ${event.offset}: ${describeRelayError(error)}; retrying`);
|
|
407
|
+
await this.sleep(DISPATCH_RETRY_DELAYS_MS[Math.min(attempt - 1, DISPATCH_RETRY_DELAYS_MS.length - 1)]);
|
|
433
408
|
}
|
|
434
|
-
}
|
|
409
|
+
}
|
|
435
410
|
}
|
|
436
411
|
/** Log the failure, sleep, and return the backoff for the NEXT failure. */
|
|
437
|
-
backoffAfterHttpFailure(response, backoffMs) {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
return isAuthOrFenceFailure ? AUTH_FAILURE_BACKOFF_MS : Math.min(backoffMs * 2, MAX_BACKOFF_MS);
|
|
447
|
-
});
|
|
412
|
+
async backoffAfterHttpFailure(response, backoffMs) {
|
|
413
|
+
// 409 = generation fence (stale resident after redeploy). Same long
|
|
414
|
+
// backoff as auth: retrying every second cannot heal a wrong generation.
|
|
415
|
+
const isAuthOrFenceFailure = response.status === 401 || response.status === 403 || response.status === 409;
|
|
416
|
+
const sleepMs = isAuthOrFenceFailure ? AUTH_FAILURE_BACKOFF_MS : backoffMs;
|
|
417
|
+
const text = await response.text().catch(() => "");
|
|
418
|
+
this.log(`poll failed: ${response.status} ${text.slice(0, 300)} (retrying in ${Math.round(sleepMs / 1000)}s)`);
|
|
419
|
+
await this.sleep(sleepMs);
|
|
420
|
+
return isAuthOrFenceFailure ? AUTH_FAILURE_BACKOFF_MS : Math.min(backoffMs * 2, MAX_BACKOFF_MS);
|
|
448
421
|
}
|
|
449
422
|
sleep(ms) {
|
|
450
423
|
return new Promise(resolve => {
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
if ((signal === null || signal === void 0 ? void 0 : signal.aborted) === true) {
|
|
424
|
+
const signal = this.abort?.signal;
|
|
425
|
+
if (signal?.aborted === true) {
|
|
454
426
|
resolve();
|
|
455
427
|
return;
|
|
456
428
|
}
|
|
457
429
|
const finish = () => {
|
|
458
430
|
clearTimeout(timer);
|
|
459
|
-
signal
|
|
431
|
+
signal?.removeEventListener("abort", finish);
|
|
460
432
|
resolve();
|
|
461
433
|
};
|
|
462
434
|
const timer = setTimeout(finish, ms);
|
|
463
|
-
|
|
464
|
-
signal
|
|
435
|
+
timer.unref?.();
|
|
436
|
+
signal?.addEventListener("abort", finish, { once: true });
|
|
465
437
|
});
|
|
466
438
|
}
|
|
467
439
|
isAbort(error) {
|