@cursor/july 0.1.102 → 0.1.103

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