@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,67 @@
1
+ /**
2
+ * Assistant thread UX: titles and suggested prompts.
3
+ */
4
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6
+ return new (P || (P = Promise))(function (resolve, reject) {
7
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
9
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
10
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11
+ });
12
+ };
13
+ import { setSuggestedPrompts, setThreadTitle, truncateTitle } from "./api.js";
14
+ import { defaultSlackLog } from "./log.js";
15
+ export function firstNonEmptyLine(text) {
16
+ for (const line of text.split(/\r?\n/u)) {
17
+ const trimmed = line.trim();
18
+ if (trimmed.length > 0) {
19
+ return trimmed;
20
+ }
21
+ }
22
+ return undefined;
23
+ }
24
+ export function firstLineTitle(text) {
25
+ var _a;
26
+ return truncateTitle((_a = firstNonEmptyLine(text)) !== null && _a !== void 0 ? _a : "Conversation");
27
+ }
28
+ export function maybeSetThreadTitle(args) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ var _a;
31
+ const log = (_a = args.log) !== null && _a !== void 0 ? _a : defaultSlackLog;
32
+ const result = yield setThreadTitle({
33
+ botToken: args.botToken,
34
+ channelId: args.channelId,
35
+ threadTs: args.threadTs,
36
+ title: args.title,
37
+ });
38
+ if (!result.ok) {
39
+ log.warn("setTitle not-ok", {
40
+ error: result.error,
41
+ channel: args.channelId,
42
+ thread_ts: args.threadTs,
43
+ });
44
+ return false;
45
+ }
46
+ return true;
47
+ });
48
+ }
49
+ export function maybeSetSuggestedPrompts(args) {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ var _a;
52
+ const log = (_a = args.log) !== null && _a !== void 0 ? _a : defaultSlackLog;
53
+ if (args.prompts.length === 0) {
54
+ return false;
55
+ }
56
+ const result = yield setSuggestedPrompts(Object.assign({ botToken: args.botToken, channelId: args.channelId, threadTs: args.threadTs, prompts: args.prompts }, (args.title === undefined ? {} : { title: args.title })));
57
+ if (!result.ok) {
58
+ log.warn("setSuggestedPrompts not-ok", {
59
+ error: result.error,
60
+ channel: args.channelId,
61
+ thread_ts: args.threadTs,
62
+ });
63
+ return false;
64
+ }
65
+ return true;
66
+ });
67
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Slack auth helpers — AuthContext builders for thread-scoped sessions.
3
+ */
4
+ import type { AuthContext } from "../../types.js";
5
+ import type { SlackBinding, SlackMessage } from "./types.js";
6
+ /**
7
+ * Build a thread-scoped principal so any participant in the same Slack
8
+ * thread can continue the session. The triggering user is preserved in
9
+ * attributes for message context.
10
+ */
11
+ export declare function buildSlackAuthContext(args: {
12
+ channelId: string;
13
+ threadTs: string;
14
+ teamId?: string;
15
+ userId?: string;
16
+ userName?: string;
17
+ isBot?: boolean;
18
+ /**
19
+ * Engagement surface that started the session (e.g. `"channel_post"` for
20
+ * the opt-in channel watch). Recorded as an attribute; the principal stays
21
+ * thread-scoped so an @mention in the same thread continues the session.
22
+ */
23
+ engagement?: string;
24
+ }): AuthContext;
25
+ /**
26
+ * Auth for a Slack user clicking an interactive Approve/Deny button.
27
+ * Uses the clicker's identity for {@link SessionEngine.resolveApproval},
28
+ * not the stored session principal (which would bypass ownership checks).
29
+ */
30
+ export declare function buildSlackInteractiveApprovalAuth(args: {
31
+ sessionAuth: AuthContext;
32
+ channelId: string;
33
+ threadTs: string;
34
+ teamId?: string;
35
+ clickingUserId: string;
36
+ }): AuthContext;
37
+ export declare function defaultSlackAuth(message: SlackMessage, ctx: SlackBinding, options?: {
38
+ engagement?: string;
39
+ }): AuthContext | null;
40
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,WAAW,CA4Bd;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,WAAW,CAqBd;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,WAAW,GAAG,IAAI,CAiBpB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Slack auth helpers — AuthContext builders for thread-scoped sessions.
3
+ */
4
+ import { samePrincipal } from "../../internal/auth.js";
5
+ /**
6
+ * Build a thread-scoped principal so any participant in the same Slack
7
+ * thread can continue the session. The triggering user is preserved in
8
+ * attributes for message context.
9
+ */
10
+ export function buildSlackAuthContext(args) {
11
+ var _a;
12
+ const team = (_a = args.teamId) !== null && _a !== void 0 ? _a : "unknown";
13
+ const principalId = `slack:${team}:${args.channelId}:${args.threadTs}`;
14
+ const attributes = {
15
+ channel_id: args.channelId,
16
+ thread_ts: args.threadTs,
17
+ };
18
+ if (args.teamId !== undefined) {
19
+ attributes.team_id = args.teamId;
20
+ }
21
+ if (args.userId !== undefined) {
22
+ attributes.user_id = args.userId;
23
+ }
24
+ if (args.userName !== undefined) {
25
+ attributes.user_name = args.userName;
26
+ }
27
+ if (args.isBot === true) {
28
+ attributes.author_type = "bot";
29
+ }
30
+ if (args.engagement !== undefined) {
31
+ attributes.engagement = args.engagement;
32
+ }
33
+ return {
34
+ authenticator: "slack",
35
+ principalId,
36
+ principalType: "user",
37
+ attributes,
38
+ };
39
+ }
40
+ /**
41
+ * Auth for a Slack user clicking an interactive Approve/Deny button.
42
+ * Uses the clicker's identity for {@link SessionEngine.resolveApproval},
43
+ * not the stored session principal (which would bypass ownership checks).
44
+ */
45
+ export function buildSlackInteractiveApprovalAuth(args) {
46
+ const clickerAuth = buildSlackAuthContext({
47
+ channelId: args.channelId,
48
+ threadTs: args.threadTs,
49
+ teamId: args.teamId,
50
+ userId: args.clickingUserId,
51
+ });
52
+ if (samePrincipal(args.sessionAuth, clickerAuth)) {
53
+ return clickerAuth;
54
+ }
55
+ const userSuffix = `:${args.clickingUserId}`;
56
+ if (args.clickingUserId !== "" &&
57
+ args.sessionAuth.principalId.endsWith(userSuffix)) {
58
+ return Object.assign(Object.assign({}, clickerAuth), { principalId: args.sessionAuth.principalId });
59
+ }
60
+ return clickerAuth;
61
+ }
62
+ export function defaultSlackAuth(message, ctx, options) {
63
+ if (message.author === undefined) {
64
+ return null;
65
+ }
66
+ return buildSlackAuthContext(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ channelId: ctx.slack.channelId, threadTs: ctx.slack.threadTs }, (message.teamId === undefined ? {} : { teamId: message.teamId })), { userId: message.author.userId }), (message.author.userName === undefined
67
+ ? {}
68
+ : { userName: message.author.userName })), { isBot: message.author.isBot }), ((options === null || options === void 0 ? void 0 : options.engagement) === undefined
69
+ ? {}
70
+ : { engagement: options.engagement })));
71
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Opt-in channel watch: dispatch on posts in allowlisted channels.
3
+ *
4
+ * Filtering rules (the anti-slop guarantees):
5
+ * - Only explicitly allowlisted channels are watched — no wildcard.
6
+ * - Top-level posts only by default; thread replies never dispatch unless
7
+ * `posts: "all"` is configured.
8
+ * - Posts that @mention the bot are skipped here (the `app_mention` path
9
+ * owns them), and bot-authored posts are dropped upstream in parsing.
10
+ * - An optional debounce window lets rapid edits settle: edits update the
11
+ * pending text, deleting the post cancels the dispatch.
12
+ */
13
+ import type { WebClient } from "@slack/web-api";
14
+ import type { SlackChannelMessageEvent } from "./inbound.js";
15
+ import { type SlackLog } from "./log.js";
16
+ import type { SlackChannelPostsOptions, SlackMessage } from "./types.js";
17
+ /** Allowlist over channel ids and `#names` (names resolve lazily). */
18
+ export declare class SlackChannelAllowlist {
19
+ private readonly ids;
20
+ private readonly names;
21
+ constructor(entries: readonly string[]);
22
+ matches(channelId: string): boolean;
23
+ unresolvedNames(): string[];
24
+ /** Fold resolved `name → id` pairs into the id set. */
25
+ applyResolvedNames(resolved: ReadonlyMap<string, string>): void;
26
+ }
27
+ /**
28
+ * Resolve channel `#names` to ids via `conversations.list`. Best-effort:
29
+ * returns whatever resolved; the caller logs names that stayed unresolved.
30
+ */
31
+ export declare function resolveChannelNames(client: WebClient, names: readonly string[], log?: SlackLog): Promise<Map<string, string>>;
32
+ export interface ChannelPostWatcher {
33
+ /** Handle a parsed channel message event. Returns true when consumed. */
34
+ handle(event: SlackChannelMessageEvent, eventId?: string): boolean;
35
+ /** Cancel pending debounced dispatches. */
36
+ stop(): void;
37
+ }
38
+ export declare function createChannelPostWatcher(args: {
39
+ options: SlackChannelPostsOptions;
40
+ allowlist: SlackChannelAllowlist;
41
+ /** Bot user id (from `auth.test`) so bot mentions route via app_mention. */
42
+ getBotUserId: () => string | undefined;
43
+ dispatch: (message: SlackMessage, eventId?: string) => void;
44
+ log?: SlackLog;
45
+ }): ChannelPostWatcher;
46
+ //# sourceMappingURL=channel-watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-watch.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/channel-watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIzE,sEAAsE;AACtE,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C,YAAY,OAAO,EAAE,SAAS,MAAM,EAAE,EAerC;IAED,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAElC;IAED,eAAe,IAAI,MAAM,EAAE,CAE1B;IAED,uDAAuD;IACvD,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAO9D;CACF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,GAAG,GAAE,QAA0B,GAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,MAAM,CAAC,KAAK,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,2CAA2C;IAC3C,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,wBAAwB,CAAC;IAClC,SAAS,EAAE,qBAAqB,CAAC;IACjC,4EAA4E;IAC5E,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,GAAG,CAAC,EAAE,QAAQ,CAAC;CAChB,GAAG,kBAAkB,CAoGrB"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Opt-in channel watch: dispatch on posts in allowlisted channels.
3
+ *
4
+ * Filtering rules (the anti-slop guarantees):
5
+ * - Only explicitly allowlisted channels are watched — no wildcard.
6
+ * - Top-level posts only by default; thread replies never dispatch unless
7
+ * `posts: "all"` is configured.
8
+ * - Posts that @mention the bot are skipped here (the `app_mention` path
9
+ * owns them), and bot-authored posts are dropped upstream in parsing.
10
+ * - An optional debounce window lets rapid edits settle: edits update the
11
+ * pending text, deleting the post cancels the dispatch.
12
+ */
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ import { defaultSlackLog } from "./log.js";
23
+ const CHANNEL_ID_PATTERN = /^[CG][A-Z0-9]+$/;
24
+ /** Allowlist over channel ids and `#names` (names resolve lazily). */
25
+ export class SlackChannelAllowlist {
26
+ constructor(entries) {
27
+ this.ids = new Set();
28
+ this.names = new Set();
29
+ for (const raw of entries) {
30
+ const entry = raw.trim();
31
+ if (entry === "") {
32
+ continue;
33
+ }
34
+ if (entry.startsWith("#")) {
35
+ this.names.add(entry.slice(1).toLowerCase());
36
+ }
37
+ else if (CHANNEL_ID_PATTERN.test(entry)) {
38
+ this.ids.add(entry);
39
+ }
40
+ else {
41
+ // Bare name without "#" — treat as a name for forgiving authoring.
42
+ this.names.add(entry.toLowerCase());
43
+ }
44
+ }
45
+ }
46
+ matches(channelId) {
47
+ return this.ids.has(channelId);
48
+ }
49
+ unresolvedNames() {
50
+ return [...this.names];
51
+ }
52
+ /** Fold resolved `name → id` pairs into the id set. */
53
+ applyResolvedNames(resolved) {
54
+ for (const name of this.names) {
55
+ const id = resolved.get(name);
56
+ if (id !== undefined) {
57
+ this.ids.add(id);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ /**
63
+ * Resolve channel `#names` to ids via `conversations.list`. Best-effort:
64
+ * returns whatever resolved; the caller logs names that stayed unresolved.
65
+ */
66
+ export function resolveChannelNames(client_1, names_1) {
67
+ return __awaiter(this, arguments, void 0, function* (client, names, log = defaultSlackLog) {
68
+ var _a, _b;
69
+ var _c;
70
+ const wanted = new Set(names.map((name) => name.toLowerCase()));
71
+ const resolved = new Map();
72
+ if (wanted.size === 0) {
73
+ return resolved;
74
+ }
75
+ let cursor;
76
+ for (let page = 0; page < 20 && resolved.size < wanted.size; page += 1) {
77
+ const response = yield client.conversations.list(Object.assign({ types: "public_channel,private_channel", exclude_archived: true, limit: 200 }, (cursor === undefined ? {} : { cursor })));
78
+ for (const channel of (_c = response.channels) !== null && _c !== void 0 ? _c : []) {
79
+ const name = (_a = channel.name) === null || _a === void 0 ? void 0 : _a.toLowerCase();
80
+ if (name !== undefined && wanted.has(name) && channel.id !== undefined) {
81
+ resolved.set(name, channel.id);
82
+ }
83
+ }
84
+ cursor = ((_b = response.response_metadata) === null || _b === void 0 ? void 0 : _b.next_cursor) || undefined;
85
+ if (cursor === undefined) {
86
+ break;
87
+ }
88
+ }
89
+ for (const name of wanted) {
90
+ if (!resolved.has(name)) {
91
+ log.error("channel watch: could not resolve channel name", {
92
+ name: `#${name}`,
93
+ });
94
+ }
95
+ }
96
+ return resolved;
97
+ });
98
+ }
99
+ export function createChannelPostWatcher(args) {
100
+ var _a, _b;
101
+ const log = (_a = args.log) !== null && _a !== void 0 ? _a : defaultSlackLog;
102
+ const includeReplies = args.options.posts === "all";
103
+ const debounceMs = (_b = args.options.debounceMs) !== null && _b !== void 0 ? _b : 0;
104
+ const pending = new Map();
105
+ const pendingKey = (channelId, ts) => `${channelId}:${ts}`;
106
+ function skip(reason, message) {
107
+ log.debug(`channel watch skip (${reason})`, {
108
+ channel: message.channelId,
109
+ message_ts: message.ts,
110
+ thread_ts: message.threadTs,
111
+ });
112
+ return true;
113
+ }
114
+ function fire(message, eventId) {
115
+ log.info("channel watch dispatch", {
116
+ channel: message.channelId,
117
+ message_ts: message.ts,
118
+ thread_ts: message.threadTs,
119
+ event_id: eventId,
120
+ });
121
+ args.dispatch(message, eventId);
122
+ }
123
+ return {
124
+ handle(event, eventId) {
125
+ if (event.kind === "deleted") {
126
+ const key = pendingKey(event.channelId, event.ts);
127
+ const entry = pending.get(key);
128
+ if (entry !== undefined) {
129
+ clearTimeout(entry.timer);
130
+ pending.delete(key);
131
+ log.info("channel watch cancel (post deleted)", {
132
+ channel: event.channelId,
133
+ message_ts: event.ts,
134
+ });
135
+ }
136
+ return true;
137
+ }
138
+ const message = event.message;
139
+ if (!args.allowlist.matches(message.channelId)) {
140
+ return skip("channel not allowlisted", message);
141
+ }
142
+ if (event.kind === "edited") {
143
+ const entry = pending.get(pendingKey(message.channelId, message.ts));
144
+ if (entry !== undefined) {
145
+ entry.message = Object.assign(Object.assign({}, entry.message), message);
146
+ }
147
+ // Edits never (re-)dispatch on their own.
148
+ return true;
149
+ }
150
+ if (!includeReplies && message.ts !== message.threadTs) {
151
+ return skip("thread reply (posts: top-level)", message);
152
+ }
153
+ const botUserId = args.getBotUserId();
154
+ if (botUserId !== undefined && message.text.includes(`<@${botUserId}>`)) {
155
+ return skip("bot mention (app_mention path owns it)", message);
156
+ }
157
+ if (debounceMs <= 0) {
158
+ fire(message, eventId);
159
+ return true;
160
+ }
161
+ const key = pendingKey(message.channelId, message.ts);
162
+ const existing = pending.get(key);
163
+ if (existing !== undefined) {
164
+ clearTimeout(existing.timer);
165
+ }
166
+ const entry = Object.assign({ timer: setTimeout(() => {
167
+ pending.delete(key);
168
+ fire(entry.message, entry.eventId);
169
+ }, debounceMs), message }, (eventId === undefined ? {} : { eventId }));
170
+ pending.set(key, entry);
171
+ return true;
172
+ },
173
+ stop() {
174
+ for (const entry of pending.values()) {
175
+ clearTimeout(entry.timer);
176
+ }
177
+ pending.clear();
178
+ },
179
+ };
180
+ }
@@ -0,0 +1,17 @@
1
+ /** Defaults for the Slack channel pack. */
2
+ export declare const SLACK_CHANNEL_ID = "slack";
3
+ export declare const SLACK_TYPING_MIN_GROWTH = 4;
4
+ export declare const SLACK_TYPING_MIN_INTERVAL_MS = 5000;
5
+ /**
6
+ * Slack `assistant.threads.setStatus` limits each `loading_messages[]`
7
+ * entry to under 51 characters. `status` is often mirrored into that array,
8
+ * so keep both at 50.
9
+ */
10
+ export declare const SLACK_STATUS_MAX_LEN = 50;
11
+ export declare const SLACK_LOADING_MESSAGE_MAX_LEN = 50;
12
+ export declare const SLACK_TITLE_MAX_LEN = 80;
13
+ /** Rotating assistant status lines (Slack `loading_messages`). */
14
+ export declare const SLACK_DEFAULT_LOADING_MESSAGES: readonly ["Thinking…", "Working on it…", "Almost there…"];
15
+ /** Slack API errors that mean a feature is unavailable for this app. */
16
+ export declare const SLACK_UNSUPPORTED_ERRORS: Set<string>;
17
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/constants.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,4BAA4B,OAAQ,CAAC;AAClD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,kEAAkE;AAClE,eAAO,MAAM,8BAA8B,YACzC,WAAW,EACX,gBAAgB,EAChB,eAAe,CACP,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAO/C,CAAC"}
@@ -0,0 +1,27 @@
1
+ /** Defaults for the Slack channel pack. */
2
+ export const SLACK_CHANNEL_ID = "slack";
3
+ export const SLACK_TYPING_MIN_GROWTH = 4;
4
+ export const SLACK_TYPING_MIN_INTERVAL_MS = 5000;
5
+ /**
6
+ * Slack `assistant.threads.setStatus` limits each `loading_messages[]`
7
+ * entry to under 51 characters. `status` is often mirrored into that array,
8
+ * so keep both at 50.
9
+ */
10
+ export const SLACK_STATUS_MAX_LEN = 50;
11
+ export const SLACK_LOADING_MESSAGE_MAX_LEN = 50;
12
+ export const SLACK_TITLE_MAX_LEN = 80;
13
+ /** Rotating assistant status lines (Slack `loading_messages`). */
14
+ export const SLACK_DEFAULT_LOADING_MESSAGES = [
15
+ "Thinking…",
16
+ "Working on it…",
17
+ "Almost there…",
18
+ ];
19
+ /** Slack API errors that mean a feature is unavailable for this app. */
20
+ export const SLACK_UNSUPPORTED_ERRORS = new Set([
21
+ "method_not_found",
22
+ "not_allowed",
23
+ "missing_scope",
24
+ "not_enabled",
25
+ "feature_not_enabled",
26
+ "unknown_method",
27
+ ]);
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Per-agent Slack credential resolution.
3
+ *
4
+ * Multi-agent serve needs one Slack app (and token pair) per agent. Use
5
+ * `envPrefix: "MY_AGENT"` so the pack reads `MY_AGENT_SLACK_BOT_TOKEN` /
6
+ * `MY_AGENT_SLACK_APP_TOKEN` instead of the shared globals.
7
+ */
8
+ import type { SlackCredentials } from "./types.js";
9
+ /** Normalize an agent directory / display name into an env prefix. */
10
+ export declare function envPrefixFromName(name: string): string;
11
+ /** Env var names for a Slack token pair. */
12
+ export declare function slackEnvKeys(prefix?: string): {
13
+ bot: string;
14
+ app: string;
15
+ };
16
+ /**
17
+ * Credentials that read `{PREFIX}_SLACK_BOT_TOKEN` / `{PREFIX}_SLACK_APP_TOKEN`
18
+ * (or the unprefixed globals when `prefix` is omitted). Resolvers return `""`
19
+ * when unset so multi-agent serve does not fall through to a shared token.
20
+ */
21
+ export declare function credentialsFromEnv(prefix?: string): SlackCredentials;
22
+ /**
23
+ * Resolve a bot token string without throwing. When `credentials.botToken`
24
+ * is set (string or resolver), only that value is used — no global fallback
25
+ * — so a per-agent prefix cannot accidentally bind every mounted agent to
26
+ * one app. When omitted, falls back to `SLACK_BOT_TOKEN`. API transports
27
+ * resolve to `undefined` (they execute calls without a local token).
28
+ */
29
+ export declare function tryResolveBotToken(credentials: SlackCredentials | undefined): Promise<string | undefined>;
30
+ /**
31
+ * Resolve an app-level token without throwing. Same per-agent rules as
32
+ * {@link tryResolveBotToken}.
33
+ */
34
+ export declare function tryResolveAppToken(credentials: SlackCredentials | undefined): Promise<string | undefined>;
35
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAiB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElE,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CASA;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAMpE;AAiBD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,gBAAgB,GAAG,SAAS,GACxC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK7B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,gBAAgB,GAAG,SAAS,GACxC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK7B"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Per-agent Slack credential resolution.
3
+ *
4
+ * Multi-agent serve needs one Slack app (and token pair) per agent. Use
5
+ * `envPrefix: "MY_AGENT"` so the pack reads `MY_AGENT_SLACK_BOT_TOKEN` /
6
+ * `MY_AGENT_SLACK_APP_TOKEN` instead of the shared globals.
7
+ */
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ /** Normalize an agent directory / display name into an env prefix. */
18
+ export function envPrefixFromName(name) {
19
+ return name
20
+ .trim()
21
+ .replace(/[^A-Za-z0-9]+/g, "_")
22
+ .replace(/^_+|_+$/g, "")
23
+ .toUpperCase();
24
+ }
25
+ /** Env var names for a Slack token pair. */
26
+ export function slackEnvKeys(prefix) {
27
+ if (prefix === undefined || prefix.trim() === "") {
28
+ return { bot: "SLACK_BOT_TOKEN", app: "SLACK_APP_TOKEN" };
29
+ }
30
+ const normalized = envPrefixFromName(prefix);
31
+ return {
32
+ bot: `${normalized}_SLACK_BOT_TOKEN`,
33
+ app: `${normalized}_SLACK_APP_TOKEN`,
34
+ };
35
+ }
36
+ /**
37
+ * Credentials that read `{PREFIX}_SLACK_BOT_TOKEN` / `{PREFIX}_SLACK_APP_TOKEN`
38
+ * (or the unprefixed globals when `prefix` is omitted). Resolvers return `""`
39
+ * when unset so multi-agent serve does not fall through to a shared token.
40
+ */
41
+ export function credentialsFromEnv(prefix) {
42
+ const keys = slackEnvKeys(prefix);
43
+ return {
44
+ botToken: () => { var _a; var _b; return (_b = (_a = process.env[keys.bot]) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : ""; },
45
+ appToken: () => { var _a; var _b; return (_b = (_a = process.env[keys.app]) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : ""; },
46
+ };
47
+ }
48
+ function readExplicitToken(explicit) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ if (explicit === undefined) {
51
+ return undefined;
52
+ }
53
+ const value = typeof explicit === "function" ? yield explicit() : explicit;
54
+ // API transports (objects) carry no raw token to resolve.
55
+ if (typeof value !== "string") {
56
+ return undefined;
57
+ }
58
+ const trimmed = value.trim();
59
+ return trimmed === "" ? undefined : trimmed;
60
+ });
61
+ }
62
+ /**
63
+ * Resolve a bot token string without throwing. When `credentials.botToken`
64
+ * is set (string or resolver), only that value is used — no global fallback
65
+ * — so a per-agent prefix cannot accidentally bind every mounted agent to
66
+ * one app. When omitted, falls back to `SLACK_BOT_TOKEN`. API transports
67
+ * resolve to `undefined` (they execute calls without a local token).
68
+ */
69
+ export function tryResolveBotToken(credentials) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ if ((credentials === null || credentials === void 0 ? void 0 : credentials.botToken) !== undefined) {
72
+ return readExplicitToken(credentials.botToken);
73
+ }
74
+ return readExplicitToken(process.env.SLACK_BOT_TOKEN);
75
+ });
76
+ }
77
+ /**
78
+ * Resolve an app-level token without throwing. Same per-agent rules as
79
+ * {@link tryResolveBotToken}.
80
+ */
81
+ export function tryResolveAppToken(credentials) {
82
+ return __awaiter(this, void 0, void 0, function* () {
83
+ if ((credentials === null || credentials === void 0 ? void 0 : credentials.appToken) !== undefined) {
84
+ return readExplicitToken(credentials.appToken);
85
+ }
86
+ return readExplicitToken(process.env.SLACK_APP_TOKEN);
87
+ });
88
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Cursor-account mode for the Slack channel pack: instead of a dedicated
3
+ * Slack app (Socket Mode + `xoxb`/`xapp` tokens), the channel rides the
4
+ * signed-in Cursor account's Slack connection. Inbound events are relayed
5
+ * by the serve host from `/v0/slack-events` (see
6
+ * `internal/cursor-slack-relay.ts`); outbound Web API calls run through a
7
+ * {@link SlackApiTransport} bound to the backend proxy.
8
+ *
9
+ * This file is the seam between the channel definition (authored at
10
+ * `defineChannel` time) and the serve-time relay: `slackChannel()` registers
11
+ * a runtime ref here, and the server discovers it, binds the transport, and
12
+ * dispatches relayed envelopes through the pack's normal inbound path.
13
+ */
14
+ import type { HostContext, SendMessageFn } from "../../types.js";
15
+ import type { EventIdDedupe } from "./event-id-dedupe.js";
16
+ import type { SlackLog } from "./log.js";
17
+ import type { SlackApiTransport, SlackChannelOptions, SlackCredentials, SlackMessageHandler } from "./types.js";
18
+ /**
19
+ * Transport placeholder created at `slackChannel()` definition time and
20
+ * bound to the real backend proxy caller when the serve host starts its
21
+ * relay. Calls before binding soft-fail Slack-style.
22
+ */
23
+ export interface PendingSlackApiTransport extends SlackApiTransport {
24
+ bind(impl: SlackApiTransport["call"]): void;
25
+ }
26
+ export declare function createPendingSlackApiTransport(): PendingSlackApiTransport;
27
+ /**
28
+ * One routed Slack event from `/v0/slack-events` (mirror of the backend's
29
+ * SlackAgentEventEnvelope, minus server-only fields).
30
+ */
31
+ export interface CursorSlackEnvelope {
32
+ eventName: string;
33
+ slackTeamId: string;
34
+ channelId: string;
35
+ channelType?: string;
36
+ threadTs: string;
37
+ messageTs: string;
38
+ slackUserId?: string;
39
+ text: string;
40
+ agentName: string;
41
+ consumerId: string;
42
+ /**
43
+ * How the backend routed the event: leading agent name or owned thread.
44
+ */
45
+ matchedBy: "name" | "thread";
46
+ eventId?: string;
47
+ receivedAtMs: number;
48
+ }
49
+ /** Serve-time runtime handle for one cursor-account Slack channel. */
50
+ export interface SlackCursorAccountRuntime {
51
+ options: SlackChannelOptions;
52
+ /** The channel's live credentials (botToken slot holds the transport). */
53
+ credentials: SlackCredentials;
54
+ transport: PendingSlackApiTransport;
55
+ eventIds: EventIdDedupe;
56
+ onAppMention: SlackMessageHandler;
57
+ onDirectMessage: SlackMessageHandler;
58
+ getLog: () => SlackLog;
59
+ }
60
+ export declare function registerSlackCursorAccountRuntime(definition: object, runtime: SlackCursorAccountRuntime): void;
61
+ /**
62
+ * Recover the cursor-account runtime for a channel definition, if it was
63
+ * created via `slackChannel({ cursorAccount: true })`.
64
+ */
65
+ export declare function getSlackCursorAccountRuntime(definition: object): SlackCursorAccountRuntime | undefined;
66
+ /**
67
+ * Dispatch one relayed envelope through the pack's normal inbound path
68
+ * (same handlers, session continuation, and reply delivery as Socket Mode).
69
+ */
70
+ export declare function dispatchCursorSlackEnvelope(args: {
71
+ runtime: SlackCursorAccountRuntime;
72
+ envelope: CursorSlackEnvelope;
73
+ send: SendMessageFn;
74
+ host: HostContext;
75
+ }): Promise<void>;
76
+ //# sourceMappingURL=cursor-account.d.ts.map