@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,374 @@
1
+ /**
2
+ * GitHub REST helpers backed by `@octokit/rest`.
3
+ *
4
+ * Channel hooks should prefer `ctx.github` / `ctx.thread`. Use
5
+ * {@link createGitHubOctokit} (or `ctx.github.getOctokit()`) when you need
6
+ * typed Octokit methods directly.
7
+ */
8
+
9
+ import { createAppAuth } from "@octokit/auth-app";
10
+ import { Octokit } from "@octokit/rest";
11
+ import {
12
+ type GitHubAuthApiOptions,
13
+ hasGitHubAppCredentials,
14
+ resolveCredentialValue,
15
+ resolveGitHubAccessToken,
16
+ resolveGitHubAppId,
17
+ resolveGitHubInstallationId,
18
+ resolveGitHubPrivateKey,
19
+ } from "./auth.js";
20
+ import type { GitHubChannelCredentials } from "./types.js";
21
+
22
+ export type GitHubJsonObject = Record<string, unknown>;
23
+ export type GitHubApiMethod = "DELETE" | "GET" | "PATCH" | "POST" | "PUT";
24
+
25
+ export interface GitHubApiOptions extends GitHubAuthApiOptions {}
26
+
27
+ export interface GitHubApiResponse<T = unknown> {
28
+ body: T;
29
+ ok: boolean;
30
+ status: number;
31
+ }
32
+
33
+ export class GitHubApiError extends Error {
34
+ readonly body: unknown;
35
+ readonly method: string;
36
+ readonly path: string;
37
+ readonly status: number;
38
+
39
+ constructor(input: {
40
+ body: unknown;
41
+ method: string;
42
+ path: string;
43
+ status: number;
44
+ }) {
45
+ super(
46
+ `GitHub ${input.method} ${input.path} failed with HTTP ${input.status}.`
47
+ );
48
+ this.name = "GitHubApiError";
49
+ this.body = input.body;
50
+ this.method = input.method;
51
+ this.path = input.path;
52
+ this.status = input.status;
53
+ }
54
+ }
55
+
56
+ export interface GitHubPostedComment {
57
+ htmlUrl: string | undefined;
58
+ id: number;
59
+ raw: unknown;
60
+ url: string | undefined;
61
+ }
62
+
63
+ export type GitHubReactionContent =
64
+ | "+1"
65
+ | "-1"
66
+ | "confused"
67
+ | "eyes"
68
+ | "heart"
69
+ | "hooray"
70
+ | "laugh"
71
+ | "rocket";
72
+
73
+ interface GitHubResourceInput {
74
+ api?: GitHubApiOptions;
75
+ credentials?: GitHubChannelCredentials;
76
+ installationId?: number;
77
+ owner: string;
78
+ repo: string;
79
+ }
80
+
81
+ /**
82
+ * Build an authenticated Octokit client.
83
+ *
84
+ * Prefer explicit bearer tokens, then GitHub App installation auth (when App
85
+ * credentials + an installation id are available), then local PAT /
86
+ * `gh auth token`. App auth uses `@octokit/auth-app` so Octokit refreshes
87
+ * installation tokens itself.
88
+ */
89
+ export async function createGitHubOctokit(input: {
90
+ api?: GitHubApiOptions;
91
+ credentials?: GitHubChannelCredentials;
92
+ installationId?: number;
93
+ }): Promise<Octokit> {
94
+ const requestOptions =
95
+ input.api?.fetch === undefined ? undefined : { fetch: input.api.fetch };
96
+ const baseUrl = input.api?.apiBaseUrl;
97
+
98
+ const explicit =
99
+ (await resolveCredentialValue(input.credentials?.token)) ??
100
+ (await resolveCredentialValue(input.credentials?.installationToken));
101
+ if (explicit !== undefined) {
102
+ return new Octokit({
103
+ auth: explicit,
104
+ ...(baseUrl === undefined ? {} : { baseUrl }),
105
+ ...(requestOptions === undefined ? {} : { request: requestOptions }),
106
+ });
107
+ }
108
+
109
+ const installationId = await resolveGitHubInstallationId(
110
+ input.installationId
111
+ );
112
+ if (
113
+ installationId !== undefined &&
114
+ (await hasGitHubAppCredentials(input.credentials))
115
+ ) {
116
+ const appId = await resolveGitHubAppId(input.credentials?.appId);
117
+ const privateKey = await resolveGitHubPrivateKey(
118
+ input.credentials?.privateKey
119
+ );
120
+ return new Octokit({
121
+ authStrategy: createAppAuth,
122
+ auth: {
123
+ appId,
124
+ privateKey,
125
+ installationId,
126
+ },
127
+ ...(baseUrl === undefined ? {} : { baseUrl }),
128
+ ...(requestOptions === undefined ? {} : { request: requestOptions }),
129
+ });
130
+ }
131
+
132
+ // Local testing: ambient PAT / `gh auth token` when App creds are unset.
133
+ const token = await resolveGitHubAccessToken(input);
134
+ return new Octokit({
135
+ auth: token,
136
+ ...(baseUrl === undefined ? {} : { baseUrl }),
137
+ ...(requestOptions === undefined ? {} : { request: requestOptions }),
138
+ });
139
+ }
140
+
141
+ /**
142
+ * Call a GitHub REST path with channel auth. Prefer typed Octokit methods via
143
+ * {@link createGitHubOctokit} / `ctx.github.getOctokit()` when possible.
144
+ */
145
+ export async function callGitHubApi<T = unknown>(input: {
146
+ api?: GitHubApiOptions;
147
+ body?: GitHubJsonObject;
148
+ credentials?: GitHubChannelCredentials;
149
+ installationId?: number;
150
+ method: GitHubApiMethod;
151
+ path: string;
152
+ options?: { auth?: boolean; headers?: Readonly<Record<string, string>> };
153
+ }): Promise<GitHubApiResponse<T>> {
154
+ if (input.options?.auth === false) {
155
+ const octokit = new Octokit({
156
+ ...(input.api?.apiBaseUrl === undefined
157
+ ? {}
158
+ : { baseUrl: input.api.apiBaseUrl }),
159
+ ...(input.api?.fetch === undefined
160
+ ? {}
161
+ : { request: { fetch: input.api.fetch } }),
162
+ });
163
+ return requestWithOctokit(octokit, input);
164
+ }
165
+
166
+ const octokit = await createGitHubOctokit({
167
+ api: input.api,
168
+ credentials: input.credentials,
169
+ installationId: input.installationId,
170
+ });
171
+ return requestWithOctokit(octokit, input);
172
+ }
173
+
174
+ async function requestWithOctokit<T>(
175
+ octokit: Octokit,
176
+ input: {
177
+ body?: GitHubJsonObject;
178
+ method: GitHubApiMethod;
179
+ path: string;
180
+ options?: { headers?: Readonly<Record<string, string>> };
181
+ }
182
+ ): Promise<GitHubApiResponse<T>> {
183
+ try {
184
+ const route = `${input.method} ${normalizeRequestPath(input.path)}`;
185
+ const response = await octokit.request(route, {
186
+ ...(input.body ?? {}),
187
+ ...(input.options?.headers === undefined
188
+ ? {}
189
+ : { headers: input.options.headers }),
190
+ });
191
+ return {
192
+ body: response.data as T,
193
+ ok: true,
194
+ status: response.status,
195
+ };
196
+ } catch (error) {
197
+ if (isOctokitRequestError(error)) {
198
+ throw new GitHubApiError({
199
+ body: error.response?.data,
200
+ method: input.method,
201
+ path: input.path,
202
+ status: error.status,
203
+ });
204
+ }
205
+ throw error;
206
+ }
207
+ }
208
+
209
+ /** Create an issue or PR timeline comment. */
210
+ export async function createGitHubIssueComment(
211
+ input: GitHubResourceInput & { body: string; issueNumber: number }
212
+ ): Promise<GitHubPostedComment> {
213
+ const octokit = await createGitHubOctokit(input);
214
+ try {
215
+ const response = await octokit.rest.issues.createComment({
216
+ owner: input.owner,
217
+ repo: input.repo,
218
+ issue_number: input.issueNumber,
219
+ body: input.body,
220
+ });
221
+ return toPostedComment(response.data);
222
+ } catch (error) {
223
+ throw wrapOctokitError(
224
+ error,
225
+ "POST",
226
+ `/repos/${input.owner}/${input.repo}/issues/${input.issueNumber}/comments`
227
+ );
228
+ }
229
+ }
230
+
231
+ /** Reply to an inline pull-request review comment thread. */
232
+ export async function createGitHubReviewCommentReply(
233
+ input: GitHubResourceInput & {
234
+ body: string;
235
+ commentId: number;
236
+ pullRequestNumber: number;
237
+ }
238
+ ): Promise<GitHubPostedComment> {
239
+ const octokit = await createGitHubOctokit(input);
240
+ try {
241
+ const response = await octokit.rest.pulls.createReplyForReviewComment({
242
+ owner: input.owner,
243
+ repo: input.repo,
244
+ pull_number: input.pullRequestNumber,
245
+ comment_id: input.commentId,
246
+ body: input.body,
247
+ });
248
+ return toPostedComment(response.data);
249
+ } catch (error) {
250
+ throw wrapOctokitError(
251
+ error,
252
+ "POST",
253
+ `/repos/${input.owner}/${input.repo}/pulls/${input.pullRequestNumber}/comments/${input.commentId}/replies`
254
+ );
255
+ }
256
+ }
257
+
258
+ /** Create a reaction on an issue or review comment. */
259
+ export async function createGitHubReaction(
260
+ input: GitHubResourceInput & {
261
+ commentId: number;
262
+ content: GitHubReactionContent;
263
+ subject: "issue_comment" | "pull_request_review_comment";
264
+ }
265
+ ): Promise<GitHubApiResponse> {
266
+ const octokit = await createGitHubOctokit(input);
267
+ try {
268
+ const response =
269
+ input.subject === "issue_comment"
270
+ ? await octokit.rest.reactions.createForIssueComment({
271
+ owner: input.owner,
272
+ repo: input.repo,
273
+ comment_id: input.commentId,
274
+ content: input.content,
275
+ })
276
+ : await octokit.rest.reactions.createForPullRequestReviewComment({
277
+ owner: input.owner,
278
+ repo: input.repo,
279
+ comment_id: input.commentId,
280
+ content: input.content,
281
+ });
282
+ return {
283
+ body: response.data,
284
+ ok: true,
285
+ status: response.status,
286
+ };
287
+ } catch (error) {
288
+ const segment =
289
+ input.subject === "issue_comment" ? "issues/comments" : "pulls/comments";
290
+ throw wrapOctokitError(
291
+ error,
292
+ "POST",
293
+ `/repos/${input.owner}/${input.repo}/${segment}/${input.commentId}/reactions`
294
+ );
295
+ }
296
+ }
297
+
298
+ /** Create a commit status (legacy `statuses` API). */
299
+ export async function createGitHubCommitStatus(
300
+ input: GitHubResourceInput & {
301
+ sha: string;
302
+ state: "error" | "failure" | "pending" | "success";
303
+ context?: string;
304
+ description?: string;
305
+ targetUrl?: string;
306
+ }
307
+ ): Promise<GitHubApiResponse> {
308
+ const octokit = await createGitHubOctokit(input);
309
+ try {
310
+ const response = await octokit.rest.repos.createCommitStatus({
311
+ owner: input.owner,
312
+ repo: input.repo,
313
+ sha: input.sha,
314
+ state: input.state,
315
+ ...(input.context === undefined ? {} : { context: input.context }),
316
+ ...(input.description === undefined
317
+ ? {}
318
+ : { description: input.description }),
319
+ ...(input.targetUrl === undefined ? {} : { target_url: input.targetUrl }),
320
+ });
321
+ return {
322
+ body: response.data,
323
+ ok: true,
324
+ status: response.status,
325
+ };
326
+ } catch (error) {
327
+ throw wrapOctokitError(
328
+ error,
329
+ "POST",
330
+ `/repos/${input.owner}/${input.repo}/statuses/${input.sha}`
331
+ );
332
+ }
333
+ }
334
+
335
+ function toPostedComment(raw: {
336
+ html_url?: string;
337
+ id?: number;
338
+ url?: string;
339
+ }): GitHubPostedComment {
340
+ return {
341
+ htmlUrl: typeof raw.html_url === "string" ? raw.html_url : undefined,
342
+ id: typeof raw.id === "number" ? raw.id : 0,
343
+ raw,
344
+ url: typeof raw.url === "string" ? raw.url : undefined,
345
+ };
346
+ }
347
+
348
+ function normalizeRequestPath(path: string): string {
349
+ return path.startsWith("/") ? path : `/${path}`;
350
+ }
351
+
352
+ function isOctokitRequestError(error: unknown): error is {
353
+ status: number;
354
+ response?: { data?: unknown };
355
+ } {
356
+ return (
357
+ typeof error === "object" &&
358
+ error !== null &&
359
+ "status" in error &&
360
+ typeof (error as { status: unknown }).status === "number"
361
+ );
362
+ }
363
+
364
+ function wrapOctokitError(error: unknown, method: string, path: string): Error {
365
+ if (isOctokitRequestError(error)) {
366
+ return new GitHubApiError({
367
+ body: error.response?.data,
368
+ method,
369
+ path,
370
+ status: error.status,
371
+ });
372
+ }
373
+ return error instanceof Error ? error : new Error(String(error));
374
+ }
@@ -0,0 +1,275 @@
1
+ /**
2
+ * GitHub API token resolution for the channel pack.
3
+ *
4
+ * Resolution order for authenticated REST calls:
5
+ * 1. `credentials.token` / `credentials.installationToken` (explicit)
6
+ * 2. GitHub App JWT → installation access token (when App creds + installation
7
+ * id are available — webhook `installation.id` or `GITHUB_APP_INSTALLATION_ID`)
8
+ * 3. `GITHUB_TOKEN` / `GH_TOKEN` env (local PAT / fine-grained token)
9
+ * 4. `gh auth token` (local CLI session)
10
+ *
11
+ * Production should set App credentials and omit ambient PATs. Local testing
12
+ * can keep using a PAT or `gh auth login` when App creds are unset.
13
+ */
14
+
15
+ import { execFile } from "node:child_process";
16
+ import { promisify } from "node:util";
17
+ import { createAppAuth } from "@octokit/auth-app";
18
+ import type {
19
+ GitHubChannelCredentials,
20
+ GitHubCredentialValue,
21
+ } from "./types.js";
22
+
23
+ const execFileAsync = promisify(execFile);
24
+
25
+ export interface GitHubAuthApiOptions {
26
+ apiBaseUrl?: string;
27
+ fetch?: typeof fetch;
28
+ }
29
+
30
+ let ghAuthTokenCache: { token: string; expiresAtMs: number } | null = null;
31
+ const GH_AUTH_CACHE_MS = 5 * 60_000;
32
+
33
+ /** Refresh exported `GH_TOKEN` before installation tokens expire (~60m). */
34
+ const GH_CLI_TOKEN_REFRESH_MS = 50 * 60_000;
35
+ let ghCliTokenRefreshTimer: ReturnType<typeof setInterval> | null = null;
36
+
37
+ /** Resolve a credential value (literal or lazy). */
38
+ export async function resolveCredentialValue(
39
+ value: GitHubCredentialValue | undefined
40
+ ): Promise<string | undefined> {
41
+ if (value === undefined) {
42
+ return undefined;
43
+ }
44
+ const resolved = typeof value === "function" ? await value() : value;
45
+ if (typeof resolved !== "string") {
46
+ return undefined;
47
+ }
48
+ const trimmed = resolved.trim();
49
+ return trimmed === "" ? undefined : trimmed;
50
+ }
51
+
52
+ /** True when App id + private key are configured (credentials or env). */
53
+ export async function hasGitHubAppCredentials(
54
+ credentials?: GitHubChannelCredentials
55
+ ): Promise<boolean> {
56
+ try {
57
+ await resolveGitHubAppId(credentials?.appId);
58
+ await resolveGitHubPrivateKey(credentials?.privateKey);
59
+ return true;
60
+ } catch {
61
+ return false;
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Resolve an installation id from the call site, then
67
+ * `GITHUB_APP_INSTALLATION_ID` (host / non-webhook GitHub calls).
68
+ */
69
+ export async function resolveGitHubInstallationId(
70
+ installationId?: number
71
+ ): Promise<number | undefined> {
72
+ if (
73
+ installationId !== undefined &&
74
+ Number.isInteger(installationId) &&
75
+ installationId > 0
76
+ ) {
77
+ return installationId;
78
+ }
79
+ const fromEnv = await resolveCredentialValue(
80
+ process.env.GITHUB_APP_INSTALLATION_ID
81
+ );
82
+ if (fromEnv === undefined) {
83
+ return undefined;
84
+ }
85
+ if (!/^[1-9][0-9]*$/u.test(fromEnv)) {
86
+ return undefined;
87
+ }
88
+ return Number(fromEnv);
89
+ }
90
+
91
+ /**
92
+ * Resolve a bearer token for GitHub REST calls. Prefer explicit credentials,
93
+ * then App installation tokens when configured, then local PAT / `gh auth`.
94
+ */
95
+ export async function resolveGitHubAccessToken(input: {
96
+ api?: GitHubAuthApiOptions;
97
+ credentials?: GitHubChannelCredentials;
98
+ installationId?: number;
99
+ }): Promise<string> {
100
+ const explicit =
101
+ (await resolveCredentialValue(input.credentials?.token)) ??
102
+ (await resolveCredentialValue(input.credentials?.installationToken));
103
+ if (explicit !== undefined) {
104
+ return explicit;
105
+ }
106
+
107
+ const installationId = await resolveGitHubInstallationId(
108
+ input.installationId
109
+ );
110
+ if (
111
+ installationId !== undefined &&
112
+ (await hasGitHubAppCredentials(input.credentials))
113
+ ) {
114
+ return createGitHubInstallationToken({
115
+ api: input.api,
116
+ appId: input.credentials?.appId,
117
+ installationId,
118
+ privateKey: input.credentials?.privateKey,
119
+ });
120
+ }
121
+
122
+ const fromEnv =
123
+ (await resolveCredentialValue(process.env.GITHUB_TOKEN)) ??
124
+ (await resolveCredentialValue(process.env.GH_TOKEN));
125
+ if (fromEnv !== undefined) {
126
+ return fromEnv;
127
+ }
128
+
129
+ const fromGh = await tryResolveGhAuthToken();
130
+ if (fromGh !== undefined) {
131
+ return fromGh;
132
+ }
133
+
134
+ throw new Error(
135
+ "githubChannel: no GitHub token available (set GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY + installation id, or GITHUB_TOKEN / GH_TOKEN, or run `gh auth login`)."
136
+ );
137
+ }
138
+
139
+ /** Soft resolve — returns undefined instead of throwing. */
140
+ export async function tryResolveGitHubAccessToken(input: {
141
+ api?: GitHubAuthApiOptions;
142
+ credentials?: GitHubChannelCredentials;
143
+ installationId?: number;
144
+ }): Promise<string | undefined> {
145
+ try {
146
+ return await resolveGitHubAccessToken(input);
147
+ } catch {
148
+ return undefined;
149
+ }
150
+ }
151
+
152
+ /** Read `gh auth token` when the CLI is logged in. Cached briefly. */
153
+ export async function tryResolveGhAuthToken(): Promise<string | undefined> {
154
+ if (ghAuthTokenCache !== null && Date.now() < ghAuthTokenCache.expiresAtMs) {
155
+ return ghAuthTokenCache.token;
156
+ }
157
+ try {
158
+ const { stdout } = await execFileAsync("gh", ["auth", "token"], {
159
+ timeout: 5_000,
160
+ env: process.env,
161
+ });
162
+ const token = stdout.trim();
163
+ if (token === "") {
164
+ return undefined;
165
+ }
166
+ ghAuthTokenCache = {
167
+ token,
168
+ expiresAtMs: Date.now() + GH_AUTH_CACHE_MS,
169
+ };
170
+ return token;
171
+ } catch {
172
+ return undefined;
173
+ }
174
+ }
175
+
176
+ export async function resolveGitHubAppId(
177
+ appId?: GitHubCredentialValue | number
178
+ ): Promise<string> {
179
+ const source =
180
+ appId ??
181
+ (process.env.GITHUB_APP_ID !== undefined && process.env.GITHUB_APP_ID !== ""
182
+ ? process.env.GITHUB_APP_ID
183
+ : undefined);
184
+ if (source === undefined) {
185
+ throw new Error("githubChannel: GITHUB_APP_ID is required.");
186
+ }
187
+ if (typeof source === "number") {
188
+ return String(source);
189
+ }
190
+ const value = await resolveCredentialValue(source);
191
+ if (value === undefined) {
192
+ throw new Error("githubChannel: GITHUB_APP_ID is required.");
193
+ }
194
+ return value;
195
+ }
196
+
197
+ export async function resolveGitHubPrivateKey(
198
+ privateKey?: GitHubCredentialValue
199
+ ): Promise<string> {
200
+ const source =
201
+ privateKey ??
202
+ (process.env.GITHUB_APP_PRIVATE_KEY !== undefined &&
203
+ process.env.GITHUB_APP_PRIVATE_KEY !== ""
204
+ ? process.env.GITHUB_APP_PRIVATE_KEY
205
+ : undefined);
206
+ if (source === undefined) {
207
+ throw new Error("githubChannel: GITHUB_APP_PRIVATE_KEY is required.");
208
+ }
209
+ const value = await resolveCredentialValue(source);
210
+ if (value === undefined) {
211
+ throw new Error("githubChannel: GITHUB_APP_PRIVATE_KEY is required.");
212
+ }
213
+ return value.replace(/\\n/gu, "\n");
214
+ }
215
+
216
+ /**
217
+ * Mint an installation access token via `@octokit/auth-app`.
218
+ * Prefer {@link createGitHubOctokit} for normal API work — this is for
219
+ * callers that only need the raw token string.
220
+ */
221
+ export async function createGitHubInstallationToken(input: {
222
+ api?: GitHubAuthApiOptions;
223
+ appId?: GitHubCredentialValue | number;
224
+ installationId: number;
225
+ privateKey?: GitHubCredentialValue;
226
+ }): Promise<string> {
227
+ const appId = await resolveGitHubAppId(input.appId);
228
+ const privateKey = await resolveGitHubPrivateKey(input.privateKey);
229
+ // Prefer createGitHubOctokit for API work — this path only mints a raw
230
+ // token. Custom fetch belongs on the Octokit client, not createAppAuth
231
+ // (StrategyOptions.request expects a full RequestInterface).
232
+ const auth = createAppAuth({
233
+ appId,
234
+ privateKey,
235
+ ...(input.api?.apiBaseUrl === undefined
236
+ ? {}
237
+ : { baseUrl: input.api.apiBaseUrl }),
238
+ });
239
+ const result = await auth({
240
+ type: "installation",
241
+ installationId: input.installationId,
242
+ });
243
+ return result.token;
244
+ }
245
+
246
+ /**
247
+ * Export the resolved host GitHub token as `process.env.GH_TOKEN` so
248
+ * subprocesses that shell out to `gh` work on App-credential hosts (corp
249
+ * agent-serve). Intended for serve warmup when auth source is `app`.
250
+ * Returns whether `GH_TOKEN` was written; refreshes on an interval.
251
+ */
252
+ export async function ensureGhCliTokenEnv(): Promise<boolean> {
253
+ const token = await tryResolveGitHubAccessToken({});
254
+ if (token === undefined) {
255
+ return false;
256
+ }
257
+ process.env.GH_TOKEN = token;
258
+ if (ghCliTokenRefreshTimer === null) {
259
+ const timer = setInterval(() => {
260
+ void ensureGhCliTokenEnv();
261
+ }, GH_CLI_TOKEN_REFRESH_MS);
262
+ timer.unref?.();
263
+ ghCliTokenRefreshTimer = timer;
264
+ }
265
+ return true;
266
+ }
267
+
268
+ /** Clears in-memory caches. Intended for tests. */
269
+ export function clearGitHubAuthCaches(): void {
270
+ ghAuthTokenCache = null;
271
+ if (ghCliTokenRefreshTimer !== null) {
272
+ clearInterval(ghCliTokenRefreshTimer);
273
+ ghCliTokenRefreshTimer = null;
274
+ }
275
+ }