@cursor/bdk 0.2.11 → 0.2.13

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 (457) 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/github/index.d.ts +22 -12
  18. package/dist/channels/github/index.d.ts.map +1 -1
  19. package/dist/channels/github/index.js +11 -12
  20. package/dist/channels/gitlab/binding.js +4 -4
  21. package/dist/channels/gitlab/checks.js +1 -1
  22. package/dist/channels/gitlab/cursor-account.js +1 -1
  23. package/dist/channels/gitlab/events.js +1 -1
  24. package/dist/channels/gitlab/gitlab-channel.js +1 -1
  25. package/dist/channels/gitlab/gitlab-webhook.js +1 -1
  26. package/dist/channels/gitlab/replay.js +2 -2
  27. package/dist/channels/origin/binding.js +3 -3
  28. package/dist/channels/origin/checks.js +1 -1
  29. package/dist/channels/origin/cursor-account.js +1 -1
  30. package/dist/channels/origin/events.js +1 -1
  31. package/dist/channels/origin/index.d.ts +21 -11
  32. package/dist/channels/origin/index.d.ts.map +1 -1
  33. package/dist/channels/origin/index.js +10 -11
  34. package/dist/channels/origin/origin-channel.js +1 -1
  35. package/dist/channels/origin/origin-webhook.js +2 -2
  36. package/dist/channels/slack/agentic-delivery.js +3 -3
  37. package/dist/channels/slack/agentic-signals.js +1 -1
  38. package/dist/channels/slack/api.js +5 -5
  39. package/dist/channels/slack/approvals.js +1 -1
  40. package/dist/channels/slack/attachments.js +3 -3
  41. package/dist/channels/slack/blocks.js +3 -3
  42. package/dist/channels/slack/bot-mentions.js +4 -4
  43. package/dist/channels/slack/channel-watch.js +4 -4
  44. package/dist/channels/slack/cli-project.js +3 -3
  45. package/dist/channels/slack/dispatch.js +1 -1
  46. package/dist/channels/slack/doctor.js +1 -1
  47. package/dist/channels/slack/eval-directive.js +1 -1
  48. package/dist/channels/slack/footer.js +1 -1
  49. package/dist/channels/slack/interactive.js +2 -2
  50. package/dist/channels/slack/log.d.ts.map +1 -1
  51. package/dist/channels/slack/log.js +1 -1
  52. package/dist/channels/slack/manifest.js +1 -1
  53. package/dist/channels/slack/nudge-carrier.js +1 -1
  54. package/dist/channels/slack/nudge-store.js +2 -2
  55. package/dist/channels/slack/recording-sink.js +6 -6
  56. package/dist/channels/slack/reply-options.js +6 -6
  57. package/dist/channels/slack/self-identity.d.ts +7 -4
  58. package/dist/channels/slack/self-identity.d.ts.map +1 -1
  59. package/dist/channels/slack/self-identity.js +17 -8
  60. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  61. package/dist/channels/slack/sender-name.js +2 -6
  62. package/dist/channels/slack/setup.d.ts.map +1 -1
  63. package/dist/channels/slack/setup.js +1 -1
  64. package/dist/channels/slack/slack-channel.js +2 -2
  65. package/dist/channels/slack/socket-mode.js +2 -2
  66. package/dist/channels/slack/thread-context.js +8 -8
  67. package/dist/channels/slack/tool-cards.js +1 -1
  68. package/dist/channels/slack/user-info.d.ts +2 -1
  69. package/dist/channels/slack/user-info.d.ts.map +1 -1
  70. package/dist/channels/slack/user-info.js +16 -1
  71. package/dist/channels.js +1 -1
  72. package/dist/docs/404.html +3 -3
  73. package/dist/docs/assets/{app.DXI7bwox.js → app.CaLG1pPt.js} +4 -4
  74. package/dist/docs/assets/chunks/@localSearchIndexroot.DvlKuIO-.js +1 -0
  75. package/dist/docs/assets/chunks/{VPLocalSearchBox.BrbO5mEe.js → VPLocalSearchBox.YsP_2wqD.js} +2 -2
  76. package/dist/docs/assets/chunks/{arc.BOG1yms8.js → arc.C2j9hR7c.js} +1 -1
  77. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.C0hsMZnZ.js → architectureDiagram-Q4EWVU46.C5qkGp7y.js} +1 -1
  78. package/dist/docs/assets/chunks/{baseUniq.H044KjKs.js → baseUniq.U6GgTHOD.js} +1 -1
  79. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BsRW6GoB.js → blockDiagram-DXYQGD6D.D51mJop2.js} +1 -1
  80. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.B9HV5PFR.js → c4Diagram-AHTNJAMY.w1d6QxV7.js} +1 -1
  81. package/dist/docs/assets/chunks/channel.BRSFxCcD.js +1 -0
  82. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CPoT_ajl.js → chunk-4BX2VUAB.B_A815un.js} +1 -1
  83. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DZBwWuCL.js → chunk-4TB4RGXK.DMrm-ZCb.js} +1 -1
  84. package/dist/docs/assets/chunks/{chunk-55IACEB6.CZ3yTiyq.js → chunk-55IACEB6.8qw6Xdal.js} +1 -1
  85. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.6DfvHSd8.js → chunk-EDXVE4YY.Cq_nHODn.js} +1 -1
  86. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CpBj8HfK.js → chunk-FMBD7UC4.B67ohCYn.js} +1 -1
  87. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.BdKo8YqS.js → chunk-OYMX7WX6.Bo8rQI8F.js} +1 -1
  88. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnXNyxJx.js → chunk-QZHKN3VN.BERUMfE9.js} +1 -1
  89. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.Cg1OcF8G.js → chunk-YZCP3GAM.DWG2tXIX.js} +1 -1
  90. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Cmtm6WkN.js +1 -0
  91. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Cmtm6WkN.js +1 -0
  92. package/dist/docs/assets/chunks/clone.JMC96Eo6.js +1 -0
  93. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.1SP8al9c.js → cose-bilkent-S5V4N54A.tezXBs9b.js} +1 -1
  94. package/dist/docs/assets/chunks/{dagre-KV5264BT.DS1L6hJt.js → dagre-KV5264BT.aSbEUwT7.js} +1 -1
  95. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.ChsausbG.js → diagram-5BDNPKRD.vnT6aJ57.js} +1 -1
  96. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.3XsptNWj.js → diagram-G4DWMVQ6.hGYdrDa2.js} +1 -1
  97. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DPA9Dk_P.js → diagram-MMDJMWI5.CmdSUP6L.js} +1 -1
  98. package/dist/docs/assets/chunks/{diagram-TYMM5635.BVswXWrB.js → diagram-TYMM5635.BbAnLEBB.js} +1 -1
  99. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.BSak5OSP.js → erDiagram-SMLLAGMA.H40W4HWE.js} +1 -1
  100. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.CQgN4TTz.js → flowDiagram-DWJPFMVM.BFMtUSv-.js} +1 -1
  101. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.GrT0kA4a.js → ganttDiagram-T4ZO3ILL.CbYiu7Dt.js} +1 -1
  102. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CdS7Ucll.js → gitGraphDiagram-UUTBAWPF.Cyc5mzZD.js} +1 -1
  103. package/dist/docs/assets/chunks/{graph.BVqKRmRo.js → graph.BRptDG1H.js} +1 -1
  104. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.C3C9FRto.js → infoDiagram-42DDH7IO.Bz6KCA3a.js} +1 -1
  105. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js → ishikawaDiagram-UXIWVN3A.DDJ_7_Fq.js} +1 -1
  106. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CaHMfK4b.js → journeyDiagram-VCZTEJTY.D0t_ltlb.js} +1 -1
  107. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.CjhIUwcA.js → kanban-definition-6JOO6SKY.DyyNsMfi.js} +1 -1
  108. package/dist/docs/assets/chunks/{layout.CGU3gfSf.js → layout.Cbxq-Rhp.js} +1 -1
  109. package/dist/docs/assets/chunks/{linear.DaihpW_n.js → linear.DxGYL0MP.js} +1 -1
  110. package/dist/docs/assets/chunks/{min.BS-j8kHQ.js → min.DA5KL8wu.js} +1 -1
  111. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.BVJ1Bbnk.js → mindmap-definition-QFDTVHPH.Bc72Utls.js} +1 -1
  112. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.Cz1WIv9r.js → pieDiagram-DEJITSTG.BtpHnIB_.js} +1 -1
  113. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DKLFxcjy.js → quadrantDiagram-34T5L4WZ.Cx4oCSRR.js} +1 -1
  114. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.BHegiK7x.js → requirementDiagram-MS252O5E.BC0hXWlW.js} +1 -1
  115. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DYkY6yPc.js → sankeyDiagram-XADWPNL6.Dg8T1SEp.js} +1 -1
  116. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DYQ1QUrI.js → sequenceDiagram-FGHM5R23.CWSdHYAF.js} +1 -1
  117. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.Iru8BsFo.js → stateDiagram-FHFEXIEX.0MVPRI28.js} +1 -1
  118. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.N4Am6sXd.js +1 -0
  119. package/dist/docs/assets/chunks/{theme.DaplWQhQ.js → theme.DO1avLBn.js} +2 -2
  120. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BwFA8hiX.js → timeline-definition-GMOUNBTQ.BuRinAVi.js} +1 -1
  121. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CZ60W1C_.js → vennDiagram-DHZGUBPP.DXf0PCoJ.js} +1 -1
  122. package/dist/docs/assets/chunks/wardley-RL74JXVD._eATmGtu.js +162 -0
  123. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.B69D2r8-.js → wardleyDiagram-NUSXRM2D.T4ThngYV.js} +1 -1
  124. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CLPZEIU9.js → xychartDiagram-5P7HB3ND.b4pZF3D5.js} +1 -1
  125. package/dist/docs/assets/{reference_connections.md.Bljpve-y.js → reference_connections.md.DLrgAd5f.js} +1 -1
  126. package/dist/docs/assets/{reference_hooks.md.C5LCJ1R3.js → reference_hooks.md.B-eGa2km.js} +3 -3
  127. package/dist/docs/assets/{reference_hooks.md.C5LCJ1R3.lean.js → reference_hooks.md.B-eGa2km.lean.js} +1 -1
  128. package/dist/docs/assets/{reference_sessions.md.CM5zo3w4.js → reference_sessions.md.CyM7ARz1.js} +1 -1
  129. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  130. package/dist/docs/assets/{reference_tools.md.v3SXVSs_.js → reference_tools.md.DzIY9JzY.js} +3 -3
  131. package/dist/docs/assets/{reference_tools.md.v3SXVSs_.lean.js → reference_tools.md.DzIY9JzY.lean.js} +1 -1
  132. package/dist/docs/assets/{style.C130MVnH.css → style.Dwls12uf.css} +1 -1
  133. package/dist/docs/building-with-agents.html +37 -37
  134. package/dist/docs/deployment.html +37 -37
  135. package/dist/docs/evals.html +37 -37
  136. package/dist/docs/guides/agent-to-agent.html +37 -37
  137. package/dist/docs/guides/bitbucket.html +37 -37
  138. package/dist/docs/guides/cloud-agents.html +37 -37
  139. package/dist/docs/guides/convert-automation.html +37 -37
  140. package/dist/docs/guides/github.html +37 -37
  141. package/dist/docs/guides/gitlab.html +37 -37
  142. package/dist/docs/guides/grokbot-agents.html +37 -37
  143. package/dist/docs/guides/hooks.html +37 -37
  144. package/dist/docs/guides/improve.html +37 -37
  145. package/dist/docs/guides/jev.html +37 -37
  146. package/dist/docs/guides/mcp-oauth.html +37 -37
  147. package/dist/docs/guides/migrate.html +37 -37
  148. package/dist/docs/guides/opentelemetry.html +37 -37
  149. package/dist/docs/guides/slack.html +37 -37
  150. package/dist/docs/guides/webhooks.html +37 -37
  151. package/dist/docs/hashmap.json +1 -1
  152. package/dist/docs/hillclimbing.html +37 -37
  153. package/dist/docs/index.html +37 -37
  154. package/dist/docs/llms-full.txt +15 -2
  155. package/dist/docs/quickstart.html +37 -37
  156. package/dist/docs/reference/agent-config.html +37 -37
  157. package/dist/docs/reference/artifacts.html +37 -37
  158. package/dist/docs/reference/channels.html +37 -37
  159. package/dist/docs/reference/cli.html +37 -37
  160. package/dist/docs/reference/connections.html +39 -39
  161. package/dist/docs/reference/connections.md +2 -1
  162. package/dist/docs/reference/evals.html +37 -37
  163. package/dist/docs/reference/extensions.html +37 -37
  164. package/dist/docs/reference/hooks.html +39 -39
  165. package/dist/docs/reference/hooks.md +1 -0
  166. package/dist/docs/reference/http-api.html +37 -37
  167. package/dist/docs/reference/instructions.html +37 -37
  168. package/dist/docs/reference/playground.html +36 -36
  169. package/dist/docs/reference/project-layout.html +37 -37
  170. package/dist/docs/reference/prompt.html +37 -37
  171. package/dist/docs/reference/schedules.html +37 -37
  172. package/dist/docs/reference/sessions.html +37 -37
  173. package/dist/docs/reference/sessions.md +1 -1
  174. package/dist/docs/reference/skills.html +40 -40
  175. package/dist/docs/reference/subagents.html +37 -37
  176. package/dist/docs/reference/tools.html +39 -39
  177. package/dist/docs/reference/tools.md +11 -0
  178. package/dist/docs/templates/agentic-owners.html +37 -37
  179. package/dist/docs/templates/grokbot-agents.html +37 -37
  180. package/dist/docs/templates/security-reviewer.html +37 -37
  181. package/dist/docs/templates/thermo-quality-review.html +37 -37
  182. package/dist/docs/templates/thermo-review.html +37 -37
  183. package/dist/docs/templates/triage.html +37 -37
  184. package/dist/docs/troubleshooting.html +36 -36
  185. package/dist/evals/assertions.d.ts.map +1 -1
  186. package/dist/evals/assertions.js +21 -19
  187. package/dist/evals/expect.js +1 -1
  188. package/dist/evals/judge.js +1 -1
  189. package/dist/evals/reporters.js +8 -8
  190. package/dist/evals/run-facts.js +2 -2
  191. package/dist/evals.js +6 -6
  192. package/dist/extensions/cursor-cloud-agents/extension.d.ts +2 -0
  193. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  194. package/dist/extensions/cursor-cloud-agents/extension.js +2 -1
  195. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +16 -0
  196. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  197. package/dist/extensions/cursor-cloud-agents/lib/backend.js +44 -3
  198. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
  199. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts +23 -0
  200. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.d.ts.map +1 -0
  201. package/dist/extensions/cursor-cloud-agents/lib/launch-agent.js +32 -0
  202. package/dist/extensions/cursor-cloud-agents/lib/repos.js +2 -2
  203. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -2
  204. package/dist/extensions/cursor-cloud-agents/lib/watch.d.ts.map +1 -1
  205. package/dist/extensions/cursor-cloud-agents/lib/watch.js +1 -1
  206. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -1
  207. package/dist/extensions/cursor-cloud-agents/tools/launch.js +3 -8
  208. package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
  209. package/dist/extensions/cursor-grokbot-agents/extension.js +3 -3
  210. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  211. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +3 -3
  212. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +4 -4
  213. package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
  214. package/dist/extensions/improve/skills/yourself.js +1 -1
  215. package/dist/extensions/jev/extension.js +2 -2
  216. package/dist/extensions/jev/tools/evaluate.js +1 -1
  217. package/dist/extensions/slack-communication/tools/react.js +1 -1
  218. package/dist/files-backends/cursor-hosted.js +8 -8
  219. package/dist/files-backends/local-fs.js +1 -1
  220. package/dist/filesystem.d.ts.map +1 -1
  221. package/dist/filesystem.js +15 -15
  222. package/dist/internal/advertise-tools.d.ts +3 -2
  223. package/dist/internal/advertise-tools.d.ts.map +1 -1
  224. package/dist/internal/advertise-tools.js +11 -9
  225. package/dist/internal/approval-gate.js +1 -1
  226. package/dist/internal/artifacts-store.js +13 -13
  227. package/dist/internal/as-of.js +2 -2
  228. package/dist/internal/authored-alias-hooks.d.ts +4 -3
  229. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  230. package/dist/internal/authored-alias-hooks.js +16 -7
  231. package/dist/internal/authored-loaders.d.ts.map +1 -1
  232. package/dist/internal/authored-loaders.js +21 -5
  233. package/dist/internal/builtin-tools/reminders.js +2 -2
  234. package/dist/internal/chat-client.js +5 -5
  235. package/dist/internal/cli-ax.js +14 -14
  236. package/dist/internal/cli-bitbucket.js +10 -10
  237. package/dist/internal/cli-convert-automation.js +2 -2
  238. package/dist/internal/cli-cursor.js +2 -2
  239. package/dist/internal/cli-deploy.d.ts.map +1 -1
  240. package/dist/internal/cli-deploy.js +40 -40
  241. package/dist/internal/cli-docs.js +5 -5
  242. package/dist/internal/cli-github.js +15 -15
  243. package/dist/internal/cli-gitlab.js +10 -10
  244. package/dist/internal/cli-images.js +16 -16
  245. package/dist/internal/cli-manifest.js +1 -1
  246. package/dist/internal/cli-mcp-oauth.js +5 -5
  247. package/dist/internal/cli-mcp.js +3 -3
  248. package/dist/internal/cli-migrate.js +1 -1
  249. package/dist/internal/cli-skills.js +2 -2
  250. package/dist/internal/cli-slack.js +5 -5
  251. package/dist/internal/cloud-turn-cost.js +1 -1
  252. package/dist/internal/continuation-identity.js +6 -6
  253. package/dist/internal/conversation-mirror.js +5 -5
  254. package/dist/internal/convert-automation/convert-workflow.js +24 -24
  255. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  256. package/dist/internal/cursor/account-mcp.js +20 -20
  257. package/dist/internal/cursor/backend-client.js +6 -6
  258. package/dist/internal/cursor/credentials.js +1 -1
  259. package/dist/internal/cursor/store-api-client.js +1 -1
  260. package/dist/internal/cursor-account-mcp-auth.js +9 -9
  261. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  262. package/dist/internal/cursor-deployment-relay.js +9 -9
  263. package/dist/internal/cursor-event-relay.js +10 -10
  264. package/dist/internal/cursor-relay-core.js +2 -2
  265. package/dist/internal/deploy-manifest.d.ts +14 -0
  266. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  267. package/dist/internal/deploy-manifest.js +33 -10
  268. package/dist/internal/discovery/agent-config.js +2 -2
  269. package/dist/internal/discovery/agent.js +6 -6
  270. package/dist/internal/discovery/connections.js +5 -5
  271. package/dist/internal/discovery/cursor-plugin.js +12 -12
  272. package/dist/internal/discovery/extension-overlay.js +3 -3
  273. package/dist/internal/discovery/extensions.js +6 -6
  274. package/dist/internal/discovery/info.js +9 -9
  275. package/dist/internal/discovery/instructions.js +1 -1
  276. package/dist/internal/discovery/project.js +3 -3
  277. package/dist/internal/discovery/services.js +1 -1
  278. package/dist/internal/discovery/tools.js +1 -1
  279. package/dist/internal/docs-site.js +2 -2
  280. package/dist/internal/env-file.js +1 -1
  281. package/dist/internal/eval-run-store.js +7 -7
  282. package/dist/internal/eval-runner.d.ts.map +1 -1
  283. package/dist/internal/eval-runner.js +14 -14
  284. package/dist/internal/eval-transport.js +1 -1
  285. package/dist/internal/evals-client.d.ts.map +1 -1
  286. package/dist/internal/evals-client.js +4 -4
  287. package/dist/internal/event-log.js +8 -8
  288. package/dist/internal/event-mapper.js +13 -13
  289. package/dist/internal/expected-delivery-failure.js +2 -2
  290. package/dist/internal/filesystem/format.js +2 -2
  291. package/dist/internal/filesystem/nearest.js +3 -3
  292. package/dist/internal/filesystem/scratch.js +3 -3
  293. package/dist/internal/filesystem/tools.js +6 -6
  294. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  295. package/dist/internal/filesystem/walk.js +2 -2
  296. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  297. package/dist/internal/framework-file-storage.js +6 -5
  298. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  299. package/dist/internal/framework-storage-selection.js +4 -2
  300. package/dist/internal/github-fanout.d.ts.map +1 -1
  301. package/dist/internal/github-fanout.js +3 -3
  302. package/dist/internal/guest-network.js +4 -4
  303. package/dist/internal/host-files.js +1 -1
  304. package/dist/internal/host-kv.js +2 -2
  305. package/dist/internal/hosted-catch-protocol.js +1 -1
  306. package/dist/internal/hosted-catch.js +1 -1
  307. package/dist/internal/hosted-delivery-protocol.d.ts +24 -0
  308. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  309. package/dist/internal/hosted-delivery-protocol.js +58 -14
  310. package/dist/internal/hosted-delivery.d.ts +6 -0
  311. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  312. package/dist/internal/hosted-delivery.js +64 -13
  313. package/dist/internal/hosted-eval-cases.js +4 -4
  314. package/dist/internal/hosted-execution-diag.js +3 -3
  315. package/dist/internal/hosted-managed-automation.d.ts +3 -3
  316. package/dist/internal/hosted-managed-automation.js +3 -3
  317. package/dist/internal/hosting.js +1 -1
  318. package/dist/internal/http-channel.js +1 -1
  319. package/dist/internal/http-control-plane-session.js +2 -2
  320. package/dist/internal/init-interview.js +7 -7
  321. package/dist/internal/init-project.d.ts.map +1 -1
  322. package/dist/internal/init-project.js +12 -12
  323. package/dist/internal/inline-stdio-mcp.js +2 -2
  324. package/dist/internal/install-cursor-skills.js +11 -11
  325. package/dist/internal/json-schema.js +1 -1
  326. package/dist/internal/local-control-plane.js +3 -3
  327. package/dist/internal/local-env.js +3 -3
  328. package/dist/internal/log-ring.js +1 -1
  329. package/dist/internal/logs-client.js +1 -1
  330. package/dist/internal/mcp-endpoint.js +8 -8
  331. package/dist/internal/mcp-host.d.ts.map +1 -1
  332. package/dist/internal/mcp-host.js +5 -5
  333. package/dist/internal/mcp-oauth-on-demand.js +3 -3
  334. package/dist/internal/mcp-oauth.js +5 -5
  335. package/dist/internal/net.js +2 -2
  336. package/dist/internal/otel/config.js +3 -3
  337. package/dist/internal/otel/runtime.js +13 -13
  338. package/dist/internal/peer-connections.js +2 -2
  339. package/dist/internal/persistent-stage-log-mirror.d.ts +57 -0
  340. package/dist/internal/persistent-stage-log-mirror.d.ts.map +1 -0
  341. package/dist/internal/persistent-stage-log-mirror.js +231 -0
  342. package/dist/internal/platform-schedule-sync.js +1 -1
  343. package/dist/internal/platform-timers.js +1 -1
  344. package/dist/internal/playground/static.js +2 -2
  345. package/dist/internal/playground/toolchain.js +2 -2
  346. package/dist/internal/playground-proxy.js +3 -3
  347. package/dist/internal/process-memory-telemetry.js +1 -1
  348. package/dist/internal/reminder-runner.d.ts +1 -1
  349. package/dist/internal/reminder-runner.d.ts.map +1 -1
  350. package/dist/internal/reminder-runner.js +14 -16
  351. package/dist/internal/reminder-store.js +1 -1
  352. package/dist/internal/resolved-connections.js +8 -8
  353. package/dist/internal/router.js +4 -4
  354. package/dist/internal/run-client.js +2 -2
  355. package/dist/internal/schedule-runner.d.ts +13 -2
  356. package/dist/internal/schedule-runner.d.ts.map +1 -1
  357. package/dist/internal/schedule-runner.js +48 -9
  358. package/dist/internal/sdk-runner.d.ts +2 -1
  359. package/dist/internal/sdk-runner.d.ts.map +1 -1
  360. package/dist/internal/sdk-runner.js +13 -8
  361. package/dist/internal/serve-restart.js +1 -1
  362. package/dist/internal/server.d.ts.map +1 -1
  363. package/dist/internal/server.js +101 -76
  364. package/dist/internal/session-cost.js +3 -3
  365. package/dist/internal/session-engine.d.ts +8 -0
  366. package/dist/internal/session-engine.d.ts.map +1 -1
  367. package/dist/internal/session-engine.js +183 -118
  368. package/dist/internal/session-live-publisher.d.ts +48 -0
  369. package/dist/internal/session-live-publisher.d.ts.map +1 -0
  370. package/dist/internal/session-live-publisher.js +415 -0
  371. package/dist/internal/session-run-log.js +6 -6
  372. package/dist/internal/sessions-client.js +3 -3
  373. package/dist/internal/skill-catalog.js +2 -2
  374. package/dist/internal/sleep.js +1 -1
  375. package/dist/internal/start-log-store.d.ts +5 -1
  376. package/dist/internal/start-log-store.d.ts.map +1 -1
  377. package/dist/internal/start-log-store.js +5 -3
  378. package/dist/internal/storage-coordinator.js +12 -12
  379. package/dist/internal/store-api-protocol.d.ts +51 -0
  380. package/dist/internal/store-api-protocol.d.ts.map +1 -1
  381. package/dist/internal/store-api-protocol.js +39 -2
  382. package/dist/internal/store-mirror.js +4 -4
  383. package/dist/internal/stream-progress.d.ts.map +1 -1
  384. package/dist/internal/stream-progress.js +4 -0
  385. package/dist/internal/terminal-style.js +2 -2
  386. package/dist/internal/testing/conversation-identity-vectors.d.ts +48 -0
  387. package/dist/internal/testing/conversation-identity-vectors.d.ts.map +1 -0
  388. package/dist/internal/testing/conversation-identity-vectors.js +136 -0
  389. package/dist/internal/tool-call-retry.d.ts +87 -0
  390. package/dist/internal/tool-call-retry.d.ts.map +1 -0
  391. package/dist/internal/tool-call-retry.js +387 -0
  392. package/dist/internal/tool-result.js +3 -3
  393. package/dist/internal/trajectory.js +7 -7
  394. package/dist/internal/turn-governor.js +2 -2
  395. package/dist/internal/turn-outbox.js +1 -1
  396. package/dist/internal/update-check.d.ts.map +1 -1
  397. package/dist/internal/update-check.js +4 -2
  398. package/dist/internal/v2-hosting.d.ts +6 -0
  399. package/dist/internal/v2-hosting.d.ts.map +1 -1
  400. package/dist/internal/v2-hosting.js +7 -1
  401. package/dist/internal/workspace.js +4 -4
  402. package/dist/kv/memory-kv.js +3 -3
  403. package/dist/playground/assets/index-CzttDc-d.css +1 -0
  404. package/dist/playground/assets/{index-Be0-1hw2.js → index-DIiKbZ25.js} +42 -42
  405. package/dist/playground/index.html +2 -2
  406. package/dist/prompt.js +1 -1
  407. package/dist/storage-backends/cursor-hosted-v2.js +2 -2
  408. package/dist/storage-backends/file-kv.js +7 -7
  409. package/dist/storage-protocol.d.ts +7 -0
  410. package/dist/storage-protocol.d.ts.map +1 -1
  411. package/dist/storage-protocol.js +7 -0
  412. package/dist/storage.js +3 -3
  413. package/dist/types.d.ts +21 -4
  414. package/dist/types.d.ts.map +1 -1
  415. package/dist/types.js +4 -4
  416. package/docs/reference/connections.md +2 -1
  417. package/docs/reference/hooks.md +1 -0
  418. package/docs/reference/sessions.md +1 -1
  419. package/docs/reference/tools.md +11 -0
  420. package/package.json +6 -6
  421. package/templates/agentic-owners/bot/channels/github.ts +2 -2
  422. package/templates/agentic-owners/bot/lib/github.ts +7 -5
  423. package/templates/agentic-owners/bot/lib/owners/decision.ts +9 -9
  424. package/templates/agentic-owners/bot/lib/owners/handles.ts +2 -2
  425. package/templates/agentic-owners/bot/lib/owners/match.ts +5 -3
  426. package/templates/agentic-owners/bot/lib/owners/matching.ts +1 -1
  427. package/templates/agentic-owners/bot/lib/owners/parse.ts +4 -4
  428. package/templates/agentic-owners/bot/lib/owners/prompt.ts +1 -1
  429. package/templates/agentic-owners/bot/lib/review.ts +18 -17
  430. package/templates/agentic-owners/evals/owners.eval.ts +2 -2
  431. package/templates/agents-md/bot/lib/collect.ts +6 -6
  432. package/templates/agents-md/bot/lib/config.ts +1 -1
  433. package/templates/agents-md/bot/tools/apply_agents.ts +4 -4
  434. package/templates/code-wiki/bot/channels/github.ts +3 -3
  435. package/templates/code-wiki/bot/lib/repos.ts +1 -1
  436. package/templates/code-wiki/bot/tools/apply_wiki.ts +2 -2
  437. package/templates/demo/bot/lib/collect.ts +1 -1
  438. package/templates/demo/bot/lib/repos.ts +1 -1
  439. package/templates/demo/bot/tools/record_demo.ts +1 -1
  440. package/templates/pr-autofixer/bot/channels/github.ts +2 -2
  441. package/templates/pr-autofixer/bot/lib/merge-watch.ts +2 -2
  442. package/templates/pr-autofixer/bot/lib/repos.ts +2 -2
  443. package/templates/pr-autofixer/bot/lib/webhook-routing.ts +1 -1
  444. package/templates/security-help/bot/lib/repos.ts +1 -1
  445. package/templates/security-reviewer/bot/lib/repos.ts +1 -1
  446. package/templates/triage/bot/lib/actuate.ts +15 -15
  447. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +0 -1
  448. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +0 -1
  449. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +0 -1
  450. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +0 -1
  451. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +0 -1
  452. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +0 -1
  453. package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +0 -162
  454. package/dist/playground/assets/index-Clz6uHj9.css +0 -1
  455. /package/dist/docs/assets/{reference_connections.md.Bljpve-y.lean.js → reference_connections.md.DLrgAd5f.lean.js} +0 -0
  456. /package/dist/docs/assets/{reference_sessions.md.CM5zo3w4.lean.js → reference_sessions.md.CyM7ARz1.lean.js} +0 -0
  457. /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
@@ -0,0 +1,48 @@
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). An event over the per-event cap
39
+ * keeps its envelope and `data` with long strings shortened, marked
40
+ * `liveTruncated`; when even that is too large, `data` keeps only the fields
41
+ * viewers need to place the event.
42
+ */
43
+ export declare function toSessionLiveWire(event: SessionEvent): {
44
+ wire: SessionLiveEventWire;
45
+ bytes: number;
46
+ };
47
+ export declare function createSessionLivePublisher(options: SessionLivePublisherOptions): SessionLivePublisher;
48
+ //# 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;AA8DD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG;IACtD,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CA+BA;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAqStB"}
@@ -0,0 +1,415 @@
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
+ /** Per-string length limits tried, longest first, until an event fits the cap. */
48
+ const LIVE_TRUNCATION_STEPS = [4096, 1024, 256, 64];
49
+ /**
50
+ * `data` fields viewers use to place an event (which tool card, which
51
+ * subagent, how the turn ended). They survive every truncation step.
52
+ */
53
+ const LIVE_IDENTITY_KEYS = [
54
+ "callId",
55
+ "toolName",
56
+ "parentCallId",
57
+ "isError",
58
+ "finishReason",
59
+ "stepId",
60
+ "decision",
61
+ "sdkAgentId",
62
+ ];
63
+ const LIVE_TRUNCATION_MARKER = "… [truncated in the live view]";
64
+ function truncateStrings(value, maxChars) {
65
+ if (typeof value === "string") {
66
+ return value.length > maxChars ? `${value.slice(0, maxChars)}${LIVE_TRUNCATION_MARKER}` : value;
67
+ }
68
+ if (Array.isArray(value)) {
69
+ return value.map((item) => truncateStrings(item, maxChars));
70
+ }
71
+ if (value !== null && typeof value === "object") {
72
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, truncateStrings(item, maxChars)]));
73
+ }
74
+ return value;
75
+ }
76
+ function identityData(data) {
77
+ const kept = {};
78
+ if (data === null || typeof data !== "object" || Array.isArray(data)) {
79
+ return kept;
80
+ }
81
+ for (const key of LIVE_IDENTITY_KEYS) {
82
+ const value = data[key];
83
+ if (typeof value === "number" || typeof value === "boolean") {
84
+ kept[key] = value;
85
+ }
86
+ else if (typeof value === "string") {
87
+ kept[key] = truncateStrings(value, 256);
88
+ }
89
+ }
90
+ // `actions.requested` places its tool cards from `calls`.
91
+ const calls = data.calls;
92
+ if (Array.isArray(calls)) {
93
+ kept.calls = calls.slice(0, 50).map((call) => identityData(call));
94
+ }
95
+ return kept;
96
+ }
97
+ /**
98
+ * The event as it crosses the live wire. Delta events drop the accumulated
99
+ * `text` (viewers rebuild it from deltas). An event over the per-event cap
100
+ * keeps its envelope and `data` with long strings shortened, marked
101
+ * `liveTruncated`; when even that is too large, `data` keeps only the fields
102
+ * viewers need to place the event.
103
+ */
104
+ export function toSessionLiveWire(event) {
105
+ let wire = event;
106
+ if (DELTA_EVENT_TYPES.has(event.type)) {
107
+ const data = event.data;
108
+ if (data !== undefined && "text" in data) {
109
+ const { text: _text, ...rest } = data;
110
+ wire = { ...wire, data: rest };
111
+ }
112
+ }
113
+ const bytes = utf8Bytes(JSON.stringify(wire));
114
+ if (bytes <= SESSION_LIVE_MAX_EVENT_BYTES) {
115
+ return { wire, bytes };
116
+ }
117
+ for (const maxChars of LIVE_TRUNCATION_STEPS) {
118
+ const candidate = {
119
+ ...wire,
120
+ data: truncateStrings(wire.data, maxChars),
121
+ liveTruncated: true,
122
+ };
123
+ const candidateBytes = utf8Bytes(JSON.stringify(candidate));
124
+ if (candidateBytes <= SESSION_LIVE_MAX_EVENT_BYTES) {
125
+ return { wire: candidate, bytes: candidateBytes };
126
+ }
127
+ }
128
+ const minimal = { index: event.index, type: event.type };
129
+ if (typeof event.at === "string")
130
+ minimal.at = event.at;
131
+ if (typeof event.turnId === "string")
132
+ minimal.turnId = event.turnId;
133
+ if (typeof event.sessionId === "string")
134
+ minimal.sessionId = event.sessionId;
135
+ minimal.data = identityData(wire.data);
136
+ minimal.liveTruncated = true;
137
+ return { wire: minimal, bytes: utf8Bytes(JSON.stringify(minimal)) };
138
+ }
139
+ export function createSessionLivePublisher(options) {
140
+ const now = options.now ?? Date.now;
141
+ const logger = options.logger ?? (() => { });
142
+ const isEnabled = options.isEnabled ?? (() => isStoreApiLaneEnabled(options));
143
+ const sessions = new Map();
144
+ let disabled = false;
145
+ let closed = false;
146
+ const stateFor = (sessionId) => {
147
+ let state = sessions.get(sessionId);
148
+ if (state === undefined) {
149
+ state = {
150
+ subscribed: false,
151
+ nextProbeAt: 0,
152
+ queue: [],
153
+ queuedBytes: 0,
154
+ timer: undefined,
155
+ inFlight: false,
156
+ sendAgain: false,
157
+ failures: 0,
158
+ pausedUntil: 0,
159
+ lastReplay: undefined,
160
+ lastEventAt: now(),
161
+ closing: false,
162
+ };
163
+ sessions.set(sessionId, state);
164
+ }
165
+ return state;
166
+ };
167
+ const dropSession = (sessionId, state) => {
168
+ if (state.timer !== undefined) {
169
+ clearTimeout(state.timer);
170
+ }
171
+ sessions.delete(sessionId);
172
+ };
173
+ const sweepIdle = () => {
174
+ const cutoff = now() - SESSION_LIVE_IDLE_MS;
175
+ for (const [sessionId, state] of sessions) {
176
+ if (!state.inFlight && state.lastEventAt < cutoff) {
177
+ dropSession(sessionId, state);
178
+ }
179
+ }
180
+ };
181
+ const clearQueue = (state) => {
182
+ state.queue = [];
183
+ state.queuedBytes = 0;
184
+ };
185
+ const enqueue = (state, events) => {
186
+ const byIndex = new Map(state.queue.map((entry) => [entry.index, entry]));
187
+ for (const event of events) {
188
+ const { wire, bytes } = toSessionLiveWire(event);
189
+ byIndex.set(event.index, { index: event.index, wire, bytes });
190
+ }
191
+ // Over the cap, the newest events drop: the viewer needs an unbroken run
192
+ // from its next index, and the relay asks for the rest again once the
193
+ // oldest land.
194
+ const queue = [...byIndex.values()]
195
+ .sort((a, b) => a.index - b.index)
196
+ .slice(0, SESSION_LIVE_MAX_QUEUED_EVENTS);
197
+ state.queue = queue;
198
+ state.queuedBytes = queue.reduce((total, entry) => total + entry.bytes, 0);
199
+ };
200
+ const takeBatch = (state) => {
201
+ const batch = [];
202
+ let bytes = 0;
203
+ while (batch.length < SESSION_LIVE_MAX_BATCH_EVENTS) {
204
+ const next = state.queue[0];
205
+ if (next === undefined) {
206
+ break;
207
+ }
208
+ if (batch.length > 0 && bytes + next.bytes > SESSION_LIVE_MAX_BATCH_BYTES) {
209
+ break;
210
+ }
211
+ batch.push(next);
212
+ bytes += next.bytes;
213
+ state.queue.shift();
214
+ }
215
+ state.queuedBytes -= bytes;
216
+ return batch;
217
+ };
218
+ const post = async (sessionId, events) => {
219
+ let response;
220
+ try {
221
+ response = await resolveCursorApiFetch(options)(`${resolveCursorApiBaseUrl(options)}${STORE_API_PATH}/${STORE_API_SESSION_LIVE_CALL}`, {
222
+ method: "POST",
223
+ headers: {
224
+ Authorization: `Bearer ${resolveCursorApiKey(options)}`,
225
+ "Content-Type": "application/json",
226
+ },
227
+ body: JSON.stringify({
228
+ v: STORE_API_PROTOCOL_VERSION,
229
+ call: STORE_API_SESSION_LIVE_CALL,
230
+ payload: { sessionId, events },
231
+ }),
232
+ signal: AbortSignal.timeout(SESSION_LIVE_REQUEST_TIMEOUT_MS),
233
+ });
234
+ }
235
+ catch (error) {
236
+ return { kind: "failed", reason: describeError(error) };
237
+ }
238
+ if (response.status === 404) {
239
+ return { kind: "not_found" };
240
+ }
241
+ if (response.status === 429) {
242
+ const seconds = Number(response.headers.get("retry-after"));
243
+ return {
244
+ kind: "shed",
245
+ retryAfterMs: Number.isFinite(seconds) && seconds > 0 ? seconds * 1_000 : SESSION_LIVE_PAUSE_MS,
246
+ };
247
+ }
248
+ if (!response.ok) {
249
+ return { kind: "failed", reason: `HTTP ${response.status}` };
250
+ }
251
+ try {
252
+ const parsed = sessionLiveResponseSchema.safeParse(await response.json());
253
+ return parsed.success
254
+ ? { kind: "ok", reply: parsed.data }
255
+ : { kind: "failed", reason: "response failed the session.live schema" };
256
+ }
257
+ catch {
258
+ return { kind: "failed", reason: "non-JSON response" };
259
+ }
260
+ };
261
+ const replay = async (sessionId, state, from) => {
262
+ const at = now();
263
+ if (state.lastReplay !== undefined &&
264
+ state.lastReplay.from === from &&
265
+ at - state.lastReplay.at < SESSION_LIVE_REPLAY_COOLDOWN_MS) {
266
+ return;
267
+ }
268
+ state.lastReplay = { from, at };
269
+ try {
270
+ enqueue(state, await options.readEvents(sessionId, from));
271
+ }
272
+ catch (error) {
273
+ logger(`[bdk] live replay read failed for ${sessionId}: ${describeError(error)}`);
274
+ }
275
+ };
276
+ const schedule = (sessionId, state, delayMs) => {
277
+ if (state.timer !== undefined || closed) {
278
+ return;
279
+ }
280
+ state.timer = setTimeout(() => {
281
+ state.timer = undefined;
282
+ void send(sessionId, state);
283
+ }, delayMs);
284
+ state.timer.unref?.();
285
+ };
286
+ const send = async (sessionId, state) => {
287
+ if (disabled || closed) {
288
+ return;
289
+ }
290
+ if (state.inFlight) {
291
+ state.sendAgain = true;
292
+ return;
293
+ }
294
+ state.inFlight = true;
295
+ state.sendAgain = false;
296
+ const batch = state.subscribed ? takeBatch(state) : [];
297
+ try {
298
+ const outcome = await post(sessionId, batch.map((entry) => entry.wire));
299
+ switch (outcome.kind) {
300
+ case "not_found":
301
+ disabled = true;
302
+ for (const [id, other] of sessions) {
303
+ dropSession(id, other);
304
+ }
305
+ logger("[bdk] live session relay unavailable (404); live publishing off for this process");
306
+ return;
307
+ case "shed":
308
+ state.subscribed = false;
309
+ clearQueue(state);
310
+ state.pausedUntil = now() + outcome.retryAfterMs;
311
+ return;
312
+ case "failed":
313
+ state.failures += 1;
314
+ clearQueue(state);
315
+ if (state.failures >= SESSION_LIVE_FAILURES_BEFORE_PAUSE) {
316
+ state.failures = 0;
317
+ state.subscribed = false;
318
+ state.pausedUntil = now() + SESSION_LIVE_PAUSE_MS;
319
+ logger(`[bdk] live publishing paused for ${sessionId}: ${outcome.reason}`);
320
+ }
321
+ return;
322
+ case "ok": {
323
+ state.failures = 0;
324
+ const { reply } = outcome;
325
+ state.subscribed = reply.subscribed;
326
+ if (!reply.subscribed) {
327
+ clearQueue(state);
328
+ state.nextProbeAt = now() + reply.recheckAfterMs;
329
+ return;
330
+ }
331
+ if (reply.replayFromIndex !== null) {
332
+ await replay(sessionId, state, reply.replayFromIndex);
333
+ }
334
+ return;
335
+ }
336
+ }
337
+ }
338
+ finally {
339
+ state.inFlight = false;
340
+ if (state.closing && state.queue.length === 0) {
341
+ dropSession(sessionId, state);
342
+ }
343
+ else if (state.subscribed && (state.queue.length > 0 || state.sendAgain)) {
344
+ schedule(sessionId, state, 0);
345
+ }
346
+ else if (state.sendAgain) {
347
+ void send(sessionId, state);
348
+ }
349
+ }
350
+ };
351
+ return {
352
+ event(event) {
353
+ if (disabled || closed) {
354
+ return;
355
+ }
356
+ try {
357
+ const sessionId = event.sessionId;
358
+ if (typeof sessionId !== "string" || sessionId === "") {
359
+ return;
360
+ }
361
+ let state = sessions.get(sessionId);
362
+ if (state === undefined) {
363
+ sweepIdle();
364
+ state = stateFor(sessionId);
365
+ if (!isEnabled()) {
366
+ // Decided once per session: the pin is a file read, and delta
367
+ // events arrive per token.
368
+ state.pausedUntil = Number.POSITIVE_INFINITY;
369
+ }
370
+ }
371
+ const at = now();
372
+ state.lastEventAt = at;
373
+ if (TERMINAL_EVENT_TYPES.has(event.type)) {
374
+ state.closing = true;
375
+ }
376
+ if (at < state.pausedUntil) {
377
+ if (state.closing) {
378
+ dropSession(sessionId, state);
379
+ }
380
+ return;
381
+ }
382
+ if (!state.subscribed) {
383
+ if (at >= state.nextProbeAt && !state.inFlight) {
384
+ state.nextProbeAt = at + SESSION_LIVE_BATCH_WINDOW_MS;
385
+ void send(sessionId, state);
386
+ }
387
+ else if (state.closing && !state.inFlight) {
388
+ dropSession(sessionId, state);
389
+ }
390
+ return;
391
+ }
392
+ enqueue(state, [event]);
393
+ if (BOUNDARY_EVENT_TYPES.has(event.type) ||
394
+ state.queuedBytes >= SESSION_LIVE_EAGER_BATCH_BYTES) {
395
+ if (state.timer !== undefined) {
396
+ clearTimeout(state.timer);
397
+ state.timer = undefined;
398
+ }
399
+ void send(sessionId, state);
400
+ return;
401
+ }
402
+ schedule(sessionId, state, SESSION_LIVE_BATCH_WINDOW_MS);
403
+ }
404
+ catch (error) {
405
+ logger(`[bdk] live publish skipped: ${describeError(error)}`);
406
+ }
407
+ },
408
+ close() {
409
+ closed = true;
410
+ for (const [sessionId, state] of sessions) {
411
+ dropSession(sessionId, state);
412
+ }
413
+ },
414
+ };
415
+ }
@@ -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({