@cursor/july 0.1.105 → 0.1.108

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 (395) hide show
  1. package/README.md +10 -5
  2. package/dist/bin/agent-serve.js +31 -16
  3. package/dist/channels/bitbucket/types.d.ts +2 -4
  4. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  5. package/dist/channels/deployments/types.d.ts +5 -8
  6. package/dist/channels/deployments/types.d.ts.map +1 -1
  7. package/dist/channels/github/github-channel.js +8 -5
  8. package/dist/channels/github/types.d.ts +7 -5
  9. package/dist/channels/github/types.d.ts.map +1 -1
  10. package/dist/channels/gitlab/types.d.ts +2 -5
  11. package/dist/channels/gitlab/types.d.ts.map +1 -1
  12. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  13. package/dist/channels/origin/origin-channel.js +27 -13
  14. package/dist/channels/origin/types.d.ts +7 -4
  15. package/dist/channels/origin/types.d.ts.map +1 -1
  16. package/dist/channels/slack/defaults.d.ts.map +1 -1
  17. package/dist/channels/slack/defaults.js +3 -0
  18. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  19. package/dist/channels/slack/dispatch.js +1 -1
  20. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  21. package/dist/channels/slack/live-delivery.js +48 -11
  22. package/dist/channels/slack/types.d.ts +4 -3
  23. package/dist/channels/slack/types.d.ts.map +1 -1
  24. package/dist/channels.d.ts +45 -0
  25. package/dist/channels.d.ts.map +1 -1
  26. package/dist/channels.js +106 -7
  27. package/dist/connections.d.ts +2 -1
  28. package/dist/connections.d.ts.map +1 -1
  29. package/dist/connections.js +2 -1
  30. package/dist/docs/404.html +3 -3
  31. package/dist/docs/ab.html +6 -6
  32. package/dist/docs/assets/{app.BVwaffdK.js → app.BASKM3M4.js} +1 -1
  33. package/dist/docs/assets/chunks/@localSearchIndexroot.BHZYsNVi.js +1 -0
  34. package/dist/docs/assets/chunks/{VPLocalSearchBox.WuWTZ1x8.js → VPLocalSearchBox.BOKxlYGP.js} +2 -2
  35. package/dist/docs/assets/chunks/{theme.BYdI_6sF.js → theme.DbDZW-zb.js} +2 -2
  36. package/dist/docs/assets/{deployment.md.MFPKqsqI.js → deployment.md.JenwuCCB.js} +4 -4
  37. package/dist/docs/assets/{deployment.md.MFPKqsqI.lean.js → deployment.md.JenwuCCB.lean.js} +1 -1
  38. package/dist/docs/assets/{evals.md.CbMoebP1.js → evals.md.C1ekS3k2.js} +1 -1
  39. package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.js +9 -0
  40. package/dist/docs/assets/{guides_cloud-agents.md.DS8RIjwx.lean.js → guides_cloud-agents.md.BsloyHdY.lean.js} +1 -1
  41. package/dist/docs/assets/{guides_github.md.c0gdGJ-D.js → guides_github.md.BH33UEBJ.js} +1 -1
  42. package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.js → guides_grokbot-agents.md.DyV-WArv.js} +1 -1
  43. package/dist/docs/assets/guides_improve.md.BGVk32bK.js +14 -0
  44. package/dist/docs/assets/guides_improve.md.BGVk32bK.lean.js +1 -0
  45. package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.js → guides_opentelemetry.md.SCRMskno.js} +3 -3
  46. package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.lean.js → guides_opentelemetry.md.SCRMskno.lean.js} +1 -1
  47. package/dist/docs/assets/{guides_slack.md.9oHPye9o.js → guides_slack.md.D4RVMM4G.js} +3 -3
  48. package/dist/docs/assets/{guides_slack.md.9oHPye9o.lean.js → guides_slack.md.D4RVMM4G.lean.js} +1 -1
  49. package/dist/docs/assets/index.md.BjH1w2ZW.js +5 -0
  50. package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.js → reference_agent-config.md.CvoL6pof.js} +1 -1
  51. package/dist/docs/assets/{reference_channels.md.DBGcaB7m.js → reference_channels.md.D-qTqwcq.js} +2 -2
  52. package/dist/docs/assets/{reference_channels.md.DBGcaB7m.lean.js → reference_channels.md.D-qTqwcq.lean.js} +1 -1
  53. package/dist/docs/assets/{reference_cli.md.C6Lo8SEd.js → reference_cli.md.Ca26u0Es.js} +6 -6
  54. package/dist/docs/assets/{reference_cli.md.C6Lo8SEd.lean.js → reference_cli.md.Ca26u0Es.lean.js} +1 -1
  55. package/dist/docs/assets/{reference_connections.md.Di6jJAXF.js → reference_connections.md.BojkC6c5.js} +1 -1
  56. package/dist/docs/assets/{reference_extensions.md.CGmMLblt.js → reference_extensions.md.CPWt00ds.js} +1 -1
  57. package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.js → scaffolding-agents.md.Kctn3OVb.js} +1 -1
  58. package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.js → skills_create-agent.md.Q3h6Je-e.js} +1 -1
  59. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.js → skills_debug.md.CVjCXMFF.js} +1 -1
  60. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.lean.js → skills_debug.md.CVjCXMFF.lean.js} +1 -1
  61. package/dist/docs/assets/{skills_evals.md.723kpUmA.js → skills_evals.md.BhovOvrl.js} +1 -1
  62. package/dist/docs/assets/skills_framework-map.md.D-tFZhFS.js +1 -0
  63. package/dist/docs/assets/{skills_framework-map.md.haibFyoB.lean.js → skills_framework-map.md.D-tFZhFS.lean.js} +1 -1
  64. package/dist/docs/assets/{skills_github.md.D0JahM8c.js → skills_github.md.hgFX_oKY.js} +1 -1
  65. package/dist/docs/assets/{skills_otel.md.CqhobH3B.js → skills_otel.md.B5Ddv1xH.js} +1 -1
  66. package/dist/docs/assets/{style.BRuM8477.css → style.DCD_zyg3.css} +1 -1
  67. package/dist/docs/assets/troubleshooting.md.CYEAO9bM.js +1 -0
  68. package/dist/docs/building-with-agents.html +6 -6
  69. package/dist/docs/concepts.html +5 -5
  70. package/dist/docs/deployment.html +9 -9
  71. package/dist/docs/deployment.md +7 -2
  72. package/dist/docs/evals.html +8 -8
  73. package/dist/docs/evals.md +3 -2
  74. package/dist/docs/guides/agent-to-agent.html +6 -6
  75. package/dist/docs/guides/cloud-agents.html +7 -7
  76. package/dist/docs/guides/cloud-agents.md +4 -3
  77. package/dist/docs/guides/convert-automation.html +6 -6
  78. package/dist/docs/guides/github.html +7 -7
  79. package/dist/docs/guides/github.md +2 -1
  80. package/dist/docs/guides/grokbot-agents.html +7 -7
  81. package/dist/docs/guides/grokbot-agents.md +2 -2
  82. package/dist/docs/guides/human-in-the-loop.html +6 -6
  83. package/dist/docs/guides/improve.html +40 -0
  84. package/dist/docs/guides/improve.md +91 -0
  85. package/dist/docs/guides/mcp-oauth.html +6 -6
  86. package/dist/docs/guides/opentelemetry.html +8 -8
  87. package/dist/docs/guides/opentelemetry.md +3 -4
  88. package/dist/docs/guides/slack.html +8 -8
  89. package/dist/docs/guides/slack.md +2 -1
  90. package/dist/docs/guides/webhooks.html +6 -6
  91. package/dist/docs/hashmap.json +1 -1
  92. package/dist/docs/hillclimbing.html +6 -6
  93. package/dist/docs/index.html +8 -8
  94. package/dist/docs/index.md +4 -0
  95. package/dist/docs/llms-full.txt +180 -61
  96. package/dist/docs/llms.txt +1 -0
  97. package/dist/docs/quickstart.html +6 -6
  98. package/dist/docs/reference/agent-config.html +7 -7
  99. package/dist/docs/reference/agent-config.md +5 -2
  100. package/dist/docs/reference/artifacts.html +6 -6
  101. package/dist/docs/reference/channels.html +7 -7
  102. package/dist/docs/reference/channels.md +11 -19
  103. package/dist/docs/reference/cli.html +11 -11
  104. package/dist/docs/reference/cli.md +23 -13
  105. package/dist/docs/reference/connections.html +8 -8
  106. package/dist/docs/reference/connections.md +2 -1
  107. package/dist/docs/reference/extensions.html +7 -7
  108. package/dist/docs/reference/extensions.md +2 -0
  109. package/dist/docs/reference/hooks.html +6 -6
  110. package/dist/docs/reference/http-api.html +6 -6
  111. package/dist/docs/reference/instructions.html +6 -6
  112. package/dist/docs/reference/playground.html +5 -5
  113. package/dist/docs/reference/project-layout.html +6 -6
  114. package/dist/docs/reference/prompt.html +6 -6
  115. package/dist/docs/reference/result.html +6 -6
  116. package/dist/docs/reference/schedules.html +6 -6
  117. package/dist/docs/reference/sessions.html +5 -5
  118. package/dist/docs/reference/skills.html +6 -6
  119. package/dist/docs/reference/subagents.html +6 -6
  120. package/dist/docs/reference/tools.html +6 -6
  121. package/dist/docs/scaffolding-agents.html +6 -6
  122. package/dist/docs/scaffolding-agents.md +2 -1
  123. package/dist/docs/skills/ab.html +6 -6
  124. package/dist/docs/skills/create-agent.html +8 -8
  125. package/dist/docs/skills/create-agent.md +1 -1
  126. package/dist/docs/skills/debug.html +6 -6
  127. package/dist/docs/skills/debug.md +1 -1
  128. package/dist/docs/skills/evals.html +8 -8
  129. package/dist/docs/skills/evals.md +1 -1
  130. package/dist/docs/skills/framework-map.html +6 -6
  131. package/dist/docs/skills/framework-map.md +4 -2
  132. package/dist/docs/skills/github.html +8 -8
  133. package/dist/docs/skills/github.md +1 -1
  134. package/dist/docs/skills/hillclimb.html +6 -6
  135. package/dist/docs/skills/index.html +5 -5
  136. package/dist/docs/skills/mcp-auth.html +6 -6
  137. package/dist/docs/skills/otel.html +8 -8
  138. package/dist/docs/skills/otel.md +3 -3
  139. package/dist/docs/skills/setup-slack.html +6 -6
  140. package/dist/docs/storage.html +6 -6
  141. package/dist/docs/templates/agentic-owners.html +6 -6
  142. package/dist/docs/templates/agents-md.html +6 -6
  143. package/dist/docs/templates/code-wiki.html +6 -6
  144. package/dist/docs/templates/demo.html +6 -6
  145. package/dist/docs/templates/grokbot-agents.html +6 -6
  146. package/dist/docs/templates/pr-autofixer.html +6 -6
  147. package/dist/docs/templates/security-help.html +6 -6
  148. package/dist/docs/templates/security-reviewer.html +6 -6
  149. package/dist/docs/templates/triage.html +6 -6
  150. package/dist/docs/troubleshooting.html +6 -6
  151. package/dist/docs/troubleshooting.md +1 -1
  152. package/dist/extensions/improve/extension.d.ts +46 -0
  153. package/dist/extensions/improve/extension.d.ts.map +1 -0
  154. package/dist/extensions/improve/extension.js +41 -0
  155. package/dist/extensions/improve/skills/yourself.d.ts +4 -0
  156. package/dist/extensions/improve/skills/yourself.d.ts.map +1 -0
  157. package/dist/extensions/improve/skills/yourself.js +43 -0
  158. package/dist/index.d.ts +4 -5
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +3 -4
  161. package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
  162. package/dist/internal/builtin-tools/artifacts.js +2 -3
  163. package/dist/internal/channel-route-dispatch.d.ts +13 -0
  164. package/dist/internal/channel-route-dispatch.d.ts.map +1 -0
  165. package/dist/internal/channel-route-dispatch.js +62 -0
  166. package/dist/internal/channel-state.d.ts +17 -0
  167. package/dist/internal/channel-state.d.ts.map +1 -0
  168. package/dist/internal/channel-state.js +78 -0
  169. package/dist/internal/cli-ax.d.ts +7 -0
  170. package/dist/internal/cli-ax.d.ts.map +1 -1
  171. package/dist/internal/cli-ax.js +99 -1
  172. package/dist/internal/cli-cursor.d.ts.map +1 -1
  173. package/dist/internal/cli-cursor.js +2 -0
  174. package/dist/internal/cli-deploy.d.ts.map +1 -1
  175. package/dist/internal/cli-deploy.js +61 -25
  176. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  177. package/dist/internal/cli-mcp-oauth.js +15 -0
  178. package/dist/internal/cli-mcp.d.ts.map +1 -1
  179. package/dist/internal/cli-mcp.js +12 -0
  180. package/dist/internal/cli-slack.d.ts.map +1 -1
  181. package/dist/internal/cli-slack.js +8 -2
  182. package/dist/internal/cursor/backend-client.d.ts +25 -0
  183. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  184. package/dist/internal/cursor/backend-client.js +57 -2
  185. package/dist/internal/cursor/credentials.d.ts +8 -2
  186. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  187. package/dist/internal/cursor/credentials.js +27 -5
  188. package/dist/internal/deploy-client.d.ts +35 -0
  189. package/dist/internal/deploy-client.d.ts.map +1 -1
  190. package/dist/internal/deploy-client.js +46 -0
  191. package/dist/internal/deploy-manifest.d.ts +26 -0
  192. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  193. package/dist/internal/deploy-manifest.js +99 -13
  194. package/dist/internal/describe-error.d.ts +1 -0
  195. package/dist/internal/describe-error.d.ts.map +1 -1
  196. package/dist/internal/describe-error.js +25 -0
  197. package/dist/internal/discovery/agent.d.ts.map +1 -1
  198. package/dist/internal/discovery/agent.js +1 -0
  199. package/dist/internal/discovery/info.d.ts.map +1 -1
  200. package/dist/internal/discovery/info.js +7 -3
  201. package/dist/internal/discovery/modules.d.ts +1 -1
  202. package/dist/internal/discovery/modules.d.ts.map +1 -1
  203. package/dist/internal/discovery/modules.js +1 -0
  204. package/dist/internal/discovery/project.d.ts.map +1 -1
  205. package/dist/internal/discovery/project.js +3 -0
  206. package/dist/internal/discovery/reminders.d.ts +7 -0
  207. package/dist/internal/discovery/reminders.d.ts.map +1 -0
  208. package/dist/internal/discovery/reminders.js +65 -0
  209. package/dist/internal/discovery/subagent.js +1 -0
  210. package/dist/internal/distribution.d.ts +5 -0
  211. package/dist/internal/distribution.d.ts.map +1 -1
  212. package/dist/internal/distribution.js +17 -0
  213. package/dist/internal/framework-storage-selection.d.ts +14 -3
  214. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  215. package/dist/internal/framework-storage-selection.js +36 -6
  216. package/dist/internal/guest-network.d.ts +4 -10
  217. package/dist/internal/guest-network.d.ts.map +1 -1
  218. package/dist/internal/guest-network.js +44 -26
  219. package/dist/internal/hosted-admission-adapter.d.ts +2 -0
  220. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  221. package/dist/internal/hosted-catch-protocol.d.ts +51 -0
  222. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -0
  223. package/dist/internal/hosted-catch-protocol.js +103 -0
  224. package/dist/internal/hosted-catch.d.ts +40 -0
  225. package/dist/internal/hosted-catch.d.ts.map +1 -0
  226. package/dist/internal/hosted-catch.js +149 -0
  227. package/dist/internal/hosted-delivery-protocol.d.ts +89 -0
  228. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  229. package/dist/internal/hosted-delivery-protocol.js +309 -0
  230. package/dist/internal/hosted-delivery.d.ts +20 -1
  231. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  232. package/dist/internal/hosted-delivery.js +179 -36
  233. package/dist/internal/hosted-execution-diag.d.ts +4 -1
  234. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  235. package/dist/internal/hosted-execution-diag.js +13 -4
  236. package/dist/internal/hosted-execution-flush.d.ts +3 -0
  237. package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
  238. package/dist/internal/hosted-execution-flush.js +2 -4
  239. package/dist/internal/http-control-plane-session.d.ts +30 -0
  240. package/dist/internal/http-control-plane-session.d.ts.map +1 -0
  241. package/dist/internal/http-control-plane-session.js +83 -0
  242. package/dist/internal/legacy-command-guard.d.ts +22 -0
  243. package/dist/internal/legacy-command-guard.d.ts.map +1 -0
  244. package/dist/internal/legacy-command-guard.js +51 -0
  245. package/dist/internal/local-control-plane.d.ts +18 -2
  246. package/dist/internal/local-control-plane.d.ts.map +1 -1
  247. package/dist/internal/local-control-plane.js +199 -17
  248. package/dist/internal/platform-timers.d.ts +7 -0
  249. package/dist/internal/platform-timers.d.ts.map +1 -1
  250. package/dist/internal/platform-timers.js +139 -0
  251. package/dist/internal/reminder-control-plane-protocol.d.ts +189 -0
  252. package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -0
  253. package/dist/internal/reminder-control-plane-protocol.js +251 -0
  254. package/dist/internal/reminder-runner.d.ts +56 -6
  255. package/dist/internal/reminder-runner.d.ts.map +1 -1
  256. package/dist/internal/reminder-runner.js +372 -57
  257. package/dist/internal/reminder-schedule.d.ts +5 -2
  258. package/dist/internal/reminder-schedule.d.ts.map +1 -1
  259. package/dist/internal/reminder-schedule.js +8 -6
  260. package/dist/internal/reminder-store.d.ts +24 -7
  261. package/dist/internal/reminder-store.d.ts.map +1 -1
  262. package/dist/internal/reminder-store.js +6 -5
  263. package/dist/internal/request-error-status.d.ts +2 -0
  264. package/dist/internal/request-error-status.d.ts.map +1 -1
  265. package/dist/internal/request-error-status.js +22 -3
  266. package/dist/internal/resolve-prod-target.d.ts +2 -0
  267. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  268. package/dist/internal/resolve-prod-target.js +13 -0
  269. package/dist/internal/scm/pr-url.d.ts +40 -0
  270. package/dist/internal/scm/pr-url.d.ts.map +1 -1
  271. package/dist/internal/scm/pr-url.js +93 -14
  272. package/dist/internal/sdk-runner.d.ts.map +1 -1
  273. package/dist/internal/sdk-runner.js +4 -3
  274. package/dist/internal/server.d.ts.map +1 -1
  275. package/dist/internal/server.js +118 -77
  276. package/dist/internal/session-engine.d.ts +6 -6
  277. package/dist/internal/session-engine.d.ts.map +1 -1
  278. package/dist/internal/session-engine.js +100 -67
  279. package/dist/playground/assets/{index-BaQzjaNK.js → index-BMDqAeXu.js} +34 -34
  280. package/dist/playground/assets/index-LUgJoWdL.css +1 -0
  281. package/dist/playground/index.html +2 -2
  282. package/dist/reminders.d.ts +24 -5
  283. package/dist/reminders.d.ts.map +1 -1
  284. package/dist/reminders.js +28 -5
  285. package/dist/storage-backends/cursor-hosted.d.ts +6 -0
  286. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  287. package/dist/storage-backends/cursor-hosted.js +29 -1
  288. package/dist/types.d.ts +122 -25
  289. package/dist/types.d.ts.map +1 -1
  290. package/docs/README.md +4 -0
  291. package/docs/deployment.md +7 -2
  292. package/docs/evals.md +3 -2
  293. package/docs/guides/cloud-agents.md +4 -3
  294. package/docs/guides/github.md +2 -1
  295. package/docs/guides/grokbot-agents.md +2 -2
  296. package/docs/guides/improve.md +96 -0
  297. package/docs/guides/opentelemetry.md +3 -4
  298. package/docs/guides/slack.md +2 -1
  299. package/docs/reference/agent-config.md +5 -2
  300. package/docs/reference/channels.md +11 -19
  301. package/docs/reference/cli.md +23 -13
  302. package/docs/reference/connections.md +2 -1
  303. package/docs/reference/extensions.md +2 -0
  304. package/docs/scaffolding-agents.md +2 -1
  305. package/docs/troubleshooting.md +1 -1
  306. package/package.json +10 -3
  307. package/skills/create-agent/SKILL.md +1 -1
  308. package/skills/debug/SKILL.md +1 -1
  309. package/skills/evals/SKILL.md +1 -1
  310. package/skills/framework-map/SKILL.md +4 -2
  311. package/skills/github/SKILL.md +1 -1
  312. package/skills/otel/SKILL.md +3 -3
  313. package/src/bin/agent-serve.ts +28 -11
  314. package/src/channels/bitbucket/types.ts +2 -4
  315. package/src/channels/deployments/types.ts +5 -8
  316. package/src/channels/github/github-channel.ts +8 -8
  317. package/src/channels/github/types.ts +7 -4
  318. package/src/channels/gitlab/types.ts +2 -5
  319. package/src/channels/origin/origin-channel.ts +29 -13
  320. package/src/channels/origin/types.ts +7 -3
  321. package/src/channels/slack/defaults.ts +3 -0
  322. package/src/channels/slack/dispatch.ts +1 -0
  323. package/src/channels/slack/live-delivery.ts +53 -12
  324. package/src/channels/slack/types.ts +4 -3
  325. package/src/channels.ts +157 -10
  326. package/src/connections.ts +2 -1
  327. package/src/extensions/improve/extension.ts +70 -0
  328. package/src/extensions/improve/skills/yourself.ts +50 -0
  329. package/src/index.ts +6 -3
  330. package/src/internal/builtin-tools/artifacts.ts +2 -3
  331. package/src/internal/channel-route-dispatch.ts +66 -0
  332. package/src/internal/channel-state.ts +96 -0
  333. package/src/internal/cli-ax.ts +110 -1
  334. package/src/internal/cli-cursor.ts +4 -1
  335. package/src/internal/cli-deploy.ts +80 -22
  336. package/src/internal/cli-mcp-oauth.ts +18 -0
  337. package/src/internal/cli-mcp.ts +11 -0
  338. package/src/internal/cli-slack.ts +15 -2
  339. package/src/internal/cursor/backend-client.ts +90 -2
  340. package/src/internal/cursor/credentials.ts +35 -7
  341. package/src/internal/deploy-client.ts +70 -0
  342. package/src/internal/deploy-manifest.ts +131 -12
  343. package/src/internal/describe-error.ts +28 -0
  344. package/src/internal/discovery/agent.ts +1 -0
  345. package/src/internal/discovery/info.ts +6 -0
  346. package/src/internal/discovery/modules.ts +2 -4
  347. package/src/internal/discovery/project.ts +3 -0
  348. package/src/internal/discovery/reminders.ts +65 -0
  349. package/src/internal/discovery/subagent.ts +1 -0
  350. package/src/internal/distribution.ts +20 -0
  351. package/src/internal/framework-storage-selection.ts +43 -6
  352. package/src/internal/guest-network.ts +46 -29
  353. package/src/internal/hosted-admission-adapter.ts +2 -0
  354. package/src/internal/hosted-catch-protocol.ts +130 -0
  355. package/src/internal/hosted-catch.ts +192 -0
  356. package/src/internal/hosted-delivery-protocol.ts +483 -0
  357. package/src/internal/hosted-delivery.ts +303 -43
  358. package/src/internal/hosted-execution-diag.ts +21 -3
  359. package/src/internal/hosted-execution-flush.ts +6 -3
  360. package/src/internal/http-control-plane-session.ts +104 -0
  361. package/src/internal/legacy-command-guard.ts +59 -0
  362. package/src/internal/local-control-plane.ts +281 -22
  363. package/src/internal/platform-timers.ts +191 -0
  364. package/src/internal/reminder-control-plane-protocol.ts +512 -0
  365. package/src/internal/reminder-runner.ts +481 -57
  366. package/src/internal/reminder-schedule.ts +11 -6
  367. package/src/internal/reminder-store.ts +27 -7
  368. package/src/internal/request-error-status.ts +27 -3
  369. package/src/internal/resolve-prod-target.ts +15 -0
  370. package/src/internal/scm/pr-url.ts +167 -20
  371. package/src/internal/sdk-runner.ts +2 -1
  372. package/src/internal/server.ts +151 -88
  373. package/src/internal/session-engine.ts +146 -83
  374. package/src/reminders.ts +35 -4
  375. package/src/storage-backends/cursor-hosted.ts +40 -1
  376. package/src/types.ts +134 -26
  377. package/dist/docs/assets/chunks/@localSearchIndexroot.CJxMklAy.js +0 -1
  378. package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +0 -9
  379. package/dist/docs/assets/index.md.BW_6tOgR.js +0 -5
  380. package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +0 -1
  381. package/dist/docs/assets/troubleshooting.md.Cus_YZga.js +0 -1
  382. package/dist/playground/assets/index-CceqnLTX.css +0 -1
  383. /package/dist/docs/assets/{evals.md.CbMoebP1.lean.js → evals.md.C1ekS3k2.lean.js} +0 -0
  384. /package/dist/docs/assets/{guides_github.md.c0gdGJ-D.lean.js → guides_github.md.BH33UEBJ.lean.js} +0 -0
  385. /package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.lean.js → guides_grokbot-agents.md.DyV-WArv.lean.js} +0 -0
  386. /package/dist/docs/assets/{index.md.BW_6tOgR.lean.js → index.md.BjH1w2ZW.lean.js} +0 -0
  387. /package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.lean.js → reference_agent-config.md.CvoL6pof.lean.js} +0 -0
  388. /package/dist/docs/assets/{reference_connections.md.Di6jJAXF.lean.js → reference_connections.md.BojkC6c5.lean.js} +0 -0
  389. /package/dist/docs/assets/{reference_extensions.md.CGmMLblt.lean.js → reference_extensions.md.CPWt00ds.lean.js} +0 -0
  390. /package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.lean.js → scaffolding-agents.md.Kctn3OVb.lean.js} +0 -0
  391. /package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.lean.js → skills_create-agent.md.Q3h6Je-e.lean.js} +0 -0
  392. /package/dist/docs/assets/{skills_evals.md.723kpUmA.lean.js → skills_evals.md.BhovOvrl.lean.js} +0 -0
  393. /package/dist/docs/assets/{skills_github.md.D0JahM8c.lean.js → skills_github.md.hgFX_oKY.lean.js} +0 -0
  394. /package/dist/docs/assets/{skills_otel.md.CqhobH3B.lean.js → skills_otel.md.B5Ddv1xH.lean.js} +0 -0
  395. /package/dist/docs/assets/{troubleshooting.md.Cus_YZga.lean.js → troubleshooting.md.CYEAO9bM.lean.js} +0 -0
@@ -11,16 +11,17 @@ import { randomBytes } from "node:crypto";
11
11
  import { dispatchOutcome } from "./channel-dispatch.js";
12
12
  import { consumeHostedBoundSecrets, } from "./cursor/hosted-bound-secrets.js";
13
13
  import { createDeferredChannelSession, DeferredChannelSessionError, } from "./deferred-channel-session.js";
14
- import { formatGuestNetworkServerTiming, GUEST_CONNECT_STALLED, GUEST_NETWORK_UNAVAILABLE, GuestNetworkUnavailableError, isQuietGuestConnectStallMessage, waitForGuestNetworkReady, } from "./guest-network.js";
14
+ import { formatGuestNetworkServerTiming, GUEST_CONNECT_STALLED, GUEST_NETWORK_UNAVAILABLE, GuestNetworkUnavailableError, waitForGuestNetworkReady, } from "./guest-network.js";
15
15
  import { getHostedAdmissionAdapter, } from "./hosted-admission-adapter.js";
16
16
  import { HostedAdmissionLocalSendError, runDuringHostedAdmission, } from "./hosted-admission-context.js";
17
- import { HOSTED_ADMISSION_PATH, HOSTED_DELIVERY_HEADER, HOSTED_DELIVERY_PROTOCOL_VERSION, HOSTED_EXECUTION_PATH, parseHostedAdmission, parseHostedExecution, } from "./hosted-delivery-protocol.js";
17
+ import { HOSTED_ADMISSION_PATH, HOSTED_DELIVERY_HEADER, HOSTED_DELIVERY_PROTOCOL_VERSION, HOSTED_EXECUTION_PATH, HOSTED_GUEST_RETRY_TERMINAL, HOSTED_GUEST_RETRY_TRANSIENT, hostedFailureClassification, hostedGuestErrorResponse, isHostedReminderAdmission, parseHostedAdmission, parseHostedExecution, parseHostedReminderFireDescriptorPayload, parseHostedReminderFirePayload, } from "./hosted-delivery-protocol.js";
18
18
  import { abortReasonFromTurnStatus, HOSTED_EXECUTION_DIAG_RUNNING_STATUS, hostedExecutionDiagId, } from "./hosted-execution-diag.js";
19
19
  import { flushHostedExecutionRecord, } from "./hosted-execution-flush.js";
20
20
  import { recordHostedManagedAutomation } from "./hosted-managed-automation.js";
21
- import { errorResponse, readJsonObject } from "./http-channel.js";
21
+ import { readJsonObject } from "./http-channel.js";
22
22
  import { endActiveHttpSpan } from "./otel/http.js";
23
- import { statusForThrownRequestError } from "./request-error-status.js";
23
+ import { ReminderValidationError, UnknownReminderError, } from "./reminder-runner.js";
24
+ import { mapThrownRequestError, statusForThrownRequestError, } from "./request-error-status.js";
24
25
  /**
25
26
  * A second `send()` in one delivery is a deterministic authored bug — the
26
27
  * wire protocol carries exactly one pending send per delivery — so it must
@@ -44,6 +45,22 @@ function boundedMessage(text) {
44
45
  ? `${text.slice(0, MAX_ERROR_MESSAGE_LENGTH)}…`
45
46
  : text;
46
47
  }
48
+ function terminalHostedError(status, error, message) {
49
+ return hostedGuestErrorResponse({
50
+ status,
51
+ error,
52
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
53
+ message,
54
+ });
55
+ }
56
+ function transientHostedError(status, error, message) {
57
+ return hostedGuestErrorResponse({
58
+ status,
59
+ error,
60
+ retry: HOSTED_GUEST_RETRY_TRANSIENT,
61
+ message,
62
+ });
63
+ }
47
64
  /**
48
65
  * Classify deterministic authored protocol violations as non-retryable 422
49
66
  * admissions. Anything else returns `undefined` so callers fall through to
@@ -61,7 +78,31 @@ function nonRetryableRejection(error) {
61
78
  return undefined;
62
79
  }
63
80
  return {
64
- response: errorResponse(422, code, boundedMessage(error.message)),
81
+ response: terminalHostedError(422, code, boundedMessage(error.message)),
82
+ };
83
+ }
84
+ /**
85
+ * Prefer the shared throw → HTTP mapper (guest network / connect stall /
86
+ * session busy / …) before collapsing into agent_admission_threw or
87
+ * background_dispatch_failed. Those agent codes otherwise hide typed
88
+ * transient failures that the outer handleRequest boundary never sees.
89
+ */
90
+ function mappedAdmissionFailure(error) {
91
+ const rejected = nonRetryableRejection(error);
92
+ if (rejected !== undefined) {
93
+ return rejected;
94
+ }
95
+ const mapped = mapThrownRequestError(error);
96
+ if (mapped === undefined) {
97
+ return undefined;
98
+ }
99
+ return {
100
+ response: hostedGuestErrorResponse({
101
+ status: mapped.status,
102
+ error: mapped.code,
103
+ retry: mapped.retry,
104
+ message: boundedMessage(mapped.message),
105
+ }),
65
106
  };
66
107
  }
67
108
  /**
@@ -79,7 +120,7 @@ export function dispatchHostedAdmission(input) {
79
120
  const adapter = getHostedAdmissionAdapter(input.definition);
80
121
  if (adapter === undefined || adapter.kind !== input.delivery.channelKind) {
81
122
  return {
82
- response: Response.json({ ok: false, error: "channel_kind_mismatch" }, { status: 422 }),
123
+ response: terminalHostedError(422, "channel_kind_mismatch"),
83
124
  };
84
125
  }
85
126
  // The admission window marker follows the async graph into task bodies so
@@ -87,6 +128,66 @@ export function dispatchHostedAdmission(input) {
87
128
  return runDuringHostedAdmission(() => runAdmission(input, adapter));
88
129
  });
89
130
  }
131
+ /**
132
+ * Reserved reminder admission: parse the compact payload and invoke
133
+ * ReminderRunner.dispatch. Returns a standard hosted outcome (`task` /
134
+ * `skip`) and never opens the send-capture / model-session path here —
135
+ * prompt-form fires still follow up inside the runner.
136
+ */
137
+ function dispatchHostedReminderAdmission(input, delivery) {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ const descriptor = parseHostedReminderFireDescriptorPayload(delivery.payload);
140
+ if (descriptor !== undefined) {
141
+ if (input.executeReminderDescriptor === undefined) {
142
+ return transientHostedError(503, "reminder_dispatch_unavailable", "This guest has no reminder CP executor wired for hosted admission.");
143
+ }
144
+ try {
145
+ const result = yield input.executeReminderDescriptor(descriptor);
146
+ const outcome = result.outcome === "noop" ? "skip" : "task";
147
+ return Response.json({
148
+ ok: true,
149
+ v: HOSTED_DELIVERY_PROTOCOL_VERSION,
150
+ outcome,
151
+ });
152
+ }
153
+ catch (error) {
154
+ if (error instanceof UnknownReminderError) {
155
+ return terminalHostedError(404, "unknown_reminder", boundedMessage(error.message));
156
+ }
157
+ if (error instanceof ReminderValidationError) {
158
+ return terminalHostedError(400, "invalid_reminder", boundedMessage(error.message));
159
+ }
160
+ // Transient CP apply/fetch failures must remain retryable.
161
+ throw error;
162
+ }
163
+ }
164
+ if (input.fireReminder === undefined) {
165
+ return transientHostedError(503, "reminder_dispatch_unavailable", "This guest has no reminder runner wired for hosted admission.");
166
+ }
167
+ const payload = parseHostedReminderFirePayload(delivery.payload);
168
+ if (payload === undefined) {
169
+ return terminalHostedError(400, "invalid_reminder_payload", "Expected reminder descriptor or legacy payload { reminderId, fireCount }.");
170
+ }
171
+ try {
172
+ const result = yield input.fireReminder(payload.reminderId, payload.fireCount);
173
+ const outcome = result.outcome === "noop" ? "skip" : "task";
174
+ return Response.json({
175
+ ok: true,
176
+ v: HOSTED_DELIVERY_PROTOCOL_VERSION,
177
+ outcome,
178
+ });
179
+ }
180
+ catch (error) {
181
+ if (error instanceof UnknownReminderError) {
182
+ return terminalHostedError(404, "unknown_reminder", boundedMessage(error.message));
183
+ }
184
+ if (error instanceof ReminderValidationError) {
185
+ return terminalHostedError(400, "invalid_reminder", boundedMessage(error.message));
186
+ }
187
+ throw error;
188
+ }
189
+ });
190
+ }
90
191
  function runAdmission(input, adapter) {
91
192
  return __awaiter(this, void 0, void 0, function* () {
92
193
  var _a;
@@ -106,6 +207,7 @@ function runAdmission(input, adapter) {
106
207
  let dispatched;
107
208
  try {
108
209
  dispatched = yield adapter.dispatch({
210
+ channelId: input.delivery.channelId,
109
211
  eventType: input.delivery.eventType,
110
212
  payload: input.delivery.payload,
111
213
  deliveryId: input.delivery.deliveryId,
@@ -113,27 +215,29 @@ function runAdmission(input, adapter) {
113
215
  });
114
216
  }
115
217
  catch (error) {
116
- const rejected = nonRetryableRejection(error);
117
- if (rejected !== undefined) {
118
- return rejected;
218
+ const mapped = mappedAdmissionFailure(error);
219
+ if (mapped !== undefined) {
220
+ return mapped;
119
221
  }
120
- throw error;
222
+ return {
223
+ response: terminalHostedError(500, "agent_admission_threw", boundedMessage(error instanceof Error ? error.message : String(error))),
224
+ };
121
225
  }
122
226
  if (!dispatched.ok) {
123
227
  return {
124
- response: Response.json({ ok: false, error: "channel_dispatch_failed" }, { status: dispatched.status >= 400 ? dispatched.status : 502 }),
228
+ response: terminalHostedError(dispatched.status >= 400 ? dispatched.status : 502, "channel_dispatch_failed"),
125
229
  };
126
230
  }
127
231
  try {
128
232
  yield Promise.all(background);
129
233
  }
130
234
  catch (error) {
131
- const rejected = nonRetryableRejection(error);
132
- if (rejected !== undefined) {
133
- return rejected;
235
+ const mapped = mappedAdmissionFailure(error);
236
+ if (mapped !== undefined) {
237
+ return mapped;
134
238
  }
135
239
  return {
136
- response: errorResponse(503, "background_dispatch_failed", boundedMessage(error instanceof Error ? error.message : String(error))),
240
+ response: terminalHostedError(503, "background_dispatch_failed", boundedMessage(error instanceof Error ? error.message : String(error))),
137
241
  };
138
242
  }
139
243
  if (captured !== undefined) {
@@ -156,7 +260,7 @@ function runAdmission(input, adapter) {
156
260
  const outcome = dispatchOutcome(dispatched);
157
261
  if (outcome === undefined || outcome === "send") {
158
262
  return {
159
- response: Response.json({ ok: false, error: "channel_outcome_missing" }, { status: 502 }),
263
+ response: terminalHostedError(502, "channel_outcome_missing"),
160
264
  };
161
265
  }
162
266
  return {
@@ -234,7 +338,7 @@ export function registerHostedDeliveryRoute(input) {
234
338
  const consumed = consumeBoundSecrets();
235
339
  return consumed.ok
236
340
  ? undefined
237
- : errorResponse(503, consumed.code, boundedMessage(consumed.message));
341
+ : transientHostedError(503, consumed.code, boundedMessage(consumed.message));
238
342
  };
239
343
  const finishNetworkWait = (phase) => __awaiter(this, void 0, void 0, function* () {
240
344
  try {
@@ -252,7 +356,7 @@ export function registerHostedDeliveryRoute(input) {
252
356
  : "Guest network is not ready for outbound requests.";
253
357
  return {
254
358
  timing,
255
- response: errorResponse(503, GUEST_NETWORK_UNAVAILABLE, boundedMessage(message)),
359
+ response: transientHostedError(503, GUEST_NETWORK_UNAVAILABLE, boundedMessage(message)),
256
360
  };
257
361
  }
258
362
  });
@@ -298,13 +402,21 @@ export function registerHostedDeliveryRoute(input) {
298
402
  ? Object.keys(rawAdmission)
299
403
  : [];
300
404
  console.info(`[agent-sdk] hosted admission rejected: envelope failed to parse keys=${JSON.stringify(rawKeys)} hasManagedAutomation=${String(rawKeys.includes("managedAutomation"))}`);
301
- return finish(errorResponse(400, "invalid_hosted_admission", "Expected a supported Agent SDK hosted-admission envelope."));
405
+ return finish(terminalHostedError(400, "invalid_hosted_admission", "Expected a supported Agent SDK hosted-admission envelope."));
302
406
  }
303
407
  console.info(`[agent-sdk] hosted admission received deliveryId=${delivery.deliveryId} channelId=${delivery.channelId} channelKind=${delivery.channelKind} eventType=${delivery.eventType} sessionMode=${delivery.sessionMode} managedAutomation=${delivery.managedAutomation === undefined ? "<absent>" : `automationUuid=${delivery.managedAutomation.automationUuid} mcpServerNames=${String(delivery.managedAutomation.mcpServerNames.length)} slackChannels=${delivery.managedAutomation.slackChannels === undefined ? "<absent>" : JSON.stringify(delivery.managedAutomation.slackChannels)}`}`);
304
408
  recordHostedManagedAutomation(delivery);
409
+ if (isHostedReminderAdmission(delivery)) {
410
+ const network = yield finishNetworkWait("admission");
411
+ guestNetwork = network.timing;
412
+ if (network.response !== undefined) {
413
+ return finish(network.response);
414
+ }
415
+ return finish(yield dispatchHostedReminderAdmission(input, delivery));
416
+ }
305
417
  const channel = input.channels.find((candidate) => candidate.id === delivery.channelId);
306
418
  if (channel === undefined) {
307
- return finish(errorResponse(404, "channel_not_found", `No channel named "${delivery.channelId}" is mounted.`));
419
+ return finish(terminalHostedError(404, "channel_not_found", `No channel named "${delivery.channelId}" is mounted.`));
308
420
  }
309
421
  const network = yield finishNetworkWait("admission");
310
422
  guestNetwork = network.timing;
@@ -350,16 +462,16 @@ export function registerHostedDeliveryRoute(input) {
350
462
  }
351
463
  const execution = parseHostedExecution(yield readJsonObject(request));
352
464
  if (execution === undefined) {
353
- return finish(errorResponse(400, "invalid_hosted_execution", "Expected a supported Agent SDK hosted-execution envelope."));
465
+ return finish(terminalHostedError(400, "invalid_hosted_execution", "Expected a supported Agent SDK hosted-execution envelope."));
354
466
  }
355
467
  pruneExpired();
356
468
  const admitted = pending.get(execution.admissionToken);
357
469
  if (admitted === undefined) {
358
- return finish(errorResponse(409, "hosted_admission_unavailable", "The hosted admission token is missing or expired."));
470
+ return finish(transientHostedError(409, "hosted_admission_unavailable", "The hosted admission token is missing or expired."));
359
471
  }
360
472
  if (admitted.sessionPublicId !== undefined &&
361
473
  admitted.sessionPublicId !== execution.sessionPublicId) {
362
- return finish(errorResponse(409, "hosted_admission_session_mismatch", "The hosted admission token is already bound to another session."));
474
+ return finish(transientHostedError(409, "hosted_admission_session_mismatch", "The hosted admission token is already bound to another session."));
363
475
  }
364
476
  const network = yield finishNetworkWait("execution");
365
477
  guestNetwork = network.timing;
@@ -381,11 +493,14 @@ export function registerHostedDeliveryRoute(input) {
381
493
  ? {}
382
494
  : { snapshotLogs: input.snapshotLogs }));
383
495
  const writeDiag = (fields) => __awaiter(this, void 0, void 0, function* () {
384
- yield flushHostedExecutionRecord(sinks, Object.assign(Object.assign(Object.assign({ executionId, sessionPublicId: execution.sessionPublicId, sessionId: fields.sessionId, turnStatus: fields.turnStatus, durationMs: Math.max(0, Math.round(performance.now() - startedAt)) }, (fields.message === undefined
496
+ const classification = fields.failureCode === undefined
497
+ ? undefined
498
+ : hostedFailureClassification(fields.failureCode);
499
+ yield flushHostedExecutionRecord(sinks, Object.assign(Object.assign(Object.assign(Object.assign({ executionId, sessionPublicId: execution.sessionPublicId, sessionId: fields.sessionId, turnStatus: fields.turnStatus, durationMs: Math.max(0, Math.round(performance.now() - startedAt)) }, (fields.message === undefined
385
500
  ? {}
386
501
  : { message: fields.message })), (fields.abortReason === undefined
387
502
  ? {}
388
- : { abortReason: fields.abortReason })), (fields.error === undefined ? {} : { error: fields.error })));
503
+ : { abortReason: fields.abortReason })), { failureCode: fields.failureCode, classification }), (fields.error === undefined ? {} : { error: fields.error })));
389
504
  });
390
505
  // Claim the file before the turn runs. The host reads it after its
391
506
  // own POST returns, which for a 9-minute timeout is while this turn
@@ -410,21 +525,24 @@ export function registerHostedDeliveryRoute(input) {
410
525
  // as soon as the POST returns. A leftover SDK handle freezes a
411
526
  // dead Connect/HTTP2 session that the next wake then reuses.
412
527
  evictHostedSdkSessions(input.evictSdkSession, session.id, execution.sessionPublicId);
528
+ const hostedFailure = outcome.status === "finished"
529
+ ? undefined
530
+ : hostedFailureForUnfinishedTurn(outcome);
413
531
  yield writeDiag({
414
532
  sessionId: session.id,
415
533
  turnStatus: outcome.status,
416
534
  message: outcome.errorMessage,
417
- abortReason: abortReasonFromTurnStatus(outcome.status, outcome.errorMessage),
535
+ abortReason: abortReasonFromTurnStatus(outcome.status, outcome.cancellationReason),
536
+ failureCode: hostedFailure === null || hostedFailure === void 0 ? void 0 : hostedFailure.error,
418
537
  });
419
- if (outcome.status !== "finished") {
420
- // waitForCompletion resolves (does not throw) on a quiet
421
- // Connect abort. Map that to guest_connect_stalled so TAS
422
- // retries the same pod. Real runner failures stay turn_failed.
538
+ if (hostedFailure !== undefined) {
423
539
  return {
424
540
  status: 503,
425
541
  body: {
426
542
  ok: false,
427
- error: hostedErrorForUnfinishedTurn(outcome.errorMessage),
543
+ error: hostedFailure.error,
544
+ retry: hostedFailure.retry,
545
+ classification: hostedFailureClassification(hostedFailure.error),
428
546
  turnStatus: outcome.status,
429
547
  message: outcome.errorMessage,
430
548
  },
@@ -446,6 +564,7 @@ export function registerHostedDeliveryRoute(input) {
446
564
  turnStatus: "error",
447
565
  message: error instanceof Error ? error.message : String(error),
448
566
  abortReason: "execute_throw",
567
+ failureCode: "internal_error",
449
568
  error,
450
569
  });
451
570
  throw error;
@@ -470,12 +589,36 @@ function evictHostedSdkSessions(evict, ...ids) {
470
589
  evict(id);
471
590
  }
472
591
  }
473
- function hostedErrorForUnfinishedTurn(errorMessage) {
474
- if (errorMessage !== undefined &&
475
- isQuietGuestConnectStallMessage(errorMessage)) {
476
- return GUEST_CONNECT_STALLED;
592
+ const TRANSIENT_TURN_ERROR_CODES = new Set([
593
+ "ABORT_ERR",
594
+ "UND_ERR_BODY_TIMEOUT",
595
+ "UND_ERR_HEADERS_TIMEOUT",
596
+ "canceled",
597
+ "unavailable",
598
+ "unknown",
599
+ ]);
600
+ function hostedFailureForUnfinishedTurn(outcome) {
601
+ if (outcome.errorCode === "agent_dependency_failed") {
602
+ return {
603
+ error: "agent_dependency_failed",
604
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
605
+ };
606
+ }
607
+ if (outcome.status === "error" &&
608
+ outcome.errorCode !== undefined &&
609
+ TRANSIENT_TURN_ERROR_CODES.has(outcome.errorCode)) {
610
+ return {
611
+ error: GUEST_CONNECT_STALLED,
612
+ retry: HOSTED_GUEST_RETRY_TRANSIENT,
613
+ };
614
+ }
615
+ if (outcome.status === "cancelled") {
616
+ return {
617
+ error: "turn_cancelled",
618
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
619
+ };
477
620
  }
478
- return "turn_failed";
621
+ return { error: "turn_failed", retry: HOSTED_GUEST_RETRY_TERMINAL };
479
622
  }
480
623
  function afterHostedWork(flushOtel, work) {
481
624
  return __awaiter(this, void 0, void 0, function* () {
@@ -3,6 +3,7 @@
3
3
  * session-run document and the `start.log` tee by
4
4
  * `hosted-execution-flush.ts`.
5
5
  */
6
+ import { type HostedFailureClassification } from "./hosted-delivery-protocol.js";
6
7
  export declare const HOSTED_EXECUTION_DIAG_VERSION = 1;
7
8
  /** Cap so a runaway message cannot fill the guest disk or the host log. */
8
9
  export declare const HOSTED_EXECUTION_DIAG_MAX_BYTES = 4096;
@@ -41,6 +42,8 @@ export type HostedExecutionDiag = {
41
42
  signalAborted?: boolean;
42
43
  requestId?: string;
43
44
  abortReason?: HostedExecutionDiagAbortReason;
45
+ failureCode?: string;
46
+ classification?: HostedFailureClassification;
44
47
  };
45
48
  /** Written before the turn starts so a stalled execution still has a record. */
46
49
  export declare const HOSTED_EXECUTION_DIAG_RUNNING_STATUS = "running";
@@ -54,7 +57,7 @@ export declare const HOSTED_ERROR_SNIPPET_MAX_CHARS = 700;
54
57
  */
55
58
  export declare function hostedErrorStackSnippet(error: unknown): string;
56
59
  export declare function hostedExecutionDiagPath(stateRoot: string): string;
57
- export declare function abortReasonFromTurnStatus(status: string, message: string | undefined): HostedExecutionDiagAbortReason | undefined;
60
+ export declare function abortReasonFromTurnStatus(status: string, cancellationReason: "signal" | "runner" | undefined): HostedExecutionDiagAbortReason | undefined;
58
61
  export declare function parseHostedExecutionDiag(raw: string): HostedExecutionDiag | undefined;
59
62
  /**
60
63
  * Overwrite the per-execution diag file. Soft-fail: a write error must not
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-execution-diag.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-execution-diag.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,2EAA2E;AAC3E,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,MAAM,MAAM,8BAA8B,GACtC,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,eAAe,CAAC;AAEpB;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,EAAE,OAAO,6BAA6B,CAAC;IACxC,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,8BAA8B,CAAC;CAC9C,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,oCAAoC,YAAY,CAAC;AAmC9D,iFAAiF;AACjF,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAyB9D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,8BAA8B,GAAG,SAAS,CAU5C;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,GACV,mBAAmB,GAAG,SAAS,CA2EjC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
1
+ {"version":3,"file":"hosted-execution-diag.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-execution-diag.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAEL,KAAK,2BAA2B,EAEjC,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,2EAA2E;AAC3E,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,MAAM,MAAM,8BAA8B,GACtC,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,eAAe,CAAC;AAEpB;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,EAAE,OAAO,6BAA6B,CAAC;IACxC,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,8BAA8B,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,2BAA2B,CAAC;CAC9C,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,oCAAoC,YAAY,CAAC;AAqC9D,iFAAiF;AACjF,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAyB9D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAClD,8BAA8B,GAAG,SAAS,CAU5C;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,GACV,mBAAmB,GAAG,SAAS,CAqFjC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -15,7 +15,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
15
15
  import { createHash, randomBytes } from "node:crypto";
16
16
  import { mkdir, rename, unlink, writeFile } from "node:fs/promises";
17
17
  import { join } from "node:path";
18
- import { HOSTED_EXECUTION_DIAG_FILENAME } from "./hosted-delivery-protocol.js";
18
+ import { HOSTED_EXECUTION_DIAG_FILENAME, parseHostedFailureClassification, } from "./hosted-delivery-protocol.js";
19
19
  export const HOSTED_EXECUTION_DIAG_VERSION = 1;
20
20
  /** Cap so a runaway message cannot fill the guest disk or the host log. */
21
21
  export const HOSTED_EXECUTION_DIAG_MAX_BYTES = 4096;
@@ -49,6 +49,8 @@ const DIAG_KEYS = new Set([
49
49
  "signalAborted",
50
50
  "requestId",
51
51
  "abortReason",
52
+ "failureCode",
53
+ "classification",
52
54
  ]);
53
55
  const ABORT_REASONS = new Set([
54
56
  "signal_abort",
@@ -101,12 +103,12 @@ export function hostedErrorStackSnippet(error) {
101
103
  export function hostedExecutionDiagPath(stateRoot) {
102
104
  return join(stateRoot, HOSTED_EXECUTION_DIAG_FILENAME);
103
105
  }
104
- export function abortReasonFromTurnStatus(status, message) {
106
+ export function abortReasonFromTurnStatus(status, cancellationReason) {
105
107
  if (status === "finished") {
106
108
  return undefined;
107
109
  }
108
110
  if (status === "cancelled") {
109
- return message !== undefined && /abort/i.test(message)
111
+ return cancellationReason === "signal"
110
112
  ? "signal_abort"
111
113
  : "runner_cancelled";
112
114
  }
@@ -153,6 +155,13 @@ export function parseHostedExecutionDiag(raw) {
153
155
  const message = boundedOptionalString(body.message, 1024);
154
156
  const stack = boundedOptionalString(body.stack, HOSTED_ERROR_SNIPPET_MAX_CHARS);
155
157
  const requestId = boundedOptionalString(body.requestId, 128);
158
+ const failureCode = boundedOptionalString(body.failureCode, 64);
159
+ const classification = body.classification === undefined
160
+ ? undefined
161
+ : parseHostedFailureClassification(body.classification);
162
+ if (body.classification !== undefined && classification === undefined) {
163
+ return undefined;
164
+ }
156
165
  const abortReason = body.abortReason === undefined
157
166
  ? undefined
158
167
  : typeof body.abortReason === "string" &&
@@ -166,7 +175,7 @@ export function parseHostedExecutionDiag(raw) {
166
175
  typeof body.signalAborted !== "boolean") {
167
176
  return undefined;
168
177
  }
169
- return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ v: HOSTED_EXECUTION_DIAG_VERSION, executionId: body.executionId, writtenAt: body.writtenAt, sessionPublicId: body.sessionPublicId, sessionId: body.sessionId, turnStatus: body.turnStatus, durationMs: body.durationMs }, (message === undefined ? {} : { message })), (stack === undefined ? {} : { stack })), (body.signalAborted === true ? { signalAborted: true } : {})), (requestId === undefined ? {} : { requestId })), (abortReason === undefined ? {} : { abortReason }));
178
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ v: HOSTED_EXECUTION_DIAG_VERSION, executionId: body.executionId, writtenAt: body.writtenAt, sessionPublicId: body.sessionPublicId, sessionId: body.sessionId, turnStatus: body.turnStatus, durationMs: body.durationMs }, (message === undefined ? {} : { message })), (stack === undefined ? {} : { stack })), (body.signalAborted === true ? { signalAborted: true } : {})), (requestId === undefined ? {} : { requestId })), (abortReason === undefined ? {} : { abortReason })), (failureCode === undefined ? {} : { failureCode })), (classification === undefined ? {} : { classification }));
170
179
  }
171
180
  /**
172
181
  * Overwrite the per-execution diag file. Soft-fail: a write error must not
@@ -8,6 +8,7 @@
8
8
  * durable document and re-snapshots the tee; the local json stays `running`
9
9
  * so TAS does not treat a previous delivery's terminal record as this one.
10
10
  */
11
+ import type { HostedFailureClassification } from "./hosted-delivery-protocol.js";
11
12
  import { type HostedExecutionDiagAbortReason } from "./hosted-execution-diag.js";
12
13
  import type { LogRingEntry } from "./log-ring.js";
13
14
  import { type SessionRunAbortReason, type SessionRunExecutionWrite } from "./session-run-log.js";
@@ -26,6 +27,8 @@ export type HostedExecutionFlushFields = {
26
27
  durationMs: number;
27
28
  message?: string;
28
29
  abortReason?: HostedExecutionDiagAbortReason;
30
+ failureCode?: string;
31
+ classification?: HostedFailureClassification;
29
32
  error?: unknown;
30
33
  };
31
34
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-execution-flush.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-execution-flush.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,KAAK,8BAA8B,EAGpC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAG9B,MAAM,sBAAsB,CAAC;AAU9B,MAAM,MAAM,yBAAyB,GAAG;IACtC,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,aAAa,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,YAAY,CAAC,IAAI,YAAY,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,8BAA8B,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,yBAAyB,EAChC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CAAC,IAAI,EAAE;IAC3D,iBAAiB,EAAE,CACjB,MAAM,EAAE,OAAO,CACb,qBAAqB,EACrB,cAAc,GAAG,oBAAoB,GAAG,qBAAqB,CAC9D,EACD,KAAK,CAAC,EAAE,OAAO,KACZ,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CACb,qBAAqB,EACrB,cAAc,GAAG,oBAAoB,GAAG,qBAAqB,CAC9D,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB"}
1
+ {"version":3,"file":"hosted-execution-flush.d.ts","sourceRoot":"","sources":["../../src/internal/hosted-execution-flush.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EACL,KAAK,8BAA8B,EAGpC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAG9B,MAAM,sBAAsB,CAAC;AAU9B,MAAM,MAAM,yBAAyB,GAAG;IACtC,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,aAAa,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,YAAY,CAAC,IAAI,YAAY,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,8BAA8B,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,2BAA2B,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,yBAAyB,EAChC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CAAC,IAAI,EAAE;IAC3D,iBAAiB,EAAE,CACjB,MAAM,EAAE,OAAO,CACb,qBAAqB,EACrB,cAAc,GAAG,oBAAoB,GAAG,qBAAqB,CAC9D,EACD,KAAK,CAAC,EAAE,OAAO,KACZ,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CACb,qBAAqB,EACrB,cAAc,GAAG,oBAAoB,GAAG,qBAAqB,CAC9D,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB"}
@@ -39,11 +39,9 @@ export function flushHostedExecutionRecord(sinks, fields) {
39
39
  ? undefined
40
40
  : hostedErrorStackSnippet(fields.error);
41
41
  if (sinks.stateRoot !== undefined) {
42
- yield writeHostedExecutionDiag(sinks.stateRoot, Object.assign(Object.assign(Object.assign(Object.assign({ v: 1, executionId: fields.executionId, writtenAt, sessionPublicId: fields.sessionPublicId, sessionId: fields.sessionId, turnStatus: fields.turnStatus, durationMs: fields.durationMs }, (message === undefined ? {} : { message })), (stack === undefined || stack.length === 0 ? {} : { stack })), (message !== undefined && /abort/i.test(message)
43
- ? { signalAborted: true }
44
- : {})), (fields.abortReason === undefined
42
+ yield writeHostedExecutionDiag(sinks.stateRoot, Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ v: 1, executionId: fields.executionId, writtenAt, sessionPublicId: fields.sessionPublicId, sessionId: fields.sessionId, turnStatus: fields.turnStatus, durationMs: fields.durationMs }, (message === undefined ? {} : { message })), (stack === undefined || stack.length === 0 ? {} : { stack })), { signalAborted: fields.abortReason === "signal_abort" ? true : undefined }), (fields.abortReason === undefined
45
43
  ? {}
46
- : { abortReason: fields.abortReason })));
44
+ : { abortReason: fields.abortReason })), { failureCode: fields.failureCode, classification: fields.classification }));
47
45
  }
48
46
  if (sinks.persistSessionRun !== undefined) {
49
47
  const error = fields.error === undefined
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Built-in HTTP channel admission for control-plane session starts.
3
+ *
4
+ * `agent-sdk run --prod` reaches the authenticated CP start route, which
5
+ * delivers `agentsdk.session` to the built-in `http` channel of every v2
6
+ * agent. The wake is `send(message, { dryRun, asOf })`; the session id, when
7
+ * the caller resumed an explicit `ses_…`, arrives through the hosted
8
+ * execution (never through this payload), so authored code cannot pick one.
9
+ */
10
+ import type { ChannelHandlerArgs, HttpChannelDefinition } from "../types.js";
11
+ export type ControlPlaneSessionPayload = {
12
+ message: string;
13
+ dryRun?: boolean | undefined;
14
+ asOf?: string | undefined;
15
+ };
16
+ export declare function parseControlPlaneSessionPayload(payload: unknown): {
17
+ ok: true;
18
+ data: ControlPlaneSessionPayload;
19
+ } | {
20
+ ok: false;
21
+ error: string;
22
+ };
23
+ export declare function dispatchHttpControlPlaneSession(input: {
24
+ eventType: string;
25
+ payload: unknown;
26
+ args: ChannelHandlerArgs;
27
+ onMessage?: HttpChannelDefinition["onMessage"];
28
+ }): Promise<Response>;
29
+ export declare function attachHttpControlPlaneAdmission(definition: HttpChannelDefinition): void;
30
+ //# sourceMappingURL=http-control-plane-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-control-plane-session.d.ts","sourceRoot":"","sources":["../../src/internal/http-control-plane-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAQ7E,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AASF,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,OAAO,GAEd;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,0BAA0B,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6B/B;AAED,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;CAChD,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBpB;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,qBAAqB,GAChC,IAAI,CAWN"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Built-in HTTP channel admission for control-plane session starts.
3
+ *
4
+ * `agent-sdk run --prod` reaches the authenticated CP start route, which
5
+ * delivers `agentsdk.session` to the built-in `http` channel of every v2
6
+ * agent. The wake is `send(message, { dryRun, asOf })`; the session id, when
7
+ * the caller resumed an explicit `ses_…`, arrives through the hosted
8
+ * execution (never through this payload), so authored code cannot pick one.
9
+ */
10
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
11
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
12
+ return new (P || (P = Promise))(function (resolve, reject) {
13
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
14
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
15
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
16
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
17
+ });
18
+ };
19
+ import { skipped, turnStarted } from "./channel-dispatch.js";
20
+ import { attachHostedAdmissionAdapter } from "./hosted-admission-adapter.js";
21
+ import { AGENT_SDK_HTTP_CHANNEL_KIND, AGENT_SDK_SESSION_EVENT_TYPE, } from "./hosted-catch-protocol.js";
22
+ const PAYLOAD_KEYS = new Set(["message", "dryRun", "asOf"]);
23
+ const MAX_MESSAGE_CHARS = 64 * 1024;
24
+ function isRecord(value) {
25
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26
+ }
27
+ export function parseControlPlaneSessionPayload(payload) {
28
+ if (!isRecord(payload)) {
29
+ return { ok: false, error: "payload must be an object" };
30
+ }
31
+ if (Object.keys(payload).some((key) => !PAYLOAD_KEYS.has(key))) {
32
+ return { ok: false, error: "payload carries an unsupported field" };
33
+ }
34
+ const message = typeof payload.message === "string" ? payload.message.trim() : "";
35
+ if (message.length === 0 || message.length > MAX_MESSAGE_CHARS) {
36
+ return { ok: false, error: "payload.message is required" };
37
+ }
38
+ if (payload.dryRun !== undefined && typeof payload.dryRun !== "boolean") {
39
+ return { ok: false, error: "payload.dryRun must be a boolean" };
40
+ }
41
+ if (payload.asOf !== undefined &&
42
+ (typeof payload.asOf !== "string" || payload.asOf.trim().length === 0)) {
43
+ return { ok: false, error: "payload.asOf must be a non-empty string" };
44
+ }
45
+ return {
46
+ ok: true,
47
+ data: {
48
+ message,
49
+ dryRun: payload.dryRun === true ? true : undefined,
50
+ asOf: typeof payload.asOf === "string" ? payload.asOf.trim() : undefined,
51
+ },
52
+ };
53
+ }
54
+ export function dispatchHttpControlPlaneSession(input) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ if (input.eventType !== AGENT_SDK_SESSION_EVENT_TYPE) {
57
+ return skipped("not a control-plane session");
58
+ }
59
+ const parsed = parseControlPlaneSessionPayload(input.payload);
60
+ if (!parsed.ok) {
61
+ return Response.json({ ok: false, error: parsed.error }, { status: 400 });
62
+ }
63
+ const message = input.onMessage === undefined
64
+ ? parsed.data.message
65
+ : yield input.onMessage(parsed.data.message, { auth: null });
66
+ const session = yield input.args.send(message, {
67
+ dryRun: parsed.data.dryRun,
68
+ asOf: parsed.data.asOf,
69
+ });
70
+ return turnStarted(session);
71
+ });
72
+ }
73
+ export function attachHttpControlPlaneAdmission(definition) {
74
+ attachHostedAdmissionAdapter(definition, {
75
+ kind: AGENT_SDK_HTTP_CHANNEL_KIND,
76
+ dispatch: ({ eventType, payload, args }) => dispatchHttpControlPlaneSession({
77
+ eventType,
78
+ payload,
79
+ args,
80
+ onMessage: definition.onMessage,
81
+ }),
82
+ });
83
+ }
@@ -0,0 +1,22 @@
1
+ import { type AgentServeDeployClient, DeployApiError } from "./deploy-client.js";
2
+ /**
3
+ * Classify a hosted slug by probing the v2 control plane.
4
+ *
5
+ * Only HTTP 404 means “not v2.” Auth, 5xx, and transport errors fail closed
6
+ * so a v2 slug cannot fall through to `/internal/agent-serve`. That probe
7
+ * shares the factory microlith path used by secrets; a factory outage will
8
+ * also block legacy `--prod` until it recovers.
9
+ */
10
+ export declare function deploymentArchitecture(args: {
11
+ client: AgentServeDeployClient;
12
+ teamId: number;
13
+ slug: string;
14
+ }): Promise<"v1" | "v2">;
15
+ export declare function unsupportedV2LegacyCommandError(slug: string): DeployApiError;
16
+ export declare function isUnsupportedV2LegacyCommandError(error: unknown): error is DeployApiError;
17
+ export declare function rejectV2ForLegacyCommand(args: {
18
+ client: AgentServeDeployClient;
19
+ teamId: number;
20
+ slug: string;
21
+ }): Promise<void>;
22
+ //# sourceMappingURL=legacy-command-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-command-guard.d.ts","sourceRoot":"","sources":["../../src/internal/legacy-command-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAavB;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAK5E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,cAAc,CAMzB;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB"}