@cursor/bdk 0.2.10 → 0.2.12

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 (436) hide show
  1. package/dist/bin/agent-serve.js +28 -26
  2. package/dist/channels/bitbucket/api.js +8 -8
  3. package/dist/channels/bitbucket/binding.js +4 -4
  4. package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
  5. package/dist/channels/bitbucket/bitbucket-webhook.js +1 -1
  6. package/dist/channels/bitbucket/checks.js +1 -1
  7. package/dist/channels/bitbucket/cursor-account.js +1 -1
  8. package/dist/channels/bitbucket/events.js +1 -1
  9. package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
  10. package/dist/channels/checks.js +2 -2
  11. package/dist/channels/deployments/deployments-channel.js +1 -1
  12. package/dist/channels/github/cursor-account.js +3 -3
  13. package/dist/channels/github/defaults.js +3 -3
  14. package/dist/channels/github/events.js +1 -1
  15. package/dist/channels/github/forward.js +8 -8
  16. package/dist/channels/github/github-channel.js +2 -2
  17. package/dist/channels/gitlab/binding.js +4 -4
  18. package/dist/channels/gitlab/checks.js +1 -1
  19. package/dist/channels/gitlab/cursor-account.js +1 -1
  20. package/dist/channels/gitlab/events.js +1 -1
  21. package/dist/channels/gitlab/gitlab-channel.js +1 -1
  22. package/dist/channels/gitlab/gitlab-webhook.js +1 -1
  23. package/dist/channels/gitlab/replay.js +2 -2
  24. package/dist/channels/origin/binding.js +3 -3
  25. package/dist/channels/origin/checks.js +1 -1
  26. package/dist/channels/origin/cursor-account.js +1 -1
  27. package/dist/channels/origin/events.js +1 -1
  28. package/dist/channels/origin/origin-channel.js +1 -1
  29. package/dist/channels/origin/origin-webhook.js +2 -2
  30. package/dist/channels/slack/agentic-delivery.js +3 -3
  31. package/dist/channels/slack/agentic-signals.js +1 -1
  32. package/dist/channels/slack/api.js +5 -5
  33. package/dist/channels/slack/approvals.js +1 -1
  34. package/dist/channels/slack/attachments.js +3 -3
  35. package/dist/channels/slack/blocks.js +3 -3
  36. package/dist/channels/slack/bot-mentions.js +4 -4
  37. package/dist/channels/slack/channel-watch.js +4 -4
  38. package/dist/channels/slack/cli-project.js +3 -3
  39. package/dist/channels/slack/dispatch.js +1 -1
  40. package/dist/channels/slack/doctor.js +1 -1
  41. package/dist/channels/slack/eval-directive.js +1 -1
  42. package/dist/channels/slack/footer.js +1 -1
  43. package/dist/channels/slack/interactive.js +2 -2
  44. package/dist/channels/slack/log.d.ts.map +1 -1
  45. package/dist/channels/slack/log.js +1 -1
  46. package/dist/channels/slack/manifest.js +1 -1
  47. package/dist/channels/slack/nudge-carrier.js +1 -1
  48. package/dist/channels/slack/nudge-store.js +2 -2
  49. package/dist/channels/slack/recording-sink.js +6 -6
  50. package/dist/channels/slack/reply-options.js +6 -6
  51. package/dist/channels/slack/self-identity.d.ts +7 -4
  52. package/dist/channels/slack/self-identity.d.ts.map +1 -1
  53. package/dist/channels/slack/self-identity.js +17 -8
  54. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  55. package/dist/channels/slack/sender-name.js +2 -6
  56. package/dist/channels/slack/setup.d.ts.map +1 -1
  57. package/dist/channels/slack/setup.js +1 -1
  58. package/dist/channels/slack/slack-channel.js +2 -2
  59. package/dist/channels/slack/socket-mode.js +2 -2
  60. package/dist/channels/slack/thread-context.js +8 -8
  61. package/dist/channels/slack/tool-cards.js +1 -1
  62. package/dist/channels/slack/user-info.d.ts +2 -1
  63. package/dist/channels/slack/user-info.d.ts.map +1 -1
  64. package/dist/channels/slack/user-info.js +16 -1
  65. package/dist/channels.js +1 -1
  66. package/dist/docs/404.html +3 -3
  67. package/dist/docs/assets/{app.DXI7bwox.js → app.CKta5zX1.js} +4 -4
  68. package/dist/docs/assets/chunks/@localSearchIndexroot.DtlCe4t6.js +1 -0
  69. package/dist/docs/assets/chunks/{VPLocalSearchBox.BrbO5mEe.js → VPLocalSearchBox.4vRM3EDG.js} +2 -2
  70. package/dist/docs/assets/chunks/{arc.BOG1yms8.js → arc.CofbA8tA.js} +1 -1
  71. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.C0hsMZnZ.js → architectureDiagram-Q4EWVU46.Mt2UV5M-.js} +1 -1
  72. package/dist/docs/assets/chunks/{baseUniq.H044KjKs.js → baseUniq.C_W0Aqp4.js} +1 -1
  73. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BsRW6GoB.js → blockDiagram-DXYQGD6D.dAc4goE-.js} +1 -1
  74. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.B9HV5PFR.js → c4Diagram-AHTNJAMY.dnbRC3Dm.js} +1 -1
  75. package/dist/docs/assets/chunks/channel.DpljPUVU.js +1 -0
  76. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CPoT_ajl.js → chunk-4BX2VUAB.B42ltSTd.js} +1 -1
  77. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DZBwWuCL.js → chunk-4TB4RGXK.2GbAul_E.js} +1 -1
  78. package/dist/docs/assets/chunks/{chunk-55IACEB6.CZ3yTiyq.js → chunk-55IACEB6.pjzY-v-B.js} +1 -1
  79. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.6DfvHSd8.js → chunk-EDXVE4YY.BB1GXLj2.js} +1 -1
  80. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CpBj8HfK.js → chunk-FMBD7UC4.B2WxZkoA.js} +1 -1
  81. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.BdKo8YqS.js → chunk-OYMX7WX6.BMvb2w73.js} +1 -1
  82. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnXNyxJx.js → chunk-QZHKN3VN.Bmu_2lNr.js} +1 -1
  83. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.Cg1OcF8G.js → chunk-YZCP3GAM.Cth65EaC.js} +1 -1
  84. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DFNHq2OM.js +1 -0
  85. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DFNHq2OM.js +1 -0
  86. package/dist/docs/assets/chunks/clone.DssygCzX.js +1 -0
  87. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.1SP8al9c.js → cose-bilkent-S5V4N54A.CrfA7Iw_.js} +1 -1
  88. package/dist/docs/assets/chunks/{dagre-KV5264BT.DS1L6hJt.js → dagre-KV5264BT.PCD6KQDb.js} +1 -1
  89. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.ChsausbG.js → diagram-5BDNPKRD.CGNlYlP1.js} +1 -1
  90. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.3XsptNWj.js → diagram-G4DWMVQ6.C0cvryPD.js} +1 -1
  91. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DPA9Dk_P.js → diagram-MMDJMWI5.DHlkZHNV.js} +1 -1
  92. package/dist/docs/assets/chunks/{diagram-TYMM5635.BVswXWrB.js → diagram-TYMM5635.DDGqH_4B.js} +1 -1
  93. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.BSak5OSP.js → erDiagram-SMLLAGMA.4gOY_C3v.js} +1 -1
  94. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.CQgN4TTz.js → flowDiagram-DWJPFMVM.8i7zsxuh.js} +1 -1
  95. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.GrT0kA4a.js → ganttDiagram-T4ZO3ILL.BEKHYdM-.js} +1 -1
  96. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CdS7Ucll.js → gitGraphDiagram-UUTBAWPF.ACzeLGiB.js} +1 -1
  97. package/dist/docs/assets/chunks/{graph.BVqKRmRo.js → graph.08C3hS6m.js} +1 -1
  98. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.C3C9FRto.js → infoDiagram-42DDH7IO.D8R9obOH.js} +1 -1
  99. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js → ishikawaDiagram-UXIWVN3A.CmgYpCWL.js} +1 -1
  100. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CaHMfK4b.js → journeyDiagram-VCZTEJTY.DUzjGfoZ.js} +1 -1
  101. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.CjhIUwcA.js → kanban-definition-6JOO6SKY.DbcW2iZ0.js} +1 -1
  102. package/dist/docs/assets/chunks/{layout.CGU3gfSf.js → layout.BaDEpJzu.js} +1 -1
  103. package/dist/docs/assets/chunks/{linear.DaihpW_n.js → linear.B_zRQgCU.js} +1 -1
  104. package/dist/docs/assets/chunks/{min.BS-j8kHQ.js → min.BYscCdSu.js} +1 -1
  105. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.BVJ1Bbnk.js → mindmap-definition-QFDTVHPH.Ggu0jg86.js} +1 -1
  106. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.Cz1WIv9r.js → pieDiagram-DEJITSTG.D_q4SVDT.js} +1 -1
  107. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DKLFxcjy.js → quadrantDiagram-34T5L4WZ.D3zGj5ok.js} +1 -1
  108. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.BHegiK7x.js → requirementDiagram-MS252O5E.DVTg7zr2.js} +1 -1
  109. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DYkY6yPc.js → sankeyDiagram-XADWPNL6.D3X8jm57.js} +1 -1
  110. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DYQ1QUrI.js → sequenceDiagram-FGHM5R23.Dpjai9YP.js} +1 -1
  111. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.Iru8BsFo.js → stateDiagram-FHFEXIEX.D_AbQBuP.js} +1 -1
  112. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CWKWRxRx.js +1 -0
  113. package/dist/docs/assets/chunks/{theme.DaplWQhQ.js → theme.BcgOnbZ6.js} +2 -2
  114. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BwFA8hiX.js → timeline-definition-GMOUNBTQ.Cp3DKBe2.js} +1 -1
  115. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CZ60W1C_.js → vennDiagram-DHZGUBPP.Bcvg-Aqu.js} +1 -1
  116. package/dist/docs/assets/chunks/wardley-RL74JXVD.CCpdcUSq.js +162 -0
  117. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.B69D2r8-.js → wardleyDiagram-NUSXRM2D.L0yehCc5.js} +1 -1
  118. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CLPZEIU9.js → xychartDiagram-5P7HB3ND.Cw8-tJmw.js} +1 -1
  119. package/dist/docs/assets/{reference_connections.md.Bljpve-y.js → reference_connections.md.DLrgAd5f.js} +1 -1
  120. package/dist/docs/assets/{reference_hooks.md.C5LCJ1R3.js → reference_hooks.md.B-eGa2km.js} +3 -3
  121. package/dist/docs/assets/{reference_hooks.md.C5LCJ1R3.lean.js → reference_hooks.md.B-eGa2km.lean.js} +1 -1
  122. package/dist/docs/assets/{reference_sessions.md.CM5zo3w4.js → reference_sessions.md.CyM7ARz1.js} +1 -1
  123. package/dist/docs/assets/{reference_skills.md.C0guGcH0.js → reference_skills.md.ClkMoQsV.js} +3 -3
  124. package/dist/docs/assets/{reference_tools.md.v3SXVSs_.js → reference_tools.md.DzIY9JzY.js} +3 -3
  125. package/dist/docs/assets/{reference_tools.md.v3SXVSs_.lean.js → reference_tools.md.DzIY9JzY.lean.js} +1 -1
  126. package/dist/docs/assets/{style.C130MVnH.css → style.Dwls12uf.css} +1 -1
  127. package/dist/docs/building-with-agents.html +37 -37
  128. package/dist/docs/deployment.html +37 -37
  129. package/dist/docs/evals.html +37 -37
  130. package/dist/docs/guides/agent-to-agent.html +37 -37
  131. package/dist/docs/guides/bitbucket.html +37 -37
  132. package/dist/docs/guides/cloud-agents.html +37 -37
  133. package/dist/docs/guides/convert-automation.html +37 -37
  134. package/dist/docs/guides/github.html +37 -37
  135. package/dist/docs/guides/gitlab.html +37 -37
  136. package/dist/docs/guides/grokbot-agents.html +37 -37
  137. package/dist/docs/guides/hooks.html +37 -37
  138. package/dist/docs/guides/improve.html +37 -37
  139. package/dist/docs/guides/jev.html +37 -37
  140. package/dist/docs/guides/mcp-oauth.html +37 -37
  141. package/dist/docs/guides/migrate.html +37 -37
  142. package/dist/docs/guides/opentelemetry.html +37 -37
  143. package/dist/docs/guides/slack.html +37 -37
  144. package/dist/docs/guides/webhooks.html +37 -37
  145. package/dist/docs/hashmap.json +1 -1
  146. package/dist/docs/hillclimbing.html +37 -37
  147. package/dist/docs/index.html +37 -37
  148. package/dist/docs/llms-full.txt +15 -2
  149. package/dist/docs/quickstart.html +37 -37
  150. package/dist/docs/reference/agent-config.html +37 -37
  151. package/dist/docs/reference/artifacts.html +37 -37
  152. package/dist/docs/reference/channels.html +37 -37
  153. package/dist/docs/reference/cli.html +37 -37
  154. package/dist/docs/reference/connections.html +39 -39
  155. package/dist/docs/reference/connections.md +2 -1
  156. package/dist/docs/reference/evals.html +37 -37
  157. package/dist/docs/reference/extensions.html +37 -37
  158. package/dist/docs/reference/hooks.html +39 -39
  159. package/dist/docs/reference/hooks.md +1 -0
  160. package/dist/docs/reference/http-api.html +37 -37
  161. package/dist/docs/reference/instructions.html +37 -37
  162. package/dist/docs/reference/playground.html +36 -36
  163. package/dist/docs/reference/project-layout.html +37 -37
  164. package/dist/docs/reference/prompt.html +37 -37
  165. package/dist/docs/reference/schedules.html +37 -37
  166. package/dist/docs/reference/sessions.html +37 -37
  167. package/dist/docs/reference/sessions.md +1 -1
  168. package/dist/docs/reference/skills.html +40 -40
  169. package/dist/docs/reference/subagents.html +37 -37
  170. package/dist/docs/reference/tools.html +39 -39
  171. package/dist/docs/reference/tools.md +11 -0
  172. package/dist/docs/templates/agentic-owners.html +37 -37
  173. package/dist/docs/templates/grokbot-agents.html +37 -37
  174. package/dist/docs/templates/security-reviewer.html +37 -37
  175. package/dist/docs/templates/thermo-quality-review.html +37 -37
  176. package/dist/docs/templates/thermo-review.html +37 -37
  177. package/dist/docs/templates/triage.html +37 -37
  178. package/dist/docs/troubleshooting.html +36 -36
  179. package/dist/evals/assertions.d.ts.map +1 -1
  180. package/dist/evals/assertions.js +21 -19
  181. package/dist/evals/expect.js +1 -1
  182. package/dist/evals/judge.js +1 -1
  183. package/dist/evals/reporters.js +8 -8
  184. package/dist/evals/run-facts.js +2 -2
  185. package/dist/evals.js +6 -6
  186. package/dist/extensions/cursor-cloud-agents/extension.d.ts +2 -0
  187. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  188. package/dist/extensions/cursor-cloud-agents/extension.js +2 -1
  189. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +16 -0
  190. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  191. package/dist/extensions/cursor-cloud-agents/lib/backend.js +44 -3
  192. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
  193. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts +23 -0
  194. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts.map +1 -0
  195. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.js +32 -0
  196. package/dist/extensions/cursor-cloud-agents/lib/repos.js +2 -2
  197. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -2
  198. package/dist/extensions/cursor-cloud-agents/lib/watch.d.ts.map +1 -1
  199. package/dist/extensions/cursor-cloud-agents/lib/watch.js +1 -1
  200. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -1
  201. package/dist/extensions/cursor-cloud-agents/tools/launch.js +3 -8
  202. package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
  203. package/dist/extensions/cursor-grokbot-agents/extension.js +3 -3
  204. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  205. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +3 -3
  206. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +4 -4
  207. package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
  208. package/dist/extensions/improve/skills/yourself.js +1 -1
  209. package/dist/extensions/jev/extension.js +2 -2
  210. package/dist/extensions/jev/tools/evaluate.js +1 -1
  211. package/dist/extensions/slack-communication/tools/react.js +1 -1
  212. package/dist/files-backends/cursor-hosted.js +8 -8
  213. package/dist/files-backends/local-fs.js +1 -1
  214. package/dist/filesystem.d.ts.map +1 -1
  215. package/dist/filesystem.js +15 -15
  216. package/dist/internal/advertise-tools.d.ts +3 -2
  217. package/dist/internal/advertise-tools.d.ts.map +1 -1
  218. package/dist/internal/advertise-tools.js +11 -9
  219. package/dist/internal/approval-gate.js +1 -1
  220. package/dist/internal/artifacts-store.js +13 -13
  221. package/dist/internal/as-of.js +2 -2
  222. package/dist/internal/authored-alias-hooks.js +1 -1
  223. package/dist/internal/builtin-tools/reminders.js +2 -2
  224. package/dist/internal/chat-client.js +5 -5
  225. package/dist/internal/cli-ax.js +14 -14
  226. package/dist/internal/cli-bitbucket.js +10 -10
  227. package/dist/internal/cli-convert-automation.js +2 -2
  228. package/dist/internal/cli-cursor.js +2 -2
  229. package/dist/internal/cli-deploy.d.ts.map +1 -1
  230. package/dist/internal/cli-deploy.js +40 -40
  231. package/dist/internal/cli-docs.js +5 -5
  232. package/dist/internal/cli-github.js +15 -15
  233. package/dist/internal/cli-gitlab.js +10 -10
  234. package/dist/internal/cli-images.js +16 -16
  235. package/dist/internal/cli-manifest.js +1 -1
  236. package/dist/internal/cli-mcp-oauth.js +5 -5
  237. package/dist/internal/cli-mcp.js +3 -3
  238. package/dist/internal/cli-migrate.js +1 -1
  239. package/dist/internal/cli-skills.js +2 -2
  240. package/dist/internal/cli-slack.js +5 -5
  241. package/dist/internal/cloud-turn-cost.js +1 -1
  242. package/dist/internal/continuation-identity.js +6 -6
  243. package/dist/internal/conversation-mirror.js +5 -5
  244. package/dist/internal/convert-automation/convert-workflow.js +24 -24
  245. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  246. package/dist/internal/cursor/account-mcp.js +20 -20
  247. package/dist/internal/cursor/backend-client.js +6 -6
  248. package/dist/internal/cursor/credentials.js +1 -1
  249. package/dist/internal/cursor/store-api-client.js +1 -1
  250. package/dist/internal/cursor-account-mcp-auth.js +9 -9
  251. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  252. package/dist/internal/cursor-deployment-relay.js +9 -9
  253. package/dist/internal/cursor-event-relay.js +10 -10
  254. package/dist/internal/cursor-relay-core.js +2 -2
  255. package/dist/internal/deploy-client.d.ts.map +1 -1
  256. package/dist/internal/deploy-client.js +3 -0
  257. package/dist/internal/deploy-manifest.js +10 -10
  258. package/dist/internal/discovery/agent-config.js +2 -2
  259. package/dist/internal/discovery/agent.js +6 -6
  260. package/dist/internal/discovery/connections.js +5 -5
  261. package/dist/internal/discovery/cursor-plugin.js +12 -12
  262. package/dist/internal/discovery/extension-overlay.js +3 -3
  263. package/dist/internal/discovery/extensions.js +6 -6
  264. package/dist/internal/discovery/info.js +9 -9
  265. package/dist/internal/discovery/instructions.js +1 -1
  266. package/dist/internal/discovery/project.js +3 -3
  267. package/dist/internal/discovery/services.js +1 -1
  268. package/dist/internal/discovery/tools.js +1 -1
  269. package/dist/internal/docs-site.js +2 -2
  270. package/dist/internal/env-file.js +1 -1
  271. package/dist/internal/eval-run-store.js +7 -7
  272. package/dist/internal/eval-runner.d.ts.map +1 -1
  273. package/dist/internal/eval-runner.js +14 -14
  274. package/dist/internal/eval-transport.js +1 -1
  275. package/dist/internal/evals-client.js +4 -4
  276. package/dist/internal/event-log.js +8 -8
  277. package/dist/internal/event-mapper.js +13 -13
  278. package/dist/internal/expected-delivery-failure.js +2 -2
  279. package/dist/internal/filesystem/format.js +2 -2
  280. package/dist/internal/filesystem/nearest.js +3 -3
  281. package/dist/internal/filesystem/scratch.js +3 -3
  282. package/dist/internal/filesystem/tools.js +6 -6
  283. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  284. package/dist/internal/filesystem/walk.js +2 -2
  285. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  286. package/dist/internal/framework-file-storage.js +6 -5
  287. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  288. package/dist/internal/framework-storage-selection.js +4 -2
  289. package/dist/internal/github-fanout.d.ts.map +1 -1
  290. package/dist/internal/github-fanout.js +3 -3
  291. package/dist/internal/guest-network.js +4 -4
  292. package/dist/internal/host-files.js +1 -1
  293. package/dist/internal/host-kv.js +2 -2
  294. package/dist/internal/hosted-catch-protocol.js +1 -1
  295. package/dist/internal/hosted-catch.js +1 -1
  296. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  297. package/dist/internal/hosted-delivery-protocol.js +14 -14
  298. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  299. package/dist/internal/hosted-delivery.js +23 -9
  300. package/dist/internal/hosted-eval-cases.js +4 -4
  301. package/dist/internal/hosted-execution-diag.js +3 -3
  302. package/dist/internal/hosting.js +1 -1
  303. package/dist/internal/http-channel.js +1 -1
  304. package/dist/internal/http-control-plane-session.js +2 -2
  305. package/dist/internal/init-interview.js +7 -7
  306. package/dist/internal/init-project.d.ts.map +1 -1
  307. package/dist/internal/init-project.js +12 -12
  308. package/dist/internal/inline-stdio-mcp.js +2 -2
  309. package/dist/internal/install-cursor-skills.js +11 -11
  310. package/dist/internal/json-schema.js +1 -1
  311. package/dist/internal/local-control-plane.js +3 -3
  312. package/dist/internal/local-env.js +3 -3
  313. package/dist/internal/log-ring.js +1 -1
  314. package/dist/internal/logs-client.js +1 -1
  315. package/dist/internal/mcp-endpoint.js +8 -8
  316. package/dist/internal/mcp-host.d.ts.map +1 -1
  317. package/dist/internal/mcp-host.js +5 -5
  318. package/dist/internal/mcp-oauth-on-demand.js +3 -3
  319. package/dist/internal/mcp-oauth.js +5 -5
  320. package/dist/internal/net.js +2 -2
  321. package/dist/internal/otel/config.js +3 -3
  322. package/dist/internal/otel/runtime.js +13 -13
  323. package/dist/internal/peer-connections.js +2 -2
  324. package/dist/internal/persistent-stage-log-mirror.d.ts +57 -0
  325. package/dist/internal/persistent-stage-log-mirror.d.ts.map +1 -0
  326. package/dist/internal/persistent-stage-log-mirror.js +231 -0
  327. package/dist/internal/platform-schedule-sync.js +1 -1
  328. package/dist/internal/platform-timers.js +1 -1
  329. package/dist/internal/playground/static.js +2 -2
  330. package/dist/internal/playground/toolchain.js +2 -2
  331. package/dist/internal/playground-proxy.js +3 -3
  332. package/dist/internal/process-memory-telemetry.js +1 -1
  333. package/dist/internal/reminder-runner.d.ts +1 -1
  334. package/dist/internal/reminder-runner.d.ts.map +1 -1
  335. package/dist/internal/reminder-runner.js +14 -16
  336. package/dist/internal/reminder-store.js +1 -1
  337. package/dist/internal/resolved-connections.js +8 -8
  338. package/dist/internal/router.js +4 -4
  339. package/dist/internal/run-client.js +2 -2
  340. package/dist/internal/schedule-runner.js +6 -6
  341. package/dist/internal/sdk-runner.d.ts.map +1 -1
  342. package/dist/internal/sdk-runner.js +6 -6
  343. package/dist/internal/serve-restart.js +1 -1
  344. package/dist/internal/server.d.ts.map +1 -1
  345. package/dist/internal/server.js +93 -72
  346. package/dist/internal/session-cost.js +3 -3
  347. package/dist/internal/session-engine.d.ts +8 -0
  348. package/dist/internal/session-engine.d.ts.map +1 -1
  349. package/dist/internal/session-engine.js +183 -118
  350. package/dist/internal/session-live-publisher.d.ts +46 -0
  351. package/dist/internal/session-live-publisher.d.ts.map +1 -0
  352. package/dist/internal/session-live-publisher.js +352 -0
  353. package/dist/internal/session-run-log.js +6 -6
  354. package/dist/internal/sessions-client.js +3 -3
  355. package/dist/internal/skill-catalog.js +2 -2
  356. package/dist/internal/sleep.js +1 -1
  357. package/dist/internal/start-log-store.d.ts +5 -1
  358. package/dist/internal/start-log-store.d.ts.map +1 -1
  359. package/dist/internal/start-log-store.js +5 -3
  360. package/dist/internal/storage-coordinator.js +12 -12
  361. package/dist/internal/store-api-protocol.d.ts +51 -0
  362. package/dist/internal/store-api-protocol.d.ts.map +1 -1
  363. package/dist/internal/store-api-protocol.js +39 -2
  364. package/dist/internal/store-mirror.js +4 -4
  365. package/dist/internal/stream-progress.d.ts.map +1 -1
  366. package/dist/internal/stream-progress.js +4 -0
  367. package/dist/internal/terminal-style.js +2 -2
  368. package/dist/internal/tool-call-retry.d.ts +87 -0
  369. package/dist/internal/tool-call-retry.d.ts.map +1 -0
  370. package/dist/internal/tool-call-retry.js +387 -0
  371. package/dist/internal/tool-result.js +3 -3
  372. package/dist/internal/trajectory.js +7 -7
  373. package/dist/internal/turn-governor.js +2 -2
  374. package/dist/internal/turn-outbox.js +1 -1
  375. package/dist/internal/update-check.d.ts.map +1 -1
  376. package/dist/internal/update-check.js +4 -2
  377. package/dist/internal/v2-hosting.d.ts +6 -0
  378. package/dist/internal/v2-hosting.d.ts.map +1 -1
  379. package/dist/internal/v2-hosting.js +7 -1
  380. package/dist/internal/workspace.js +4 -4
  381. package/dist/kv/memory-kv.js +3 -3
  382. package/dist/playground/assets/{index-JekUQERK.js → index-HN5lOuAX.js} +42 -42
  383. package/dist/playground/assets/index-JY1wKCMg.css +1 -0
  384. package/dist/playground/index.html +2 -2
  385. package/dist/prompt.js +1 -1
  386. package/dist/storage-backends/cursor-hosted-v2.js +2 -2
  387. package/dist/storage-backends/file-kv.js +7 -7
  388. package/dist/storage-protocol.d.ts +7 -0
  389. package/dist/storage-protocol.d.ts.map +1 -1
  390. package/dist/storage-protocol.js +7 -0
  391. package/dist/storage.js +3 -3
  392. package/dist/types.d.ts +15 -0
  393. package/dist/types.d.ts.map +1 -1
  394. package/dist/types.js +4 -4
  395. package/docs/reference/connections.md +2 -1
  396. package/docs/reference/hooks.md +1 -0
  397. package/docs/reference/sessions.md +1 -1
  398. package/docs/reference/tools.md +11 -0
  399. package/package.json +6 -6
  400. package/templates/agentic-owners/bot/channels/github.ts +2 -2
  401. package/templates/agentic-owners/bot/lib/github.ts +7 -5
  402. package/templates/agentic-owners/bot/lib/owners/decision.ts +9 -9
  403. package/templates/agentic-owners/bot/lib/owners/handles.ts +2 -2
  404. package/templates/agentic-owners/bot/lib/owners/match.ts +5 -3
  405. package/templates/agentic-owners/bot/lib/owners/matching.ts +1 -1
  406. package/templates/agentic-owners/bot/lib/owners/parse.ts +4 -4
  407. package/templates/agentic-owners/bot/lib/owners/prompt.ts +1 -1
  408. package/templates/agentic-owners/bot/lib/review.ts +18 -17
  409. package/templates/agentic-owners/evals/owners.eval.ts +2 -2
  410. package/templates/agents-md/bot/lib/collect.ts +6 -6
  411. package/templates/agents-md/bot/lib/config.ts +1 -1
  412. package/templates/agents-md/bot/tools/apply_agents.ts +4 -4
  413. package/templates/code-wiki/bot/channels/github.ts +3 -3
  414. package/templates/code-wiki/bot/lib/repos.ts +1 -1
  415. package/templates/code-wiki/bot/tools/apply_wiki.ts +2 -2
  416. package/templates/demo/bot/lib/collect.ts +1 -1
  417. package/templates/demo/bot/lib/repos.ts +1 -1
  418. package/templates/demo/bot/tools/record_demo.ts +1 -1
  419. package/templates/pr-autofixer/bot/channels/github.ts +2 -2
  420. package/templates/pr-autofixer/bot/lib/merge-watch.ts +2 -2
  421. package/templates/pr-autofixer/bot/lib/repos.ts +2 -2
  422. package/templates/pr-autofixer/bot/lib/webhook-routing.ts +1 -1
  423. package/templates/security-help/bot/lib/repos.ts +1 -1
  424. package/templates/security-reviewer/bot/lib/repos.ts +1 -1
  425. package/templates/triage/bot/lib/actuate.ts +15 -15
  426. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +0 -1
  427. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +0 -1
  428. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +0 -1
  429. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +0 -1
  430. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +0 -1
  431. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +0 -1
  432. package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +0 -162
  433. package/dist/playground/assets/index-DXm_VXAQ.css +0 -1
  434. /package/dist/docs/assets/{reference_connections.md.Bljpve-y.lean.js → reference_connections.md.DLrgAd5f.lean.js} +0 -0
  435. /package/dist/docs/assets/{reference_sessions.md.CM5zo3w4.lean.js → reference_sessions.md.CyM7ARz1.lean.js} +0 -0
  436. /package/dist/docs/assets/{reference_skills.md.C0guGcH0.lean.js → reference_skills.md.ClkMoQsV.lean.js} +0 -0
@@ -25,7 +25,7 @@ export function loadAgentLocalEnv(dir) {
25
25
  loaded.push(path);
26
26
  };
27
27
  const trackLoadedKeys = () => {
28
- fileLoadedKeys = new Set(Object.keys(process.env).filter(key => !realKeys.has(key)));
28
+ fileLoadedKeys = new Set(Object.keys(process.env).filter((key) => !realKeys.has(key)));
29
29
  };
30
30
  const tryLoadDir = (agentDir) => {
31
31
  // `.env.local` first so its values win over checked-in `.env` defaults
@@ -37,8 +37,8 @@ export function loadAgentLocalEnv(dir) {
37
37
  let children;
38
38
  try {
39
39
  children = readdirSync(dir, { withFileTypes: true })
40
- .filter(entry => entry.isDirectory() && !entry.name.startsWith("."))
41
- .map(entry => entry.name);
40
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
41
+ .map((entry) => entry.name);
42
42
  }
43
43
  catch {
44
44
  trackLoadedKeys();
@@ -25,7 +25,7 @@ export function createLogRing(options = {}) {
25
25
  if (entries.length === 0) {
26
26
  return [];
27
27
  }
28
- const start = entries.findIndex(e => e.index > after);
28
+ const start = entries.findIndex((e) => e.index > after);
29
29
  if (start < 0) {
30
30
  return [];
31
31
  }
@@ -404,7 +404,7 @@ async function sleepMs(ms, signal) {
404
404
  if (isAborted(signal)) {
405
405
  return;
406
406
  }
407
- await new Promise(resolve => {
407
+ await new Promise((resolve) => {
408
408
  const timer = setTimeout(() => {
409
409
  signal?.removeEventListener("abort", onAbort);
410
410
  resolve();
@@ -90,7 +90,7 @@ export async function handleStatelessMcpRequest(args) {
90
90
  /** Tool names the MCP surface exposes for `project` (info projection). */
91
91
  export function mcpEndpointToolNames(project) {
92
92
  const names = ["ask", "check"];
93
- if (project.agent.tools.some(tool => tool.execution === "server")) {
93
+ if (project.agent.tools.some((tool) => tool.execution === "server")) {
94
94
  names.push("call_tool");
95
95
  }
96
96
  return names;
@@ -137,9 +137,9 @@ function buildToolMcpServer(engine, sessionId) {
137
137
  capabilities: { tools: {} },
138
138
  instructions: "Direct tools implemented by the AgentSDK deployment for its active cloud turn.",
139
139
  });
140
- const tools = engine.project.agent.tools.filter(tool => tool.execution === "server");
140
+ const tools = engine.project.agent.tools.filter((tool) => tool.execution === "server");
141
141
  server.setRequestHandler(ListToolsRequestSchema, () => Promise.resolve({
142
- tools: tools.map(tool => ({
142
+ tools: tools.map((tool) => ({
143
143
  name: tool.name,
144
144
  description: tool.description,
145
145
  inputSchema: tool.inputSchema,
@@ -150,7 +150,7 @@ function buildToolMcpServer(engine, sessionId) {
150
150
  if (sessionId === null || sessionId === "") {
151
151
  return errorResult("Missing AgentSDK session binding.");
152
152
  }
153
- const tool = tools.find(candidate => candidate.name === request.params.name);
153
+ const tool = tools.find((candidate) => candidate.name === request.params.name);
154
154
  if (tool === undefined) {
155
155
  return errorResult(`Unknown server tool "${request.params.name}".`);
156
156
  }
@@ -203,7 +203,7 @@ function buildConnectionBridgeMcpServer(engine, sessionId, connectionName) {
203
203
  }
204
204
  const tools = await engine.runWithMcpPark(sessionId ?? "", "tools/list", () => engine.host.mcp.listTools(connectionName));
205
205
  return {
206
- tools: tools.map(tool => ({
206
+ tools: tools.map((tool) => ({
207
207
  name: tool.name,
208
208
  ...(tool.description === undefined ? {} : { description: tool.description }),
209
209
  inputSchema: tool.inputSchema ?? { type: "object" },
@@ -303,11 +303,11 @@ function buildAgentMcpServer(engine, auth) {
303
303
  return errorResult(describeError(error));
304
304
  }
305
305
  });
306
- const serverTools = agent.tools.filter(tool => tool.execution === "server");
306
+ const serverTools = agent.tools.filter((tool) => tool.execution === "server");
307
307
  if (serverTools.length > 0) {
308
308
  server.registerTool("call_tool", {
309
309
  description: `Call one of this agent's deterministic server tools directly (no model turn decides anything). Available tools: ${serverTools
310
- .map(tool => tool.name)
310
+ .map((tool) => tool.name)
311
311
  .join(", ")}.`,
312
312
  inputSchema: {
313
313
  toolName: z.string().describe("Name of the server tool to call."),
@@ -543,7 +543,7 @@ function raceTimeout(promise, ms) {
543
543
  const timer = setTimeout(() => {
544
544
  resolve(undefined);
545
545
  }, ms);
546
- promise.then(value => {
546
+ promise.then((value) => {
547
547
  clearTimeout(timer);
548
548
  resolve(value);
549
549
  }, (error) => {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AASrB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAS9C;CACF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAMvE;AAoBD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxF;AAED,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED,gFAAgF;IAChF,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAUlE;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,EAAE,oBAAoB,GAAG,aAAa,CAwCtD;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAa5B;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5C;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED;;;;;;;;OAQG;YACW,UAAU;IAcxB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;YAwBH,gBAAgB;IAc9B,OAAO,CAAC,iBAAiB;YASX,OAAO;CAGtB;AASD,+BAA+B;AAC/B,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU9D;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAqB3F"}
1
+ {"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AASrB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAS9C;CACF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAMvE;AAoBD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxF;AAED,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED,gFAAgF;IAChF,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAUlE;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,EAAE,oBAAoB,GAAG,aAAa,CAwCtD;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAa5B;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5C;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAY3B;IAED;;;;;;;;OAQG;YACW,UAAU;IAcxB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;YAwBH,gBAAgB;IAc9B,OAAO,CAAC,iBAAiB;YASX,OAAO;CAGtB;AASD,+BAA+B;AAC/B,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU9D;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAqB3F"}
@@ -36,7 +36,7 @@ export function hostMcpCallNeedsAuth(result) {
36
36
  if (result.isError !== true) {
37
37
  return false;
38
38
  }
39
- const text = result.content.map(part => (part.type === "text" ? part.text : "")).join("\n");
39
+ const text = result.content.map((part) => (part.type === "text" ? part.text : "")).join("\n");
40
40
  return text.includes("needsAuth") || text.includes("needs authorization");
41
41
  }
42
42
  function throwIfCallNeedsAuth(connection, result) {
@@ -73,7 +73,7 @@ export class McpHost {
73
73
  const listed = await client.listTools(mcpListParams());
74
74
  return listed.tools
75
75
  .map(toToolInfo)
76
- .filter(tool => connectionAllowsTool(connection, tool.name));
76
+ .filter((tool) => connectionAllowsTool(connection, tool.name));
77
77
  }));
78
78
  }
79
79
  /**
@@ -101,7 +101,7 @@ export class McpHost {
101
101
  const listed = await client.listTools(mcpListParams());
102
102
  return listed.tools
103
103
  .map(toToolInfo)
104
- .filter(tool => connectionAllowsTool(connection, tool.name));
104
+ .filter((tool) => connectionAllowsTool(connection, tool.name));
105
105
  })),
106
106
  callTool: (toolName, args = {}) => {
107
107
  assertConnectionAllowsTool(connection, toolName);
@@ -146,7 +146,7 @@ export class McpHost {
146
146
  }
147
147
  }
148
148
  async close() {
149
- const opened = await Promise.allSettled([...this.clients.values()].map(entry => entry.opened));
149
+ const opened = await Promise.allSettled([...this.clients.values()].map((entry) => entry.opened));
150
150
  this.clients.clear();
151
151
  await Promise.allSettled(opened.map(async (settled) => {
152
152
  if (settled.status === "fulfilled") {
@@ -196,7 +196,7 @@ export class McpHost {
196
196
  // replaced would otherwise orphan the client that replaced it.
197
197
  const entry = {
198
198
  credentials,
199
- opened: this.connect(name).catch(error => {
199
+ opened: this.connect(name).catch((error) => {
200
200
  if (this.clients.get(name) === entry) {
201
201
  this.clients.delete(name);
202
202
  }
@@ -27,7 +27,7 @@ export async function beginHostMcpOauth(args) {
27
27
  resourceUrl: args.url,
28
28
  store: args.store,
29
29
  redirectUrl: args.redirectUrl,
30
- onRedirect: url => {
30
+ onRedirect: (url) => {
31
31
  authorizationUrl = url;
32
32
  },
33
33
  });
@@ -109,10 +109,10 @@ export class McpOauthOnDemandHub {
109
109
  return { authUrl: started.authUrl, state: started.state };
110
110
  }
111
111
  async abortCall(sessionId, callId) {
112
- await this.dropWhere(attempt => attempt.sessionId === sessionId && attempt.callId === callId, true);
112
+ await this.dropWhere((attempt) => attempt.sessionId === sessionId && attempt.callId === callId, true);
113
113
  }
114
114
  async abortSession(sessionId) {
115
- await this.dropWhere(attempt => attempt.sessionId === sessionId, false);
115
+ await this.dropWhere((attempt) => attempt.sessionId === sessionId, false);
116
116
  }
117
117
  async close() {
118
118
  await this.dropWhere(() => true, true);
@@ -83,12 +83,12 @@ export class FileMcpOAuthStore {
83
83
  return (await this.entryFor(id, resourceUrl))?.clientInfo;
84
84
  }
85
85
  async saveTokens(id, resourceUrl, tokens) {
86
- await this.update(id, resourceUrl, entry => {
86
+ await this.update(id, resourceUrl, (entry) => {
87
87
  entry.tokens = tokens;
88
88
  });
89
89
  }
90
90
  async saveClientInformation(id, resourceUrl, clientInfo) {
91
- await this.update(id, resourceUrl, entry => {
91
+ await this.update(id, resourceUrl, (entry) => {
92
92
  entry.clientInfo = clientInfo;
93
93
  });
94
94
  }
@@ -126,7 +126,7 @@ export class FileMcpOAuthStore {
126
126
  if (this.cache !== undefined) {
127
127
  return this.cache;
128
128
  }
129
- this.loading ??= this.readDisk().then(data => {
129
+ this.loading ??= this.readDisk().then((data) => {
130
130
  this.cache = data;
131
131
  return data;
132
132
  });
@@ -161,7 +161,7 @@ export class FileMcpOAuthStore {
161
161
  async withLock(fn) {
162
162
  const prev = locks.get(this.path) ?? Promise.resolve();
163
163
  let release;
164
- locks.set(this.path, new Promise(resolve => {
164
+ locks.set(this.path, new Promise((resolve) => {
165
165
  release = resolve;
166
166
  }));
167
167
  try {
@@ -368,7 +368,7 @@ export async function waitForMcpOAuthCallback(args) {
368
368
  const timer = setTimeout(() => {
369
369
  finish(undefined, new Error(`Timed out waiting for OAuth callback on http://localhost:${port}${path}`));
370
370
  }, timeoutMs);
371
- server.on("error", error => {
371
+ server.on("error", (error) => {
372
372
  finish(undefined, new Error(`OAuth callback port ${port} failed: ${error instanceof Error ? error.message : String(error)}`));
373
373
  });
374
374
  server.listen(port, "127.0.0.1");
@@ -20,8 +20,8 @@ export function isLoopbackHostname(hostname) {
20
20
  if (ipv4 === null) {
21
21
  return false;
22
22
  }
23
- const octets = ipv4.slice(1, 5).map(part => Number(part));
24
- if (octets.some(octet => octet > 255)) {
23
+ const octets = ipv4.slice(1, 5).map((part) => Number(part));
24
+ if (octets.some((octet) => octet > 255)) {
25
25
  return false;
26
26
  }
27
27
  return octets[0] === 127;
@@ -49,7 +49,7 @@ export function resolveOtelConfig(input) {
49
49
  };
50
50
  const envExporters = exportersFromEnv(env);
51
51
  const exporters = merged.exporters !== undefined && merged.exporters.length > 0
52
- ? merged.exporters.map(e => withEnvHeaders(e, env))
52
+ ? merged.exporters.map((e) => withEnvHeaders(e, env))
53
53
  : envExporters;
54
54
  const optedIn = input.authored !== undefined || input.serve !== undefined || envExporters.length > 0;
55
55
  if (!optedIn) {
@@ -96,7 +96,7 @@ export function stripSignalPath(url) {
96
96
  }
97
97
  /** Exporters that apply to one signal (honors per-exporter `signals`). */
98
98
  export function exportersForSignal(exporters, signal) {
99
- return exporters.filter(exporter => exporter.signals === undefined || exporter.signals.includes(signal));
99
+ return exporters.filter((exporter) => exporter.signals === undefined || exporter.signals.includes(signal));
100
100
  }
101
101
  function disabled() {
102
102
  return {
@@ -210,7 +210,7 @@ function stable(value) {
210
210
  const obj = value;
211
211
  return `{${Object.keys(obj)
212
212
  .sort()
213
- .map(key => `${JSON.stringify(key)}:${stable(obj[key])}`)
213
+ .map((key) => `${JSON.stringify(key)}:${stable(obj[key])}`)
214
214
  .join(",")}}`;
215
215
  }
216
216
  function nonEmpty(value) {
@@ -75,7 +75,7 @@ export async function shutdownOtelRuntime(runtime) {
75
75
  }
76
76
  export async function raceOtelForceFlush(work, log, timeoutMs = OTEL_FORCE_FLUSH_TIMEOUT_MS) {
77
77
  let timer;
78
- const timeout = new Promise(resolve => {
78
+ const timeout = new Promise((resolve) => {
79
79
  timer = setTimeout(() => resolve("timeout"), timeoutMs);
80
80
  });
81
81
  const result = await Promise.race([
@@ -91,11 +91,11 @@ export async function raceOtelForceFlush(work, log, timeoutMs = OTEL_FORCE_FLUSH
91
91
  }
92
92
  function startOtelSdk(config, logger, resolveExport) {
93
93
  diag.setLogger({
94
- verbose: m => logger(`[bdk:otel] ${m}`),
95
- debug: m => logger(`[bdk:otel] ${m}`),
96
- info: m => logger(`[bdk:otel] ${m}`),
97
- warn: m => logger(`[bdk:otel] warn: ${m}`),
98
- error: m => logger(`[bdk:otel] error: ${m}`),
94
+ verbose: (m) => logger(`[bdk:otel] ${m}`),
95
+ debug: (m) => logger(`[bdk:otel] ${m}`),
96
+ info: (m) => logger(`[bdk:otel] ${m}`),
97
+ warn: (m) => logger(`[bdk:otel] warn: ${m}`),
98
+ error: (m) => logger(`[bdk:otel] error: ${m}`),
99
99
  }, DiagLogLevel.ERROR);
100
100
  const resource = buildResource(config);
101
101
  let tracerProvider;
@@ -136,7 +136,7 @@ function startOtelSdk(config, logger, resolveExport) {
136
136
  const exportIntervalMillis = metricOpts.exportIntervalMillis ?? 10_000;
137
137
  const provider = new MeterProvider({
138
138
  resource,
139
- readers: exporters.map(exporter => new PeriodicExportingMetricReader({
139
+ readers: exporters.map((exporter) => new PeriodicExportingMetricReader({
140
140
  exporter: createMetricExporter(exporter, signalUrl(exporter.url, "metrics")),
141
141
  exportIntervalMillis,
142
142
  })),
@@ -155,7 +155,7 @@ function startOtelSdk(config, logger, resolveExport) {
155
155
  if (exporters.length > 0) {
156
156
  const provider = new LoggerProvider({
157
157
  resource,
158
- processors: exporters.map(exporter => new BatchLogRecordProcessor(createLogExporter(exporter, signalUrl(exporter.url, "logs")))),
158
+ processors: exporters.map((exporter) => new BatchLogRecordProcessor(createLogExporter(exporter, signalUrl(exporter.url, "logs")))),
159
159
  });
160
160
  // api-logs returns the active provider (ours on success, existing otherwise).
161
161
  if (logs.setGlobalLoggerProvider(provider) === provider) {
@@ -226,22 +226,22 @@ function withExportResource(span, resource) {
226
226
  });
227
227
  }
228
228
  async function exportQueuedSpans(spans, destinations, logger, resource) {
229
- const payload = spans.map(span => withExportResource(span, resource));
230
- const exporters = destinations.map(destination => createTraceExporter(destination, signalUrl(destination.url, "traces")));
229
+ const payload = spans.map((span) => withExportResource(span, resource));
230
+ const exporters = destinations.map((destination) => createTraceExporter(destination, signalUrl(destination.url, "traces")));
231
231
  try {
232
- const results = await Promise.all(exporters.map(exporter => new Promise(resolve => {
232
+ const results = await Promise.all(exporters.map((exporter) => new Promise((resolve) => {
233
233
  exporter.export(payload, (result) => {
234
234
  resolve(result.code === ExportResultCode.SUCCESS);
235
235
  });
236
236
  })));
237
- return results.every(ok => ok);
237
+ return results.every((ok) => ok);
238
238
  }
239
239
  catch (error) {
240
240
  logger(`[bdk:otel] deferred export failed: ${error instanceof Error ? error.message : String(error)}`);
241
241
  return false;
242
242
  }
243
243
  finally {
244
- await Promise.allSettled(exporters.map(exporter => exporter.shutdown()));
244
+ await Promise.allSettled(exporters.map((exporter) => exporter.shutdown()));
245
245
  }
246
246
  }
247
247
  function buildResource(config) {
@@ -18,7 +18,7 @@ import { MCP_ENDPOINT_PATH } from "./mcp-endpoint.js";
18
18
  * self-references (an agent asking itself recurses forever).
19
19
  */
20
20
  export function collectPeerConnections(mounts) {
21
- const knownSlugs = new Set(mounts.map(({ slug }) => slug).filter(slug => slug !== ""));
21
+ const knownSlugs = new Set(mounts.map(({ slug }) => slug).filter((slug) => slug !== ""));
22
22
  const bySlug = new Map();
23
23
  for (const { slug, project } of mounts) {
24
24
  const refs = [];
@@ -57,7 +57,7 @@ export function resolvePeerConnections(args) {
57
57
  const serverBase = trimTrailingSlash(args.serverUrl);
58
58
  const publicBase = args.publicUrl === undefined ? undefined : trimTrailingSlash(args.publicUrl);
59
59
  const headers = args.authToken === undefined ? undefined : { authorization: `Bearer ${args.authToken}` };
60
- return args.refs.map(ref => ({
60
+ return args.refs.map((ref) => ({
61
61
  name: ref.name,
62
62
  localUrl: `${serverBase}/${ref.targetSlug}${MCP_ENDPOINT_PATH}`,
63
63
  ...(publicBase === undefined
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Mirror a persistent slot's `/state/logs` directory onto the framework store.
3
+ *
4
+ * One loop for every file in the folder. A file whose size and mtime match
5
+ * the last upload is left alone, including the read. Anything else is read
6
+ * from its tail, masked, and written over the same key. Store keys whose
7
+ * files are gone are deleted. The timer lives on the serve process, because
8
+ * a persistent VM stays up between turns. Freeze pods do not enter this path.
9
+ */
10
+ import type { FileSink } from "../files.js";
11
+ import type { AgentProject } from "../types.js";
12
+ /** How often the resident process snapshots the directory. */
13
+ export declare const PERSISTENT_STAGE_LOG_SYNC_INTERVAL_MS = 30000;
14
+ /**
15
+ * Basenames written by the persistent stage logger: timestamp, optional generation, stage.
16
+ * Rejects paths, so a listing cannot escape the directory.
17
+ */
18
+ export declare const PERSISTENT_STAGE_LOG_FILE_NAME: RegExp;
19
+ export interface PersistentStageLogMirror {
20
+ logsDir: string;
21
+ sink: FileSink;
22
+ agentName: string;
23
+ logger: (line: string) => void;
24
+ }
25
+ export declare function selectPersistentStageLogMirror(input: {
26
+ project: AgentProject;
27
+ logsDir: string;
28
+ logger?: (line: string) => void;
29
+ env?: Record<string, string | undefined>;
30
+ }): PersistentStageLogMirror | undefined;
31
+ /**
32
+ * Start the directory sync and return a stop that flushes once more. The
33
+ * interval does not keep the process alive on its own. A tick that lands
34
+ * while a sync is running is dropped; stop still runs one more after it.
35
+ */
36
+ export declare function startPersistentStageLogMirror(mirror: PersistentStageLogMirror, options?: {
37
+ intervalMs?: number;
38
+ }): {
39
+ stop: () => Promise<void>;
40
+ };
41
+ /**
42
+ * Upload changed files under `persistent-stage-logs/`, then drop keys for files that are
43
+ * no longer in the directory. A missing directory is a no-op, so a tick before
44
+ * the first stage command does not sweep a previous snapshot.
45
+ */
46
+ export declare function syncPersistentStageLogDirectory(args: {
47
+ dir: string;
48
+ sink: FileSink;
49
+ agentName: string;
50
+ uploaded: Map<string, {
51
+ size: number;
52
+ mtimeMs: number;
53
+ }>;
54
+ maxBytes?: number;
55
+ logger?: (line: string) => void;
56
+ }): Promise<void>;
57
+ //# sourceMappingURL=persistent-stage-log-mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-stage-log-mirror.d.ts","sourceRoot":"","sources":["../../src/internal/persistent-stage-log-mirror.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,8DAA8D;AAC9D,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,MAAkD,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C,GAAG,wBAAwB,GAAG,SAAS,CAiBvC;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,wBAAwB,EAChC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAgD/B;AAED;;;;GAIG;AACH,wBAAsB,+BAA+B,CAAC,IAAI,EAAE;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFhB"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Mirror a persistent slot's `/state/logs` directory onto the framework store.
3
+ *
4
+ * One loop for every file in the folder. A file whose size and mtime match
5
+ * the last upload is left alone, including the read. Anything else is read
6
+ * from its tail, masked, and written over the same key. Store keys whose
7
+ * files are gone are deleted. The timer lives on the serve process, because
8
+ * a persistent VM stays up between turns. Freeze pods do not enter this path.
9
+ */
10
+ import { open, readdir, stat } from "node:fs/promises";
11
+ import { join } from "node:path";
12
+ import { cursorHostedFiles } from "../files-backends/cursor-hosted.js";
13
+ import { agentSdkStorageKeys } from "../storage-protocol.js";
14
+ import { resolveApiKeySync } from "./cursor/credentials.js";
15
+ import { describeError } from "./describe-error.js";
16
+ import { maskStartLogTokens, START_LOG_STORE_MAX_BYTES } from "./start-log-store.js";
17
+ import { resolveAgentV2Hosting } from "./v2-hosting.js";
18
+ /** How often the resident process snapshots the directory. */
19
+ export const PERSISTENT_STAGE_LOG_SYNC_INTERVAL_MS = 30_000;
20
+ /**
21
+ * Basenames written by the persistent stage logger: timestamp, optional generation, stage.
22
+ * Rejects paths, so a listing cannot escape the directory.
23
+ */
24
+ export const PERSISTENT_STAGE_LOG_FILE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,180}\.log$/;
25
+ export function selectPersistentStageLogMirror(input) {
26
+ const hosting = resolveAgentV2Hosting({
27
+ architecture: input.project.agent.architecture,
28
+ env: input.env,
29
+ });
30
+ if (hosting.kind !== "cursor-managed-persistent") {
31
+ return undefined;
32
+ }
33
+ return {
34
+ logsDir: input.logsDir,
35
+ sink: cursorHostedFiles({
36
+ resolveStoreSourceId: () => hosting.resolveStoreIds().frameworkStoreSourceId,
37
+ resolveApiKey: () => resolveApiKeySync()?.apiKey,
38
+ }),
39
+ agentName: input.project.name,
40
+ logger: input.logger ?? (() => { }),
41
+ };
42
+ }
43
+ /**
44
+ * Start the directory sync and return a stop that flushes once more. The
45
+ * interval does not keep the process alive on its own. A tick that lands
46
+ * while a sync is running is dropped; stop still runs one more after it.
47
+ */
48
+ export function startPersistentStageLogMirror(mirror, options) {
49
+ const uploaded = new Map();
50
+ let stopped = false;
51
+ let syncing = false;
52
+ let chain = Promise.resolve();
53
+ const syncOnce = () => {
54
+ chain = chain
55
+ .then(() => syncPersistentStageLogDirectory({
56
+ dir: mirror.logsDir,
57
+ sink: mirror.sink,
58
+ agentName: mirror.agentName,
59
+ uploaded,
60
+ logger: mirror.logger,
61
+ }))
62
+ .catch((error) => {
63
+ mirror.logger(`[bdk] persistent-stage-logs: sync failed (${describeError(error)})`);
64
+ });
65
+ return chain;
66
+ };
67
+ const timer = setInterval(() => {
68
+ if (stopped || syncing) {
69
+ return;
70
+ }
71
+ syncing = true;
72
+ void syncOnce().finally(() => {
73
+ syncing = false;
74
+ });
75
+ }, options?.intervalMs ?? PERSISTENT_STAGE_LOG_SYNC_INTERVAL_MS);
76
+ timer.unref();
77
+ syncing = true;
78
+ void syncOnce().finally(() => {
79
+ syncing = false;
80
+ });
81
+ return {
82
+ stop: () => {
83
+ if (stopped) {
84
+ return chain;
85
+ }
86
+ stopped = true;
87
+ clearInterval(timer);
88
+ return syncOnce();
89
+ },
90
+ };
91
+ }
92
+ /**
93
+ * Upload changed files under `persistent-stage-logs/`, then drop keys for files that are
94
+ * no longer in the directory. A missing directory is a no-op, so a tick before
95
+ * the first stage command does not sweep a previous snapshot.
96
+ */
97
+ export async function syncPersistentStageLogDirectory(args) {
98
+ const logger = args.logger ?? (() => { });
99
+ const maxBytes = args.maxBytes ?? START_LOG_STORE_MAX_BYTES;
100
+ let entries;
101
+ try {
102
+ entries = await readdir(args.dir, { withFileTypes: true });
103
+ }
104
+ catch (error) {
105
+ if (isEnoent(error)) {
106
+ return;
107
+ }
108
+ logger(`[bdk] persistent-stage-logs: read dir failed (${describeError(error)})`);
109
+ return;
110
+ }
111
+ const desired = new Set();
112
+ const names = entries
113
+ .filter((entry) => entry.isFile() && PERSISTENT_STAGE_LOG_FILE_NAME.test(entry.name))
114
+ .map((entry) => entry.name)
115
+ .sort();
116
+ for (const name of names) {
117
+ const path = join(args.dir, name);
118
+ let fileStat;
119
+ try {
120
+ fileStat = await stat(path);
121
+ }
122
+ catch (error) {
123
+ if (isEnoent(error)) {
124
+ continue;
125
+ }
126
+ // Keep the previous snapshot when this tick cannot see the file.
127
+ logger(`[bdk] persistent-stage-logs: read failed for ${name} (${describeError(error)})`);
128
+ desired.add(name);
129
+ continue;
130
+ }
131
+ if (fileStat.size === 0) {
132
+ continue;
133
+ }
134
+ const previous = args.uploaded.get(name);
135
+ if (previous?.size === fileStat.size && previous.mtimeMs === fileStat.mtimeMs) {
136
+ desired.add(name);
137
+ continue;
138
+ }
139
+ let raw;
140
+ try {
141
+ raw = await readLogTail(path, fileStat.size, maxBytes);
142
+ }
143
+ catch (error) {
144
+ if (isEnoent(error)) {
145
+ continue;
146
+ }
147
+ logger(`[bdk] persistent-stage-logs: read failed for ${name} (${describeError(error)})`);
148
+ desired.add(name);
149
+ continue;
150
+ }
151
+ if (raw.length === 0) {
152
+ desired.add(name);
153
+ continue;
154
+ }
155
+ const body = maskStartLogTokens(raw);
156
+ desired.add(name);
157
+ const key = agentSdkStorageKeys.persistentStageLog(args.agentName, name);
158
+ try {
159
+ await args.sink.put(key, new TextEncoder().encode(body));
160
+ args.uploaded.set(name, { size: fileStat.size, mtimeMs: fileStat.mtimeMs });
161
+ }
162
+ catch (error) {
163
+ logger(`[bdk] persistent-stage-logs: persist failed for ${name} (${describeError(error)})`);
164
+ }
165
+ }
166
+ const prefix = agentSdkStorageKeys.persistentStageLogsPrefix(args.agentName);
167
+ let listed;
168
+ try {
169
+ listed = await args.sink.list(prefix);
170
+ }
171
+ catch (error) {
172
+ logger(`[bdk] persistent-stage-logs: list failed (${describeError(error)})`);
173
+ return;
174
+ }
175
+ for (const item of listed) {
176
+ const name = fileNameFromPersistentStageLogKey(item.key, prefix);
177
+ if (name === undefined || desired.has(name)) {
178
+ continue;
179
+ }
180
+ try {
181
+ await args.sink.delete(item.key);
182
+ args.uploaded.delete(name);
183
+ }
184
+ catch (error) {
185
+ logger(`[bdk] persistent-stage-logs: delete failed for ${name} (${describeError(error)})`);
186
+ }
187
+ }
188
+ }
189
+ /** Read the last `maxBytes` of a file without loading the rest of it. */
190
+ async function readLogTail(path, size, maxBytes) {
191
+ const length = Math.min(size, maxBytes);
192
+ const position = size - length;
193
+ const handle = await open(path, "r");
194
+ try {
195
+ const buffer = Buffer.alloc(length);
196
+ let offset = 0;
197
+ while (offset < length) {
198
+ const { bytesRead } = await handle.read(buffer, offset, length - offset, position + offset);
199
+ if (bytesRead === 0) {
200
+ break;
201
+ }
202
+ offset += bytesRead;
203
+ }
204
+ return new TextDecoder().decode(buffer.subarray(0, offset));
205
+ }
206
+ finally {
207
+ await handle.close();
208
+ }
209
+ }
210
+ function fileNameFromPersistentStageLogKey(key, prefix) {
211
+ if (!key.startsWith(prefix)) {
212
+ return undefined;
213
+ }
214
+ const segment = key.slice(prefix.length);
215
+ if (segment.length === 0 || segment.includes("/")) {
216
+ return undefined;
217
+ }
218
+ try {
219
+ const name = decodeURIComponent(segment);
220
+ return PERSISTENT_STAGE_LOG_FILE_NAME.test(name) ? name : undefined;
221
+ }
222
+ catch {
223
+ return undefined;
224
+ }
225
+ }
226
+ function isEnoent(error) {
227
+ return (error !== null &&
228
+ typeof error === "object" &&
229
+ "code" in error &&
230
+ error.code === "ENOENT");
231
+ }
@@ -8,7 +8,7 @@ import { dirname } from "node:path";
8
8
  export const PLATFORM_SCHEDULE_CATALOG_FILENAME = "platform-schedule-names.json";
9
9
  export async function syncHostedPlatformSchedules(args) {
10
10
  const previous = await readScheduleCatalog(args.catalogPath);
11
- const currentNames = args.schedules.map(schedule => schedule.name);
11
+ const currentNames = args.schedules.map((schedule) => schedule.name);
12
12
  const currentSet = new Set(currentNames);
13
13
  const failedDeletes = [];
14
14
  for (const name of previous) {
@@ -110,7 +110,7 @@ const AGENTSDK_REMINDERS_PREFIX = "/internal/agentsdk";
110
110
  const APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS = 3;
111
111
  const APPLY_REMINDER_OUTCOME_RETRY_DELAY_MS = 50;
112
112
  async function sleepMs(ms) {
113
- await new Promise(resolve => setTimeout(resolve, ms));
113
+ await new Promise((resolve) => setTimeout(resolve, ms));
114
114
  }
115
115
  async function withBoundedApplyRetries(run) {
116
116
  let lastError;