@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,272 @@
1
+ /**
2
+ * Maps the Cursor harness's streaming delta vocabulary
3
+ * (`InteractionUpdate`) onto the framework's channel event vocabulary
4
+ * (`SessionEvent` payloads). One mapper instance covers one turn.
5
+ */
6
+
7
+ import type { InteractionUpdate, ToolCall } from "@cursor/sdk";
8
+ import type { SessionEventPayload, TurnUsage } from "../types.js";
9
+
10
+ const CUSTOM_TOOLS_PROVIDER = "custom-user-tools";
11
+
12
+ export interface ToolCallDescription {
13
+ toolName: string;
14
+ args?: unknown;
15
+ subagent?: { name?: string; description?: string };
16
+ }
17
+
18
+ export interface ToolResultDescription {
19
+ output?: unknown;
20
+ isError: boolean;
21
+ }
22
+
23
+ export class TurnEventMapper {
24
+ private textAccumulator = "";
25
+ private reasoningAccumulator = "";
26
+ private usageTotal: TurnUsage | undefined;
27
+ private lastAssistantText: string | undefined;
28
+ private summaryTitle: string | undefined;
29
+
30
+ constructor(private readonly emit: (payload: SessionEventPayload) => void) {}
31
+
32
+ /** Per-turn token usage summed across model steps. */
33
+ get usage(): TurnUsage | undefined {
34
+ return this.usageTotal;
35
+ }
36
+
37
+ /** The final assistant text block of the turn, when one was produced. */
38
+ get finalText(): string | undefined {
39
+ return this.lastAssistantText;
40
+ }
41
+
42
+ /** Conversation summary produced by the harness (used as session title). */
43
+ get title(): string | undefined {
44
+ return this.summaryTitle;
45
+ }
46
+
47
+ handleUpdate(update: InteractionUpdate): void {
48
+ switch (update.type) {
49
+ case "text-delta": {
50
+ this.textAccumulator += update.text;
51
+ this.emit({
52
+ type: "message.appended",
53
+ data: { delta: update.text, text: this.textAccumulator },
54
+ });
55
+ return;
56
+ }
57
+ case "thinking-delta": {
58
+ this.reasoningAccumulator += update.text;
59
+ this.emit({
60
+ type: "reasoning.appended",
61
+ data: { delta: update.text, text: this.reasoningAccumulator },
62
+ });
63
+ return;
64
+ }
65
+ case "thinking-completed": {
66
+ if (this.reasoningAccumulator !== "") {
67
+ this.reasoningAccumulator = "";
68
+ }
69
+ this.emit({
70
+ type: "reasoning.completed",
71
+ data: { durationMs: update.thinkingDurationMs },
72
+ });
73
+ return;
74
+ }
75
+ case "tool-call-started": {
76
+ this.flushAssistantText("tool_call");
77
+ const description = describeToolCall(update.toolCall);
78
+ this.emit({
79
+ type: "actions.requested",
80
+ data: {
81
+ calls: [
82
+ {
83
+ callId: update.callId,
84
+ toolName: description.toolName,
85
+ args: description.args,
86
+ },
87
+ ],
88
+ },
89
+ });
90
+ if (description.subagent !== undefined) {
91
+ this.emit({
92
+ type: "subagent.called",
93
+ data: {
94
+ callId: update.callId,
95
+ name: description.subagent.name,
96
+ description: description.subagent.description,
97
+ },
98
+ });
99
+ }
100
+ return;
101
+ }
102
+ case "tool-call-completed": {
103
+ const description = describeToolCall(update.toolCall);
104
+ const result = describeToolResult(update.toolCall);
105
+ this.emit({
106
+ type: "action.result",
107
+ data: {
108
+ callId: update.callId,
109
+ toolName: description.toolName,
110
+ output: result.output,
111
+ isError: result.isError,
112
+ },
113
+ });
114
+ if (description.subagent !== undefined) {
115
+ this.emit({
116
+ type: "subagent.completed",
117
+ data: { callId: update.callId, name: description.subagent.name },
118
+ });
119
+ }
120
+ return;
121
+ }
122
+ case "step-started": {
123
+ this.emit({ type: "step.started", data: { stepId: update.stepId } });
124
+ return;
125
+ }
126
+ case "step-completed": {
127
+ this.emit({
128
+ type: "step.completed",
129
+ data: { stepId: update.stepId, durationMs: update.stepDurationMs },
130
+ });
131
+ return;
132
+ }
133
+ case "turn-ended": {
134
+ if (update.usage !== undefined) {
135
+ this.usageTotal = addUsage(this.usageTotal, update.usage);
136
+ }
137
+ return;
138
+ }
139
+ case "summary": {
140
+ this.summaryTitle = update.summary;
141
+ return;
142
+ }
143
+ case "user-message-appended":
144
+ case "partial-tool-call":
145
+ case "token-delta":
146
+ case "summary-started":
147
+ case "summary-completed":
148
+ case "shell-output-delta":
149
+ return;
150
+ default: {
151
+ // Future harness update types are ignored rather than fatal.
152
+ return;
153
+ }
154
+ }
155
+ }
156
+
157
+ /** Close out the turn: finalize any open assistant text block. */
158
+ finish(): void {
159
+ this.flushAssistantText("stop");
160
+ }
161
+
162
+ private flushAssistantText(finishReason: "stop" | "tool_call"): void {
163
+ if (this.textAccumulator === "") {
164
+ return;
165
+ }
166
+ const text = this.textAccumulator;
167
+ this.textAccumulator = "";
168
+ this.lastAssistantText = text;
169
+ this.emit({
170
+ type: "message.completed",
171
+ data: { text, finishReason },
172
+ });
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Human-meaningful tool identity for stream events. In-process tools calls
178
+ * arrive as MCP calls against the synthetic `custom-user-tools` server; they
179
+ * surface under the customer's bare tool name.
180
+ */
181
+ export function describeToolCall(toolCall: ToolCall): ToolCallDescription {
182
+ switch (toolCall.type) {
183
+ case "mcp": {
184
+ const providerIdentifier = toolCall.args.providerIdentifier;
185
+ const toolName = toolCall.args.toolName;
186
+ if (providerIdentifier === CUSTOM_TOOLS_PROVIDER) {
187
+ return {
188
+ toolName: toolName ?? "custom-tool",
189
+ args: toolCall.args.args,
190
+ };
191
+ }
192
+ const bareName = toolName ?? "tool";
193
+ return {
194
+ toolName:
195
+ providerIdentifier === undefined || providerIdentifier === ""
196
+ ? bareName
197
+ : `${providerIdentifier}:${bareName}`,
198
+ args: toolCall.args.args,
199
+ };
200
+ }
201
+ case "task": {
202
+ const subagentType = toolCall.args.subagentType;
203
+ const subagentName = subagentType?.name ?? subagentType?.kind;
204
+ return {
205
+ toolName: "task",
206
+ args: {
207
+ description: toolCall.args.description,
208
+ ...(subagentName === undefined ? {} : { subagentType: subagentName }),
209
+ },
210
+ subagent: {
211
+ ...(subagentName === undefined ? {} : { name: subagentName }),
212
+ description: toolCall.args.description,
213
+ },
214
+ };
215
+ }
216
+ default: {
217
+ return {
218
+ toolName: toolCall.type,
219
+ args: (toolCall as { args?: unknown }).args,
220
+ };
221
+ }
222
+ }
223
+ }
224
+
225
+ export function describeToolResult(toolCall: ToolCall): ToolResultDescription {
226
+ const result = (toolCall as { result?: unknown }).result as
227
+ | { status: "success"; value: unknown }
228
+ | { status: "error"; error: unknown }
229
+ | undefined;
230
+ if (result === undefined || result === null) {
231
+ return { isError: false };
232
+ }
233
+ if (result.status === "error") {
234
+ return { output: result.error, isError: true };
235
+ }
236
+
237
+ if (toolCall.type === "mcp") {
238
+ const value = result.value as {
239
+ content?: Array<{ text?: { text: string } }>;
240
+ isError?: boolean;
241
+ };
242
+ const text = (value.content ?? [])
243
+ .map((item) => item.text?.text ?? "")
244
+ .filter((part) => part !== "")
245
+ .join("\n");
246
+ return {
247
+ output: text === "" ? value : text,
248
+ isError: value.isError === true,
249
+ };
250
+ }
251
+
252
+ return { output: result.value, isError: false };
253
+ }
254
+
255
+ function addUsage(total: TurnUsage | undefined, usage: TurnUsage): TurnUsage {
256
+ if (total === undefined) {
257
+ return { ...usage };
258
+ }
259
+ return {
260
+ inputTokens: total.inputTokens + usage.inputTokens,
261
+ outputTokens: total.outputTokens + usage.outputTokens,
262
+ cacheReadTokens: total.cacheReadTokens + usage.cacheReadTokens,
263
+ cacheWriteTokens: total.cacheWriteTokens + usage.cacheWriteTokens,
264
+ ...(total.reasoningTokens !== undefined ||
265
+ usage.reasoningTokens !== undefined
266
+ ? {
267
+ reasoningTokens:
268
+ (total.reasoningTokens ?? 0) + (usage.reasoningTokens ?? 0),
269
+ }
270
+ : {}),
271
+ };
272
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Minimal frontmatter parser. Supports the flat `key: value` scalar subset
3
+ * used by authored markdown (skill descriptions, schedule cron expressions)
4
+ * without pulling in a YAML dependency.
5
+ */
6
+
7
+ export interface ParsedFrontmatter {
8
+ data: Record<string, string>;
9
+ body: string;
10
+ }
11
+
12
+ const FRONTMATTER_OPEN = /^---\s*$/;
13
+
14
+ export function parseFrontmatter(source: string): ParsedFrontmatter {
15
+ const lines = source.split(/\r?\n/);
16
+ if (lines.length === 0 || !FRONTMATTER_OPEN.test(lines[0] ?? "")) {
17
+ return { data: {}, body: source };
18
+ }
19
+
20
+ let closeIndex = -1;
21
+ for (let i = 1; i < lines.length; i++) {
22
+ if (FRONTMATTER_OPEN.test(lines[i] ?? "")) {
23
+ closeIndex = i;
24
+ break;
25
+ }
26
+ }
27
+ if (closeIndex === -1) {
28
+ return { data: {}, body: source };
29
+ }
30
+
31
+ const data: Record<string, string> = {};
32
+ for (const line of lines.slice(1, closeIndex)) {
33
+ if (line.trim() === "" || line.trim().startsWith("#")) {
34
+ continue;
35
+ }
36
+ const separator = line.indexOf(":");
37
+ if (separator === -1) {
38
+ continue;
39
+ }
40
+ const key = line.slice(0, separator).trim();
41
+ if (key === "") {
42
+ continue;
43
+ }
44
+ data[key] = unquote(line.slice(separator + 1).trim());
45
+ }
46
+
47
+ const body = lines
48
+ .slice(closeIndex + 1)
49
+ .join("\n")
50
+ .replace(/^\n+/, "");
51
+ return { data, body };
52
+ }
53
+
54
+ export function serializeFrontmatter(data: Record<string, string>): string {
55
+ const lines = Object.entries(data).map(
56
+ ([key, value]) => `${key}: ${quoteIfNeeded(value)}`
57
+ );
58
+ return `---\n${lines.join("\n")}\n---\n`;
59
+ }
60
+
61
+ function unquote(value: string): string {
62
+ if (
63
+ value.length >= 2 &&
64
+ ((value.startsWith('"') && value.endsWith('"')) ||
65
+ (value.startsWith("'") && value.endsWith("'")))
66
+ ) {
67
+ return value.slice(1, -1);
68
+ }
69
+ return value;
70
+ }
71
+
72
+ function quoteIfNeeded(value: string): string {
73
+ if (/[:#'"\n]/.test(value)) {
74
+ return JSON.stringify(value);
75
+ }
76
+ return value;
77
+ }
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Local fan-out proxy for `agent-serve github forward`.
3
+ *
4
+ * `gh webhook forward` can only target a single URL, and GitHub allows just one
5
+ * forwarder per repo/org. To feed several GitHub channels at once, we run one
6
+ * forwarder into this loopback proxy, which re-posts each delivery — raw body
7
+ * and signature headers intact, so per-channel `X-Hub-Signature-256` checks
8
+ * still pass — to every channel whose declared event set matches the
9
+ * delivery's `x-github-event`.
10
+ */
11
+
12
+ import {
13
+ createServer,
14
+ type IncomingMessage,
15
+ type ServerResponse,
16
+ } from "node:http";
17
+ import type { AddressInfo } from "node:net";
18
+ import {
19
+ type GitHubForwardTarget,
20
+ targetLabel,
21
+ } from "../channels/github/forward.js";
22
+
23
+ /** Request headers copied verbatim from gh onto each fanned-out delivery. */
24
+ export const FANOUT_FORWARD_HEADERS: readonly string[] = [
25
+ "content-type",
26
+ "x-github-event",
27
+ "x-github-delivery",
28
+ "x-github-hook-id",
29
+ "x-hub-signature",
30
+ "x-hub-signature-256",
31
+ "user-agent",
32
+ "accept",
33
+ ];
34
+
35
+ export interface FanoutServer {
36
+ /** Loopback URL to point `gh webhook forward --url` at. */
37
+ url: string;
38
+ close(): void;
39
+ }
40
+
41
+ export interface FanoutOptions {
42
+ /** Sink for per-delivery failures. Defaults to `process.stderr`. */
43
+ logger?: (line: string) => void;
44
+ }
45
+
46
+ /** Start a loopback proxy that fans deliveries out to {@link targets}. */
47
+ export async function startFanoutServer(
48
+ targets: readonly GitHubForwardTarget[],
49
+ options: FanoutOptions = {}
50
+ ): Promise<FanoutServer> {
51
+ const server = createServer((req, res) => {
52
+ handleFanoutRequest(req, res, targets, options);
53
+ });
54
+ await new Promise<void>((resolve, reject) => {
55
+ server.once("error", reject);
56
+ server.listen(0, "127.0.0.1", () => {
57
+ resolve();
58
+ });
59
+ });
60
+ const address = server.address() as AddressInfo;
61
+ return {
62
+ url: `http://127.0.0.1:${address.port}`,
63
+ close: () => {
64
+ server.close();
65
+ },
66
+ };
67
+ }
68
+
69
+ function handleFanoutRequest(
70
+ req: IncomingMessage,
71
+ res: ServerResponse,
72
+ targets: readonly GitHubForwardTarget[],
73
+ options: FanoutOptions
74
+ ): void {
75
+ const chunks: Buffer[] = [];
76
+ req.on("data", (chunk: Buffer) => {
77
+ chunks.push(chunk);
78
+ });
79
+ req.on("end", () => {
80
+ void fanoutDelivery(Buffer.concat(chunks), req.headers, targets, options)
81
+ .then((delivered) => {
82
+ res.writeHead(200, { "content-type": "application/json" });
83
+ res.end(JSON.stringify({ ok: true, delivered }));
84
+ })
85
+ .catch((error: unknown) => {
86
+ res.writeHead(502, { "content-type": "application/json" });
87
+ res.end(
88
+ JSON.stringify({
89
+ ok: false,
90
+ error: error instanceof Error ? error.message : String(error),
91
+ })
92
+ );
93
+ });
94
+ });
95
+ }
96
+
97
+ /**
98
+ * Re-post a single delivery to the matching targets, returning the labels that
99
+ * accepted it. Only targets whose event set includes the delivery's
100
+ * `x-github-event` receive it (all of them when the header is absent).
101
+ */
102
+ export async function fanoutDelivery(
103
+ body: Buffer,
104
+ headers: IncomingMessage["headers"],
105
+ targets: readonly GitHubForwardTarget[],
106
+ options: FanoutOptions = {}
107
+ ): Promise<string[]> {
108
+ const log = options.logger ?? ((line) => process.stderr.write(line));
109
+ const event =
110
+ typeof headers["x-github-event"] === "string"
111
+ ? headers["x-github-event"]
112
+ : undefined;
113
+ const outbound: Record<string, string> = {};
114
+ for (const name of FANOUT_FORWARD_HEADERS) {
115
+ const value = headers[name];
116
+ if (typeof value === "string") {
117
+ outbound[name] = value;
118
+ }
119
+ }
120
+ const recipients = targets.filter(
121
+ (target) => event === undefined || target.events.includes(event)
122
+ );
123
+ // Reuse one Uint8Array view across recipients (Buffer isn't a BodyInit).
124
+ const payload = new Uint8Array(body);
125
+ const delivered: string[] = [];
126
+ // Bounded by the number of GitHub channels in the project (a handful), so
127
+ // unbounded-concurrency concerns do not apply here.
128
+ await Promise.all(
129
+ recipients.map(async (target) => {
130
+ const label = targetLabel(target);
131
+ try {
132
+ const response = await fetch(target.url, {
133
+ method: "POST",
134
+ headers: outbound,
135
+ body: payload,
136
+ });
137
+ if (!response.ok) {
138
+ log(
139
+ `[agent-serve] delivery to ${label} failed: HTTP ${response.status}\n`
140
+ );
141
+ return;
142
+ }
143
+ delivered.push(label);
144
+ } catch (error) {
145
+ log(
146
+ `[agent-serve] delivery to ${label} failed: ${
147
+ error instanceof Error ? error.message : String(error)
148
+ }\n`
149
+ );
150
+ }
151
+ })
152
+ );
153
+ if (recipients.length > 0 && delivered.length === 0) {
154
+ throw new Error(
155
+ `fan-out delivery failed for all ${recipients.length} matching channel(s)`
156
+ );
157
+ }
158
+ return delivered;
159
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Unified entry for dispatching agent-serve triggers from an external ingress
3
+ * (e.g. the Cursor backend GitHub webhook). Mirrors Automations'
4
+ * `handleAutomationTrigger`, but only GitHub is supported for now.
5
+ *
6
+ * Callers must authenticate the delivery before invoking this (the backend
7
+ * verifies GitHub HMAC at `/github_webhook`). This fan-out does not re-check
8
+ * signatures — same trust model as Bugbot after `verifyGithubRequest`.
9
+ *
10
+ * Each agent's `onPullRequest` / `onComment` / … hooks decide whether to run.
11
+ */
12
+
13
+ import {
14
+ dispatchGitHubWebhook,
15
+ getGitHubChannelOptions,
16
+ } from "../channels/github/github-channel.js";
17
+ import type { GitHubChannelOptions } from "../channels/github/types.js";
18
+ import type { ChannelHandlerArgs } from "../types.js";
19
+
20
+ export interface AgentServeGitHubTriggerTarget {
21
+ /** Agent mount slug (empty string in single-agent mode). */
22
+ slug: string;
23
+ /** Options from the agent's `githubChannel({ ... })` definition. */
24
+ options: GitHubChannelOptions;
25
+ /** Per-agent channel handler args (`send`, `waitUntil`, `host`, …). */
26
+ args: ChannelHandlerArgs;
27
+ }
28
+
29
+ export interface AgentServeGitHubTriggerEvent {
30
+ type: "github";
31
+ /** Raw webhook body (signature already verified by the caller). */
32
+ bodyText: string;
33
+ eventName: string | null;
34
+ deliveryId?: string;
35
+ targets: AgentServeGitHubTriggerTarget[];
36
+ }
37
+
38
+ export type AgentServeTriggerEvent = AgentServeGitHubTriggerEvent;
39
+
40
+ export interface AgentServeTriggerTargetResult {
41
+ slug: string;
42
+ status: number;
43
+ body: unknown;
44
+ }
45
+
46
+ export interface AgentServeTriggerResult {
47
+ ok: boolean;
48
+ event: string | null;
49
+ targets: AgentServeTriggerTargetResult[];
50
+ }
51
+
52
+ /**
53
+ * Build fan-out targets from mounted agent projects that export a github
54
+ * channel created via {@link githubChannel}.
55
+ */
56
+ export function collectGitHubTriggerTargets(input: {
57
+ mounts: Array<{
58
+ slug: string;
59
+ channels: Array<{ id: string; definition: object }>;
60
+ buildHandlerArgs: (channelId: string) => ChannelHandlerArgs;
61
+ }>;
62
+ }): AgentServeGitHubTriggerTarget[] {
63
+ const targets: AgentServeGitHubTriggerTarget[] = [];
64
+ for (const mount of input.mounts) {
65
+ const github = mount.channels.find((channel) => channel.id === "github");
66
+ if (github === undefined) {
67
+ continue;
68
+ }
69
+ const options = getGitHubChannelOptions(github.definition);
70
+ if (options === undefined) {
71
+ continue;
72
+ }
73
+ targets.push({
74
+ slug: mount.slug,
75
+ options,
76
+ args: mount.buildHandlerArgs("github"),
77
+ });
78
+ }
79
+ return targets;
80
+ }
81
+
82
+ /**
83
+ * Dispatch an agent-serve trigger. GitHub only for now.
84
+ */
85
+ export async function handleAgentServeTrigger(
86
+ event: AgentServeTriggerEvent
87
+ ): Promise<AgentServeTriggerResult> {
88
+ switch (event.type) {
89
+ // TODO: Add support for other event types (e.g. Linear, Slack, etc.).
90
+ case "github":
91
+ return handleAgentServeGitHubTrigger(event);
92
+ default: {
93
+ const _: never = event.type;
94
+ throw new Error(
95
+ `handleAgentServeTrigger: unknown event type: ${String(_)}`
96
+ );
97
+ }
98
+ }
99
+ }
100
+
101
+ async function handleAgentServeGitHubTrigger(
102
+ event: AgentServeGitHubTriggerEvent
103
+ ): Promise<AgentServeTriggerResult> {
104
+ if (event.eventName === "ping") {
105
+ return {
106
+ ok: true,
107
+ event: "ping",
108
+ targets: [],
109
+ };
110
+ }
111
+
112
+ let payload: unknown;
113
+ try {
114
+ payload = JSON.parse(event.bodyText) as unknown;
115
+ } catch {
116
+ return {
117
+ ok: false,
118
+ event: event.eventName,
119
+ targets: [
120
+ {
121
+ slug: "",
122
+ status: 400,
123
+ body: { ok: false, error: "invalid_json" },
124
+ },
125
+ ],
126
+ };
127
+ }
128
+
129
+ const targets: AgentServeTriggerTargetResult[] = [];
130
+ for (const target of event.targets) {
131
+ const response = await dispatchGitHubWebhook({
132
+ options: target.options,
133
+ eventName: event.eventName,
134
+ payload,
135
+ deliveryId: event.deliveryId,
136
+ args: target.args,
137
+ });
138
+ let body: unknown;
139
+ try {
140
+ body = await response.json();
141
+ } catch {
142
+ body = { ok: false, error: "invalid_response_json" };
143
+ }
144
+ targets.push({
145
+ slug: target.slug,
146
+ status: response.status,
147
+ body,
148
+ });
149
+ }
150
+
151
+ return {
152
+ ok: true,
153
+ event: event.eventName,
154
+ targets,
155
+ };
156
+ }