@cursor/july 0.1.102 → 0.1.104

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 (789) hide show
  1. package/AGENTS.md +34 -32
  2. package/README.md +10 -12
  3. package/dist/ab.d.ts +1 -1
  4. package/dist/ab.js +1 -1
  5. package/dist/bin/agent-serve.d.ts +12 -12
  6. package/dist/bin/agent-serve.js +114 -36
  7. package/dist/channels/bitbucket/api.d.ts +176 -0
  8. package/dist/channels/bitbucket/api.d.ts.map +1 -0
  9. package/dist/channels/bitbucket/api.js +419 -0
  10. package/dist/channels/bitbucket/binding.d.ts +71 -0
  11. package/dist/channels/bitbucket/binding.d.ts.map +1 -0
  12. package/dist/channels/bitbucket/binding.js +269 -0
  13. package/dist/channels/bitbucket/bitbucket-channel.d.ts +33 -0
  14. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -0
  15. package/dist/channels/bitbucket/bitbucket-channel.js +120 -0
  16. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +61 -0
  17. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -0
  18. package/dist/channels/bitbucket/bitbucket-webhook.js +394 -0
  19. package/dist/channels/bitbucket/checks.d.ts +67 -0
  20. package/dist/channels/bitbucket/checks.d.ts.map +1 -0
  21. package/dist/channels/bitbucket/checks.js +102 -0
  22. package/dist/channels/bitbucket/cursor-account.d.ts +37 -0
  23. package/dist/channels/bitbucket/cursor-account.d.ts.map +1 -0
  24. package/dist/channels/bitbucket/cursor-account.js +65 -0
  25. package/dist/channels/bitbucket/defaults.d.ts +26 -0
  26. package/dist/channels/bitbucket/defaults.d.ts.map +1 -0
  27. package/dist/channels/bitbucket/defaults.js +73 -0
  28. package/dist/channels/bitbucket/events.d.ts +22 -0
  29. package/dist/channels/bitbucket/events.d.ts.map +1 -0
  30. package/dist/channels/bitbucket/events.js +64 -0
  31. package/dist/channels/bitbucket/index.d.ts +34 -0
  32. package/dist/channels/bitbucket/index.d.ts.map +1 -0
  33. package/dist/channels/bitbucket/index.js +33 -0
  34. package/dist/channels/bitbucket/replay.d.ts +63 -0
  35. package/dist/channels/bitbucket/replay.d.ts.map +1 -0
  36. package/dist/channels/bitbucket/replay.js +304 -0
  37. package/dist/channels/bitbucket/state.d.ts +35 -0
  38. package/dist/channels/bitbucket/state.d.ts.map +1 -0
  39. package/dist/channels/bitbucket/state.js +21 -0
  40. package/dist/channels/bitbucket/types.d.ts +229 -0
  41. package/dist/channels/bitbucket/types.d.ts.map +1 -0
  42. package/dist/channels/bitbucket/types.js +1 -0
  43. package/dist/channels/change-monitors/change-monitors-channel.d.ts +5 -0
  44. package/dist/channels/change-monitors/change-monitors-channel.d.ts.map +1 -0
  45. package/dist/channels/change-monitors/change-monitors-channel.js +41 -0
  46. package/dist/channels/change-monitors/index.d.ts +4 -0
  47. package/dist/channels/change-monitors/index.d.ts.map +1 -0
  48. package/dist/channels/change-monitors/index.js +2 -0
  49. package/dist/channels/change-monitors/types.d.ts +39 -0
  50. package/dist/channels/change-monitors/types.d.ts.map +1 -0
  51. package/dist/channels/change-monitors/types.js +1 -0
  52. package/dist/channels/deployments/deployments-channel.d.ts +22 -14
  53. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  54. package/dist/channels/deployments/deployments-channel.js +25 -27
  55. package/dist/channels/deployments/types.d.ts +12 -6
  56. package/dist/channels/deployments/types.d.ts.map +1 -1
  57. package/dist/channels/github/binding.d.ts +6 -0
  58. package/dist/channels/github/binding.d.ts.map +1 -1
  59. package/dist/channels/github/binding.js +3 -3
  60. package/dist/channels/github/cursor-account.d.ts +7 -3
  61. package/dist/channels/github/cursor-account.d.ts.map +1 -1
  62. package/dist/channels/github/cursor-account.js +10 -6
  63. package/dist/channels/github/defaults.d.ts.map +1 -1
  64. package/dist/channels/github/defaults.js +4 -0
  65. package/dist/channels/github/events.d.ts +1 -1
  66. package/dist/channels/github/events.js +1 -1
  67. package/dist/channels/github/forward.d.ts +1 -1
  68. package/dist/channels/github/forward.d.ts.map +1 -1
  69. package/dist/channels/github/forward.js +3 -2
  70. package/dist/channels/github/github-channel.d.ts +29 -39
  71. package/dist/channels/github/github-channel.d.ts.map +1 -1
  72. package/dist/channels/github/github-channel.js +68 -101
  73. package/dist/channels/github/progress.d.ts +22 -0
  74. package/dist/channels/github/progress.d.ts.map +1 -1
  75. package/dist/channels/github/progress.js +32 -5
  76. package/dist/channels/github/replay.d.ts +1 -1
  77. package/dist/channels/github/replay.js +1 -1
  78. package/dist/channels/github/state.d.ts +2 -0
  79. package/dist/channels/github/state.d.ts.map +1 -1
  80. package/dist/channels/github/state.js +14 -11
  81. package/dist/channels/github/types.d.ts +2 -4
  82. package/dist/channels/github/types.d.ts.map +1 -1
  83. package/dist/channels/gitlab/api.d.ts +91 -0
  84. package/dist/channels/gitlab/api.d.ts.map +1 -0
  85. package/dist/channels/gitlab/api.js +150 -0
  86. package/dist/channels/gitlab/binding.d.ts +58 -0
  87. package/dist/channels/gitlab/binding.d.ts.map +1 -0
  88. package/dist/channels/gitlab/binding.js +139 -0
  89. package/dist/channels/gitlab/checks.d.ts +110 -0
  90. package/dist/channels/gitlab/checks.d.ts.map +1 -0
  91. package/dist/channels/gitlab/checks.js +126 -0
  92. package/dist/channels/gitlab/cursor-account.d.ts +36 -0
  93. package/dist/channels/gitlab/cursor-account.d.ts.map +1 -0
  94. package/dist/channels/gitlab/cursor-account.js +65 -0
  95. package/dist/channels/gitlab/defaults.d.ts +25 -0
  96. package/dist/channels/gitlab/defaults.d.ts.map +1 -0
  97. package/dist/channels/gitlab/defaults.js +60 -0
  98. package/dist/channels/gitlab/events.d.ts +12 -0
  99. package/dist/channels/gitlab/events.d.ts.map +1 -0
  100. package/dist/channels/gitlab/events.js +28 -0
  101. package/dist/channels/gitlab/gitlab-channel.d.ts +33 -0
  102. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -0
  103. package/dist/channels/gitlab/gitlab-channel.js +120 -0
  104. package/dist/channels/gitlab/gitlab-webhook.d.ts +45 -0
  105. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -0
  106. package/dist/channels/gitlab/gitlab-webhook.js +397 -0
  107. package/dist/channels/gitlab/index.d.ts +31 -0
  108. package/dist/channels/gitlab/index.d.ts.map +1 -0
  109. package/dist/channels/gitlab/index.js +30 -0
  110. package/dist/channels/gitlab/replay.d.ts +105 -0
  111. package/dist/channels/gitlab/replay.d.ts.map +1 -0
  112. package/dist/channels/gitlab/replay.js +206 -0
  113. package/dist/channels/gitlab/state.d.ts +33 -0
  114. package/dist/channels/gitlab/state.d.ts.map +1 -0
  115. package/dist/channels/gitlab/state.js +23 -0
  116. package/dist/channels/gitlab/types.d.ts +214 -0
  117. package/dist/channels/gitlab/types.d.ts.map +1 -0
  118. package/dist/channels/gitlab/types.js +1 -0
  119. package/dist/channels/issues/index.d.ts +4 -0
  120. package/dist/channels/issues/index.d.ts.map +1 -0
  121. package/dist/channels/issues/index.js +2 -0
  122. package/dist/channels/issues/issues-channel.d.ts +5 -0
  123. package/dist/channels/issues/issues-channel.d.ts.map +1 -0
  124. package/dist/channels/issues/issues-channel.js +37 -0
  125. package/dist/channels/issues/types.d.ts +33 -0
  126. package/dist/channels/issues/types.d.ts.map +1 -0
  127. package/dist/channels/issues/types.js +1 -0
  128. package/dist/channels/origin/api.d.ts.map +1 -1
  129. package/dist/channels/origin/api.js +4 -2
  130. package/dist/channels/origin/origin-channel.d.ts +4 -9
  131. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  132. package/dist/channels/origin/origin-channel.js +8 -48
  133. package/dist/channels/origin/types.d.ts +20 -2
  134. package/dist/channels/origin/types.d.ts.map +1 -1
  135. package/dist/channels/slack/eval-directive.d.ts.map +1 -1
  136. package/dist/channels/slack/eval-directive.js +1 -7
  137. package/dist/channels/slack/init.d.ts.map +1 -1
  138. package/dist/channels/slack/init.js +3 -3
  139. package/dist/channels/slack/setup.d.ts +1 -1
  140. package/dist/channels/slack/setup.d.ts.map +1 -1
  141. package/dist/channels/slack/setup.js +6 -13
  142. package/dist/channels/slack/types.d.ts +1 -1
  143. package/dist/channels/slack/types.d.ts.map +1 -1
  144. package/dist/channels.d.ts +1 -1
  145. package/dist/channels.d.ts.map +1 -1
  146. package/dist/client.d.ts +1 -1
  147. package/dist/client.js +1 -1
  148. package/dist/connections.d.ts +1 -1
  149. package/dist/connections.js +1 -1
  150. package/dist/docs/404.html +2 -2
  151. package/dist/docs/ab.html +4 -4
  152. package/dist/docs/assets/{app.CLA03RCz.js → app.DbMWUyGb.js} +1 -1
  153. package/dist/docs/assets/chunks/@localSearchIndexroot.Bqsulb9K.js +1 -0
  154. package/dist/docs/assets/chunks/{VPLocalSearchBox.ifxv-cJV.js → VPLocalSearchBox.DcNeTh9o.js} +1 -1
  155. package/dist/docs/assets/chunks/{theme.DWCwM6p-.js → theme.DMjhY3gl.js} +2 -2
  156. package/dist/docs/assets/concepts.md.DgEcZOfT.js +1 -0
  157. package/dist/docs/assets/{concepts.md.rPzW2HZN.lean.js → concepts.md.DgEcZOfT.lean.js} +1 -1
  158. package/dist/docs/assets/{evals.md.CPzDAwoH.js → evals.md.CbMoebP1.js} +1 -1
  159. package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +9 -0
  160. package/dist/docs/assets/{guides_github.md.BtPr9GaP.js → guides_github.md.c0gdGJ-D.js} +1 -1
  161. package/dist/docs/assets/{guides_github.md.BtPr9GaP.lean.js → guides_github.md.c0gdGJ-D.lean.js} +1 -1
  162. package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.js → guides_opentelemetry.md.COh9jFVg.js} +7 -8
  163. package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.lean.js → guides_opentelemetry.md.COh9jFVg.lean.js} +1 -1
  164. package/dist/docs/assets/{index.md.Kiht7ell.js → index.md.D75GWhPl.js} +1 -1
  165. package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.js → reference_agent-config.md.CHNpiyp4.js} +3 -3
  166. package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.js → reference_channels.md.DBGcaB7m.js} +2 -2
  167. package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.lean.js → reference_channels.md.DBGcaB7m.lean.js} +1 -1
  168. package/dist/docs/assets/{reference_cli.md.DfoeyvL0.js → reference_cli.md.CJNc_xYK.js} +1 -1
  169. package/dist/docs/assets/{reference_extensions.md.9WQMZe1l.js → reference_extensions.md.DykHW3qL.js} +11 -5
  170. package/dist/docs/assets/reference_extensions.md.DykHW3qL.lean.js +1 -0
  171. package/dist/docs/assets/reference_hooks.md.Ddt5DdgJ.js +73 -0
  172. package/dist/docs/assets/{reference_hooks.md.a8BJxMR5.lean.js → reference_hooks.md.Ddt5DdgJ.lean.js} +1 -1
  173. package/dist/docs/assets/{reference_playground.md.DnX5nL-B.js → reference_playground.md.4myJPxrf.js} +1 -1
  174. package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.js → reference_project-layout.md.DuBu9a96.js} +2 -2
  175. package/dist/docs/assets/reference_result.md.BK5SxDrf.js +19 -0
  176. package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +1 -0
  177. package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.js → reference_sessions.md.CueyOHSL.js} +1 -1
  178. package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.lean.js → reference_sessions.md.CueyOHSL.lean.js} +1 -1
  179. package/dist/docs/assets/{reference_tools.md.B1up2r9W.js → reference_tools.md.aGrn99hP.js} +1 -1
  180. package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +1 -0
  181. package/dist/docs/assets/{skills_otel.md.CgiZryR3.js → skills_otel.md.CqhobH3B.js} +3 -3
  182. package/dist/docs/assets/{skills_otel.md.CgiZryR3.lean.js → skills_otel.md.CqhobH3B.lean.js} +1 -1
  183. package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.js → templates_pr-autofixer.md.Bds_XWcV.js} +2 -2
  184. package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.lean.js → templates_pr-autofixer.md.Bds_XWcV.lean.js} +1 -1
  185. package/dist/docs/building-with-agents.html +4 -4
  186. package/dist/docs/concepts.html +5 -5
  187. package/dist/docs/concepts.md +2 -4
  188. package/dist/docs/deployment.html +4 -4
  189. package/dist/docs/design/filesystem.md +376 -0
  190. package/dist/docs/design/runtime-abstraction.md +2 -3
  191. package/dist/docs/evals.html +6 -6
  192. package/dist/docs/evals.md +9 -7
  193. package/dist/docs/guides/agent-to-agent.html +4 -4
  194. package/dist/docs/guides/cloud-agents.html +6 -6
  195. package/dist/docs/guides/cloud-agents.md +4 -6
  196. package/dist/docs/guides/convert-automation.html +4 -4
  197. package/dist/docs/guides/github.html +6 -6
  198. package/dist/docs/guides/github.md +5 -1
  199. package/dist/docs/guides/human-in-the-loop.html +4 -4
  200. package/dist/docs/guides/mcp-oauth.html +5 -5
  201. package/dist/docs/guides/opentelemetry.html +10 -11
  202. package/dist/docs/guides/opentelemetry.md +41 -17
  203. package/dist/docs/guides/slack.html +4 -4
  204. package/dist/docs/guides/webhooks.html +4 -4
  205. package/dist/docs/hashmap.json +1 -1
  206. package/dist/docs/hillclimbing.html +4 -4
  207. package/dist/docs/index.html +6 -6
  208. package/dist/docs/index.md +2 -2
  209. package/dist/docs/llms-full.txt +907 -262
  210. package/dist/docs/llms.txt +3 -2
  211. package/dist/docs/quickstart.html +4 -4
  212. package/dist/docs/reference/agent-config.html +8 -8
  213. package/dist/docs/reference/agent-config.md +6 -10
  214. package/dist/docs/reference/artifacts.html +5 -5
  215. package/dist/docs/reference/channels.html +6 -6
  216. package/dist/docs/reference/channels.md +38 -8
  217. package/dist/docs/reference/cli.html +5 -5
  218. package/dist/docs/reference/cli.md +3 -4
  219. package/dist/docs/reference/connections.html +4 -4
  220. package/dist/docs/reference/extensions.html +16 -10
  221. package/dist/docs/reference/extensions.md +86 -22
  222. package/dist/docs/reference/hooks.html +69 -10
  223. package/dist/docs/reference/hooks.md +215 -46
  224. package/dist/docs/reference/http-api.html +4 -4
  225. package/dist/docs/reference/instructions.html +4 -4
  226. package/dist/docs/reference/playground.html +5 -5
  227. package/dist/docs/reference/playground.md +3 -0
  228. package/dist/docs/reference/project-layout.html +6 -6
  229. package/dist/docs/reference/project-layout.md +2 -1
  230. package/dist/docs/reference/prompt.html +4 -4
  231. package/dist/docs/reference/result.html +45 -0
  232. package/dist/docs/reference/result.md +89 -0
  233. package/dist/docs/reference/schedules.html +4 -4
  234. package/dist/docs/reference/sessions.html +5 -5
  235. package/dist/docs/reference/sessions.md +3 -1
  236. package/dist/docs/reference/skills.html +4 -4
  237. package/dist/docs/reference/subagents.html +4 -4
  238. package/dist/docs/reference/tools.html +5 -5
  239. package/dist/docs/reference/tools.md +1 -2
  240. package/dist/docs/scaffolding-agents.html +4 -4
  241. package/dist/docs/skills/ab.html +4 -4
  242. package/dist/docs/skills/create-agent.html +4 -4
  243. package/dist/docs/skills/debug.html +4 -4
  244. package/dist/docs/skills/evals.html +4 -4
  245. package/dist/docs/skills/framework-map.html +5 -5
  246. package/dist/docs/skills/framework-map.md +3 -1
  247. package/dist/docs/skills/github.html +4 -4
  248. package/dist/docs/skills/hillclimb.html +4 -4
  249. package/dist/docs/skills/index.html +4 -4
  250. package/dist/docs/skills/mcp-auth.html +4 -4
  251. package/dist/docs/skills/otel.html +7 -7
  252. package/dist/docs/skills/otel.md +8 -3
  253. package/dist/docs/skills/setup-slack.html +4 -4
  254. package/dist/docs/storage.html +4 -4
  255. package/dist/docs/templates/agentic-owners.html +4 -4
  256. package/dist/docs/templates/agents-md.html +4 -4
  257. package/dist/docs/templates/code-wiki.html +4 -4
  258. package/dist/docs/templates/demo.html +4 -4
  259. package/dist/docs/templates/pr-autofixer.html +6 -6
  260. package/dist/docs/templates/pr-autofixer.md +0 -3
  261. package/dist/docs/templates/security-help.html +4 -4
  262. package/dist/docs/templates/security-reviewer.html +4 -4
  263. package/dist/docs/templates/triage.html +4 -4
  264. package/dist/docs/troubleshooting.html +4 -4
  265. package/dist/evals.d.ts +1 -1
  266. package/dist/evals.d.ts.map +1 -1
  267. package/dist/extensions.d.ts +20 -7
  268. package/dist/extensions.d.ts.map +1 -1
  269. package/dist/extensions.js +36 -5
  270. package/dist/files.d.ts +16 -3
  271. package/dist/files.d.ts.map +1 -1
  272. package/dist/files.js +16 -3
  273. package/dist/filesystem.d.ts +440 -0
  274. package/dist/filesystem.d.ts.map +1 -0
  275. package/dist/filesystem.js +1694 -0
  276. package/dist/index.d.ts +6 -4
  277. package/dist/index.d.ts.map +1 -1
  278. package/dist/index.js +4 -3
  279. package/dist/internal/ab-snapshot.d.ts.map +1 -1
  280. package/dist/internal/ab-snapshot.js +0 -1
  281. package/dist/internal/advertise-tools.d.ts.map +1 -1
  282. package/dist/internal/advertise-tools.js +1 -3
  283. package/dist/internal/authored-alias-hooks.d.ts +4 -13
  284. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  285. package/dist/internal/authored-alias-hooks.js +4 -20
  286. package/dist/internal/authored-loaders.d.ts +2 -3
  287. package/dist/internal/authored-loaders.d.ts.map +1 -1
  288. package/dist/internal/authored-loaders.js +6 -20
  289. package/dist/internal/channel-dispatch.d.ts +43 -0
  290. package/dist/internal/channel-dispatch.d.ts.map +1 -0
  291. package/dist/internal/channel-dispatch.js +77 -0
  292. package/dist/internal/chat-client.d.ts +1 -1
  293. package/dist/internal/chat-client.js +1 -1
  294. package/dist/internal/cli-ax.d.ts +5 -5
  295. package/dist/internal/cli-ax.d.ts.map +1 -1
  296. package/dist/internal/cli-ax.js +5 -5
  297. package/dist/internal/cli-bitbucket.d.ts +33 -0
  298. package/dist/internal/cli-bitbucket.d.ts.map +1 -0
  299. package/dist/internal/cli-bitbucket.js +359 -0
  300. package/dist/internal/cli-convert-automation.d.ts +1 -1
  301. package/dist/internal/cli-convert-automation.js +2 -2
  302. package/dist/internal/cli-cursor.d.ts +1 -1
  303. package/dist/internal/cli-cursor.d.ts.map +1 -1
  304. package/dist/internal/cli-cursor.js +2 -4
  305. package/dist/internal/cli-deploy.d.ts.map +1 -1
  306. package/dist/internal/cli-deploy.js +2 -6
  307. package/dist/internal/cli-github.d.ts +1 -1
  308. package/dist/internal/cli-github.js +3 -3
  309. package/dist/internal/cli-gitlab.d.ts +37 -0
  310. package/dist/internal/cli-gitlab.d.ts.map +1 -0
  311. package/dist/internal/cli-gitlab.js +380 -0
  312. package/dist/internal/cli-mcp.d.ts.map +1 -1
  313. package/dist/internal/cli-mcp.js +2 -6
  314. package/dist/internal/cli-slack.d.ts +1 -1
  315. package/dist/internal/cli-slack.d.ts.map +1 -1
  316. package/dist/internal/cli-slack.js +2 -4
  317. package/dist/internal/continuation-channel.d.ts +18 -2
  318. package/dist/internal/continuation-channel.d.ts.map +1 -1
  319. package/dist/internal/continuation-channel.js +67 -5
  320. package/dist/internal/continuation-identity.d.ts +24 -17
  321. package/dist/internal/continuation-identity.d.ts.map +1 -1
  322. package/dist/internal/continuation-identity.js +246 -32
  323. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  324. package/dist/internal/conversation-mirror.js +4 -3
  325. package/dist/internal/convert-automation/types.d.ts +1 -1
  326. package/dist/internal/convert-automation/types.js +1 -1
  327. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  328. package/dist/internal/cursor/account-mcp.js +1 -3
  329. package/dist/internal/cursor/backend-client.d.ts +5 -4
  330. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  331. package/dist/internal/cursor/backend-client.js +5 -6
  332. package/dist/internal/cursor/bound-secret-file.d.ts +56 -0
  333. package/dist/internal/cursor/bound-secret-file.d.ts.map +1 -0
  334. package/dist/internal/cursor/bound-secret-file.js +88 -0
  335. package/dist/internal/cursor/credentials.d.ts +39 -5
  336. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  337. package/dist/internal/cursor/credentials.js +58 -8
  338. package/dist/internal/cursor/hosted-bound-secrets.d.ts +41 -0
  339. package/dist/internal/cursor/hosted-bound-secrets.d.ts.map +1 -0
  340. package/dist/internal/cursor/hosted-bound-secrets.js +54 -0
  341. package/dist/internal/cursor/hosted-deployment-secrets.d.ts +19 -5
  342. package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -1
  343. package/dist/internal/cursor/hosted-deployment-secrets.js +29 -9
  344. package/dist/internal/cursor/hosted-store-secrets.d.ts +1 -1
  345. package/dist/internal/cursor/hosted-store-secrets.js +1 -1
  346. package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
  347. package/dist/internal/cursor-account-mcp-auth.js +2 -4
  348. package/dist/internal/cursor-deployment-relay.d.ts +6 -2
  349. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  350. package/dist/internal/cursor-deployment-relay.js +13 -9
  351. package/dist/internal/deploy-manifest.d.ts +1 -1
  352. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  353. package/dist/internal/deploy-manifest.js +1 -1
  354. package/dist/internal/discovery/ab.d.ts +1 -1
  355. package/dist/internal/discovery/ab.d.ts.map +1 -1
  356. package/dist/internal/discovery/ab.js +21 -9
  357. package/dist/internal/discovery/agent.d.ts +6 -1
  358. package/dist/internal/discovery/agent.d.ts.map +1 -1
  359. package/dist/internal/discovery/agent.js +141 -120
  360. package/dist/internal/discovery/channels.d.ts +1 -1
  361. package/dist/internal/discovery/channels.d.ts.map +1 -1
  362. package/dist/internal/discovery/channels.js +14 -14
  363. package/dist/internal/discovery/connections.d.ts +1 -5
  364. package/dist/internal/discovery/connections.d.ts.map +1 -1
  365. package/dist/internal/discovery/connections.js +30 -44
  366. package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -1
  367. package/dist/internal/discovery/cursor-plugin.js +1 -3
  368. package/dist/internal/discovery/extension-overlay.d.ts +32 -0
  369. package/dist/internal/discovery/extension-overlay.d.ts.map +1 -0
  370. package/dist/internal/discovery/extension-overlay.js +191 -0
  371. package/dist/internal/discovery/extensions.d.ts +11 -2
  372. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  373. package/dist/internal/discovery/extensions.js +211 -74
  374. package/dist/internal/discovery/hooks.d.ts +1 -1
  375. package/dist/internal/discovery/hooks.d.ts.map +1 -1
  376. package/dist/internal/discovery/hooks.js +15 -2
  377. package/dist/internal/discovery/info.d.ts.map +1 -1
  378. package/dist/internal/discovery/info.js +10 -1
  379. package/dist/internal/discovery/modules.d.ts.map +1 -1
  380. package/dist/internal/discovery/modules.js +8 -2
  381. package/dist/internal/discovery/names.d.ts +1 -1
  382. package/dist/internal/discovery/names.d.ts.map +1 -1
  383. package/dist/internal/discovery/names.js +1 -0
  384. package/dist/internal/discovery/project.d.ts +0 -2
  385. package/dist/internal/discovery/project.d.ts.map +1 -1
  386. package/dist/internal/discovery/project.js +64 -10
  387. package/dist/internal/discovery/runtime.d.ts.map +1 -1
  388. package/dist/internal/discovery/runtime.js +1 -2
  389. package/dist/internal/discovery/schedules.d.ts +1 -1
  390. package/dist/internal/discovery/schedules.d.ts.map +1 -1
  391. package/dist/internal/discovery/schedules.js +23 -2
  392. package/dist/internal/discovery/services.d.ts +6 -2
  393. package/dist/internal/discovery/services.d.ts.map +1 -1
  394. package/dist/internal/discovery/services.js +31 -1
  395. package/dist/internal/discovery/skills.d.ts +1 -6
  396. package/dist/internal/discovery/skills.d.ts.map +1 -1
  397. package/dist/internal/discovery/skills.js +8 -3
  398. package/dist/internal/discovery/subagent.d.ts +3 -0
  399. package/dist/internal/discovery/subagent.d.ts.map +1 -1
  400. package/dist/internal/discovery/subagent.js +109 -0
  401. package/dist/internal/discovery.d.ts +1 -2
  402. package/dist/internal/discovery.d.ts.map +1 -1
  403. package/dist/internal/discovery.js +1 -2
  404. package/dist/internal/distribution.d.ts +10 -27
  405. package/dist/internal/distribution.d.ts.map +1 -1
  406. package/dist/internal/distribution.js +25 -73
  407. package/dist/internal/docs-site.js +1 -1
  408. package/dist/internal/eval-run-store.d.ts +0 -1
  409. package/dist/internal/eval-run-store.d.ts.map +1 -1
  410. package/dist/internal/eval-runner.d.ts.map +1 -1
  411. package/dist/internal/factory-resource-channel.d.ts +33 -0
  412. package/dist/internal/factory-resource-channel.d.ts.map +1 -0
  413. package/dist/internal/factory-resource-channel.js +77 -0
  414. package/dist/internal/filesystem/errors.d.ts +64 -0
  415. package/dist/internal/filesystem/errors.d.ts.map +1 -0
  416. package/dist/internal/filesystem/errors.js +175 -0
  417. package/dist/internal/filesystem/format.d.ts +28 -0
  418. package/dist/internal/filesystem/format.d.ts.map +1 -0
  419. package/dist/internal/filesystem/format.js +213 -0
  420. package/dist/internal/filesystem/merge.d.ts +34 -0
  421. package/dist/internal/filesystem/merge.d.ts.map +1 -0
  422. package/dist/internal/filesystem/merge.js +196 -0
  423. package/dist/internal/filesystem/scratch.d.ts +59 -0
  424. package/dist/internal/filesystem/scratch.d.ts.map +1 -0
  425. package/dist/internal/filesystem/scratch.js +212 -0
  426. package/dist/internal/filesystem/sdk-schemas.d.ts +29 -0
  427. package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -0
  428. package/dist/internal/filesystem/sdk-schemas.js +153 -0
  429. package/dist/internal/filesystem/tools.d.ts +42 -0
  430. package/dist/internal/filesystem/tools.d.ts.map +1 -0
  431. package/dist/internal/filesystem/tools.js +618 -0
  432. package/dist/internal/filesystem/walk.d.ts +74 -0
  433. package/dist/internal/filesystem/walk.d.ts.map +1 -0
  434. package/dist/internal/filesystem/walk.js +339 -0
  435. package/dist/internal/framework-file-storage.d.ts +8 -0
  436. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  437. package/dist/internal/framework-file-storage.js +8 -8
  438. package/dist/internal/github-fanout.d.ts +1 -1
  439. package/dist/internal/github-fanout.js +1 -1
  440. package/dist/internal/guest-network.d.ts +104 -0
  441. package/dist/internal/guest-network.d.ts.map +1 -0
  442. package/dist/internal/guest-network.js +309 -0
  443. package/dist/internal/host-otel.d.ts +3 -3
  444. package/dist/internal/host-otel.d.ts.map +1 -1
  445. package/dist/internal/host-otel.js +8 -4
  446. package/dist/internal/hosted-admission-adapter.d.ts +8 -7
  447. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  448. package/dist/internal/hosted-delivery-protocol.d.ts +6 -0
  449. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  450. package/dist/internal/hosted-delivery-protocol.js +18 -5
  451. package/dist/internal/hosted-delivery.d.ts +18 -0
  452. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  453. package/dist/internal/hosted-delivery.js +258 -118
  454. package/dist/internal/http-channel.d.ts.map +1 -1
  455. package/dist/internal/http-channel.js +1 -3
  456. package/dist/internal/init-interview.d.ts.map +1 -1
  457. package/dist/internal/init-interview.js +1 -3
  458. package/dist/internal/init-project.d.ts +2 -2
  459. package/dist/internal/init-project.js +2 -2
  460. package/dist/internal/inline-stdio-define-stub.d.ts +1 -1
  461. package/dist/internal/inline-stdio-define-stub.d.ts.map +1 -1
  462. package/dist/internal/inline-stdio-define-stub.js +1 -1
  463. package/dist/internal/is-record.d.ts +2 -0
  464. package/dist/internal/is-record.d.ts.map +1 -0
  465. package/dist/internal/is-record.js +3 -0
  466. package/dist/internal/json-schema.d.ts.map +1 -1
  467. package/dist/internal/json-schema.js +18 -10
  468. package/dist/internal/local-control-plane.d.ts +1 -2
  469. package/dist/internal/local-control-plane.d.ts.map +1 -1
  470. package/dist/internal/local-control-plane.js +3 -20
  471. package/dist/internal/mcp-endpoint.d.ts.map +1 -1
  472. package/dist/internal/mcp-endpoint.js +1 -3
  473. package/dist/internal/otel/collector.d.ts +12 -3
  474. package/dist/internal/otel/collector.d.ts.map +1 -1
  475. package/dist/internal/otel/collector.js +77 -125
  476. package/dist/internal/otel/config.d.ts +0 -2
  477. package/dist/internal/otel/config.d.ts.map +1 -1
  478. package/dist/internal/otel/config.js +17 -20
  479. package/dist/internal/otel/http.d.ts +2 -0
  480. package/dist/internal/otel/http.d.ts.map +1 -1
  481. package/dist/internal/otel/http.js +7 -1
  482. package/dist/internal/otel/mcp.d.ts.map +1 -1
  483. package/dist/internal/otel/mcp.js +3 -16
  484. package/dist/internal/otel/runtime.d.ts +26 -1
  485. package/dist/internal/otel/runtime.d.ts.map +1 -1
  486. package/dist/internal/otel/runtime.js +164 -15
  487. package/dist/internal/package-inline-stdio.d.ts.map +1 -1
  488. package/dist/internal/package-inline-stdio.js +3 -11
  489. package/dist/internal/playground/toolchain.d.ts +1 -1
  490. package/dist/internal/playground/toolchain.d.ts.map +1 -1
  491. package/dist/internal/playground/toolchain.js +1 -1
  492. package/dist/internal/request-error-status.d.ts +12 -0
  493. package/dist/internal/request-error-status.d.ts.map +1 -0
  494. package/dist/internal/request-error-status.js +52 -0
  495. package/dist/internal/resolve-prod-target.d.ts +1 -1
  496. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  497. package/dist/internal/resolve-prod-target.js +3 -7
  498. package/dist/internal/result-output.d.ts +18 -0
  499. package/dist/internal/result-output.d.ts.map +1 -0
  500. package/dist/internal/result-output.js +33 -0
  501. package/dist/internal/run-client.d.ts +2 -2
  502. package/dist/internal/run-client.js +2 -2
  503. package/dist/internal/runtime-dispatch-runner.d.ts +1 -11
  504. package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
  505. package/dist/internal/runtime-dispatch-runner.js +2 -15
  506. package/dist/internal/sdk-runner.d.ts +1 -1
  507. package/dist/internal/sdk-runner.d.ts.map +1 -1
  508. package/dist/internal/sdk-runner.js +6 -7
  509. package/dist/internal/server.d.ts.map +1 -1
  510. package/dist/internal/server.js +110 -35
  511. package/dist/internal/session-cost.d.ts +3 -3
  512. package/dist/internal/session-cost.d.ts.map +1 -1
  513. package/dist/internal/session-cost.js +3 -3
  514. package/dist/internal/session-engine.d.ts +48 -11
  515. package/dist/internal/session-engine.d.ts.map +1 -1
  516. package/dist/internal/session-engine.js +507 -115
  517. package/dist/internal/session-run-log.d.ts.map +1 -1
  518. package/dist/internal/session-run-log.js +1 -3
  519. package/dist/internal/skills-sync.d.ts +1 -4
  520. package/dist/internal/skills-sync.d.ts.map +1 -1
  521. package/dist/internal/skills-sync.js +10 -50
  522. package/dist/internal/sleep.d.ts +2 -0
  523. package/dist/internal/sleep.d.ts.map +1 -0
  524. package/dist/internal/sleep.js +3 -0
  525. package/dist/internal/store-mirror.d.ts +29 -0
  526. package/dist/internal/store-mirror.d.ts.map +1 -0
  527. package/dist/internal/store-mirror.js +70 -0
  528. package/dist/internal/tenant-slack/relay.d.ts +73 -0
  529. package/dist/internal/tenant-slack/relay.d.ts.map +1 -0
  530. package/dist/internal/tenant-slack/relay.js +138 -0
  531. package/dist/internal/testing/factory-resource-fixtures.d.ts +48 -0
  532. package/dist/internal/testing/factory-resource-fixtures.d.ts.map +1 -0
  533. package/dist/internal/testing/factory-resource-fixtures.js +41 -0
  534. package/dist/internal/testing/scm-continuation-fixtures.d.ts +33 -0
  535. package/dist/internal/testing/scm-continuation-fixtures.d.ts.map +1 -0
  536. package/dist/internal/testing/scm-continuation-fixtures.js +253 -0
  537. package/dist/internal/workspace-sync.d.ts +22 -0
  538. package/dist/internal/workspace-sync.d.ts.map +1 -0
  539. package/dist/internal/workspace-sync.js +49 -0
  540. package/dist/internal/workspace.d.ts +7 -0
  541. package/dist/internal/workspace.d.ts.map +1 -1
  542. package/dist/internal/workspace.js +13 -0
  543. package/dist/otel.d.ts +23 -1
  544. package/dist/otel.d.ts.map +1 -1
  545. package/dist/otel.js +93 -2
  546. package/dist/playground/assets/index-8YiozU89.js +67 -0
  547. package/dist/playground/assets/index-MbMxXg-y.css +1 -0
  548. package/dist/playground/index.html +2 -2
  549. package/dist/result.d.ts +24 -0
  550. package/dist/result.d.ts.map +1 -0
  551. package/dist/result.js +27 -0
  552. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  553. package/dist/storage-backends/cursor-hosted.js +7 -4
  554. package/dist/storage-protocol.d.ts.map +1 -1
  555. package/dist/storage-protocol.js +1 -3
  556. package/dist/types.d.ts +141 -26
  557. package/dist/types.d.ts.map +1 -1
  558. package/docs/README.md +2 -2
  559. package/docs/concepts.md +2 -4
  560. package/docs/design/filesystem.md +376 -0
  561. package/docs/design/runtime-abstraction.md +2 -3
  562. package/docs/evals.md +9 -7
  563. package/docs/guides/cloud-agents.md +4 -6
  564. package/docs/guides/github.md +5 -1
  565. package/docs/guides/opentelemetry.md +41 -17
  566. package/docs/reference/agent-config.md +6 -10
  567. package/docs/reference/channels.md +38 -8
  568. package/docs/reference/cli.md +3 -4
  569. package/docs/reference/extensions.md +87 -23
  570. package/docs/reference/hooks.md +215 -46
  571. package/docs/reference/playground.md +3 -0
  572. package/docs/reference/project-layout.md +2 -1
  573. package/docs/reference/result.md +94 -0
  574. package/docs/reference/sessions.md +3 -1
  575. package/docs/reference/tools.md +1 -2
  576. package/docs/templates/pr-autofixer.md +0 -3
  577. package/package.json +42 -9
  578. package/skills/framework-map/SKILL.md +3 -1
  579. package/skills/otel/SKILL.md +8 -3
  580. package/src/ab.ts +1 -1
  581. package/src/bin/agent-serve.ts +121 -21
  582. package/src/channels/bitbucket/api.ts +623 -0
  583. package/src/channels/bitbucket/binding.ts +414 -0
  584. package/src/channels/bitbucket/bitbucket-channel.ts +182 -0
  585. package/src/channels/bitbucket/bitbucket-webhook.ts +576 -0
  586. package/src/channels/bitbucket/checks.ts +154 -0
  587. package/src/channels/bitbucket/cursor-account.ts +117 -0
  588. package/src/channels/bitbucket/defaults.ts +110 -0
  589. package/src/channels/bitbucket/events.ts +84 -0
  590. package/src/channels/bitbucket/index.ts +49 -0
  591. package/src/channels/bitbucket/replay.ts +439 -0
  592. package/src/channels/bitbucket/state.ts +59 -0
  593. package/src/channels/bitbucket/types.ts +266 -0
  594. package/src/channels/change-monitors/change-monitors-channel.ts +62 -0
  595. package/src/channels/change-monitors/index.ts +8 -0
  596. package/src/channels/change-monitors/types.ts +44 -0
  597. package/src/channels/deployments/deployments-channel.ts +25 -43
  598. package/src/channels/deployments/types.ts +12 -6
  599. package/src/channels/github/binding.ts +8 -1
  600. package/src/channels/github/cursor-account.ts +17 -6
  601. package/src/channels/github/defaults.ts +4 -0
  602. package/src/channels/github/events.ts +1 -1
  603. package/src/channels/github/forward.ts +3 -2
  604. package/src/channels/github/github-channel.ts +74 -221
  605. package/src/channels/github/progress.ts +76 -10
  606. package/src/channels/github/replay.ts +1 -1
  607. package/src/channels/github/state.ts +6 -0
  608. package/src/channels/github/types.ts +2 -5
  609. package/src/channels/gitlab/api.ts +228 -0
  610. package/src/channels/gitlab/binding.ts +233 -0
  611. package/src/channels/gitlab/checks.ts +243 -0
  612. package/src/channels/gitlab/cursor-account.ts +114 -0
  613. package/src/channels/gitlab/defaults.ts +93 -0
  614. package/src/channels/gitlab/events.ts +44 -0
  615. package/src/channels/gitlab/gitlab-channel.ts +176 -0
  616. package/src/channels/gitlab/gitlab-webhook.ts +555 -0
  617. package/src/channels/gitlab/index.ts +43 -0
  618. package/src/channels/gitlab/replay.ts +347 -0
  619. package/src/channels/gitlab/state.ts +55 -0
  620. package/src/channels/gitlab/types.ts +263 -0
  621. package/src/channels/issues/index.ts +9 -0
  622. package/src/channels/issues/issues-channel.ts +51 -0
  623. package/src/channels/issues/types.ts +41 -0
  624. package/src/channels/origin/api.ts +4 -2
  625. package/src/channels/origin/origin-channel.ts +19 -94
  626. package/src/channels/origin/types.ts +23 -2
  627. package/src/channels/slack/eval-directive.ts +1 -6
  628. package/src/channels/slack/init.ts +6 -3
  629. package/src/channels/slack/setup.ts +7 -6
  630. package/src/channels/slack/types.ts +1 -1
  631. package/src/channels.ts +0 -1
  632. package/src/client.ts +1 -1
  633. package/src/connections.ts +1 -1
  634. package/src/evals.ts +1 -1
  635. package/src/extensions.ts +47 -5
  636. package/src/files.ts +21 -3
  637. package/src/filesystem.ts +2074 -0
  638. package/src/index.ts +48 -28
  639. package/src/internal/ab-snapshot.ts +0 -3
  640. package/src/internal/advertise-tools.ts +1 -4
  641. package/src/internal/authored-alias-hooks.ts +4 -21
  642. package/src/internal/authored-loaders.ts +6 -23
  643. package/src/internal/channel-dispatch.ts +160 -0
  644. package/src/internal/chat-client.ts +1 -1
  645. package/src/internal/cli-ax.ts +5 -5
  646. package/src/internal/cli-bitbucket.ts +477 -0
  647. package/src/internal/cli-convert-automation.ts +7 -7
  648. package/src/internal/cli-cursor.ts +2 -5
  649. package/src/internal/cli-deploy.ts +2 -8
  650. package/src/internal/cli-github.ts +3 -3
  651. package/src/internal/cli-gitlab.ts +485 -0
  652. package/src/internal/cli-mcp.ts +2 -7
  653. package/src/internal/cli-slack.ts +2 -5
  654. package/src/internal/continuation-channel.ts +102 -4
  655. package/src/internal/continuation-identity.ts +338 -35
  656. package/src/internal/conversation-mirror.ts +4 -3
  657. package/src/internal/convert-automation/types.ts +1 -1
  658. package/src/internal/cursor/account-mcp.ts +1 -4
  659. package/src/internal/cursor/backend-client.ts +9 -10
  660. package/src/internal/cursor/bound-secret-file.ts +108 -0
  661. package/src/internal/cursor/credentials.ts +75 -10
  662. package/src/internal/cursor/hosted-bound-secrets.ts +75 -0
  663. package/src/internal/cursor/hosted-deployment-secrets.ts +42 -11
  664. package/src/internal/cursor/hosted-store-secrets.ts +1 -1
  665. package/src/internal/cursor-account-mcp-auth.ts +2 -5
  666. package/src/internal/cursor-deployment-relay.ts +11 -7
  667. package/src/internal/deploy-manifest.ts +4 -2
  668. package/src/internal/discovery/ab.ts +29 -9
  669. package/src/internal/discovery/agent.ts +181 -136
  670. package/src/internal/discovery/channels.ts +15 -13
  671. package/src/internal/discovery/connections.ts +55 -50
  672. package/src/internal/discovery/cursor-plugin.ts +1 -4
  673. package/src/internal/discovery/extension-overlay.ts +274 -0
  674. package/src/internal/discovery/extensions.ts +330 -105
  675. package/src/internal/discovery/hooks.ts +20 -2
  676. package/src/internal/discovery/info.ts +10 -0
  677. package/src/internal/discovery/modules.ts +8 -2
  678. package/src/internal/discovery/names.ts +2 -1
  679. package/src/internal/discovery/project.ts +80 -9
  680. package/src/internal/discovery/runtime.ts +1 -2
  681. package/src/internal/discovery/schedules.ts +28 -2
  682. package/src/internal/discovery/services.ts +37 -1
  683. package/src/internal/discovery/skills.ts +13 -3
  684. package/src/internal/discovery/subagent.ts +107 -0
  685. package/src/internal/discovery.ts +0 -2
  686. package/src/internal/distribution.ts +35 -83
  687. package/src/internal/docs-site.ts +1 -1
  688. package/src/internal/eval-run-store.ts +0 -7
  689. package/src/internal/eval-runner.ts +0 -1
  690. package/src/internal/factory-resource-channel.ts +122 -0
  691. package/src/internal/filesystem/errors.ts +220 -0
  692. package/src/internal/filesystem/format.ts +276 -0
  693. package/src/internal/filesystem/merge.ts +195 -0
  694. package/src/internal/filesystem/scratch.ts +255 -0
  695. package/src/internal/filesystem/sdk-schemas.ts +204 -0
  696. package/src/internal/filesystem/tools.ts +821 -0
  697. package/src/internal/filesystem/walk.ts +369 -0
  698. package/src/internal/framework-file-storage.ts +8 -8
  699. package/src/internal/github-fanout.ts +1 -1
  700. package/src/internal/guest-network.ts +389 -0
  701. package/src/internal/host-otel.ts +8 -4
  702. package/src/internal/hosted-admission-adapter.ts +8 -8
  703. package/src/internal/hosted-delivery-protocol.ts +26 -1
  704. package/src/internal/hosted-delivery.ts +393 -192
  705. package/src/internal/http-channel.ts +1 -4
  706. package/src/internal/init-interview.ts +1 -4
  707. package/src/internal/init-project.ts +2 -2
  708. package/src/internal/inline-stdio-define-stub.ts +1 -1
  709. package/src/internal/is-record.ts +3 -0
  710. package/src/internal/json-schema.ts +19 -10
  711. package/src/internal/local-control-plane.ts +5 -24
  712. package/src/internal/mcp-endpoint.ts +1 -4
  713. package/src/internal/otel/collector.ts +94 -159
  714. package/src/internal/otel/config.ts +10 -14
  715. package/src/internal/otel/http.ts +14 -1
  716. package/src/internal/otel/mcp.ts +3 -16
  717. package/src/internal/otel/runtime.ts +240 -25
  718. package/src/internal/package-inline-stdio.ts +3 -12
  719. package/src/internal/playground/toolchain.ts +1 -1
  720. package/src/internal/request-error-status.ts +72 -0
  721. package/src/internal/resolve-prod-target.ts +3 -8
  722. package/src/internal/result-output.ts +34 -0
  723. package/src/internal/run-client.ts +2 -2
  724. package/src/internal/runtime-dispatch-runner.ts +3 -21
  725. package/src/internal/sdk-runner.ts +7 -7
  726. package/src/internal/server.ts +153 -44
  727. package/src/internal/session-cost.ts +3 -3
  728. package/src/internal/session-engine.ts +621 -103
  729. package/src/internal/session-run-log.ts +1 -4
  730. package/src/internal/skills-sync.ts +13 -63
  731. package/src/internal/sleep.ts +3 -0
  732. package/src/internal/store-mirror.ts +86 -0
  733. package/src/internal/tenant-slack/relay.ts +179 -0
  734. package/src/internal/testing/factory-resource-fixtures.ts +85 -0
  735. package/src/internal/testing/scm-continuation-fixtures.ts +286 -0
  736. package/src/internal/workspace-sync.ts +55 -0
  737. package/src/internal/workspace.ts +14 -0
  738. package/src/otel.ts +143 -3
  739. package/src/result.ts +36 -0
  740. package/src/storage-backends/cursor-hosted.ts +7 -4
  741. package/src/storage-protocol.ts +1 -4
  742. package/src/types.ts +154 -37
  743. package/templates/triage/agent/lib/types.ts +0 -2
  744. package/dist/continuation.d.ts +0 -20
  745. package/dist/continuation.d.ts.map +0 -1
  746. package/dist/continuation.js +0 -18
  747. package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +0 -1
  748. package/dist/docs/assets/concepts.md.rPzW2HZN.js +0 -1
  749. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +0 -9
  750. package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.js +0 -9
  751. package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.lean.js +0 -1
  752. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +0 -1
  753. package/dist/docs/assets/reference_hooks.md.a8BJxMR5.js +0 -14
  754. package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +0 -1
  755. package/dist/docs/guides/cloud-runtime.html +0 -35
  756. package/dist/docs/guides/cloud-runtime.md +0 -117
  757. package/dist/internal/convert-automation/index.d.ts +0 -3
  758. package/dist/internal/convert-automation/index.d.ts.map +0 -1
  759. package/dist/internal/convert-automation/index.js +0 -1
  760. package/dist/internal/grokbot/runner.d.ts +0 -64
  761. package/dist/internal/grokbot/runner.d.ts.map +0 -1
  762. package/dist/internal/grokbot/runner.js +0 -282
  763. package/dist/internal/managed-delivery.d.ts +0 -80
  764. package/dist/internal/managed-delivery.d.ts.map +0 -1
  765. package/dist/internal/managed-delivery.js +0 -86
  766. package/dist/internal/review-comments.d.ts +0 -370
  767. package/dist/internal/review-comments.d.ts.map +0 -1
  768. package/dist/internal/review-comments.js +0 -921
  769. package/dist/internal/shallow-clone.d.ts +0 -176
  770. package/dist/internal/shallow-clone.d.ts.map +0 -1
  771. package/dist/internal/shallow-clone.js +0 -419
  772. package/dist/playground/assets/index-B6C9S9nG.css +0 -1
  773. package/dist/playground/assets/index-ZqNoT8Ie.js +0 -69
  774. package/docs/guides/cloud-runtime.md +0 -122
  775. package/src/continuation.ts +0 -49
  776. package/src/internal/convert-automation/index.ts +0 -10
  777. package/src/internal/grokbot/runner.ts +0 -370
  778. package/src/internal/managed-delivery.ts +0 -125
  779. package/src/internal/review-comments.ts +0 -1363
  780. package/src/internal/shallow-clone.ts +0 -609
  781. /package/dist/docs/assets/{evals.md.CPzDAwoH.lean.js → evals.md.CbMoebP1.lean.js} +0 -0
  782. /package/dist/docs/assets/{guides_cloud-agents.md.DumwWXba.lean.js → guides_cloud-agents.md.DS8RIjwx.lean.js} +0 -0
  783. /package/dist/docs/assets/{index.md.Kiht7ell.lean.js → index.md.D75GWhPl.lean.js} +0 -0
  784. /package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.lean.js → reference_agent-config.md.CHNpiyp4.lean.js} +0 -0
  785. /package/dist/docs/assets/{reference_cli.md.DfoeyvL0.lean.js → reference_cli.md.CJNc_xYK.lean.js} +0 -0
  786. /package/dist/docs/assets/{reference_playground.md.DnX5nL-B.lean.js → reference_playground.md.4myJPxrf.lean.js} +0 -0
  787. /package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.lean.js → reference_project-layout.md.DuBu9a96.lean.js} +0 -0
  788. /package/dist/docs/assets/{reference_tools.md.B1up2r9W.lean.js → reference_tools.md.aGrn99hP.lean.js} +0 -0
  789. /package/dist/docs/assets/{skills_framework-map.md.DDa4MeEW.lean.js → skills_framework-map.md.haibFyoB.lean.js} +0 -0
@@ -4,11 +4,25 @@ import type {
4
4
  ChannelHandlerArgs,
5
5
  SendMessageOptions,
6
6
  } from "../types.js";
7
- import { refreshBoundDeploymentSecrets } from "./cursor/hosted-deployment-secrets.js";
7
+ import { dispatchOutcome } from "./channel-dispatch.js";
8
+ import {
9
+ consumeHostedBoundSecrets,
10
+ type HostedBoundSecretsResult,
11
+ } from "./cursor/hosted-bound-secrets.js";
8
12
  import {
9
13
  createDeferredChannelSession,
10
14
  DeferredChannelSessionError,
11
15
  } from "./deferred-channel-session.js";
16
+ import {
17
+ formatGuestNetworkServerTiming,
18
+ GUEST_CONNECT_STALLED,
19
+ GUEST_NETWORK_UNAVAILABLE,
20
+ GuestNetworkUnavailableError,
21
+ type GuestNetworkWaitResult,
22
+ type GuestNetworkWaitStats,
23
+ isQuietGuestConnectStallMessage,
24
+ waitForGuestNetworkReady,
25
+ } from "./guest-network.js";
12
26
  import {
13
27
  getHostedAdmissionAdapter,
14
28
  type HostedAdmissionAdapter,
@@ -38,6 +52,8 @@ import {
38
52
  import { recordHostedManagedAutomation } from "./hosted-managed-automation.js";
39
53
  import { errorResponse, readJsonObject } from "./http-channel.js";
40
54
  import type { LogRingEntry } from "./log-ring.js";
55
+ import { endActiveHttpSpan } from "./otel/http.js";
56
+ import { statusForThrownRequestError } from "./request-error-status.js";
41
57
  import type { Router } from "./router.js";
42
58
  import type { SessionRunExecutionWrite } from "./session-run-log.js";
43
59
 
@@ -219,8 +235,10 @@ async function runAdmission(
219
235
  },
220
236
  };
221
237
  }
222
- const outcome = adapter.getOutcome(dispatched);
223
- if (outcome === undefined) {
238
+ // A "send" tag with nothing captured means the channel's send bypassed the
239
+ // capture stub, so there is nothing for the control plane to execute.
240
+ const outcome = dispatchOutcome(dispatched);
241
+ if (outcome === undefined || outcome === "send") {
224
242
  return {
225
243
  response: Response.json(
226
244
  { ok: false, error: "channel_outcome_missing" },
@@ -237,12 +255,19 @@ async function runAdmission(
237
255
  };
238
256
  }
239
257
 
240
- function withServerTiming(response: Response, durationMs: number): Response {
258
+ function withServerTiming(
259
+ response: Response,
260
+ durationMs: number,
261
+ guestNetwork?: GuestNetworkWaitStats
262
+ ): Response {
263
+ const parts = [
264
+ `agent_sdk;desc="hosted";dur=${Math.max(0, durationMs).toFixed(1)}`,
265
+ ];
266
+ if (guestNetwork !== undefined) {
267
+ parts.push(formatGuestNetworkServerTiming(guestNetwork));
268
+ }
241
269
  const headers = new Headers(response.headers);
242
- headers.set(
243
- "Server-Timing",
244
- `agent_sdk;desc="hosted";dur=${Math.max(0, durationMs).toFixed(1)}`
245
- );
270
+ headers.set("Server-Timing", parts.join(", "));
246
271
  return new Response(response.body, {
247
272
  status: response.status,
248
273
  statusText: response.statusText,
@@ -250,6 +275,52 @@ function withServerTiming(response: Response, durationMs: number): Response {
250
275
  });
251
276
  }
252
277
 
278
+ function guestNetworkStatsFromWait(value: unknown): GuestNetworkWaitStats {
279
+ if (
280
+ typeof value === "object" &&
281
+ value !== null &&
282
+ "outcome" in value &&
283
+ ((value as GuestNetworkWaitResult).outcome === "ready" ||
284
+ (value as GuestNetworkWaitResult).outcome === "skipped") &&
285
+ typeof (value as GuestNetworkWaitResult).waitMs === "number" &&
286
+ typeof (value as GuestNetworkWaitResult).probeAttempts === "number"
287
+ ) {
288
+ const result = value as GuestNetworkWaitResult;
289
+ return {
290
+ outcome: result.outcome,
291
+ waitMs: result.waitMs,
292
+ probeAttempts: result.probeAttempts,
293
+ };
294
+ }
295
+ if (value === "skipped") {
296
+ return { outcome: "skipped", waitMs: 0, probeAttempts: 0 };
297
+ }
298
+ return { outcome: "ready", waitMs: 0, probeAttempts: 0 };
299
+ }
300
+
301
+ function guestNetworkStatsFromError(error: unknown): GuestNetworkWaitStats {
302
+ if (error instanceof GuestNetworkUnavailableError) {
303
+ return {
304
+ outcome: "unavailable",
305
+ waitMs: error.waitMs,
306
+ probeAttempts: error.probeAttempts,
307
+ };
308
+ }
309
+ return { outcome: "unavailable", waitMs: 0, probeAttempts: 0 };
310
+ }
311
+
312
+ function logGuestNetworkWait(
313
+ phase: "admission" | "execution",
314
+ stats: GuestNetworkWaitStats
315
+ ): void {
316
+ if (stats.outcome === "skipped") {
317
+ return;
318
+ }
319
+ console.info(
320
+ `[agent-sdk] guest network ${stats.outcome} phase=${phase} waitMs=${String(stats.waitMs)} probes=${String(stats.probeAttempts)}`
321
+ );
322
+ }
323
+
253
324
  export function registerHostedDeliveryRoute(input: {
254
325
  router: Router;
255
326
  base: string;
@@ -265,6 +336,11 @@ export function registerHostedDeliveryRoute(input: {
265
336
  * the conversation on the next wake.
266
337
  */
267
338
  drainSessionDurability?(sessionId: string): Promise<void>;
339
+ /**
340
+ * Export in-memory OTel batches before the HTTP reply. Hosted v2 may
341
+ * destroy the VM as soon as that reply lands; SIGTERM is not guaranteed.
342
+ */
343
+ flushOtel?(): Promise<void>;
268
344
  /**
269
345
  * Serve `--state-root` (not the per-slug SessionEngine dir). Hosted
270
346
  * freeze is `/workspace/.agent-serve`; the Temporal host reads
@@ -282,6 +358,17 @@ export function registerHostedDeliveryRoute(input: {
282
358
  flushStartLog?(startLogId: string): Promise<void>;
283
359
  /** Snapshot of the process log ring at persist time. */
284
360
  snapshotLogs?(): LogRingEntry[];
361
+ /**
362
+ * Wait until guest egress works before authored admission/execution.
363
+ * Defaults to {@link waitForGuestNetworkReady}. Tests inject a stub.
364
+ */
365
+ waitForGuestNetwork?(): Promise<GuestNetworkWaitResult | unknown>;
366
+ /**
367
+ * Hydrate `process.env` from the task-bind secret files and remove them
368
+ * from disk. Defaults to {@link consumeHostedBoundSecrets}. Tests inject a
369
+ * stub.
370
+ */
371
+ consumeBoundSecrets?(): HostedBoundSecretsResult;
285
372
  }): void {
286
373
  const pending = new Map<
287
374
  string,
@@ -293,6 +380,50 @@ export function registerHostedDeliveryRoute(input: {
293
380
  }
294
381
  >();
295
382
  const pendingTtlMs = 10 * 60_000;
383
+ const waitForNetwork =
384
+ input.waitForGuestNetwork ?? (() => waitForGuestNetworkReady());
385
+ const consumeBoundSecrets =
386
+ input.consumeBoundSecrets ?? (() => consumeHostedBoundSecrets());
387
+ /**
388
+ * Close the bind-file handoff before anything else touches the request.
389
+ * A surviving secret is retryable: the control plane re-binds and the next
390
+ * attempt consumes a fresh pair of files.
391
+ */
392
+ const finishBoundSecrets = (): Response | undefined => {
393
+ const consumed = consumeBoundSecrets();
394
+ return consumed.ok
395
+ ? undefined
396
+ : errorResponse(503, consumed.code, boundedMessage(consumed.message));
397
+ };
398
+ const finishNetworkWait = async (
399
+ phase: "admission" | "execution"
400
+ ): Promise<{
401
+ response?: Response;
402
+ timing: GuestNetworkWaitStats;
403
+ }> => {
404
+ try {
405
+ const timing = guestNetworkStatsFromWait(await waitForNetwork());
406
+ logGuestNetworkWait(phase, timing);
407
+ return { timing };
408
+ } catch (error) {
409
+ const timing = guestNetworkStatsFromError(error);
410
+ logGuestNetworkWait(phase, timing);
411
+ const message =
412
+ error instanceof GuestNetworkUnavailableError
413
+ ? error.message
414
+ : error instanceof Error
415
+ ? error.message
416
+ : "Guest network is not ready for outbound requests.";
417
+ return {
418
+ timing,
419
+ response: errorResponse(
420
+ 503,
421
+ GUEST_NETWORK_UNAVAILABLE,
422
+ boundedMessage(message)
423
+ ),
424
+ };
425
+ }
426
+ };
296
427
  const pruneExpired = () => {
297
428
  const now = Date.now();
298
429
  for (const [token, item] of pending) {
@@ -318,207 +449,277 @@ export function registerHostedDeliveryRoute(input: {
318
449
  method: "POST",
319
450
  pattern: `${input.base}${HOSTED_ADMISSION_PATH}`,
320
451
  auth: [auth],
321
- handler: async (request) => {
322
- refreshBoundDeploymentSecrets();
323
- const startedAt = performance.now();
324
- const finish = (response: Response) =>
325
- withServerTiming(response, performance.now() - startedAt);
326
- const delivery = parseHostedAdmission(await readJsonObject(request));
327
- if (delivery === undefined) {
328
- return finish(
329
- errorResponse(
330
- 400,
331
- "invalid_hosted_admission",
332
- "Expected a supported Agent SDK hosted-admission envelope."
333
- )
452
+ handler: async (request) =>
453
+ afterHostedWork(input.flushOtel, async () => {
454
+ const startedAt = performance.now();
455
+ let guestNetwork: GuestNetworkWaitStats | undefined;
456
+ const finish = (response: Response) =>
457
+ withServerTiming(
458
+ response,
459
+ performance.now() - startedAt,
460
+ guestNetwork
461
+ );
462
+ const unconsumed = finishBoundSecrets();
463
+ if (unconsumed !== undefined) {
464
+ return finish(unconsumed);
465
+ }
466
+ const delivery = parseHostedAdmission(await readJsonObject(request));
467
+ if (delivery === undefined) {
468
+ return finish(
469
+ errorResponse(
470
+ 400,
471
+ "invalid_hosted_admission",
472
+ "Expected a supported Agent SDK hosted-admission envelope."
473
+ )
474
+ );
475
+ }
476
+ recordHostedManagedAutomation(delivery);
477
+ const channel = input.channels.find(
478
+ (candidate) => candidate.id === delivery.channelId
334
479
  );
335
- }
336
- recordHostedManagedAutomation(delivery);
337
- const channel = input.channels.find(
338
- (candidate) => candidate.id === delivery.channelId
339
- );
340
- if (channel === undefined) {
480
+ if (channel === undefined) {
481
+ return finish(
482
+ errorResponse(
483
+ 404,
484
+ "channel_not_found",
485
+ `No channel named "${delivery.channelId}" is mounted.`
486
+ )
487
+ );
488
+ }
489
+ const network = await finishNetworkWait("admission");
490
+ guestNetwork = network.timing;
491
+ if (network.response !== undefined) {
492
+ return finish(network.response);
493
+ }
494
+ const admitted = await dispatchHostedAdmission({
495
+ delivery,
496
+ definition: channel.definition,
497
+ args: input.buildHandlerArgs(delivery.channelId),
498
+ });
499
+ if (admitted.pendingSend === undefined) {
500
+ return finish(admitted.response);
501
+ }
502
+ pruneExpired();
503
+ const admissionToken = randomBytes(24).toString("hex");
504
+ pending.set(admissionToken, {
505
+ send: admitted.pendingSend,
506
+ expiresAt: Date.now() + pendingTtlMs,
507
+ });
341
508
  return finish(
342
- errorResponse(
343
- 404,
344
- "channel_not_found",
345
- `No channel named "${delivery.channelId}" is mounted.`
346
- )
509
+ Response.json({
510
+ ok: true,
511
+ v: HOSTED_DELIVERY_PROTOCOL_VERSION,
512
+ outcome: "send",
513
+ admissionToken,
514
+ })
347
515
  );
348
- }
349
- const admitted = await dispatchHostedAdmission({
350
- delivery,
351
- definition: channel.definition,
352
- args: input.buildHandlerArgs(delivery.channelId),
353
- });
354
- if (admitted.pendingSend === undefined) {
355
- return finish(admitted.response);
356
- }
357
- pruneExpired();
358
- const admissionToken = randomBytes(24).toString("hex");
359
- pending.set(admissionToken, {
360
- send: admitted.pendingSend,
361
- expiresAt: Date.now() + pendingTtlMs,
362
- });
363
- return finish(
364
- Response.json({
365
- ok: true,
366
- v: HOSTED_DELIVERY_PROTOCOL_VERSION,
367
- outcome: "send",
368
- admissionToken,
369
- })
370
- );
371
- },
516
+ }),
372
517
  });
373
518
  input.router.add({
374
519
  method: "POST",
375
520
  pattern: `${input.base}${HOSTED_EXECUTION_PATH}`,
376
521
  auth: [auth],
377
- handler: async (request) => {
378
- refreshBoundDeploymentSecrets();
379
- const startedAt = performance.now();
380
- const finish = (response: Response) =>
381
- withServerTiming(response, performance.now() - startedAt);
382
-
383
- const execution = parseHostedExecution(await readJsonObject(request));
384
- if (execution === undefined) {
385
- return finish(
386
- errorResponse(
387
- 400,
388
- "invalid_hosted_execution",
389
- "Expected a supported Agent SDK hosted-execution envelope."
390
- )
391
- );
392
- }
393
- pruneExpired();
394
- const admitted = pending.get(execution.admissionToken);
395
- if (admitted === undefined) {
396
- return finish(
397
- errorResponse(
398
- 409,
399
- "hosted_admission_unavailable",
400
- "The hosted admission token is missing or expired."
401
- )
402
- );
403
- }
404
- if (
405
- admitted.sessionPublicId !== undefined &&
406
- admitted.sessionPublicId !== execution.sessionPublicId
407
- ) {
408
- return finish(
409
- errorResponse(
410
- 409,
411
- "hosted_admission_session_mismatch",
412
- "The hosted admission token is already bound to another session."
413
- )
414
- );
415
- }
416
- admitted.sessionPublicId = execution.sessionPublicId;
417
- admitted.execution ??= (async (): Promise<ExecutionReply> => {
522
+ handler: async (request) =>
523
+ afterHostedWork(input.flushOtel, async () => {
418
524
  const startedAt = performance.now();
419
- const executionId = hostedExecutionDiagId(execution.admissionToken);
420
- const sinks: HostedExecutionFlushSinks = {
421
- ...(input.stateRoot === undefined
422
- ? {}
423
- : { stateRoot: input.stateRoot }),
424
- ...(input.persistSessionRun === undefined
425
- ? {}
426
- : { persistSessionRun: input.persistSessionRun }),
427
- ...(input.flushStartLog === undefined
428
- ? {}
429
- : { flushStartLog: input.flushStartLog }),
430
- ...(input.snapshotLogs === undefined
431
- ? {}
432
- : { snapshotLogs: input.snapshotLogs }),
433
- };
434
- const writeDiag = async (fields: {
435
- sessionId: string;
436
- turnStatus: string;
437
- message?: string;
438
- abortReason?:
439
- | ReturnType<typeof abortReasonFromTurnStatus>
440
- | "execute_throw";
441
- error?: unknown;
442
- }): Promise<void> => {
443
- await flushHostedExecutionRecord(sinks, {
444
- executionId,
445
- sessionPublicId: execution.sessionPublicId,
446
- sessionId: fields.sessionId,
447
- turnStatus: fields.turnStatus,
448
- durationMs: Math.max(0, Math.round(performance.now() - startedAt)),
449
- ...(fields.message === undefined
525
+ let guestNetwork: GuestNetworkWaitStats | undefined;
526
+ const finish = (response: Response) =>
527
+ withServerTiming(
528
+ response,
529
+ performance.now() - startedAt,
530
+ guestNetwork
531
+ );
532
+ const unconsumed = finishBoundSecrets();
533
+ if (unconsumed !== undefined) {
534
+ return finish(unconsumed);
535
+ }
536
+ const execution = parseHostedExecution(await readJsonObject(request));
537
+ if (execution === undefined) {
538
+ return finish(
539
+ errorResponse(
540
+ 400,
541
+ "invalid_hosted_execution",
542
+ "Expected a supported Agent SDK hosted-execution envelope."
543
+ )
544
+ );
545
+ }
546
+ pruneExpired();
547
+ const admitted = pending.get(execution.admissionToken);
548
+ if (admitted === undefined) {
549
+ return finish(
550
+ errorResponse(
551
+ 409,
552
+ "hosted_admission_unavailable",
553
+ "The hosted admission token is missing or expired."
554
+ )
555
+ );
556
+ }
557
+ if (
558
+ admitted.sessionPublicId !== undefined &&
559
+ admitted.sessionPublicId !== execution.sessionPublicId
560
+ ) {
561
+ return finish(
562
+ errorResponse(
563
+ 409,
564
+ "hosted_admission_session_mismatch",
565
+ "The hosted admission token is already bound to another session."
566
+ )
567
+ );
568
+ }
569
+ const network = await finishNetworkWait("execution");
570
+ guestNetwork = network.timing;
571
+ if (network.response !== undefined) {
572
+ return finish(network.response);
573
+ }
574
+ admitted.sessionPublicId = execution.sessionPublicId;
575
+ admitted.execution ??= (async (): Promise<ExecutionReply> => {
576
+ const startedAt = performance.now();
577
+ const executionId = hostedExecutionDiagId(execution.admissionToken);
578
+ const sinks: HostedExecutionFlushSinks = {
579
+ ...(input.stateRoot === undefined
450
580
  ? {}
451
- : { message: fields.message }),
452
- ...(fields.abortReason === undefined
581
+ : { stateRoot: input.stateRoot }),
582
+ ...(input.persistSessionRun === undefined
453
583
  ? {}
454
- : { abortReason: fields.abortReason }),
455
- ...(fields.error === undefined ? {} : { error: fields.error }),
456
- });
457
- };
458
- // Claim the file before the turn runs. The host reads it after its
459
- // own POST returns, which for a 9-minute timeout is while this turn
460
- // is still going; without this marker that read would surface the
461
- // PREVIOUS delivery's terminal record as if it were this one's.
462
- await writeDiag({
463
- sessionId: "",
464
- turnStatus: HOSTED_EXECUTION_DIAG_RUNNING_STATUS,
465
- });
466
- try {
467
- const args = input.buildHandlerArgs(
468
- admitted.send.channelId,
469
- execution.sessionPublicId
470
- );
471
- const session = await args.send(admitted.send.message, {
472
- ...admitted.send.options,
473
- mailboxContinuation: {
474
- key: admitted.send.mailboxContinuationKey,
475
- },
476
- });
477
- const outcome = await session.waitForCompletion();
478
- // Failed turns drain too: their record/continuation updates must
479
- // survive the park just like a finished turn's.
480
- await input.drainSessionDurability?.(session.id);
584
+ : { persistSessionRun: input.persistSessionRun }),
585
+ ...(input.flushStartLog === undefined
586
+ ? {}
587
+ : { flushStartLog: input.flushStartLog }),
588
+ ...(input.snapshotLogs === undefined
589
+ ? {}
590
+ : { snapshotLogs: input.snapshotLogs }),
591
+ };
592
+ const writeDiag = async (fields: {
593
+ sessionId: string;
594
+ turnStatus: string;
595
+ message?: string;
596
+ abortReason?:
597
+ | ReturnType<typeof abortReasonFromTurnStatus>
598
+ | "execute_throw";
599
+ error?: unknown;
600
+ }): Promise<void> => {
601
+ await flushHostedExecutionRecord(sinks, {
602
+ executionId,
603
+ sessionPublicId: execution.sessionPublicId,
604
+ sessionId: fields.sessionId,
605
+ turnStatus: fields.turnStatus,
606
+ durationMs: Math.max(
607
+ 0,
608
+ Math.round(performance.now() - startedAt)
609
+ ),
610
+ ...(fields.message === undefined
611
+ ? {}
612
+ : { message: fields.message }),
613
+ ...(fields.abortReason === undefined
614
+ ? {}
615
+ : { abortReason: fields.abortReason }),
616
+ ...(fields.error === undefined ? {} : { error: fields.error }),
617
+ });
618
+ };
619
+ // Claim the file before the turn runs. The host reads it after its
620
+ // own POST returns, which for a 9-minute timeout is while this turn
621
+ // is still going; without this marker that read would surface the
622
+ // PREVIOUS delivery's terminal record as if it were this one's.
481
623
  await writeDiag({
482
- sessionId: session.id,
483
- turnStatus: outcome.status,
484
- message: outcome.errorMessage,
485
- abortReason: abortReasonFromTurnStatus(
486
- outcome.status,
487
- outcome.errorMessage
488
- ),
624
+ sessionId: "",
625
+ turnStatus: HOSTED_EXECUTION_DIAG_RUNNING_STATUS,
489
626
  });
490
- if (outcome.status !== "finished") {
627
+ try {
628
+ const args = input.buildHandlerArgs(
629
+ admitted.send.channelId,
630
+ execution.sessionPublicId
631
+ );
632
+ const session = await args.send(admitted.send.message, {
633
+ ...admitted.send.options,
634
+ mailboxContinuation: {
635
+ key: admitted.send.mailboxContinuationKey,
636
+ },
637
+ });
638
+ const outcome = await session.waitForCompletion();
639
+ // Failed turns drain too: their record/continuation updates must
640
+ // survive the park just like a finished turn's.
641
+ await input.drainSessionDurability?.(session.id);
642
+ await writeDiag({
643
+ sessionId: session.id,
644
+ turnStatus: outcome.status,
645
+ message: outcome.errorMessage,
646
+ abortReason: abortReasonFromTurnStatus(
647
+ outcome.status,
648
+ outcome.errorMessage
649
+ ),
650
+ });
651
+ if (outcome.status !== "finished") {
652
+ // waitForCompletion resolves (does not throw) on a quiet
653
+ // Connect abort. Map that to guest_connect_stalled so TAS
654
+ // retries the same pod. Real runner failures stay turn_failed.
655
+ return {
656
+ status: 503,
657
+ body: {
658
+ ok: false,
659
+ error: hostedErrorForUnfinishedTurn(outcome.errorMessage),
660
+ turnStatus: outcome.status,
661
+ message: outcome.errorMessage,
662
+ },
663
+ };
664
+ }
491
665
  return {
492
- status: 503,
666
+ status: 200,
493
667
  body: {
494
- ok: false,
495
- error: "turn_failed",
496
- turnStatus: outcome.status,
497
- message: outcome.errorMessage,
668
+ ok: true,
669
+ v: HOSTED_DELIVERY_PROTOCOL_VERSION,
670
+ outcome: "send",
498
671
  },
499
672
  };
673
+ } catch (error) {
674
+ await writeDiag({
675
+ sessionId: "",
676
+ turnStatus: "error",
677
+ message: error instanceof Error ? error.message : String(error),
678
+ abortReason: "execute_throw",
679
+ error,
680
+ });
681
+ throw error;
500
682
  }
501
- return {
502
- status: 200,
503
- body: {
504
- ok: true,
505
- v: HOSTED_DELIVERY_PROTOCOL_VERSION,
506
- outcome: "send",
507
- },
508
- };
509
- } catch (error) {
510
- await writeDiag({
511
- sessionId: "",
512
- turnStatus: "error",
513
- message: error instanceof Error ? error.message : String(error),
514
- abortReason: "execute_throw",
515
- error,
516
- });
517
- throw error;
518
- }
519
- })();
520
- const reply = await admitted.execution;
521
- return finish(Response.json(reply.body, { status: reply.status }));
522
- },
683
+ })();
684
+ const reply = await admitted.execution;
685
+ return finish(Response.json(reply.body, { status: reply.status }));
686
+ }),
523
687
  });
524
688
  }
689
+
690
+ function hostedErrorForUnfinishedTurn(
691
+ errorMessage: string | undefined
692
+ ): typeof GUEST_CONNECT_STALLED | "turn_failed" {
693
+ if (
694
+ errorMessage !== undefined &&
695
+ isQuietGuestConnectStallMessage(errorMessage)
696
+ ) {
697
+ return GUEST_CONNECT_STALLED;
698
+ }
699
+ return "turn_failed";
700
+ }
701
+
702
+ async function afterHostedWork<T>(
703
+ flushOtel: (() => Promise<void>) | undefined,
704
+ work: () => Promise<T>
705
+ ): Promise<T> {
706
+ try {
707
+ const result = await work();
708
+ if (result instanceof Response) {
709
+ endActiveHttpSpan(result.status);
710
+ }
711
+ return result;
712
+ } catch (error) {
713
+ const status = statusForThrownRequestError(error);
714
+ endActiveHttpSpan(status, status >= 500 ? error : undefined);
715
+ throw error;
716
+ } finally {
717
+ if (flushOtel !== undefined) {
718
+ try {
719
+ await flushOtel();
720
+ } catch {
721
+ // Soft-fail: exporter failure must not change hosted HTTP.
722
+ }
723
+ }
724
+ }
725
+ }
@@ -20,6 +20,7 @@ import type {
20
20
  } from "../types.js";
21
21
  import { samePrincipal } from "./auth.js";
22
22
  import { formatContinuationToken, parseContinuationToken } from "./ids.js";
23
+ import { isRecord } from "./is-record.js";
23
24
  import { isLoopbackAddress } from "./net.js";
24
25
  import type { ServerRoute } from "./router.js";
25
26
  import {
@@ -645,10 +646,6 @@ function readWorkspaceFiles(
645
646
  return Object.keys(files).length === 0 ? undefined : files;
646
647
  }
647
648
 
648
- function isRecord(value: unknown): value is Record<string, unknown> {
649
- return typeof value === "object" && value !== null && !Array.isArray(value);
650
- }
651
-
652
649
  /** Best-effort parse of {@link AgentCloudOptions} from a JSON body field. */
653
650
  function readCloudOptions(value: unknown): AgentCloudOptions | undefined {
654
651
  if (!isRecord(value)) {