@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,1688 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { createHmac, timingSafeEqual } from "node:crypto";
11
+ import { z } from "zod";
12
+ import { allowAll, defineChannel, localDevStrict, loopbackGitHubDev, POST, } from "../../channels.js";
13
+ import { isDevMode } from "../../internal/dev-mode.js";
14
+ import { resolveCredentialValue } from "./auth.js";
15
+ import { buildGitHubBinding, } from "./binding.js";
16
+ import { buildDefaultGitHubEvents } from "./defaults.js";
17
+ import { deriveGitHubWebhookEvents, GITHUB_CHANNEL_KIND } from "./events.js";
18
+ import { emptyGitHubChannelState, githubBindingStateForEvent, } from "./state.js";
19
+ const DEFAULT_PULL_REQUEST_ACTIONS = new Set([
20
+ "opened",
21
+ "reopened",
22
+ "synchronize",
23
+ "ready_for_review",
24
+ ]);
25
+ const repositorySchema = z.object({
26
+ id: z.number().optional(),
27
+ full_name: z.string().min(1),
28
+ html_url: z.string().url(),
29
+ name: z.string().optional(),
30
+ owner: z
31
+ .object({
32
+ login: z.string().optional(),
33
+ })
34
+ .optional(),
35
+ });
36
+ const senderSchema = z
37
+ .object({
38
+ login: z.string().min(1).optional(),
39
+ id: z.number().optional(),
40
+ type: z.string().optional(),
41
+ })
42
+ .nullable()
43
+ .optional();
44
+ const installationSchema = z
45
+ .object({
46
+ id: z.number().optional(),
47
+ })
48
+ .nullable()
49
+ .optional();
50
+ const githubPullRequestPayloadSchema = z.object({
51
+ action: z.string().min(1),
52
+ repository: repositorySchema,
53
+ pull_request: z.object({
54
+ number: z.number().int().positive(),
55
+ html_url: z.string().url(),
56
+ title: z.string(),
57
+ body: z.string().nullable().optional(),
58
+ draft: z.boolean().optional(),
59
+ user: z
60
+ .object({
61
+ login: z.string().min(1).optional(),
62
+ id: z.number().optional(),
63
+ type: z.string().optional(),
64
+ })
65
+ .nullable()
66
+ .optional(),
67
+ head: z.object({
68
+ ref: z.string().min(1),
69
+ sha: z.string().min(1),
70
+ }),
71
+ base: z.object({
72
+ ref: z.string().min(1),
73
+ sha: z.string().optional(),
74
+ }),
75
+ }),
76
+ sender: senderSchema,
77
+ installation: installationSchema,
78
+ });
79
+ /**
80
+ * Derive the turn's auth from the actor that triggered the delivery — the
81
+ * standard `{ auth: defaultGitHubAuth(ctx) }` dispatch from an inbound hook.
82
+ */
83
+ export function defaultGitHubAuth(ctx) {
84
+ var _a, _b, _c;
85
+ var _d;
86
+ const senderId = (_a = ctx.sender) === null || _a === void 0 ? void 0 : _a.id;
87
+ return {
88
+ authenticator: "github-webhook",
89
+ principalId: senderId !== undefined
90
+ ? `github:${senderId}`
91
+ : ((_d = ctx.senderLogin) !== null && _d !== void 0 ? _d : "github"),
92
+ principalType: ((_b = ctx.sender) === null || _b === void 0 ? void 0 : _b.type) === "Bot" ? "service" : "user",
93
+ attributes: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ conversation_kind: ctx.conversation.kind }, (ctx.deliveryId === undefined ? {} : { delivery_id: ctx.deliveryId })), (ctx.installationId === undefined
94
+ ? {}
95
+ : { installation_id: String(ctx.installationId) })), { repository: ctx.repository.fullName }), (ctx.repository.id === undefined
96
+ ? {}
97
+ : { repository_id: String(ctx.repository.id) })), (ctx.senderLogin === undefined ? {} : { user_login: ctx.senderLogin })), (((_c = ctx.sender) === null || _c === void 0 ? void 0 : _c.type) === undefined ? {} : { user_type: ctx.sender.type })), (ctx.repository.owner === ""
98
+ ? {}
99
+ : { issuer: `github:${ctx.repository.owner}` })), (ctx.senderLogin === undefined ? {} : { subject: ctx.senderLogin })),
100
+ };
101
+ }
102
+ export function githubContinuationKey(ctx) {
103
+ const kind = ctx.conversation.kind === "issue" ? "github-issue" : "github-pr";
104
+ return `${kind}:${ctx.repository.fullName}#${ctx.conversation.number}`;
105
+ }
106
+ /** @deprecated Prefer {@link githubContinuationKey}. */
107
+ export function githubPullRequestContinuationKey(ctx) {
108
+ return githubContinuationKey(ctx);
109
+ }
110
+ export function defaultGitHubTitle(ctx) {
111
+ return `GitHub ${ctx.repository.fullName}#${ctx.conversation.number}`;
112
+ }
113
+ /** @deprecated Prefer {@link defaultGitHubTitle}. */
114
+ export function defaultGitHubPullRequestTitle(ctx) {
115
+ return defaultGitHubTitle(ctx);
116
+ }
117
+ export function defaultGitHubPullRequestMessage(ctx, pullRequest) {
118
+ return [
119
+ `GitHub pull request trigger: ${ctx.repository.fullName}#${pullRequest.number}`,
120
+ `Action: ${pullRequest.action}`,
121
+ `PR: ${pullRequest.url}`,
122
+ `Title: ${pullRequest.title}`,
123
+ `Head: ${pullRequest.headRef} (${pullRequest.headSha})`,
124
+ `Base: ${pullRequest.baseRef}`,
125
+ ...(pullRequest.authorLogin === undefined
126
+ ? []
127
+ : [`Author: ${pullRequest.authorLogin}`]),
128
+ ...(ctx.senderLogin === undefined ? [] : [`Sender: ${ctx.senderLogin}`]),
129
+ "",
130
+ "Handle this pull request event.",
131
+ ].join("\n");
132
+ }
133
+ /**
134
+ * Default dispatch gate when no `onPullRequest` hook is declared: the common
135
+ * review triggers start a turn as the delivery's actor.
136
+ *
137
+ * Eve has no default for `onPullRequest` (opt-in only). Agent-serve keeps this
138
+ * gate for backward compatibility with existing demos.
139
+ */
140
+ export function defaultGitHubPullRequestDispatch(ctx, pullRequest) {
141
+ if (!DEFAULT_PULL_REQUEST_ACTIONS.has(pullRequest.action)) {
142
+ return null;
143
+ }
144
+ return { auth: defaultGitHubAuth(ctx) };
145
+ }
146
+ /**
147
+ * Default comment hook (Eve-compatible): dispatch only when the comment
148
+ * `@mention`s {@link botName}.
149
+ */
150
+ export function defaultOnComment(ctx, comment, options) {
151
+ if (!shouldDispatchGitHubComment({
152
+ body: comment.body,
153
+ author: comment.author,
154
+ botName: options.botName,
155
+ })) {
156
+ return null;
157
+ }
158
+ return { auth: defaultGitHubAuth(ctx) };
159
+ }
160
+ function isTaskDispatch(dispatch) {
161
+ return "task" in dispatch;
162
+ }
163
+ export function shouldDispatchGitHubComment(args) {
164
+ var _a;
165
+ const botName = (_a = args.botName) === null || _a === void 0 ? void 0 : _a.trim();
166
+ if (botName === undefined || botName === "") {
167
+ return false;
168
+ }
169
+ if (isGitHubAppBotAuthor(args.author, botName)) {
170
+ return false;
171
+ }
172
+ const mention = new RegExp(`(^|\\W)@${escapeRegExp(botName)}\\b`, "i");
173
+ return mention.test(args.body);
174
+ }
175
+ export function extractGitHubCommentTrigger(args) {
176
+ var _a;
177
+ const botName = (_a = args.botName) === null || _a === void 0 ? void 0 : _a.trim();
178
+ if (botName === undefined || botName === "") {
179
+ const trimmed = args.body.trim();
180
+ return trimmed === "" ? undefined : { message: trimmed };
181
+ }
182
+ const mention = new RegExp(`@${escapeRegExp(botName)}\\b[,:]?\\s*`, "i");
183
+ const stripped = args.body.replace(mention, "").trim();
184
+ if (stripped === "") {
185
+ return { message: args.body.trim() };
186
+ }
187
+ return { message: stripped };
188
+ }
189
+ export function parseGitHubPullRequestEvent(args) {
190
+ var _a, _b;
191
+ var _c;
192
+ const parsed = githubPullRequestPayloadSchema.safeParse(args.payload);
193
+ if (!parsed.success) {
194
+ return null;
195
+ }
196
+ const payload = parsed.data;
197
+ const repository = toRepositoryRef(payload.repository);
198
+ const sender = toUser(payload.sender);
199
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
200
+ const ctx = Object.assign(Object.assign(Object.assign(Object.assign({}, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), { eventName: "pull_request", repository, conversation: {
201
+ kind: "pull_request",
202
+ number: payload.pull_request.number,
203
+ url: payload.pull_request.html_url,
204
+ } }), (sender === undefined ? {} : { sender, senderLogin: sender.login })), (installationId === undefined ? {} : { installationId }));
205
+ const pullRequest = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ action: payload.action, number: payload.pull_request.number, url: payload.pull_request.html_url, title: payload.pull_request.title }, (payload.pull_request.body === undefined ||
206
+ payload.pull_request.body === null
207
+ ? {}
208
+ : { body: payload.pull_request.body })), { headRef: payload.pull_request.head.ref, headSha: payload.pull_request.head.sha, baseRef: payload.pull_request.base.ref }), (payload.pull_request.base.sha === undefined
209
+ ? {}
210
+ : { baseSha: payload.pull_request.base.sha })), { draft: (_c = payload.pull_request.draft) !== null && _c !== void 0 ? _c : false }), (((_b = payload.pull_request.user) === null || _b === void 0 ? void 0 : _b.login) === undefined
211
+ ? {}
212
+ : { authorLogin: payload.pull_request.user.login }));
213
+ return { ctx, pullRequest };
214
+ }
215
+ export function verifyGitHubWebhookSignature(args) {
216
+ return __awaiter(this, void 0, void 0, function* () {
217
+ const secret = yield resolveCredentialValue(args.secret);
218
+ if (secret === undefined || secret === "") {
219
+ return "missing_secret";
220
+ }
221
+ if (args.signatureHeader === null) {
222
+ return "missing_signature";
223
+ }
224
+ const isVerified = verifyWebhookSha256Signature({
225
+ secret,
226
+ body: args.body,
227
+ signatureHeader: args.signatureHeader,
228
+ });
229
+ return isVerified ? "verified" : "mismatch";
230
+ });
231
+ }
232
+ function verifyWebhookSha256Signature(args) {
233
+ const prefix = "sha256=";
234
+ if (!args.signatureHeader.startsWith(prefix)) {
235
+ return false;
236
+ }
237
+ const receivedHex = args.signatureHeader.slice(prefix.length);
238
+ if (!/^[0-9a-f]+$/i.test(receivedHex) || receivedHex.length % 2 !== 0) {
239
+ return false;
240
+ }
241
+ const expected = createHmac("sha256", args.secret).update(args.body).digest();
242
+ const received = Buffer.from(receivedHex, "hex");
243
+ return (received.length === expected.length && timingSafeEqual(received, expected));
244
+ }
245
+ /**
246
+ * GitHub webhook channel (Eve-compatible dispatch surface). Point a GitHub App
247
+ * or repository webhook at `/<agent>/v1/channels/github` and declare inbound
248
+ * hooks:
249
+ *
250
+ * ```ts
251
+ * import { defaultGitHubAuth, githubChannel } from "@anysphere/agent-serve/channels/github";
252
+ *
253
+ * export default githubChannel({
254
+ * botName: "my-agent",
255
+ * credentials: { webhookSecret: () => process.env.GITHUB_WEBHOOK_SECRET },
256
+ * // Replaces the @mention gate. Prefer typed Octokit via getOctokit().
257
+ * onComment: (ctx, comment) => ({ auth: defaultGitHubAuth(ctx) }),
258
+ * onPullRequest: (ctx, pr) =>
259
+ * pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null,
260
+ * onStatus: (ctx, status) =>
261
+ * status.state === "failure"
262
+ * ? {
263
+ * task: async () => {
264
+ * const octokit = await ctx.github.getOctokit();
265
+ * await octokit.rest.repos.createCommitStatus({
266
+ * owner: ctx.repository.owner,
267
+ * repo: ctx.repository.name,
268
+ * sha: status.sha,
269
+ * state: "pending",
270
+ * context: "agent/triage",
271
+ * });
272
+ * },
273
+ * }
274
+ * : null,
275
+ * onEvent: (ctx, event) =>
276
+ * event.eventName === "label" ? { auth: defaultGitHubAuth(ctx) } : null,
277
+ * });
278
+ * ```
279
+ */
280
+ /**
281
+ * Core GitHub webhook dispatch used by {@link githubChannel} routes and by
282
+ * {@link handleAgentServeTrigger} fan-out. Signature verification is the
283
+ * caller's responsibility (HTTP route verifies; internal fan-out skips).
284
+ */
285
+ export function dispatchGitHubWebhook(input) {
286
+ return __awaiter(this, void 0, void 0, function* () {
287
+ var _a;
288
+ const { options, eventName, payload, deliveryId, args } = input;
289
+ const botName = (_a = options.botName) !== null && _a !== void 0 ? _a : process.env.GITHUB_APP_SLUG;
290
+ const bindingConfig = {
291
+ api: options.api,
292
+ credentials: options.credentials,
293
+ };
294
+ if (eventName === "ping") {
295
+ return Response.json({ ok: true, event: "ping" });
296
+ }
297
+ switch (eventName) {
298
+ case "pull_request":
299
+ return handlePullRequest({
300
+ options,
301
+ bindingConfig,
302
+ payload,
303
+ deliveryId,
304
+ args,
305
+ });
306
+ case "issue_comment":
307
+ return handleIssueComment({
308
+ options,
309
+ bindingConfig,
310
+ botName,
311
+ payload,
312
+ deliveryId,
313
+ args,
314
+ });
315
+ case "pull_request_review_comment":
316
+ return handleReviewComment({
317
+ options,
318
+ bindingConfig,
319
+ botName,
320
+ payload,
321
+ deliveryId,
322
+ args,
323
+ });
324
+ case "issues":
325
+ return handleIssue({
326
+ options,
327
+ bindingConfig,
328
+ payload,
329
+ deliveryId,
330
+ args,
331
+ });
332
+ case "check_suite":
333
+ return handleCheckSuite({
334
+ options,
335
+ bindingConfig,
336
+ payload,
337
+ deliveryId,
338
+ args,
339
+ });
340
+ case "check_run":
341
+ return handleCheckRun({
342
+ options,
343
+ bindingConfig,
344
+ payload,
345
+ deliveryId,
346
+ args,
347
+ });
348
+ case "workflow_run":
349
+ return handleWorkflowRun({
350
+ options,
351
+ bindingConfig,
352
+ payload,
353
+ deliveryId,
354
+ args,
355
+ });
356
+ case "status":
357
+ return handleStatus({
358
+ options,
359
+ bindingConfig,
360
+ payload,
361
+ deliveryId,
362
+ args,
363
+ });
364
+ default:
365
+ if (options.onEvent !== undefined && eventName !== null) {
366
+ return handleGenericEvent({
367
+ options,
368
+ bindingConfig,
369
+ eventName,
370
+ payload,
371
+ deliveryId,
372
+ args,
373
+ });
374
+ }
375
+ return Response.json({
376
+ ok: true,
377
+ skipped: true,
378
+ reason: "unsupported_event",
379
+ event: eventName,
380
+ });
381
+ }
382
+ });
383
+ }
384
+ /**
385
+ * HTTP entry for a single agent's GitHub channel: optional HMAC verify, then
386
+ * {@link dispatchGitHubWebhook}.
387
+ */
388
+ export function handleGitHubWebhookRequest(input) {
389
+ return __awaiter(this, void 0, void 0, function* () {
390
+ var _a;
391
+ var _b, _c;
392
+ const bodyText = yield input.request.text();
393
+ const webhookSecret = (_b = (_a = input.options.credentials) === null || _a === void 0 ? void 0 : _a.webhookSecret) !== null && _b !== void 0 ? _b : envWebhookSecret();
394
+ if (webhookSecret !== undefined && input.skipSignatureVerification !== true) {
395
+ const signatureResult = yield verifyGitHubWebhookSignature({
396
+ body: bodyText,
397
+ signatureHeader: input.request.headers.get("x-hub-signature-256"),
398
+ secret: webhookSecret,
399
+ });
400
+ if (signatureResult !== "verified") {
401
+ return Response.json({ ok: false, error: signatureResult }, { status: 401 });
402
+ }
403
+ }
404
+ let payload;
405
+ try {
406
+ payload = JSON.parse(bodyText);
407
+ }
408
+ catch (_d) {
409
+ return Response.json({ ok: false, error: "invalid_json" }, { status: 400 });
410
+ }
411
+ return dispatchGitHubWebhook({
412
+ options: input.options,
413
+ eventName: input.request.headers.get("x-github-event"),
414
+ payload,
415
+ deliveryId: (_c = input.request.headers.get("x-github-delivery")) !== null && _c !== void 0 ? _c : undefined,
416
+ args: input.args,
417
+ });
418
+ });
419
+ }
420
+ /** Options used to construct a github channel — for host-level fan-out. */
421
+ const githubChannelOptionsByDefinition = new WeakMap();
422
+ /**
423
+ * Recover the {@link GitHubChannelOptions} used to build a channel definition,
424
+ * if it was created via {@link githubChannel}.
425
+ */
426
+ export function getGitHubChannelOptions(definition) {
427
+ return githubChannelOptionsByDefinition.get(definition);
428
+ }
429
+ export function githubChannel(options = {}) {
430
+ var _a;
431
+ var _b, _c, _d;
432
+ const routePath = (_b = options.path) !== null && _b !== void 0 ? _b : "/";
433
+ const webhookSecret = (_c = (_a = options.credentials) === null || _a === void 0 ? void 0 : _a.webhookSecret) !== null && _c !== void 0 ? _c : envWebhookSecret();
434
+ // With a secret the HMAC is the request auth (allowAll). Without one, prod
435
+ // stays loopback-strict; dev admits unsigned deliveries from a loopback peer
436
+ // only (loopbackGitHubDev) — not the LAN. Admits `gh webhook forward`
437
+ // deliveries (loopback peer + GitHub forwarding/delivery headers) while
438
+ // rejecting loopback tunnels that relay unsigned traffic without
439
+ // `X-GitHub-Event`.
440
+ //
441
+ // Evaluate `isDevMode()` per request (not at channel construction): channel
442
+ // modules call `githubChannel()` at import, and discovery may cache the
443
+ // definition across serve() calls. `serve()` sets the flag before discovery,
444
+ // but request-time lookup stays correct if that ordering ever drifts.
445
+ const auth = (_d = options.auth) !== null && _d !== void 0 ? _d : (webhookSecret !== undefined
446
+ ? [allowAll()]
447
+ : [
448
+ (request, info) => (isDevMode() ? loopbackGitHubDev() : localDevStrict())(request, info),
449
+ ]);
450
+ const events = Object.assign(Object.assign({}, buildDefaultGitHubEvents(Object.assign({}, options))), options.events);
451
+ const definition = defineChannel({
452
+ auth,
453
+ state: emptyGitHubChannelState(),
454
+ events,
455
+ meta: {
456
+ kind: GITHUB_CHANNEL_KIND,
457
+ githubWebhookEvents: deriveGitHubWebhookEvents(options),
458
+ },
459
+ onStart: options.onStart,
460
+ onStop: options.onStop,
461
+ routes: [
462
+ POST(routePath, {
463
+ // Webhook payloads vary by `X-GitHub-Event`; event-specific Zod
464
+ // parsing happens inside the dispatcher. Require a schema at the
465
+ // route boundary so /v1/info + Try always have something to show.
466
+ bodySchema: z.unknown(),
467
+ description: "GitHub webhook ingress",
468
+ handler: (request, args) => __awaiter(this, void 0, void 0, function* () { return handleGitHubWebhookRequest({ options, request, args }); }),
469
+ }),
470
+ ],
471
+ });
472
+ githubChannelOptionsByDefinition.set(definition, options);
473
+ return definition;
474
+ }
475
+ function handlePullRequest(input) {
476
+ return __awaiter(this, void 0, void 0, function* () {
477
+ var _a, _b, _c;
478
+ const parsed = parseGitHubPullRequestEvent({
479
+ payload: input.payload,
480
+ deliveryId: input.deliveryId,
481
+ });
482
+ if (parsed === null) {
483
+ return Response.json({ ok: false, error: "invalid_pull_request_payload" }, { status: 400 });
484
+ }
485
+ const { pullRequest } = parsed;
486
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.ctx.installationId;
487
+ const binding = githubBindingStateForEvent({
488
+ kind: parsed.ctx.conversation.kind,
489
+ owner: parsed.ctx.repository.owner,
490
+ repo: parsed.ctx.repository.name,
491
+ number: parsed.ctx.conversation.number,
492
+ repositoryId: parsed.ctx.repository.id,
493
+ installationId,
494
+ });
495
+ const ctx = enrichEventContext({
496
+ bindingConfig: input.bindingConfig,
497
+ ctx: parsed.ctx,
498
+ bindingState: binding,
499
+ installationId,
500
+ host: input.args.host,
501
+ });
502
+ const dispatch = input.options.onPullRequest === undefined
503
+ ? defaultGitHubPullRequestDispatch(ctx, pullRequest)
504
+ : yield input.options.onPullRequest(ctx, pullRequest);
505
+ if (dispatch === null) {
506
+ return skipped("not_dispatched", { action: pullRequest.action });
507
+ }
508
+ if (isTaskDispatch(dispatch)) {
509
+ return acknowledgeTask(input.args, dispatch, {
510
+ action: pullRequest.action,
511
+ prUrl: pullRequest.url,
512
+ headSha: pullRequest.headSha,
513
+ });
514
+ }
515
+ const message = [
516
+ (_b = dispatch.message) !== null && _b !== void 0 ? _b : defaultGitHubPullRequestMessage(ctx, pullRequest),
517
+ ...((_c = dispatch.context) !== null && _c !== void 0 ? _c : []),
518
+ ].join("\n");
519
+ const cloud = yield resolveCloudOptions(input.options.cloud, ctx, pullRequest);
520
+ return startTurn({
521
+ args: input.args,
522
+ ctx,
523
+ message,
524
+ dispatch,
525
+ cloud,
526
+ state: sessionStateFromBinding({
527
+ binding,
528
+ deliveryId: ctx.deliveryId,
529
+ eventName: ctx.eventName,
530
+ headSha: pullRequest.headSha,
531
+ baseRef: pullRequest.baseRef,
532
+ headRef: pullRequest.headRef,
533
+ }),
534
+ });
535
+ });
536
+ }
537
+ function handleIssueComment(input) {
538
+ return __awaiter(this, void 0, void 0, function* () {
539
+ var _a, _b, _c, _d;
540
+ const parsed = parseIssueCommentEvent({
541
+ payload: input.payload,
542
+ deliveryId: input.deliveryId,
543
+ });
544
+ if (parsed === null) {
545
+ return Response.json({ ok: false, error: "invalid_issue_comment_payload" }, { status: 400 });
546
+ }
547
+ if (parsed.action !== "created") {
548
+ return skipped("not_dispatched", { action: parsed.action });
549
+ }
550
+ if (isIgnoredInboundComment(parsed.comment.body, parsed.comment.author, input.botName)) {
551
+ return skipped("ignored_comment");
552
+ }
553
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.ctx.installationId;
554
+ const binding = githubBindingStateForEvent({
555
+ kind: parsed.ctx.conversation.kind,
556
+ owner: parsed.ctx.repository.owner,
557
+ repo: parsed.ctx.repository.name,
558
+ number: parsed.ctx.conversation.number,
559
+ repositoryId: parsed.ctx.repository.id,
560
+ installationId,
561
+ triggeringCommentId: parsed.comment.id,
562
+ });
563
+ const ctx = enrichEventContext({
564
+ bindingConfig: input.bindingConfig,
565
+ ctx: parsed.ctx,
566
+ bindingState: binding,
567
+ installationId,
568
+ host: input.args.host,
569
+ });
570
+ const dispatch = input.options.onComment === undefined
571
+ ? defaultOnComment(ctx, parsed.comment, {
572
+ botName: input.botName,
573
+ })
574
+ : yield input.options.onComment(ctx, parsed.comment);
575
+ if (dispatch === null) {
576
+ return skipped("not_dispatched");
577
+ }
578
+ if (isTaskDispatch(dispatch)) {
579
+ return acknowledgeTask(input.args, dispatch, {
580
+ event: "issue_comment",
581
+ action: parsed.action,
582
+ });
583
+ }
584
+ const trigger = extractGitHubCommentTrigger({
585
+ body: parsed.comment.body,
586
+ botName: input.botName,
587
+ });
588
+ const message = [
589
+ (_c = (_b = dispatch.message) !== null && _b !== void 0 ? _b : trigger === null || trigger === void 0 ? void 0 : trigger.message) !== null && _c !== void 0 ? _c : parsed.comment.body.trim(),
590
+ ...((_d = dispatch.context) !== null && _d !== void 0 ? _d : []),
591
+ ].join("\n");
592
+ return startTurn({
593
+ args: input.args,
594
+ ctx,
595
+ message,
596
+ dispatch,
597
+ state: sessionStateFromBinding({
598
+ binding,
599
+ deliveryId: ctx.deliveryId,
600
+ eventName: ctx.eventName,
601
+ }),
602
+ });
603
+ });
604
+ }
605
+ function handleReviewComment(input) {
606
+ return __awaiter(this, void 0, void 0, function* () {
607
+ var _a, _b, _c, _d, _e;
608
+ const parsed = parseReviewCommentEvent({
609
+ payload: input.payload,
610
+ deliveryId: input.deliveryId,
611
+ });
612
+ if (parsed === null) {
613
+ return Response.json({ ok: false, error: "invalid_review_comment_payload" }, { status: 400 });
614
+ }
615
+ if (parsed.action !== "created") {
616
+ return skipped("not_dispatched", { action: parsed.action });
617
+ }
618
+ if (isIgnoredInboundComment(parsed.comment.body, parsed.comment.author, input.botName)) {
619
+ return skipped("ignored_comment");
620
+ }
621
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.ctx.installationId;
622
+ const binding = githubBindingStateForEvent({
623
+ kind: parsed.ctx.conversation.kind,
624
+ owner: parsed.ctx.repository.owner,
625
+ repo: parsed.ctx.repository.name,
626
+ number: parsed.ctx.conversation.number,
627
+ repositoryId: parsed.ctx.repository.id,
628
+ installationId,
629
+ triggeringCommentId: parsed.comment.id,
630
+ reviewCommentId: parsed.comment.id,
631
+ reviewThreadRootCommentId: (_b = parsed.comment.inReplyToId) !== null && _b !== void 0 ? _b : parsed.comment.id,
632
+ });
633
+ const ctx = enrichEventContext({
634
+ bindingConfig: input.bindingConfig,
635
+ ctx: parsed.ctx,
636
+ bindingState: binding,
637
+ installationId,
638
+ host: input.args.host,
639
+ });
640
+ const dispatch = input.options.onComment === undefined
641
+ ? defaultOnComment(ctx, parsed.comment, {
642
+ botName: input.botName,
643
+ })
644
+ : yield input.options.onComment(ctx, parsed.comment);
645
+ if (dispatch === null) {
646
+ return skipped("not_dispatched");
647
+ }
648
+ if (isTaskDispatch(dispatch)) {
649
+ return acknowledgeTask(input.args, dispatch, {
650
+ event: "pull_request_review_comment",
651
+ action: parsed.action,
652
+ });
653
+ }
654
+ const trigger = extractGitHubCommentTrigger({
655
+ body: parsed.comment.body,
656
+ botName: input.botName,
657
+ });
658
+ const message = [
659
+ (_d = (_c = dispatch.message) !== null && _c !== void 0 ? _c : trigger === null || trigger === void 0 ? void 0 : trigger.message) !== null && _d !== void 0 ? _d : parsed.comment.body.trim(),
660
+ ...((_e = dispatch.context) !== null && _e !== void 0 ? _e : []),
661
+ ].join("\n");
662
+ return startTurn({
663
+ args: input.args,
664
+ ctx,
665
+ message,
666
+ dispatch,
667
+ state: sessionStateFromBinding({
668
+ binding,
669
+ deliveryId: ctx.deliveryId,
670
+ eventName: ctx.eventName,
671
+ }),
672
+ });
673
+ });
674
+ }
675
+ function handleIssue(input) {
676
+ return __awaiter(this, void 0, void 0, function* () {
677
+ var _a, _b, _c;
678
+ if (input.options.onIssue === undefined) {
679
+ return skipped("no_handler", { event: "issues" });
680
+ }
681
+ const parsed = parseIssueEvent({
682
+ payload: input.payload,
683
+ deliveryId: input.deliveryId,
684
+ });
685
+ if (parsed === null) {
686
+ return Response.json({ ok: false, error: "invalid_issues_payload" }, { status: 400 });
687
+ }
688
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.ctx.installationId;
689
+ const binding = githubBindingStateForEvent({
690
+ kind: parsed.ctx.conversation.kind,
691
+ owner: parsed.ctx.repository.owner,
692
+ repo: parsed.ctx.repository.name,
693
+ number: parsed.ctx.conversation.number,
694
+ repositoryId: parsed.ctx.repository.id,
695
+ installationId,
696
+ });
697
+ const ctx = enrichEventContext({
698
+ bindingConfig: input.bindingConfig,
699
+ ctx: parsed.ctx,
700
+ bindingState: binding,
701
+ installationId,
702
+ host: input.args.host,
703
+ });
704
+ const dispatch = yield input.options.onIssue(ctx, parsed.issue);
705
+ if (dispatch === null) {
706
+ return skipped("not_dispatched", { action: parsed.issue.action });
707
+ }
708
+ if (isTaskDispatch(dispatch)) {
709
+ return acknowledgeTask(input.args, dispatch, {
710
+ event: "issues",
711
+ action: parsed.issue.action,
712
+ issueNumber: parsed.issue.number,
713
+ });
714
+ }
715
+ const message = [
716
+ (_b = dispatch.message) !== null && _b !== void 0 ? _b : `Issue ${parsed.issue.action}: #${parsed.issue.number} ${parsed.issue.title}`,
717
+ ...((_c = dispatch.context) !== null && _c !== void 0 ? _c : []),
718
+ ].join("\n");
719
+ return startTurn({
720
+ args: input.args,
721
+ ctx,
722
+ message,
723
+ dispatch,
724
+ state: sessionStateFromBinding({
725
+ binding,
726
+ deliveryId: ctx.deliveryId,
727
+ eventName: ctx.eventName,
728
+ }),
729
+ });
730
+ });
731
+ }
732
+ function handleCheckSuite(input) {
733
+ return __awaiter(this, void 0, void 0, function* () {
734
+ var _a, _b, _c;
735
+ if (input.options.onCheckSuite === undefined) {
736
+ return skipped("no_handler", { event: "check_suite" });
737
+ }
738
+ const parsed = parseCheckSuiteEvent({
739
+ payload: input.payload,
740
+ deliveryId: input.deliveryId,
741
+ });
742
+ if (parsed === null) {
743
+ return Response.json({ ok: false, error: "invalid_check_suite_payload" }, { status: 400 });
744
+ }
745
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.unanchoredCtx.installationId;
746
+ if (parsed.ctx === null) {
747
+ const dispatch = yield input.options.onCheckSuite(enrichCiContext({
748
+ bindingConfig: input.bindingConfig,
749
+ ctx: parsed.unanchoredCtx,
750
+ installationId,
751
+ host: input.args.host,
752
+ }), parsed.checkSuite);
753
+ if (dispatch !== null && isTaskDispatch(dispatch)) {
754
+ return acknowledgeTask(input.args, dispatch, {
755
+ event: "check_suite",
756
+ action: parsed.checkSuite.action,
757
+ checkSuiteId: parsed.checkSuite.checkSuiteId,
758
+ });
759
+ }
760
+ return skipped("no_pull_request", { event: "check_suite" });
761
+ }
762
+ const binding = githubBindingStateForEvent({
763
+ kind: parsed.ctx.conversation.kind,
764
+ owner: parsed.ctx.repository.owner,
765
+ repo: parsed.ctx.repository.name,
766
+ number: parsed.ctx.conversation.number,
767
+ repositoryId: parsed.ctx.repository.id,
768
+ installationId,
769
+ });
770
+ const ctx = enrichEventContext({
771
+ bindingConfig: input.bindingConfig,
772
+ ctx: parsed.ctx,
773
+ bindingState: binding,
774
+ installationId,
775
+ host: input.args.host,
776
+ });
777
+ const dispatch = yield input.options.onCheckSuite(ctx, parsed.checkSuite);
778
+ if (dispatch === null) {
779
+ return skipped("not_dispatched", { action: parsed.checkSuite.action });
780
+ }
781
+ if (isTaskDispatch(dispatch)) {
782
+ return acknowledgeTask(input.args, dispatch, {
783
+ event: "check_suite",
784
+ action: parsed.checkSuite.action,
785
+ checkSuiteId: parsed.checkSuite.checkSuiteId,
786
+ });
787
+ }
788
+ const message = [
789
+ (_b = dispatch.message) !== null && _b !== void 0 ? _b : formatCiMessage("Check suite", parsed.checkSuite.checkSuiteId, parsed.checkSuite),
790
+ ...((_c = dispatch.context) !== null && _c !== void 0 ? _c : []),
791
+ ].join("\n");
792
+ return startTurn({
793
+ args: input.args,
794
+ ctx,
795
+ message,
796
+ dispatch,
797
+ state: sessionStateFromBinding({
798
+ binding,
799
+ deliveryId: ctx.deliveryId,
800
+ eventName: ctx.eventName,
801
+ headSha: parsed.checkSuite.headSha,
802
+ }),
803
+ });
804
+ });
805
+ }
806
+ function handleCheckRun(input) {
807
+ return __awaiter(this, void 0, void 0, function* () {
808
+ var _a, _b, _c;
809
+ if (input.options.onCheckRun === undefined) {
810
+ return skipped("no_handler", { event: "check_run" });
811
+ }
812
+ const parsed = parseCheckRunEvent({
813
+ payload: input.payload,
814
+ deliveryId: input.deliveryId,
815
+ });
816
+ if (parsed === null) {
817
+ return Response.json({ ok: false, error: "invalid_check_run_payload" }, { status: 400 });
818
+ }
819
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.unanchoredCtx.installationId;
820
+ if (parsed.ctx === null) {
821
+ const dispatch = yield input.options.onCheckRun(enrichCiContext({
822
+ bindingConfig: input.bindingConfig,
823
+ ctx: parsed.unanchoredCtx,
824
+ installationId,
825
+ host: input.args.host,
826
+ }), parsed.checkRun);
827
+ if (dispatch !== null && isTaskDispatch(dispatch)) {
828
+ return acknowledgeTask(input.args, dispatch, {
829
+ event: "check_run",
830
+ action: parsed.checkRun.action,
831
+ checkRunId: parsed.checkRun.checkRunId,
832
+ });
833
+ }
834
+ return skipped("no_pull_request", { event: "check_run" });
835
+ }
836
+ const binding = githubBindingStateForEvent({
837
+ kind: parsed.ctx.conversation.kind,
838
+ owner: parsed.ctx.repository.owner,
839
+ repo: parsed.ctx.repository.name,
840
+ number: parsed.ctx.conversation.number,
841
+ repositoryId: parsed.ctx.repository.id,
842
+ installationId,
843
+ });
844
+ const ctx = enrichEventContext({
845
+ bindingConfig: input.bindingConfig,
846
+ ctx: parsed.ctx,
847
+ bindingState: binding,
848
+ installationId,
849
+ host: input.args.host,
850
+ });
851
+ const dispatch = yield input.options.onCheckRun(ctx, parsed.checkRun);
852
+ if (dispatch === null) {
853
+ return skipped("not_dispatched", { action: parsed.checkRun.action });
854
+ }
855
+ if (isTaskDispatch(dispatch)) {
856
+ return acknowledgeTask(input.args, dispatch, {
857
+ event: "check_run",
858
+ action: parsed.checkRun.action,
859
+ checkRunId: parsed.checkRun.checkRunId,
860
+ });
861
+ }
862
+ const message = [
863
+ (_b = dispatch.message) !== null && _b !== void 0 ? _b : formatCiMessage("Check run", parsed.checkRun.checkRunId, parsed.checkRun),
864
+ ...((_c = dispatch.context) !== null && _c !== void 0 ? _c : []),
865
+ ].join("\n");
866
+ return startTurn({
867
+ args: input.args,
868
+ ctx,
869
+ message,
870
+ dispatch,
871
+ state: sessionStateFromBinding({
872
+ binding,
873
+ deliveryId: ctx.deliveryId,
874
+ eventName: ctx.eventName,
875
+ headSha: parsed.checkRun.headSha,
876
+ }),
877
+ });
878
+ });
879
+ }
880
+ function handleWorkflowRun(input) {
881
+ return __awaiter(this, void 0, void 0, function* () {
882
+ var _a, _b, _c;
883
+ if (input.options.onWorkflowRun === undefined) {
884
+ return skipped("no_handler", { event: "workflow_run" });
885
+ }
886
+ const parsed = parseWorkflowRunEvent({
887
+ payload: input.payload,
888
+ deliveryId: input.deliveryId,
889
+ });
890
+ if (parsed === null) {
891
+ return Response.json({ ok: false, error: "invalid_workflow_run_payload" }, { status: 400 });
892
+ }
893
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.unanchoredCtx.installationId;
894
+ if (parsed.ctx === null) {
895
+ const dispatch = yield input.options.onWorkflowRun(enrichCiContext({
896
+ bindingConfig: input.bindingConfig,
897
+ ctx: parsed.unanchoredCtx,
898
+ installationId,
899
+ host: input.args.host,
900
+ }), parsed.workflowRun);
901
+ if (dispatch !== null && isTaskDispatch(dispatch)) {
902
+ return acknowledgeTask(input.args, dispatch, {
903
+ event: "workflow_run",
904
+ action: parsed.workflowRun.action,
905
+ workflowRunId: parsed.workflowRun.workflowRunId,
906
+ });
907
+ }
908
+ return skipped("no_pull_request", { event: "workflow_run" });
909
+ }
910
+ const binding = githubBindingStateForEvent({
911
+ kind: parsed.ctx.conversation.kind,
912
+ owner: parsed.ctx.repository.owner,
913
+ repo: parsed.ctx.repository.name,
914
+ number: parsed.ctx.conversation.number,
915
+ repositoryId: parsed.ctx.repository.id,
916
+ installationId,
917
+ });
918
+ const ctx = enrichEventContext({
919
+ bindingConfig: input.bindingConfig,
920
+ ctx: parsed.ctx,
921
+ bindingState: binding,
922
+ installationId,
923
+ host: input.args.host,
924
+ });
925
+ const dispatch = yield input.options.onWorkflowRun(ctx, parsed.workflowRun);
926
+ if (dispatch === null) {
927
+ return skipped("not_dispatched", { action: parsed.workflowRun.action });
928
+ }
929
+ if (isTaskDispatch(dispatch)) {
930
+ return acknowledgeTask(input.args, dispatch, {
931
+ event: "workflow_run",
932
+ action: parsed.workflowRun.action,
933
+ workflowRunId: parsed.workflowRun.workflowRunId,
934
+ });
935
+ }
936
+ const message = [
937
+ (_b = dispatch.message) !== null && _b !== void 0 ? _b : formatCiMessage("Workflow run", parsed.workflowRun.workflowRunId, parsed.workflowRun),
938
+ ...((_c = dispatch.context) !== null && _c !== void 0 ? _c : []),
939
+ ].join("\n");
940
+ return startTurn({
941
+ args: input.args,
942
+ ctx,
943
+ message,
944
+ dispatch,
945
+ state: sessionStateFromBinding({
946
+ binding,
947
+ deliveryId: ctx.deliveryId,
948
+ eventName: ctx.eventName,
949
+ headSha: parsed.workflowRun.headSha,
950
+ }),
951
+ });
952
+ });
953
+ }
954
+ function handleStatus(input) {
955
+ return __awaiter(this, void 0, void 0, function* () {
956
+ var _a, _b, _c;
957
+ if (input.options.onStatus === undefined) {
958
+ return skipped("no_handler", { event: "status" });
959
+ }
960
+ const parsed = parseStatusEvent({
961
+ payload: input.payload,
962
+ deliveryId: input.deliveryId,
963
+ });
964
+ if (parsed === null) {
965
+ return Response.json({ ok: false, error: "invalid_status_payload" }, { status: 400 });
966
+ }
967
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.ctx.installationId;
968
+ const binding = githubBindingStateForEvent({
969
+ kind: parsed.ctx.conversation.kind,
970
+ owner: parsed.ctx.repository.owner,
971
+ repo: parsed.ctx.repository.name,
972
+ number: parsed.ctx.conversation.number,
973
+ repositoryId: parsed.ctx.repository.id,
974
+ installationId,
975
+ });
976
+ const ctx = enrichEventContext({
977
+ bindingConfig: input.bindingConfig,
978
+ ctx: parsed.ctx,
979
+ bindingState: binding,
980
+ installationId,
981
+ host: input.args.host,
982
+ });
983
+ const dispatch = yield input.options.onStatus(ctx, parsed.status);
984
+ if (dispatch === null) {
985
+ return skipped("not_dispatched", {
986
+ event: "status",
987
+ state: parsed.status.state,
988
+ });
989
+ }
990
+ if (isTaskDispatch(dispatch)) {
991
+ return acknowledgeTask(input.args, dispatch, {
992
+ event: "status",
993
+ state: parsed.status.state,
994
+ sha: parsed.status.sha,
995
+ });
996
+ }
997
+ // A turn needs a thread to anchor to; commit statuses often have no PR.
998
+ if (ctx.conversation.number === 0) {
999
+ return skipped("no_pull_request", { event: "status" });
1000
+ }
1001
+ const message = [
1002
+ (_b = dispatch.message) !== null && _b !== void 0 ? _b : `Commit status ${parsed.status.state} for ${parsed.status.context} at ${parsed.status.sha}`,
1003
+ ...((_c = dispatch.context) !== null && _c !== void 0 ? _c : []),
1004
+ ].join("\n");
1005
+ return startTurn({
1006
+ args: input.args,
1007
+ ctx,
1008
+ message,
1009
+ dispatch,
1010
+ state: sessionStateFromBinding({
1011
+ binding,
1012
+ deliveryId: ctx.deliveryId,
1013
+ eventName: ctx.eventName,
1014
+ headSha: parsed.status.sha,
1015
+ }),
1016
+ });
1017
+ });
1018
+ }
1019
+ function handleGenericEvent(input) {
1020
+ return __awaiter(this, void 0, void 0, function* () {
1021
+ var _a, _b, _c;
1022
+ if (input.options.onEvent === undefined) {
1023
+ return skipped("no_handler", { event: input.eventName });
1024
+ }
1025
+ const parsed = parseGenericEvent({
1026
+ eventName: input.eventName,
1027
+ payload: input.payload,
1028
+ deliveryId: input.deliveryId,
1029
+ });
1030
+ if (parsed === null) {
1031
+ return skipped("unsupported_event", { event: input.eventName });
1032
+ }
1033
+ const installationId = (_a = readInstallationId(input.payload)) !== null && _a !== void 0 ? _a : parsed.ctx.installationId;
1034
+ const binding = githubBindingStateForEvent({
1035
+ kind: parsed.ctx.conversation.kind,
1036
+ owner: parsed.ctx.repository.owner,
1037
+ repo: parsed.ctx.repository.name,
1038
+ number: parsed.ctx.conversation.number,
1039
+ repositoryId: parsed.ctx.repository.id,
1040
+ installationId,
1041
+ });
1042
+ const ctx = enrichEventContext({
1043
+ bindingConfig: input.bindingConfig,
1044
+ ctx: parsed.ctx,
1045
+ bindingState: binding,
1046
+ installationId,
1047
+ host: input.args.host,
1048
+ });
1049
+ const dispatch = yield input.options.onEvent(ctx, parsed.event);
1050
+ if (dispatch === null) {
1051
+ return skipped("not_dispatched", { event: input.eventName });
1052
+ }
1053
+ if (isTaskDispatch(dispatch)) {
1054
+ return acknowledgeTask(input.args, dispatch, Object.assign({ event: input.eventName }, (parsed.event.action === undefined
1055
+ ? {}
1056
+ : { action: parsed.event.action })));
1057
+ }
1058
+ if (ctx.conversation.number === 0) {
1059
+ return skipped("no_conversation", { event: input.eventName });
1060
+ }
1061
+ const message = [
1062
+ (_b = dispatch.message) !== null && _b !== void 0 ? _b : `GitHub ${input.eventName} event`,
1063
+ ...((_c = dispatch.context) !== null && _c !== void 0 ? _c : []),
1064
+ ].join("\n");
1065
+ return startTurn({
1066
+ args: input.args,
1067
+ ctx,
1068
+ message,
1069
+ dispatch,
1070
+ state: sessionStateFromBinding({
1071
+ binding,
1072
+ deliveryId: ctx.deliveryId,
1073
+ eventName: ctx.eventName,
1074
+ }),
1075
+ });
1076
+ });
1077
+ }
1078
+ function startTurn(input) {
1079
+ return __awaiter(this, void 0, void 0, function* () {
1080
+ var _a;
1081
+ const session = yield input.args.send(input.message, Object.assign(Object.assign({ auth: input.dispatch.auth, continuationToken: githubContinuationKey(input.ctx), title: (_a = input.dispatch.title) !== null && _a !== void 0 ? _a : defaultGitHubTitle(input.ctx) }, (input.cloud === undefined ? {} : { cloud: input.cloud })), { state: input.state }));
1082
+ return Response.json({
1083
+ ok: true,
1084
+ sessionId: session.id,
1085
+ isNew: session.isNew,
1086
+ continuationToken: session.continuationToken,
1087
+ });
1088
+ });
1089
+ }
1090
+ function acknowledgeTask(args, dispatch, extra) {
1091
+ // Defer the task past the current turn so the 202 can flush before work
1092
+ // starts (and so tests can assert scheduling without racing microtasks).
1093
+ args.waitUntil(new Promise((resolve, reject) => {
1094
+ setImmediate(() => {
1095
+ Promise.resolve()
1096
+ .then(dispatch.task)
1097
+ .then(() => resolve(), reject);
1098
+ });
1099
+ }));
1100
+ return Response.json(Object.assign({ ok: true, dispatched: true, mode: "task" }, extra), { status: 202 });
1101
+ }
1102
+ function skipped(reason, extra = {}) {
1103
+ return Response.json(Object.assign({ ok: true, skipped: true, reason }, extra));
1104
+ }
1105
+ function formatCiMessage(label, id, event) {
1106
+ var _a;
1107
+ const outcome = (_a = event.conclusion) !== null && _a !== void 0 ? _a : event.status;
1108
+ return `${label} ${event.action}: ${id}${outcome ? ` (${outcome})` : ""}`;
1109
+ }
1110
+ function isIgnoredInboundComment(body, author, botName) {
1111
+ if (body.includes("<!-- agent-serve-github -->")) {
1112
+ return true;
1113
+ }
1114
+ if (isGitHubAppBotAuthor(author, botName)) {
1115
+ return true;
1116
+ }
1117
+ return false;
1118
+ }
1119
+ /** Match GitHub App bot actors (`slug` config vs `slug[bot]` login). */
1120
+ export function isGitHubAppBotAuthor(author, botName) {
1121
+ const normalizedBot = botName === null || botName === void 0 ? void 0 : botName.trim();
1122
+ if (normalizedBot === undefined || normalizedBot === "") {
1123
+ return false;
1124
+ }
1125
+ if ((author === null || author === void 0 ? void 0 : author.type) !== "Bot") {
1126
+ return false;
1127
+ }
1128
+ const login = author.login;
1129
+ const stripBotSuffix = (value) => value.replace(/\[bot\]$/i, "").toLowerCase();
1130
+ return (login.toLowerCase() === normalizedBot.toLowerCase() ||
1131
+ stripBotSuffix(login) === stripBotSuffix(normalizedBot));
1132
+ }
1133
+ function parseIssueCommentEvent(args) {
1134
+ var _a;
1135
+ var _b;
1136
+ const schema = z.object({
1137
+ action: z.string().min(1),
1138
+ repository: repositorySchema,
1139
+ issue: z.object({
1140
+ number: z.number().int().positive(),
1141
+ html_url: z.string().url(),
1142
+ pull_request: z.unknown().optional(),
1143
+ }),
1144
+ comment: z.object({
1145
+ id: z.number(),
1146
+ body: z.string(),
1147
+ html_url: z.string().url(),
1148
+ url: z.string().url().optional(),
1149
+ user: z
1150
+ .object({
1151
+ login: z.string().optional(),
1152
+ id: z.number().optional(),
1153
+ type: z.string().optional(),
1154
+ })
1155
+ .nullable()
1156
+ .optional(),
1157
+ }),
1158
+ sender: senderSchema,
1159
+ installation: installationSchema,
1160
+ });
1161
+ const parsed = schema.safeParse(args.payload);
1162
+ if (!parsed.success)
1163
+ return null;
1164
+ const payload = parsed.data;
1165
+ const kind = payload.issue.pull_request === undefined ? "issue" : "pull_request";
1166
+ const repository = toRepositoryRef(payload.repository);
1167
+ const sender = toUser(payload.sender);
1168
+ const author = toUser(payload.comment.user);
1169
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1170
+ const ctx = Object.assign(Object.assign(Object.assign(Object.assign({}, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), { eventName: "issue_comment", repository, conversation: {
1171
+ kind,
1172
+ number: payload.issue.number,
1173
+ url: payload.issue.html_url,
1174
+ } }), (sender === undefined ? {} : { sender, senderLogin: sender.login })), (installationId === undefined ? {} : { installationId }));
1175
+ const comment = Object.assign({ id: payload.comment.id, body: payload.comment.body, htmlUrl: payload.comment.html_url, url: (_b = payload.comment.url) !== null && _b !== void 0 ? _b : payload.comment.html_url }, (author === undefined ? {} : { author }));
1176
+ return { action: payload.action, ctx, comment };
1177
+ }
1178
+ function parseReviewCommentEvent(args) {
1179
+ var _a;
1180
+ var _b;
1181
+ const schema = z.object({
1182
+ action: z.string().min(1),
1183
+ repository: repositorySchema,
1184
+ pull_request: z.object({
1185
+ number: z.number().int().positive(),
1186
+ html_url: z.string().url(),
1187
+ }),
1188
+ comment: z.object({
1189
+ id: z.number(),
1190
+ body: z.string(),
1191
+ html_url: z.string().url(),
1192
+ url: z.string().url().optional(),
1193
+ path: z.string().optional(),
1194
+ line: z.number().nullable().optional(),
1195
+ pull_request_review_id: z.number().nullable().optional(),
1196
+ in_reply_to_id: z.number().optional(),
1197
+ user: z
1198
+ .object({
1199
+ login: z.string().optional(),
1200
+ id: z.number().optional(),
1201
+ type: z.string().optional(),
1202
+ })
1203
+ .nullable()
1204
+ .optional(),
1205
+ }),
1206
+ sender: senderSchema,
1207
+ installation: installationSchema,
1208
+ });
1209
+ const parsed = schema.safeParse(args.payload);
1210
+ if (!parsed.success)
1211
+ return null;
1212
+ const payload = parsed.data;
1213
+ const repository = toRepositoryRef(payload.repository);
1214
+ const sender = toUser(payload.sender);
1215
+ const author = toUser(payload.comment.user);
1216
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1217
+ const ctx = Object.assign(Object.assign(Object.assign(Object.assign({}, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), { eventName: "pull_request_review_comment", repository, conversation: {
1218
+ kind: "review_thread",
1219
+ number: payload.pull_request.number,
1220
+ url: payload.pull_request.html_url,
1221
+ } }), (sender === undefined ? {} : { sender, senderLogin: sender.login })), (installationId === undefined ? {} : { installationId }));
1222
+ const comment = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ id: payload.comment.id, body: payload.comment.body, htmlUrl: payload.comment.html_url, url: (_b = payload.comment.url) !== null && _b !== void 0 ? _b : payload.comment.html_url }, (author === undefined ? {} : { author })), (payload.comment.path === undefined
1223
+ ? {}
1224
+ : { path: payload.comment.path })), (payload.comment.line === undefined
1225
+ ? {}
1226
+ : { line: payload.comment.line })), (payload.comment.pull_request_review_id === undefined
1227
+ ? {}
1228
+ : { pullRequestReviewId: payload.comment.pull_request_review_id })), (payload.comment.in_reply_to_id === undefined
1229
+ ? {}
1230
+ : { inReplyToId: payload.comment.in_reply_to_id }));
1231
+ return { action: payload.action, ctx, comment };
1232
+ }
1233
+ function parseIssueEvent(args) {
1234
+ var _a, _b;
1235
+ const schema = z.object({
1236
+ action: z.string().min(1),
1237
+ repository: repositorySchema,
1238
+ issue: z.object({
1239
+ number: z.number().int().positive(),
1240
+ html_url: z.string().url(),
1241
+ title: z.string(),
1242
+ body: z.string().nullable().optional(),
1243
+ user: z
1244
+ .object({
1245
+ login: z.string().optional(),
1246
+ })
1247
+ .nullable()
1248
+ .optional(),
1249
+ }),
1250
+ sender: senderSchema,
1251
+ installation: installationSchema,
1252
+ });
1253
+ const parsed = schema.safeParse(args.payload);
1254
+ if (!parsed.success)
1255
+ return null;
1256
+ const payload = parsed.data;
1257
+ const repository = toRepositoryRef(payload.repository);
1258
+ const sender = toUser(payload.sender);
1259
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1260
+ const ctx = Object.assign(Object.assign(Object.assign(Object.assign({}, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), { eventName: "issues", repository, conversation: {
1261
+ kind: "issue",
1262
+ number: payload.issue.number,
1263
+ url: payload.issue.html_url,
1264
+ } }), (sender === undefined ? {} : { sender, senderLogin: sender.login })), (installationId === undefined ? {} : { installationId }));
1265
+ const issue = Object.assign(Object.assign({ action: payload.action, number: payload.issue.number, url: payload.issue.html_url, title: payload.issue.title }, (payload.issue.body === undefined || payload.issue.body === null
1266
+ ? {}
1267
+ : { body: payload.issue.body })), (((_b = payload.issue.user) === null || _b === void 0 ? void 0 : _b.login) === undefined
1268
+ ? {}
1269
+ : { authorLogin: payload.issue.user.login }));
1270
+ return { ctx, issue };
1271
+ }
1272
+ function parseCheckSuiteEvent(args) {
1273
+ var _a;
1274
+ var _b, _c;
1275
+ const schema = z.object({
1276
+ action: z.string().min(1),
1277
+ repository: repositorySchema,
1278
+ check_suite: z.object({
1279
+ id: z.number(),
1280
+ head_sha: z.string().min(1),
1281
+ status: z.string().optional(),
1282
+ conclusion: z.string().nullable().optional(),
1283
+ app: z
1284
+ .object({
1285
+ slug: z.string().optional(),
1286
+ name: z.string().optional(),
1287
+ })
1288
+ .nullable()
1289
+ .optional(),
1290
+ pull_requests: z
1291
+ .array(z.object({
1292
+ number: z.number(),
1293
+ url: z.string().optional(),
1294
+ html_url: z.string().optional(),
1295
+ }))
1296
+ .optional(),
1297
+ }),
1298
+ sender: senderSchema,
1299
+ installation: installationSchema,
1300
+ });
1301
+ const parsed = schema.safeParse(args.payload);
1302
+ if (!parsed.success)
1303
+ return null;
1304
+ const payload = parsed.data;
1305
+ const repository = toRepositoryRef(payload.repository);
1306
+ const sender = toUser(payload.sender);
1307
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1308
+ const pullRequests = toCiPullRequests(payload.check_suite.pull_requests);
1309
+ const checkSuite = Object.assign(Object.assign({ action: payload.action, checkSuiteId: payload.check_suite.id, headSha: payload.check_suite.head_sha }, (payload.check_suite.status === undefined
1310
+ ? {}
1311
+ : { status: payload.check_suite.status })), { conclusion: ((_b = payload.check_suite.conclusion) !== null && _b !== void 0 ? _b : null), app: toCiApp(payload.check_suite.app), pullRequests });
1312
+ const unanchoredCtx = unanchoredEventContext({
1313
+ deliveryId: args.deliveryId,
1314
+ eventName: "check_suite",
1315
+ repository,
1316
+ sender,
1317
+ installationId,
1318
+ });
1319
+ const first = pullRequests[0];
1320
+ if (first === undefined) {
1321
+ return { ctx: null, unanchoredCtx, checkSuite };
1322
+ }
1323
+ return {
1324
+ ctx: Object.assign(Object.assign({}, unanchoredCtx), { conversation: {
1325
+ kind: "pull_request",
1326
+ number: first.number,
1327
+ url: (_c = first.url) !== null && _c !== void 0 ? _c : `${repository.url}/pull/${first.number}`,
1328
+ } }),
1329
+ unanchoredCtx,
1330
+ checkSuite,
1331
+ };
1332
+ }
1333
+ function parseCheckRunEvent(args) {
1334
+ var _a, _b;
1335
+ var _c, _d;
1336
+ const schema = z.object({
1337
+ action: z.string().min(1),
1338
+ repository: repositorySchema,
1339
+ check_run: z.object({
1340
+ id: z.number(),
1341
+ name: z.string().optional(),
1342
+ head_sha: z.string().min(1),
1343
+ status: z.string().optional(),
1344
+ conclusion: z.string().nullable().optional(),
1345
+ html_url: z.string().optional(),
1346
+ check_suite: z
1347
+ .object({
1348
+ id: z.number().optional(),
1349
+ })
1350
+ .optional(),
1351
+ app: z
1352
+ .object({
1353
+ slug: z.string().optional(),
1354
+ name: z.string().optional(),
1355
+ })
1356
+ .nullable()
1357
+ .optional(),
1358
+ pull_requests: z
1359
+ .array(z.object({
1360
+ number: z.number(),
1361
+ url: z.string().optional(),
1362
+ html_url: z.string().optional(),
1363
+ }))
1364
+ .optional(),
1365
+ }),
1366
+ sender: senderSchema,
1367
+ installation: installationSchema,
1368
+ });
1369
+ const parsed = schema.safeParse(args.payload);
1370
+ if (!parsed.success)
1371
+ return null;
1372
+ const payload = parsed.data;
1373
+ const repository = toRepositoryRef(payload.repository);
1374
+ const sender = toUser(payload.sender);
1375
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1376
+ const pullRequests = toCiPullRequests(payload.check_run.pull_requests);
1377
+ const checkRun = Object.assign(Object.assign(Object.assign(Object.assign({ action: payload.action, checkRunId: payload.check_run.id, headSha: payload.check_run.head_sha }, (payload.check_run.name === undefined
1378
+ ? {}
1379
+ : { name: payload.check_run.name })), (((_b = payload.check_run.check_suite) === null || _b === void 0 ? void 0 : _b.id) === undefined
1380
+ ? {}
1381
+ : { checkSuiteId: payload.check_run.check_suite.id })), (payload.check_run.status === undefined
1382
+ ? {}
1383
+ : { status: payload.check_run.status })), { conclusion: ((_c = payload.check_run.conclusion) !== null && _c !== void 0 ? _c : null), app: toCiApp(payload.check_run.app), pullRequests });
1384
+ const unanchoredCtx = unanchoredEventContext({
1385
+ deliveryId: args.deliveryId,
1386
+ eventName: "check_run",
1387
+ repository,
1388
+ sender,
1389
+ installationId,
1390
+ });
1391
+ const first = pullRequests[0];
1392
+ if (first === undefined) {
1393
+ return { ctx: null, unanchoredCtx, checkRun };
1394
+ }
1395
+ return {
1396
+ ctx: Object.assign(Object.assign({}, unanchoredCtx), { conversation: {
1397
+ kind: "pull_request",
1398
+ number: first.number,
1399
+ url: (_d = first.url) !== null && _d !== void 0 ? _d : `${repository.url}/pull/${first.number}`,
1400
+ } }),
1401
+ unanchoredCtx,
1402
+ checkRun,
1403
+ };
1404
+ }
1405
+ function parseWorkflowRunEvent(args) {
1406
+ var _a;
1407
+ var _b, _c;
1408
+ const schema = z.object({
1409
+ action: z.string().min(1),
1410
+ repository: repositorySchema,
1411
+ workflow_run: z.object({
1412
+ id: z.number(),
1413
+ name: z.string().nullable().optional(),
1414
+ workflow_id: z.number().optional(),
1415
+ head_sha: z.string().min(1),
1416
+ status: z.string().optional(),
1417
+ conclusion: z.string().nullable().optional(),
1418
+ html_url: z.string().optional(),
1419
+ pull_requests: z
1420
+ .array(z.object({
1421
+ number: z.number(),
1422
+ url: z.string().optional(),
1423
+ html_url: z.string().optional(),
1424
+ }))
1425
+ .optional(),
1426
+ }),
1427
+ sender: senderSchema,
1428
+ installation: installationSchema,
1429
+ });
1430
+ const parsed = schema.safeParse(args.payload);
1431
+ if (!parsed.success)
1432
+ return null;
1433
+ const payload = parsed.data;
1434
+ const repository = toRepositoryRef(payload.repository);
1435
+ const sender = toUser(payload.sender);
1436
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1437
+ const pullRequests = toCiPullRequests(payload.workflow_run.pull_requests);
1438
+ const workflowRun = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ action: payload.action, workflowRunId: payload.workflow_run.id, headSha: payload.workflow_run.head_sha }, (payload.workflow_run.name === undefined ||
1439
+ payload.workflow_run.name === null
1440
+ ? {}
1441
+ : { name: payload.workflow_run.name })), (payload.workflow_run.workflow_id === undefined
1442
+ ? {}
1443
+ : { workflowId: payload.workflow_run.workflow_id })), (payload.workflow_run.html_url === undefined
1444
+ ? {}
1445
+ : { htmlUrl: payload.workflow_run.html_url })), (payload.workflow_run.status === undefined
1446
+ ? {}
1447
+ : { status: payload.workflow_run.status })), { conclusion: ((_b = payload.workflow_run.conclusion) !== null && _b !== void 0 ? _b : null),
1448
+ // workflow_run is GitHub Actions-only (Eve semantics).
1449
+ app: { slug: "github-actions", name: "GitHub Actions" }, pullRequests });
1450
+ const unanchoredCtx = unanchoredEventContext({
1451
+ deliveryId: args.deliveryId,
1452
+ eventName: "workflow_run",
1453
+ repository,
1454
+ sender,
1455
+ installationId,
1456
+ });
1457
+ const first = pullRequests[0];
1458
+ if (first === undefined) {
1459
+ return { ctx: null, unanchoredCtx, workflowRun };
1460
+ }
1461
+ return {
1462
+ ctx: Object.assign(Object.assign({}, unanchoredCtx), { conversation: {
1463
+ kind: "pull_request",
1464
+ number: first.number,
1465
+ url: (_c = first.url) !== null && _c !== void 0 ? _c : `${repository.url}/pull/${first.number}`,
1466
+ } }),
1467
+ unanchoredCtx,
1468
+ workflowRun,
1469
+ };
1470
+ }
1471
+ function parseStatusEvent(args) {
1472
+ var _a;
1473
+ var _b, _c, _d, _e;
1474
+ const schema = z.object({
1475
+ state: z.string().min(1),
1476
+ sha: z.string().min(1),
1477
+ context: z.string().optional(),
1478
+ description: z.string().nullable().optional(),
1479
+ target_url: z.string().nullable().optional(),
1480
+ name: z.string().optional(),
1481
+ branches: z
1482
+ .array(z.object({
1483
+ name: z.string(),
1484
+ commit: z.object({ sha: z.string().optional() }).optional(),
1485
+ }))
1486
+ .optional(),
1487
+ commit: z
1488
+ .object({
1489
+ sha: z.string().optional(),
1490
+ html_url: z.string().optional(),
1491
+ })
1492
+ .optional(),
1493
+ repository: repositorySchema,
1494
+ sender: senderSchema,
1495
+ installation: installationSchema,
1496
+ pull_requests: z
1497
+ .array(z.object({
1498
+ number: z.number(),
1499
+ url: z.string().optional(),
1500
+ html_url: z.string().optional(),
1501
+ }))
1502
+ .optional(),
1503
+ });
1504
+ const parsed = schema.safeParse(args.payload);
1505
+ if (!parsed.success)
1506
+ return null;
1507
+ const payload = parsed.data;
1508
+ const repository = toRepositoryRef(payload.repository);
1509
+ const sender = toUser(payload.sender);
1510
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1511
+ const pullRequests = toCiPullRequests(payload.pull_requests);
1512
+ const first = pullRequests[0];
1513
+ const status = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ state: payload.state, context: (_b = payload.context) !== null && _b !== void 0 ? _b : "" }, (payload.description === undefined
1514
+ ? {}
1515
+ : { description: payload.description })), (payload.target_url === undefined
1516
+ ? {}
1517
+ : { targetUrl: payload.target_url })), { sha: payload.sha }), (payload.name === undefined ? {} : { name: payload.name })), { branches: ((_c = payload.branches) !== null && _c !== void 0 ? _c : []).map((branch) => (Object.assign({ name: branch.name }, (branch.commit === undefined ? {} : { commit: branch.commit })))) }), (payload.commit === undefined
1518
+ ? {}
1519
+ : {
1520
+ commit: Object.assign(Object.assign({}, (payload.commit.sha === undefined
1521
+ ? {}
1522
+ : { sha: payload.commit.sha })), (payload.commit.html_url === undefined
1523
+ ? {}
1524
+ : { htmlUrl: payload.commit.html_url })),
1525
+ })), { raw: args.payload });
1526
+ const ctx = Object.assign(Object.assign(Object.assign(Object.assign({}, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), { eventName: "status", repository, conversation: {
1527
+ kind: "pull_request",
1528
+ number: (_d = first === null || first === void 0 ? void 0 : first.number) !== null && _d !== void 0 ? _d : 0,
1529
+ url: (_e = first === null || first === void 0 ? void 0 : first.url) !== null && _e !== void 0 ? _e : repository.url,
1530
+ } }), (sender === undefined ? {} : { sender, senderLogin: sender.login })), (installationId === undefined ? {} : { installationId }));
1531
+ return { ctx, status };
1532
+ }
1533
+ function parseGenericEvent(args) {
1534
+ var _a, _b, _c, _d, _e, _f;
1535
+ var _g, _h, _j, _k;
1536
+ const schema = z.object({
1537
+ action: z.string().optional(),
1538
+ repository: repositorySchema.optional(),
1539
+ sender: senderSchema,
1540
+ installation: installationSchema,
1541
+ issue: z
1542
+ .object({
1543
+ number: z.number().int().positive(),
1544
+ html_url: z.string().url().optional(),
1545
+ pull_request: z.unknown().optional(),
1546
+ })
1547
+ .optional(),
1548
+ pull_request: z
1549
+ .object({
1550
+ number: z.number().int().positive(),
1551
+ html_url: z.string().url().optional(),
1552
+ })
1553
+ .optional(),
1554
+ });
1555
+ const parsed = schema.safeParse(args.payload);
1556
+ if (!parsed.success) {
1557
+ return null;
1558
+ }
1559
+ const payload = parsed.data;
1560
+ if (payload.repository === undefined) {
1561
+ return null;
1562
+ }
1563
+ const repository = toRepositoryRef(payload.repository);
1564
+ const sender = toUser(payload.sender);
1565
+ const installationId = (_a = payload.installation) === null || _a === void 0 ? void 0 : _a.id;
1566
+ const kind = ((_b = payload.issue) === null || _b === void 0 ? void 0 : _b.pull_request) !== undefined
1567
+ ? "pull_request"
1568
+ : payload.issue !== undefined
1569
+ ? "issue"
1570
+ : "pull_request";
1571
+ const number = (_h = (_g = (_c = payload.issue) === null || _c === void 0 ? void 0 : _c.number) !== null && _g !== void 0 ? _g : (_d = payload.pull_request) === null || _d === void 0 ? void 0 : _d.number) !== null && _h !== void 0 ? _h : 0;
1572
+ const url = (_k = (_j = (_e = payload.issue) === null || _e === void 0 ? void 0 : _e.html_url) !== null && _j !== void 0 ? _j : (_f = payload.pull_request) === null || _f === void 0 ? void 0 : _f.html_url) !== null && _k !== void 0 ? _k : repository.url;
1573
+ const event = Object.assign(Object.assign(Object.assign({ eventName: args.eventName }, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), (payload.action === undefined ? {} : { action: payload.action })), { payload: args.payload });
1574
+ const ctx = Object.assign(Object.assign(Object.assign(Object.assign({}, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), { eventName: args.eventName, repository, conversation: { kind, number, url } }), (sender === undefined ? {} : { sender, senderLogin: sender.login })), (installationId === undefined ? {} : { installationId }));
1575
+ return { ctx, event };
1576
+ }
1577
+ function unanchoredEventContext(args) {
1578
+ return Object.assign(Object.assign(Object.assign(Object.assign({}, (args.deliveryId === undefined ? {} : { deliveryId: args.deliveryId })), { eventName: args.eventName, repository: args.repository, conversation: {
1579
+ kind: "pull_request",
1580
+ number: 0,
1581
+ url: args.repository.url,
1582
+ } }), (args.sender === undefined
1583
+ ? {}
1584
+ : { sender: args.sender, senderLogin: args.sender.login })), (args.installationId === undefined
1585
+ ? {}
1586
+ : { installationId: args.installationId }));
1587
+ }
1588
+ function toRepositoryRef(repo) {
1589
+ var _a;
1590
+ var _b, _c, _d, _e;
1591
+ const [ownerFromName, nameFromFull] = repo.full_name.split("/");
1592
+ return Object.assign({ fullName: repo.full_name, url: repo.html_url, owner: (_c = (_b = (_a = repo.owner) === null || _a === void 0 ? void 0 : _a.login) !== null && _b !== void 0 ? _b : ownerFromName) !== null && _c !== void 0 ? _c : "", name: (_e = (_d = repo.name) !== null && _d !== void 0 ? _d : nameFromFull) !== null && _e !== void 0 ? _e : repo.full_name }, (repo.id === undefined ? {} : { id: repo.id }));
1593
+ }
1594
+ function toUser(raw) {
1595
+ if ((raw === null || raw === void 0 ? void 0 : raw.login) === undefined || raw.login === "")
1596
+ return undefined;
1597
+ return Object.assign(Object.assign({ login: raw.login }, (raw.id === undefined ? {} : { id: raw.id })), (raw.type === undefined ? {} : { type: raw.type }));
1598
+ }
1599
+ function toCiPullRequests(raw) {
1600
+ return (raw !== null && raw !== void 0 ? raw : []).map((pr) => (Object.assign({ number: pr.number }, (pr.html_url !== undefined
1601
+ ? { url: pr.html_url }
1602
+ : pr.url !== undefined
1603
+ ? { url: pr.url }
1604
+ : {}))));
1605
+ }
1606
+ function toCiApp(raw) {
1607
+ return Object.assign(Object.assign({}, ((raw === null || raw === void 0 ? void 0 : raw.slug) === undefined ? {} : { slug: raw.slug })), ((raw === null || raw === void 0 ? void 0 : raw.name) === undefined ? {} : { name: raw.name }));
1608
+ }
1609
+ function escapeRegExp(value) {
1610
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1611
+ }
1612
+ /**
1613
+ * Attach the GitHub API + thread handles to a parsed context, producing the
1614
+ * full {@link GitHubEventContext} handed to inbound hooks.
1615
+ */
1616
+ function enrichEventContext(input) {
1617
+ const { github, thread } = buildGitHubBinding({
1618
+ config: input.bindingConfig,
1619
+ state: input.bindingState,
1620
+ });
1621
+ return Object.assign(Object.assign(Object.assign({}, input.ctx), (input.installationId === undefined
1622
+ ? {}
1623
+ : { installationId: input.installationId })), { github,
1624
+ thread, host: input.host });
1625
+ }
1626
+ /**
1627
+ * Enrich an unanchored CI context (`conversation.number === 0`). The binding
1628
+ * still resolves `github`, but `thread.post` throws until a PR is attached.
1629
+ */
1630
+ function enrichCiContext(input) {
1631
+ const binding = githubBindingStateForEvent({
1632
+ kind: input.ctx.conversation.kind,
1633
+ owner: input.ctx.repository.owner,
1634
+ repo: input.ctx.repository.name,
1635
+ number: input.ctx.conversation.number,
1636
+ repositoryId: input.ctx.repository.id,
1637
+ installationId: input.installationId,
1638
+ });
1639
+ return enrichEventContext({
1640
+ bindingConfig: input.bindingConfig,
1641
+ ctx: input.ctx,
1642
+ bindingState: binding,
1643
+ installationId: input.installationId,
1644
+ host: input.host,
1645
+ });
1646
+ }
1647
+ /** Build the durable per-session channel state stored with the turn. */
1648
+ function sessionStateFromBinding(input) {
1649
+ var _a, _b, _c, _d;
1650
+ return emptyGitHubChannelState(Object.assign(Object.assign({}, input.binding), { deliveryId: (_a = input.deliveryId) !== null && _a !== void 0 ? _a : null, eventName: input.eventName, headSha: (_b = input.headSha) !== null && _b !== void 0 ? _b : null, baseRef: (_c = input.baseRef) !== null && _c !== void 0 ? _c : null, headRef: (_d = input.headRef) !== null && _d !== void 0 ? _d : null }));
1651
+ }
1652
+ /** Read `installation.id` from a raw webhook payload when present. */
1653
+ function readInstallationId(payload) {
1654
+ if (typeof payload !== "object" || payload === null)
1655
+ return undefined;
1656
+ const installation = payload
1657
+ .installation;
1658
+ return typeof (installation === null || installation === void 0 ? void 0 : installation.id) === "number" ? installation.id : undefined;
1659
+ }
1660
+ function envWebhookSecret() {
1661
+ if (process.env.GITHUB_WEBHOOK_SECRET === undefined ||
1662
+ process.env.GITHUB_WEBHOOK_SECRET === "") {
1663
+ return undefined;
1664
+ }
1665
+ return () => process.env.GITHUB_WEBHOOK_SECRET;
1666
+ }
1667
+ function resolveCloudOptions(cloud, ctx, pullRequest) {
1668
+ return __awaiter(this, void 0, void 0, function* () {
1669
+ if (cloud === undefined || cloud === false) {
1670
+ return undefined;
1671
+ }
1672
+ if (cloud === true) {
1673
+ return {
1674
+ repos: [
1675
+ {
1676
+ url: ctx.repository.url,
1677
+ prUrl: pullRequest.url,
1678
+ startingRef: pullRequest.headSha,
1679
+ },
1680
+ ],
1681
+ };
1682
+ }
1683
+ if (typeof cloud === "function") {
1684
+ return yield cloud(ctx, pullRequest);
1685
+ }
1686
+ return cloud;
1687
+ });
1688
+ }