@cursor/bdk 0.2.8 → 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.
Files changed (581) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.d.ts +1 -0
  3. package/dist/bin/agent-serve.d.ts.map +1 -1
  4. package/dist/bin/agent-serve.js +820 -807
  5. package/dist/channels/bitbucket/api.js +305 -321
  6. package/dist/channels/bitbucket/binding.js +97 -61
  7. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  8. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  10. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  11. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  12. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  13. package/dist/channels/bitbucket/checks.js +9 -21
  14. package/dist/channels/bitbucket/cursor-account.js +1 -1
  15. package/dist/channels/bitbucket/defaults.js +14 -4
  16. package/dist/channels/bitbucket/events.js +1 -2
  17. package/dist/channels/bitbucket/index.d.ts +6 -2
  18. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  19. package/dist/channels/bitbucket/index.js +6 -2
  20. package/dist/channels/bitbucket/replay.js +80 -56
  21. package/dist/channels/bitbucket/state.js +16 -7
  22. package/dist/channels/bitbucket/types.d.ts +11 -2
  23. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  24. package/dist/channels/checks.js +18 -28
  25. package/dist/channels/deployments/deployments-channel.js +26 -34
  26. package/dist/channels/github/api.js +216 -210
  27. package/dist/channels/github/auth.d.ts +5 -1
  28. package/dist/channels/github/auth.d.ts.map +1 -1
  29. package/dist/channels/github/auth.js +157 -174
  30. package/dist/channels/github/binding.js +48 -39
  31. package/dist/channels/github/checks.js +9 -14
  32. package/dist/channels/github/cursor-account.js +6 -11
  33. package/dist/channels/github/defaults.js +105 -130
  34. package/dist/channels/github/forward.js +13 -17
  35. package/dist/channels/github/github-channel.d.ts +43 -2
  36. package/dist/channels/github/github-channel.d.ts.map +1 -1
  37. package/dist/channels/github/github-channel.js +1228 -958
  38. package/dist/channels/github/progress.js +145 -146
  39. package/dist/channels/github/replay.js +30 -39
  40. package/dist/channels/github/state.js +40 -16
  41. package/dist/channels/github/types.d.ts +30 -6
  42. package/dist/channels/github/types.d.ts.map +1 -1
  43. package/dist/channels/gitlab/api.js +100 -114
  44. package/dist/channels/gitlab/binding.js +52 -33
  45. package/dist/channels/gitlab/checks.js +28 -29
  46. package/dist/channels/gitlab/cursor-account.js +1 -1
  47. package/dist/channels/gitlab/defaults.js +9 -3
  48. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  49. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  50. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  51. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  52. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  53. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  54. package/dist/channels/gitlab/index.d.ts +6 -2
  55. package/dist/channels/gitlab/index.d.ts.map +1 -1
  56. package/dist/channels/gitlab/index.js +6 -2
  57. package/dist/channels/gitlab/replay.js +50 -27
  58. package/dist/channels/gitlab/state.js +14 -6
  59. package/dist/channels/gitlab/types.d.ts +13 -2
  60. package/dist/channels/gitlab/types.d.ts.map +1 -1
  61. package/dist/channels/origin/api.js +100 -116
  62. package/dist/channels/origin/binding.js +15 -16
  63. package/dist/channels/origin/checks.js +30 -28
  64. package/dist/channels/origin/defaults.js +50 -65
  65. package/dist/channels/origin/origin-channel.js +266 -272
  66. package/dist/channels/origin/origin-webhook.js +70 -88
  67. package/dist/channels/origin/reactions.js +9 -21
  68. package/dist/channels/origin/state.js +13 -5
  69. package/dist/channels/slack/agentic-delivery.js +426 -478
  70. package/dist/channels/slack/agentic-posted.js +9 -10
  71. package/dist/channels/slack/agentic-signals.js +2 -3
  72. package/dist/channels/slack/api.js +417 -427
  73. package/dist/channels/slack/approvals.js +1 -1
  74. package/dist/channels/slack/assistant.js +37 -47
  75. package/dist/channels/slack/attachments.js +188 -206
  76. package/dist/channels/slack/auth.js +8 -6
  77. package/dist/channels/slack/bot-mentions.js +31 -45
  78. package/dist/channels/slack/channel-watch.js +42 -48
  79. package/dist/channels/slack/cli-project.js +112 -137
  80. package/dist/channels/slack/code-fences.js +3 -5
  81. package/dist/channels/slack/constants.js +2 -2
  82. package/dist/channels/slack/credentials.js +23 -38
  83. package/dist/channels/slack/defaults.js +292 -331
  84. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  85. package/dist/channels/slack/dispatch.js +533 -460
  86. package/dist/channels/slack/doctor.js +200 -214
  87. package/dist/channels/slack/eval-directive.js +79 -96
  88. package/dist/channels/slack/event-id-dedupe.js +1 -1
  89. package/dist/channels/slack/external-policy.js +26 -39
  90. package/dist/channels/slack/footer.js +28 -41
  91. package/dist/channels/slack/inbound.d.ts +1 -0
  92. package/dist/channels/slack/inbound.d.ts.map +1 -1
  93. package/dist/channels/slack/inbound.js +50 -31
  94. package/dist/channels/slack/init.d.ts +1 -5
  95. package/dist/channels/slack/init.d.ts.map +1 -1
  96. package/dist/channels/slack/init.js +42 -59
  97. package/dist/channels/slack/interactive.d.ts +9 -3
  98. package/dist/channels/slack/interactive.d.ts.map +1 -1
  99. package/dist/channels/slack/interactive.js +160 -162
  100. package/dist/channels/slack/links.js +1 -2
  101. package/dist/channels/slack/live-delivery.js +172 -190
  102. package/dist/channels/slack/manifest.d.ts.map +1 -1
  103. package/dist/channels/slack/manifest.js +44 -23
  104. package/dist/channels/slack/message-body.js +2 -2
  105. package/dist/channels/slack/nudge-carrier.js +30 -42
  106. package/dist/channels/slack/nudge-store.js +164 -191
  107. package/dist/channels/slack/paint-start.js +66 -81
  108. package/dist/channels/slack/placeholder.js +123 -152
  109. package/dist/channels/slack/pr-ref.js +1 -1
  110. package/dist/channels/slack/progress-delivery.js +65 -78
  111. package/dist/channels/slack/reasoning-card.js +36 -49
  112. package/dist/channels/slack/recording-sink.js +12 -24
  113. package/dist/channels/slack/reply-options.js +7 -12
  114. package/dist/channels/slack/self-identity.js +27 -35
  115. package/dist/channels/slack/sender-name.d.ts +12 -3
  116. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  117. package/dist/channels/slack/sender-name.js +57 -61
  118. package/dist/channels/slack/setup.js +2 -4
  119. package/dist/channels/slack/slack-channel.d.ts +6 -4
  120. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  121. package/dist/channels/slack/slack-channel.js +441 -308
  122. package/dist/channels/slack/socket-mode.js +38 -52
  123. package/dist/channels/slack/thread-context.js +143 -160
  124. package/dist/channels/slack/tool-approval-events.js +149 -166
  125. package/dist/channels/slack/tool-cards.js +6 -11
  126. package/dist/channels/slack/tool-chip.js +1 -2
  127. package/dist/channels/slack/types.d.ts +15 -17
  128. package/dist/channels/slack/types.d.ts.map +1 -1
  129. package/dist/channels/slack/upload.js +84 -97
  130. package/dist/channels/slack/user-info.js +27 -41
  131. package/dist/channels.js +9 -20
  132. package/dist/dashboard-session-url.js +3 -4
  133. package/dist/docs/404.html +2 -2
  134. package/dist/docs/assets/{app.oyjtOr3W.js → app.DXI7bwox.js} +4 -4
  135. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  136. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  137. package/dist/docs/assets/chunks/{VPLocalSearchBox.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  138. package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
  139. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  140. package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
  141. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  142. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  143. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  144. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  150. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  151. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  152. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  153. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  154. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  155. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  156. package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  159. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  160. package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  161. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  162. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  163. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  164. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  165. package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
  166. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  167. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  168. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  169. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  170. package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
  171. package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
  172. package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
  173. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  174. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  175. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  176. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  177. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  178. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  179. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  180. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  181. package/dist/docs/assets/chunks/{theme.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
  182. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  183. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  184. package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
  185. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  186. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  187. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  188. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  189. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  191. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  192. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  193. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  194. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  195. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  196. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  197. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  198. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  199. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  200. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  201. package/dist/docs/building-with-agents.html +37 -37
  202. package/dist/docs/building-with-agents.md +2 -0
  203. package/dist/docs/deployment.html +38 -38
  204. package/dist/docs/deployment.md +7 -0
  205. package/dist/docs/evals.html +36 -36
  206. package/dist/docs/guides/agent-to-agent.html +35 -35
  207. package/dist/docs/guides/bitbucket.html +38 -38
  208. package/dist/docs/guides/bitbucket.md +9 -1
  209. package/dist/docs/guides/cloud-agents.html +35 -35
  210. package/dist/docs/guides/convert-automation.html +35 -35
  211. package/dist/docs/guides/github.html +39 -39
  212. package/dist/docs/guides/github.md +20 -4
  213. package/dist/docs/guides/gitlab.html +38 -38
  214. package/dist/docs/guides/gitlab.md +9 -1
  215. package/dist/docs/guides/grokbot-agents.html +35 -35
  216. package/dist/docs/guides/hooks.html +35 -35
  217. package/dist/docs/guides/improve.html +35 -35
  218. package/dist/docs/guides/jev.html +35 -35
  219. package/dist/docs/guides/mcp-oauth.html +35 -35
  220. package/dist/docs/guides/migrate.html +66 -0
  221. package/dist/docs/guides/migrate.md +122 -0
  222. package/dist/docs/guides/opentelemetry.html +35 -35
  223. package/dist/docs/guides/slack.html +35 -35
  224. package/dist/docs/guides/webhooks.html +35 -35
  225. package/dist/docs/hashmap.json +1 -1
  226. package/dist/docs/hillclimbing.html +35 -35
  227. package/dist/docs/index.html +35 -35
  228. package/dist/docs/llms-full.txt +214 -6
  229. package/dist/docs/llms.txt +1 -0
  230. package/dist/docs/quickstart.html +35 -35
  231. package/dist/docs/reference/agent-config.html +35 -35
  232. package/dist/docs/reference/artifacts.html +35 -35
  233. package/dist/docs/reference/channels.html +35 -35
  234. package/dist/docs/reference/cli.html +39 -38
  235. package/dist/docs/reference/cli.md +39 -0
  236. package/dist/docs/reference/connections.html +35 -35
  237. package/dist/docs/reference/evals.html +35 -35
  238. package/dist/docs/reference/extensions.html +35 -35
  239. package/dist/docs/reference/hooks.html +35 -35
  240. package/dist/docs/reference/http-api.html +35 -35
  241. package/dist/docs/reference/instructions.html +35 -35
  242. package/dist/docs/reference/playground.html +35 -35
  243. package/dist/docs/reference/project-layout.html +35 -35
  244. package/dist/docs/reference/prompt.html +35 -35
  245. package/dist/docs/reference/schedules.html +35 -35
  246. package/dist/docs/reference/sessions.html +35 -35
  247. package/dist/docs/reference/skills.html +38 -38
  248. package/dist/docs/reference/subagents.html +35 -35
  249. package/dist/docs/reference/tools.html +35 -35
  250. package/dist/docs/templates/agentic-owners.html +35 -35
  251. package/dist/docs/templates/grokbot-agents.html +35 -35
  252. package/dist/docs/templates/security-reviewer.html +35 -35
  253. package/dist/docs/templates/thermo-quality-review.html +35 -35
  254. package/dist/docs/templates/thermo-review.html +35 -35
  255. package/dist/docs/templates/triage.html +35 -35
  256. package/dist/docs/troubleshooting.html +36 -36
  257. package/dist/docs/troubleshooting.md +1 -0
  258. package/dist/evals/assertions.js +20 -34
  259. package/dist/evals/expect.js +3 -6
  260. package/dist/evals/judge.js +5 -8
  261. package/dist/evals/loaders.js +45 -62
  262. package/dist/evals/matchers.js +2 -3
  263. package/dist/evals/reporters.js +43 -67
  264. package/dist/evals/results.js +1 -1
  265. package/dist/evals/run-facts.js +5 -6
  266. package/dist/evals.js +27 -15
  267. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  268. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +0 -1
  269. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  270. package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
  271. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  272. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  273. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  274. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  275. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  276. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  277. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  278. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  279. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  280. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -1
  281. package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
  282. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  283. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  284. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  285. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  286. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  287. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  288. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  289. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  290. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  291. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  292. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  293. package/dist/extensions/jev/extension.js +3 -3
  294. package/dist/extensions/jev/lib/evaluate.js +43 -60
  295. package/dist/extensions/jev/tools/evaluate.js +6 -17
  296. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  297. package/dist/extensions.js +3 -5
  298. package/dist/files-backends/cursor-hosted.js +504 -523
  299. package/dist/files-backends/local-fs.js +72 -134
  300. package/dist/files.js +3 -3
  301. package/dist/filesystem.js +562 -861
  302. package/dist/index.js +16 -35
  303. package/dist/internal/advertise-tools.js +74 -86
  304. package/dist/internal/artifacts-store.js +298 -361
  305. package/dist/internal/as-of.js +2 -4
  306. package/dist/internal/authored-alias-hooks.js +6 -4
  307. package/dist/internal/authored-loaders.js +37 -52
  308. package/dist/internal/bounded-int.js +1 -2
  309. package/dist/internal/bounded.js +13 -24
  310. package/dist/internal/brand.js +1 -1
  311. package/dist/internal/browser-origin-guard.js +4 -4
  312. package/dist/internal/builtin-tools/artifacts.js +15 -27
  313. package/dist/internal/builtin-tools/index.js +2 -3
  314. package/dist/internal/builtin-tools/reminders.js +33 -52
  315. package/dist/internal/channel-architecture.d.ts +21 -0
  316. package/dist/internal/channel-architecture.d.ts.map +1 -0
  317. package/dist/internal/channel-architecture.js +41 -0
  318. package/dist/internal/channel-dispatch.js +3 -4
  319. package/dist/internal/channel-route-dispatch.js +40 -51
  320. package/dist/internal/channel-state.js +1 -1
  321. package/dist/internal/chat-client.js +319 -340
  322. package/dist/internal/cli-ax.js +1262 -1294
  323. package/dist/internal/cli-bitbucket.js +244 -272
  324. package/dist/internal/cli-convert-automation.js +137 -151
  325. package/dist/internal/cli-cursor.js +126 -147
  326. package/dist/internal/cli-deploy.d.ts.map +1 -1
  327. package/dist/internal/cli-deploy.js +1457 -1507
  328. package/dist/internal/cli-docs.js +130 -147
  329. package/dist/internal/cli-github.js +437 -476
  330. package/dist/internal/cli-gitlab.js +259 -288
  331. package/dist/internal/cli-images.js +266 -334
  332. package/dist/internal/cli-manifest.js +25 -37
  333. package/dist/internal/cli-mcp-oauth.js +228 -247
  334. package/dist/internal/cli-mcp.js +358 -383
  335. package/dist/internal/cli-migrate.d.ts +18 -0
  336. package/dist/internal/cli-migrate.d.ts.map +1 -0
  337. package/dist/internal/cli-migrate.js +136 -0
  338. package/dist/internal/cli-skills.js +35 -47
  339. package/dist/internal/cli-slack-manual.d.ts +0 -1
  340. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  341. package/dist/internal/cli-slack-manual.js +175 -204
  342. package/dist/internal/cli-slack.d.ts +1 -1
  343. package/dist/internal/cli-slack.d.ts.map +1 -1
  344. package/dist/internal/cli-slack.js +416 -456
  345. package/dist/internal/cloud-merge.js +7 -3
  346. package/dist/internal/cloud-turn-cost.js +8 -1
  347. package/dist/internal/connection-env.js +5 -6
  348. package/dist/internal/continuation-channel.js +10 -7
  349. package/dist/internal/continuation-identity.js +85 -67
  350. package/dist/internal/conversation-mirror.js +112 -131
  351. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  352. package/dist/internal/cron.js +3 -3
  353. package/dist/internal/cursor/account-mcp.js +147 -146
  354. package/dist/internal/cursor/backend-client.js +290 -320
  355. package/dist/internal/cursor/bound-secret-file.js +3 -3
  356. package/dist/internal/cursor/credentials.d.ts +1 -0
  357. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  358. package/dist/internal/cursor/credentials.js +130 -142
  359. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  360. package/dist/internal/cursor/github-credentials.js +91 -108
  361. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  362. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  363. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  364. package/dist/internal/cursor/session-token.js +36 -48
  365. package/dist/internal/cursor/store-api-client.js +77 -92
  366. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  367. package/dist/internal/cursor-agent-template.js +1 -1
  368. package/dist/internal/cursor-deployment-relay.js +33 -54
  369. package/dist/internal/cursor-event-relay.js +65 -59
  370. package/dist/internal/cursor-relay-core.js +258 -286
  371. package/dist/internal/deferred-channel-session.js +3 -12
  372. package/dist/internal/deploy-client.js +410 -475
  373. package/dist/internal/deploy-manifest.d.ts +17 -0
  374. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  375. package/dist/internal/deploy-manifest.js +71 -21
  376. package/dist/internal/deploy-source.js +31 -43
  377. package/dist/internal/discovery/agent-config.js +45 -59
  378. package/dist/internal/discovery/agent.js +276 -280
  379. package/dist/internal/discovery/channels.js +67 -80
  380. package/dist/internal/discovery/connections.js +286 -296
  381. package/dist/internal/discovery/context.js +2 -13
  382. package/dist/internal/discovery/cursor-plugin.js +223 -259
  383. package/dist/internal/discovery/extension-overlay.js +104 -131
  384. package/dist/internal/discovery/extensions.js +276 -281
  385. package/dist/internal/discovery/fs.js +56 -79
  386. package/dist/internal/discovery/hooks.js +39 -50
  387. package/dist/internal/discovery/info.js +17 -19
  388. package/dist/internal/discovery/instructions.js +58 -71
  389. package/dist/internal/discovery/modules.js +45 -58
  390. package/dist/internal/discovery/project.d.ts.map +1 -1
  391. package/dist/internal/discovery/project.js +192 -215
  392. package/dist/internal/discovery/reminders.js +41 -52
  393. package/dist/internal/discovery/runtime.js +1 -1
  394. package/dist/internal/discovery/schedules.js +71 -82
  395. package/dist/internal/discovery/seed-files.js +21 -32
  396. package/dist/internal/discovery/services.js +74 -96
  397. package/dist/internal/discovery/skills.js +77 -94
  398. package/dist/internal/discovery/subagent.js +79 -95
  399. package/dist/internal/discovery/tools.js +12 -23
  400. package/dist/internal/distribution.js +2 -2
  401. package/dist/internal/docs-site.js +30 -45
  402. package/dist/internal/duration.js +1 -1
  403. package/dist/internal/env-file.js +48 -64
  404. package/dist/internal/eval-judge-model.js +17 -28
  405. package/dist/internal/eval-run-store.js +265 -254
  406. package/dist/internal/eval-runner.d.ts +8 -0
  407. package/dist/internal/eval-runner.d.ts.map +1 -1
  408. package/dist/internal/eval-runner.js +406 -408
  409. package/dist/internal/eval-transport.d.ts +24 -0
  410. package/dist/internal/eval-transport.d.ts.map +1 -0
  411. package/dist/internal/eval-transport.js +22 -0
  412. package/dist/internal/evals-client.js +242 -246
  413. package/dist/internal/event-log.js +72 -120
  414. package/dist/internal/event-mapper.js +30 -31
  415. package/dist/internal/factory-resource-channel.js +16 -30
  416. package/dist/internal/filesystem/errors.js +6 -6
  417. package/dist/internal/filesystem/format.js +10 -13
  418. package/dist/internal/filesystem/merge.js +52 -94
  419. package/dist/internal/filesystem/nearest.js +15 -27
  420. package/dist/internal/filesystem/scratch.js +65 -85
  421. package/dist/internal/filesystem/tools.js +221 -241
  422. package/dist/internal/filesystem/walk.js +76 -143
  423. package/dist/internal/framework-file-storage.js +118 -139
  424. package/dist/internal/framework-storage-selection.js +21 -13
  425. package/dist/internal/frontmatter.js +4 -6
  426. package/dist/internal/github-fanout.js +50 -64
  427. package/dist/internal/guest-network.js +96 -109
  428. package/dist/internal/handleAgentServeTrigger.js +121 -126
  429. package/dist/internal/host-files.js +73 -88
  430. package/dist/internal/host-kv.js +21 -36
  431. package/dist/internal/host-otel.js +22 -19
  432. package/dist/internal/host-platforms.js +49 -63
  433. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  434. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  435. package/dist/internal/hosted-catch-protocol.js +1 -0
  436. package/dist/internal/hosted-catch.d.ts +5 -3
  437. package/dist/internal/hosted-catch.d.ts.map +1 -1
  438. package/dist/internal/hosted-catch.js +84 -93
  439. package/dist/internal/hosted-delivery-protocol.js +32 -8
  440. package/dist/internal/hosted-delivery.d.ts +13 -1
  441. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  442. package/dist/internal/hosted-delivery.js +614 -584
  443. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  444. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  445. package/dist/internal/hosted-eval-cases.js +162 -0
  446. package/dist/internal/hosted-execution-diag.js +38 -30
  447. package/dist/internal/hosted-execution-flush.js +75 -66
  448. package/dist/internal/hosted-execution-latency.js +16 -8
  449. package/dist/internal/hosted-managed-automation.js +2 -2
  450. package/dist/internal/hosting.js +2 -3
  451. package/dist/internal/http-channel-define.js +4 -1
  452. package/dist/internal/http-channel.js +101 -112
  453. package/dist/internal/http-control-plane-session.d.ts +18 -1
  454. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  455. package/dist/internal/http-control-plane-session.js +66 -32
  456. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  457. package/dist/internal/init-interview.js +73 -93
  458. package/dist/internal/init-project.js +182 -214
  459. package/dist/internal/init-scaffold.js +10 -21
  460. package/dist/internal/inline-stdio-mcp.js +80 -86
  461. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  462. package/dist/internal/install-cursor-skills.js +238 -274
  463. package/dist/internal/legacy-command-guard.js +18 -31
  464. package/dist/internal/listen-port.js +34 -45
  465. package/dist/internal/local-control-plane.js +293 -307
  466. package/dist/internal/local-env.js +1 -1
  467. package/dist/internal/local-ingress.js +15 -9
  468. package/dist/internal/log-ring.js +1 -2
  469. package/dist/internal/logs-client.js +207 -227
  470. package/dist/internal/map-pool.js +24 -38
  471. package/dist/internal/mcp-endpoint.js +204 -180
  472. package/dist/internal/mcp-host.js +165 -168
  473. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  474. package/dist/internal/mcp-oauth-persist.js +15 -29
  475. package/dist/internal/mcp-oauth.js +209 -266
  476. package/dist/internal/named-webhook-secret.d.ts +39 -0
  477. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  478. package/dist/internal/named-webhook-secret.js +47 -0
  479. package/dist/internal/open-browser.js +2 -3
  480. package/dist/internal/otel/collector.js +104 -68
  481. package/dist/internal/otel/config.js +24 -37
  482. package/dist/internal/otel/http.js +5 -7
  483. package/dist/internal/otel/mcp.js +3 -12
  484. package/dist/internal/otel/runtime.js +69 -83
  485. package/dist/internal/package-inline-stdio.js +57 -65
  486. package/dist/internal/peer-connections.js +9 -5
  487. package/dist/internal/platform-schedule-sync.js +39 -54
  488. package/dist/internal/platform-timers.js +176 -210
  489. package/dist/internal/playground/static.js +1 -2
  490. package/dist/internal/playground/toolchain.js +37 -53
  491. package/dist/internal/playground-proxy.js +230 -270
  492. package/dist/internal/process-memory-telemetry.js +33 -51
  493. package/dist/internal/prompt-context.js +3 -6
  494. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  495. package/dist/internal/reminder-runner.js +770 -785
  496. package/dist/internal/reminder-schedule.js +1 -1
  497. package/dist/internal/reminder-store.js +57 -78
  498. package/dist/internal/request-error-status.js +1 -3
  499. package/dist/internal/request-headers.js +2 -2
  500. package/dist/internal/resolve-prod-target.js +119 -135
  501. package/dist/internal/resolved-connections.js +16 -6
  502. package/dist/internal/run-client.js +221 -229
  503. package/dist/internal/runtime-dispatch-runner.js +18 -43
  504. package/dist/internal/schedule-runner.js +49 -58
  505. package/dist/internal/scm/pr-url.js +7 -6
  506. package/dist/internal/sdk-runner.js +388 -363
  507. package/dist/internal/serve-restart.js +26 -39
  508. package/dist/internal/server.d.ts.map +1 -1
  509. package/dist/internal/server.js +1283 -1244
  510. package/dist/internal/session-cost.js +7 -9
  511. package/dist/internal/session-engine.d.ts +3 -1
  512. package/dist/internal/session-engine.d.ts.map +1 -1
  513. package/dist/internal/session-engine.js +2801 -2777
  514. package/dist/internal/session-links.js +12 -16
  515. package/dist/internal/session-run-log.js +134 -82
  516. package/dist/internal/session-store.js +133 -164
  517. package/dist/internal/sessions-client.js +97 -118
  518. package/dist/internal/skill-catalog.js +18 -23
  519. package/dist/internal/skills-sync.js +16 -30
  520. package/dist/internal/slack-provision-client.js +90 -116
  521. package/dist/internal/start-log-store.js +48 -67
  522. package/dist/internal/steering.js +1 -2
  523. package/dist/internal/storage-coordinator.js +160 -196
  524. package/dist/internal/store-mirror.js +16 -30
  525. package/dist/internal/stream-progress.js +6 -8
  526. package/dist/internal/terminal-style.js +3 -4
  527. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  528. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  529. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  530. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  531. package/dist/internal/tool-catalog.js +11 -5
  532. package/dist/internal/tool-result.js +1 -1
  533. package/dist/internal/trajectory.js +19 -22
  534. package/dist/internal/turn-cost.js +52 -62
  535. package/dist/internal/turn-governor.js +5 -8
  536. package/dist/internal/turn-lease-store.js +85 -105
  537. package/dist/internal/turn-outbox.js +28 -43
  538. package/dist/internal/update-check.js +231 -259
  539. package/dist/internal/v2-hosting.js +1 -2
  540. package/dist/internal/workspace-sync.js +25 -41
  541. package/dist/internal/workspace.js +111 -139
  542. package/dist/kv/memory-kv.js +27 -51
  543. package/dist/memory.js +106 -148
  544. package/dist/otel.js +5 -8
  545. package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
  546. package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
  547. package/dist/playground/index.html +2 -2
  548. package/dist/prompt.js +2 -4
  549. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  550. package/dist/storage-backends/cursor-hosted.js +105 -145
  551. package/dist/storage-backends/file-kv.js +100 -128
  552. package/dist/storage-protocol.js +3 -5
  553. package/dist/storage.js +17 -26
  554. package/dist/types.d.ts +68 -0
  555. package/dist/types.d.ts.map +1 -1
  556. package/dist/types.js +20 -18
  557. package/docs/building-with-agents.md +2 -0
  558. package/docs/deployment.md +7 -0
  559. package/docs/guides/bitbucket.md +9 -1
  560. package/docs/guides/github.md +20 -4
  561. package/docs/guides/gitlab.md +9 -1
  562. package/docs/guides/migrate.md +127 -0
  563. package/docs/reference/cli.md +39 -0
  564. package/docs/troubleshooting.md +1 -0
  565. package/package.json +1 -1
  566. package/skills/debug/SKILL.md +1 -0
  567. package/skills/github/SKILL.md +23 -0
  568. package/skills/migrate-v2/SKILL.md +264 -0
  569. package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
  570. package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
  571. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
  572. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
  573. package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
  574. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
  575. package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
  576. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  577. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  578. package/dist/playground/assets/index-DPKLl4C_.css +0 -1
  579. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  580. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
  581. /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 = 25000;
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 = 1000;
30
- const MAX_BACKOFF_MS = 30000;
31
- const AUTH_FAILURE_BACKOFF_MS = 60000;
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, 1000];
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 = 1500;
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
- return __awaiter(this, void 0, void 0, function* () {
47
- try {
48
- const raw = yield readFile(this.filePath, "utf8");
49
- const parsed = JSON.parse(raw);
50
- if (parsed.version === OFFSET_SNAPSHOT_VERSION && typeof parsed.offset === "string") {
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
- catch (_a) {
56
- return undefined;
57
- }
58
- });
43
+ return undefined;
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
59
48
  }
60
- save(offset) {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- yield mkdir(this.stateDir, { recursive: true });
63
- const snapshot = {
64
- version: OFFSET_SNAPSHOT_VERSION,
65
- offset,
66
- updatedAt: new Date().toISOString(),
67
- };
68
- // Write-then-rename so a crash mid-write never corrupts the snapshot.
69
- const tmpPath = `${this.filePath}.tmp`;
70
- yield writeFile(tmpPath, JSON.stringify(snapshot, null, 2), "utf8");
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 = (_a = process.env[AGENT_SERVE_GENERATION_ENV_VAR]) === null || _a === void 0 ? void 0 : _a.trim();
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 = (_a = options.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
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
- return __awaiter(this, void 0, void 0, function* () {
142
- var _a, _b;
143
- yield this.resolveConsumerId();
144
- const registered = yield this.registerUntilSuccess();
145
- if (!registered)
146
- return;
147
- this.registerTimer = setInterval(() => {
148
- this.heartbeatPromise = this.registerOnce();
149
- }, DEFAULT_REGISTER_INTERVAL_MS);
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
- return __awaiter(this, void 0, void 0, function* () {
162
- if (this.consumerId !== "") {
163
- return this.consumerId;
164
- }
165
- const filePath = join(this.options.stateDir, "consumer-id");
166
- try {
167
- const existing = (yield readFile(filePath, "utf8")).trim();
168
- if (CONSUMER_ID_PATTERN.test(existing)) {
169
- this.consumerId = existing;
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
- this.consumerId = minted;
187
- return minted;
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
- return __awaiter(this, void 0, void 0, function* () {
192
- var _a, _b, _c;
193
- if (!this.running)
194
- return;
195
- this.running = false;
196
- if (this.registerTimer !== undefined) {
197
- clearInterval(this.registerTimer);
198
- this.registerTimer = undefined;
199
- }
200
- (_a = this.abort) === null || _a === void 0 ? void 0 : _a.abort();
201
- // Bounded wait: server close must never hang on a poll that ignores the
202
- // abort (offsets are saved as events are processed, so cutting the loop
203
- // loose loses nothing).
204
- yield Promise.race([
205
- (_b = this.consumePromise) === null || _b === void 0 ? void 0 : _b.catch(() => { }),
206
- new Promise(resolve => {
207
- var _a;
208
- const timer = setTimeout(resolve, 2000);
209
- (_a = timer.unref) === null || _a === void 0 ? void 0 : _a.call(timer);
210
- }),
211
- ]);
212
- // A heartbeat re-registration may be in flight (its fetch was just
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
- return __awaiter(this, void 0, void 0, function* () {
227
- var _a;
228
- const adapter = this.options.adapter;
229
- if (adapter.buildDeregistrationBody === undefined ||
230
- !this.registeredOnce ||
231
- this.consumerId === "") {
232
- return;
233
- }
234
- const url = `${this.options.baseUrl.replace(/\/+$/, "")}${adapter.subscribePath}`;
235
- const controller = new AbortController();
236
- const timer = setTimeout(() => controller.abort(), DEREGISTER_TIMEOUT_MS);
237
- (_a = timer.unref) === null || _a === void 0 ? void 0 : _a.call(timer);
238
- try {
239
- const response = yield this.fetchImpl(url, {
240
- method: "PUT",
241
- headers: Object.assign({ authorization: `Bearer ${this.options.apiKey}`, "content-type": "application/json" }, (this.deploymentGeneration === undefined
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
- body: JSON.stringify(adapter.buildDeregistrationBody(this.consumerId)),
247
- signal: controller.signal,
248
- });
249
- if (response.ok) {
250
- this.log("deregistered on shutdown");
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
- finally {
260
- clearTimeout(timer);
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
- return __awaiter(this, void 0, void 0, function* () {
269
- const url = `${this.options.baseUrl.replace(/\/+$/, "")}${path}`;
270
- return this.fetchImpl(url, Object.assign(Object.assign({ method, headers: Object.assign(Object.assign({ authorization: `Bearer ${this.options.apiKey}` }, (body === undefined ? {} : { "content-type": "application/json" })), (this.deploymentGeneration === undefined
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
- })) }, (body === undefined ? {} : { body: JSON.stringify(body) })), (this.abort === undefined ? {} : { signal: this.abort.signal })));
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
- return __awaiter(this, void 0, void 0, function* () {
280
- let backoffMs = MIN_BACKOFF_MS;
281
- while (this.running) {
282
- if (yield this.registerOnce()) {
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
- return false;
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
- return __awaiter(this, void 0, void 0, function* () {
298
- if (!this.running)
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
- catch (error) {
315
- if (this.isAbort(error))
316
- return false;
317
- this.logRegistrationOutcome([`registration error: ${describeRelayError(error)}`]);
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
- return __awaiter(this, void 0, void 0, function* () {
334
- var _a;
335
- let backoffMs = MIN_BACKOFF_MS;
336
- let offset = yield this.offsetStore.load();
337
- let announcedGap = false;
338
- while (this.running) {
339
- try {
340
- if (offset === undefined) {
341
- // First run: anchor at "now" so the agent does not replay (and
342
- // react to) the retained backlog of old events.
343
- const anchorResponse = yield this.request("GET", `${this.options.adapter.pollPath}?after=%24&limit=1`);
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 poll = (yield response.json());
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
- if (poll.gapDetected && !announcedGap) {
368
- announcedGap = true;
369
- this.log("gap detected: events may have been trimmed while this host was offline; resuming from the oldest retained event");
370
- }
371
- if (poll.events.length > 0) {
372
- announcedGap = false;
373
- }
374
- for (const event of poll.events) {
375
- if (!this.running)
376
- break;
377
- // At-least-once dedupe: never re-dispatch at or before the last
378
- // processed offset (reads are exclusive-after, so this only fires
379
- // on replay after a crash between dispatch and save).
380
- if (compareStreamOffsets(event.offset, offset) <= 0)
381
- continue;
382
- if (this.options.adapter.shouldDispatch(event)) {
383
- yield this.dispatchWithRetry(event);
384
- }
385
- offset = event.offset;
386
- }
387
- if (poll.nextOffset !== "" && compareStreamOffsets(poll.nextOffset, offset) > 0) {
388
- offset = poll.nextOffset;
389
- }
390
- if (poll.events.length > 0) {
391
- yield this.offsetStore.save(offset);
392
- }
393
- else {
394
- yield this.sleep(DEFAULT_IDLE_POLL_DELAY_MS);
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
- catch (error) {
398
- if (this.isAbort(error))
399
- return;
400
- this.log(`poll error: ${describeRelayError(error)}`);
401
- yield this.sleep(backoffMs);
402
- backoffMs = Math.min(backoffMs * 2, MAX_BACKOFF_MS);
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
- return __awaiter(this, void 0, void 0, function* () {
416
- for (let attempt = 1; attempt <= DISPATCH_ATTEMPTS; attempt++) {
417
- if (attempt > 1 && !this.running) {
418
- this.log(`dispatch abandoned at offset ${event.offset}: relay stopping`);
419
- return;
420
- }
421
- try {
422
- yield this.options.adapter.dispatch(event);
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
- catch (error) {
426
- if (attempt === DISPATCH_ATTEMPTS) {
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
- return __awaiter(this, void 0, void 0, function* () {
439
- // 409 = generation fence (stale resident after redeploy). Same long
440
- // backoff as auth: retrying every second cannot heal a wrong generation.
441
- const isAuthOrFenceFailure = response.status === 401 || response.status === 403 || response.status === 409;
442
- const sleepMs = isAuthOrFenceFailure ? AUTH_FAILURE_BACKOFF_MS : backoffMs;
443
- const text = yield response.text().catch(() => "");
444
- this.log(`poll failed: ${response.status} ${text.slice(0, 300)} (retrying in ${Math.round(sleepMs / 1000)}s)`);
445
- yield this.sleep(sleepMs);
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
- var _a, _b;
452
- const signal = (_a = this.abort) === null || _a === void 0 ? void 0 : _a.signal;
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 === null || signal === void 0 ? void 0 : signal.removeEventListener("abort", finish);
431
+ signal?.removeEventListener("abort", finish);
460
432
  resolve();
461
433
  };
462
434
  const timer = setTimeout(finish, ms);
463
- (_b = timer.unref) === null || _b === void 0 ? void 0 : _b.call(timer);
464
- signal === null || signal === void 0 ? void 0 : signal.addEventListener("abort", finish, { once: true });
435
+ timer.unref?.();
436
+ signal?.addEventListener("abort", finish, { once: true });
465
437
  });
466
438
  }
467
439
  isAbort(error) {