@cursor/july 0.1.1

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 (623) hide show
  1. package/AGENTS.md +290 -0
  2. package/LICENSE.md +3 -0
  3. package/README.md +1233 -0
  4. package/dist/ab.d.ts +290 -0
  5. package/dist/ab.d.ts.map +1 -0
  6. package/dist/ab.js +386 -0
  7. package/dist/bin/agent-serve.d.ts +15 -0
  8. package/dist/bin/agent-serve.d.ts.map +1 -0
  9. package/dist/bin/agent-serve.js +754 -0
  10. package/dist/channels/github/api.d.ts +101 -0
  11. package/dist/channels/github/api.d.ts.map +1 -0
  12. package/dist/channels/github/api.js +229 -0
  13. package/dist/channels/github/auth.d.ts +67 -0
  14. package/dist/channels/github/auth.d.ts.map +1 -0
  15. package/dist/channels/github/auth.js +239 -0
  16. package/dist/channels/github/binding.d.ts +73 -0
  17. package/dist/channels/github/binding.d.ts.map +1 -0
  18. package/dist/channels/github/binding.js +114 -0
  19. package/dist/channels/github/defaults.d.ts +24 -0
  20. package/dist/channels/github/defaults.d.ts.map +1 -0
  21. package/dist/channels/github/defaults.js +100 -0
  22. package/dist/channels/github/events.d.ts +18 -0
  23. package/dist/channels/github/events.d.ts.map +1 -0
  24. package/dist/channels/github/events.js +59 -0
  25. package/dist/channels/github/forward.d.ts +137 -0
  26. package/dist/channels/github/forward.d.ts.map +1 -0
  27. package/dist/channels/github/forward.js +271 -0
  28. package/dist/channels/github/github-channel.d.ts +127 -0
  29. package/dist/channels/github/github-channel.d.ts.map +1 -0
  30. package/dist/channels/github/github-channel.js +1688 -0
  31. package/dist/channels/github/index.d.ts +52 -0
  32. package/dist/channels/github/index.d.ts.map +1 -0
  33. package/dist/channels/github/index.js +51 -0
  34. package/dist/channels/github/replay.d.ts +115 -0
  35. package/dist/channels/github/replay.d.ts.map +1 -0
  36. package/dist/channels/github/replay.js +282 -0
  37. package/dist/channels/github/state.d.ts +26 -0
  38. package/dist/channels/github/state.d.ts.map +1 -0
  39. package/dist/channels/github/state.js +50 -0
  40. package/dist/channels/github/types.d.ts +385 -0
  41. package/dist/channels/github/types.d.ts.map +1 -0
  42. package/dist/channels/github/types.js +1 -0
  43. package/dist/channels/slack/api.d.ts +117 -0
  44. package/dist/channels/slack/api.d.ts.map +1 -0
  45. package/dist/channels/slack/api.js +437 -0
  46. package/dist/channels/slack/approvals.d.ts +32 -0
  47. package/dist/channels/slack/approvals.d.ts.map +1 -0
  48. package/dist/channels/slack/approvals.js +157 -0
  49. package/dist/channels/slack/assistant.d.ts +23 -0
  50. package/dist/channels/slack/assistant.d.ts.map +1 -0
  51. package/dist/channels/slack/assistant.js +67 -0
  52. package/dist/channels/slack/auth.d.ts +40 -0
  53. package/dist/channels/slack/auth.d.ts.map +1 -0
  54. package/dist/channels/slack/auth.js +71 -0
  55. package/dist/channels/slack/channel-watch.d.ts +46 -0
  56. package/dist/channels/slack/channel-watch.d.ts.map +1 -0
  57. package/dist/channels/slack/channel-watch.js +180 -0
  58. package/dist/channels/slack/constants.d.ts +17 -0
  59. package/dist/channels/slack/constants.d.ts.map +1 -0
  60. package/dist/channels/slack/constants.js +27 -0
  61. package/dist/channels/slack/credentials.d.ts +35 -0
  62. package/dist/channels/slack/credentials.d.ts.map +1 -0
  63. package/dist/channels/slack/credentials.js +88 -0
  64. package/dist/channels/slack/cursor-account.d.ts +76 -0
  65. package/dist/channels/slack/cursor-account.d.ts.map +1 -0
  66. package/dist/channels/slack/cursor-account.js +88 -0
  67. package/dist/channels/slack/defaults.d.ts +32 -0
  68. package/dist/channels/slack/defaults.d.ts.map +1 -0
  69. package/dist/channels/slack/defaults.js +380 -0
  70. package/dist/channels/slack/dispatch.d.ts +43 -0
  71. package/dist/channels/slack/dispatch.d.ts.map +1 -0
  72. package/dist/channels/slack/dispatch.js +185 -0
  73. package/dist/channels/slack/doctor.d.ts +24 -0
  74. package/dist/channels/slack/doctor.d.ts.map +1 -0
  75. package/dist/channels/slack/doctor.js +115 -0
  76. package/dist/channels/slack/event-id-dedupe.d.ts +10 -0
  77. package/dist/channels/slack/event-id-dedupe.d.ts.map +1 -0
  78. package/dist/channels/slack/event-id-dedupe.js +23 -0
  79. package/dist/channels/slack/inbound.d.ts +41 -0
  80. package/dist/channels/slack/inbound.d.ts.map +1 -0
  81. package/dist/channels/slack/inbound.js +166 -0
  82. package/dist/channels/slack/index.d.ts +45 -0
  83. package/dist/channels/slack/index.d.ts.map +1 -0
  84. package/dist/channels/slack/index.js +44 -0
  85. package/dist/channels/slack/init.d.ts +32 -0
  86. package/dist/channels/slack/init.d.ts.map +1 -0
  87. package/dist/channels/slack/init.js +82 -0
  88. package/dist/channels/slack/interactive.d.ts +19 -0
  89. package/dist/channels/slack/interactive.d.ts.map +1 -0
  90. package/dist/channels/slack/interactive.js +142 -0
  91. package/dist/channels/slack/links.d.ts +10 -0
  92. package/dist/channels/slack/links.d.ts.map +1 -0
  93. package/dist/channels/slack/links.js +19 -0
  94. package/dist/channels/slack/live-delivery.d.ts +75 -0
  95. package/dist/channels/slack/live-delivery.d.ts.map +1 -0
  96. package/dist/channels/slack/live-delivery.js +143 -0
  97. package/dist/channels/slack/log.d.ts +25 -0
  98. package/dist/channels/slack/log.d.ts.map +1 -0
  99. package/dist/channels/slack/log.js +47 -0
  100. package/dist/channels/slack/manifest.d.ts +57 -0
  101. package/dist/channels/slack/manifest.d.ts.map +1 -0
  102. package/dist/channels/slack/manifest.js +110 -0
  103. package/dist/channels/slack/pr-ref.d.ts +18 -0
  104. package/dist/channels/slack/pr-ref.d.ts.map +1 -0
  105. package/dist/channels/slack/pr-ref.js +36 -0
  106. package/dist/channels/slack/setup.d.ts +14 -0
  107. package/dist/channels/slack/setup.d.ts.map +1 -0
  108. package/dist/channels/slack/setup.js +86 -0
  109. package/dist/channels/slack/slack-channel.d.ts +15 -0
  110. package/dist/channels/slack/slack-channel.d.ts.map +1 -0
  111. package/dist/channels/slack/slack-channel.js +281 -0
  112. package/dist/channels/slack/socket-mode.d.ts +26 -0
  113. package/dist/channels/slack/socket-mode.d.ts.map +1 -0
  114. package/dist/channels/slack/socket-mode.js +116 -0
  115. package/dist/channels/slack/stream.d.ts +26 -0
  116. package/dist/channels/slack/stream.d.ts.map +1 -0
  117. package/dist/channels/slack/stream.js +39 -0
  118. package/dist/channels/slack/tool-approval-events.d.ts +33 -0
  119. package/dist/channels/slack/tool-approval-events.d.ts.map +1 -0
  120. package/dist/channels/slack/tool-approval-events.js +129 -0
  121. package/dist/channels/slack/types.d.ts +326 -0
  122. package/dist/channels/slack/types.d.ts.map +1 -0
  123. package/dist/channels/slack/types.js +4 -0
  124. package/dist/channels.d.ts +116 -0
  125. package/dist/channels.d.ts.map +1 -0
  126. package/dist/channels.js +294 -0
  127. package/dist/connections.d.ts +75 -0
  128. package/dist/connections.d.ts.map +1 -0
  129. package/dist/connections.js +75 -0
  130. package/dist/docs/404.html +22 -0
  131. package/dist/docs/ab.html +87 -0
  132. package/dist/docs/assets/ab.md.COdXkces.js +63 -0
  133. package/dist/docs/assets/ab.md.COdXkces.lean.js +1 -0
  134. package/dist/docs/assets/app.DqfFEmJd.js +1 -0
  135. package/dist/docs/assets/building-with-agents.md.CJCtZCyi.js +13 -0
  136. package/dist/docs/assets/building-with-agents.md.CJCtZCyi.lean.js +1 -0
  137. package/dist/docs/assets/chunks/@localSearchIndexroot.CcVk1uKq.js +1 -0
  138. package/dist/docs/assets/chunks/VPLocalSearchBox.BaLEdS15.js +9 -0
  139. package/dist/docs/assets/chunks/framework.CAZyNGu9.js +19 -0
  140. package/dist/docs/assets/chunks/theme.CZRvu_0q.js +2 -0
  141. package/dist/docs/assets/concepts.md.Cfb9b-k1.js +4 -0
  142. package/dist/docs/assets/concepts.md.Cfb9b-k1.lean.js +1 -0
  143. package/dist/docs/assets/deployment.md.Dx1TYNk5.js +14 -0
  144. package/dist/docs/assets/deployment.md.Dx1TYNk5.lean.js +1 -0
  145. package/dist/docs/assets/evals.md.DPZ_MAnI.js +85 -0
  146. package/dist/docs/assets/evals.md.DPZ_MAnI.lean.js +1 -0
  147. package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.js +10 -0
  148. package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.lean.js +1 -0
  149. package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.js +9 -0
  150. package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.lean.js +1 -0
  151. package/dist/docs/assets/guides_github.md.DwbKhCeS.js +20 -0
  152. package/dist/docs/assets/guides_github.md.DwbKhCeS.lean.js +1 -0
  153. package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.js +28 -0
  154. package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.lean.js +1 -0
  155. package/dist/docs/assets/guides_slack.md.bv41fHfW.js +37 -0
  156. package/dist/docs/assets/guides_slack.md.bv41fHfW.lean.js +1 -0
  157. package/dist/docs/assets/guides_webhooks.md.hFTik3lf.js +50 -0
  158. package/dist/docs/assets/guides_webhooks.md.hFTik3lf.lean.js +1 -0
  159. package/dist/docs/assets/hillclimbing.md.DHNast08.js +4 -0
  160. package/dist/docs/assets/hillclimbing.md.DHNast08.lean.js +1 -0
  161. package/dist/docs/assets/index.md.BPKcj5AI.js +20 -0
  162. package/dist/docs/assets/index.md.BPKcj5AI.lean.js +1 -0
  163. package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  164. package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  165. package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  166. package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  167. package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  168. package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  169. package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  170. package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  171. package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  172. package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  173. package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  174. package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  175. package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  176. package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  177. package/dist/docs/assets/quickstart.md.tVPiGK_L.js +35 -0
  178. package/dist/docs/assets/quickstart.md.tVPiGK_L.lean.js +1 -0
  179. package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.js +34 -0
  180. package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.lean.js +1 -0
  181. package/dist/docs/assets/reference_channels.md.D7JTR03W.js +53 -0
  182. package/dist/docs/assets/reference_channels.md.D7JTR03W.lean.js +1 -0
  183. package/dist/docs/assets/reference_cli.md.DA730zCu.js +33 -0
  184. package/dist/docs/assets/reference_cli.md.DA730zCu.lean.js +1 -0
  185. package/dist/docs/assets/reference_connections.md.C3vNH_DE.js +26 -0
  186. package/dist/docs/assets/reference_connections.md.C3vNH_DE.lean.js +1 -0
  187. package/dist/docs/assets/reference_hooks.md.BCEc3MyM.js +12 -0
  188. package/dist/docs/assets/reference_hooks.md.BCEc3MyM.lean.js +1 -0
  189. package/dist/docs/assets/reference_http-api.md.DBAahtdz.js +11 -0
  190. package/dist/docs/assets/reference_http-api.md.DBAahtdz.lean.js +1 -0
  191. package/dist/docs/assets/reference_instructions.md.BC05LEQ8.js +12 -0
  192. package/dist/docs/assets/reference_instructions.md.BC05LEQ8.lean.js +1 -0
  193. package/dist/docs/assets/reference_playground.md.CPZhfYaO.js +1 -0
  194. package/dist/docs/assets/reference_playground.md.CPZhfYaO.lean.js +1 -0
  195. package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.js +31 -0
  196. package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.lean.js +1 -0
  197. package/dist/docs/assets/reference_schedules.md.D7qijxLk.js +82 -0
  198. package/dist/docs/assets/reference_schedules.md.D7qijxLk.lean.js +1 -0
  199. package/dist/docs/assets/reference_sessions.md.DdjWabnN.js +8 -0
  200. package/dist/docs/assets/reference_sessions.md.DdjWabnN.lean.js +1 -0
  201. package/dist/docs/assets/reference_skills.md.VQnlBT3Q.js +15 -0
  202. package/dist/docs/assets/reference_skills.md.VQnlBT3Q.lean.js +1 -0
  203. package/dist/docs/assets/reference_subagents.md.CIRAVcPK.js +10 -0
  204. package/dist/docs/assets/reference_subagents.md.CIRAVcPK.lean.js +1 -0
  205. package/dist/docs/assets/reference_tools.md.DF5kwlt0.js +46 -0
  206. package/dist/docs/assets/reference_tools.md.DF5kwlt0.lean.js +1 -0
  207. package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.js +1 -0
  208. package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.lean.js +1 -0
  209. package/dist/docs/assets/style.Bj-IXa5W.css +1 -0
  210. package/dist/docs/assets/troubleshooting.md.DkovjS7h.js +1 -0
  211. package/dist/docs/assets/troubleshooting.md.DkovjS7h.lean.js +1 -0
  212. package/dist/docs/building-with-agents.html +37 -0
  213. package/dist/docs/concepts.html +28 -0
  214. package/dist/docs/deployment.html +38 -0
  215. package/dist/docs/evals.html +109 -0
  216. package/dist/docs/guides/agent-to-agent.html +34 -0
  217. package/dist/docs/guides/cloud-runtime.html +33 -0
  218. package/dist/docs/guides/github.html +44 -0
  219. package/dist/docs/guides/human-in-the-loop.html +52 -0
  220. package/dist/docs/guides/slack.html +61 -0
  221. package/dist/docs/guides/webhooks.html +74 -0
  222. package/dist/docs/hashmap.json +1 -0
  223. package/dist/docs/hillclimbing.html +28 -0
  224. package/dist/docs/index.html +44 -0
  225. package/dist/docs/quickstart.html +59 -0
  226. package/dist/docs/reference/agent-config.html +58 -0
  227. package/dist/docs/reference/channels.html +77 -0
  228. package/dist/docs/reference/cli.html +57 -0
  229. package/dist/docs/reference/connections.html +50 -0
  230. package/dist/docs/reference/hooks.html +36 -0
  231. package/dist/docs/reference/http-api.html +35 -0
  232. package/dist/docs/reference/instructions.html +36 -0
  233. package/dist/docs/reference/playground.html +25 -0
  234. package/dist/docs/reference/project-layout.html +55 -0
  235. package/dist/docs/reference/schedules.html +106 -0
  236. package/dist/docs/reference/sessions.html +32 -0
  237. package/dist/docs/reference/skills.html +39 -0
  238. package/dist/docs/reference/subagents.html +34 -0
  239. package/dist/docs/reference/tools.html +70 -0
  240. package/dist/docs/scaffolding-agents.html +25 -0
  241. package/dist/docs/troubleshooting.html +25 -0
  242. package/dist/docs/vp-icons.css +0 -0
  243. package/dist/evals.d.ts +312 -0
  244. package/dist/evals.d.ts.map +1 -0
  245. package/dist/evals.js +254 -0
  246. package/dist/hooks.d.ts +23 -0
  247. package/dist/hooks.d.ts.map +1 -0
  248. package/dist/hooks.js +23 -0
  249. package/dist/index.d.ts +71 -0
  250. package/dist/index.d.ts.map +1 -0
  251. package/dist/index.js +101 -0
  252. package/dist/internal/ab-collector.d.ts +42 -0
  253. package/dist/internal/ab-collector.d.ts.map +1 -0
  254. package/dist/internal/ab-collector.js +153 -0
  255. package/dist/internal/ab-fold.d.ts +36 -0
  256. package/dist/internal/ab-fold.d.ts.map +1 -0
  257. package/dist/internal/ab-fold.js +171 -0
  258. package/dist/internal/ab-snapshot.d.ts +70 -0
  259. package/dist/internal/ab-snapshot.d.ts.map +1 -0
  260. package/dist/internal/ab-snapshot.js +208 -0
  261. package/dist/internal/approval-gate.d.ts +34 -0
  262. package/dist/internal/approval-gate.d.ts.map +1 -0
  263. package/dist/internal/approval-gate.js +85 -0
  264. package/dist/internal/auth.d.ts +8 -0
  265. package/dist/internal/auth.d.ts.map +1 -0
  266. package/dist/internal/auth.js +27 -0
  267. package/dist/internal/authored-alias-hooks.d.ts +31 -0
  268. package/dist/internal/authored-alias-hooks.d.ts.map +1 -0
  269. package/dist/internal/authored-alias-hooks.js +43 -0
  270. package/dist/internal/authored-loaders.d.ts +25 -0
  271. package/dist/internal/authored-loaders.d.ts.map +1 -0
  272. package/dist/internal/authored-loaders.js +129 -0
  273. package/dist/internal/bounded-int.d.ts +11 -0
  274. package/dist/internal/bounded-int.d.ts.map +1 -0
  275. package/dist/internal/bounded-int.js +13 -0
  276. package/dist/internal/brand.d.ts +6 -0
  277. package/dist/internal/brand.d.ts.map +1 -0
  278. package/dist/internal/brand.js +17 -0
  279. package/dist/internal/chat-client.d.ts +19 -0
  280. package/dist/internal/chat-client.d.ts.map +1 -0
  281. package/dist/internal/chat-client.js +327 -0
  282. package/dist/internal/cli-ax.d.ts +58 -0
  283. package/dist/internal/cli-ax.d.ts.map +1 -0
  284. package/dist/internal/cli-ax.js +345 -0
  285. package/dist/internal/cli-cursor.d.ts +20 -0
  286. package/dist/internal/cli-cursor.d.ts.map +1 -0
  287. package/dist/internal/cli-cursor.js +227 -0
  288. package/dist/internal/cli-github.d.ts +47 -0
  289. package/dist/internal/cli-github.d.ts.map +1 -0
  290. package/dist/internal/cli-github.js +644 -0
  291. package/dist/internal/cli-slack.d.ts +18 -0
  292. package/dist/internal/cli-slack.d.ts.map +1 -0
  293. package/dist/internal/cli-slack.js +144 -0
  294. package/dist/internal/cloud-merge.d.ts +23 -0
  295. package/dist/internal/cloud-merge.d.ts.map +1 -0
  296. package/dist/internal/cloud-merge.js +28 -0
  297. package/dist/internal/cron.d.ts +17 -0
  298. package/dist/internal/cron.d.ts.map +1 -0
  299. package/dist/internal/cron.js +60 -0
  300. package/dist/internal/cursor/account-mcp.d.ts +95 -0
  301. package/dist/internal/cursor/account-mcp.d.ts.map +1 -0
  302. package/dist/internal/cursor/account-mcp.js +342 -0
  303. package/dist/internal/cursor/backend-client.d.ts +118 -0
  304. package/dist/internal/cursor/backend-client.d.ts.map +1 -0
  305. package/dist/internal/cursor/backend-client.js +477 -0
  306. package/dist/internal/cursor/credentials.d.ts +112 -0
  307. package/dist/internal/cursor/credentials.d.ts.map +1 -0
  308. package/dist/internal/cursor/credentials.js +329 -0
  309. package/dist/internal/cursor-event-relay.d.ts +111 -0
  310. package/dist/internal/cursor-event-relay.d.ts.map +1 -0
  311. package/dist/internal/cursor-event-relay.js +181 -0
  312. package/dist/internal/cursor-relay-core.d.ts +113 -0
  313. package/dist/internal/cursor-relay-core.d.ts.map +1 -0
  314. package/dist/internal/cursor-relay-core.js +364 -0
  315. package/dist/internal/cursor-slack-relay.d.ts +94 -0
  316. package/dist/internal/cursor-slack-relay.d.ts.map +1 -0
  317. package/dist/internal/cursor-slack-relay.js +171 -0
  318. package/dist/internal/describe-error.d.ts +3 -0
  319. package/dist/internal/describe-error.d.ts.map +1 -0
  320. package/dist/internal/describe-error.js +4 -0
  321. package/dist/internal/dev-mode.d.ts +13 -0
  322. package/dist/internal/dev-mode.d.ts.map +1 -0
  323. package/dist/internal/dev-mode.js +17 -0
  324. package/dist/internal/discovery.d.ts +55 -0
  325. package/dist/internal/discovery.d.ts.map +1 -0
  326. package/dist/internal/discovery.js +1427 -0
  327. package/dist/internal/distribution.d.ts +47 -0
  328. package/dist/internal/distribution.d.ts.map +1 -0
  329. package/dist/internal/distribution.js +82 -0
  330. package/dist/internal/docs-site.d.ts +28 -0
  331. package/dist/internal/docs-site.d.ts.map +1 -0
  332. package/dist/internal/docs-site.js +169 -0
  333. package/dist/internal/duration.d.ts +8 -0
  334. package/dist/internal/duration.d.ts.map +1 -0
  335. package/dist/internal/duration.js +35 -0
  336. package/dist/internal/eval-run-store.d.ts +81 -0
  337. package/dist/internal/eval-run-store.d.ts.map +1 -0
  338. package/dist/internal/eval-run-store.js +396 -0
  339. package/dist/internal/eval-runner.d.ts +76 -0
  340. package/dist/internal/eval-runner.d.ts.map +1 -0
  341. package/dist/internal/eval-runner.js +336 -0
  342. package/dist/internal/event-log.d.ts +51 -0
  343. package/dist/internal/event-log.d.ts.map +1 -0
  344. package/dist/internal/event-log.js +167 -0
  345. package/dist/internal/event-mapper.d.ts +46 -0
  346. package/dist/internal/event-mapper.d.ts.map +1 -0
  347. package/dist/internal/event-mapper.js +226 -0
  348. package/dist/internal/frontmatter.d.ts +12 -0
  349. package/dist/internal/frontmatter.d.ts.map +1 -0
  350. package/dist/internal/frontmatter.js +61 -0
  351. package/dist/internal/github-fanout.d.ts +32 -0
  352. package/dist/internal/github-fanout.d.ts.map +1 -0
  353. package/dist/internal/github-fanout.js +122 -0
  354. package/dist/internal/handleAgentServeTrigger.d.ts +59 -0
  355. package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -0
  356. package/dist/internal/handleAgentServeTrigger.js +115 -0
  357. package/dist/internal/host-platforms.d.ts +40 -0
  358. package/dist/internal/host-platforms.d.ts.map +1 -0
  359. package/dist/internal/host-platforms.js +113 -0
  360. package/dist/internal/http-channel.d.ts +54 -0
  361. package/dist/internal/http-channel.d.ts.map +1 -0
  362. package/dist/internal/http-channel.js +382 -0
  363. package/dist/internal/ids.d.ts +19 -0
  364. package/dist/internal/ids.d.ts.map +1 -0
  365. package/dist/internal/ids.js +34 -0
  366. package/dist/internal/init-project.d.ts +22 -0
  367. package/dist/internal/init-project.d.ts.map +1 -0
  368. package/dist/internal/init-project.js +125 -0
  369. package/dist/internal/json-dir-store.d.ts +32 -0
  370. package/dist/internal/json-dir-store.d.ts.map +1 -0
  371. package/dist/internal/json-dir-store.js +100 -0
  372. package/dist/internal/json-schema.d.ts +18 -0
  373. package/dist/internal/json-schema.d.ts.map +1 -0
  374. package/dist/internal/json-schema.js +53 -0
  375. package/dist/internal/log-ring.d.ts +23 -0
  376. package/dist/internal/log-ring.d.ts.map +1 -0
  377. package/dist/internal/log-ring.js +42 -0
  378. package/dist/internal/map-pool.d.ts +6 -0
  379. package/dist/internal/map-pool.d.ts.map +1 -0
  380. package/dist/internal/map-pool.js +41 -0
  381. package/dist/internal/mcp-endpoint.d.ts +59 -0
  382. package/dist/internal/mcp-endpoint.d.ts.map +1 -0
  383. package/dist/internal/mcp-endpoint.js +355 -0
  384. package/dist/internal/mcp-host.d.ts +28 -0
  385. package/dist/internal/mcp-host.d.ts.map +1 -0
  386. package/dist/internal/mcp-host.js +162 -0
  387. package/dist/internal/net.d.ts +5 -0
  388. package/dist/internal/net.d.ts.map +1 -0
  389. package/dist/internal/net.js +30 -0
  390. package/dist/internal/peer-connections.d.ts +44 -0
  391. package/dist/internal/peer-connections.d.ts.map +1 -0
  392. package/dist/internal/peer-connections.js +67 -0
  393. package/dist/internal/playground/static.d.ts +35 -0
  394. package/dist/internal/playground/static.d.ts.map +1 -0
  395. package/dist/internal/playground/static.js +162 -0
  396. package/dist/internal/playground/toolchain.d.ts +57 -0
  397. package/dist/internal/playground/toolchain.d.ts.map +1 -0
  398. package/dist/internal/playground/toolchain.js +226 -0
  399. package/dist/internal/reminder-runner.d.ts +62 -0
  400. package/dist/internal/reminder-runner.d.ts.map +1 -0
  401. package/dist/internal/reminder-runner.js +582 -0
  402. package/dist/internal/reminder-schedule.d.ts +22 -0
  403. package/dist/internal/reminder-schedule.d.ts.map +1 -0
  404. package/dist/internal/reminder-schedule.js +82 -0
  405. package/dist/internal/reminder-store.d.ts +58 -0
  406. package/dist/internal/reminder-store.d.ts.map +1 -0
  407. package/dist/internal/reminder-store.js +106 -0
  408. package/dist/internal/resolved-connections.d.ts +41 -0
  409. package/dist/internal/resolved-connections.d.ts.map +1 -0
  410. package/dist/internal/resolved-connections.js +73 -0
  411. package/dist/internal/review-comments.d.ts +50 -0
  412. package/dist/internal/review-comments.d.ts.map +1 -0
  413. package/dist/internal/review-comments.js +194 -0
  414. package/dist/internal/router.d.ts +33 -0
  415. package/dist/internal/router.d.ts.map +1 -0
  416. package/dist/internal/router.js +93 -0
  417. package/dist/internal/run-client.d.ts +49 -0
  418. package/dist/internal/run-client.d.ts.map +1 -0
  419. package/dist/internal/run-client.js +208 -0
  420. package/dist/internal/schedule-runner.d.ts +31 -0
  421. package/dist/internal/schedule-runner.d.ts.map +1 -0
  422. package/dist/internal/schedule-runner.js +126 -0
  423. package/dist/internal/sdk-runner.d.ts +41 -0
  424. package/dist/internal/sdk-runner.d.ts.map +1 -0
  425. package/dist/internal/sdk-runner.js +221 -0
  426. package/dist/internal/server.d.ts +25 -0
  427. package/dist/internal/server.d.ts.map +1 -0
  428. package/dist/internal/server.js +1374 -0
  429. package/dist/internal/session-engine.d.ts +287 -0
  430. package/dist/internal/session-engine.d.ts.map +1 -0
  431. package/dist/internal/session-engine.js +1377 -0
  432. package/dist/internal/session-store.d.ts +29 -0
  433. package/dist/internal/session-store.d.ts.map +1 -0
  434. package/dist/internal/session-store.js +140 -0
  435. package/dist/internal/session-urls.d.ts +10 -0
  436. package/dist/internal/session-urls.d.ts.map +1 -0
  437. package/dist/internal/session-urls.js +25 -0
  438. package/dist/internal/stream-progress.d.ts +14 -0
  439. package/dist/internal/stream-progress.d.ts.map +1 -0
  440. package/dist/internal/stream-progress.js +195 -0
  441. package/dist/internal/tool-result.d.ts +20 -0
  442. package/dist/internal/tool-result.d.ts.map +1 -0
  443. package/dist/internal/tool-result.js +45 -0
  444. package/dist/internal/trajectory.d.ts +56 -0
  445. package/dist/internal/trajectory.d.ts.map +1 -0
  446. package/dist/internal/trajectory.js +248 -0
  447. package/dist/internal/workspace.d.ts +42 -0
  448. package/dist/internal/workspace.d.ts.map +1 -0
  449. package/dist/internal/workspace.js +199 -0
  450. package/dist/playground/assets/cursor-icons-outline-oY2V_mvK.woff2 +0 -0
  451. package/dist/playground/assets/index-1K-hG-7p.css +1 -0
  452. package/dist/playground/assets/index-FlWjhg3x.js +79 -0
  453. package/dist/playground/index.html +17 -0
  454. package/dist/reminders.d.ts +23 -0
  455. package/dist/reminders.d.ts.map +1 -0
  456. package/dist/reminders.js +22 -0
  457. package/dist/schedules.d.ts +23 -0
  458. package/dist/schedules.d.ts.map +1 -0
  459. package/dist/schedules.js +26 -0
  460. package/dist/skills.d.ts +22 -0
  461. package/dist/skills.d.ts.map +1 -0
  462. package/dist/skills.js +22 -0
  463. package/dist/tools.d.ts +92 -0
  464. package/dist/tools.d.ts.map +1 -0
  465. package/dist/tools.js +68 -0
  466. package/dist/types.d.ts +1609 -0
  467. package/dist/types.d.ts.map +1 -0
  468. package/dist/types.js +80 -0
  469. package/docs/README.md +174 -0
  470. package/docs/ab.md +355 -0
  471. package/docs/building-with-agents.md +129 -0
  472. package/docs/concepts.md +177 -0
  473. package/docs/deployment.md +218 -0
  474. package/docs/evals.md +383 -0
  475. package/docs/guides/agent-to-agent.md +118 -0
  476. package/docs/guides/cloud-runtime.md +122 -0
  477. package/docs/guides/github.md +172 -0
  478. package/docs/guides/human-in-the-loop.md +131 -0
  479. package/docs/guides/slack.md +245 -0
  480. package/docs/guides/webhooks.md +201 -0
  481. package/docs/hillclimbing.md +93 -0
  482. package/docs/quickstart.md +183 -0
  483. package/docs/reference/agent-config.md +154 -0
  484. package/docs/reference/channels.md +206 -0
  485. package/docs/reference/cli.md +257 -0
  486. package/docs/reference/connections.md +137 -0
  487. package/docs/reference/hooks.md +74 -0
  488. package/docs/reference/http-api.md +219 -0
  489. package/docs/reference/instructions.md +77 -0
  490. package/docs/reference/playground.md +67 -0
  491. package/docs/reference/project-layout.md +119 -0
  492. package/docs/reference/schedules.md +220 -0
  493. package/docs/reference/sessions.md +165 -0
  494. package/docs/reference/skills.md +79 -0
  495. package/docs/reference/subagents.md +74 -0
  496. package/docs/reference/tools.md +203 -0
  497. package/docs/scaffolding-agents.md +113 -0
  498. package/docs/troubleshooting.md +95 -0
  499. package/package.json +185 -0
  500. package/skills/ab/SKILL.md +139 -0
  501. package/skills/create-agent/SKILL.md +219 -0
  502. package/skills/debug/SKILL.md +71 -0
  503. package/skills/evals/SKILL.md +217 -0
  504. package/skills/framework-map/SKILL.md +142 -0
  505. package/skills/github/SKILL.md +144 -0
  506. package/skills/hillclimb/SKILL.md +162 -0
  507. package/skills/setup-slack/SKILL.md +180 -0
  508. package/src/ab.ts +675 -0
  509. package/src/bin/agent-serve.ts +949 -0
  510. package/src/channels/github/api.ts +374 -0
  511. package/src/channels/github/auth.ts +275 -0
  512. package/src/channels/github/binding.ts +223 -0
  513. package/src/channels/github/defaults.ts +111 -0
  514. package/src/channels/github/events.ts +72 -0
  515. package/src/channels/github/forward.ts +381 -0
  516. package/src/channels/github/github-channel.ts +2270 -0
  517. package/src/channels/github/index.ts +52 -0
  518. package/src/channels/github/replay.ts +387 -0
  519. package/src/channels/github/state.ts +95 -0
  520. package/src/channels/github/types.ts +490 -0
  521. package/src/channels/slack/api.ts +580 -0
  522. package/src/channels/slack/approvals.ts +198 -0
  523. package/src/channels/slack/assistant.ts +76 -0
  524. package/src/channels/slack/auth.ts +112 -0
  525. package/src/channels/slack/channel-watch.ts +219 -0
  526. package/src/channels/slack/constants.ts +30 -0
  527. package/src/channels/slack/credentials.ts +90 -0
  528. package/src/channels/slack/cursor-account.ts +166 -0
  529. package/src/channels/slack/defaults.ts +450 -0
  530. package/src/channels/slack/dispatch.ts +293 -0
  531. package/src/channels/slack/doctor.ts +135 -0
  532. package/src/channels/slack/event-id-dedupe.ts +30 -0
  533. package/src/channels/slack/inbound.ts +219 -0
  534. package/src/channels/slack/index.ts +45 -0
  535. package/src/channels/slack/init.ts +133 -0
  536. package/src/channels/slack/interactive.ts +194 -0
  537. package/src/channels/slack/links.ts +23 -0
  538. package/src/channels/slack/live-delivery.ts +201 -0
  539. package/src/channels/slack/log.ts +83 -0
  540. package/src/channels/slack/manifest.ts +179 -0
  541. package/src/channels/slack/pr-ref.ts +50 -0
  542. package/src/channels/slack/setup.ts +97 -0
  543. package/src/channels/slack/slack-channel.ts +374 -0
  544. package/src/channels/slack/socket-mode.ts +154 -0
  545. package/src/channels/slack/stream.ts +63 -0
  546. package/src/channels/slack/tool-approval-events.ts +136 -0
  547. package/src/channels/slack/types.ts +349 -0
  548. package/src/channels.ts +385 -0
  549. package/src/connections.ts +89 -0
  550. package/src/evals.ts +501 -0
  551. package/src/hooks.ts +33 -0
  552. package/src/index.ts +184 -0
  553. package/src/internal/ab-collector.ts +210 -0
  554. package/src/internal/ab-fold.ts +228 -0
  555. package/src/internal/ab-snapshot.ts +335 -0
  556. package/src/internal/approval-gate.ts +115 -0
  557. package/src/internal/auth.ts +39 -0
  558. package/src/internal/authored-alias-hooks.ts +69 -0
  559. package/src/internal/authored-loaders.ts +138 -0
  560. package/src/internal/bounded-int.ts +27 -0
  561. package/src/internal/brand.ts +29 -0
  562. package/src/internal/chat-client.ts +407 -0
  563. package/src/internal/cli-ax.ts +474 -0
  564. package/src/internal/cli-cursor.ts +275 -0
  565. package/src/internal/cli-github.ts +849 -0
  566. package/src/internal/cli-slack.ts +175 -0
  567. package/src/internal/cloud-merge.ts +41 -0
  568. package/src/internal/cron.ts +78 -0
  569. package/src/internal/cursor/account-mcp.ts +472 -0
  570. package/src/internal/cursor/backend-client.ts +614 -0
  571. package/src/internal/cursor/credentials.ts +401 -0
  572. package/src/internal/cursor-event-relay.ts +281 -0
  573. package/src/internal/cursor-relay-core.ts +444 -0
  574. package/src/internal/cursor-slack-relay.ts +242 -0
  575. package/src/internal/describe-error.ts +4 -0
  576. package/src/internal/dev-mode.ts +20 -0
  577. package/src/internal/discovery.ts +1709 -0
  578. package/src/internal/distribution.ts +97 -0
  579. package/src/internal/docs-site.ts +191 -0
  580. package/src/internal/duration.ts +39 -0
  581. package/src/internal/eval-run-store.ts +519 -0
  582. package/src/internal/eval-runner.ts +522 -0
  583. package/src/internal/event-log.ts +175 -0
  584. package/src/internal/event-mapper.ts +272 -0
  585. package/src/internal/frontmatter.ts +77 -0
  586. package/src/internal/github-fanout.ts +159 -0
  587. package/src/internal/handleAgentServeTrigger.ts +156 -0
  588. package/src/internal/host-platforms.ts +144 -0
  589. package/src/internal/http-channel.ts +546 -0
  590. package/src/internal/ids.ts +44 -0
  591. package/src/internal/init-project.ts +165 -0
  592. package/src/internal/json-dir-store.ts +109 -0
  593. package/src/internal/json-schema.ts +69 -0
  594. package/src/internal/log-ring.ts +59 -0
  595. package/src/internal/map-pool.ts +32 -0
  596. package/src/internal/mcp-endpoint.ts +518 -0
  597. package/src/internal/mcp-host.ts +211 -0
  598. package/src/internal/net.ts +31 -0
  599. package/src/internal/peer-connections.ts +100 -0
  600. package/src/internal/playground/static.ts +189 -0
  601. package/src/internal/playground/toolchain.ts +277 -0
  602. package/src/internal/reminder-runner.ts +756 -0
  603. package/src/internal/reminder-schedule.ts +106 -0
  604. package/src/internal/reminder-store.ts +145 -0
  605. package/src/internal/resolved-connections.ts +145 -0
  606. package/src/internal/review-comments.ts +268 -0
  607. package/src/internal/router.ts +145 -0
  608. package/src/internal/run-client.ts +320 -0
  609. package/src/internal/schedule-runner.ts +161 -0
  610. package/src/internal/sdk-runner.ts +315 -0
  611. package/src/internal/server.ts +1737 -0
  612. package/src/internal/session-engine.ts +1810 -0
  613. package/src/internal/session-store.ts +147 -0
  614. package/src/internal/session-urls.ts +40 -0
  615. package/src/internal/stream-progress.ts +254 -0
  616. package/src/internal/tool-result.ts +54 -0
  617. package/src/internal/trajectory.ts +306 -0
  618. package/src/internal/workspace.ts +223 -0
  619. package/src/reminders.ts +35 -0
  620. package/src/schedules.ts +37 -0
  621. package/src/skills.ts +27 -0
  622. package/src/tools.ts +127 -0
  623. package/src/types.ts +1848 -0
@@ -0,0 +1,949 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * agent-serve CLI.
4
+ *
5
+ * agent-serve serve [--dir .] [--port 3000] [--host 127.0.0.1] [--dev]
6
+ * agent-serve chat [--url http://127.0.0.1:3000] [--message "..."] [--json]
7
+ * agent-serve run [--dir .] [--message "..."] [--json|--text]
8
+ * agent-serve trajectory --events <file.ndjson>
9
+ * agent-serve init [dir]
10
+ * agent-serve eval [--dir .] [evalId...]
11
+ * agent-serve validate [--dir .]
12
+ * agent-serve slack <subcommand>
13
+ */
14
+
15
+ import { readFile } from "node:fs/promises";
16
+ import { resolve } from "node:path";
17
+ import { parseArgs } from "node:util";
18
+ import {
19
+ formatDiagnostics,
20
+ projectInfo,
21
+ resolveAgentMounts,
22
+ serve,
23
+ } from "../index.js";
24
+ import { registerAuthoredModuleLoaders } from "../internal/authored-loaders.js";
25
+ import { runChat } from "../internal/chat-client.js";
26
+ import {
27
+ type AxCliOptions,
28
+ cmdCall,
29
+ cmdEval,
30
+ cmdInit,
31
+ cmdRun,
32
+ cmdTrajectory,
33
+ } from "../internal/cli-ax.js";
34
+ import { CLI_COMMAND_NAME as CLI } from "../internal/distribution.js";
35
+ import { runSession } from "../internal/run-client.js";
36
+ import { formatTrajectoryText } from "../internal/trajectory.js";
37
+ import type { AgentProject, AgentServeHandle } from "../types.js";
38
+
39
+ const HELP = `${CLI} — serve a filesystem-defined Cursor agent over channels
40
+
41
+ Usage:
42
+ ${CLI} serve [--dir <path>] [--port <n>] [--host <host>] [--dev]
43
+ [--mode single|multi] [--api-key <key>] [--no-schedules]
44
+ [--public-url <url>]
45
+ [--cursor-events --repo <owner/name>]...
46
+ ${CLI} chat [--url <baseUrl>] [--message <text>] [--json] [--text]
47
+ ${CLI} run [--dir <path>] [--message <text>]... [--url <baseUrl>]
48
+ [--session <id>] [--continuation-token <t>]
49
+ [--events <file.ndjson>] [--no-events] [--text]
50
+ [--timeout-ms <n>] [--no-stream]
51
+ ${CLI} trajectory --events <file.ndjson> [--text]
52
+ ${CLI} call <tool> [--input <json>] [--dir <path> | --url <baseUrl>]
53
+ [--session <id>] [--slug <slug>]
54
+ ${CLI} init [dir]
55
+ ${CLI} eval [--dir <path>] [evalId...] [--list] [--json]
56
+ [--tag <tag>]... [--verbose] [--timeout-ms <n>]
57
+ [--no-stream]
58
+ ${CLI} info [--dir <path>] [--json]
59
+ ${CLI} validate [--dir <path>]
60
+ ${CLI} login [--api-key <key>] [--key-name <name>]
61
+ ${CLI} logout
62
+ ${CLI} whoami [--json]
63
+ ${CLI} slack <subcommand> …
64
+ ${CLI} github <subcommand> …
65
+
66
+ Commands:
67
+ serve Serve agents under /<slug>/... (index at /). On a TTY, press
68
+ Enter to restart (reloads agent code + Vite HMR child).
69
+ chat Talk to a running server (streams the reply). --json prints a trajectory.
70
+ run One-shot create→test loop: ephemeral server + JSON trajectory.
71
+ Writes a single events.ndjson trace (visualize in the playground).
72
+ Streams tool calls and reply text to stderr when stderr is a TTY.
73
+ trajectory Summarize an events.ndjson file into a trajectory.
74
+ call Call an authored server tool deterministically (no model turn)
75
+ via POST /v1/tools/:toolName. --session runs it inside an
76
+ existing session and records it on that session's event stream.
77
+ init Scaffold a project, or print the coding-agent setup guide (no args).
78
+ eval Run filesystem evals under evals/**/*.eval.ts (streams on a TTY).
79
+ Pass evalId args to select: one datapoint (weather/nyc), a whole
80
+ file (weather → all cases in that file), several of either, or
81
+ omit to run all.
82
+ info Print the discovered agent surface (tools, skills, channels, ...).
83
+ validate Check the project(s) and exit non-zero on error diagnostics.
84
+ login Sign the host in to Cursor: browser sign-in mints a named,
85
+ dashboard-revocable API key (only the key is stored). It powers
86
+ inference, cloud runtime, and cursorAccount MCP connections.
87
+ logout Remove the stored Cursor credentials.
88
+ whoami Show which Cursor account powers this host (and why).
89
+ slack Slack channel pack: init, manifests, doctor (see slack help).
90
+ github GitHub webhook pack: forward live deliveries, events, doctor
91
+ (wraps \`gh webhook forward\`; see github help).
92
+
93
+ Agent loop:
94
+ ${CLI} validate --dir .
95
+ ${CLI} info --dir . --json
96
+ ${CLI} run --dir . --message "..."
97
+ ${CLI} eval --dir .
98
+
99
+ Options:
100
+ --dir Project root (defaults to the current directory).
101
+ --port Port to listen on (default 3000).
102
+ --host Host to bind (default 127.0.0.1).
103
+ --mode serve: "multi" (default, slugged /<dir>/v1/*) or "single"
104
+ (unslugged /v1/*). Multi also exposes host /v1/health for
105
+ ALB/ECS checks; use single when one agent is the whole host.
106
+ --dev Dev mode: mounts POST /v1/dev/schedules/:scheduleId and
107
+ disables the cron runner (dispatch schedules by hand).
108
+ --api-key Cursor API key (defaults to CURSOR_API_KEY, then the
109
+ stored \`${CLI} login\` credential).
110
+ --key-name login: label for the minted API key (defaults to
111
+ "${CLI} (<hostname>)").
112
+ --state-root Durable state directory (default <dir>/.agent-serve). Put it
113
+ outside any repository whose rules should not reach the agent.
114
+ --bearer-token serve: require this bearer token on API routes. chat/run/eval:
115
+ send it as the Authorization bearer.
116
+ --allow-anonymous serve: admit all HTTP callers (allowAll). For demos behind a
117
+ trusted network only; mutually exclusive with --bearer-token.
118
+ --public-url serve: base URL where this host is reachable from outside
119
+ (e.g. https://agent-serve.example.com). Required for peer
120
+ connections (defineConnection({ agent })) on cloud-runtime
121
+ turns; local turns always use loopback.
122
+ --no-schedules Disable the cron runner outside dev mode.
123
+ --no-playground Disable the bundled web playground at /playground (also skips
124
+ auto-build / HMR).
125
+ --no-docs Disable the documentation site at /docs (also skips its
126
+ auto-build).
127
+ --url chat/run/eval: base URL of a running agent (skip local host).
128
+ --message chat/run: user message (repeatable for run).
129
+ --input call: JSON object of tool arguments (default {}).
130
+ --messages-file JSON array of strings (run).
131
+ --session Existing session id for a follow-up turn.
132
+ --continuation-token Token from a prior run/chat response.
133
+ --events run: write NDJSON trace to this path (default
134
+ <dir>/.agent-serve/traces/<sessionId>.ndjson).
135
+ trajectory: read this file.
136
+ --no-events run: do not write a trace file.
137
+ --slug Agent slug when --dir mounts multiple agents.
138
+ --timeout-ms Abort a hung turn after N milliseconds.
139
+ --tag eval: only run cases with this tag (repeatable).
140
+ --list eval: print discovered cases without running.
141
+ --verbose eval: stream t.log lines and reply snippets.
142
+ --no-stream run/eval: silence live progress on stderr (JSON still prints).
143
+ --json JSON output (info/chat/eval/github; run defaults to JSON).
144
+ --no-color chat: force plain output.
145
+ --cursor-events serve: pull SCM webhook events from /v0/scm-events. The
146
+ stream is read as your Cursor user, so serve requires
147
+ sign-in (\`${CLI} login\` / CURSOR_API_KEY) and --repo.
148
+ Offset under <state-root>/cursor-events/.
149
+ CURSOR_API_BASE_URL overrides.
150
+ --repo serve --cursor-events: repo to subscribe to (repeatable).
151
+ github forward: owner/repo to forward from (inferred from
152
+ the git remote when omitted; last wins).
153
+ --org github forward: organization login (org-level hooks).
154
+ --channel github: select one channel id when several are declared.
155
+ --secret github forward: webhook signing secret (defaults to
156
+ GITHUB_WEBHOOK_SECRET). github: --events overrides the
157
+ derived webhook event list.
158
+ --install github: install the cli/gh-webhook extension if missing.
159
+ --action github replay: event action (e.g. opened, synchronize).
160
+ --conclusion github replay: CI conclusion (check_run/suite/status).
161
+ --comment github replay: comment body for comment events.
162
+ --context github replay: commit-status context.
163
+ --dry-run github replay: print synthesized payloads, don't POST.
164
+ --out github replay: write synthesized payloads as fixtures.
165
+ `;
166
+
167
+ async function main(argv: string[]): Promise<number> {
168
+ const [command, ...rest] = argv;
169
+ if (
170
+ command === undefined ||
171
+ command === "help" ||
172
+ command === "--help" ||
173
+ command === "-h"
174
+ ) {
175
+ process.stdout.write(HELP);
176
+ return command === undefined ? 1 : 0;
177
+ }
178
+
179
+ const { values, positionals } = parseArgs({
180
+ args: rest,
181
+ allowPositionals: true,
182
+ options: {
183
+ dir: { type: "string", default: "." },
184
+ port: { type: "string" },
185
+ host: { type: "string" },
186
+ mode: { type: "string" },
187
+ dev: { type: "boolean", default: false },
188
+ "api-key": { type: "string" },
189
+ "key-name": { type: "string" },
190
+ "state-root": { type: "string" },
191
+ "bearer-token": { type: "string" },
192
+ "allow-anonymous": { type: "boolean", default: false },
193
+ "no-schedules": { type: "boolean", default: false },
194
+ "no-playground": { type: "boolean", default: false },
195
+ "no-docs": { type: "boolean", default: false },
196
+ url: { type: "string" },
197
+ message: { type: "string", multiple: true },
198
+ input: { type: "string" },
199
+ "messages-file": { type: "string" },
200
+ "session-id": { type: "string" },
201
+ session: { type: "string" },
202
+ "continuation-token": { type: "string" },
203
+ events: { type: "string" },
204
+ "no-events": { type: "boolean", default: false },
205
+ slug: { type: "string" },
206
+ "timeout-ms": { type: "string" },
207
+ tag: { type: "string", multiple: true },
208
+ list: { type: "boolean", default: false },
209
+ verbose: { type: "boolean", default: false },
210
+ text: { type: "boolean", default: false },
211
+ "no-color": { type: "boolean", default: false },
212
+ "no-stream": { type: "boolean", default: false },
213
+ json: { type: "boolean", default: false },
214
+ name: { type: "string" },
215
+ env: { type: "string" },
216
+ "public-url": { type: "string" },
217
+ "mount-path": { type: "string" },
218
+ "base-url": { type: "string" },
219
+ print: { type: "boolean", default: false },
220
+ transport: { type: "string" },
221
+ prefix: { type: "string" },
222
+ "no-prefix": { type: "boolean", default: false },
223
+ "channel-posts": { type: "boolean", default: false },
224
+ repo: { type: "string", multiple: true },
225
+ org: { type: "string" },
226
+ "cursor-events": { type: "boolean", default: false },
227
+ secret: { type: "string" },
228
+ channel: { type: "string" },
229
+ install: { type: "boolean", default: false },
230
+ action: { type: "string" },
231
+ conclusion: { type: "string" },
232
+ context: { type: "string" },
233
+ comment: { type: "string" },
234
+ "dry-run": { type: "boolean", default: false },
235
+ out: { type: "string" },
236
+ },
237
+ });
238
+ const dir = values.dir ?? ".";
239
+
240
+ switch (command) {
241
+ case "slack": {
242
+ const { cmdSlack } = await import("../internal/cli-slack.js");
243
+ const env =
244
+ values.env === "dev" || values.env === "prod" || values.env === "both"
245
+ ? values.env
246
+ : undefined;
247
+ return cmdSlack(positionals[0], {
248
+ dir,
249
+ name: values.name,
250
+ env,
251
+ json: values.json,
252
+ print: values.print,
253
+ prefix: values.prefix,
254
+ noPrefix: values["no-prefix"],
255
+ channelPosts: values["channel-posts"],
256
+ });
257
+ }
258
+ case "github": {
259
+ const port =
260
+ values.port === undefined
261
+ ? undefined
262
+ : Number.parseInt(values.port, 10);
263
+ if (
264
+ port !== undefined &&
265
+ (Number.isNaN(port) || port < 0 || port > 65535)
266
+ ) {
267
+ process.stderr.write(`invalid --port: ${values.port}\n`);
268
+ return 1;
269
+ }
270
+ const { cmdGithub } = await import("../internal/cli-github.js");
271
+ return cmdGithub(positionals[0], {
272
+ dir,
273
+ slug: values.slug,
274
+ channel: values.channel,
275
+ host: values.host,
276
+ port,
277
+ url: values.url,
278
+ events: values.events,
279
+ // `--repo` is repeatable for `serve --cursor-events`; the github
280
+ // subcommands target a single repo, so the last one wins.
281
+ repo: values.repo?.at(-1),
282
+ org: values.org,
283
+ secret: values.secret,
284
+ install: values.install,
285
+ json: values.json,
286
+ prUrl: positionals[1],
287
+ action: values.action,
288
+ conclusion: values.conclusion,
289
+ context: values.context,
290
+ comment: values.comment,
291
+ dryRun: values["dry-run"],
292
+ out: values.out,
293
+ });
294
+ }
295
+ case "init": {
296
+ return cmdInit({
297
+ dir,
298
+ initTarget: positionals[0],
299
+ });
300
+ }
301
+
302
+ case "login": {
303
+ const { cmdLogin } = await import("../internal/cli-cursor.js");
304
+ return cmdLogin({
305
+ apiKey: values["api-key"],
306
+ keyName: values["key-name"],
307
+ });
308
+ }
309
+
310
+ case "logout": {
311
+ const { cmdLogout } = await import("../internal/cli-cursor.js");
312
+ return cmdLogout();
313
+ }
314
+
315
+ case "whoami": {
316
+ const { cmdWhoami } = await import("../internal/cli-cursor.js");
317
+ return cmdWhoami({ json: values.json });
318
+ }
319
+
320
+ case "run": {
321
+ const messages = await loadMessages(
322
+ values.message,
323
+ values["messages-file"]
324
+ );
325
+ return cmdRun(
326
+ axFromOptions({
327
+ dir,
328
+ messages,
329
+ sessionId: values["session-id"] ?? values.session,
330
+ continuationToken: values["continuation-token"],
331
+ events: values["no-events"]
332
+ ? false
333
+ : values.events === undefined
334
+ ? true
335
+ : values.events,
336
+ text: values.text,
337
+ url: values.url,
338
+ slug: values.slug,
339
+ bearerToken: values["bearer-token"],
340
+ stateRoot: values["state-root"],
341
+ timeoutMs: parseTimeoutMs(values["timeout-ms"]),
342
+ stream: values["no-stream"] ? false : undefined,
343
+ })
344
+ );
345
+ }
346
+
347
+ case "call": {
348
+ return cmdCall(
349
+ axFromOptions({
350
+ dir,
351
+ toolName: positionals[0],
352
+ toolInput: values.input,
353
+ sessionId: values["session-id"] ?? values.session,
354
+ url: values.url,
355
+ slug: values.slug,
356
+ bearerToken: values["bearer-token"],
357
+ stateRoot: values["state-root"],
358
+ })
359
+ );
360
+ }
361
+
362
+ case "trajectory": {
363
+ if (values.events === undefined) {
364
+ process.stderr.write("trajectory requires --events <file.ndjson>\n");
365
+ return 1;
366
+ }
367
+ return cmdTrajectory(
368
+ axFromOptions({
369
+ dir,
370
+ events: values.events,
371
+ text: values.text,
372
+ })
373
+ );
374
+ }
375
+
376
+ case "eval": {
377
+ return cmdEval(
378
+ axFromOptions({
379
+ dir,
380
+ evalIds: positionals,
381
+ list: values.list,
382
+ verbose: values.verbose,
383
+ json: values.json,
384
+ tags: values.tag,
385
+ url: values.url,
386
+ slug: values.slug,
387
+ bearerToken: values["bearer-token"],
388
+ stateRoot: values["state-root"],
389
+ timeoutMs: parseTimeoutMs(values["timeout-ms"]),
390
+ stream: values["no-stream"] ? false : undefined,
391
+ })
392
+ );
393
+ }
394
+
395
+ case "chat": {
396
+ if (values.json) {
397
+ return chatJson({
398
+ baseUrl: values.url ?? "http://127.0.0.1:3000",
399
+ message: (values.message as string[] | undefined)?.[0],
400
+ bearerToken: values["bearer-token"],
401
+ text: values.text,
402
+ });
403
+ }
404
+ await runChat({
405
+ baseUrl: values.url ?? "http://127.0.0.1:3000",
406
+ ...((values.message as string[] | undefined)?.[0] === undefined
407
+ ? {}
408
+ : { message: (values.message as string[])[0]! }),
409
+ ...(values["bearer-token"] === undefined
410
+ ? {}
411
+ : { bearerToken: values["bearer-token"] }),
412
+ ...(values["no-color"] ? { noColor: true } : {}),
413
+ });
414
+ return 0;
415
+ }
416
+
417
+ case "validate": {
418
+ const mounts = await loadMounts(dir);
419
+ let hasError = false;
420
+ for (const { slug, project } of mounts) {
421
+ const label = slug === "" ? project.name : `${slug} (${project.name})`;
422
+ if (project.diagnostics.length === 0) {
423
+ process.stdout.write(`ok: ${label} has no diagnostics\n`);
424
+ continue;
425
+ }
426
+ process.stdout.write(
427
+ `${label}:\n${formatDiagnostics(project.diagnostics)}\n`
428
+ );
429
+ hasError ||= project.diagnostics.some((d) => d.severity === "error");
430
+ }
431
+ return hasError ? 1 : 0;
432
+ }
433
+
434
+ case "info": {
435
+ const mounts = await loadMounts(dir);
436
+ if (values.json) {
437
+ const payload =
438
+ mounts.length === 1 && mounts[0]?.slug === ""
439
+ ? projectInfo(mounts[0].project)
440
+ : {
441
+ agents: mounts.map(({ slug, project }) => ({
442
+ slug,
443
+ ...projectInfo(project),
444
+ })),
445
+ };
446
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
447
+ return 0;
448
+ }
449
+ if (mounts.length > 1 || mounts[0]?.slug !== "") {
450
+ process.stdout.write(`${mounts.length} agents under ${dir}:\n\n`);
451
+ for (const { slug, project } of mounts) {
452
+ const info = projectInfo(project);
453
+ process.stdout.write(
454
+ ` /${slug} — ${info.name} (${formatModel(info.model)}, ${info.tools.length} tools, ${info.channels.length} channels)\n`
455
+ );
456
+ }
457
+ const anyError = mounts.some((m) =>
458
+ m.project.diagnostics.some((d) => d.severity === "error")
459
+ );
460
+ return anyError ? 1 : 0;
461
+ }
462
+ const project = mounts[0]?.project as AgentProject;
463
+ const info = projectInfo(project);
464
+ const lines: string[] = [];
465
+ lines.push(`agent: ${info.name}`);
466
+ lines.push(`model: ${formatModel(info.model)}`);
467
+ lines.push(`mcp: ${info.mcp.path} (${info.mcp.tools.join(", ")})`);
468
+ if (info.instructions !== undefined) {
469
+ lines.push(`instructions: ${info.instructions.chars} chars`);
470
+ }
471
+ lines.push(
472
+ section(
473
+ "tools",
474
+ info.tools.map((t) => `${t.name} — ${t.description}`)
475
+ )
476
+ );
477
+ lines.push(
478
+ section(
479
+ "skills",
480
+ info.skills.map((s) => `${s.name} — ${s.description}`)
481
+ )
482
+ );
483
+ lines.push(
484
+ section(
485
+ "MCP connections",
486
+ info.connections.map((c) => `${c.name} — ${c.transport}`)
487
+ )
488
+ );
489
+ lines.push(
490
+ section(
491
+ "subagents",
492
+ info.subagents.map((s) => `${s.name} — ${s.description ?? ""}`)
493
+ )
494
+ );
495
+ lines.push(
496
+ section(
497
+ "channels",
498
+ info.channels.map(
499
+ (c) =>
500
+ `${c.id}: ${
501
+ c.routes.map((r) => `${r.method} ${r.url}`).join(", ") ||
502
+ "(events only)"
503
+ }`
504
+ )
505
+ )
506
+ );
507
+ lines.push(
508
+ section(
509
+ "schedules",
510
+ info.schedules.map((s) => `${s.name} (${s.cron}, ${s.kind})`)
511
+ )
512
+ );
513
+ lines.push(section("hooks", info.hooks));
514
+ if (info.diagnostics.length > 0) {
515
+ lines.push(`\ndiagnostics:\n${formatDiagnostics(info.diagnostics)}`);
516
+ }
517
+ process.stdout.write(
518
+ `${lines.filter((line) => line !== "").join("\n")}\n`
519
+ );
520
+ return info.diagnostics.some((d) => d.severity === "error") ? 1 : 0;
521
+ }
522
+
523
+ case "serve": {
524
+ const port =
525
+ values.port === undefined ? 3000 : Number.parseInt(values.port, 10);
526
+ if (Number.isNaN(port) || port < 0 || port > 65535) {
527
+ process.stderr.write(`invalid --port: ${values.port}\n`);
528
+ return 1;
529
+ }
530
+ if (
531
+ values["allow-anonymous"] === true &&
532
+ values["bearer-token"] !== undefined
533
+ ) {
534
+ process.stderr.write(
535
+ "--allow-anonymous and --bearer-token are mutually exclusive\n"
536
+ );
537
+ return 1;
538
+ }
539
+ const mode = values.mode;
540
+ if (mode !== undefined && mode !== "single" && mode !== "multi") {
541
+ process.stderr.write(
542
+ `invalid --mode: ${mode} (expected "single" or "multi")\n`
543
+ );
544
+ return 1;
545
+ }
546
+ const serveOptions = {
547
+ port,
548
+ ...(values.host === undefined ? {} : { host: values.host }),
549
+ ...(mode === undefined ? {} : { mode: mode as "single" | "multi" }),
550
+ dev: values.dev,
551
+ ...(values["api-key"] === undefined
552
+ ? {}
553
+ : { apiKey: values["api-key"] }),
554
+ ...(values["state-root"] === undefined
555
+ ? {}
556
+ : { stateRoot: values["state-root"] }),
557
+ ...(values["bearer-token"] === undefined
558
+ ? {}
559
+ : { authToken: values["bearer-token"] }),
560
+ ...(values["allow-anonymous"] ? { allowAnonymous: true } : {}),
561
+ ...(values["no-schedules"] ? { schedules: false } : {}),
562
+ ...(values["no-playground"] ? { playground: false } : {}),
563
+ ...(values["no-docs"] ? { docs: false } : {}),
564
+ ...(values["public-url"] === undefined
565
+ ? {}
566
+ : { publicUrl: values["public-url"] }),
567
+ ...(values["cursor-events"]
568
+ ? { cursorEvents: { repos: values.repo ?? [] } }
569
+ : {}),
570
+ };
571
+ const enterToRestart = process.stdin.isTTY === true;
572
+ const bannerOpts = {
573
+ noPlayground: values["no-playground"] === true,
574
+ dev: values.dev === true,
575
+ bearerToken: values["bearer-token"] !== undefined,
576
+ noSchedules: values["no-schedules"] === true,
577
+ };
578
+
579
+ const start = async (): Promise<AgentServeHandle> => {
580
+ const next = await serve(dir, serveOptions);
581
+ printServeBanner(next, bannerOpts);
582
+ if (enterToRestart) {
583
+ process.stdout.write(" press Enter to restart\n");
584
+ }
585
+ return next;
586
+ };
587
+
588
+ let handle = await start();
589
+ let closing = false;
590
+ let restarting = false;
591
+
592
+ await new Promise<void>((resolve) => {
593
+ const shutdown = (): void => {
594
+ if (closing) {
595
+ return;
596
+ }
597
+ closing = true;
598
+ process.stdout.write("\nshutting down (draining running turns)\n");
599
+ void handle.close().finally(resolve);
600
+ };
601
+ process.on("SIGINT", shutdown);
602
+ process.on("SIGTERM", shutdown);
603
+
604
+ if (!enterToRestart) {
605
+ return;
606
+ }
607
+
608
+ process.stdin.resume();
609
+ process.stdin.on("data", (chunk: string | Buffer) => {
610
+ const text =
611
+ typeof chunk === "string" ? chunk : chunk.toString("utf8");
612
+ if (!isEnterOnly(text) || closing || restarting) {
613
+ return;
614
+ }
615
+ restarting = true;
616
+ process.stdout.write("\nrestarting…\n");
617
+ void handle
618
+ .close()
619
+ .then(start)
620
+ .then((next) => {
621
+ handle = next;
622
+ })
623
+ .catch((error: unknown) => {
624
+ process.stderr.write(
625
+ `[agent-serve] restart failed: ${
626
+ error instanceof Error
627
+ ? (error.stack ?? error.message)
628
+ : String(error)
629
+ }\n`
630
+ );
631
+ closing = true;
632
+ resolve();
633
+ })
634
+ .finally(() => {
635
+ restarting = false;
636
+ });
637
+ });
638
+ });
639
+ return 0;
640
+ }
641
+
642
+ default: {
643
+ process.stderr.write(`Unknown command "${command}"\n\n${HELP}`);
644
+ return 1;
645
+ }
646
+ }
647
+ }
648
+
649
+ function axFromOptions(
650
+ partial: Partial<AxCliOptions> & { dir: string }
651
+ ): AxCliOptions {
652
+ return {
653
+ dir: partial.dir,
654
+ ...(partial.cwd === undefined ? {} : { cwd: partial.cwd }),
655
+ ...(partial.slug === undefined ? {} : { slug: partial.slug }),
656
+ ...(partial.bearerToken === undefined
657
+ ? {}
658
+ : { bearerToken: partial.bearerToken }),
659
+ ...(partial.stateRoot === undefined
660
+ ? {}
661
+ : { stateRoot: partial.stateRoot }),
662
+ ...(partial.messages === undefined ? {} : { messages: partial.messages }),
663
+ ...(partial.sessionId === undefined
664
+ ? {}
665
+ : { sessionId: partial.sessionId }),
666
+ ...(partial.continuationToken === undefined
667
+ ? {}
668
+ : { continuationToken: partial.continuationToken }),
669
+ ...(partial.timeoutMs === undefined
670
+ ? {}
671
+ : { timeoutMs: partial.timeoutMs }),
672
+ ...(partial.events === undefined ? {} : { events: partial.events }),
673
+ ...(partial.text === undefined ? {} : { text: partial.text }),
674
+ ...(partial.json === undefined ? {} : { json: partial.json }),
675
+ ...(partial.list === undefined ? {} : { list: partial.list }),
676
+ ...(partial.verbose === undefined ? {} : { verbose: partial.verbose }),
677
+ ...(partial.tags === undefined ? {} : { tags: partial.tags }),
678
+ ...(partial.evalIds === undefined ? {} : { evalIds: partial.evalIds }),
679
+ ...(partial.initTarget === undefined
680
+ ? {}
681
+ : { initTarget: partial.initTarget }),
682
+ ...(partial.toolName === undefined ? {} : { toolName: partial.toolName }),
683
+ ...(partial.toolInput === undefined
684
+ ? {}
685
+ : { toolInput: partial.toolInput }),
686
+ ...(partial.url === undefined ? {} : { url: partial.url }),
687
+ ...(partial.stream === undefined ? {} : { stream: partial.stream }),
688
+ };
689
+ }
690
+
691
+ async function loadMessages(
692
+ messages: string[] | undefined,
693
+ messagesFile: string | undefined
694
+ ): Promise<string[]> {
695
+ const out: string[] = [];
696
+ if (messagesFile !== undefined) {
697
+ const raw = await readFile(resolve(messagesFile), "utf8");
698
+ const parsed = JSON.parse(raw) as unknown;
699
+ if (!Array.isArray(parsed)) {
700
+ throw new Error("--messages-file must be a JSON array of strings");
701
+ }
702
+ for (const item of parsed) {
703
+ if (typeof item !== "string") {
704
+ throw new Error("--messages-file entries must be strings");
705
+ }
706
+ out.push(item);
707
+ }
708
+ }
709
+ if (messages !== undefined) {
710
+ out.push(...messages);
711
+ }
712
+ return out;
713
+ }
714
+
715
+ function parseTimeoutMs(value: string | undefined): number | undefined {
716
+ if (value === undefined) {
717
+ return undefined;
718
+ }
719
+ const n = Number.parseInt(value, 10);
720
+ if (Number.isNaN(n) || n <= 0) {
721
+ throw new Error(`invalid --timeout-ms: ${value}`);
722
+ }
723
+ return n;
724
+ }
725
+
726
+ async function chatJson(args: {
727
+ baseUrl: string;
728
+ message?: string;
729
+ bearerToken?: string;
730
+ text?: boolean;
731
+ }): Promise<number> {
732
+ if (args.message === undefined) {
733
+ process.stderr.write("chat --json requires --message\n");
734
+ return 2;
735
+ }
736
+ const result = await runSession({
737
+ baseUrl: args.baseUrl,
738
+ messages: [args.message],
739
+ ...(args.bearerToken === undefined
740
+ ? {}
741
+ : { bearerToken: args.bearerToken }),
742
+ });
743
+ if (args.text) {
744
+ process.stdout.write(formatTrajectoryText(result.trajectory));
745
+ } else {
746
+ console.log(
747
+ JSON.stringify(
748
+ {
749
+ ok: result.ok,
750
+ sessionId: result.sessionId,
751
+ continuationToken: result.continuationToken ?? null,
752
+ trajectory: result.trajectory,
753
+ },
754
+ null,
755
+ 2
756
+ )
757
+ );
758
+ }
759
+ return result.ok ? 0 : 1;
760
+ }
761
+
762
+ /**
763
+ * Load mounts the same way `serve` does (multi-agent layout by default).
764
+ */
765
+ async function loadMounts(
766
+ dir: string
767
+ ): Promise<Array<{ slug: string; project: AgentProject }>> {
768
+ return resolveAgentMounts(dir);
769
+ }
770
+
771
+ function section(title: string, items: string[]): string {
772
+ if (items.length === 0) {
773
+ return "";
774
+ }
775
+ return `${title}:\n${items.map((item) => ` - ${item}`).join("\n")}`;
776
+ }
777
+
778
+ function isEnterOnly(text: string): boolean {
779
+ return text.length > 0 && [...text].every((ch) => ch === "\n" || ch === "\r");
780
+ }
781
+
782
+ function printServeBanner(
783
+ handle: AgentServeHandle,
784
+ opts: {
785
+ noPlayground: boolean;
786
+ dev: boolean;
787
+ bearerToken: boolean;
788
+ noSchedules: boolean;
789
+ }
790
+ ): void {
791
+ const multi = handle.agents.length > 1 || handle.agents[0]?.slug !== "";
792
+ if (multi) {
793
+ process.stdout.write(
794
+ `${handle.agents.length} agents listening on ${handle.url}\n`
795
+ );
796
+ if (!opts.noPlayground) {
797
+ process.stdout.write(` index: ${handle.url}/\n`);
798
+ }
799
+ for (const agent of handle.agents) {
800
+ const info = projectInfo(agent.project);
801
+ const suffix = opts.noPlayground
802
+ ? `${agent.url}/v1/session`
803
+ : `${agent.url}/playground`;
804
+ process.stdout.write(` /${agent.slug} ${info.name} — ${suffix}\n`);
805
+ }
806
+ } else {
807
+ const info = projectInfo(handle.project);
808
+ process.stdout.write(`${info.name} listening on ${handle.url}\n`);
809
+ if (!opts.noPlayground) {
810
+ process.stdout.write(` playground: ${handle.url}/playground\n`);
811
+ }
812
+ process.stdout.write(` POST ${handle.url}/v1/session\n`);
813
+ process.stdout.write(` GET ${handle.url}/v1/session/:sessionId/stream\n`);
814
+ for (const channel of info.channels) {
815
+ if (channel.id === "http") {
816
+ continue;
817
+ }
818
+ for (const route of channel.routes) {
819
+ process.stdout.write(` ${route.method} ${handle.url}${route.url}\n`);
820
+ }
821
+ }
822
+ if (info.schedules.length > 0) {
823
+ const scheduleMode = opts.dev
824
+ ? "dev mode: dispatch with POST /v1/dev/schedules/:scheduleId"
825
+ : opts.noSchedules
826
+ ? "disabled"
827
+ : "running on cron cadence (UTC)";
828
+ process.stdout.write(
829
+ ` schedules: ${info.schedules.map((s) => s.name).join(", ")} — ${scheduleMode}\n`
830
+ );
831
+ }
832
+ }
833
+ if (handle.playgroundDevUrl !== undefined) {
834
+ process.stdout.write(` playground (HMR): ${handle.playgroundDevUrl}\n`);
835
+ }
836
+ if (handle.docsUrl !== undefined) {
837
+ process.stdout.write(` docs: ${handle.docsUrl}\n`);
838
+ }
839
+ if (opts.bearerToken) {
840
+ process.stdout.write(
841
+ " auth: bearer token required on API routes (playground has a token field)\n"
842
+ );
843
+ }
844
+ if (
845
+ opts.dev &&
846
+ (process.env.GITHUB_WEBHOOK_SECRET === undefined ||
847
+ process.env.GITHUB_WEBHOOK_SECRET === "") &&
848
+ handle.agents.some((agent) =>
849
+ projectInfo(agent.project).channels.some((c) => c.kind === "github")
850
+ )
851
+ ) {
852
+ process.stdout.write(
853
+ ` github: dev accepts unsigned loopback deliveries (${CLI} github forward works without a secret; set GITHUB_WEBHOOK_SECRET to verify signatures)\n`
854
+ );
855
+ }
856
+ }
857
+
858
+ function formatModel(model: unknown): string {
859
+ if (model === undefined) {
860
+ return "(unset)";
861
+ }
862
+ if (typeof model === "string") {
863
+ return model;
864
+ }
865
+ return JSON.stringify(model);
866
+ }
867
+
868
+ /**
869
+ * The Cursor SDK's Connect/HTTP2 client sometimes emits uncaught stream
870
+ * or TLS errors (notably `NGHTTP2_FRAME_SIZE_ERROR` on large shell/tool
871
+ * payloads, and mid-handshake socket disconnects) outside the promise
872
+ * `run.wait()` returns. Without a listener the unhandled rejection exits
873
+ * the whole agent-serve process with code 1. Swallow those transport
874
+ * failures so turns can fail cleanly and the server stays up.
875
+ */
876
+ function installTransportErrorGuards(): void {
877
+ const isTransportNoise = (reason: unknown): boolean => {
878
+ const message =
879
+ reason instanceof Error
880
+ ? `${reason.message}\n${reason.stack ?? ""}`
881
+ : String(reason);
882
+ const code =
883
+ reason !== null &&
884
+ typeof reason === "object" &&
885
+ "code" in reason &&
886
+ typeof (reason as { code: unknown }).code === "string"
887
+ ? (reason as { code: string }).code
888
+ : undefined;
889
+ return (
890
+ code === "ERR_HTTP2_STREAM_ERROR" ||
891
+ code === "ECONNRESET" ||
892
+ code === "ECONNREFUSED" ||
893
+ code === "EPIPE" ||
894
+ code === "ETIMEDOUT" ||
895
+ code === "ENOTFOUND" ||
896
+ code === "EAI_AGAIN" ||
897
+ message.includes("NGHTTP2_FRAME_SIZE_ERROR") ||
898
+ message.includes("Stream closed with error code") ||
899
+ message.includes(
900
+ "Client network socket disconnected before secure TLS connection was established"
901
+ ) ||
902
+ message.includes("socket hang up") ||
903
+ message.includes("other side closed")
904
+ );
905
+ };
906
+ const log = (label: string, reason: unknown): void => {
907
+ const text = reason instanceof Error ? reason.message : String(reason);
908
+ process.stderr.write(
909
+ `[agent-serve] ${label} (server stays up): ${text.slice(0, 400)}\n`
910
+ );
911
+ };
912
+ process.on("unhandledRejection", (reason) => {
913
+ if (isTransportNoise(reason)) {
914
+ log("swallowed unhandledRejection", reason);
915
+ return;
916
+ }
917
+ log("unhandledRejection", reason);
918
+ });
919
+ process.on("uncaughtException", (error) => {
920
+ if (isTransportNoise(error)) {
921
+ log("swallowed uncaughtException", error);
922
+ return;
923
+ }
924
+ process.stderr.write(
925
+ `[agent-serve] uncaughtException: ${error.stack ?? error.message}\n`
926
+ );
927
+ process.exit(1);
928
+ });
929
+ }
930
+
931
+ installTransportErrorGuards();
932
+
933
+ // Authored agent files are TypeScript imported at runtime; install the tsx
934
+ // loader (and the framework import aliases on compiled runs) before any
935
+ // command touches a project.
936
+ registerAuthoredModuleLoaders()
937
+ .then(() => main(process.argv.slice(2)))
938
+ .then(
939
+ (code) => {
940
+ // Ephemeral run/eval can leave SDK/HTTP handles open; force exit.
941
+ process.exit(code);
942
+ },
943
+ (error) => {
944
+ process.stderr.write(
945
+ `${error instanceof Error ? error.message : String(error)}\n`
946
+ );
947
+ process.exit(1);
948
+ }
949
+ );