@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.
- package/dist/lib/auth/auth-manager.d.ts.map +1 -0
- package/dist/lib/auth/auth-manager.js.map +1 -0
- package/dist/lib/gait-path.d.ts.map +1 -0
- package/dist/lib/gait-path.js.map +1 -0
- package/dist/lib/git-settings.d.ts.map +1 -0
- package/dist/lib/git-settings.js.map +1 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/jobs/global-job-scheduler.d.ts.map +1 -0
- package/dist/lib/jobs/global-job-scheduler.js.map +1 -0
- package/dist/lib/jobs/job-runner.d.ts.map +1 -0
- package/dist/lib/jobs/job-runner.js.map +1 -0
- package/dist/lib/jobs/job-scheduler.d.ts.map +1 -0
- package/dist/lib/jobs/job-scheduler.js +0 -17
- package/dist/lib/jobs/job-scheduler.js.map +1 -0
- package/dist/lib/jobs/job-store.d.ts.map +1 -0
- package/dist/lib/jobs/job-store.js.map +1 -0
- package/dist/lib/project-paths.d.ts.map +1 -0
- package/dist/lib/project-paths.js.map +1 -0
- package/dist/lib/storage/file-storage.d.ts.map +1 -0
- package/dist/lib/storage/file-storage.js.map +1 -0
- package/dist/lib/symlinks/symlink-manager.d.ts.map +1 -0
- package/dist/lib/symlinks/symlink-manager.js.map +1 -0
- package/dist/lib/symlinks/types.d.ts.map +1 -0
- package/dist/lib/symlinks/types.js.map +1 -0
- package/dist/lib/terminal/context-helper.d.ts +1 -1
- package/dist/lib/terminal/context-helper.d.ts.map +1 -0
- package/dist/lib/terminal/context-helper.js +4 -16
- package/dist/lib/terminal/context-helper.js.map +1 -0
- package/dist/lib/terminal/global-manager.d.ts.map +1 -0
- package/dist/lib/terminal/global-manager.js.map +1 -0
- package/dist/lib/terminal/shell-utils.d.ts.map +1 -0
- package/dist/lib/terminal/shell-utils.js.map +1 -0
- package/dist/lib/terminal/terminal-manager.d.ts.map +1 -0
- package/dist/lib/terminal/terminal-manager.js.map +1 -0
- package/dist/lib/user-preferences.d.ts.map +1 -0
- package/dist/lib/user-preferences.js.map +1 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/routes/api/v1/agents/[id]/index.d.ts.map +1 -0
- package/dist/routes/api/v1/agents/[id]/index.js.map +1 -0
- package/dist/routes/api/v1/agents/[id]/route.d.ts.map +1 -0
- package/dist/routes/api/v1/agents/[id]/route.js.map +1 -0
- package/dist/routes/api/v1/agents/index.d.ts.map +1 -0
- package/dist/routes/api/v1/agents/index.js.map +1 -0
- package/dist/routes/api/v1/agents/route.d.ts.map +1 -0
- package/dist/routes/api/v1/agents/route.js.map +1 -0
- package/dist/routes/api/v1/ai/index.d.ts.map +1 -0
- package/dist/routes/api/v1/ai/index.js.map +1 -0
- package/dist/routes/api/v1/ai/route.d.ts.map +1 -0
- package/dist/routes/api/v1/ai/route.js +134 -33
- package/dist/routes/api/v1/ai/route.js.map +1 -0
- package/dist/routes/api/v1/ai/tools.js +157 -34
- package/dist/routes/api/v1/api-keys/index.d.ts.map +1 -0
- package/dist/routes/api/v1/api-keys/index.js.map +1 -0
- package/dist/routes/api/v1/api-keys/route.d.ts.map +1 -0
- package/dist/routes/api/v1/api-keys/route.js.map +1 -0
- package/dist/routes/api/v1/auth/index.d.ts.map +1 -0
- package/dist/routes/api/v1/auth/index.js.map +1 -0
- package/dist/routes/api/v1/auth/route.d.ts.map +1 -0
- package/dist/routes/api/v1/auth/route.js.map +1 -0
- package/dist/routes/api/v1/auth-settings/index.d.ts.map +1 -0
- package/dist/routes/api/v1/auth-settings/index.js.map +1 -0
- package/dist/routes/api/v1/auth-settings/route.d.ts.map +1 -0
- package/dist/routes/api/v1/auth-settings/route.js.map +1 -0
- package/dist/routes/api/v1/chats/[id]/index.d.ts.map +1 -0
- package/dist/routes/api/v1/chats/[id]/index.js.map +1 -0
- package/dist/routes/api/v1/chats/[id]/route.d.ts.map +1 -0
- package/dist/routes/api/v1/chats/[id]/route.js.map +1 -0
- package/dist/routes/api/v1/chats/index.d.ts.map +1 -0
- package/dist/routes/api/v1/chats/index.js.map +1 -0
- package/dist/routes/api/v1/chats/route.d.ts.map +1 -0
- package/dist/routes/api/v1/chats/route.js.map +1 -0
- package/dist/routes/api/v1/config/index.d.ts.map +1 -0
- package/dist/routes/api/v1/config/index.js.map +1 -0
- package/dist/routes/api/v1/config/route.d.ts.map +1 -0
- package/dist/routes/api/v1/config/route.js.map +1 -0
- package/dist/routes/api/v1/context/architecture/route.d.ts.map +1 -0
- package/dist/routes/api/v1/context/architecture/route.js.map +1 -0
- package/dist/routes/api/v1/context/index.d.ts.map +1 -0
- package/dist/routes/api/v1/context/index.js +2 -0
- package/dist/routes/api/v1/context/index.js.map +1 -0
- package/dist/routes/api/v1/context/knowledge/[filename]/index.d.ts.map +1 -0
- package/dist/routes/api/v1/context/knowledge/[filename]/index.js.map +1 -0
- package/dist/routes/api/v1/context/knowledge/[filename]/route.d.ts.map +1 -0
- package/dist/routes/api/v1/context/knowledge/[filename]/route.js.map +1 -0
- package/dist/routes/api/v1/context/knowledge/index.d.ts.map +1 -0
- package/dist/routes/api/v1/context/knowledge/index.js.map +1 -0
- package/dist/routes/api/v1/context/knowledge/route.d.ts.map +1 -0
- package/dist/routes/api/v1/context/knowledge/route.js.map +1 -0
- package/dist/routes/api/v1/context/project/route.d.ts.map +1 -0
- package/dist/routes/api/v1/context/project/route.js.map +1 -0
- package/dist/routes/api/v1/context/role/route.d.ts +3 -0
- package/dist/routes/api/v1/context/role/route.js +198 -0
- package/dist/routes/api/v1/events/status/route.d.ts +1 -1
- package/dist/routes/api/v1/git/index.d.ts.map +1 -0
- package/dist/routes/api/v1/git/index.js +0 -17
- package/dist/routes/api/v1/git/index.js.map +1 -0
- package/dist/routes/api/v1/jobs/[id]/route.d.ts.map +1 -0
- package/dist/routes/api/v1/jobs/[id]/route.js.map +1 -0
- package/dist/routes/api/v1/jobs/[id]/run/route.d.ts +2 -2
- package/dist/routes/api/v1/jobs/[id]/run/route.d.ts.map +1 -0
- package/dist/routes/api/v1/jobs/[id]/run/route.js.map +1 -0
- package/dist/routes/api/v1/jobs/[id]/runs/[runId]/route.d.ts +2 -2
- package/dist/routes/api/v1/jobs/index.d.ts.map +1 -0
- package/dist/routes/api/v1/jobs/index.js.map +1 -0
- package/dist/routes/api/v1/jobs/route.d.ts.map +1 -0
- package/dist/routes/api/v1/jobs/route.js.map +1 -0
- package/dist/routes/api/v1/jobs/status/route.d.ts +1 -1
- package/dist/routes/api/v1/jobs/status/route.d.ts.map +1 -0
- package/dist/routes/api/v1/jobs/status/route.js.map +1 -0
- package/dist/routes/api/v1/mcp/index.d.ts.map +1 -0
- package/dist/routes/api/v1/mcp/index.js +116 -3
- package/dist/routes/api/v1/mcp/index.js.map +1 -0
- package/dist/routes/api/v1/mcp/route.d.ts.map +1 -0
- package/dist/routes/api/v1/mcp/route.js.map +1 -0
- package/dist/routes/api/v1/proposals/[id]/route.d.ts +8 -8
- package/dist/routes/api/v1/proposals/[id]/route.d.ts.map +1 -0
- package/dist/routes/api/v1/proposals/[id]/route.js +0 -9
- package/dist/routes/api/v1/proposals/[id]/route.js.map +1 -0
- package/dist/routes/api/v1/proposals/index.d.ts.map +1 -0
- package/dist/routes/api/v1/proposals/index.js.map +1 -0
- package/dist/routes/api/v1/proposals/route.d.ts.map +1 -0
- package/dist/routes/api/v1/proposals/route.js +0 -8
- package/dist/routes/api/v1/proposals/route.js.map +1 -0
- package/dist/routes/api/v1/resources/[id]/index.d.ts.map +1 -0
- package/dist/routes/api/v1/resources/[id]/index.js.map +1 -0
- package/dist/routes/api/v1/resources/[id]/route.js.map +1 -0
- package/dist/routes/api/v1/resources/[id]/thumbnail/index.d.ts.map +1 -0
- package/dist/routes/api/v1/resources/[id]/thumbnail/index.js.map +1 -0
- package/dist/routes/api/v1/resources/[id]/thumbnail/route.js.map +1 -0
- package/dist/routes/api/v1/resources/index.d.ts.map +1 -0
- package/dist/routes/api/v1/resources/index.js.map +1 -0
- package/dist/routes/api/v1/resources/route.d.ts.map +1 -0
- package/dist/routes/api/v1/resources/route.js.map +1 -0
- package/dist/routes/api/v1/symlinks/index.d.ts.map +1 -0
- package/dist/routes/api/v1/symlinks/index.js.map +1 -0
- package/dist/routes/api/v1/symlinks/route.d.ts.map +1 -0
- package/dist/routes/api/v1/symlinks/route.js.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/create/index.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/create/index.js.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/create/route.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/create/route.js.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/destroy/index.js.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/destroy/route.js.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/resize/index.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/resize/index.js.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/resize/route.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/[proposalId]/resize/route.js.map +1 -0
- package/dist/routes/api/v1/terminal/sessions/index.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/sessions/index.js.map +1 -0
- package/dist/routes/api/v1/terminal/sessions/route.d.ts.map +1 -0
- package/dist/routes/api/v1/terminal/sessions/route.js.map +1 -0
- package/dist/routes/api/v1/user/index.d.ts.map +1 -0
- package/dist/routes/api/v1/user/index.js.map +1 -0
- package/dist/routes/api/v1/user/settings/index.d.ts.map +1 -0
- package/dist/routes/api/v1/user/settings/index.js.map +1 -0
- package/dist/routes/api/v1/user/settings/route.d.ts.map +1 -0
- package/dist/routes/api/v1/user/settings/route.js.map +1 -0
- package/dist/server-with-static.d.ts.map +1 -0
- package/dist/server-with-static.js +0 -2
- package/dist/server-with-static.js.map +1 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +0 -2
- package/dist/server.js.map +1 -0
- package/package.json +4 -5
- package/static/assets/ActivityPage-C_HqpJt2.js +1 -0
- package/static/assets/{AgentDetailPage-CS4l_2nY.js → AgentDetailPage-WLAnnZep.js} +1 -1
- package/static/assets/AgentEditPage-DOemUkvg.js +1 -0
- package/static/assets/AgentsPage-Bage8eYW.js +3 -0
- package/static/assets/AgentsSettingsPage-Cw2MTnHU.js +6 -0
- package/static/assets/{ApiKeysSettingsPage-BmGRl-Cr.js → ApiKeysSettingsPage-DCKd4LXE.js} +3 -3
- package/static/assets/{ArchitectureEditPage-CyAu4lkT.js → ArchitectureEditPage-WY9k_1tR.js} +1 -1
- package/static/assets/ArchitecturePage-Cj4dVDWO.js +1 -0
- package/static/assets/{AuthSettingsPage-BfxPusvb.js → AuthSettingsPage-Bs5wL5Yj.js} +2 -2
- package/static/assets/{CallbackPage-C7QN2xcl.js → CallbackPage-CtydJ4j3.js} +1 -1
- package/static/assets/CodePage-BiRf5q_q.js +2 -0
- package/static/assets/{CollapsibleSection-DpcF5jIr.js → CollapsibleSection-5qSoX47l.js} +1 -1
- package/static/assets/DashboardPage-e9hNRsi2.js +41 -0
- package/static/assets/{GitPage-DVCWmjb1.js → GitPage-BG-ZSGfu.js} +3 -3
- package/static/assets/{GitSettingsPage-CA-NVPgC.js → GitSettingsPage-Cn-MciXq.js} +2 -2
- package/static/assets/{IdentityPage-yBi2meP8.js → IdentityPage-DCpoDF2j.js} +3 -3
- package/static/assets/{ImplementationStepsEditor-CdFjqsQp.js → ImplementationStepsEditor-PM47REBn.js} +2 -2
- package/static/assets/IntegrationsSettingsPage-DJpf2gZn.js +1 -0
- package/static/assets/JobDetailPage-9shaUPlO.js +1 -0
- package/static/assets/KnowledgeDetailPage-CLizVIxC.js +1 -0
- package/static/assets/{KnowledgeEditPage-DqTY1Y3C.js → KnowledgeEditPage-B-sdY_DS.js} +1 -1
- package/static/assets/{KnowledgePage-DonVTg_6.js → KnowledgePage-DIlUufGq.js} +2 -2
- package/static/assets/{LoginPage-DFpCcG6v.js → LoginPage-DcTU__Dc.js} +1 -1
- package/static/assets/McpSettingsPage-BPDLne4q.js +1 -0
- package/static/assets/NewAgentPage-8-abvhkI.js +1 -0
- package/static/assets/{NewKnowledgePage-D93ERPBo.js → NewKnowledgePage-Rvj741x1.js} +2 -2
- package/static/assets/NewProposalPage-BLIqmuks.js +90 -0
- package/static/assets/{ProjectEditPage-kXy3gxS3.js → ProjectEditPage-DC5-v_2a.js} +1 -1
- package/static/assets/ProjectPage-_L4wqwrB.js +1 -0
- package/static/assets/{PromptsSettingsPage-BNQrbBn5.js → PromptsSettingsPage-K-qqpF2S.js} +1 -1
- package/static/assets/ProposalDetailPage-BVXTjXw2.js +1 -0
- package/static/assets/ProposalEditPage-Bs3ak0PG.js +1 -0
- package/static/assets/{ProposalsPage-CysWDXyl.js → ProposalsPage-BvKlKvuo.js} +2 -2
- package/static/assets/{ResourcesPage-QD68AoOk.js → ResourcesPage-BSyX_kHV.js} +5 -5
- package/static/assets/RoleEditPage-CnWierul.js +13 -0
- package/static/assets/RolePage-D8xB0I-F.js +1 -0
- package/static/assets/{RulesSettingsPage-DQvhq7o0.js → RulesSettingsPage-CZBQ0u-x.js} +1 -1
- package/static/assets/SchedulePage-HBFJT_19.js +4 -0
- package/static/assets/SourceInput-BoRGYtye.js +1 -0
- package/static/assets/{TagInput-C1XF1z9l.js → TagInput-CdXzv6hj.js} +1 -1
- package/static/assets/TerminalPage-CqPXFOIN.js +1 -0
- package/static/assets/{TerminalSessionPage-BkuO3Dlc.js → TerminalSessionPage-DR2cApWv.js} +8 -3
- package/static/assets/UserPreferencesPage-CPkulDiM.js +1 -0
- package/static/assets/{UserSettingsPage-Czyu--ZE.js → UserSettingsPage-BuMnU394.js} +1 -1
- package/static/assets/{UtilitiesPage-BL3r6jt4.js → UtilitiesPage-BGiBB5PT.js} +1 -1
- package/static/assets/{alert-yDv7BoVY.js → alert-CHpdnk6F.js} +1 -1
- package/static/assets/{arrow-down-B6mDQzhv.js → arrow-down-BjGtxyJ7.js} +1 -1
- package/static/assets/{arrow-left-oYBMYRNP.js → arrow-left-DR0foZvi.js} +1 -1
- package/static/assets/{arrow-up-BtNT59gW.js → arrow-up-DCGMV1HG.js} +1 -1
- package/static/assets/{badge-A8sRXZ1m.js → badge-Cds9UgAB.js} +1 -1
- package/static/assets/{browser-modal-DcxLC6CX.js → browser-modal-Ck4-s_jh.js} +2 -2
- package/static/assets/{calendar-C6_Zaz3s.js → calendar-CWhxfYG2.js} +1 -1
- package/static/assets/{card-Brl-P7qu.js → card-BdOrf6VU.js} +1 -1
- package/static/assets/{chevron-left-BsJmB9OE.js → chevron-left-Wnwkk8g7.js} +1 -1
- package/static/assets/chevrons-up-DbnuGl5g.js +11 -0
- package/static/assets/{circle-alert-BYXOF-Yd.js → circle-alert-BPvQggmh.js} +1 -1
- package/static/assets/{circle-check-BISWYf84.js → circle-check-CTlDV9K4.js} +1 -1
- package/static/assets/{circle-check-big-GdURlCCT.js → circle-check-big-KMhw8TDM.js} +1 -1
- package/static/assets/{circle-play-D14kkelg.js → circle-play-tZLgOcAc.js} +1 -1
- package/static/assets/{circle-x-CWvfwx75.js → circle-x-D3tazxxl.js} +1 -1
- package/static/assets/{clipboard-CQ1MeyX5.js → clipboard-C86rsVqL.js} +1 -1
- package/static/assets/{clock-C7sCX_DE.js → clock-Qm5u6CAm.js} +1 -1
- package/static/assets/{download-BjE8JxlU.js → download-Bo3vdlNo.js} +1 -1
- package/static/assets/droid-Caom7ttu.js +4 -0
- package/static/assets/{eye-2hl27c7R.js → eye-Cr9Hfzxo.js} +1 -1
- package/static/assets/{folder-git-2-BBlVIDmr.js → folder-git-2-Em4ZglGs.js} +1 -1
- package/static/assets/index-BhlZ_D1Y.css +2 -0
- package/static/assets/index-CQpPrvm_.js +468 -0
- package/static/assets/{label-DA737D6X.js → label-nG86oxuW.js} +1 -1
- package/static/assets/{markdown-editor-BhYm394v.js → markdown-editor-CEQMlLWe.js} +1 -1
- package/static/assets/{pause-DS_ZgX9w.js → pause-DuR7ql7H.js} +1 -1
- package/static/assets/{play-Cgu7MRJC.js → play-p4m8WHP3.js} +1 -1
- package/static/assets/{plus-RZwwEJRO.js → plus-CD075YlZ.js} +1 -1
- package/static/assets/{radio-group-CzZoufFM.js → radio-group-DCKkxIgI.js} +1 -1
- package/static/assets/{refresh-cw-BJ2GIM1Z.js → refresh-cw-D-IgYQ7y.js} +1 -1
- package/static/assets/{search-B2ODQzPd.js → search-W3H-E0eW.js} +1 -1
- package/static/assets/{switch-AdqXRjK1.js → switch-E0GrYmgh.js} +1 -1
- package/static/assets/{tabs-DnIPixK3.js → tabs-DjZiD9WD.js} +1 -1
- package/static/assets/{tag-C4UgL0Z_.js → tag-D0iVh1-U.js} +1 -1
- package/static/assets/terminal-preview-BQBOEop2.js +1 -0
- package/static/assets/{use-terminal-qsHkIOJb.js → use-terminal-0TezQnxO.js} +1 -1
- package/static/assets/{zap-CpNZOBUL.js → zap-C_5I7lLi.js} +1 -1
- package/static/index.html +2 -2
- package/dist/lib/mcp-client.d.ts +0 -39
- package/dist/lib/mcp-client.js +0 -131
- package/dist/lib/slack/slack-service.d.ts +0 -89
- package/dist/lib/slack/slack-service.js +0 -504
- package/dist/routes/api/v1/slack/index.d.ts +0 -3
- package/dist/routes/api/v1/slack/index.js +0 -15
- package/dist/routes/api/v1/slack/route.d.ts +0 -122
- package/dist/routes/api/v1/slack/route.js +0 -189
- package/static/assets/AgentEditPage-mvchfGaI.js +0 -1
- package/static/assets/AgentsPage-D4JsS7kC.js +0 -3
- package/static/assets/AgentsSettingsPage-CPZm3ECa.js +0 -6
- package/static/assets/ArchitecturePage-BEVC5igc.js +0 -1
- package/static/assets/CodePage-DoP5IiuI.js +0 -2
- package/static/assets/DashboardPage-D0EoXiL2.js +0 -11
- package/static/assets/IntegrationsSettingsPage-4NWwhHlm.js +0 -1
- package/static/assets/KnowledgeDetailPage-mBBrz-_N.js +0 -1
- package/static/assets/McpSettingsPage-jXN9kO3i.js +0 -1
- package/static/assets/NewAgentPage-BNojru16.js +0 -1
- package/static/assets/NewProposalPage-BBmHfu-z.js +0 -90
- package/static/assets/NotificationsSettingsPage-D6oOIvep.js +0 -1
- package/static/assets/ProjectPage-D3vvfNxI.js +0 -1
- package/static/assets/ProposalDetailPage-CMgZUcxP.js +0 -1
- package/static/assets/ProposalEditPage-Bn_1OJ11.js +0 -1
- package/static/assets/SchedulePage-CghrKKJB.js +0 -4
- package/static/assets/SourceInput-BU8xQMbc.js +0 -1
- package/static/assets/TerminalPage-BfNa9oLV.js +0 -1
- package/static/assets/UserPreferencesPage-DWsDPJWa.js +0 -1
- package/static/assets/droid-C6RWH9f4.js +0 -4
- package/static/assets/index-BJVvhEWY.css +0 -2
- package/static/assets/index-D_2ZhRwL.js +0 -463
- package/static/assets/message-square-DV1_7h3v.js +0 -6
- 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,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">)>;
|