@interactive-inc/claude-funnel 0.7.1 → 0.8.0

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 (349) hide show
  1. package/README.md +155 -133
  2. package/dist/bin.js +1417 -0
  3. package/dist/gateway/daemon.js +513 -0
  4. package/dist/highlights-eq9cgrbb.scm +604 -0
  5. package/dist/highlights-ghv9g403.scm +205 -0
  6. package/dist/highlights-hk7bwhj4.scm +284 -0
  7. package/dist/highlights-r812a2qc.scm +150 -0
  8. package/dist/highlights-x6tmsnaa.scm +115 -0
  9. package/dist/injections-73j83es3.scm +27 -0
  10. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  11. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  12. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  13. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  14. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  15. package/lib/bin.ts +78 -0
  16. package/lib/{modules → cli}/router/to-request.ts +13 -20
  17. package/lib/cli/routes/channels.$channel.connectors.$connector.rename.$newName.ts +27 -0
  18. package/lib/cli/routes/channels.$channel.connectors.$connector.request.ts +40 -0
  19. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.add.$id.ts +41 -0
  20. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.remove.$id.ts +22 -0
  21. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.ts +23 -0
  22. package/lib/cli/routes/channels.$channel.connectors.$connector.ts +26 -0
  23. package/lib/cli/routes/channels.$channel.connectors.add.$connector.ts +92 -0
  24. package/lib/cli/routes/channels.$channel.connectors.remove.$connector.ts +22 -0
  25. package/lib/cli/routes/channels.$channel.connectors.set.$connector.ts +63 -0
  26. package/lib/cli/routes/channels.$channel.connectors.ts +26 -0
  27. package/lib/cli/routes/channels.$channel.rename.$newName.ts +22 -0
  28. package/lib/cli/routes/channels.$channel.set.delivery.$mode.ts +34 -0
  29. package/lib/cli/routes/channels.$channel.ts +34 -0
  30. package/lib/cli/routes/channels.add.$channel.ts +33 -0
  31. package/lib/cli/routes/channels.remove.$channel.ts +20 -0
  32. package/lib/cli/routes/channels.ts +39 -0
  33. package/lib/cli/routes/claude.ts +69 -0
  34. package/lib/cli/routes/gateway.listeners.ts +41 -0
  35. package/lib/cli/routes/gateway.logs.ts +123 -0
  36. package/lib/{routes/gateway/restart.ts → cli/routes/gateway.restart.ts} +20 -5
  37. package/lib/cli/routes/gateway.run.ts +41 -0
  38. package/lib/cli/routes/gateway.start.ts +50 -0
  39. package/lib/cli/routes/gateway.status.ts +19 -0
  40. package/lib/cli/routes/gateway.stop.ts +32 -0
  41. package/lib/cli/routes/gateway.ts +55 -0
  42. package/lib/cli/routes/index.ts +202 -0
  43. package/lib/cli/routes/profiles.$profile.as-default.ts +22 -0
  44. package/lib/cli/routes/profiles.$profile.rename.$newName.ts +22 -0
  45. package/lib/cli/routes/profiles.$profile.run.ts +36 -0
  46. package/lib/cli/routes/profiles.add.$profile.ts +46 -0
  47. package/lib/cli/routes/profiles.remove.$profile.ts +20 -0
  48. package/lib/cli/routes/profiles.set.$profile.ts +46 -0
  49. package/lib/cli/routes/profiles.ts +40 -0
  50. package/lib/cli/routes/status.ts +93 -0
  51. package/lib/cli/routes/update.ts +27 -0
  52. package/lib/connectors/connector-config-schema.ts +16 -0
  53. package/lib/connectors/connector-factory.ts +94 -0
  54. package/lib/connectors/connector-listener.ts +20 -0
  55. package/lib/{modules/connectors/funnel-discord-adapter.ts → connectors/discord-adapter.ts} +6 -11
  56. package/lib/{modules/connectors → connectors}/discord-connector-schema.ts +4 -1
  57. package/lib/connectors/discord-listener.ts +111 -0
  58. package/lib/{modules/connectors/funnel-gh-adapter.ts → connectors/gh-adapter.ts} +3 -6
  59. package/lib/{modules/connectors → connectors}/gh-connector-schema.ts +4 -1
  60. package/lib/{modules/connectors/funnel-gh-listener.ts → connectors/gh-listener.ts} +45 -19
  61. package/lib/{modules/connectors → connectors}/match-cron.ts +10 -4
  62. package/lib/connectors/schedule-connector-schema.ts +33 -0
  63. package/lib/connectors/schedule-listener.ts +207 -0
  64. package/lib/connectors/schedule-state-store.ts +54 -0
  65. package/lib/connectors/slack-adapter.ts +36 -0
  66. package/lib/{modules/connectors → connectors}/slack-connector-schema.ts +4 -1
  67. package/lib/{modules/connectors/funnel-slack-event-processor.ts → connectors/slack-event-processor.ts} +15 -9
  68. package/lib/{modules/connectors/funnel-slack-listener.ts → connectors/slack-listener.ts} +33 -14
  69. package/lib/engine/channels/channels.ts +520 -0
  70. package/lib/{modules/claude/funnel-claude.ts → engine/claude/claude.ts} +28 -55
  71. package/lib/engine/claude/gateway-controller.ts +4 -0
  72. package/lib/{modules/fs/funnel-file-system.ts → engine/fs/file-system.ts} +4 -0
  73. package/lib/{modules/fs/memory-funnel-file-system.ts → engine/fs/memory-file-system.ts} +20 -3
  74. package/lib/{modules/fs/node-funnel-file-system.ts → engine/fs/node-file-system.ts} +14 -2
  75. package/lib/{modules/http/memory-funnel-http-client.ts → engine/http/memory-http-client.ts} +1 -5
  76. package/lib/{modules/http/node-funnel-http-client.ts → engine/http/node-http-client.ts} +1 -5
  77. package/lib/{modules/id/memory-funnel-id-generator.ts → engine/id/memory-id-generator.ts} +1 -1
  78. package/lib/{modules/id/node-funnel-id-generator.ts → engine/id/node-id-generator.ts} +1 -1
  79. package/lib/{modules/logger/memory-funnel-logger.ts → engine/logger/memory-logger.ts} +1 -1
  80. package/lib/{modules/logger/node-funnel-logger.ts → engine/logger/node-logger.ts} +1 -1
  81. package/lib/{modules/logger/noop-funnel-logger.ts → engine/logger/noop-logger.ts} +1 -1
  82. package/lib/engine/mcp/channel-server.ts +204 -0
  83. package/lib/{modules/mcp/funnel-mcp.ts → engine/mcp/mcp.ts} +24 -10
  84. package/lib/{modules/process/memory-funnel-process-runner.ts → engine/process/memory-process-runner.ts} +1 -1
  85. package/lib/{modules/process/node-funnel-process-runner.ts → engine/process/node-process-runner.ts} +12 -21
  86. package/lib/engine/profiles/profile-channel-checker.ts +7 -0
  87. package/lib/{modules/profiles/funnel-profiles.ts → engine/profiles/profiles.ts} +41 -43
  88. package/lib/{modules/settings/mock-funnel-settings-reader.ts → engine/settings/mock-settings-reader.ts} +4 -3
  89. package/lib/{modules/settings/funnel-settings-reader.ts → engine/settings/settings-reader.ts} +1 -1
  90. package/lib/engine/settings/settings-schema.ts +46 -0
  91. package/lib/engine/settings/settings-store.ts +110 -0
  92. package/lib/{modules/time/memory-funnel-clock.ts → engine/time/memory-clock.ts} +1 -1
  93. package/lib/{modules/time/node-funnel-clock.ts → engine/time/node-clock.ts} +1 -1
  94. package/lib/funnel.ts +83 -78
  95. package/lib/gateway/auth-middleware.ts +44 -0
  96. package/lib/gateway/broadcaster.ts +319 -0
  97. package/lib/gateway/daemon.ts +47 -0
  98. package/lib/gateway/factory.ts +10 -0
  99. package/lib/gateway/funnel-event-store.ts +155 -0
  100. package/lib/gateway/gateway-server.ts +414 -0
  101. package/lib/gateway/gateway-token.ts +79 -0
  102. package/lib/{modules/gateway/funnel-gateway.ts → gateway/gateway.ts} +27 -13
  103. package/lib/{modules/gateway → gateway}/kill-competing-slack-gateways.ts +4 -4
  104. package/lib/gateway/listener-supervisor.ts +339 -0
  105. package/lib/gateway/listeners-client.ts +128 -0
  106. package/lib/gateway/resolve-daemon-script.ts +26 -0
  107. package/lib/gateway/routes/channels.connectors.call.ts +39 -0
  108. package/lib/gateway/routes/health.ts +13 -0
  109. package/lib/gateway/routes/index.ts +24 -0
  110. package/lib/gateway/routes/listeners.list.ts +6 -0
  111. package/lib/gateway/routes/listeners.restart.ts +15 -0
  112. package/lib/gateway/routes/listeners.start.ts +15 -0
  113. package/lib/gateway/routes/listeners.stop.ts +15 -0
  114. package/lib/gateway/routes/route-deps.ts +11 -0
  115. package/lib/gateway/routes/status.ts +15 -0
  116. package/lib/gateway/routes/validator.ts +17 -0
  117. package/lib/index.ts +50 -92
  118. package/lib/logger/leuco-human-file-writer.ts +65 -0
  119. package/lib/logger/leuco-human-logger.ts +98 -0
  120. package/lib/logger/leuco-human-record.ts +16 -0
  121. package/lib/logger/leuco-human-stdout-writer.ts +26 -0
  122. package/lib/logger/leuco-human-writer.ts +14 -0
  123. package/lib/logger/leuco-logger-memory-sink.ts +67 -0
  124. package/lib/logger/leuco-logger-record.ts +13 -0
  125. package/lib/logger/leuco-logger-sink.ts +33 -0
  126. package/lib/logger/leuco-logger-sqlite-sink.ts +355 -0
  127. package/lib/logger/leuco-logger.ts +135 -0
  128. package/lib/tui/app.tsx +357 -0
  129. package/lib/tui/components/add-row.tsx +18 -0
  130. package/lib/tui/components/brand.tsx +27 -0
  131. package/lib/tui/components/card.tsx +44 -0
  132. package/lib/tui/components/detail-bar.tsx +46 -0
  133. package/lib/tui/components/editable-field.tsx +33 -0
  134. package/lib/tui/components/empty-state.tsx +11 -0
  135. package/lib/tui/components/gateway-status.tsx +66 -0
  136. package/lib/tui/components/keymap.tsx +29 -0
  137. package/lib/tui/components/menu-item.tsx +73 -0
  138. package/lib/tui/components/menu.tsx +26 -0
  139. package/lib/tui/components/panel-header.tsx +22 -0
  140. package/lib/tui/components/readonly-field.tsx +18 -0
  141. package/lib/tui/components/section-header.tsx +25 -0
  142. package/lib/tui/components/selection-accent.tsx +32 -0
  143. package/lib/tui/components/session-item.tsx +33 -0
  144. package/lib/tui/components/session-list.tsx +33 -0
  145. package/lib/tui/components/ui/hascii/accordion-item.tsx +88 -0
  146. package/lib/tui/components/ui/hascii/accordion.tsx +96 -0
  147. package/lib/tui/components/ui/hascii/alert-dialog.tsx +43 -0
  148. package/lib/tui/components/ui/hascii/badge.tsx +51 -0
  149. package/lib/tui/components/ui/hascii/breadcrumb.tsx +58 -0
  150. package/lib/tui/components/ui/hascii/button.tsx +194 -0
  151. package/lib/tui/components/ui/hascii/card-content.tsx +14 -0
  152. package/lib/tui/components/ui/hascii/card-description.tsx +13 -0
  153. package/lib/tui/components/ui/hascii/card-footer.tsx +14 -0
  154. package/lib/tui/components/ui/hascii/card-header.tsx +14 -0
  155. package/lib/tui/components/ui/hascii/card-title.tsx +13 -0
  156. package/lib/tui/components/ui/hascii/card.tsx +27 -0
  157. package/lib/tui/components/ui/hascii/checkbox.tsx +65 -0
  158. package/lib/tui/components/ui/hascii/command.tsx +159 -0
  159. package/lib/tui/components/ui/hascii/dialog-content.tsx +14 -0
  160. package/lib/tui/components/ui/hascii/dialog-description.tsx +13 -0
  161. package/lib/tui/components/ui/hascii/dialog-footer.tsx +14 -0
  162. package/lib/tui/components/ui/hascii/dialog-header.tsx +14 -0
  163. package/lib/tui/components/ui/hascii/dialog-title.tsx +13 -0
  164. package/lib/tui/components/ui/hascii/dialog.tsx +27 -0
  165. package/lib/tui/components/ui/hascii/file-tree.tsx +142 -0
  166. package/lib/tui/components/ui/hascii/focus-group.tsx +62 -0
  167. package/lib/tui/components/ui/hascii/form-item.tsx +43 -0
  168. package/lib/tui/components/ui/hascii/input-otp.tsx +86 -0
  169. package/lib/tui/components/ui/hascii/input.tsx +130 -0
  170. package/lib/tui/components/ui/hascii/pagination.tsx +105 -0
  171. package/lib/tui/components/ui/hascii/progress.tsx +28 -0
  172. package/lib/tui/components/ui/hascii/select.tsx +131 -0
  173. package/lib/tui/components/ui/hascii/separator.tsx +35 -0
  174. package/lib/tui/components/ui/hascii/sidebar-content.tsx +23 -0
  175. package/lib/tui/components/ui/hascii/sidebar-header.tsx +14 -0
  176. package/lib/tui/components/ui/hascii/sidebar-menu-item.tsx +67 -0
  177. package/lib/tui/components/ui/hascii/sidebar.tsx +24 -0
  178. package/lib/tui/components/ui/hascii/skeleton.tsx +60 -0
  179. package/lib/tui/components/ui/hascii/slider.tsx +91 -0
  180. package/lib/tui/components/ui/hascii/snackbar.tsx +75 -0
  181. package/lib/tui/components/ui/hascii/sparkline.tsx +53 -0
  182. package/lib/tui/components/ui/hascii/spinner.tsx +47 -0
  183. package/lib/tui/components/ui/hascii/stepper.tsx +54 -0
  184. package/lib/tui/components/ui/hascii/switch.tsx +66 -0
  185. package/lib/tui/components/ui/hascii/table.tsx +95 -0
  186. package/lib/tui/components/ui/hascii/tabs.tsx +59 -0
  187. package/lib/tui/components/ui/hascii/toggle-group-item.tsx +45 -0
  188. package/lib/tui/components/ui/hascii/toggle-group.tsx +99 -0
  189. package/lib/tui/components/ui/hascii/tree.tsx +104 -0
  190. package/lib/tui/components/view-shell.tsx +44 -0
  191. package/lib/tui/filter-input.tsx +33 -0
  192. package/lib/tui/hooks/hascii/use-pressable.ts +54 -0
  193. package/lib/tui/parse-comma-list.ts +14 -0
  194. package/lib/tui/profile-launcher.tsx +61 -0
  195. package/lib/tui/scrollbar-options.ts +19 -0
  196. package/lib/tui/sidebar.tsx +50 -0
  197. package/lib/tui/theme.ts +40 -0
  198. package/lib/tui/tui.tsx +20 -0
  199. package/lib/tui/types.ts +38 -0
  200. package/lib/tui/unique-name.ts +18 -0
  201. package/lib/tui/use-event-stream.ts +133 -0
  202. package/lib/tui/use-snapshot.ts +99 -0
  203. package/lib/tui/utils/hascii/form-item-context.tsx +23 -0
  204. package/lib/tui/utils/hascii/input-focus-context.tsx +31 -0
  205. package/lib/tui/utils/hascii/theme-context.tsx +26 -0
  206. package/lib/tui/utils/hascii/theme.ts +176 -0
  207. package/lib/tui/views/channels-view.tsx +108 -0
  208. package/lib/tui/views/connectors-view.tsx +164 -0
  209. package/lib/tui/views/events-view.tsx +160 -0
  210. package/lib/tui/views/listeners-view.tsx +80 -0
  211. package/lib/tui/views/profiles-view.tsx +152 -0
  212. package/package.json +50 -44
  213. package/lib/api.ts +0 -54
  214. package/lib/modules/channels/channel-connector-ref-updater.ts +0 -4
  215. package/lib/modules/channels/funnel-channels.ts +0 -160
  216. package/lib/modules/connectors/connector-config-schema.ts +0 -16
  217. package/lib/modules/connectors/connector-existence-checker.ts +0 -3
  218. package/lib/modules/connectors/funnel-callable-connector-store.ts +0 -9
  219. package/lib/modules/connectors/funnel-connector-listener.ts +0 -5
  220. package/lib/modules/connectors/funnel-connector-stores.ts +0 -52
  221. package/lib/modules/connectors/funnel-connector-type-store.ts +0 -24
  222. package/lib/modules/connectors/funnel-connectors.ts +0 -151
  223. package/lib/modules/connectors/funnel-discord-listener.ts +0 -71
  224. package/lib/modules/connectors/funnel-discord-store.ts +0 -88
  225. package/lib/modules/connectors/funnel-gh-store.ts +0 -101
  226. package/lib/modules/connectors/funnel-json-connector-store.ts +0 -100
  227. package/lib/modules/connectors/funnel-schedule-listener.ts +0 -130
  228. package/lib/modules/connectors/funnel-schedule-store.ts +0 -195
  229. package/lib/modules/connectors/funnel-slack-adapter.ts +0 -31
  230. package/lib/modules/connectors/funnel-slack-store.ts +0 -90
  231. package/lib/modules/connectors/migrate-legacy-connectors.ts +0 -81
  232. package/lib/modules/connectors/schedule-connector-schema.ts +0 -18
  233. package/lib/modules/connectors/schedule-last-fired-store.ts +0 -48
  234. package/lib/modules/gateway/daemon.ts +0 -74
  235. package/lib/modules/gateway/funnel-broadcaster.ts +0 -37
  236. package/lib/modules/gateway/funnel-event-logger.ts +0 -59
  237. package/lib/modules/gateway/funnel-gateway-server.ts +0 -241
  238. package/lib/modules/mcp/channel-server.ts +0 -76
  239. package/lib/modules/profiles/profile-channel-checker.ts +0 -3
  240. package/lib/modules/profiles/profile-channel-ref-updater.ts +0 -3
  241. package/lib/modules/repos/funnel-repositories.ts +0 -112
  242. package/lib/modules/schedule/funnel-schedule.ts +0 -39
  243. package/lib/modules/settings/funnel-settings-store.ts +0 -56
  244. package/lib/modules/settings/settings-schema.ts +0 -33
  245. package/lib/modules/tui/app.tsx +0 -44
  246. package/lib/modules/tui/tui.tsx +0 -13
  247. package/lib/routes/channels/add.help.ts +0 -3
  248. package/lib/routes/channels/add.ts +0 -21
  249. package/lib/routes/channels/connectors-attach.help.ts +0 -3
  250. package/lib/routes/channels/connectors-attach.ts +0 -17
  251. package/lib/routes/channels/connectors-detach.help.ts +0 -3
  252. package/lib/routes/channels/connectors-detach.ts +0 -17
  253. package/lib/routes/channels/group.help.ts +0 -16
  254. package/lib/routes/channels/group.ts +0 -22
  255. package/lib/routes/channels/remove.help.ts +0 -3
  256. package/lib/routes/channels/remove.ts +0 -17
  257. package/lib/routes/channels/rename.help.ts +0 -5
  258. package/lib/routes/channels/rename.ts +0 -17
  259. package/lib/routes/channels/routes.ts +0 -19
  260. package/lib/routes/channels/show.help.ts +0 -1
  261. package/lib/routes/channels/show.ts +0 -26
  262. package/lib/routes/claude/claude.help.ts +0 -16
  263. package/lib/routes/claude/claude.ts +0 -76
  264. package/lib/routes/claude/routes.ts +0 -4
  265. package/lib/routes/connectors/add.help.ts +0 -28
  266. package/lib/routes/connectors/add.ts +0 -64
  267. package/lib/routes/connectors/group.help.ts +0 -14
  268. package/lib/routes/connectors/group.ts +0 -18
  269. package/lib/routes/connectors/remove.help.ts +0 -3
  270. package/lib/routes/connectors/remove.ts +0 -17
  271. package/lib/routes/connectors/rename.help.ts +0 -5
  272. package/lib/routes/connectors/rename.ts +0 -17
  273. package/lib/routes/connectors/routes.ts +0 -23
  274. package/lib/routes/connectors/schedules-add.help.ts +0 -11
  275. package/lib/routes/connectors/schedules-add.ts +0 -33
  276. package/lib/routes/connectors/schedules-group.help.ts +0 -1
  277. package/lib/routes/connectors/schedules-group.ts +0 -38
  278. package/lib/routes/connectors/schedules-remove.help.ts +0 -3
  279. package/lib/routes/connectors/schedules-remove.ts +0 -17
  280. package/lib/routes/connectors/set.help.ts +0 -8
  281. package/lib/routes/connectors/set.ts +0 -72
  282. package/lib/routes/connectors/show.help.ts +0 -1
  283. package/lib/routes/connectors/show.ts +0 -41
  284. package/lib/routes/gateway/group.help.ts +0 -15
  285. package/lib/routes/gateway/group.ts +0 -28
  286. package/lib/routes/gateway/logs.help.ts +0 -13
  287. package/lib/routes/gateway/logs.ts +0 -102
  288. package/lib/routes/gateway/restart.help.ts +0 -10
  289. package/lib/routes/gateway/routes.ts +0 -18
  290. package/lib/routes/gateway/run.help.ts +0 -12
  291. package/lib/routes/gateway/run.ts +0 -35
  292. package/lib/routes/gateway/start.help.ts +0 -15
  293. package/lib/routes/gateway/start.ts +0 -32
  294. package/lib/routes/gateway/status.help.ts +0 -9
  295. package/lib/routes/gateway/status.ts +0 -28
  296. package/lib/routes/gateway/stop.help.ts +0 -8
  297. package/lib/routes/gateway/stop.ts +0 -21
  298. package/lib/routes/profiles/add.help.ts +0 -3
  299. package/lib/routes/profiles/add.ts +0 -33
  300. package/lib/routes/profiles/group.help.ts +0 -16
  301. package/lib/routes/profiles/group.ts +0 -25
  302. package/lib/routes/profiles/launch.help.ts +0 -4
  303. package/lib/routes/profiles/launch.ts +0 -36
  304. package/lib/routes/profiles/remove.help.ts +0 -3
  305. package/lib/routes/profiles/remove.ts +0 -17
  306. package/lib/routes/profiles/rename.help.ts +0 -5
  307. package/lib/routes/profiles/rename.ts +0 -17
  308. package/lib/routes/profiles/routes.ts +0 -18
  309. package/lib/routes/profiles/set.help.ts +0 -5
  310. package/lib/routes/profiles/set.ts +0 -32
  311. package/lib/routes/repos/add.help.ts +0 -6
  312. package/lib/routes/repos/add.ts +0 -20
  313. package/lib/routes/repos/group.help.ts +0 -11
  314. package/lib/routes/repos/group.ts +0 -18
  315. package/lib/routes/repos/remove.help.ts +0 -3
  316. package/lib/routes/repos/remove.ts +0 -17
  317. package/lib/routes/repos/rename.help.ts +0 -5
  318. package/lib/routes/repos/rename.ts +0 -17
  319. package/lib/routes/repos/routes.ts +0 -17
  320. package/lib/routes/repos/set.help.ts +0 -5
  321. package/lib/routes/repos/set.ts +0 -21
  322. package/lib/routes/repos/show.help.ts +0 -1
  323. package/lib/routes/repos/show.ts +0 -19
  324. package/lib/routes/request/discord-help.ts +0 -9
  325. package/lib/routes/request/discord.help.ts +0 -19
  326. package/lib/routes/request/discord.ts +0 -65
  327. package/lib/routes/request/group.help.ts +0 -15
  328. package/lib/routes/request/group.ts +0 -9
  329. package/lib/routes/request/routes.ts +0 -14
  330. package/lib/routes/request/slack-help.ts +0 -9
  331. package/lib/routes/request/slack.help.ts +0 -19
  332. package/lib/routes/request/slack.ts +0 -61
  333. package/lib/routes/status/routes.ts +0 -4
  334. package/lib/routes/status/status.help.ts +0 -6
  335. package/lib/routes/status/status.ts +0 -77
  336. package/lib/routes/update/routes.ts +0 -4
  337. package/lib/routes/update/update.help.ts +0 -5
  338. package/lib/routes/update/update.ts +0 -21
  339. package/lib/routes.ts +0 -40
  340. /package/lib/{factory.ts → cli/factory.ts} +0 -0
  341. /package/lib/{modules → cli}/router/query-to-cli-args.ts +0 -0
  342. /package/lib/{modules → cli}/router/validator.ts +0 -0
  343. /package/lib/{modules/connectors/funnel-connector-adapter.ts → connectors/connector-adapter.ts} +0 -0
  344. /package/lib/{modules/connectors/funnel-discord-event-processor.ts → connectors/discord-event-processor.ts} +0 -0
  345. /package/lib/{modules/http/funnel-http-client.ts → engine/http/http-client.ts} +0 -0
  346. /package/lib/{modules/id/funnel-id-generator.ts → engine/id/id-generator.ts} +0 -0
  347. /package/lib/{modules/logger/funnel-logger.ts → engine/logger/logger.ts} +0 -0
  348. /package/lib/{modules/process/funnel-process-runner.ts → engine/process/process-runner.ts} +0 -0
  349. /package/lib/{modules/time/funnel-clock.ts → engine/time/clock.ts} +0 -0
package/package.json CHANGED
@@ -1,76 +1,82 @@
1
1
  {
2
2
  "name": "@interactive-inc/claude-funnel",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "description": "Hub CLI that routes external events (Slack / GitHub / Discord) to Claude Code agents through subscription channels over MCP.",
5
- "license": "MIT",
6
- "author": "Interactive Inc.",
7
- "homepage": "https://github.com/interactive-inc/open-claude-funnel#readme",
8
- "repository": {
9
- "type": "git",
10
- "url": "git+https://github.com/interactive-inc/open-claude-funnel.git"
11
- },
12
- "bugs": {
13
- "url": "https://github.com/interactive-inc/open-claude-funnel/issues"
14
- },
15
5
  "keywords": [
6
+ "bun",
16
7
  "claude",
17
8
  "claude-code",
18
- "mcp",
19
- "slack",
9
+ "cli",
20
10
  "discord",
21
11
  "github",
22
- "cli",
23
- "bun"
12
+ "mcp",
13
+ "slack"
24
14
  ],
25
- "type": "module",
26
- "main": "./lib/api.ts",
27
- "module": "./lib/api.ts",
28
- "types": "./lib/api.ts",
29
- "exports": {
30
- ".": {
31
- "types": "./lib/api.ts",
32
- "bun": "./lib/api.ts",
33
- "default": "./lib/api.ts"
34
- },
35
- "./cli": "./lib/index.ts",
36
- "./package.json": "./package.json"
15
+ "homepage": "https://github.com/interactive-inc/open-claude-funnel#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/interactive-inc/open-claude-funnel/issues"
18
+ },
19
+ "license": "MIT",
20
+ "author": "Interactive Inc.",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/interactive-inc/open-claude-funnel.git"
37
24
  },
38
25
  "bin": {
39
- "fnl": "./lib/index.ts",
40
- "funnel": "./lib/index.ts"
26
+ "fnl": "./dist/bin.js",
27
+ "funnel": "./dist/bin.js"
41
28
  },
42
29
  "files": [
43
30
  "lib/**/*.ts",
44
31
  "lib/**/*.tsx",
45
32
  "!lib/**/*.test.ts",
46
33
  "!lib/**/*.test.tsx",
34
+ "!lib/**/*.bun-test.ts",
35
+ "dist/**/*",
47
36
  "README.md",
48
37
  "LICENSE"
49
38
  ],
39
+ "scripts": {
40
+ "build": "bun build lib/bin.ts lib/gateway/daemon.ts --target=bun --outdir dist --minify",
41
+ "prepare": "bun run build"
42
+ },
43
+ "type": "module",
44
+ "main": "./lib/index.ts",
45
+ "module": "./lib/index.ts",
46
+ "types": "./lib/index.ts",
47
+ "exports": {
48
+ ".": {
49
+ "types": "./lib/index.ts",
50
+ "bun": "./lib/index.ts",
51
+ "default": "./lib/index.ts"
52
+ },
53
+ "./bin": "./lib/bin.ts",
54
+ "./package.json": "./package.json"
55
+ },
50
56
  "publishConfig": {
51
57
  "access": "public"
52
58
  },
53
- "engines": {
54
- "bun": ">=1.3.0"
55
- },
56
59
  "dependencies": {
57
60
  "@hono/zod-validator": "^0.7.6",
58
61
  "@modelcontextprotocol/sdk": "^1.29.0",
59
- "@opentui/core": "^0.1.97",
60
- "@opentui/react": "^0.1.97",
61
- "@slack/bolt": "^4.7.0",
62
- "@slack/web-api": "^7.15.0",
63
- "@tanstack/react-query": "^5.99.0",
62
+ "@opentui/core": "^0.2.2",
63
+ "@opentui/react": "^0.2.2",
64
+ "@slack/bolt": "^4.7.2",
65
+ "@slack/web-api": "^7.15.1",
64
66
  "@types/react": "^19.2.14",
65
- "discord.js": "^14.26.3",
66
- "hono": "^4.12.12",
67
+ "discord.js": "^14.26.4",
68
+ "hono": "^4.12.16",
67
69
  "react": "^19.2.5",
68
- "yaml": "^2.8.3",
69
- "zod": "^4.3.6"
70
+ "yaml": "^2.8.4",
71
+ "zod": "^4.4.2"
70
72
  },
71
73
  "devDependencies": {
72
- "@types/bun": "^1.3.12",
73
- "@typescript/native-preview": "^7.0.0-dev.20260411.1",
74
- "vite-plus": "^0.1.18"
74
+ "@types/bun": "^1.3.13",
75
+ "@typescript/native-preview": "^7.0.0-dev.20260503.1",
76
+ "vite-plus": "^0.1.20",
77
+ "vitest": "^4.1.5"
78
+ },
79
+ "engines": {
80
+ "bun": ">=1.3.0"
75
81
  }
76
82
  }
package/lib/api.ts DELETED
@@ -1,54 +0,0 @@
1
- export { Funnel } from "@/funnel"
2
-
3
- export { FunnelChannels } from "@/modules/channels/funnel-channels"
4
- export { FunnelClaude } from "@/modules/claude/funnel-claude"
5
- export { FunnelConnectors } from "@/modules/connectors/funnel-connectors"
6
- export {
7
- type ConnectorStoresBundle,
8
- createConnectorStores,
9
- } from "@/modules/connectors/funnel-connector-stores"
10
- export { FunnelGateway } from "@/modules/gateway/funnel-gateway"
11
- export { FunnelGatewayServer } from "@/modules/gateway/funnel-gateway-server"
12
- export { FunnelBroadcaster } from "@/modules/gateway/funnel-broadcaster"
13
- export { FunnelEventLogger } from "@/modules/gateway/funnel-event-logger"
14
- export { FunnelMcp } from "@/modules/mcp/funnel-mcp"
15
- export { FunnelProfiles } from "@/modules/profiles/funnel-profiles"
16
- export { FunnelRepositories } from "@/modules/repos/funnel-repositories"
17
- export { FunnelSchedule } from "@/modules/schedule/funnel-schedule"
18
-
19
- export { FunnelFileSystem } from "@/modules/fs/funnel-file-system"
20
- export { NodeFunnelFileSystem } from "@/modules/fs/node-funnel-file-system"
21
- export { MemoryFunnelFileSystem } from "@/modules/fs/memory-funnel-file-system"
22
-
23
- export { FunnelProcessRunner } from "@/modules/process/funnel-process-runner"
24
- export { NodeFunnelProcessRunner } from "@/modules/process/node-funnel-process-runner"
25
- export { MemoryFunnelProcessRunner } from "@/modules/process/memory-funnel-process-runner"
26
-
27
- export { FunnelLogger } from "@/modules/logger/funnel-logger"
28
- export { NodeFunnelLogger } from "@/modules/logger/node-funnel-logger"
29
- export { MemoryFunnelLogger, type LogEntry } from "@/modules/logger/memory-funnel-logger"
30
- export { NoopFunnelLogger } from "@/modules/logger/noop-funnel-logger"
31
-
32
- export { FunnelClock } from "@/modules/time/funnel-clock"
33
- export { NodeFunnelClock } from "@/modules/time/node-funnel-clock"
34
- export { MemoryFunnelClock } from "@/modules/time/memory-funnel-clock"
35
-
36
- export { FunnelIdGenerator } from "@/modules/id/funnel-id-generator"
37
- export { NodeFunnelIdGenerator } from "@/modules/id/node-funnel-id-generator"
38
- export { MemoryFunnelIdGenerator } from "@/modules/id/memory-funnel-id-generator"
39
-
40
- export { FunnelSettingsReader } from "@/modules/settings/funnel-settings-reader"
41
- export { FunnelSettingsStore } from "@/modules/settings/funnel-settings-store"
42
- export { MockFunnelSettingsReader } from "@/modules/settings/mock-funnel-settings-reader"
43
-
44
- export type { ConnectorConfig } from "@/modules/connectors/connector-config-schema"
45
- export type {
46
- ChannelConfig,
47
- ProfileConfig,
48
- RepositoryConfig,
49
- Settings,
50
- } from "@/modules/settings/settings-schema"
51
- export type {
52
- ScheduleConnectorConfig,
53
- ScheduleEntry,
54
- } from "@/modules/connectors/schedule-connector-schema"
@@ -1,4 +0,0 @@
1
- export type ChannelConnectorRefUpdater = {
2
- renameRef(oldName: string, newName: string): void
3
- removeRef(connectorName: string): void
4
- }
@@ -1,160 +0,0 @@
1
- import type { ConnectorExistenceChecker } from "@/modules/connectors/connector-existence-checker"
2
- import type { ProfileChannelChecker } from "@/modules/profiles/profile-channel-checker"
3
- import type { ProfileChannelRefUpdater } from "@/modules/profiles/profile-channel-ref-updater"
4
- import { FunnelSettingsReader } from "@/modules/settings/funnel-settings-reader"
5
- import type { ChannelConfig } from "@/modules/settings/settings-schema"
6
-
7
- type Deps = {
8
- store: FunnelSettingsReader
9
- connectorChecker: ConnectorExistenceChecker
10
- profileChecker: ProfileChannelChecker
11
- profileRefUpdater: ProfileChannelRefUpdater
12
- }
13
-
14
- /**
15
- * Subscription boxes that fan connector events out to Claude Code sessions.
16
- * A channel attaches one or more connectors; the gateway's WebSocket clients
17
- * subscribe by channel name. Name changes propagate to profile channel refs.
18
- */
19
- export class FunnelChannels {
20
- private readonly store: FunnelSettingsReader
21
- private readonly connectorChecker: ConnectorExistenceChecker
22
- private readonly profileChecker: ProfileChannelChecker
23
- private readonly profileRefUpdater: ProfileChannelRefUpdater
24
-
25
- constructor(deps: Deps) {
26
- this.store = deps.store
27
- this.connectorChecker = deps.connectorChecker
28
- this.profileChecker = deps.profileChecker
29
- this.profileRefUpdater = deps.profileRefUpdater
30
- Object.freeze(this)
31
- }
32
-
33
- list(): ChannelConfig[] {
34
- return this.store.read().channels
35
- }
36
-
37
- get(name: string): ChannelConfig | null {
38
- return this.list().find((c) => c.name === name) ?? null
39
- }
40
-
41
- add(config: ChannelConfig): void {
42
- const settings = this.store.read()
43
-
44
- if (settings.channels.some((c) => c.name === config.name)) {
45
- throw new Error(`channel "${config.name}" already exists`)
46
- }
47
-
48
- for (const connectorName of config.connectors) {
49
- if (!this.connectorChecker.has(connectorName)) {
50
- throw new Error(`connector "${connectorName}" not found`)
51
- }
52
- }
53
-
54
- settings.channels.push(config)
55
-
56
- this.store.write(settings)
57
- }
58
-
59
- remove(name: string): void {
60
- const settings = this.store.read()
61
-
62
- const index = settings.channels.findIndex((c) => c.name === name)
63
-
64
- if (index < 0) throw new Error(`channel "${name}" not found`)
65
-
66
- if (this.profileChecker.hasChannelRef(name)) {
67
- throw new Error(`channel "${name}" is referenced by a profile`)
68
- }
69
-
70
- settings.channels.splice(index, 1)
71
-
72
- this.store.write(settings)
73
- }
74
-
75
- rename(oldName: string, newName: string): void {
76
- const settings = this.store.read()
77
-
78
- const channel = settings.channels.find((c) => c.name === oldName)
79
-
80
- if (!channel) throw new Error(`channel "${oldName}" not found`)
81
-
82
- if (settings.channels.some((c) => c.name === newName)) {
83
- throw new Error(`channel "${newName}" already exists`)
84
- }
85
-
86
- channel.name = newName
87
-
88
- this.store.write(settings)
89
-
90
- this.profileRefUpdater.renameChannelRef(oldName, newName)
91
- }
92
-
93
- attachConnector(name: string, connectorName: string): void {
94
- const settings = this.store.read()
95
-
96
- const channel = settings.channels.find((c) => c.name === name)
97
-
98
- if (!channel) throw new Error(`channel "${name}" not found`)
99
-
100
- if (!this.connectorChecker.has(connectorName)) {
101
- throw new Error(`connector "${connectorName}" not found`)
102
- }
103
-
104
- if (channel.connectors.includes(connectorName)) {
105
- throw new Error(`connector "${connectorName}" is already attached`)
106
- }
107
-
108
- channel.connectors.push(connectorName)
109
-
110
- this.store.write(settings)
111
- }
112
-
113
- detachConnector(name: string, connectorName: string): void {
114
- const settings = this.store.read()
115
-
116
- const channel = settings.channels.find((c) => c.name === name)
117
-
118
- if (!channel) throw new Error(`channel "${name}" not found`)
119
-
120
- const index = channel.connectors.indexOf(connectorName)
121
-
122
- if (index < 0) throw new Error(`connector "${connectorName}" is not attached`)
123
-
124
- channel.connectors.splice(index, 1)
125
-
126
- this.store.write(settings)
127
- }
128
-
129
- renameRef(oldName: string, newName: string): void {
130
- const settings = this.store.read()
131
- let changed = false
132
-
133
- for (const channel of settings.channels) {
134
- const i = channel.connectors.indexOf(oldName)
135
-
136
- if (i >= 0) {
137
- channel.connectors[i] = newName
138
- changed = true
139
- }
140
- }
141
-
142
- if (changed) this.store.write(settings)
143
- }
144
-
145
- removeRef(connectorName: string): void {
146
- const settings = this.store.read()
147
- let changed = false
148
-
149
- for (const channel of settings.channels) {
150
- const i = channel.connectors.indexOf(connectorName)
151
-
152
- if (i >= 0) {
153
- channel.connectors.splice(i, 1)
154
- changed = true
155
- }
156
- }
157
-
158
- if (changed) this.store.write(settings)
159
- }
160
- }
@@ -1,16 +0,0 @@
1
- import { z } from "zod"
2
- import { discordConnectorSchema } from "@/modules/connectors/discord-connector-schema"
3
- import { ghConnectorSchema } from "@/modules/connectors/gh-connector-schema"
4
- import { scheduleConnectorSchema } from "@/modules/connectors/schedule-connector-schema"
5
- import { slackConnectorSchema } from "@/modules/connectors/slack-connector-schema"
6
-
7
- export const connectorConfigSchema = z.discriminatedUnion("type", [
8
- slackConnectorSchema,
9
- ghConnectorSchema,
10
- discordConnectorSchema,
11
- scheduleConnectorSchema,
12
- ])
13
-
14
- export type ConnectorConfig = z.infer<typeof connectorConfigSchema>
15
-
16
- export type ConnectorType = ConnectorConfig["type"]
@@ -1,3 +0,0 @@
1
- export type ConnectorExistenceChecker = {
2
- has(name: string): boolean
3
- }
@@ -1,9 +0,0 @@
1
- import type { FunnelConnectorAdapter } from "@/modules/connectors/funnel-connector-adapter"
2
- import { FunnelConnectorTypeStore } from "@/modules/connectors/funnel-connector-type-store"
3
- import type { ConnectorConfig } from "@/modules/connectors/connector-config-schema"
4
-
5
- export abstract class FunnelCallableConnectorStore<
6
- TConfig extends ConnectorConfig,
7
- > extends FunnelConnectorTypeStore<TConfig> {
8
- abstract createAdapter(config: TConfig): FunnelConnectorAdapter
9
- }
@@ -1,5 +0,0 @@
1
- export type NotifyFn = (content: string, meta?: Record<string, string>) => Promise<void>
2
-
3
- export abstract class FunnelConnectorListener {
4
- abstract start(notify: NotifyFn): Promise<void>
5
- }
@@ -1,52 +0,0 @@
1
- import { FunnelDiscordStore } from "@/modules/connectors/funnel-discord-store"
2
- import { FunnelGhStore } from "@/modules/connectors/funnel-gh-store"
3
- import { FunnelScheduleStore } from "@/modules/connectors/funnel-schedule-store"
4
- import { FunnelSlackStore } from "@/modules/connectors/funnel-slack-store"
5
- import { FunnelFileSystem } from "@/modules/fs/funnel-file-system"
6
- import { FunnelIdGenerator } from "@/modules/id/funnel-id-generator"
7
- import { FunnelLogger } from "@/modules/logger/funnel-logger"
8
- import { FunnelProcessRunner } from "@/modules/process/funnel-process-runner"
9
- import { FunnelClock } from "@/modules/time/funnel-clock"
10
-
11
- export type ConnectorStoresBundle = {
12
- slack: FunnelSlackStore
13
- gh: FunnelGhStore
14
- discord: FunnelDiscordStore
15
- schedule: FunnelScheduleStore
16
- }
17
-
18
- type Deps = {
19
- fs?: FunnelFileSystem
20
- process?: FunnelProcessRunner
21
- logger?: FunnelLogger
22
- clock?: FunnelClock
23
- idGenerator?: FunnelIdGenerator
24
- dir?: string
25
- }
26
-
27
- export const createConnectorStores = (deps: Deps = {}): ConnectorStoresBundle => ({
28
- slack: new FunnelSlackStore({
29
- fs: deps.fs,
30
- dir: deps.dir,
31
- logger: deps.logger,
32
- }),
33
- gh: new FunnelGhStore({
34
- fs: deps.fs,
35
- dir: deps.dir,
36
- process: deps.process,
37
- logger: deps.logger,
38
- clock: deps.clock,
39
- }),
40
- discord: new FunnelDiscordStore({
41
- fs: deps.fs,
42
- dir: deps.dir,
43
- logger: deps.logger,
44
- }),
45
- schedule: new FunnelScheduleStore({
46
- fs: deps.fs,
47
- dir: deps.dir,
48
- logger: deps.logger,
49
- idGenerator: deps.idGenerator,
50
- clock: deps.clock,
51
- }),
52
- })
@@ -1,24 +0,0 @@
1
- import type { FunnelConnectorListener } from "@/modules/connectors/funnel-connector-listener"
2
- import type { ConnectorConfig } from "@/modules/connectors/connector-config-schema"
3
-
4
- export abstract class FunnelConnectorTypeStore<TConfig extends ConnectorConfig> {
5
- abstract readonly type: TConfig["type"]
6
-
7
- abstract list(): TConfig[]
8
-
9
- abstract get(name: string): TConfig | null
10
-
11
- abstract has(name: string): boolean
12
-
13
- abstract add(config: TConfig): void
14
-
15
- abstract remove(name: string): void
16
-
17
- abstract rename(oldName: string, newName: string): void
18
-
19
- abstract createListener(config: TConfig): FunnelConnectorListener
20
-
21
- createAllListeners(): { config: TConfig; listener: FunnelConnectorListener }[] {
22
- return this.list().map((config) => ({ config, listener: this.createListener(config) }))
23
- }
24
- }
@@ -1,151 +0,0 @@
1
- import type { ChannelConnectorRefUpdater } from "@/modules/channels/channel-connector-ref-updater"
2
- import type { ConnectorConfig } from "@/modules/connectors/connector-config-schema"
3
- import type { CallInput } from "@/modules/connectors/funnel-connector-adapter"
4
- import type { FunnelConnectorListener } from "@/modules/connectors/funnel-connector-listener"
5
- import type {
6
- DiscordUpdateFields,
7
- FunnelDiscordStore,
8
- } from "@/modules/connectors/funnel-discord-store"
9
- import type { FunnelGhStore, GhUpdateFields } from "@/modules/connectors/funnel-gh-store"
10
- import type { FunnelScheduleStore } from "@/modules/connectors/funnel-schedule-store"
11
- import type { FunnelSlackStore, SlackUpdateFields } from "@/modules/connectors/funnel-slack-store"
12
-
13
- type Deps = {
14
- slack: FunnelSlackStore
15
- gh: FunnelGhStore
16
- discord: FunnelDiscordStore
17
- schedule: FunnelScheduleStore
18
- refUpdater: ChannelConnectorRefUpdater
19
- }
20
-
21
- /**
22
- * Aggregates per-type connector stores (slack / gh / discord / schedule) behind a single facade.
23
- * Add / remove / rename mutate the underlying type-specific store and propagate name changes
24
- * to channel references via `refUpdater`. Per-type APIs (`updateSlack`, `callDiscord`, ...) keep
25
- * field-level operations type-narrowed without runtime defense.
26
- */
27
- export class FunnelConnectors {
28
- private readonly slack: FunnelSlackStore
29
- private readonly gh: FunnelGhStore
30
- private readonly discord: FunnelDiscordStore
31
- private readonly schedule: FunnelScheduleStore
32
- private readonly refUpdater: ChannelConnectorRefUpdater
33
-
34
- constructor(deps: Deps) {
35
- this.slack = deps.slack
36
- this.gh = deps.gh
37
- this.discord = deps.discord
38
- this.schedule = deps.schedule
39
- this.refUpdater = deps.refUpdater
40
- Object.freeze(this)
41
- }
42
-
43
- list(): ConnectorConfig[] {
44
- return [
45
- ...this.slack.list(),
46
- ...this.gh.list(),
47
- ...this.discord.list(),
48
- ...this.schedule.list(),
49
- ]
50
- }
51
-
52
- get(name: string): ConnectorConfig | null {
53
- return (
54
- this.slack.get(name) ??
55
- this.gh.get(name) ??
56
- this.discord.get(name) ??
57
- this.schedule.get(name)
58
- )
59
- }
60
-
61
- has(name: string): boolean {
62
- return (
63
- this.slack.has(name) ||
64
- this.gh.has(name) ||
65
- this.discord.has(name) ||
66
- this.schedule.has(name)
67
- )
68
- }
69
-
70
- add(config: ConnectorConfig): void {
71
- if (this.has(config.name)) throw new Error(`connector "${config.name}" already exists`)
72
-
73
- if (config.type === "slack") return this.slack.add(config)
74
- if (config.type === "gh") return this.gh.add(config)
75
- if (config.type === "discord") return this.discord.add(config)
76
-
77
- return this.schedule.add(config)
78
- }
79
-
80
- updateSlack(name: string, fields: SlackUpdateFields): void {
81
- this.slack.update(name, fields)
82
- }
83
-
84
- updateGh(name: string, fields: GhUpdateFields): void {
85
- this.gh.update(name, fields)
86
- }
87
-
88
- updateDiscord(name: string, fields: DiscordUpdateFields): void {
89
- this.discord.update(name, fields)
90
- }
91
-
92
- remove(name: string): void {
93
- const current = this.get(name)
94
-
95
- if (!current) throw new Error(`connector "${name}" not found`)
96
-
97
- if (current.type === "slack") this.slack.remove(name)
98
- else if (current.type === "gh") this.gh.remove(name)
99
- else if (current.type === "discord") this.discord.remove(name)
100
- else this.schedule.remove(name)
101
-
102
- this.refUpdater.removeRef(name)
103
- }
104
-
105
- rename(oldName: string, newName: string): void {
106
- const current = this.get(oldName)
107
-
108
- if (!current) throw new Error(`connector "${oldName}" not found`)
109
- if (this.has(newName)) throw new Error(`connector "${newName}" already exists`)
110
-
111
- if (current.type === "slack") this.slack.rename(oldName, newName)
112
- else if (current.type === "gh") this.gh.rename(oldName, newName)
113
- else if (current.type === "discord") this.discord.rename(oldName, newName)
114
- else this.schedule.rename(oldName, newName)
115
-
116
- this.refUpdater.renameRef(oldName, newName)
117
- }
118
-
119
- async callSlack(name: string, input: CallInput): Promise<unknown> {
120
- const config = this.slack.get(name)
121
-
122
- if (!config) throw new Error(`slack connector "${name}" not found`)
123
-
124
- return await this.slack.createAdapter(config).call(input)
125
- }
126
-
127
- async callGh(name: string, input: CallInput): Promise<unknown> {
128
- const config = this.gh.get(name)
129
-
130
- if (!config) throw new Error(`gh connector "${name}" not found`)
131
-
132
- return await this.gh.createAdapter(config).call(input)
133
- }
134
-
135
- async callDiscord(name: string, input: CallInput): Promise<unknown> {
136
- const config = this.discord.get(name)
137
-
138
- if (!config) throw new Error(`discord connector "${name}" not found`)
139
-
140
- return await this.discord.createAdapter(config).call(input)
141
- }
142
-
143
- createListeners(): { config: ConnectorConfig; listener: FunnelConnectorListener }[] {
144
- return [
145
- ...this.slack.createAllListeners(),
146
- ...this.gh.createAllListeners(),
147
- ...this.discord.createAllListeners(),
148
- ...this.schedule.createAllListeners(),
149
- ]
150
- }
151
- }