@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,106 @@
1
+ /**
2
+ * Schedule resolution for reminders (`every` / `cron` / `delay` / `at`).
3
+ */
4
+
5
+ import type { ReminderCreateInput, ReminderScheduleKind } from "../types.js";
6
+ import { parseCron } from "./cron.js";
7
+ import { parseDuration } from "./duration.js";
8
+
9
+ export class ReminderValidationError extends Error {
10
+ constructor(message: string) {
11
+ super(message);
12
+ this.name = "ReminderValidationError";
13
+ }
14
+ }
15
+
16
+ /** Node setTimeout overflows past ~2^31-1 ms (~24.8d); chunk long waits. */
17
+ export const MAX_TIMER_MS = 2_147_483_647;
18
+
19
+ export interface ResolvedSchedule {
20
+ kind: ReminderScheduleKind;
21
+ value: string;
22
+ intervalMs?: number;
23
+ nextFireAtMs: number;
24
+ }
25
+
26
+ /** Resolve create-input schedule fields into a concrete next-fire plan. */
27
+ export function resolveSchedule(input: ReminderCreateInput): ResolvedSchedule {
28
+ const shapes = [
29
+ input.every !== undefined,
30
+ input.cron !== undefined,
31
+ input.delay !== undefined,
32
+ input.at !== undefined,
33
+ ].filter(Boolean);
34
+ if (shapes.length !== 1) {
35
+ throw new ReminderValidationError(
36
+ "reminders.create requires exactly one of every, cron, delay, or at"
37
+ );
38
+ }
39
+
40
+ const now = Date.now();
41
+ if (input.every !== undefined) {
42
+ const intervalMs = parseDuration(input.every);
43
+ if (intervalMs <= 0) {
44
+ throw new ReminderValidationError(
45
+ `every must be > 0 (got ${input.every})`
46
+ );
47
+ }
48
+ return {
49
+ kind: "every",
50
+ value: String(input.every),
51
+ intervalMs,
52
+ nextFireAtMs: now + intervalMs,
53
+ };
54
+ }
55
+ if (input.cron !== undefined) {
56
+ parseCron(input.cron); // validate
57
+ return {
58
+ kind: "cron",
59
+ value: input.cron,
60
+ nextFireAtMs: nextCronFireMs(input.cron, now),
61
+ };
62
+ }
63
+ if (input.delay !== undefined) {
64
+ const delayMs = parseDuration(input.delay);
65
+ return {
66
+ kind: "delay",
67
+ value: String(input.delay),
68
+ nextFireAtMs: now + delayMs,
69
+ };
70
+ }
71
+ const atMs =
72
+ typeof input.at === "number"
73
+ ? input.at
74
+ : input.at instanceof Date
75
+ ? input.at.getTime()
76
+ : Date.parse(String(input.at));
77
+ if (!Number.isFinite(atMs)) {
78
+ throw new ReminderValidationError(`Invalid at time: ${String(input.at)}`);
79
+ }
80
+ return {
81
+ kind: "at",
82
+ value:
83
+ typeof input.at === "string" ? input.at : new Date(atMs).toISOString(),
84
+ nextFireAtMs: atMs,
85
+ };
86
+ }
87
+
88
+ /** Next UTC fire strictly after `afterMs` for a 5-field cron. */
89
+ export function nextCronFireMs(cronSource: string, afterMs: number): number {
90
+ try {
91
+ return parseCron(cronSource).nextFire(new Date(afterMs)).getTime();
92
+ } catch (error) {
93
+ throw new ReminderValidationError(
94
+ error instanceof Error
95
+ ? error.message
96
+ : `Could not find next fire for cron "${cronSource}"`
97
+ );
98
+ }
99
+ }
100
+
101
+ /** Default busy policy: recurring may skip; one-shots queue behind the turn. */
102
+ export function defaultBusyPolicy(
103
+ kind: ReminderScheduleKind
104
+ ): "skipIfBusy" | "queueBehindTurn" {
105
+ return kind === "every" || kind === "cron" ? "skipIfBusy" : "queueBehindTurn";
106
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Durable reminder instance store under `<stateRoot>/reminders/`.
3
+ *
4
+ * Handlers (`run` / function `until`) are not serializable — they live only
5
+ * in the in-memory {@link ReminderRunner} registry. Disk holds schedule,
6
+ * prompt, target, and status so one-shots / recurring ticks survive restart
7
+ * for prompt-form reminders.
8
+ */
9
+
10
+ import {
11
+ mkdir,
12
+ readdir,
13
+ readFile,
14
+ rename,
15
+ rm,
16
+ writeFile,
17
+ } from "node:fs/promises";
18
+ import { join } from "node:path";
19
+ import type {
20
+ ReminderBusyPolicy,
21
+ ReminderScheduleKind,
22
+ ReminderStatus,
23
+ } from "../types.js";
24
+
25
+ export const REMINDER_SNAPSHOT_VERSION = 1 as const;
26
+
27
+ export type {
28
+ ReminderBusyPolicy,
29
+ ReminderScheduleKind,
30
+ ReminderStatus,
31
+ } from "../types.js";
32
+
33
+ /** Serializable reminder record (no function bodies). */
34
+ export interface ReminderRecord {
35
+ version: typeof REMINDER_SNAPSHOT_VERSION;
36
+ id: string;
37
+ purpose: string;
38
+ /** Channel that owns the target session (e.g. `drive`, `http`). */
39
+ channelId: string;
40
+ /** Channel-local continuation key (not the wire `channel:key` token). */
41
+ continuationToken: string;
42
+ /** Optional opaque target metadata (e.g. `{ prUrl }`). */
43
+ target?: Record<string, unknown>;
44
+ scheduleKind: ReminderScheduleKind;
45
+ /** Raw schedule value: every/delay string, cron expression, or ISO `at`. */
46
+ scheduleValue: string;
47
+ intervalMs?: number;
48
+ /** Prompt form — mutually exclusive with in-memory `run`. */
49
+ prompt?: string;
50
+ /**
51
+ * True when create() registered a `run` handler. Handlers are not
52
+ * serializable; after restart, armed records with this flag and no live
53
+ * handler are disarmed instead of falling back to a generic prompt.
54
+ */
55
+ hasRunHandler: boolean;
56
+ /** True when create() registered a function `until` (in-memory only). */
57
+ hasUntilFn: boolean;
58
+ /** Natural-language until (agent-facing); function until is in-memory only. */
59
+ untilPrompt?: string;
60
+ busyPolicy: ReminderBusyPolicy;
61
+ status: ReminderStatus;
62
+ disarmReason?: string;
63
+ fireCount: number;
64
+ nextFireAtMs: number;
65
+ createdAt: string;
66
+ updatedAt: string;
67
+ }
68
+
69
+ export class ReminderStore {
70
+ constructor(private readonly rootDir: string) {}
71
+
72
+ private filePath(id: string): string {
73
+ return join(this.rootDir, `${id}.json`);
74
+ }
75
+
76
+ async ensureRoot(): Promise<void> {
77
+ await mkdir(this.rootDir, { recursive: true });
78
+ }
79
+
80
+ async list(): Promise<ReminderRecord[]> {
81
+ await this.ensureRoot();
82
+ let names: string[];
83
+ try {
84
+ names = await readdir(this.rootDir);
85
+ } catch {
86
+ return [];
87
+ }
88
+ const records: ReminderRecord[] = [];
89
+ for (const name of names) {
90
+ if (!name.endsWith(".json")) continue;
91
+ const record = await this.get(name.slice(0, -".json".length));
92
+ if (record !== undefined) {
93
+ records.push(record);
94
+ }
95
+ }
96
+ return records;
97
+ }
98
+
99
+ async listArmed(): Promise<ReminderRecord[]> {
100
+ const all = await this.list();
101
+ return all.filter((r) => r.status === "armed");
102
+ }
103
+
104
+ async get(id: string): Promise<ReminderRecord | undefined> {
105
+ try {
106
+ const raw = await readFile(this.filePath(id), "utf8");
107
+ const parsed = JSON.parse(raw) as ReminderRecord;
108
+ if (parsed.version !== REMINDER_SNAPSHOT_VERSION) {
109
+ return undefined;
110
+ }
111
+ if (typeof parsed.id !== "string" || parsed.id !== id) {
112
+ return undefined;
113
+ }
114
+ return parsed;
115
+ } catch (error) {
116
+ if (
117
+ error !== null &&
118
+ typeof error === "object" &&
119
+ "code" in error &&
120
+ (error as { code?: string }).code === "ENOENT"
121
+ ) {
122
+ return undefined;
123
+ }
124
+ return undefined;
125
+ }
126
+ }
127
+
128
+ async save(record: ReminderRecord): Promise<void> {
129
+ await this.ensureRoot();
130
+ const path = this.filePath(record.id);
131
+ const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
132
+ const body = `${JSON.stringify(record, null, 2)}\n`;
133
+ try {
134
+ await writeFile(tmp, body, "utf8");
135
+ await rename(tmp, path);
136
+ } catch (error) {
137
+ await rm(tmp, { force: true }).catch(() => {});
138
+ throw error;
139
+ }
140
+ }
141
+
142
+ async delete(id: string): Promise<void> {
143
+ await rm(this.filePath(id), { force: true });
144
+ }
145
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Serve-time connection resolution for one mounted agent: once the host is
3
+ * listening (port known), symbolic transports — peers and the Cursor
4
+ * account bridge — resolve to concrete URLs and join the engine's
5
+ * resolved-connection set. Local turns call both over loopback; cloud
6
+ * turns use the serve `publicUrl` for peers and the account's native
7
+ * connectors instead of the bridge.
8
+ */
9
+
10
+ import type { AgentProject } from "../types.js";
11
+ import {
12
+ type CursorAccountConnectionRef,
13
+ type CursorAccountMcpBridge,
14
+ resolveCursorAccountConnections,
15
+ } from "./cursor/account-mcp.js";
16
+ import {
17
+ type PeerConnectionRef,
18
+ resolvePeerConnections,
19
+ } from "./peer-connections.js";
20
+ import type { EngineResolvedConnection } from "./session-engine.js";
21
+
22
+ /** Fail fast before listen when static cloud config cannot honor `servers`. */
23
+ export function validateMountConnectionsConfig(args: {
24
+ slug: string;
25
+ project: AgentProject;
26
+ accountRefs?: CursorAccountConnectionRef[];
27
+ publicUrl?: string;
28
+ }): void {
29
+ if (args.accountRefs === undefined || args.accountRefs.length === 0) {
30
+ return;
31
+ }
32
+ const agent = args.project.agent;
33
+ const cloudCapable = agent.runtime === "cloud" || agent.cloud !== undefined;
34
+ if (!cloudCapable || args.publicUrl !== undefined) {
35
+ return;
36
+ }
37
+ const label = args.slug === "" ? args.project.name : args.slug;
38
+ const filteredRefs = args.accountRefs.filter(
39
+ (ref) => ref.servers !== undefined
40
+ );
41
+ if (filteredRefs.length === 0) {
42
+ return;
43
+ }
44
+ throw new Error(
45
+ `[agent-serve] agent "${label}" has Cursor account MCP connections with \`servers\` filters (${filteredRefs
46
+ .map((ref) => ref.name)
47
+ .join(
48
+ ", "
49
+ )}) but no --public-url; cloud-runtime turns cannot honor those filters without a public bridge URL. Set --public-url or remove the \`servers\` filter.`
50
+ );
51
+ }
52
+
53
+ /** Fail closed when a cloud turn cannot honor a `servers` filter. */
54
+ export function assertCloudCanHonorAccountServersFilters(args: {
55
+ runtime: "local" | "cloud";
56
+ resolvedConnections: readonly EngineResolvedConnection[];
57
+ }): void {
58
+ if (args.runtime !== "cloud") {
59
+ return;
60
+ }
61
+ const blocked = args.resolvedConnections.filter(
62
+ (connection) =>
63
+ connection.accountServersFilter !== undefined &&
64
+ connection.cloudUrl === undefined
65
+ );
66
+ if (blocked.length === 0) {
67
+ return;
68
+ }
69
+ throw new Error(
70
+ `[agent-serve] cloud turn cannot honor Cursor account \`servers\` filters (${blocked
71
+ .map((connection) => connection.name)
72
+ .join(
73
+ ", "
74
+ )}) without --public-url; set --public-url so cloud turns reach the filtered account bridge instead of falling back to native connectors.`
75
+ );
76
+ }
77
+
78
+ /** Fail closed when anonymous HTTP admission would expose account connectors. */
79
+ export function assertAccountConnectionsNotAnonymous(args: {
80
+ allowAnonymous?: boolean;
81
+ hasAccountConnections: boolean;
82
+ }): void {
83
+ if (args.allowAnonymous === true && args.hasAccountConnections) {
84
+ throw new Error(
85
+ "[agent-serve] --allow-anonymous cannot be used with Cursor account MCP connections (defineConnection({ cursorAccount: true })); use --bearer-token or remove the account MCP connections."
86
+ );
87
+ }
88
+ }
89
+
90
+ export function resolveMountConnections(args: {
91
+ slug: string;
92
+ project: AgentProject;
93
+ serverUrl: string;
94
+ peerRefs?: PeerConnectionRef[];
95
+ accountRefs?: CursorAccountConnectionRef[];
96
+ accountBridge?: CursorAccountMcpBridge;
97
+ publicUrl?: string;
98
+ authToken?: string;
99
+ logger: (line: string) => void;
100
+ }): EngineResolvedConnection[] {
101
+ const agent = args.project.agent;
102
+ const cloudCapable = agent.runtime === "cloud" || agent.cloud !== undefined;
103
+ const label = args.slug === "" ? args.project.name : args.slug;
104
+ const resolved: EngineResolvedConnection[] = [];
105
+
106
+ if (args.peerRefs !== undefined && args.peerRefs.length > 0) {
107
+ const peers = resolvePeerConnections({
108
+ refs: args.peerRefs,
109
+ serverUrl: args.serverUrl,
110
+ ...(args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl }),
111
+ ...(args.authToken === undefined ? {} : { authToken: args.authToken }),
112
+ });
113
+ resolved.push(...peers);
114
+ if (cloudCapable && args.publicUrl === undefined) {
115
+ args.logger(
116
+ `[agent-serve] warning: agent "${label}" has peer MCP connections (${peers
117
+ .map((peer) => peer.name)
118
+ .join(
119
+ ", "
120
+ )}) but no --public-url; cloud-runtime turns cannot reach this host's loopback address, so peers are omitted from cloud turns.`
121
+ );
122
+ }
123
+ }
124
+
125
+ if (args.accountRefs !== undefined && args.accountBridge !== undefined) {
126
+ resolved.push(
127
+ ...resolveCursorAccountConnections({
128
+ refs: args.accountRefs,
129
+ serverUrl: args.serverUrl,
130
+ basePath: args.slug === "" ? "" : `/${args.slug}`,
131
+ bridgeSecret: args.accountBridge.secret,
132
+ ...(args.publicUrl === undefined ? {} : { publicUrl: args.publicUrl }),
133
+ })
134
+ );
135
+ // Non-blocking startup DX: connector statuses land in the serve log.
136
+ args.accountBridge.logPreflight(args.accountRefs);
137
+ if (cloudCapable && args.publicUrl === undefined) {
138
+ args.logger(
139
+ `[agent-serve] agent "${label}": cloud-runtime turns omit the account bridge without --public-url (cloud agents fall back to the account's native connectors).`
140
+ );
141
+ }
142
+ }
143
+
144
+ return resolved;
145
+ }
@@ -0,0 +1,268 @@
1
+ import { spawn } from "node:child_process";
2
+
3
+ export type ReviewCommentPublisher = "local_gh";
4
+
5
+ export type ReviewCommentPostResult = {
6
+ posted: boolean;
7
+ publisher: ReviewCommentPublisher;
8
+ mode: "review_with_inline_comments" | "review_body_only" | "skipped";
9
+ inlineCommentCount: number;
10
+ detail: string;
11
+ };
12
+
13
+ export type ReviewInlineComment = {
14
+ file: string;
15
+ line: number;
16
+ start_line?: number;
17
+ body: string;
18
+ };
19
+
20
+ export type ReviewCommentPostArgs = {
21
+ prUrl: string;
22
+ reviewedHeadSha: string;
23
+ message: string;
24
+ comments: ReviewInlineComment[];
25
+ cleanupPrevious?: boolean;
26
+ signal?: AbortSignal;
27
+ };
28
+
29
+ export type ReviewCommentsRequest = {
30
+ provider: "github";
31
+ repo: string;
32
+ prNumber: number;
33
+ headSha: string;
34
+ message: string;
35
+ comments: ReviewInlineComment[];
36
+ cleanupPrevious: boolean;
37
+ };
38
+
39
+ export type ReviewCommentPublisherImplementation = {
40
+ postReview: (args: ReviewCommentPostArgs) => Promise<ReviewCommentPostResult>;
41
+ };
42
+
43
+ type ParsedGithubPrUrl = {
44
+ repo: string;
45
+ prNumber: number;
46
+ };
47
+
48
+ /**
49
+ * Prepares the provider-neutral review payload used by local `gh` posting.
50
+ */
51
+ export function prepareReviewCommentsRequest(
52
+ args: ReviewCommentPostArgs
53
+ ):
54
+ | { kind: "prepared"; request: ReviewCommentsRequest }
55
+ | { kind: "skipped"; result: ReviewCommentPostResult } {
56
+ const target = parseGithubPrUrl(args.prUrl);
57
+ if (target.kind === "invalid") {
58
+ return { kind: "skipped", result: skipped(target.detail) };
59
+ }
60
+
61
+ return {
62
+ kind: "prepared",
63
+ request: {
64
+ provider: "github",
65
+ repo: target.value.repo,
66
+ prNumber: target.value.prNumber,
67
+ headSha: args.reviewedHeadSha,
68
+ message: args.message,
69
+ comments: args.comments,
70
+ cleanupPrevious: args.cleanupPrevious ?? true,
71
+ },
72
+ };
73
+ }
74
+
75
+ /**
76
+ * Posts a PR review with the local `gh` credentials (`gh auth` / GITHUB_TOKEN /
77
+ * GH_TOKEN). Does not use the security-bugbot comments service.
78
+ */
79
+ export function createLocalGhReviewPublisher(): ReviewCommentPublisherImplementation {
80
+ return {
81
+ async postReview(args) {
82
+ return postReviewViaLocalGh(args);
83
+ },
84
+ };
85
+ }
86
+
87
+ async function postReviewViaLocalGh(
88
+ args: ReviewCommentPostArgs
89
+ ): Promise<ReviewCommentPostResult> {
90
+ const prepared = prepareReviewCommentsRequest(args);
91
+ if (prepared.kind === "skipped") {
92
+ return prepared.result;
93
+ }
94
+
95
+ const { request } = prepared;
96
+ const path = `repos/${request.repo}/pulls/${request.prNumber}/reviews`;
97
+ const payload = {
98
+ commit_id: request.headSha,
99
+ body: request.message,
100
+ event: "COMMENT",
101
+ comments: request.comments.map(toGithubReviewComment),
102
+ };
103
+
104
+ try {
105
+ args.signal?.throwIfAborted();
106
+ const response = await ghApiPostJson(path, payload, args.signal);
107
+ const htmlUrl =
108
+ typeof response.html_url === "string" ? response.html_url : undefined;
109
+ const inlineCommentCount = request.comments.length;
110
+ return {
111
+ posted: true,
112
+ publisher: "local_gh",
113
+ mode:
114
+ inlineCommentCount > 0
115
+ ? "review_with_inline_comments"
116
+ : "review_body_only",
117
+ inlineCommentCount,
118
+ detail: htmlUrl
119
+ ? `posted via local gh: ${htmlUrl}`
120
+ : `posted via local gh with ${inlineCommentCount} inline comment(s)`,
121
+ };
122
+ } catch (error) {
123
+ if (args.signal?.aborted) {
124
+ throw error;
125
+ }
126
+ return skipped(
127
+ `local gh review post failed: ${error instanceof Error ? error.message : String(error)}`
128
+ );
129
+ }
130
+ }
131
+
132
+ function toGithubReviewComment(
133
+ comment: ReviewInlineComment
134
+ ): Record<string, string | number> {
135
+ const body: Record<string, string | number> = {
136
+ path: comment.file,
137
+ body: comment.body,
138
+ line: comment.line,
139
+ side: "RIGHT",
140
+ };
141
+ if (
142
+ comment.start_line !== undefined &&
143
+ comment.start_line > 0 &&
144
+ comment.start_line !== comment.line
145
+ ) {
146
+ body.start_line = comment.start_line;
147
+ body.start_side = "RIGHT";
148
+ }
149
+ return body;
150
+ }
151
+
152
+ function skipped(detail: string): ReviewCommentPostResult {
153
+ return {
154
+ posted: false,
155
+ publisher: "local_gh",
156
+ mode: "skipped",
157
+ inlineCommentCount: 0,
158
+ detail,
159
+ };
160
+ }
161
+
162
+ function parseGithubPrUrl(
163
+ prUrl: string
164
+ ):
165
+ | { kind: "valid"; value: ParsedGithubPrUrl }
166
+ | { kind: "invalid"; detail: string } {
167
+ let url: URL;
168
+ try {
169
+ url = new URL(prUrl);
170
+ } catch (error) {
171
+ return {
172
+ kind: "invalid",
173
+ detail: `unparseable PR URL: ${error instanceof Error ? error.message : String(error)}`,
174
+ };
175
+ }
176
+
177
+ if (url.hostname !== "github.com") {
178
+ return {
179
+ kind: "invalid",
180
+ detail: "local gh publisher only supports github.com PRs",
181
+ };
182
+ }
183
+
184
+ const parts = url.pathname.split("/").filter(Boolean);
185
+ if (parts.length !== 4 || parts[2] !== "pull") {
186
+ return {
187
+ kind: "invalid",
188
+ detail:
189
+ "unparseable PR URL: expected https://github.com/{owner}/{repo}/pull/{number}",
190
+ };
191
+ }
192
+
193
+ const prNumber = Number(parts[3]);
194
+ if (!Number.isInteger(prNumber) || prNumber <= 0) {
195
+ return {
196
+ kind: "invalid",
197
+ detail:
198
+ "unparseable PR URL: pull request number must be a positive integer",
199
+ };
200
+ }
201
+
202
+ return {
203
+ kind: "valid",
204
+ value: {
205
+ repo: `${parts[0]}/${parts[1]}`,
206
+ prNumber,
207
+ },
208
+ };
209
+ }
210
+
211
+ async function ghApiPostJson(
212
+ path: string,
213
+ payload: unknown,
214
+ signal?: AbortSignal
215
+ ): Promise<Record<string, unknown>> {
216
+ return new Promise((resolvePromise, rejectPromise) => {
217
+ const child = spawn(
218
+ "gh",
219
+ ["api", path, "--method", "POST", "--input", "-"],
220
+ {
221
+ env: { ...process.env, GH_PROMPT_DISABLED: "1" },
222
+ stdio: ["pipe", "pipe", "pipe"],
223
+ }
224
+ );
225
+ let stdout = "";
226
+ let stderr = "";
227
+ const onAbort = () => {
228
+ child.kill("SIGTERM");
229
+ rejectPromise(signal?.reason ?? new Error("aborted"));
230
+ };
231
+ signal?.addEventListener("abort", onAbort, { once: true });
232
+ child.stdout.on("data", (chunk) => {
233
+ stdout += String(chunk);
234
+ });
235
+ child.stderr.on("data", (chunk) => {
236
+ stderr += String(chunk);
237
+ });
238
+ child.on("error", (error) => {
239
+ signal?.removeEventListener("abort", onAbort);
240
+ rejectPromise(error);
241
+ });
242
+ child.on("close", (code) => {
243
+ signal?.removeEventListener("abort", onAbort);
244
+ if (code !== 0) {
245
+ rejectPromise(
246
+ new Error(
247
+ `gh api ${path} exited with ${code}: ${stderr.trim().slice(0, 2000)}`
248
+ )
249
+ );
250
+ return;
251
+ }
252
+ if (!stdout.trim()) {
253
+ resolvePromise({});
254
+ return;
255
+ }
256
+ try {
257
+ resolvePromise(JSON.parse(stdout) as Record<string, unknown>);
258
+ } catch (error) {
259
+ rejectPromise(
260
+ new Error(
261
+ `gh api ${path} returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`
262
+ )
263
+ );
264
+ }
265
+ });
266
+ child.stdin.end(JSON.stringify(payload));
267
+ });
268
+ }