@lovelybunch/api 1.0.72-alpha.0 → 1.0.73

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 (283) hide show
  1. package/dist/lib/auth/auth-manager.d.ts.map +1 -0
  2. package/dist/lib/auth/auth-manager.js.map +1 -0
  3. package/dist/lib/gait-path.d.ts.map +1 -0
  4. package/dist/lib/gait-path.js.map +1 -0
  5. package/dist/lib/git-settings.d.ts.map +1 -0
  6. package/dist/lib/git-settings.js.map +1 -0
  7. package/dist/lib/git.d.ts.map +1 -0
  8. package/dist/lib/git.js.map +1 -0
  9. package/dist/lib/jobs/global-job-scheduler.d.ts.map +1 -0
  10. package/dist/lib/jobs/global-job-scheduler.js.map +1 -0
  11. package/dist/lib/jobs/job-runner.d.ts.map +1 -0
  12. package/dist/lib/jobs/job-runner.js.map +1 -0
  13. package/dist/lib/jobs/job-scheduler.d.ts.map +1 -0
  14. package/dist/lib/jobs/job-scheduler.js +0 -17
  15. package/dist/lib/jobs/job-scheduler.js.map +1 -0
  16. package/dist/lib/jobs/job-store.d.ts.map +1 -0
  17. package/dist/lib/jobs/job-store.js.map +1 -0
  18. package/dist/lib/project-paths.d.ts.map +1 -0
  19. package/dist/lib/project-paths.js.map +1 -0
  20. package/dist/lib/storage/file-storage.d.ts.map +1 -0
  21. package/dist/lib/storage/file-storage.js.map +1 -0
  22. package/dist/lib/symlinks/symlink-manager.d.ts.map +1 -0
  23. package/dist/lib/symlinks/symlink-manager.js.map +1 -0
  24. package/dist/lib/symlinks/types.d.ts.map +1 -0
  25. package/dist/lib/symlinks/types.js.map +1 -0
  26. package/dist/lib/terminal/context-helper.d.ts +1 -1
  27. package/dist/lib/terminal/context-helper.d.ts.map +1 -0
  28. package/dist/lib/terminal/context-helper.js +4 -16
  29. package/dist/lib/terminal/context-helper.js.map +1 -0
  30. package/dist/lib/terminal/global-manager.d.ts.map +1 -0
  31. package/dist/lib/terminal/global-manager.js.map +1 -0
  32. package/dist/lib/terminal/shell-utils.d.ts.map +1 -0
  33. package/dist/lib/terminal/shell-utils.js.map +1 -0
  34. package/dist/lib/terminal/terminal-manager.d.ts.map +1 -0
  35. package/dist/lib/terminal/terminal-manager.js.map +1 -0
  36. package/dist/lib/user-preferences.d.ts.map +1 -0
  37. package/dist/lib/user-preferences.js.map +1 -0
  38. package/dist/middleware/auth.d.ts.map +1 -0
  39. package/dist/middleware/auth.js.map +1 -0
  40. package/dist/routes/api/v1/agents/[id]/index.d.ts.map +1 -0
  41. package/dist/routes/api/v1/agents/[id]/index.js.map +1 -0
  42. package/dist/routes/api/v1/agents/[id]/route.d.ts.map +1 -0
  43. package/dist/routes/api/v1/agents/[id]/route.js.map +1 -0
  44. package/dist/routes/api/v1/agents/index.d.ts.map +1 -0
  45. package/dist/routes/api/v1/agents/index.js.map +1 -0
  46. package/dist/routes/api/v1/agents/route.d.ts.map +1 -0
  47. package/dist/routes/api/v1/agents/route.js.map +1 -0
  48. package/dist/routes/api/v1/ai/index.d.ts.map +1 -0
  49. package/dist/routes/api/v1/ai/index.js.map +1 -0
  50. package/dist/routes/api/v1/ai/route.d.ts.map +1 -0
  51. package/dist/routes/api/v1/ai/route.js +134 -33
  52. package/dist/routes/api/v1/ai/route.js.map +1 -0
  53. package/dist/routes/api/v1/ai/tools.js +157 -34
  54. package/dist/routes/api/v1/api-keys/index.d.ts.map +1 -0
  55. package/dist/routes/api/v1/api-keys/index.js.map +1 -0
  56. package/dist/routes/api/v1/api-keys/route.d.ts.map +1 -0
  57. package/dist/routes/api/v1/api-keys/route.js.map +1 -0
  58. package/dist/routes/api/v1/auth/index.d.ts.map +1 -0
  59. package/dist/routes/api/v1/auth/index.js.map +1 -0
  60. package/dist/routes/api/v1/auth/route.d.ts.map +1 -0
  61. package/dist/routes/api/v1/auth/route.js.map +1 -0
  62. package/dist/routes/api/v1/auth-settings/index.d.ts.map +1 -0
  63. package/dist/routes/api/v1/auth-settings/index.js.map +1 -0
  64. package/dist/routes/api/v1/auth-settings/route.d.ts.map +1 -0
  65. package/dist/routes/api/v1/auth-settings/route.js.map +1 -0
  66. package/dist/routes/api/v1/chats/[id]/index.d.ts.map +1 -0
  67. package/dist/routes/api/v1/chats/[id]/index.js.map +1 -0
  68. package/dist/routes/api/v1/chats/[id]/route.d.ts.map +1 -0
  69. package/dist/routes/api/v1/chats/[id]/route.js.map +1 -0
  70. package/dist/routes/api/v1/chats/index.d.ts.map +1 -0
  71. package/dist/routes/api/v1/chats/index.js.map +1 -0
  72. package/dist/routes/api/v1/chats/route.d.ts.map +1 -0
  73. package/dist/routes/api/v1/chats/route.js.map +1 -0
  74. package/dist/routes/api/v1/config/index.d.ts.map +1 -0
  75. package/dist/routes/api/v1/config/index.js.map +1 -0
  76. package/dist/routes/api/v1/config/route.d.ts.map +1 -0
  77. package/dist/routes/api/v1/config/route.js.map +1 -0
  78. package/dist/routes/api/v1/context/architecture/route.d.ts.map +1 -0
  79. package/dist/routes/api/v1/context/architecture/route.js.map +1 -0
  80. package/dist/routes/api/v1/context/index.d.ts.map +1 -0
  81. package/dist/routes/api/v1/context/index.js +2 -0
  82. package/dist/routes/api/v1/context/index.js.map +1 -0
  83. package/dist/routes/api/v1/context/knowledge/[filename]/index.d.ts.map +1 -0
  84. package/dist/routes/api/v1/context/knowledge/[filename]/index.js.map +1 -0
  85. package/dist/routes/api/v1/context/knowledge/[filename]/route.d.ts.map +1 -0
  86. package/dist/routes/api/v1/context/knowledge/[filename]/route.js.map +1 -0
  87. package/dist/routes/api/v1/context/knowledge/index.d.ts.map +1 -0
  88. package/dist/routes/api/v1/context/knowledge/index.js.map +1 -0
  89. package/dist/routes/api/v1/context/knowledge/route.d.ts.map +1 -0
  90. package/dist/routes/api/v1/context/knowledge/route.js.map +1 -0
  91. package/dist/routes/api/v1/context/project/route.d.ts.map +1 -0
  92. package/dist/routes/api/v1/context/project/route.js.map +1 -0
  93. package/dist/routes/api/v1/context/role/route.d.ts +3 -0
  94. package/dist/routes/api/v1/context/role/route.js +198 -0
  95. package/dist/routes/api/v1/events/status/route.d.ts +1 -1
  96. package/dist/routes/api/v1/git/index.d.ts.map +1 -0
  97. package/dist/routes/api/v1/git/index.js +0 -17
  98. package/dist/routes/api/v1/git/index.js.map +1 -0
  99. package/dist/routes/api/v1/jobs/[id]/route.d.ts.map +1 -0
  100. package/dist/routes/api/v1/jobs/[id]/route.js.map +1 -0
  101. package/dist/routes/api/v1/jobs/[id]/run/route.d.ts +2 -2
  102. package/dist/routes/api/v1/jobs/[id]/run/route.d.ts.map +1 -0
  103. package/dist/routes/api/v1/jobs/[id]/run/route.js.map +1 -0
  104. package/dist/routes/api/v1/jobs/[id]/runs/[runId]/route.d.ts +2 -2
  105. package/dist/routes/api/v1/jobs/index.d.ts.map +1 -0
  106. package/dist/routes/api/v1/jobs/index.js.map +1 -0
  107. package/dist/routes/api/v1/jobs/route.d.ts.map +1 -0
  108. package/dist/routes/api/v1/jobs/route.js.map +1 -0
  109. package/dist/routes/api/v1/jobs/status/route.d.ts +1 -1
  110. package/dist/routes/api/v1/jobs/status/route.d.ts.map +1 -0
  111. package/dist/routes/api/v1/jobs/status/route.js.map +1 -0
  112. package/dist/routes/api/v1/mcp/index.d.ts.map +1 -0
  113. package/dist/routes/api/v1/mcp/index.js +116 -3
  114. package/dist/routes/api/v1/mcp/index.js.map +1 -0
  115. package/dist/routes/api/v1/mcp/route.d.ts.map +1 -0
  116. package/dist/routes/api/v1/mcp/route.js.map +1 -0
  117. package/dist/routes/api/v1/proposals/[id]/route.d.ts +8 -8
  118. package/dist/routes/api/v1/proposals/[id]/route.d.ts.map +1 -0
  119. package/dist/routes/api/v1/proposals/[id]/route.js +0 -9
  120. package/dist/routes/api/v1/proposals/[id]/route.js.map +1 -0
  121. package/dist/routes/api/v1/proposals/index.d.ts.map +1 -0
  122. package/dist/routes/api/v1/proposals/index.js.map +1 -0
  123. package/dist/routes/api/v1/proposals/route.d.ts.map +1 -0
  124. package/dist/routes/api/v1/proposals/route.js +0 -8
  125. package/dist/routes/api/v1/proposals/route.js.map +1 -0
  126. package/dist/routes/api/v1/resources/[id]/index.d.ts.map +1 -0
  127. package/dist/routes/api/v1/resources/[id]/index.js.map +1 -0
  128. package/dist/routes/api/v1/resources/[id]/route.js.map +1 -0
  129. package/dist/routes/api/v1/resources/[id]/thumbnail/index.d.ts.map +1 -0
  130. package/dist/routes/api/v1/resources/[id]/thumbnail/index.js.map +1 -0
  131. package/dist/routes/api/v1/resources/[id]/thumbnail/route.js.map +1 -0
  132. package/dist/routes/api/v1/resources/index.d.ts.map +1 -0
  133. package/dist/routes/api/v1/resources/index.js.map +1 -0
  134. package/dist/routes/api/v1/resources/route.d.ts.map +1 -0
  135. package/dist/routes/api/v1/resources/route.js.map +1 -0
  136. package/dist/routes/api/v1/symlinks/index.d.ts.map +1 -0
  137. package/dist/routes/api/v1/symlinks/index.js.map +1 -0
  138. package/dist/routes/api/v1/symlinks/route.d.ts.map +1 -0
  139. package/dist/routes/api/v1/symlinks/route.js.map +1 -0
  140. package/dist/routes/api/v1/terminal/[proposalId]/create/index.d.ts.map +1 -0
  141. package/dist/routes/api/v1/terminal/[proposalId]/create/index.js.map +1 -0
  142. package/dist/routes/api/v1/terminal/[proposalId]/create/route.d.ts.map +1 -0
  143. package/dist/routes/api/v1/terminal/[proposalId]/create/route.js.map +1 -0
  144. package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.d.ts.map +1 -0
  145. package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.js.map +1 -0
  146. package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.d.ts.map +1 -0
  147. package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.js.map +1 -0
  148. package/dist/routes/api/v1/terminal/[proposalId]/resize/index.d.ts.map +1 -0
  149. package/dist/routes/api/v1/terminal/[proposalId]/resize/index.js.map +1 -0
  150. package/dist/routes/api/v1/terminal/[proposalId]/resize/route.d.ts.map +1 -0
  151. package/dist/routes/api/v1/terminal/[proposalId]/resize/route.js.map +1 -0
  152. package/dist/routes/api/v1/terminal/sessions/index.d.ts.map +1 -0
  153. package/dist/routes/api/v1/terminal/sessions/index.js.map +1 -0
  154. package/dist/routes/api/v1/terminal/sessions/route.d.ts.map +1 -0
  155. package/dist/routes/api/v1/terminal/sessions/route.js.map +1 -0
  156. package/dist/routes/api/v1/user/index.d.ts.map +1 -0
  157. package/dist/routes/api/v1/user/index.js.map +1 -0
  158. package/dist/routes/api/v1/user/settings/index.d.ts.map +1 -0
  159. package/dist/routes/api/v1/user/settings/index.js.map +1 -0
  160. package/dist/routes/api/v1/user/settings/route.d.ts.map +1 -0
  161. package/dist/routes/api/v1/user/settings/route.js.map +1 -0
  162. package/dist/server-with-static.d.ts.map +1 -0
  163. package/dist/server-with-static.js +0 -2
  164. package/dist/server-with-static.js.map +1 -0
  165. package/dist/server.d.ts.map +1 -0
  166. package/dist/server.js +0 -2
  167. package/dist/server.js.map +1 -0
  168. package/package.json +4 -5
  169. package/static/assets/ActivityPage-C_HqpJt2.js +1 -0
  170. package/static/assets/{AgentDetailPage-CS4l_2nY.js → AgentDetailPage-WLAnnZep.js} +1 -1
  171. package/static/assets/AgentEditPage-DOemUkvg.js +1 -0
  172. package/static/assets/AgentsPage-Bage8eYW.js +3 -0
  173. package/static/assets/AgentsSettingsPage-Cw2MTnHU.js +6 -0
  174. package/static/assets/{ApiKeysSettingsPage-BmGRl-Cr.js → ApiKeysSettingsPage-DCKd4LXE.js} +3 -3
  175. package/static/assets/{ArchitectureEditPage-CyAu4lkT.js → ArchitectureEditPage-WY9k_1tR.js} +1 -1
  176. package/static/assets/ArchitecturePage-Cj4dVDWO.js +1 -0
  177. package/static/assets/{AuthSettingsPage-BfxPusvb.js → AuthSettingsPage-Bs5wL5Yj.js} +2 -2
  178. package/static/assets/{CallbackPage-C7QN2xcl.js → CallbackPage-CtydJ4j3.js} +1 -1
  179. package/static/assets/CodePage-BiRf5q_q.js +2 -0
  180. package/static/assets/{CollapsibleSection-DpcF5jIr.js → CollapsibleSection-5qSoX47l.js} +1 -1
  181. package/static/assets/DashboardPage-e9hNRsi2.js +41 -0
  182. package/static/assets/{GitPage-DVCWmjb1.js → GitPage-BG-ZSGfu.js} +3 -3
  183. package/static/assets/{GitSettingsPage-CA-NVPgC.js → GitSettingsPage-Cn-MciXq.js} +2 -2
  184. package/static/assets/{IdentityPage-yBi2meP8.js → IdentityPage-DCpoDF2j.js} +3 -3
  185. package/static/assets/{ImplementationStepsEditor-CdFjqsQp.js → ImplementationStepsEditor-PM47REBn.js} +2 -2
  186. package/static/assets/IntegrationsSettingsPage-DJpf2gZn.js +1 -0
  187. package/static/assets/JobDetailPage-9shaUPlO.js +1 -0
  188. package/static/assets/KnowledgeDetailPage-CLizVIxC.js +1 -0
  189. package/static/assets/{KnowledgeEditPage-DqTY1Y3C.js → KnowledgeEditPage-B-sdY_DS.js} +1 -1
  190. package/static/assets/{KnowledgePage-DonVTg_6.js → KnowledgePage-DIlUufGq.js} +2 -2
  191. package/static/assets/{LoginPage-DFpCcG6v.js → LoginPage-DcTU__Dc.js} +1 -1
  192. package/static/assets/McpSettingsPage-BPDLne4q.js +1 -0
  193. package/static/assets/NewAgentPage-8-abvhkI.js +1 -0
  194. package/static/assets/{NewKnowledgePage-D93ERPBo.js → NewKnowledgePage-Rvj741x1.js} +2 -2
  195. package/static/assets/NewProposalPage-BLIqmuks.js +90 -0
  196. package/static/assets/{ProjectEditPage-kXy3gxS3.js → ProjectEditPage-DC5-v_2a.js} +1 -1
  197. package/static/assets/ProjectPage-_L4wqwrB.js +1 -0
  198. package/static/assets/{PromptsSettingsPage-BNQrbBn5.js → PromptsSettingsPage-K-qqpF2S.js} +1 -1
  199. package/static/assets/ProposalDetailPage-BVXTjXw2.js +1 -0
  200. package/static/assets/ProposalEditPage-Bs3ak0PG.js +1 -0
  201. package/static/assets/{ProposalsPage-CysWDXyl.js → ProposalsPage-BvKlKvuo.js} +2 -2
  202. package/static/assets/{ResourcesPage-QD68AoOk.js → ResourcesPage-BSyX_kHV.js} +5 -5
  203. package/static/assets/RoleEditPage-CnWierul.js +13 -0
  204. package/static/assets/RolePage-D8xB0I-F.js +1 -0
  205. package/static/assets/{RulesSettingsPage-DQvhq7o0.js → RulesSettingsPage-CZBQ0u-x.js} +1 -1
  206. package/static/assets/SchedulePage-HBFJT_19.js +4 -0
  207. package/static/assets/SourceInput-BoRGYtye.js +1 -0
  208. package/static/assets/{TagInput-C1XF1z9l.js → TagInput-CdXzv6hj.js} +1 -1
  209. package/static/assets/TerminalPage-CqPXFOIN.js +1 -0
  210. package/static/assets/{TerminalSessionPage-BkuO3Dlc.js → TerminalSessionPage-DR2cApWv.js} +8 -3
  211. package/static/assets/UserPreferencesPage-CPkulDiM.js +1 -0
  212. package/static/assets/{UserSettingsPage-Czyu--ZE.js → UserSettingsPage-BuMnU394.js} +1 -1
  213. package/static/assets/{UtilitiesPage-BL3r6jt4.js → UtilitiesPage-BGiBB5PT.js} +1 -1
  214. package/static/assets/{alert-yDv7BoVY.js → alert-CHpdnk6F.js} +1 -1
  215. package/static/assets/{arrow-down-B6mDQzhv.js → arrow-down-BjGtxyJ7.js} +1 -1
  216. package/static/assets/{arrow-left-oYBMYRNP.js → arrow-left-DR0foZvi.js} +1 -1
  217. package/static/assets/{arrow-up-BtNT59gW.js → arrow-up-DCGMV1HG.js} +1 -1
  218. package/static/assets/{badge-A8sRXZ1m.js → badge-Cds9UgAB.js} +1 -1
  219. package/static/assets/{browser-modal-DcxLC6CX.js → browser-modal-Ck4-s_jh.js} +2 -2
  220. package/static/assets/{calendar-C6_Zaz3s.js → calendar-CWhxfYG2.js} +1 -1
  221. package/static/assets/{card-Brl-P7qu.js → card-BdOrf6VU.js} +1 -1
  222. package/static/assets/{chevron-left-BsJmB9OE.js → chevron-left-Wnwkk8g7.js} +1 -1
  223. package/static/assets/chevrons-up-DbnuGl5g.js +11 -0
  224. package/static/assets/{circle-alert-BYXOF-Yd.js → circle-alert-BPvQggmh.js} +1 -1
  225. package/static/assets/{circle-check-BISWYf84.js → circle-check-CTlDV9K4.js} +1 -1
  226. package/static/assets/{circle-check-big-GdURlCCT.js → circle-check-big-KMhw8TDM.js} +1 -1
  227. package/static/assets/{circle-play-D14kkelg.js → circle-play-tZLgOcAc.js} +1 -1
  228. package/static/assets/{circle-x-CWvfwx75.js → circle-x-D3tazxxl.js} +1 -1
  229. package/static/assets/{clipboard-CQ1MeyX5.js → clipboard-C86rsVqL.js} +1 -1
  230. package/static/assets/{clock-C7sCX_DE.js → clock-Qm5u6CAm.js} +1 -1
  231. package/static/assets/{download-BjE8JxlU.js → download-Bo3vdlNo.js} +1 -1
  232. package/static/assets/droid-Caom7ttu.js +4 -0
  233. package/static/assets/{eye-2hl27c7R.js → eye-Cr9Hfzxo.js} +1 -1
  234. package/static/assets/{folder-git-2-BBlVIDmr.js → folder-git-2-Em4ZglGs.js} +1 -1
  235. package/static/assets/index-BhlZ_D1Y.css +2 -0
  236. package/static/assets/index-CQpPrvm_.js +468 -0
  237. package/static/assets/{label-DA737D6X.js → label-nG86oxuW.js} +1 -1
  238. package/static/assets/{markdown-editor-BhYm394v.js → markdown-editor-CEQMlLWe.js} +1 -1
  239. package/static/assets/{pause-DS_ZgX9w.js → pause-DuR7ql7H.js} +1 -1
  240. package/static/assets/{play-Cgu7MRJC.js → play-p4m8WHP3.js} +1 -1
  241. package/static/assets/{plus-RZwwEJRO.js → plus-CD075YlZ.js} +1 -1
  242. package/static/assets/{radio-group-CzZoufFM.js → radio-group-DCKkxIgI.js} +1 -1
  243. package/static/assets/{refresh-cw-BJ2GIM1Z.js → refresh-cw-D-IgYQ7y.js} +1 -1
  244. package/static/assets/{search-B2ODQzPd.js → search-W3H-E0eW.js} +1 -1
  245. package/static/assets/{switch-AdqXRjK1.js → switch-E0GrYmgh.js} +1 -1
  246. package/static/assets/{tabs-DnIPixK3.js → tabs-DjZiD9WD.js} +1 -1
  247. package/static/assets/{tag-C4UgL0Z_.js → tag-D0iVh1-U.js} +1 -1
  248. package/static/assets/terminal-preview-BQBOEop2.js +1 -0
  249. package/static/assets/{use-terminal-qsHkIOJb.js → use-terminal-0TezQnxO.js} +1 -1
  250. package/static/assets/{zap-CpNZOBUL.js → zap-C_5I7lLi.js} +1 -1
  251. package/static/index.html +2 -2
  252. package/dist/lib/mcp-client.d.ts +0 -39
  253. package/dist/lib/mcp-client.js +0 -131
  254. package/dist/lib/slack/slack-service.d.ts +0 -89
  255. package/dist/lib/slack/slack-service.js +0 -504
  256. package/dist/routes/api/v1/slack/index.d.ts +0 -3
  257. package/dist/routes/api/v1/slack/index.js +0 -15
  258. package/dist/routes/api/v1/slack/route.d.ts +0 -122
  259. package/dist/routes/api/v1/slack/route.js +0 -189
  260. package/static/assets/AgentEditPage-mvchfGaI.js +0 -1
  261. package/static/assets/AgentsPage-D4JsS7kC.js +0 -3
  262. package/static/assets/AgentsSettingsPage-CPZm3ECa.js +0 -6
  263. package/static/assets/ArchitecturePage-BEVC5igc.js +0 -1
  264. package/static/assets/CodePage-DoP5IiuI.js +0 -2
  265. package/static/assets/DashboardPage-D0EoXiL2.js +0 -11
  266. package/static/assets/IntegrationsSettingsPage-4NWwhHlm.js +0 -1
  267. package/static/assets/KnowledgeDetailPage-mBBrz-_N.js +0 -1
  268. package/static/assets/McpSettingsPage-jXN9kO3i.js +0 -1
  269. package/static/assets/NewAgentPage-BNojru16.js +0 -1
  270. package/static/assets/NewProposalPage-BBmHfu-z.js +0 -90
  271. package/static/assets/NotificationsSettingsPage-D6oOIvep.js +0 -1
  272. package/static/assets/ProjectPage-D3vvfNxI.js +0 -1
  273. package/static/assets/ProposalDetailPage-CMgZUcxP.js +0 -1
  274. package/static/assets/ProposalEditPage-Bn_1OJ11.js +0 -1
  275. package/static/assets/SchedulePage-CghrKKJB.js +0 -4
  276. package/static/assets/SourceInput-BU8xQMbc.js +0 -1
  277. package/static/assets/TerminalPage-BfNa9oLV.js +0 -1
  278. package/static/assets/UserPreferencesPage-DWsDPJWa.js +0 -1
  279. package/static/assets/droid-C6RWH9f4.js +0 -4
  280. package/static/assets/index-BJVvhEWY.css +0 -2
  281. package/static/assets/index-D_2ZhRwL.js +0 -463
  282. package/static/assets/message-square-DV1_7h3v.js +0 -6
  283. package/static/assets/terminal-preview-PYoJzFpP.js +0 -11
@@ -1,504 +0,0 @@
1
- import { WebClient, LogLevel } from '@slack/web-api';
2
- import { promises as fs, existsSync, mkdirSync } from 'fs';
3
- import path from 'path';
4
- import { getAppDataDir } from '@lovelybunch/core';
5
- const DEFAULT_CONFIG = {
6
- enabled: false,
7
- botToken: '',
8
- signingSecret: '',
9
- channelId: '',
10
- channelName: '',
11
- notifications: {
12
- proposals: { created: true, statusChange: true },
13
- jobs: { completed: true, failed: true },
14
- git: { push: false, merge: true },
15
- },
16
- };
17
- class SlackService {
18
- client = null;
19
- config = null;
20
- getSettingsPath() {
21
- const appDataDir = getAppDataDir();
22
- // Ensure directory exists
23
- if (!existsSync(appDataDir)) {
24
- mkdirSync(appDataDir, { recursive: true });
25
- }
26
- return path.join(appDataDir, 'slack.json');
27
- }
28
- async loadConfig() {
29
- if (this.config) {
30
- return this.config;
31
- }
32
- const settingsPath = this.getSettingsPath();
33
- try {
34
- const raw = await fs.readFile(settingsPath, 'utf-8');
35
- const parsed = JSON.parse(raw);
36
- this.config = { ...DEFAULT_CONFIG, ...parsed };
37
- return this.config;
38
- }
39
- catch (error) {
40
- if (error?.code === 'ENOENT') {
41
- this.config = { ...DEFAULT_CONFIG };
42
- return this.config;
43
- }
44
- console.warn('[slack-service] Failed to read slack.json:', error);
45
- this.config = { ...DEFAULT_CONFIG };
46
- return this.config;
47
- }
48
- }
49
- async saveConfig(updates) {
50
- const current = await this.loadConfig();
51
- const updated = {
52
- ...current,
53
- ...updates,
54
- notifications: {
55
- ...current.notifications,
56
- ...(updates.notifications || {}),
57
- proposals: {
58
- ...current.notifications.proposals,
59
- ...(updates.notifications?.proposals || {}),
60
- },
61
- jobs: {
62
- ...current.notifications.jobs,
63
- ...(updates.notifications?.jobs || {}),
64
- },
65
- git: {
66
- ...current.notifications.git,
67
- ...(updates.notifications?.git || {}),
68
- },
69
- },
70
- };
71
- const settingsPath = this.getSettingsPath();
72
- await fs.writeFile(settingsPath, JSON.stringify(updated, null, 2), 'utf-8');
73
- // Reset cached config and client
74
- this.config = updated;
75
- this.client = null;
76
- return updated;
77
- }
78
- async getConfigForDisplay() {
79
- const config = await this.loadConfig();
80
- return {
81
- enabled: config.enabled,
82
- channelId: config.channelId,
83
- channelName: config.channelName,
84
- notifications: config.notifications,
85
- hasBotToken: !!config.botToken && config.botToken.length > 0,
86
- hasSigningSecret: !!config.signingSecret && config.signingSecret.length > 0,
87
- };
88
- }
89
- getClient() {
90
- if (this.client) {
91
- return this.client;
92
- }
93
- if (!this.config?.botToken) {
94
- return null;
95
- }
96
- this.client = new WebClient(this.config.botToken, {
97
- logLevel: LogLevel.WARN,
98
- });
99
- return this.client;
100
- }
101
- async testConnection() {
102
- try {
103
- await this.loadConfig();
104
- const client = this.getClient();
105
- if (!client) {
106
- return { success: false, error: 'Bot token not configured' };
107
- }
108
- const result = await client.auth.test();
109
- if (result.ok) {
110
- return {
111
- success: true,
112
- teamName: result.team
113
- };
114
- }
115
- else {
116
- return { success: false, error: result.error || 'Unknown error' };
117
- }
118
- }
119
- catch (error) {
120
- return {
121
- success: false,
122
- error: error.message || 'Failed to connect to Slack'
123
- };
124
- }
125
- }
126
- async listChannels() {
127
- try {
128
- await this.loadConfig();
129
- const client = this.getClient();
130
- if (!client) {
131
- throw new Error('Bot token not configured');
132
- }
133
- const channels = [];
134
- let cursor;
135
- // First try to fetch both public and private channels
136
- // Fall back to public only if groups:read scope is missing
137
- let channelTypes = 'public_channel,private_channel';
138
- try {
139
- // Test if we can list private channels
140
- await client.conversations.list({ types: 'private_channel', limit: 1 });
141
- }
142
- catch (error) {
143
- if (error.data?.error === 'missing_scope' && error.data?.needed === 'groups:read') {
144
- // Fall back to public channels only
145
- channelTypes = 'public_channel';
146
- }
147
- }
148
- // Fetch channels
149
- do {
150
- const result = await client.conversations.list({
151
- types: channelTypes,
152
- limit: 200,
153
- cursor,
154
- });
155
- if (result.channels) {
156
- for (const channel of result.channels) {
157
- if (channel.id && channel.name) {
158
- channels.push({
159
- id: channel.id,
160
- name: channel.name,
161
- isPrivate: channel.is_private || false,
162
- isMember: channel.is_member || false,
163
- });
164
- }
165
- }
166
- }
167
- cursor = result.response_metadata?.next_cursor;
168
- } while (cursor);
169
- // Sort by name
170
- channels.sort((a, b) => a.name.localeCompare(b.name));
171
- return channels;
172
- }
173
- catch (error) {
174
- console.error('[slack-service] Failed to list channels:', error);
175
- // Provide helpful error messages for common Slack API errors
176
- if (error.data?.error === 'missing_scope' || error.message?.includes('missing_scope')) {
177
- throw new Error('Missing required Slack scopes. Please add "channels:read" (and optionally "groups:read" for private channels) to your Slack app under OAuth & Permissions.');
178
- }
179
- if (error.data?.error === 'invalid_auth' || error.message?.includes('invalid_auth')) {
180
- throw new Error('Invalid bot token. Please check your Bot User OAuth Token.');
181
- }
182
- if (error.data?.error === 'token_revoked' || error.message?.includes('token_revoked')) {
183
- throw new Error('Bot token has been revoked. Please reinstall the Slack app to your workspace.');
184
- }
185
- throw new Error(error.message || 'Failed to list channels');
186
- }
187
- }
188
- async sendNotification(payload) {
189
- try {
190
- const config = await this.loadConfig();
191
- if (!config.enabled || !config.channelId) {
192
- return false;
193
- }
194
- // Check if this notification type is enabled
195
- if (!this.isNotificationEnabled(config, payload)) {
196
- return false;
197
- }
198
- const client = this.getClient();
199
- if (!client) {
200
- console.warn('[slack-service] Cannot send notification: bot token not configured');
201
- return false;
202
- }
203
- const message = this.formatNotification(payload);
204
- await client.chat.postMessage({
205
- channel: config.channelId,
206
- ...message,
207
- });
208
- return true;
209
- }
210
- catch (error) {
211
- console.error('[slack-service] Failed to send notification:', error);
212
- return false;
213
- }
214
- }
215
- /**
216
- * Send an example notification for testing a specific notification type.
217
- * Bypasses the enabled check so users can test before enabling.
218
- */
219
- async sendExampleNotification(notificationType) {
220
- try {
221
- const config = await this.loadConfig();
222
- if (!config.channelId) {
223
- throw new Error('No channel configured. Please select a channel first.');
224
- }
225
- const client = this.getClient();
226
- if (!client) {
227
- throw new Error('Bot token not configured');
228
- }
229
- const payload = this.getExamplePayload(notificationType);
230
- const message = this.formatNotification(payload);
231
- await client.chat.postMessage({
232
- channel: config.channelId,
233
- ...message,
234
- });
235
- return true;
236
- }
237
- catch (error) {
238
- console.error('[slack-service] Failed to send example notification:', error);
239
- throw error;
240
- }
241
- }
242
- getExamplePayload(type) {
243
- switch (type) {
244
- case 'proposal.created':
245
- return {
246
- type: 'proposal.created',
247
- proposalId: 'cp-example-123',
248
- intent: 'Add user authentication flow',
249
- author: 'Example User',
250
- };
251
- case 'proposal.statusChange':
252
- return {
253
- type: 'proposal.statusChange',
254
- proposalId: 'cp-example-123',
255
- intent: 'Add user authentication flow',
256
- status: 'proposed',
257
- previousStatus: 'draft',
258
- };
259
- case 'job.completed':
260
- return {
261
- type: 'job.completed',
262
- jobId: 'job-example-456',
263
- jobName: 'Daily code review sync',
264
- duration: 45000,
265
- };
266
- case 'job.failed':
267
- return {
268
- type: 'job.failed',
269
- jobId: 'job-example-456',
270
- jobName: 'Daily code review sync',
271
- error: 'Connection timeout after 30 seconds',
272
- };
273
- case 'git.push':
274
- return {
275
- type: 'git.push',
276
- branch: 'feature/example-branch',
277
- commitCount: 3,
278
- };
279
- case 'git.merge':
280
- return {
281
- type: 'git.merge',
282
- branch: 'feature/example-branch',
283
- targetBranch: 'main',
284
- message: 'Merged feature branch into main',
285
- };
286
- default:
287
- throw new Error(`Unknown notification type: ${type}`);
288
- }
289
- }
290
- isNotificationEnabled(config, payload) {
291
- switch (payload.type) {
292
- case 'proposal.created':
293
- return config.notifications.proposals.created;
294
- case 'proposal.statusChange':
295
- return config.notifications.proposals.statusChange;
296
- case 'job.completed':
297
- return config.notifications.jobs.completed;
298
- case 'job.failed':
299
- return config.notifications.jobs.failed;
300
- case 'git.push':
301
- return config.notifications.git.push;
302
- case 'git.merge':
303
- return config.notifications.git.merge;
304
- default:
305
- return false;
306
- }
307
- }
308
- formatNotification(payload) {
309
- switch (payload.type) {
310
- case 'proposal.created':
311
- return this.formatProposalCreated(payload);
312
- case 'proposal.statusChange':
313
- return this.formatProposalStatusChange(payload);
314
- case 'job.completed':
315
- return this.formatJobCompleted(payload);
316
- case 'job.failed':
317
- return this.formatJobFailed(payload);
318
- case 'git.push':
319
- return this.formatGitPush(payload);
320
- case 'git.merge':
321
- return this.formatGitMerge(payload);
322
- default:
323
- return { text: 'Unknown notification type' };
324
- }
325
- }
326
- formatProposalCreated(payload) {
327
- const text = `New proposal created: ${payload.intent}`;
328
- return {
329
- text,
330
- blocks: [
331
- {
332
- type: 'section',
333
- text: {
334
- type: 'mrkdwn',
335
- text: `:memo: *New Proposal Created*\n*${payload.intent}*\nA new change proposal has been submitted for review.`,
336
- },
337
- },
338
- {
339
- type: 'context',
340
- elements: [
341
- {
342
- type: 'mrkdwn',
343
- text: `ID: \`${payload.proposalId}\`${payload.author ? ` | Author: ${payload.author}` : ''}`,
344
- },
345
- ],
346
- },
347
- ],
348
- };
349
- }
350
- formatProposalStatusChange(payload) {
351
- const statusEmoji = this.getStatusEmoji(payload.status);
352
- const text = `Proposal status changed: ${payload.intent} → ${payload.status}`;
353
- return {
354
- text,
355
- blocks: [
356
- {
357
- type: 'section',
358
- text: {
359
- type: 'mrkdwn',
360
- text: `${statusEmoji} *Proposal Status Changed*\n*${payload.intent}*\nThe proposal has moved to a new stage in the review process.`,
361
- },
362
- },
363
- {
364
- type: 'context',
365
- elements: [
366
- {
367
- type: 'mrkdwn',
368
- text: `\`${payload.previousStatus || 'unknown'}\` → \`${payload.status}\` | ID: \`${payload.proposalId}\``,
369
- },
370
- ],
371
- },
372
- ],
373
- };
374
- }
375
- formatJobCompleted(payload) {
376
- const duration = payload.duration ? `${Math.round(payload.duration / 1000)}s` : 'unknown';
377
- const text = `Job completed: ${payload.jobName}`;
378
- return {
379
- text,
380
- blocks: [
381
- {
382
- type: 'section',
383
- text: {
384
- type: 'mrkdwn',
385
- text: `:white_check_mark: *Job Completed*\n*${payload.jobName}*\nThe scheduled job finished successfully.`,
386
- },
387
- },
388
- {
389
- type: 'context',
390
- elements: [
391
- {
392
- type: 'mrkdwn',
393
- text: `Duration: ${duration} | ID: \`${payload.jobId}\``,
394
- },
395
- ],
396
- },
397
- ],
398
- };
399
- }
400
- formatJobFailed(payload) {
401
- const text = `Job failed: ${payload.jobName}`;
402
- return {
403
- text,
404
- blocks: [
405
- {
406
- type: 'section',
407
- text: {
408
- type: 'mrkdwn',
409
- text: `:x: *Job Failed*\n*${payload.jobName}*\nThe scheduled job encountered an error and did not complete.`,
410
- },
411
- },
412
- {
413
- type: 'context',
414
- elements: [
415
- {
416
- type: 'mrkdwn',
417
- text: `ID: \`${payload.jobId}\`${payload.error ? `\nError: ${payload.error.slice(0, 200)}` : ''}`,
418
- },
419
- ],
420
- },
421
- ],
422
- };
423
- }
424
- formatGitPush(payload) {
425
- const text = `Pushed to ${payload.branch}`;
426
- return {
427
- text,
428
- blocks: [
429
- {
430
- type: 'section',
431
- text: {
432
- type: 'mrkdwn',
433
- text: `:arrow_up: *Git Push*\nPushed to \`${payload.branch}\`\nCode changes have been pushed to the remote repository.`,
434
- },
435
- },
436
- {
437
- type: 'context',
438
- elements: [
439
- {
440
- type: 'mrkdwn',
441
- text: payload.commitCount ? `${payload.commitCount} commit(s)` : 'Commits pushed',
442
- },
443
- ],
444
- },
445
- ],
446
- };
447
- }
448
- formatGitMerge(payload) {
449
- const text = `Merged ${payload.branch} into ${payload.targetBranch}`;
450
- return {
451
- text,
452
- blocks: [
453
- {
454
- type: 'section',
455
- text: {
456
- type: 'mrkdwn',
457
- text: `:twisted_rightwards_arrows: *Git Merge*\nMerged \`${payload.branch}\` into \`${payload.targetBranch || 'target'}\`\nBranches have been combined successfully.`,
458
- },
459
- },
460
- {
461
- type: 'context',
462
- elements: [
463
- {
464
- type: 'mrkdwn',
465
- text: payload.message || 'Merge completed',
466
- },
467
- ],
468
- },
469
- ],
470
- };
471
- }
472
- getStatusEmoji(status) {
473
- switch (status) {
474
- case 'approved':
475
- return ':white_check_mark:';
476
- case 'merged':
477
- return ':tada:';
478
- case 'rejected':
479
- return ':no_entry:';
480
- case 'in-review':
481
- return ':eyes:';
482
- case 'proposed':
483
- return ':raising_hand:';
484
- case 'draft':
485
- return ':pencil2:';
486
- default:
487
- return ':arrows_counterclockwise:';
488
- }
489
- }
490
- // Clear cached state (useful for testing or config changes)
491
- clearCache() {
492
- this.config = null;
493
- this.client = null;
494
- }
495
- }
496
- // Singleton instance
497
- let slackServiceInstance = null;
498
- export function getSlackService() {
499
- if (!slackServiceInstance) {
500
- slackServiceInstance = new SlackService();
501
- }
502
- return slackServiceInstance;
503
- }
504
- export { SlackService };
@@ -1,3 +0,0 @@
1
- import { Hono } from 'hono';
2
- declare const slackRoutes: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
- export { slackRoutes };
@@ -1,15 +0,0 @@
1
- import { Hono } from 'hono';
2
- import { getConfig, updateConfig, testConnection, listChannels, sendTestNotification, sendExampleNotification } from './route.js';
3
- const slackRoutes = new Hono();
4
- // Configuration endpoints
5
- slackRoutes.get('/config', getConfig);
6
- slackRoutes.put('/config', updateConfig);
7
- // Connection testing
8
- slackRoutes.post('/test', testConnection);
9
- // Channel listing
10
- slackRoutes.get('/channels', listChannels);
11
- // Test notification
12
- slackRoutes.post('/notify', sendTestNotification);
13
- // Example notification for specific type
14
- slackRoutes.post('/notify/example', sendExampleNotification);
15
- export { slackRoutes };
@@ -1,122 +0,0 @@
1
- import { Context } from 'hono';
2
- /**
3
- * GET /api/v1/slack/config
4
- * Returns the current Slack configuration (tokens masked)
5
- */
6
- export declare function getConfig(c: Context): Promise<(Response & import("hono").TypedResponse<{
7
- success: true;
8
- data: {
9
- enabled: boolean;
10
- channelId: string;
11
- channelName: string;
12
- notifications: {
13
- proposals: {
14
- created: boolean;
15
- statusChange: boolean;
16
- };
17
- jobs: {
18
- completed: boolean;
19
- failed: boolean;
20
- };
21
- git: {
22
- push: boolean;
23
- merge: boolean;
24
- };
25
- };
26
- hasBotToken: boolean;
27
- hasSigningSecret: boolean;
28
- };
29
- }, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
30
- success: false;
31
- error: any;
32
- }, 500, "json">)>;
33
- /**
34
- * PUT /api/v1/slack/config
35
- * Updates Slack configuration
36
- */
37
- export declare function updateConfig(c: Context): Promise<(Response & import("hono").TypedResponse<{
38
- success: true;
39
- data: {
40
- enabled: boolean;
41
- channelId: string;
42
- channelName: string;
43
- notifications: {
44
- proposals: {
45
- created: boolean;
46
- statusChange: boolean;
47
- };
48
- jobs: {
49
- completed: boolean;
50
- failed: boolean;
51
- };
52
- git: {
53
- push: boolean;
54
- merge: boolean;
55
- };
56
- };
57
- hasBotToken: boolean;
58
- hasSigningSecret: boolean;
59
- };
60
- }, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
61
- success: false;
62
- error: any;
63
- }, 500, "json">)>;
64
- /**
65
- * POST /api/v1/slack/test
66
- * Tests the Slack connection using the configured bot token
67
- */
68
- export declare function testConnection(c: Context): Promise<(Response & import("hono").TypedResponse<{
69
- success: true;
70
- message: string;
71
- teamName: string;
72
- }, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
73
- success: false;
74
- error: string;
75
- }, 400, "json">) | (Response & import("hono").TypedResponse<{
76
- success: false;
77
- error: any;
78
- }, 500, "json">)>;
79
- /**
80
- * GET /api/v1/slack/channels
81
- * Lists available Slack channels the bot can post to
82
- */
83
- export declare function listChannels(c: Context): Promise<(Response & import("hono").TypedResponse<{
84
- success: true;
85
- data: {
86
- id: string;
87
- name: string;
88
- isPrivate: boolean;
89
- isMember: boolean;
90
- }[];
91
- }, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
92
- success: false;
93
- error: any;
94
- }, 500, "json">)>;
95
- /**
96
- * POST /api/v1/slack/notify
97
- * Sends a test notification to the configured channel
98
- */
99
- export declare function sendTestNotification(c: Context): Promise<(Response & import("hono").TypedResponse<{
100
- success: true;
101
- message: string;
102
- }, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
103
- success: false;
104
- error: string;
105
- }, 400, "json">) | (Response & import("hono").TypedResponse<{
106
- success: false;
107
- error: any;
108
- }, 500, "json">)>;
109
- /**
110
- * POST /api/v1/slack/notify/example
111
- * Sends an example notification for a specific notification type
112
- */
113
- export declare function sendExampleNotification(c: Context): Promise<(Response & import("hono").TypedResponse<{
114
- success: false;
115
- error: string;
116
- }, 400, "json">) | (Response & import("hono").TypedResponse<{
117
- success: true;
118
- message: string;
119
- }, import("hono/utils/http-status").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
120
- success: false;
121
- error: any;
122
- }, 500, "json">)>;