@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
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Publishes session events to the managed live relay (`session.live`) so the
3
+ * playground, the session view, and the CLI can show a hosted turn while it
4
+ * runs. The on-disk event log and the storage coordinator stay the durable
5
+ * path; this is a best-effort copy for viewers.
6
+ *
7
+ * The relay keeps events only while a viewer watches. Unwatched, a session
8
+ * sends a small probe at most once per `recheckAfterMs` window and nothing
9
+ * else. Once a viewer watches, events go out in short batches, and when the
10
+ * relay reports a gap (`replayFromIndex`) the missing events are reread from
11
+ * the local log and resent.
12
+ *
13
+ * Publishing can never slow or fail a turn: {@link SessionLivePublisher.event}
14
+ * is synchronous, requests time out quickly, queues are bounded, a failed
15
+ * batch is dropped, and repeated failures pause the session. A 404 means the
16
+ * backend predates the relay and turns publishing off for the process.
17
+ */
18
+ import type { SessionEvent } from "../types.js";
19
+ import { type CursorApiTransportOptions } from "./cursor/cursor-api-transport.js";
20
+ import { type SessionLiveEventWire } from "./store-api-protocol.js";
21
+ /** How long events collect before a batch goes out. */
22
+ export declare const SESSION_LIVE_BATCH_WINDOW_MS = 150;
23
+ export interface SessionLivePublisherOptions extends CursorApiTransportOptions {
24
+ /** Local events from `fromIndex` on, for replays. */
25
+ readEvents(sessionId: string, fromIndex: number): Promise<SessionEvent[]>;
26
+ /** Whether the managed store API is bound; defaults to the pod's store pin. */
27
+ isEnabled?: () => boolean;
28
+ logger?: (line: string) => void;
29
+ now?: () => number;
30
+ }
31
+ export interface SessionLivePublisher {
32
+ /** Offer one appended event. Never throws and never waits. */
33
+ event(event: SessionEvent): void;
34
+ close(): void;
35
+ }
36
+ /**
37
+ * The event as it crosses the live wire. Delta events drop the accumulated
38
+ * `text` (viewers rebuild it from deltas), and an event over the per-event
39
+ * cap keeps only its envelope, marked `liveTruncated`.
40
+ */
41
+ export declare function toSessionLiveWire(event: SessionEvent): {
42
+ wire: SessionLiveEventWire;
43
+ bytes: number;
44
+ };
45
+ export declare function createSessionLivePublisher(options: SessionLivePublisherOptions): SessionLivePublisher;
46
+ //# sourceMappingURL=session-live-publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-live-publisher.d.ts","sourceRoot":"","sources":["../../src/internal/session-live-publisher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,KAAK,yBAAyB,EAI/B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAIL,KAAK,oBAAoB,EAM1B,MAAM,yBAAyB,CAAC;AAEjC,uDAAuD;AACvD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AA+ChD,MAAM,WAAW,2BAA4B,SAAQ,yBAAyB;IAC5E,qDAAqD;IACrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1E,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG;IACtD,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CAoBA;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAqStB"}
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Publishes session events to the managed live relay (`session.live`) so the
3
+ * playground, the session view, and the CLI can show a hosted turn while it
4
+ * runs. The on-disk event log and the storage coordinator stay the durable
5
+ * path; this is a best-effort copy for viewers.
6
+ *
7
+ * The relay keeps events only while a viewer watches. Unwatched, a session
8
+ * sends a small probe at most once per `recheckAfterMs` window and nothing
9
+ * else. Once a viewer watches, events go out in short batches, and when the
10
+ * relay reports a gap (`replayFromIndex`) the missing events are reread from
11
+ * the local log and resent.
12
+ *
13
+ * Publishing can never slow or fail a turn: {@link SessionLivePublisher.event}
14
+ * is synchronous, requests time out quickly, queues are bounded, a failed
15
+ * batch is dropped, and repeated failures pause the session. A 404 means the
16
+ * backend predates the relay and turns publishing off for the process.
17
+ */
18
+ import { resolveCursorApiBaseUrl, resolveCursorApiFetch, resolveCursorApiKey, } from "./cursor/cursor-api-transport.js";
19
+ import { isStoreApiLaneEnabled } from "./cursor/store-api-client.js";
20
+ import { describeError } from "./describe-error.js";
21
+ import { SESSION_LIVE_MAX_BATCH_BYTES, SESSION_LIVE_MAX_BATCH_EVENTS, SESSION_LIVE_MAX_EVENT_BYTES, STORE_API_PATH, STORE_API_PROTOCOL_VERSION, STORE_API_SESSION_LIVE_CALL, sessionLiveResponseSchema, } from "./store-api-protocol.js";
22
+ /** How long events collect before a batch goes out. */
23
+ export const SESSION_LIVE_BATCH_WINDOW_MS = 150;
24
+ /** A batch this large goes out without waiting for the window. */
25
+ const SESSION_LIVE_EAGER_BATCH_BYTES = 64 * 1024;
26
+ const SESSION_LIVE_REQUEST_TIMEOUT_MS = 1_000;
27
+ /** Queued events per session; past this the oldest drop and the relay asks for a replay. */
28
+ const SESSION_LIVE_MAX_QUEUED_EVENTS = 2_000;
29
+ const SESSION_LIVE_FAILURES_BEFORE_PAUSE = 3;
30
+ const SESSION_LIVE_PAUSE_MS = 60_000;
31
+ /** The same replay request is honored at most this often. */
32
+ const SESSION_LIVE_REPLAY_COOLDOWN_MS = 5_000;
33
+ /** A session with no events for this long drops its state. */
34
+ const SESSION_LIVE_IDLE_MS = 10 * 60_000;
35
+ const TERMINAL_EVENT_TYPES = new Set(["session.completed", "session.failed"]);
36
+ const BOUNDARY_EVENT_TYPES = new Set([
37
+ "turn.completed",
38
+ "turn.failed",
39
+ "session.waiting",
40
+ "session.completed",
41
+ "session.failed",
42
+ ]);
43
+ const DELTA_EVENT_TYPES = new Set(["message.appended", "reasoning.appended"]);
44
+ function utf8Bytes(text) {
45
+ return Buffer.byteLength(text, "utf8");
46
+ }
47
+ /**
48
+ * The event as it crosses the live wire. Delta events drop the accumulated
49
+ * `text` (viewers rebuild it from deltas), and an event over the per-event
50
+ * cap keeps only its envelope, marked `liveTruncated`.
51
+ */
52
+ export function toSessionLiveWire(event) {
53
+ let wire = event;
54
+ if (DELTA_EVENT_TYPES.has(event.type)) {
55
+ const data = event.data;
56
+ if (data !== undefined && "text" in data) {
57
+ const { text: _text, ...rest } = data;
58
+ wire = { ...wire, data: rest };
59
+ }
60
+ }
61
+ const serialized = JSON.stringify(wire);
62
+ const bytes = utf8Bytes(serialized);
63
+ if (bytes <= SESSION_LIVE_MAX_EVENT_BYTES) {
64
+ return { wire, bytes };
65
+ }
66
+ const stub = { index: event.index, type: event.type };
67
+ if (typeof event.at === "string")
68
+ stub.at = event.at;
69
+ if (typeof event.turnId === "string")
70
+ stub.turnId = event.turnId;
71
+ if (typeof event.sessionId === "string")
72
+ stub.sessionId = event.sessionId;
73
+ stub.liveTruncated = true;
74
+ return { wire: stub, bytes: utf8Bytes(JSON.stringify(stub)) };
75
+ }
76
+ export function createSessionLivePublisher(options) {
77
+ const now = options.now ?? Date.now;
78
+ const logger = options.logger ?? (() => { });
79
+ const isEnabled = options.isEnabled ?? (() => isStoreApiLaneEnabled(options));
80
+ const sessions = new Map();
81
+ let disabled = false;
82
+ let closed = false;
83
+ const stateFor = (sessionId) => {
84
+ let state = sessions.get(sessionId);
85
+ if (state === undefined) {
86
+ state = {
87
+ subscribed: false,
88
+ nextProbeAt: 0,
89
+ queue: [],
90
+ queuedBytes: 0,
91
+ timer: undefined,
92
+ inFlight: false,
93
+ sendAgain: false,
94
+ failures: 0,
95
+ pausedUntil: 0,
96
+ lastReplay: undefined,
97
+ lastEventAt: now(),
98
+ closing: false,
99
+ };
100
+ sessions.set(sessionId, state);
101
+ }
102
+ return state;
103
+ };
104
+ const dropSession = (sessionId, state) => {
105
+ if (state.timer !== undefined) {
106
+ clearTimeout(state.timer);
107
+ }
108
+ sessions.delete(sessionId);
109
+ };
110
+ const sweepIdle = () => {
111
+ const cutoff = now() - SESSION_LIVE_IDLE_MS;
112
+ for (const [sessionId, state] of sessions) {
113
+ if (!state.inFlight && state.lastEventAt < cutoff) {
114
+ dropSession(sessionId, state);
115
+ }
116
+ }
117
+ };
118
+ const clearQueue = (state) => {
119
+ state.queue = [];
120
+ state.queuedBytes = 0;
121
+ };
122
+ const enqueue = (state, events) => {
123
+ const byIndex = new Map(state.queue.map((entry) => [entry.index, entry]));
124
+ for (const event of events) {
125
+ const { wire, bytes } = toSessionLiveWire(event);
126
+ byIndex.set(event.index, { index: event.index, wire, bytes });
127
+ }
128
+ // Over the cap, the newest events drop: the viewer needs an unbroken run
129
+ // from its next index, and the relay asks for the rest again once the
130
+ // oldest land.
131
+ const queue = [...byIndex.values()]
132
+ .sort((a, b) => a.index - b.index)
133
+ .slice(0, SESSION_LIVE_MAX_QUEUED_EVENTS);
134
+ state.queue = queue;
135
+ state.queuedBytes = queue.reduce((total, entry) => total + entry.bytes, 0);
136
+ };
137
+ const takeBatch = (state) => {
138
+ const batch = [];
139
+ let bytes = 0;
140
+ while (batch.length < SESSION_LIVE_MAX_BATCH_EVENTS) {
141
+ const next = state.queue[0];
142
+ if (next === undefined) {
143
+ break;
144
+ }
145
+ if (batch.length > 0 && bytes + next.bytes > SESSION_LIVE_MAX_BATCH_BYTES) {
146
+ break;
147
+ }
148
+ batch.push(next);
149
+ bytes += next.bytes;
150
+ state.queue.shift();
151
+ }
152
+ state.queuedBytes -= bytes;
153
+ return batch;
154
+ };
155
+ const post = async (sessionId, events) => {
156
+ let response;
157
+ try {
158
+ response = await resolveCursorApiFetch(options)(`${resolveCursorApiBaseUrl(options)}${STORE_API_PATH}/${STORE_API_SESSION_LIVE_CALL}`, {
159
+ method: "POST",
160
+ headers: {
161
+ Authorization: `Bearer ${resolveCursorApiKey(options)}`,
162
+ "Content-Type": "application/json",
163
+ },
164
+ body: JSON.stringify({
165
+ v: STORE_API_PROTOCOL_VERSION,
166
+ call: STORE_API_SESSION_LIVE_CALL,
167
+ payload: { sessionId, events },
168
+ }),
169
+ signal: AbortSignal.timeout(SESSION_LIVE_REQUEST_TIMEOUT_MS),
170
+ });
171
+ }
172
+ catch (error) {
173
+ return { kind: "failed", reason: describeError(error) };
174
+ }
175
+ if (response.status === 404) {
176
+ return { kind: "not_found" };
177
+ }
178
+ if (response.status === 429) {
179
+ const seconds = Number(response.headers.get("retry-after"));
180
+ return {
181
+ kind: "shed",
182
+ retryAfterMs: Number.isFinite(seconds) && seconds > 0 ? seconds * 1_000 : SESSION_LIVE_PAUSE_MS,
183
+ };
184
+ }
185
+ if (!response.ok) {
186
+ return { kind: "failed", reason: `HTTP ${response.status}` };
187
+ }
188
+ try {
189
+ const parsed = sessionLiveResponseSchema.safeParse(await response.json());
190
+ return parsed.success
191
+ ? { kind: "ok", reply: parsed.data }
192
+ : { kind: "failed", reason: "response failed the session.live schema" };
193
+ }
194
+ catch {
195
+ return { kind: "failed", reason: "non-JSON response" };
196
+ }
197
+ };
198
+ const replay = async (sessionId, state, from) => {
199
+ const at = now();
200
+ if (state.lastReplay !== undefined &&
201
+ state.lastReplay.from === from &&
202
+ at - state.lastReplay.at < SESSION_LIVE_REPLAY_COOLDOWN_MS) {
203
+ return;
204
+ }
205
+ state.lastReplay = { from, at };
206
+ try {
207
+ enqueue(state, await options.readEvents(sessionId, from));
208
+ }
209
+ catch (error) {
210
+ logger(`[bdk] live replay read failed for ${sessionId}: ${describeError(error)}`);
211
+ }
212
+ };
213
+ const schedule = (sessionId, state, delayMs) => {
214
+ if (state.timer !== undefined || closed) {
215
+ return;
216
+ }
217
+ state.timer = setTimeout(() => {
218
+ state.timer = undefined;
219
+ void send(sessionId, state);
220
+ }, delayMs);
221
+ state.timer.unref?.();
222
+ };
223
+ const send = async (sessionId, state) => {
224
+ if (disabled || closed) {
225
+ return;
226
+ }
227
+ if (state.inFlight) {
228
+ state.sendAgain = true;
229
+ return;
230
+ }
231
+ state.inFlight = true;
232
+ state.sendAgain = false;
233
+ const batch = state.subscribed ? takeBatch(state) : [];
234
+ try {
235
+ const outcome = await post(sessionId, batch.map((entry) => entry.wire));
236
+ switch (outcome.kind) {
237
+ case "not_found":
238
+ disabled = true;
239
+ for (const [id, other] of sessions) {
240
+ dropSession(id, other);
241
+ }
242
+ logger("[bdk] live session relay unavailable (404); live publishing off for this process");
243
+ return;
244
+ case "shed":
245
+ state.subscribed = false;
246
+ clearQueue(state);
247
+ state.pausedUntil = now() + outcome.retryAfterMs;
248
+ return;
249
+ case "failed":
250
+ state.failures += 1;
251
+ clearQueue(state);
252
+ if (state.failures >= SESSION_LIVE_FAILURES_BEFORE_PAUSE) {
253
+ state.failures = 0;
254
+ state.subscribed = false;
255
+ state.pausedUntil = now() + SESSION_LIVE_PAUSE_MS;
256
+ logger(`[bdk] live publishing paused for ${sessionId}: ${outcome.reason}`);
257
+ }
258
+ return;
259
+ case "ok": {
260
+ state.failures = 0;
261
+ const { reply } = outcome;
262
+ state.subscribed = reply.subscribed;
263
+ if (!reply.subscribed) {
264
+ clearQueue(state);
265
+ state.nextProbeAt = now() + reply.recheckAfterMs;
266
+ return;
267
+ }
268
+ if (reply.replayFromIndex !== null) {
269
+ await replay(sessionId, state, reply.replayFromIndex);
270
+ }
271
+ return;
272
+ }
273
+ }
274
+ }
275
+ finally {
276
+ state.inFlight = false;
277
+ if (state.closing && state.queue.length === 0) {
278
+ dropSession(sessionId, state);
279
+ }
280
+ else if (state.subscribed && (state.queue.length > 0 || state.sendAgain)) {
281
+ schedule(sessionId, state, 0);
282
+ }
283
+ else if (state.sendAgain) {
284
+ void send(sessionId, state);
285
+ }
286
+ }
287
+ };
288
+ return {
289
+ event(event) {
290
+ if (disabled || closed) {
291
+ return;
292
+ }
293
+ try {
294
+ const sessionId = event.sessionId;
295
+ if (typeof sessionId !== "string" || sessionId === "") {
296
+ return;
297
+ }
298
+ let state = sessions.get(sessionId);
299
+ if (state === undefined) {
300
+ sweepIdle();
301
+ state = stateFor(sessionId);
302
+ if (!isEnabled()) {
303
+ // Decided once per session: the pin is a file read, and delta
304
+ // events arrive per token.
305
+ state.pausedUntil = Number.POSITIVE_INFINITY;
306
+ }
307
+ }
308
+ const at = now();
309
+ state.lastEventAt = at;
310
+ if (TERMINAL_EVENT_TYPES.has(event.type)) {
311
+ state.closing = true;
312
+ }
313
+ if (at < state.pausedUntil) {
314
+ if (state.closing) {
315
+ dropSession(sessionId, state);
316
+ }
317
+ return;
318
+ }
319
+ if (!state.subscribed) {
320
+ if (at >= state.nextProbeAt && !state.inFlight) {
321
+ state.nextProbeAt = at + SESSION_LIVE_BATCH_WINDOW_MS;
322
+ void send(sessionId, state);
323
+ }
324
+ else if (state.closing && !state.inFlight) {
325
+ dropSession(sessionId, state);
326
+ }
327
+ return;
328
+ }
329
+ enqueue(state, [event]);
330
+ if (BOUNDARY_EVENT_TYPES.has(event.type) ||
331
+ state.queuedBytes >= SESSION_LIVE_EAGER_BATCH_BYTES) {
332
+ if (state.timer !== undefined) {
333
+ clearTimeout(state.timer);
334
+ state.timer = undefined;
335
+ }
336
+ void send(sessionId, state);
337
+ return;
338
+ }
339
+ schedule(sessionId, state, SESSION_LIVE_BATCH_WINDOW_MS);
340
+ }
341
+ catch (error) {
342
+ logger(`[bdk] live publish skipped: ${describeError(error)}`);
343
+ }
344
+ },
345
+ close() {
346
+ closed = true;
347
+ for (const [sessionId, state] of sessions) {
348
+ dropSession(sessionId, state);
349
+ }
350
+ },
351
+ };
352
+ }
@@ -10,7 +10,7 @@ import { agentSdkStorageKeys } from "../storage-protocol.js";
10
10
  import { resolveApiKeySync } from "./cursor/credentials.js";
11
11
  import { describeError } from "./describe-error.js";
12
12
  import { isRecord } from "./is-record.js";
13
- import { resolveAgentV2Hosting } from "./v2-hosting.js";
13
+ import { isCursorManagedV2Hosting, resolveAgentV2Hosting } from "./v2-hosting.js";
14
14
  export const SESSION_RUN_LOG_VERSION = 1;
15
15
  /** Last N log-ring lines kept on each execution. */
16
16
  export const SESSION_RUN_LOG_MAX_ENTRIES = 200;
@@ -44,7 +44,7 @@ export async function flushSessionRunFatal(error) {
44
44
  }
45
45
  await Promise.race([
46
46
  fatalFlush(error).catch(() => undefined),
47
- new Promise(resolve => {
47
+ new Promise((resolve) => {
48
48
  setTimeout(resolve, SESSION_RUN_FATAL_FLUSH_TIMEOUT_MS);
49
49
  }),
50
50
  ]);
@@ -74,7 +74,7 @@ export function serializeSessionRunError(error) {
74
74
  }
75
75
  export function snapshotSessionRunLogs(entries) {
76
76
  const tail = entries.slice(-SESSION_RUN_LOG_MAX_ENTRIES);
77
- return tail.map(entry => ({
77
+ return tail.map((entry) => ({
78
78
  index: entry.index,
79
79
  at: entry.at,
80
80
  line: boundedText(entry.line, SESSION_RUN_LOG_MAX_LINE_CHARS),
@@ -196,7 +196,7 @@ function boundExecution(write) {
196
196
  };
197
197
  }
198
198
  function upsertExecution(existing, next) {
199
- const executions = existing.filter(entry => entry.executionId !== next.executionId);
199
+ const executions = existing.filter((entry) => entry.executionId !== next.executionId);
200
200
  executions.push(next);
201
201
  executions.sort((a, b) => a.writtenAt.localeCompare(b.writtenAt));
202
202
  return executions.slice(-SESSION_RUN_LOG_MAX_EXECUTIONS);
@@ -210,7 +210,7 @@ function shrinkSessionDocument(document) {
210
210
  };
211
211
  let serialized = JSON.stringify(next);
212
212
  while (serialized.length > MAX_DOCUMENT_CHARS) {
213
- const oldestWithLogs = executions.findIndex(entry => entry.logs.length > 0);
213
+ const oldestWithLogs = executions.findIndex((entry) => entry.logs.length > 0);
214
214
  if (oldestWithLogs >= 0) {
215
215
  const entry = executions[oldestWithLogs];
216
216
  executions = executions.map((item, index) => index === oldestWithLogs
@@ -368,7 +368,7 @@ export function selectSessionRunLogStore(input) {
368
368
  architecture: input.project.agent.architecture,
369
369
  env: input.env,
370
370
  });
371
- if (hosting.kind !== "cursor-managed") {
371
+ if (!isCursorManagedV2Hosting(hosting)) {
372
372
  return undefined;
373
373
  }
374
374
  return createSessionRunLogStore({
@@ -143,7 +143,7 @@ function parseSessionSummary(value) {
143
143
  * one are skipped).
144
144
  */
145
145
  export function pickPreviousSession(sessions) {
146
- const followable = sessions.filter(s => typeof s.continuationToken === "string" && s.continuationToken !== "");
146
+ const followable = sessions.filter((s) => typeof s.continuationToken === "string" && s.continuationToken !== "");
147
147
  if (followable.length === 0) {
148
148
  return undefined;
149
149
  }
@@ -171,7 +171,7 @@ export function formatSessionsTable(sessions, options) {
171
171
  return `${sourceLine}No sessions.\n`;
172
172
  }
173
173
  const header = ["SESSION", "CHANNEL", "MODE", "TURNS", "RUNNING", "UPDATED"];
174
- const rows = sessions.map(s => [
174
+ const rows = sessions.map((s) => [
175
175
  s.sessionId,
176
176
  s.channelId,
177
177
  s.mode,
@@ -182,7 +182,7 @@ export function formatSessionsTable(sessions, options) {
182
182
  return `${sourceLine}${renderTable(header, rows)}\n`;
183
183
  }
184
184
  function renderTable(header, rows) {
185
- const widths = header.map((h, i) => Math.max(h.length, ...rows.map(row => (row[i] ?? "").length)));
185
+ const widths = header.map((h, i) => Math.max(h.length, ...rows.map((row) => (row[i] ?? "").length)));
186
186
  const renderRow = (row) => row
187
187
  .map((cell, i) => cell.padEnd(widths[i] ?? 0))
188
188
  .join(" ")
@@ -16,9 +16,9 @@ export function skillListEntry(skill) {
16
16
  return { name: skill.name, description: skill.description };
17
17
  }
18
18
  export async function readSkillDetail(skills, skillName) {
19
- const skill = skills.find(s => s.name === skillName);
19
+ const skill = skills.find((s) => s.name === skillName);
20
20
  if (skill === undefined) {
21
- throw new UnknownSkillError(skillName, skills.map(s => s.name));
21
+ throw new UnknownSkillError(skillName, skills.map((s) => s.name));
22
22
  }
23
23
  // Null-prototype: authored keys (`defineSkill`) pass through
24
24
  // unvalidated, and `__proto__` would silently vanish on a plain object.
@@ -1,3 +1,3 @@
1
1
  export function sleep(ms) {
2
- return new Promise(resolve => setTimeout(resolve, ms));
2
+ return new Promise((resolve) => setTimeout(resolve, ms));
3
3
  }
@@ -15,6 +15,8 @@ export interface StartLogStore {
15
15
  read(startLogId: string): Promise<string | undefined>;
16
16
  }
17
17
  export declare function tailStartLogText(raw: string, maxBytes: number): string;
18
+ /** Mask credential tokens before persisting a snapshot. */
19
+ export declare function maskStartLogTokens(text: string): string;
18
20
  export declare function resolveEngineStartLogPath(env?: NodeJS.ProcessEnv): string;
19
21
  /**
20
22
  * Read the local engine tee. Missing/empty is `undefined` (no store write).
@@ -30,7 +32,9 @@ export declare function createStartLogStore(input: {
30
32
  logger?: (line: string) => void;
31
33
  }): StartLogStore;
32
34
  /**
33
- * Same selection as the session-run log: architecture-v2 hosted engines.
35
+ * Freeze pods only. A persistent slot writes one file per command under
36
+ * `/state/logs` and mirrors that directory; this store is the single
37
+ * `start.log` tee those pods do not produce.
34
38
  */
35
39
  export declare function selectStartLogStore(input: {
36
40
  project: AgentProject;
@@ -1 +1 @@
1
- {"version":3,"file":"start-log-store.d.ts","sourceRoot":"","sources":["../../src/internal/start-log-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,MAAwB,CAAC;AAEjE,iCAAiC;AACjC,eAAO,MAAM,6BAA6B,sCAAsC,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AA0BD,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAKtF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB9B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,aAAa,CAqChB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,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,aAAa,GAAG,SAAS,CAgB5B;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAchB"}
1
+ {"version":3,"file":"start-log-store.d.ts","sourceRoot":"","sources":["../../src/internal/start-log-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,EAAE,MAAwB,CAAC;AAEjE,iCAAiC;AACjC,eAAO,MAAM,6BAA6B,sCAAsC,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAqBD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAKtF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB9B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,aAAa,CAqChB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,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,aAAa,GAAG,SAAS,CAgB5B;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAchB"}
@@ -26,7 +26,7 @@ export function tailStartLogText(raw, maxBytes) {
26
26
  }
27
27
  /** Each character literally or percent-encoded, as tokens appear in URLs. */
28
28
  function encodable(text) {
29
- return Array.from(text, char => {
29
+ return Array.from(text, (char) => {
30
30
  const lower = char.charCodeAt(0).toString(16).padStart(2, "0");
31
31
  const upper = char.toUpperCase().charCodeAt(0).toString(16).padStart(2, "0");
32
32
  return lower === upper ? `(?:${char}|%${lower})` : `(?:${char}|%${lower}|%${upper})`;
@@ -41,7 +41,7 @@ const TOKEN_MASKS = [
41
41
  [/\bxox[baprs]-[A-Za-z0-9-]+\b/g, "xox…"],
42
42
  ];
43
43
  /** Mask credential tokens before persisting a snapshot. */
44
- function maskStartLogTokens(text) {
44
+ export function maskStartLogTokens(text) {
45
45
  return TOKEN_MASKS.reduce((masked, [pattern, mask]) => masked.replace(pattern, mask), text);
46
46
  }
47
47
  export function resolveEngineStartLogPath(env = process.env) {
@@ -113,7 +113,9 @@ export function createStartLogStore(input) {
113
113
  };
114
114
  }
115
115
  /**
116
- * Same selection as the session-run log: architecture-v2 hosted engines.
116
+ * Freeze pods only. A persistent slot writes one file per command under
117
+ * `/state/logs` and mirrors that directory; this store is the single
118
+ * `start.log` tee those pods do not produce.
117
119
  */
118
120
  export function selectStartLogStore(input) {
119
121
  const hosting = resolveAgentV2Hosting({
@@ -74,8 +74,8 @@ function resumeProjectionJson(record) {
74
74
  /** Session records out of raw sink entries; rows without a usable id are dropped. */
75
75
  function sessionRecordsOf(entries) {
76
76
  return entries
77
- .map(entry => entry.value)
78
- .filter(record => record != null && typeof record.sessionId === "string" && record.sessionId !== "");
77
+ .map((entry) => entry.value)
78
+ .filter((record) => record != null && typeof record.sessionId === "string" && record.sessionId !== "");
79
79
  }
80
80
  export class StorageCoordinator {
81
81
  constructor(options) {
@@ -186,7 +186,7 @@ export class StorageCoordinator {
186
186
  // A terminal event can arrive through a debounce-policy timer flush,
187
187
  // where eventDispatched never ran: detect it from the buffered events
188
188
  // so a finished session's record is exact under either policy.
189
- const exact = exactRecord || events.some(event => TERMINAL_SESSION_EVENTS.has(event.type));
189
+ const exact = exactRecord || events.some((event) => TERMINAL_SESSION_EVENTS.has(event.type));
190
190
  // Exact flushes repair earlier volatile-only skips: when the buffer no
191
191
  // longer holds a record, the newest skipped one still gets written.
192
192
  const record = buffer?.record ??
@@ -272,7 +272,7 @@ export class StorageCoordinator {
272
272
  const putMany = this.definition.putMany?.bind(this.definition);
273
273
  if (putMany !== undefined) {
274
274
  return {
275
- label: `putMany(${puts.map(entry => entry.key).join(", ")})`,
275
+ label: `putMany(${puts.map((entry) => entry.key).join(", ")})`,
276
276
  run: async (ctx) => {
277
277
  const results = await putMany(puts, ctx);
278
278
  let recordFailed = false;
@@ -290,7 +290,7 @@ export class StorageCoordinator {
290
290
  };
291
291
  }
292
292
  return {
293
- label: `put(${puts.map(entry => entry.key).join(", ")})`,
293
+ label: `put(${puts.map((entry) => entry.key).join(", ")})`,
294
294
  run: async (ctx) => {
295
295
  let recordFailed = false;
296
296
  for (const entry of puts) {
@@ -334,14 +334,14 @@ export class StorageCoordinator {
334
334
  putOp(key, value) {
335
335
  return {
336
336
  label: `put(${key})`,
337
- run: ctx => this.definition.put(key, value, ctx),
337
+ run: (ctx) => this.definition.put(key, value, ctx),
338
338
  };
339
339
  }
340
340
  /** KV delete op on the sink's `delete` (skipped when the hook is absent). */
341
341
  deleteOp(key) {
342
342
  return {
343
343
  label: `delete(${key})`,
344
- run: ctx => this.definition.delete?.(key, ctx),
344
+ run: (ctx) => this.definition.delete?.(key, ctx),
345
345
  };
346
346
  }
347
347
  // ==========================================================================
@@ -366,8 +366,8 @@ export class StorageCoordinator {
366
366
  async listSessions() {
367
367
  const entries = await this.tryList(this.keys.sessionPrefix(this.agentName));
368
368
  return entries
369
- .map(entry => entry.value)
370
- .filter(record => record != null);
369
+ .map((entry) => entry.value)
370
+ .filter((record) => record != null);
371
371
  }
372
372
  /**
373
373
  * Session records from the sink for the sessions API. Unlike
@@ -537,7 +537,7 @@ export class StorageCoordinator {
537
537
  this.enqueue([
538
538
  {
539
539
  label: `evals.put(${run.runId})`,
540
- run: ctx => table.put(snapshot, ctx),
540
+ run: (ctx) => table.put(snapshot, ctx),
541
541
  },
542
542
  ], "policy");
543
543
  },
@@ -545,7 +545,7 @@ export class StorageCoordinator {
545
545
  this.enqueue([
546
546
  {
547
547
  label: `evals.delete(${runId})`,
548
- run: ctx => table.delete(runId, ctx),
548
+ run: (ctx) => table.delete(runId, ctx),
549
549
  },
550
550
  ], "policy");
551
551
  },
@@ -586,7 +586,7 @@ export class StorageCoordinator {
586
586
  let timer;
587
587
  const drained = await Promise.race([
588
588
  this.queue.then(() => true),
589
- new Promise(resolve => {
589
+ new Promise((resolve) => {
590
590
  timer = setTimeout(() => resolve(false), CLOSE_DRAIN_TIMEOUT_MS);
591
591
  timer.unref?.();
592
592
  }),