@cursor/bdk 0.2.9 → 0.2.10

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 (570) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.js +803 -812
  3. package/dist/channels/bitbucket/api.js +305 -321
  4. package/dist/channels/bitbucket/binding.js +97 -61
  5. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  6. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  7. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  8. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  9. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  10. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  11. package/dist/channels/bitbucket/checks.js +9 -21
  12. package/dist/channels/bitbucket/cursor-account.js +1 -1
  13. package/dist/channels/bitbucket/defaults.js +14 -4
  14. package/dist/channels/bitbucket/events.js +1 -2
  15. package/dist/channels/bitbucket/index.d.ts +6 -2
  16. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  17. package/dist/channels/bitbucket/index.js +6 -2
  18. package/dist/channels/bitbucket/replay.js +80 -56
  19. package/dist/channels/bitbucket/state.js +16 -7
  20. package/dist/channels/bitbucket/types.d.ts +11 -2
  21. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  22. package/dist/channels/checks.js +18 -28
  23. package/dist/channels/deployments/deployments-channel.js +26 -34
  24. package/dist/channels/github/api.js +216 -210
  25. package/dist/channels/github/auth.d.ts +5 -1
  26. package/dist/channels/github/auth.d.ts.map +1 -1
  27. package/dist/channels/github/auth.js +157 -174
  28. package/dist/channels/github/binding.js +48 -39
  29. package/dist/channels/github/checks.js +9 -14
  30. package/dist/channels/github/cursor-account.js +6 -11
  31. package/dist/channels/github/defaults.js +105 -130
  32. package/dist/channels/github/forward.js +13 -17
  33. package/dist/channels/github/github-channel.d.ts +43 -2
  34. package/dist/channels/github/github-channel.d.ts.map +1 -1
  35. package/dist/channels/github/github-channel.js +1228 -958
  36. package/dist/channels/github/progress.js +145 -146
  37. package/dist/channels/github/replay.js +30 -39
  38. package/dist/channels/github/state.js +40 -16
  39. package/dist/channels/github/types.d.ts +30 -6
  40. package/dist/channels/github/types.d.ts.map +1 -1
  41. package/dist/channels/gitlab/api.js +100 -114
  42. package/dist/channels/gitlab/binding.js +52 -33
  43. package/dist/channels/gitlab/checks.js +28 -29
  44. package/dist/channels/gitlab/cursor-account.js +1 -1
  45. package/dist/channels/gitlab/defaults.js +9 -3
  46. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  47. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  48. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  49. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  50. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  51. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  52. package/dist/channels/gitlab/index.d.ts +6 -2
  53. package/dist/channels/gitlab/index.d.ts.map +1 -1
  54. package/dist/channels/gitlab/index.js +6 -2
  55. package/dist/channels/gitlab/replay.js +50 -27
  56. package/dist/channels/gitlab/state.js +14 -6
  57. package/dist/channels/gitlab/types.d.ts +13 -2
  58. package/dist/channels/gitlab/types.d.ts.map +1 -1
  59. package/dist/channels/origin/api.js +100 -116
  60. package/dist/channels/origin/binding.js +15 -16
  61. package/dist/channels/origin/checks.js +30 -28
  62. package/dist/channels/origin/defaults.js +50 -65
  63. package/dist/channels/origin/origin-channel.js +266 -272
  64. package/dist/channels/origin/origin-webhook.js +70 -88
  65. package/dist/channels/origin/reactions.js +9 -21
  66. package/dist/channels/origin/state.js +13 -5
  67. package/dist/channels/slack/agentic-delivery.js +426 -478
  68. package/dist/channels/slack/agentic-posted.js +9 -10
  69. package/dist/channels/slack/agentic-signals.js +2 -3
  70. package/dist/channels/slack/api.js +417 -427
  71. package/dist/channels/slack/approvals.js +1 -1
  72. package/dist/channels/slack/assistant.js +37 -47
  73. package/dist/channels/slack/attachments.js +188 -206
  74. package/dist/channels/slack/auth.js +8 -6
  75. package/dist/channels/slack/bot-mentions.js +31 -45
  76. package/dist/channels/slack/channel-watch.js +42 -48
  77. package/dist/channels/slack/cli-project.js +112 -137
  78. package/dist/channels/slack/code-fences.js +3 -5
  79. package/dist/channels/slack/constants.js +2 -2
  80. package/dist/channels/slack/credentials.js +23 -38
  81. package/dist/channels/slack/defaults.js +292 -331
  82. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  83. package/dist/channels/slack/dispatch.js +533 -460
  84. package/dist/channels/slack/doctor.js +200 -214
  85. package/dist/channels/slack/eval-directive.js +79 -96
  86. package/dist/channels/slack/event-id-dedupe.js +1 -1
  87. package/dist/channels/slack/external-policy.js +26 -39
  88. package/dist/channels/slack/footer.js +28 -41
  89. package/dist/channels/slack/inbound.d.ts +1 -0
  90. package/dist/channels/slack/inbound.d.ts.map +1 -1
  91. package/dist/channels/slack/inbound.js +50 -31
  92. package/dist/channels/slack/init.d.ts +1 -5
  93. package/dist/channels/slack/init.d.ts.map +1 -1
  94. package/dist/channels/slack/init.js +42 -59
  95. package/dist/channels/slack/interactive.d.ts +9 -3
  96. package/dist/channels/slack/interactive.d.ts.map +1 -1
  97. package/dist/channels/slack/interactive.js +160 -162
  98. package/dist/channels/slack/links.js +1 -2
  99. package/dist/channels/slack/live-delivery.js +172 -190
  100. package/dist/channels/slack/manifest.d.ts.map +1 -1
  101. package/dist/channels/slack/manifest.js +44 -23
  102. package/dist/channels/slack/message-body.js +2 -2
  103. package/dist/channels/slack/nudge-carrier.js +30 -42
  104. package/dist/channels/slack/nudge-store.js +164 -191
  105. package/dist/channels/slack/paint-start.js +66 -81
  106. package/dist/channels/slack/placeholder.js +123 -152
  107. package/dist/channels/slack/pr-ref.js +1 -1
  108. package/dist/channels/slack/progress-delivery.js +65 -78
  109. package/dist/channels/slack/reasoning-card.js +36 -49
  110. package/dist/channels/slack/recording-sink.js +12 -24
  111. package/dist/channels/slack/reply-options.js +7 -12
  112. package/dist/channels/slack/self-identity.js +27 -35
  113. package/dist/channels/slack/sender-name.d.ts +12 -3
  114. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  115. package/dist/channels/slack/sender-name.js +57 -61
  116. package/dist/channels/slack/setup.js +2 -4
  117. package/dist/channels/slack/slack-channel.d.ts +6 -4
  118. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  119. package/dist/channels/slack/slack-channel.js +441 -308
  120. package/dist/channels/slack/socket-mode.js +38 -52
  121. package/dist/channels/slack/thread-context.js +143 -160
  122. package/dist/channels/slack/tool-approval-events.js +149 -166
  123. package/dist/channels/slack/tool-cards.js +6 -11
  124. package/dist/channels/slack/tool-chip.js +1 -2
  125. package/dist/channels/slack/types.d.ts +15 -17
  126. package/dist/channels/slack/types.d.ts.map +1 -1
  127. package/dist/channels/slack/upload.js +84 -97
  128. package/dist/channels/slack/user-info.js +27 -41
  129. package/dist/channels.js +9 -20
  130. package/dist/dashboard-session-url.js +3 -4
  131. package/dist/docs/404.html +2 -2
  132. package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
  133. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  134. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  135. package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  136. package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
  137. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  138. package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
  139. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  140. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  141. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  142. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  143. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  144. package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  150. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  151. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  152. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  153. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  154. package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  155. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  156. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  159. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  160. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  161. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  162. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  163. package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
  164. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  165. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  166. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  167. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  168. package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
  169. package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
  170. package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
  171. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  172. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  173. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  174. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  175. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  176. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  177. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  178. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  179. package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
  180. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  181. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  182. package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
  183. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  184. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  185. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  186. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  187. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  188. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  189. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  191. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  192. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  193. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  194. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  195. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  196. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  197. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  198. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  199. package/dist/docs/building-with-agents.html +37 -37
  200. package/dist/docs/building-with-agents.md +2 -0
  201. package/dist/docs/deployment.html +38 -38
  202. package/dist/docs/deployment.md +7 -0
  203. package/dist/docs/evals.html +36 -36
  204. package/dist/docs/guides/agent-to-agent.html +35 -35
  205. package/dist/docs/guides/bitbucket.html +38 -38
  206. package/dist/docs/guides/bitbucket.md +9 -1
  207. package/dist/docs/guides/cloud-agents.html +35 -35
  208. package/dist/docs/guides/convert-automation.html +35 -35
  209. package/dist/docs/guides/github.html +39 -39
  210. package/dist/docs/guides/github.md +20 -4
  211. package/dist/docs/guides/gitlab.html +38 -38
  212. package/dist/docs/guides/gitlab.md +9 -1
  213. package/dist/docs/guides/grokbot-agents.html +35 -35
  214. package/dist/docs/guides/hooks.html +35 -35
  215. package/dist/docs/guides/improve.html +35 -35
  216. package/dist/docs/guides/jev.html +35 -35
  217. package/dist/docs/guides/mcp-oauth.html +35 -35
  218. package/dist/docs/guides/migrate.html +66 -0
  219. package/dist/docs/guides/migrate.md +122 -0
  220. package/dist/docs/guides/opentelemetry.html +35 -35
  221. package/dist/docs/guides/slack.html +35 -35
  222. package/dist/docs/guides/webhooks.html +35 -35
  223. package/dist/docs/hashmap.json +1 -1
  224. package/dist/docs/hillclimbing.html +35 -35
  225. package/dist/docs/index.html +35 -35
  226. package/dist/docs/llms-full.txt +214 -6
  227. package/dist/docs/llms.txt +1 -0
  228. package/dist/docs/quickstart.html +35 -35
  229. package/dist/docs/reference/agent-config.html +35 -35
  230. package/dist/docs/reference/artifacts.html +35 -35
  231. package/dist/docs/reference/channels.html +35 -35
  232. package/dist/docs/reference/cli.html +39 -38
  233. package/dist/docs/reference/cli.md +39 -0
  234. package/dist/docs/reference/connections.html +35 -35
  235. package/dist/docs/reference/evals.html +35 -35
  236. package/dist/docs/reference/extensions.html +35 -35
  237. package/dist/docs/reference/hooks.html +35 -35
  238. package/dist/docs/reference/http-api.html +35 -35
  239. package/dist/docs/reference/instructions.html +35 -35
  240. package/dist/docs/reference/playground.html +35 -35
  241. package/dist/docs/reference/project-layout.html +35 -35
  242. package/dist/docs/reference/prompt.html +35 -35
  243. package/dist/docs/reference/schedules.html +35 -35
  244. package/dist/docs/reference/sessions.html +35 -35
  245. package/dist/docs/reference/skills.html +38 -38
  246. package/dist/docs/reference/subagents.html +35 -35
  247. package/dist/docs/reference/tools.html +35 -35
  248. package/dist/docs/templates/agentic-owners.html +35 -35
  249. package/dist/docs/templates/grokbot-agents.html +35 -35
  250. package/dist/docs/templates/security-reviewer.html +35 -35
  251. package/dist/docs/templates/thermo-quality-review.html +35 -35
  252. package/dist/docs/templates/thermo-review.html +35 -35
  253. package/dist/docs/templates/triage.html +35 -35
  254. package/dist/docs/troubleshooting.html +36 -36
  255. package/dist/docs/troubleshooting.md +1 -0
  256. package/dist/evals/assertions.js +20 -34
  257. package/dist/evals/expect.js +3 -6
  258. package/dist/evals/judge.js +5 -8
  259. package/dist/evals/loaders.js +45 -62
  260. package/dist/evals/matchers.js +2 -3
  261. package/dist/evals/reporters.js +43 -67
  262. package/dist/evals/results.js +1 -1
  263. package/dist/evals/run-facts.js +5 -6
  264. package/dist/evals.js +27 -15
  265. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  266. package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
  267. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  268. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  269. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  270. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  271. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  272. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  273. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  274. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  275. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  276. package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
  277. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  278. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  279. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  280. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  281. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  282. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  283. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  284. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  285. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  286. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  287. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  288. package/dist/extensions/jev/extension.js +3 -3
  289. package/dist/extensions/jev/lib/evaluate.js +43 -60
  290. package/dist/extensions/jev/tools/evaluate.js +6 -17
  291. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  292. package/dist/extensions.js +3 -5
  293. package/dist/files-backends/cursor-hosted.js +504 -523
  294. package/dist/files-backends/local-fs.js +72 -134
  295. package/dist/files.js +3 -3
  296. package/dist/filesystem.js +562 -861
  297. package/dist/index.js +16 -35
  298. package/dist/internal/advertise-tools.js +74 -86
  299. package/dist/internal/artifacts-store.js +298 -361
  300. package/dist/internal/as-of.js +2 -4
  301. package/dist/internal/authored-alias-hooks.js +6 -4
  302. package/dist/internal/authored-loaders.js +37 -52
  303. package/dist/internal/bounded-int.js +1 -2
  304. package/dist/internal/bounded.js +13 -24
  305. package/dist/internal/brand.js +1 -1
  306. package/dist/internal/browser-origin-guard.js +4 -4
  307. package/dist/internal/builtin-tools/artifacts.js +15 -27
  308. package/dist/internal/builtin-tools/index.js +2 -3
  309. package/dist/internal/builtin-tools/reminders.js +33 -52
  310. package/dist/internal/channel-architecture.d.ts +21 -0
  311. package/dist/internal/channel-architecture.d.ts.map +1 -0
  312. package/dist/internal/channel-architecture.js +41 -0
  313. package/dist/internal/channel-dispatch.js +3 -4
  314. package/dist/internal/channel-route-dispatch.js +40 -51
  315. package/dist/internal/channel-state.js +1 -1
  316. package/dist/internal/chat-client.js +319 -340
  317. package/dist/internal/cli-ax.js +1262 -1294
  318. package/dist/internal/cli-bitbucket.js +244 -272
  319. package/dist/internal/cli-convert-automation.js +137 -151
  320. package/dist/internal/cli-cursor.js +126 -147
  321. package/dist/internal/cli-deploy.d.ts.map +1 -1
  322. package/dist/internal/cli-deploy.js +1457 -1507
  323. package/dist/internal/cli-docs.js +130 -147
  324. package/dist/internal/cli-github.js +437 -476
  325. package/dist/internal/cli-gitlab.js +259 -288
  326. package/dist/internal/cli-images.js +266 -334
  327. package/dist/internal/cli-manifest.js +25 -37
  328. package/dist/internal/cli-mcp-oauth.js +228 -247
  329. package/dist/internal/cli-mcp.js +358 -383
  330. package/dist/internal/cli-migrate.js +73 -90
  331. package/dist/internal/cli-skills.js +35 -47
  332. package/dist/internal/cli-slack-manual.d.ts +0 -1
  333. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  334. package/dist/internal/cli-slack-manual.js +175 -204
  335. package/dist/internal/cli-slack.d.ts +1 -1
  336. package/dist/internal/cli-slack.d.ts.map +1 -1
  337. package/dist/internal/cli-slack.js +416 -456
  338. package/dist/internal/cloud-merge.js +7 -3
  339. package/dist/internal/cloud-turn-cost.js +8 -1
  340. package/dist/internal/connection-env.js +5 -6
  341. package/dist/internal/continuation-channel.js +10 -7
  342. package/dist/internal/continuation-identity.js +85 -67
  343. package/dist/internal/conversation-mirror.js +112 -131
  344. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  345. package/dist/internal/cron.js +3 -3
  346. package/dist/internal/cursor/account-mcp.js +147 -146
  347. package/dist/internal/cursor/backend-client.js +290 -320
  348. package/dist/internal/cursor/bound-secret-file.js +3 -3
  349. package/dist/internal/cursor/credentials.js +127 -142
  350. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  351. package/dist/internal/cursor/github-credentials.js +91 -108
  352. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  353. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  354. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  355. package/dist/internal/cursor/session-token.js +36 -48
  356. package/dist/internal/cursor/store-api-client.js +77 -92
  357. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  358. package/dist/internal/cursor-agent-template.js +1 -1
  359. package/dist/internal/cursor-deployment-relay.js +33 -54
  360. package/dist/internal/cursor-event-relay.js +65 -59
  361. package/dist/internal/cursor-relay-core.js +258 -286
  362. package/dist/internal/deferred-channel-session.js +3 -12
  363. package/dist/internal/deploy-client.js +410 -475
  364. package/dist/internal/deploy-manifest.d.ts +17 -0
  365. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  366. package/dist/internal/deploy-manifest.js +71 -21
  367. package/dist/internal/deploy-source.js +31 -43
  368. package/dist/internal/discovery/agent-config.js +45 -59
  369. package/dist/internal/discovery/agent.js +276 -280
  370. package/dist/internal/discovery/channels.js +67 -80
  371. package/dist/internal/discovery/connections.js +286 -296
  372. package/dist/internal/discovery/context.js +2 -13
  373. package/dist/internal/discovery/cursor-plugin.js +223 -259
  374. package/dist/internal/discovery/extension-overlay.js +104 -131
  375. package/dist/internal/discovery/extensions.js +276 -281
  376. package/dist/internal/discovery/fs.js +56 -79
  377. package/dist/internal/discovery/hooks.js +39 -50
  378. package/dist/internal/discovery/info.js +17 -19
  379. package/dist/internal/discovery/instructions.js +58 -71
  380. package/dist/internal/discovery/modules.js +45 -58
  381. package/dist/internal/discovery/project.d.ts.map +1 -1
  382. package/dist/internal/discovery/project.js +192 -215
  383. package/dist/internal/discovery/reminders.js +41 -52
  384. package/dist/internal/discovery/runtime.js +1 -1
  385. package/dist/internal/discovery/schedules.js +71 -82
  386. package/dist/internal/discovery/seed-files.js +21 -32
  387. package/dist/internal/discovery/services.js +74 -96
  388. package/dist/internal/discovery/skills.js +77 -94
  389. package/dist/internal/discovery/subagent.js +79 -95
  390. package/dist/internal/discovery/tools.js +12 -23
  391. package/dist/internal/distribution.js +2 -2
  392. package/dist/internal/docs-site.js +30 -45
  393. package/dist/internal/duration.js +1 -1
  394. package/dist/internal/env-file.js +48 -64
  395. package/dist/internal/eval-judge-model.js +17 -28
  396. package/dist/internal/eval-run-store.js +265 -254
  397. package/dist/internal/eval-runner.d.ts +8 -0
  398. package/dist/internal/eval-runner.d.ts.map +1 -1
  399. package/dist/internal/eval-runner.js +406 -408
  400. package/dist/internal/eval-transport.d.ts +24 -0
  401. package/dist/internal/eval-transport.d.ts.map +1 -0
  402. package/dist/internal/eval-transport.js +22 -0
  403. package/dist/internal/evals-client.js +242 -246
  404. package/dist/internal/event-log.js +72 -120
  405. package/dist/internal/event-mapper.js +30 -31
  406. package/dist/internal/factory-resource-channel.js +16 -30
  407. package/dist/internal/filesystem/errors.js +6 -6
  408. package/dist/internal/filesystem/format.js +10 -13
  409. package/dist/internal/filesystem/merge.js +52 -94
  410. package/dist/internal/filesystem/nearest.js +15 -27
  411. package/dist/internal/filesystem/scratch.js +65 -85
  412. package/dist/internal/filesystem/tools.js +221 -241
  413. package/dist/internal/filesystem/walk.js +76 -143
  414. package/dist/internal/framework-file-storage.js +118 -139
  415. package/dist/internal/framework-storage-selection.js +21 -13
  416. package/dist/internal/frontmatter.js +4 -6
  417. package/dist/internal/github-fanout.js +50 -64
  418. package/dist/internal/guest-network.js +96 -109
  419. package/dist/internal/handleAgentServeTrigger.js +121 -126
  420. package/dist/internal/host-files.js +73 -88
  421. package/dist/internal/host-kv.js +21 -36
  422. package/dist/internal/host-otel.js +22 -19
  423. package/dist/internal/host-platforms.js +49 -63
  424. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  425. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  426. package/dist/internal/hosted-catch-protocol.js +1 -0
  427. package/dist/internal/hosted-catch.d.ts +5 -3
  428. package/dist/internal/hosted-catch.d.ts.map +1 -1
  429. package/dist/internal/hosted-catch.js +84 -93
  430. package/dist/internal/hosted-delivery-protocol.js +32 -8
  431. package/dist/internal/hosted-delivery.d.ts +13 -1
  432. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  433. package/dist/internal/hosted-delivery.js +614 -584
  434. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  435. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  436. package/dist/internal/hosted-eval-cases.js +162 -0
  437. package/dist/internal/hosted-execution-diag.js +38 -30
  438. package/dist/internal/hosted-execution-flush.js +75 -66
  439. package/dist/internal/hosted-execution-latency.js +16 -8
  440. package/dist/internal/hosted-managed-automation.js +2 -2
  441. package/dist/internal/hosting.js +2 -3
  442. package/dist/internal/http-channel-define.js +4 -1
  443. package/dist/internal/http-channel.js +101 -112
  444. package/dist/internal/http-control-plane-session.d.ts +18 -1
  445. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  446. package/dist/internal/http-control-plane-session.js +66 -32
  447. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  448. package/dist/internal/init-interview.js +73 -93
  449. package/dist/internal/init-project.js +182 -214
  450. package/dist/internal/init-scaffold.js +10 -21
  451. package/dist/internal/inline-stdio-mcp.js +80 -86
  452. package/dist/internal/install-cursor-skills.js +231 -273
  453. package/dist/internal/legacy-command-guard.js +18 -31
  454. package/dist/internal/listen-port.js +34 -45
  455. package/dist/internal/local-control-plane.js +293 -307
  456. package/dist/internal/local-env.js +1 -1
  457. package/dist/internal/local-ingress.js +15 -9
  458. package/dist/internal/log-ring.js +1 -2
  459. package/dist/internal/logs-client.js +207 -227
  460. package/dist/internal/map-pool.js +24 -38
  461. package/dist/internal/mcp-endpoint.js +204 -180
  462. package/dist/internal/mcp-host.js +165 -168
  463. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  464. package/dist/internal/mcp-oauth-persist.js +15 -29
  465. package/dist/internal/mcp-oauth.js +209 -266
  466. package/dist/internal/named-webhook-secret.d.ts +39 -0
  467. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  468. package/dist/internal/named-webhook-secret.js +47 -0
  469. package/dist/internal/open-browser.js +2 -3
  470. package/dist/internal/otel/collector.js +104 -68
  471. package/dist/internal/otel/config.js +24 -37
  472. package/dist/internal/otel/http.js +5 -7
  473. package/dist/internal/otel/mcp.js +3 -12
  474. package/dist/internal/otel/runtime.js +69 -83
  475. package/dist/internal/package-inline-stdio.js +57 -65
  476. package/dist/internal/peer-connections.js +9 -5
  477. package/dist/internal/platform-schedule-sync.js +39 -54
  478. package/dist/internal/platform-timers.js +176 -210
  479. package/dist/internal/playground/static.js +1 -2
  480. package/dist/internal/playground/toolchain.js +37 -53
  481. package/dist/internal/playground-proxy.js +230 -270
  482. package/dist/internal/process-memory-telemetry.js +33 -51
  483. package/dist/internal/prompt-context.js +3 -6
  484. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  485. package/dist/internal/reminder-runner.js +770 -785
  486. package/dist/internal/reminder-schedule.js +1 -1
  487. package/dist/internal/reminder-store.js +57 -78
  488. package/dist/internal/request-error-status.js +1 -3
  489. package/dist/internal/request-headers.js +2 -2
  490. package/dist/internal/resolve-prod-target.js +119 -135
  491. package/dist/internal/resolved-connections.js +16 -6
  492. package/dist/internal/run-client.js +221 -229
  493. package/dist/internal/runtime-dispatch-runner.js +18 -43
  494. package/dist/internal/schedule-runner.js +49 -58
  495. package/dist/internal/scm/pr-url.js +7 -6
  496. package/dist/internal/sdk-runner.js +388 -363
  497. package/dist/internal/serve-restart.js +26 -39
  498. package/dist/internal/server.d.ts.map +1 -1
  499. package/dist/internal/server.js +1283 -1244
  500. package/dist/internal/session-cost.js +7 -9
  501. package/dist/internal/session-engine.d.ts +3 -1
  502. package/dist/internal/session-engine.d.ts.map +1 -1
  503. package/dist/internal/session-engine.js +2801 -2777
  504. package/dist/internal/session-links.js +12 -16
  505. package/dist/internal/session-run-log.js +134 -82
  506. package/dist/internal/session-store.js +133 -164
  507. package/dist/internal/sessions-client.js +97 -118
  508. package/dist/internal/skill-catalog.js +18 -23
  509. package/dist/internal/skills-sync.js +16 -30
  510. package/dist/internal/slack-provision-client.js +90 -116
  511. package/dist/internal/start-log-store.js +48 -67
  512. package/dist/internal/steering.js +1 -2
  513. package/dist/internal/storage-coordinator.js +160 -196
  514. package/dist/internal/store-mirror.js +16 -30
  515. package/dist/internal/stream-progress.js +6 -8
  516. package/dist/internal/terminal-style.js +3 -4
  517. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  518. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  519. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  520. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  521. package/dist/internal/tool-catalog.js +11 -5
  522. package/dist/internal/tool-result.js +1 -1
  523. package/dist/internal/trajectory.js +19 -22
  524. package/dist/internal/turn-cost.js +52 -62
  525. package/dist/internal/turn-governor.js +5 -8
  526. package/dist/internal/turn-lease-store.js +85 -105
  527. package/dist/internal/turn-outbox.js +28 -43
  528. package/dist/internal/update-check.js +231 -259
  529. package/dist/internal/v2-hosting.js +1 -2
  530. package/dist/internal/workspace-sync.js +25 -41
  531. package/dist/internal/workspace.js +111 -139
  532. package/dist/kv/memory-kv.js +27 -51
  533. package/dist/memory.js +106 -148
  534. package/dist/otel.js +5 -8
  535. package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
  536. package/dist/playground/assets/{index-Co4CUVTQ.js → index-JekUQERK.js} +45 -45
  537. package/dist/playground/index.html +2 -2
  538. package/dist/prompt.js +2 -4
  539. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  540. package/dist/storage-backends/cursor-hosted.js +105 -145
  541. package/dist/storage-backends/file-kv.js +100 -128
  542. package/dist/storage-protocol.js +3 -5
  543. package/dist/storage.js +17 -26
  544. package/dist/types.d.ts +68 -0
  545. package/dist/types.d.ts.map +1 -1
  546. package/dist/types.js +20 -18
  547. package/docs/building-with-agents.md +2 -0
  548. package/docs/deployment.md +7 -0
  549. package/docs/guides/bitbucket.md +9 -1
  550. package/docs/guides/github.md +20 -4
  551. package/docs/guides/gitlab.md +9 -1
  552. package/docs/guides/migrate.md +127 -0
  553. package/docs/reference/cli.md +39 -0
  554. package/docs/troubleshooting.md +1 -0
  555. package/package.json +1 -1
  556. package/skills/debug/SKILL.md +1 -0
  557. package/skills/github/SKILL.md +23 -0
  558. package/skills/migrate-v2/SKILL.md +51 -10
  559. package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
  560. package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
  561. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
  562. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
  563. package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
  564. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
  565. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  566. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  567. package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
  568. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  569. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
  570. /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
@@ -3,15 +3,6 @@
3
3
  * dashboard-wizard launcher (`slack-provision-client.ts`), and
4
4
  * `init --manual` for Slack CLI / paste-at-api.slack.com manifests.
5
5
  */
6
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
- return new (P || (P = Promise))(function (resolve, reject) {
9
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
- step((generator = generator.apply(thisArg, _arguments || [])).next());
13
- });
14
- };
15
6
  import { access, readFile } from "node:fs/promises";
16
7
  import { basename, extname, join, resolve as resolvePath } from "node:path";
17
8
  import { envPrefixFromName, formatSlackSetupGuide, initSlackChannel, runSlackDoctor, slackEnvKeys, } from "../channels/slack/index.js";
@@ -42,7 +33,7 @@ Usage:
42
33
  ${CLI} slack icon <URL-or-FILE> [--dir .] [--slack-team T0123ABCD]
43
34
  [--prod] [--team <id>] [--json]
44
35
  ${CLI} slack init --manual [--dir .] [--name NAME]
45
- [--prefix PREFIX | --no-prefix] [--channel-posts]
36
+ [--prefix PREFIX | --no-prefix]
46
37
  [--install | --no-install]
47
38
  [--slack-team T0123ABCD] [--prod]
48
39
  ${CLI} slack manifest --env dev|prod|both [--dir .] [--name NAME]
@@ -56,7 +47,7 @@ create/destroy/icon — dedicated Socket Mode app via the Cursor dashboard:
56
47
  <dir>/.env.local and runs doctor. Requires \`${CLI} login\`
57
48
  (or CURSOR_API_KEY). A team service-account key cannot
58
49
  provision Slack apps. --prod provisions the prod app (default
59
- dev). --name / --icon / --channel-posts prefill the wizard.
50
+ dev). --name / --icon prefill the wizard.
60
51
  All three follow the agent's \`architecture\` (agent.ts;
61
52
  default v2): the wizard stores tokens on that deployment and
62
53
  the app inventory lives on that control plane.
@@ -82,73 +73,67 @@ Env tokens:
82
73
 
83
74
  See also: skills/setup-slack/SKILL.md
84
75
  `;
85
- export function cmdSlack(subcommand, options) {
86
- return __awaiter(this, void 0, void 0, function* () {
87
- switch (subcommand) {
88
- case undefined:
89
- case "help":
90
- case "--help":
91
- case "-h":
92
- process.stdout.write(SLACK_HELP);
93
- return subcommand === undefined ? 1 : 0;
94
- case "setup":
95
- process.stdout.write(formatSlackSetupGuide());
96
- return 0;
97
- case "create":
98
- return cmdSlackCreate(options);
99
- case "destroy":
100
- return cmdSlackDestroy(options);
101
- case "icon":
102
- return cmdSlackIcon(options);
103
- case "init":
104
- return cmdSlackInit({
105
- dir: options.dir,
106
- name: options.name,
107
- prefix: options.prefix,
108
- noPrefix: options.noPrefix,
109
- channelPosts: options.channelPosts,
110
- manual: options.manual,
111
- install: options.install,
112
- noInstall: options.noInstall,
113
- slackTeam: options.slackTeam,
114
- detectSlackCli: options.detectSlackCli,
115
- runSlackCli: options.runSlackCli,
116
- prod: options.prod,
117
- out: options.out,
118
- err: options.err,
119
- });
120
- case "manifest":
121
- return runSlackManifest(options);
122
- case "doctor":
123
- return runDoctor(options);
124
- default:
125
- process.stderr.write(`Unknown slack subcommand: ${subcommand}\n`);
126
- process.stdout.write(SLACK_HELP);
127
- return 1;
128
- }
129
- });
76
+ export async function cmdSlack(subcommand, options) {
77
+ switch (subcommand) {
78
+ case undefined:
79
+ case "help":
80
+ case "--help":
81
+ case "-h":
82
+ process.stdout.write(SLACK_HELP);
83
+ return subcommand === undefined ? 1 : 0;
84
+ case "setup":
85
+ process.stdout.write(formatSlackSetupGuide());
86
+ return 0;
87
+ case "create":
88
+ return cmdSlackCreate(options);
89
+ case "destroy":
90
+ return cmdSlackDestroy(options);
91
+ case "icon":
92
+ return cmdSlackIcon(options);
93
+ case "init":
94
+ return cmdSlackInit({
95
+ dir: options.dir,
96
+ name: options.name,
97
+ prefix: options.prefix,
98
+ noPrefix: options.noPrefix,
99
+ manual: options.manual,
100
+ install: options.install,
101
+ noInstall: options.noInstall,
102
+ slackTeam: options.slackTeam,
103
+ detectSlackCli: options.detectSlackCli,
104
+ runSlackCli: options.runSlackCli,
105
+ prod: options.prod,
106
+ out: options.out,
107
+ err: options.err,
108
+ });
109
+ case "manifest":
110
+ return runSlackManifest(options);
111
+ case "doctor":
112
+ return runDoctor(options);
113
+ default:
114
+ process.stderr.write(`Unknown slack subcommand: ${subcommand}\n`);
115
+ process.stdout.write(SLACK_HELP);
116
+ return 1;
117
+ }
130
118
  }
131
- function runDoctor(options) {
132
- return __awaiter(this, void 0, void 0, function* () {
133
- var _a, _b;
134
- const dir = resolvePath(options.dir);
135
- // Tokens usually live in the agent's .env.local; real env still wins.
136
- loadAgentLocalEnv(dir);
137
- const envPrefix = resolveDoctorEnvPrefix(options, dir);
138
- const doctor = (_a = options.doctorImpl) !== null && _a !== void 0 ? _a : runSlackDoctor;
139
- const channels = (_b = options.channels) !== null && _b !== void 0 ? _b : [];
140
- const result = yield doctor({
141
- envPrefix,
142
- channels: channels.length > 0 ? channels : undefined,
143
- });
144
- if (options.json) {
145
- process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
146
- }
147
- else {
148
- process.stdout.write(renderDoctorReport(result));
149
- }
150
- return result.ok ? 0 : 1;
119
+ async function runDoctor(options) {
120
+ const dir = resolvePath(options.dir);
121
+ // Tokens usually live in the agent's .env.local; real env still wins.
122
+ loadAgentLocalEnv(dir);
123
+ const envPrefix = resolveDoctorEnvPrefix(options, dir);
124
+ const doctor = options.doctorImpl ?? runSlackDoctor;
125
+ const channels = options.channels ?? [];
126
+ const result = await doctor({
127
+ envPrefix,
128
+ channels: channels.length > 0 ? channels : undefined,
151
129
  });
130
+ if (options.json) {
131
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
132
+ }
133
+ else {
134
+ process.stdout.write(renderDoctorReport(result));
135
+ }
136
+ return result.ok ? 0 : 1;
152
137
  }
153
138
  /**
154
139
  * --prefix / --no-prefix win; otherwise the directory-derived prefix
@@ -171,10 +156,9 @@ function resolveDoctorEnvPrefix(options, dir) {
171
156
  // ============================================================================
172
157
  // create / destroy — Cursor "Add to Slack" managed provisioning
173
158
  // ============================================================================
174
- const DEFAULT_WIZARD_POLL_INTERVAL_MS = 3000;
159
+ const DEFAULT_WIZARD_POLL_INTERVAL_MS = 3_000;
175
160
  const DEFAULT_WIZARD_POLL_TIMEOUT_MS = 60 * 60 * 1000;
176
161
  function resolveSlackAppTarget(options, err) {
177
- var _a, _b;
178
162
  if (options.env === "both" && options.prod !== true) {
179
163
  err("Provisioning targets one env at a time; pass --prod for the prod app (default dev).\n");
180
164
  return 1;
@@ -188,15 +172,14 @@ function resolveSlackAppTarget(options, err) {
188
172
  err(`Could not derive a valid app slug from the directory name ${JSON.stringify(basename(dir))} (slugs start with a letter or digit; lowercase letters, digits, '-', '_'); rename the directory or pass --dir <agent>.\n`);
189
173
  return 1;
190
174
  }
191
- const name = (_a = options.name) !== null && _a !== void 0 ? _a : basename(dir);
192
- const envPrefix = options.noPrefix === true ? undefined : ((_b = options.prefix) !== null && _b !== void 0 ? _b : envPrefixFromName(basename(dir)));
175
+ const name = options.name ?? basename(dir);
176
+ const envPrefix = options.noPrefix === true ? undefined : (options.prefix ?? envPrefixFromName(basename(dir)));
193
177
  return { dir, name, slug, env, envPrefix, envKeys: slackEnvKeys(envPrefix) };
194
178
  }
195
179
  function errStream(options) {
196
- var _a;
197
- return (_a = options.err) !== null && _a !== void 0 ? _a : ((text) => void process.stderr.write(text));
180
+ return options.err ?? ((text) => void process.stderr.write(text));
198
181
  }
199
- const SLACK_ICON_MAX_BYTES = 524288;
182
+ const SLACK_ICON_MAX_BYTES = 524_288;
200
183
  const SLACK_ICON_URL_MAX_LENGTH = 3000;
201
184
  const SLACK_ICON_CONTENT_TYPES = {
202
185
  ".png": "image/png",
@@ -204,39 +187,37 @@ const SLACK_ICON_CONTENT_TYPES = {
204
187
  ".jpeg": "image/jpeg",
205
188
  ".gif": "image/gif",
206
189
  };
207
- function resolveSlackIconSource(raw, err) {
208
- return __awaiter(this, void 0, void 0, function* () {
209
- if (raw.startsWith("https://")) {
210
- if (raw.length > SLACK_ICON_URL_MAX_LENGTH) {
211
- err(`Icon URLs must be at most ${SLACK_ICON_URL_MAX_LENGTH} characters (got ${raw.length}).\n`);
212
- return 1;
213
- }
214
- return { kind: "url", url: raw };
215
- }
216
- if (/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) {
217
- err(`Icon URLs must be https (got ${JSON.stringify(raw)}).\n`);
218
- return 1;
219
- }
220
- const path = resolvePath(raw);
221
- const contentType = SLACK_ICON_CONTENT_TYPES[extname(path).toLowerCase()];
222
- if (contentType === undefined) {
223
- err(`Icon files must be .png, .jpg/.jpeg, or .gif (got ${JSON.stringify(basename(path))}).\n`);
224
- return 1;
225
- }
226
- let data;
227
- try {
228
- data = yield readFile(path);
229
- }
230
- catch (error) {
231
- err(`Could not read the icon file ${path}: ${describeError(error)}\n`);
190
+ async function resolveSlackIconSource(raw, err) {
191
+ if (raw.startsWith("https://")) {
192
+ if (raw.length > SLACK_ICON_URL_MAX_LENGTH) {
193
+ err(`Icon URLs must be at most ${SLACK_ICON_URL_MAX_LENGTH} characters (got ${raw.length}).\n`);
232
194
  return 1;
233
195
  }
234
- if (data.length > SLACK_ICON_MAX_BYTES) {
235
- err(`Icon files must be at most ${SLACK_ICON_MAX_BYTES} bytes (${path} is ${data.length}).\n`);
236
- return 1;
237
- }
238
- return { kind: "file", base64: data.toString("base64"), contentType, path };
239
- });
196
+ return { kind: "url", url: raw };
197
+ }
198
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) {
199
+ err(`Icon URLs must be https (got ${JSON.stringify(raw)}).\n`);
200
+ return 1;
201
+ }
202
+ const path = resolvePath(raw);
203
+ const contentType = SLACK_ICON_CONTENT_TYPES[extname(path).toLowerCase()];
204
+ if (contentType === undefined) {
205
+ err(`Icon files must be .png, .jpg/.jpeg, or .gif (got ${JSON.stringify(basename(path))}).\n`);
206
+ return 1;
207
+ }
208
+ let data;
209
+ try {
210
+ data = await readFile(path);
211
+ }
212
+ catch (error) {
213
+ err(`Could not read the icon file ${path}: ${describeError(error)}\n`);
214
+ return 1;
215
+ }
216
+ if (data.length > SLACK_ICON_MAX_BYTES) {
217
+ err(`Icon files must be at most ${SLACK_ICON_MAX_BYTES} bytes (${path} is ${data.length}).\n`);
218
+ return 1;
219
+ }
220
+ return { kind: "file", base64: data.toString("base64"), contentType, path };
240
221
  }
241
222
  function toSlackAppIconInput(source) {
242
223
  return source.kind === "url"
@@ -247,24 +228,22 @@ function toSlackAppIconInput(source) {
247
228
  * File icons post after the wizard finishes. URL icons ride the mint
248
229
  * payload. Best-effort: failures warn, never fail the create.
249
230
  */
250
- function applySlackCreateFileIcon(ctx, source, appId) {
251
- return __awaiter(this, void 0, void 0, function* () {
252
- if (source === undefined || source.kind === "url") {
253
- return undefined;
254
- }
255
- try {
256
- yield ctx.client.setAppIcon({
257
- teamId: ctx.teamId,
258
- slackAppId: appId,
259
- icon: toSlackAppIconInput(source),
260
- });
261
- return "set";
262
- }
263
- catch (error) {
264
- ctx.err(`warning: setting the Slack app icon failed: ${describeError(error)}\nRetry with \`${CLI} slack icon ${source.path}\`.\n`);
265
- return "failed";
266
- }
267
- });
231
+ async function applySlackCreateFileIcon(ctx, source, appId) {
232
+ if (source === undefined || source.kind === "url") {
233
+ return undefined;
234
+ }
235
+ try {
236
+ await ctx.client.setAppIcon({
237
+ teamId: ctx.teamId,
238
+ slackAppId: appId,
239
+ icon: toSlackAppIconInput(source),
240
+ });
241
+ return "set";
242
+ }
243
+ catch (error) {
244
+ ctx.err(`warning: setting the Slack app icon failed: ${describeError(error)}\nRetry with \`${CLI} slack icon ${source.path}\`.\n`);
245
+ return "failed";
246
+ }
268
247
  }
269
248
  /**
270
249
  * The Slack control plane follows the agent's hosted architecture
@@ -274,15 +253,12 @@ function applySlackCreateFileIcon(ctx, source, appId) {
274
253
  * that is not an agent project yet has nothing to read and takes the
275
254
  * framework default, same as an `agent.ts` that omits the field.
276
255
  */
277
- function resolveSlackAppArchitecture(dir) {
278
- return __awaiter(this, void 0, void 0, function* () {
279
- var _a;
280
- if (!(yield isAgentProjectDir(dir))) {
281
- return DEFAULT_AGENT_ARCHITECTURE;
282
- }
283
- const project = yield loadAgentProject(dir);
284
- return (_a = project.agent.architecture) !== null && _a !== void 0 ? _a : DEFAULT_AGENT_ARCHITECTURE;
285
- });
256
+ async function resolveSlackAppArchitecture(dir) {
257
+ if (!(await isAgentProjectDir(dir))) {
258
+ return DEFAULT_AGENT_ARCHITECTURE;
259
+ }
260
+ const project = await loadAgentProject(dir);
261
+ return project.agent.architecture ?? DEFAULT_AGENT_ARCHITECTURE;
286
262
  }
287
263
  /**
288
264
  * Credentials → provisioning client → team id, sharing the deploy CLI's
@@ -290,47 +266,44 @@ function resolveSlackAppArchitecture(dir) {
290
266
  * default-team fallback). Returns an exit code (error already rendered)
291
267
  * on failure.
292
268
  */
293
- function prepareProvision(options) {
294
- return __awaiter(this, void 0, void 0, function* () {
295
- var _a, _b, _c, _d, _e;
296
- const out = (_a = options.out) !== null && _a !== void 0 ? _a : ((text) => void process.stdout.write(text));
297
- const err = errStream(options);
298
- const credential = resolveApiKeySync(options.apiKey === undefined ? undefined : { apiKey: options.apiKey });
299
- if ((credential === null || credential === void 0 ? void 0 : credential.source) === "service-account") {
300
- err(`A team service-account key cannot provision Slack apps. Sign in with \`${CLI} login\` or set CURSOR_API_KEY.\n`);
301
- return 1;
302
- }
303
- const auth = yield resolveDeployAuth({
304
- team: options.team,
305
- apiKey: options.apiKey,
306
- fetchImpl: options.fetchImpl,
307
- err,
308
- });
309
- if (typeof auth === "number") {
310
- return auth;
311
- }
312
- // Loading the project imports its authored modules; do it only once the
313
- // credentials are known good.
314
- const architecture = yield resolveSlackAppArchitecture(resolvePath(options.dir));
315
- // Provisioning routes live on the external API host beside deploys.
316
- return {
317
- client: new AgentServeSlackClient({
318
- backendUrl: cursorExternalApiUrl(),
319
- apiKey: auth.apiKey,
320
- architecture,
321
- fetchImpl: options.fetchImpl,
322
- }),
323
- teamId: auth.teamId,
324
- architecture,
325
- json: options.json === true,
326
- out,
327
- err,
328
- dim: ((_b = options.palette) !== null && _b !== void 0 ? _b : stderrPalette()).dim,
329
- openBrowserImpl: (_c = options.openBrowserImpl) !== null && _c !== void 0 ? _c : openBrowser,
330
- pollIntervalMs: (_d = options.connectPollIntervalMs) !== null && _d !== void 0 ? _d : DEFAULT_WIZARD_POLL_INTERVAL_MS,
331
- pollTimeoutMs: (_e = options.connectPollTimeoutMs) !== null && _e !== void 0 ? _e : DEFAULT_WIZARD_POLL_TIMEOUT_MS,
332
- };
269
+ async function prepareProvision(options) {
270
+ const out = options.out ?? ((text) => void process.stdout.write(text));
271
+ const err = errStream(options);
272
+ const credential = resolveApiKeySync(options.apiKey === undefined ? undefined : { apiKey: options.apiKey });
273
+ if (credential?.source === "service-account") {
274
+ err(`A team service-account key cannot provision Slack apps. Sign in with \`${CLI} login\` or set CURSOR_API_KEY.\n`);
275
+ return 1;
276
+ }
277
+ const auth = await resolveDeployAuth({
278
+ team: options.team,
279
+ apiKey: options.apiKey,
280
+ fetchImpl: options.fetchImpl,
281
+ err,
333
282
  });
283
+ if (typeof auth === "number") {
284
+ return auth;
285
+ }
286
+ // Loading the project imports its authored modules; do it only once the
287
+ // credentials are known good.
288
+ const architecture = await resolveSlackAppArchitecture(resolvePath(options.dir));
289
+ // Provisioning routes live on the external API host beside deploys.
290
+ return {
291
+ client: new AgentServeSlackClient({
292
+ backendUrl: cursorExternalApiUrl(),
293
+ apiKey: auth.apiKey,
294
+ architecture,
295
+ fetchImpl: options.fetchImpl,
296
+ }),
297
+ teamId: auth.teamId,
298
+ architecture,
299
+ json: options.json === true,
300
+ out,
301
+ err,
302
+ dim: (options.palette ?? stderrPalette()).dim,
303
+ openBrowserImpl: options.openBrowserImpl ?? openBrowser,
304
+ pollIntervalMs: options.connectPollIntervalMs ?? DEFAULT_WIZARD_POLL_INTERVAL_MS,
305
+ pollTimeoutMs: options.connectPollTimeoutMs ?? DEFAULT_WIZARD_POLL_TIMEOUT_MS,
306
+ };
334
307
  }
335
308
  function writePendingAdminWait(ctx, poll) {
336
309
  const appSuffix = poll.appId === undefined ? "" : ` (${poll.appId})`;
@@ -358,273 +331,266 @@ function writePendingAdminWait(ctx, poll) {
358
331
  ctx.err(ctx.dim(` Keep this command running.\n` +
359
332
  ` After an admin approves, click Retry in the dashboard.\n`));
360
333
  }
361
- export function cmdSlackCreate(options) {
362
- return __awaiter(this, void 0, void 0, function* () {
363
- var _a, _b, _c;
364
- const target = resolveSlackAppTarget(options, errStream(options));
365
- if (typeof target === "number") {
366
- return target;
367
- }
368
- let iconSource;
369
- if (options.icon !== undefined) {
370
- const resolved = yield resolveSlackIconSource(options.icon, errStream(options));
371
- if (typeof resolved === "number") {
372
- return resolved;
373
- }
374
- iconSource = resolved;
375
- }
376
- const ctx = yield prepareProvision(options);
377
- if (typeof ctx === "number") {
378
- return ctx;
379
- }
380
- let wrote;
381
- try {
382
- wrote = yield scaffoldSlackChannelFiles(target);
383
- }
384
- catch (error) {
385
- ctx.err(`${describeError(error)}\n`);
386
- return 1;
387
- }
388
- if (wrote.length > 0 && !ctx.json) {
389
- ctx.err(`${ctx.dim(`Scaffolded the Slack channel: ${wrote.join(", ")}`)}\n`);
334
+ export async function cmdSlackCreate(options) {
335
+ const target = resolveSlackAppTarget(options, errStream(options));
336
+ if (typeof target === "number") {
337
+ return target;
338
+ }
339
+ let iconSource;
340
+ if (options.icon !== undefined) {
341
+ const resolved = await resolveSlackIconSource(options.icon, errStream(options));
342
+ if (typeof resolved === "number") {
343
+ return resolved;
390
344
  }
391
- const source = yield inferDeployGitSource(target.dir);
392
- let minted;
345
+ iconSource = resolved;
346
+ }
347
+ const ctx = await prepareProvision(options);
348
+ if (typeof ctx === "number") {
349
+ return ctx;
350
+ }
351
+ let wrote;
352
+ try {
353
+ wrote = await scaffoldSlackChannelFiles(target);
354
+ }
355
+ catch (error) {
356
+ ctx.err(`${describeError(error)}\n`);
357
+ return 1;
358
+ }
359
+ if (wrote.length > 0 && !ctx.json) {
360
+ ctx.err(`${ctx.dim(`Scaffolded the Slack channel: ${wrote.join(", ")}`)}\n`);
361
+ }
362
+ const source = await inferDeployGitSource(target.dir);
363
+ let minted;
364
+ try {
365
+ minted = await ctx.client.mintWizard({
366
+ teamId: ctx.teamId,
367
+ slug: target.slug,
368
+ env: target.env,
369
+ envPrefix: target.envPrefix,
370
+ name: options.name ?? target.name,
371
+ gitRepoUrl: source.gitRepoUrl,
372
+ gitRef: source.gitRef,
373
+ agentPath: source.agentPath,
374
+ // Control planes predating the full permission set only subscribe
375
+ // channel posts when asked; newer ones always do.
376
+ channelPosts: options.channelPosts === true ? true : undefined,
377
+ slackTeamId: options.slackTeam,
378
+ iconUrl: iconSource?.kind === "url" ? iconSource.url : undefined,
379
+ force: options.force === true ? true : undefined,
380
+ });
381
+ }
382
+ catch (error) {
383
+ return renderSlackApiError(error, ctx.err);
384
+ }
385
+ const waitMinutes = Math.round(ctx.pollTimeoutMs / 60_000);
386
+ ctx.err(`Finish Slack setup in the browser:\n\n ${minted.url}\n\n`);
387
+ ctx.err(ctx.dim(` Sign in as the same Cursor account that ran this command.\n` +
388
+ ` The CLI waits here (up to ${waitMinutes} minutes).\n`));
389
+ ctx.openBrowserImpl(minted.url);
390
+ const deadline = Date.now() + ctx.pollTimeoutMs;
391
+ let sawPendingAdmin = false;
392
+ let poll;
393
+ for (;;) {
393
394
  try {
394
- minted = yield ctx.client.mintWizard({
395
- teamId: ctx.teamId,
396
- slug: target.slug,
397
- env: target.env,
398
- envPrefix: target.envPrefix,
399
- name: (_a = options.name) !== null && _a !== void 0 ? _a : target.name,
400
- gitRepoUrl: source.gitRepoUrl,
401
- gitRef: source.gitRef,
402
- agentPath: source.agentPath,
403
- channelPosts: options.channelPosts === true ? true : undefined,
404
- slackTeamId: options.slackTeam,
405
- iconUrl: (iconSource === null || iconSource === void 0 ? void 0 : iconSource.kind) === "url" ? iconSource.url : undefined,
406
- force: options.force === true ? true : undefined,
407
- });
395
+ poll = await ctx.client.pollWizard(minted.wizardId);
408
396
  }
409
397
  catch (error) {
410
- return renderSlackApiError(error, ctx.err);
411
- }
412
- const waitMinutes = Math.round(ctx.pollTimeoutMs / 60000);
413
- ctx.err(`Finish Slack setup in the browser:\n\n ${minted.url}\n\n`);
414
- ctx.err(ctx.dim(` Sign in as the same Cursor account that ran this command.\n` +
415
- ` The CLI waits here (up to ${waitMinutes} minutes).\n`));
416
- ctx.openBrowserImpl(minted.url);
417
- const deadline = Date.now() + ctx.pollTimeoutMs;
418
- let sawPendingAdmin = false;
419
- let poll;
420
- for (;;) {
421
- try {
422
- poll = yield ctx.client.pollWizard(minted.wizardId);
423
- }
424
- catch (error) {
425
- if (Date.now() >= deadline) {
426
- return renderSlackApiError(error, ctx.err);
427
- }
428
- yield sleep(ctx.pollIntervalMs);
429
- continue;
430
- }
431
- if (poll.status === "complete") {
432
- break;
433
- }
434
- if (poll.status === "failed") {
435
- ctx.err(`${(_b = poll.error) !== null && _b !== void 0 ? _b : "Slack setup failed"}\n`);
436
- return 1;
437
- }
438
- if (poll.status === "pending_admin_approval" && !sawPendingAdmin) {
439
- sawPendingAdmin = true;
440
- writePendingAdminWait(ctx, poll);
441
- }
442
398
  if (Date.now() >= deadline) {
443
- ctx.err(`Timed out waiting for Slack setup.\n\n`);
444
- ctx.err(ctx.dim(` Finish it in the browser, then re-run \`${CLI} slack create\`.\n\n`));
445
- ctx.err(` ${minted.url}\n`);
446
- return 1;
399
+ return renderSlackApiError(error, ctx.err);
447
400
  }
448
- yield sleep(ctx.pollIntervalMs);
401
+ await sleep(ctx.pollIntervalMs);
402
+ continue;
449
403
  }
450
- if (poll === undefined || poll.localEnv === undefined) {
451
- ctx.err(poll.localEnvClaimed === true
452
- ? "Tokens were already claimed by another poll; re-run create to rotate them.\n"
453
- : "Slack setup finished but no tokens were returned; re-run create.\n");
454
- return 1;
455
- }
456
- const envEntries = [{ key: target.envKeys.bot, value: poll.localEnv.botToken }];
457
- if (poll.localEnv.appToken !== undefined) {
458
- envEntries.push({ key: target.envKeys.app, value: poll.localEnv.appToken });
459
- }
460
- const envFile = join(target.dir, ".env.local");
461
- try {
462
- yield upsertEnvFile(envFile, envEntries);
463
- if (yield ensureEnvLocalGitignored(target.dir)) {
464
- wrote.push(".gitignore (+.env.local)");
465
- }
404
+ if (poll.status === "complete") {
405
+ break;
466
406
  }
467
- catch (error) {
468
- ctx.err(`Could not write ${envFile}: ${describeError(error)}\n`);
407
+ if (poll.status === "failed") {
408
+ ctx.err(`${poll.error ?? "Slack setup failed"}\n`);
469
409
  return 1;
470
410
  }
471
- wrote.push(".env.local");
472
- for (const { key, value } of envEntries) {
473
- process.env[key] = value;
474
- }
475
- if (poll.localEnv.appToken === undefined) {
476
- ctx.err(ctx.dim(`warning: Slack did not return an app-level token, so ${target.envKeys.app} was not written.\n` +
477
- ` Re-run \`${CLI} slack create\` to recover it.\n`));
411
+ if (poll.status === "pending_admin_approval" && !sawPendingAdmin) {
412
+ sawPendingAdmin = true;
413
+ writePendingAdminWait(ctx, poll);
478
414
  }
479
- let iconStatus;
480
- if (poll.appId !== undefined) {
481
- iconStatus = yield applySlackCreateFileIcon(ctx, iconSource, poll.appId);
415
+ if (Date.now() >= deadline) {
416
+ ctx.err(`Timed out waiting for Slack setup.\n\n`);
417
+ ctx.err(ctx.dim(` Finish it in the browser, then re-run \`${CLI} slack create\`.\n\n`));
418
+ ctx.err(` ${minted.url}\n`);
419
+ return 1;
482
420
  }
483
- if (ctx.json) {
484
- ctx.out(`${JSON.stringify({
485
- ok: true,
486
- appId: poll.appId,
487
- status: poll.status,
488
- architecture: ctx.architecture,
489
- envKeys: target.envKeys,
490
- wrote,
491
- iconStatus,
492
- }, null, 2)}\n`);
493
- return 0;
421
+ await sleep(ctx.pollIntervalMs);
422
+ }
423
+ if (poll === undefined || poll.localEnv === undefined) {
424
+ ctx.err(poll.localEnvClaimed === true
425
+ ? "Tokens were already claimed by another poll; re-run create to rotate them.\n"
426
+ : "Slack setup finished but no tokens were returned; re-run create.\n");
427
+ return 1;
428
+ }
429
+ const envEntries = [{ key: target.envKeys.bot, value: poll.localEnv.botToken }];
430
+ if (poll.localEnv.appToken !== undefined) {
431
+ envEntries.push({ key: target.envKeys.app, value: poll.localEnv.appToken });
432
+ }
433
+ const envFile = join(target.dir, ".env.local");
434
+ try {
435
+ await upsertEnvFile(envFile, envEntries);
436
+ if (await ensureEnvLocalGitignored(target.dir)) {
437
+ wrote.push(".gitignore (+.env.local)");
494
438
  }
495
- ctx.out(`Slack is connected for ${target.slug}` +
496
- (poll.appId === undefined ? "" : ` (app ${poll.appId})`) +
497
- `.\n wrote ${envEntries.map(entry => entry.key).join(" + ")} to ${envFile}\n\n`);
498
- const doctor = (_c = options.doctorImpl) !== null && _c !== void 0 ? _c : runSlackDoctor;
499
- const doctorResult = yield doctor(target.envPrefix === undefined ? {} : { envPrefix: target.envPrefix });
500
- ctx.out(renderDoctorReport(doctorResult));
501
- ctx.out(`\nNext steps:\n` +
502
- ` 1. ${CLI} serve --dir ${options.dir} --dev\n` +
503
- ` 2. Invite the bot in Slack and @mention it.\n`);
439
+ }
440
+ catch (error) {
441
+ ctx.err(`Could not write ${envFile}: ${describeError(error)}\n`);
442
+ return 1;
443
+ }
444
+ wrote.push(".env.local");
445
+ for (const { key, value } of envEntries) {
446
+ process.env[key] = value;
447
+ }
448
+ if (poll.localEnv.appToken === undefined) {
449
+ ctx.err(ctx.dim(`warning: Slack did not return an app-level token, so ${target.envKeys.app} was not written.\n` +
450
+ ` Re-run \`${CLI} slack create\` to recover it.\n`));
451
+ }
452
+ let iconStatus;
453
+ if (poll.appId !== undefined) {
454
+ iconStatus = await applySlackCreateFileIcon(ctx, iconSource, poll.appId);
455
+ }
456
+ if (ctx.json) {
457
+ ctx.out(`${JSON.stringify({
458
+ ok: true,
459
+ appId: poll.appId,
460
+ status: poll.status,
461
+ architecture: ctx.architecture,
462
+ envKeys: target.envKeys,
463
+ wrote,
464
+ iconStatus,
465
+ }, null, 2)}\n`);
504
466
  return 0;
505
- });
467
+ }
468
+ ctx.out(`Slack is connected for ${target.slug}` +
469
+ (poll.appId === undefined ? "" : ` (app ${poll.appId})`) +
470
+ `.\n wrote ${envEntries.map(entry => entry.key).join(" + ")} to ${envFile}\n\n`);
471
+ const doctor = options.doctorImpl ?? runSlackDoctor;
472
+ const doctorResult = await doctor(target.envPrefix === undefined ? {} : { envPrefix: target.envPrefix });
473
+ ctx.out(renderDoctorReport(doctorResult));
474
+ ctx.out(`\nNext steps:\n` +
475
+ ` 1. ${CLI} serve --dir ${options.dir} --dev\n` +
476
+ ` 2. Invite the bot in Slack and @mention it.\n`);
477
+ return 0;
506
478
  }
507
479
  /**
508
480
  * Resolve the one provisioned app for (slug, env[, --slack-team]) from
509
481
  * `GET /status`. Returns an exit code with the error already rendered
510
482
  * when zero or several apps match.
511
483
  */
512
- function resolveProvisionedApp(ctx, target, options) {
513
- return __awaiter(this, void 0, void 0, function* () {
514
- let status;
515
- try {
516
- status = yield ctx.client.status(ctx.teamId);
517
- }
518
- catch (error) {
519
- return renderSlackApiError(error, ctx.err);
520
- }
521
- const sameSlug = status.apps.filter(app => app.slug === target.slug);
522
- let candidates = sameSlug.filter(app => app.env === target.env);
523
- if (options.slackTeam !== undefined) {
524
- candidates = candidates.filter(app => app.slackTeamId === options.slackTeam);
525
- }
526
- if (candidates.length === 0) {
527
- ctx.err(`No provisioned ${target.env} Slack app for "${target.slug}"${options.slackTeam === undefined ? "" : ` in workspace ${options.slackTeam}`} (team ${ctx.teamId}).\n` +
528
- (sameSlug.length === 0
529
- ? ""
530
- : `Provisioned apps for this agent:\n${formatAppList(sameSlug)}`));
531
- return 1;
532
- }
533
- if (candidates.length > 1) {
534
- ctx.err(`Multiple provisioned Slack apps match "${target.slug}" (${target.env}):\n` +
535
- formatAppList(candidates) +
536
- `Pass --slack-team <id> to pick one.\n`);
537
- return 1;
538
- }
539
- return candidates[0];
540
- });
484
+ async function resolveProvisionedApp(ctx, target, options) {
485
+ let status;
486
+ try {
487
+ status = await ctx.client.status(ctx.teamId);
488
+ }
489
+ catch (error) {
490
+ return renderSlackApiError(error, ctx.err);
491
+ }
492
+ const sameSlug = status.apps.filter(app => app.slug === target.slug);
493
+ let candidates = sameSlug.filter(app => app.env === target.env);
494
+ if (options.slackTeam !== undefined) {
495
+ candidates = candidates.filter(app => app.slackTeamId === options.slackTeam);
496
+ }
497
+ if (candidates.length === 0) {
498
+ ctx.err(`No provisioned ${target.env} Slack app for "${target.slug}"${options.slackTeam === undefined ? "" : ` in workspace ${options.slackTeam}`} (team ${ctx.teamId}).\n` +
499
+ (sameSlug.length === 0
500
+ ? ""
501
+ : `Provisioned apps for this agent:\n${formatAppList(sameSlug)}`));
502
+ return 1;
503
+ }
504
+ if (candidates.length > 1) {
505
+ ctx.err(`Multiple provisioned Slack apps match "${target.slug}" (${target.env}):\n` +
506
+ formatAppList(candidates) +
507
+ `Pass --slack-team <id> to pick one.\n`);
508
+ return 1;
509
+ }
510
+ return candidates[0];
541
511
  }
542
- export function cmdSlackDestroy(options) {
543
- return __awaiter(this, void 0, void 0, function* () {
544
- const target = resolveSlackAppTarget(options, errStream(options));
545
- if (typeof target === "number") {
546
- return target;
547
- }
548
- const ctx = yield prepareProvision(options);
549
- if (typeof ctx === "number") {
550
- return ctx;
551
- }
552
- const app = yield resolveProvisionedApp(ctx, target, options);
553
- if (typeof app === "number") {
554
- return app;
555
- }
556
- try {
557
- yield ctx.client.deleteApp({
558
- teamId: ctx.teamId,
559
- slackAppId: app.slackAppId,
560
- });
561
- }
562
- catch (error) {
563
- return renderSlackApiError(error, ctx.err);
564
- }
565
- if (ctx.json) {
566
- ctx.out(`${JSON.stringify({
567
- ok: true,
568
- deleted: true,
569
- appId: app.slackAppId,
570
- slackTeamId: app.slackTeamId,
571
- slug: target.slug,
572
- env: target.env,
573
- }, null, 2)}\n`);
574
- return 0;
575
- }
576
- ctx.out(`Deleted the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}) from workspace ${app.slackTeamId}.\n` +
577
- `Tokens in .env.local were left in place — ${target.envKeys.bot} / ${target.envKeys.app} are now inert; remove them whenever you like.\n`);
512
+ export async function cmdSlackDestroy(options) {
513
+ const target = resolveSlackAppTarget(options, errStream(options));
514
+ if (typeof target === "number") {
515
+ return target;
516
+ }
517
+ const ctx = await prepareProvision(options);
518
+ if (typeof ctx === "number") {
519
+ return ctx;
520
+ }
521
+ const app = await resolveProvisionedApp(ctx, target, options);
522
+ if (typeof app === "number") {
523
+ return app;
524
+ }
525
+ try {
526
+ await ctx.client.deleteApp({
527
+ teamId: ctx.teamId,
528
+ slackAppId: app.slackAppId,
529
+ });
530
+ }
531
+ catch (error) {
532
+ return renderSlackApiError(error, ctx.err);
533
+ }
534
+ if (ctx.json) {
535
+ ctx.out(`${JSON.stringify({
536
+ ok: true,
537
+ deleted: true,
538
+ appId: app.slackAppId,
539
+ slackTeamId: app.slackTeamId,
540
+ slug: target.slug,
541
+ env: target.env,
542
+ }, null, 2)}\n`);
578
543
  return 0;
579
- });
544
+ }
545
+ ctx.out(`Deleted the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}) from workspace ${app.slackTeamId}.\n` +
546
+ `Tokens in .env.local were left in place — ${target.envKeys.bot} / ${target.envKeys.app} are now inert; remove them whenever you like.\n`);
547
+ return 0;
580
548
  }
581
- export function cmdSlackIcon(options) {
582
- return __awaiter(this, void 0, void 0, function* () {
583
- const err = errStream(options);
584
- if (options.iconSource === undefined) {
585
- err(`Usage: ${CLI} slack icon <https-url-or-file> [--dir .] [--slack-team T0123ABCD] [--prod] [--team <id>] [--json]\n`);
586
- return 1;
587
- }
588
- const source = yield resolveSlackIconSource(options.iconSource, err);
589
- if (typeof source === "number") {
590
- return source;
591
- }
592
- const target = resolveSlackAppTarget(options, err);
593
- if (typeof target === "number") {
594
- return target;
595
- }
596
- const ctx = yield prepareProvision(options);
597
- if (typeof ctx === "number") {
598
- return ctx;
599
- }
600
- const app = yield resolveProvisionedApp(ctx, target, options);
601
- if (typeof app === "number") {
602
- return app;
603
- }
604
- try {
605
- yield ctx.client.setAppIcon({
606
- teamId: ctx.teamId,
607
- slackAppId: app.slackAppId,
608
- icon: toSlackAppIconInput(source),
609
- });
610
- }
611
- catch (error) {
612
- return renderSlackApiError(error, ctx.err);
613
- }
614
- if (ctx.json) {
615
- ctx.out(`${JSON.stringify({
616
- ok: true,
617
- appId: app.slackAppId,
618
- slackTeamId: app.slackTeamId,
619
- slug: target.slug,
620
- env: target.env,
621
- iconStatus: "set",
622
- }, null, 2)}\n`);
623
- return 0;
624
- }
625
- ctx.out(`Set the icon for the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}).\n`);
549
+ export async function cmdSlackIcon(options) {
550
+ const err = errStream(options);
551
+ if (options.iconSource === undefined) {
552
+ err(`Usage: ${CLI} slack icon <https-url-or-file> [--dir .] [--slack-team T0123ABCD] [--prod] [--team <id>] [--json]\n`);
553
+ return 1;
554
+ }
555
+ const source = await resolveSlackIconSource(options.iconSource, err);
556
+ if (typeof source === "number") {
557
+ return source;
558
+ }
559
+ const target = resolveSlackAppTarget(options, err);
560
+ if (typeof target === "number") {
561
+ return target;
562
+ }
563
+ const ctx = await prepareProvision(options);
564
+ if (typeof ctx === "number") {
565
+ return ctx;
566
+ }
567
+ const app = await resolveProvisionedApp(ctx, target, options);
568
+ if (typeof app === "number") {
569
+ return app;
570
+ }
571
+ try {
572
+ await ctx.client.setAppIcon({
573
+ teamId: ctx.teamId,
574
+ slackAppId: app.slackAppId,
575
+ icon: toSlackAppIconInput(source),
576
+ });
577
+ }
578
+ catch (error) {
579
+ return renderSlackApiError(error, ctx.err);
580
+ }
581
+ if (ctx.json) {
582
+ ctx.out(`${JSON.stringify({
583
+ ok: true,
584
+ appId: app.slackAppId,
585
+ slackTeamId: app.slackTeamId,
586
+ slug: target.slug,
587
+ env: target.env,
588
+ iconStatus: "set",
589
+ }, null, 2)}\n`);
626
590
  return 0;
627
- });
591
+ }
592
+ ctx.out(`Set the icon for the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}).\n`);
593
+ return 0;
628
594
  }
629
595
  function formatAppList(apps) {
630
596
  return apps
@@ -635,37 +601,33 @@ function formatAppList(apps) {
635
601
  * Scaffold the authored Slack channel when absent. Existing files are never
636
602
  * overwritten: initSlackChannel writes with `wx`.
637
603
  */
638
- function scaffoldSlackChannelFiles(target) {
639
- return __awaiter(this, void 0, void 0, function* () {
640
- var _a;
641
- const channelFile = projectPath(resolveProjectRoot(target.dir), "channels/slack.ts");
642
- if (yield fileExists(join(target.dir, channelFile))) {
604
+ async function scaffoldSlackChannelFiles(target) {
605
+ const channelFile = projectPath(resolveProjectRoot(target.dir), "channels/slack.ts");
606
+ if (await fileExists(join(target.dir, channelFile))) {
607
+ return [];
608
+ }
609
+ try {
610
+ const result = await initSlackChannel({
611
+ dir: target.dir,
612
+ name: target.name,
613
+ envPrefix: target.envPrefix ?? "",
614
+ });
615
+ return result.files;
616
+ }
617
+ catch (error) {
618
+ if (isErrnoException(error) && error.code === "EEXIST") {
643
619
  return [];
644
620
  }
645
- try {
646
- const result = yield initSlackChannel({
647
- dir: target.dir,
648
- name: target.name,
649
- envPrefix: (_a = target.envPrefix) !== null && _a !== void 0 ? _a : "",
650
- });
651
- return result.files;
652
- }
653
- catch (error) {
654
- if (isErrnoException(error) && error.code === "EEXIST") {
655
- return [];
656
- }
657
- throw error;
658
- }
659
- });
621
+ throw error;
622
+ }
660
623
  }
661
624
  function renderDoctorReport(result) {
662
- var _a;
663
625
  let text = `env: ${result.envKeys.bot} / ${result.envKeys.app}\n`;
664
626
  for (const check of result.checks) {
665
627
  text += `${check.ok ? "ok" : "!!"} ${check.id}: ${check.message}\n`;
666
628
  }
667
629
  text += result.ok ? "doctor: pass\n" : "doctor: fail\n";
668
- for (const note of (_a = result.notes) !== null && _a !== void 0 ? _a : []) {
630
+ for (const note of result.notes ?? []) {
669
631
  text += `\nnote: ${note}\n`;
670
632
  }
671
633
  return text;
@@ -679,16 +641,14 @@ function renderSlackApiError(error, err) {
679
641
  : `${error.message}\n`);
680
642
  return 1;
681
643
  }
682
- function fileExists(path) {
683
- return __awaiter(this, void 0, void 0, function* () {
684
- try {
685
- yield access(path);
686
- return true;
687
- }
688
- catch (_a) {
689
- return false;
690
- }
691
- });
644
+ async function fileExists(path) {
645
+ try {
646
+ await access(path);
647
+ return true;
648
+ }
649
+ catch {
650
+ return false;
651
+ }
692
652
  }
693
653
  function isErrnoException(error) {
694
654
  return error instanceof Error && "code" in error;