@interactive-inc/claude-funnel 0.4.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 +233 -111
  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} +57 -22
  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} +39 -14
  69. package/lib/engine/channels/channels.ts +520 -0
  70. package/lib/{modules/claude/funnel-claude.ts → engine/claude/claude.ts} +47 -62
  71. package/lib/engine/claude/gateway-controller.ts +4 -0
  72. package/lib/{modules/fs/funnel-file-system.ts → engine/fs/file-system.ts} +9 -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/engine/id/id-generator.ts +7 -0
  78. package/lib/engine/id/memory-id-generator.ts +20 -0
  79. package/lib/engine/id/node-id-generator.ts +7 -0
  80. package/lib/engine/logger/logger.ts +11 -0
  81. package/lib/engine/logger/memory-logger.ts +28 -0
  82. package/lib/engine/logger/node-logger.ts +49 -0
  83. package/lib/engine/logger/noop-logger.ts +9 -0
  84. package/lib/engine/mcp/channel-server.ts +204 -0
  85. package/lib/{modules/mcp/funnel-mcp.ts → engine/mcp/mcp.ts} +29 -10
  86. package/lib/{modules/process/memory-funnel-process-runner.ts → engine/process/memory-process-runner.ts} +1 -1
  87. package/lib/{modules/process/node-funnel-process-runner.ts → engine/process/node-process-runner.ts} +12 -21
  88. package/lib/{modules/process/funnel-process-runner.ts → engine/process/process-runner.ts} +5 -0
  89. package/lib/engine/profiles/profile-channel-checker.ts +7 -0
  90. package/lib/engine/profiles/profiles.ts +126 -0
  91. package/lib/{modules/settings/mock-funnel-settings-reader.ts → engine/settings/mock-settings-reader.ts} +4 -3
  92. package/lib/{modules/settings/funnel-settings-reader.ts → engine/settings/settings-reader.ts} +1 -1
  93. package/lib/engine/settings/settings-schema.ts +46 -0
  94. package/lib/engine/settings/settings-store.ts +110 -0
  95. package/lib/engine/time/clock.ts +15 -0
  96. package/lib/engine/time/memory-clock.ts +26 -0
  97. package/lib/engine/time/node-clock.ts +7 -0
  98. package/lib/funnel.ts +148 -56
  99. package/lib/gateway/auth-middleware.ts +44 -0
  100. package/lib/gateway/broadcaster.ts +319 -0
  101. package/lib/gateway/daemon.ts +47 -0
  102. package/lib/gateway/factory.ts +10 -0
  103. package/lib/gateway/funnel-event-store.ts +155 -0
  104. package/lib/gateway/gateway-server.ts +414 -0
  105. package/lib/gateway/gateway-token.ts +79 -0
  106. package/lib/{modules/gateway/funnel-gateway.ts → gateway/gateway.ts} +70 -27
  107. package/lib/{modules/gateway → gateway}/kill-competing-slack-gateways.ts +7 -3
  108. package/lib/gateway/listener-supervisor.ts +339 -0
  109. package/lib/gateway/listeners-client.ts +128 -0
  110. package/lib/gateway/resolve-daemon-script.ts +26 -0
  111. package/lib/gateway/routes/channels.connectors.call.ts +39 -0
  112. package/lib/gateway/routes/health.ts +13 -0
  113. package/lib/gateway/routes/index.ts +24 -0
  114. package/lib/gateway/routes/listeners.list.ts +6 -0
  115. package/lib/gateway/routes/listeners.restart.ts +15 -0
  116. package/lib/gateway/routes/listeners.start.ts +15 -0
  117. package/lib/gateway/routes/listeners.stop.ts +15 -0
  118. package/lib/gateway/routes/route-deps.ts +11 -0
  119. package/lib/gateway/routes/status.ts +15 -0
  120. package/lib/gateway/routes/validator.ts +17 -0
  121. package/lib/index.ts +50 -92
  122. package/lib/logger/leuco-human-file-writer.ts +65 -0
  123. package/lib/logger/leuco-human-logger.ts +98 -0
  124. package/lib/logger/leuco-human-record.ts +16 -0
  125. package/lib/logger/leuco-human-stdout-writer.ts +26 -0
  126. package/lib/logger/leuco-human-writer.ts +14 -0
  127. package/lib/logger/leuco-logger-memory-sink.ts +67 -0
  128. package/lib/logger/leuco-logger-record.ts +13 -0
  129. package/lib/logger/leuco-logger-sink.ts +33 -0
  130. package/lib/logger/leuco-logger-sqlite-sink.ts +355 -0
  131. package/lib/logger/leuco-logger.ts +135 -0
  132. package/lib/tui/app.tsx +357 -0
  133. package/lib/tui/components/add-row.tsx +18 -0
  134. package/lib/tui/components/brand.tsx +27 -0
  135. package/lib/tui/components/card.tsx +44 -0
  136. package/lib/tui/components/detail-bar.tsx +46 -0
  137. package/lib/tui/components/editable-field.tsx +33 -0
  138. package/lib/tui/components/empty-state.tsx +11 -0
  139. package/lib/tui/components/gateway-status.tsx +66 -0
  140. package/lib/tui/components/keymap.tsx +29 -0
  141. package/lib/tui/components/menu-item.tsx +73 -0
  142. package/lib/tui/components/menu.tsx +26 -0
  143. package/lib/tui/components/panel-header.tsx +22 -0
  144. package/lib/tui/components/readonly-field.tsx +18 -0
  145. package/lib/tui/components/section-header.tsx +25 -0
  146. package/lib/tui/components/selection-accent.tsx +32 -0
  147. package/lib/tui/components/session-item.tsx +33 -0
  148. package/lib/tui/components/session-list.tsx +33 -0
  149. package/lib/tui/components/ui/hascii/accordion-item.tsx +88 -0
  150. package/lib/tui/components/ui/hascii/accordion.tsx +96 -0
  151. package/lib/tui/components/ui/hascii/alert-dialog.tsx +43 -0
  152. package/lib/tui/components/ui/hascii/badge.tsx +51 -0
  153. package/lib/tui/components/ui/hascii/breadcrumb.tsx +58 -0
  154. package/lib/tui/components/ui/hascii/button.tsx +194 -0
  155. package/lib/tui/components/ui/hascii/card-content.tsx +14 -0
  156. package/lib/tui/components/ui/hascii/card-description.tsx +13 -0
  157. package/lib/tui/components/ui/hascii/card-footer.tsx +14 -0
  158. package/lib/tui/components/ui/hascii/card-header.tsx +14 -0
  159. package/lib/tui/components/ui/hascii/card-title.tsx +13 -0
  160. package/lib/tui/components/ui/hascii/card.tsx +27 -0
  161. package/lib/tui/components/ui/hascii/checkbox.tsx +65 -0
  162. package/lib/tui/components/ui/hascii/command.tsx +159 -0
  163. package/lib/tui/components/ui/hascii/dialog-content.tsx +14 -0
  164. package/lib/tui/components/ui/hascii/dialog-description.tsx +13 -0
  165. package/lib/tui/components/ui/hascii/dialog-footer.tsx +14 -0
  166. package/lib/tui/components/ui/hascii/dialog-header.tsx +14 -0
  167. package/lib/tui/components/ui/hascii/dialog-title.tsx +13 -0
  168. package/lib/tui/components/ui/hascii/dialog.tsx +27 -0
  169. package/lib/tui/components/ui/hascii/file-tree.tsx +142 -0
  170. package/lib/tui/components/ui/hascii/focus-group.tsx +62 -0
  171. package/lib/tui/components/ui/hascii/form-item.tsx +43 -0
  172. package/lib/tui/components/ui/hascii/input-otp.tsx +86 -0
  173. package/lib/tui/components/ui/hascii/input.tsx +130 -0
  174. package/lib/tui/components/ui/hascii/pagination.tsx +105 -0
  175. package/lib/tui/components/ui/hascii/progress.tsx +28 -0
  176. package/lib/tui/components/ui/hascii/select.tsx +131 -0
  177. package/lib/tui/components/ui/hascii/separator.tsx +35 -0
  178. package/lib/tui/components/ui/hascii/sidebar-content.tsx +23 -0
  179. package/lib/tui/components/ui/hascii/sidebar-header.tsx +14 -0
  180. package/lib/tui/components/ui/hascii/sidebar-menu-item.tsx +67 -0
  181. package/lib/tui/components/ui/hascii/sidebar.tsx +24 -0
  182. package/lib/tui/components/ui/hascii/skeleton.tsx +60 -0
  183. package/lib/tui/components/ui/hascii/slider.tsx +91 -0
  184. package/lib/tui/components/ui/hascii/snackbar.tsx +75 -0
  185. package/lib/tui/components/ui/hascii/sparkline.tsx +53 -0
  186. package/lib/tui/components/ui/hascii/spinner.tsx +47 -0
  187. package/lib/tui/components/ui/hascii/stepper.tsx +54 -0
  188. package/lib/tui/components/ui/hascii/switch.tsx +66 -0
  189. package/lib/tui/components/ui/hascii/table.tsx +95 -0
  190. package/lib/tui/components/ui/hascii/tabs.tsx +59 -0
  191. package/lib/tui/components/ui/hascii/toggle-group-item.tsx +45 -0
  192. package/lib/tui/components/ui/hascii/toggle-group.tsx +99 -0
  193. package/lib/tui/components/ui/hascii/tree.tsx +104 -0
  194. package/lib/tui/components/view-shell.tsx +44 -0
  195. package/lib/tui/filter-input.tsx +33 -0
  196. package/lib/tui/hooks/hascii/use-pressable.ts +54 -0
  197. package/lib/tui/parse-comma-list.ts +14 -0
  198. package/lib/tui/profile-launcher.tsx +61 -0
  199. package/lib/tui/scrollbar-options.ts +19 -0
  200. package/lib/tui/sidebar.tsx +50 -0
  201. package/lib/tui/theme.ts +40 -0
  202. package/lib/tui/tui.tsx +20 -0
  203. package/lib/tui/types.ts +38 -0
  204. package/lib/tui/unique-name.ts +18 -0
  205. package/lib/tui/use-event-stream.ts +133 -0
  206. package/lib/tui/use-snapshot.ts +99 -0
  207. package/lib/tui/utils/hascii/form-item-context.tsx +23 -0
  208. package/lib/tui/utils/hascii/input-focus-context.tsx +31 -0
  209. package/lib/tui/utils/hascii/theme-context.tsx +26 -0
  210. package/lib/tui/utils/hascii/theme.ts +176 -0
  211. package/lib/tui/views/channels-view.tsx +108 -0
  212. package/lib/tui/views/connectors-view.tsx +164 -0
  213. package/lib/tui/views/events-view.tsx +160 -0
  214. package/lib/tui/views/listeners-view.tsx +80 -0
  215. package/lib/tui/views/profiles-view.tsx +152 -0
  216. package/package.json +51 -34
  217. package/lib/modules/channels/channel-connector-ref-updater.ts +0 -4
  218. package/lib/modules/channels/funnel-channels.ts +0 -155
  219. package/lib/modules/connectors/connector-config-schema.ts +0 -16
  220. package/lib/modules/connectors/connector-existence-checker.ts +0 -3
  221. package/lib/modules/connectors/funnel-callable-connector-store.ts +0 -9
  222. package/lib/modules/connectors/funnel-connector-listener.ts +0 -5
  223. package/lib/modules/connectors/funnel-connector-stores.ts +0 -24
  224. package/lib/modules/connectors/funnel-connector-type-store.ts +0 -24
  225. package/lib/modules/connectors/funnel-connectors.ts +0 -145
  226. package/lib/modules/connectors/funnel-discord-listener.ts +0 -65
  227. package/lib/modules/connectors/funnel-discord-store.ts +0 -84
  228. package/lib/modules/connectors/funnel-gh-store.ts +0 -84
  229. package/lib/modules/connectors/funnel-json-connector-store.ts +0 -100
  230. package/lib/modules/connectors/funnel-schedule-listener.ts +0 -124
  231. package/lib/modules/connectors/funnel-schedule-store.ts +0 -178
  232. package/lib/modules/connectors/funnel-slack-adapter.ts +0 -31
  233. package/lib/modules/connectors/funnel-slack-store.ts +0 -86
  234. package/lib/modules/connectors/migrate-legacy-connectors.ts +0 -77
  235. package/lib/modules/connectors/schedule-connector-schema.ts +0 -18
  236. package/lib/modules/connectors/schedule-last-fired-store.ts +0 -48
  237. package/lib/modules/gateway/daemon.ts +0 -207
  238. package/lib/modules/gateway/funnel-broadcaster.ts +0 -37
  239. package/lib/modules/gateway/funnel-event-logger.ts +0 -59
  240. package/lib/modules/logger.ts +0 -26
  241. package/lib/modules/mcp/channel-server.ts +0 -76
  242. package/lib/modules/profiles/funnel-profiles.ts +0 -123
  243. package/lib/modules/profiles/profile-channel-checker.ts +0 -3
  244. package/lib/modules/profiles/profile-channel-ref-updater.ts +0 -3
  245. package/lib/modules/repos/funnel-repositories.ts +0 -107
  246. package/lib/modules/schedule/funnel-schedule.ts +0 -34
  247. package/lib/modules/settings/funnel-settings-store.ts +0 -56
  248. package/lib/modules/settings/settings-schema.ts +0 -33
  249. package/lib/modules/tui/app.tsx +0 -44
  250. package/lib/modules/tui/tui.tsx +0 -13
  251. package/lib/routes/channels/add.help.ts +0 -3
  252. package/lib/routes/channels/add.ts +0 -21
  253. package/lib/routes/channels/connectors-attach.help.ts +0 -3
  254. package/lib/routes/channels/connectors-attach.ts +0 -17
  255. package/lib/routes/channels/connectors-detach.help.ts +0 -3
  256. package/lib/routes/channels/connectors-detach.ts +0 -17
  257. package/lib/routes/channels/group.help.ts +0 -16
  258. package/lib/routes/channels/group.ts +0 -22
  259. package/lib/routes/channels/remove.help.ts +0 -3
  260. package/lib/routes/channels/remove.ts +0 -17
  261. package/lib/routes/channels/rename.help.ts +0 -5
  262. package/lib/routes/channels/rename.ts +0 -17
  263. package/lib/routes/channels/routes.ts +0 -19
  264. package/lib/routes/channels/show.help.ts +0 -1
  265. package/lib/routes/channels/show.ts +0 -26
  266. package/lib/routes/claude/claude.help.ts +0 -16
  267. package/lib/routes/claude/claude.ts +0 -76
  268. package/lib/routes/claude/routes.ts +0 -4
  269. package/lib/routes/connectors/add.help.ts +0 -28
  270. package/lib/routes/connectors/add.ts +0 -64
  271. package/lib/routes/connectors/group.help.ts +0 -14
  272. package/lib/routes/connectors/group.ts +0 -18
  273. package/lib/routes/connectors/remove.help.ts +0 -3
  274. package/lib/routes/connectors/remove.ts +0 -17
  275. package/lib/routes/connectors/rename.help.ts +0 -5
  276. package/lib/routes/connectors/rename.ts +0 -17
  277. package/lib/routes/connectors/routes.ts +0 -23
  278. package/lib/routes/connectors/schedules-add.help.ts +0 -11
  279. package/lib/routes/connectors/schedules-add.ts +0 -33
  280. package/lib/routes/connectors/schedules-group.help.ts +0 -1
  281. package/lib/routes/connectors/schedules-group.ts +0 -38
  282. package/lib/routes/connectors/schedules-remove.help.ts +0 -3
  283. package/lib/routes/connectors/schedules-remove.ts +0 -17
  284. package/lib/routes/connectors/set.help.ts +0 -8
  285. package/lib/routes/connectors/set.ts +0 -72
  286. package/lib/routes/connectors/show.help.ts +0 -1
  287. package/lib/routes/connectors/show.ts +0 -41
  288. package/lib/routes/gateway/group.help.ts +0 -15
  289. package/lib/routes/gateway/group.ts +0 -28
  290. package/lib/routes/gateway/logs.help.ts +0 -13
  291. package/lib/routes/gateway/logs.ts +0 -100
  292. package/lib/routes/gateway/restart.help.ts +0 -10
  293. package/lib/routes/gateway/routes.ts +0 -18
  294. package/lib/routes/gateway/run.help.ts +0 -12
  295. package/lib/routes/gateway/run.ts +0 -35
  296. package/lib/routes/gateway/start.help.ts +0 -15
  297. package/lib/routes/gateway/start.ts +0 -32
  298. package/lib/routes/gateway/status.help.ts +0 -9
  299. package/lib/routes/gateway/status.ts +0 -28
  300. package/lib/routes/gateway/stop.help.ts +0 -8
  301. package/lib/routes/gateway/stop.ts +0 -21
  302. package/lib/routes/profiles/add.help.ts +0 -3
  303. package/lib/routes/profiles/add.ts +0 -33
  304. package/lib/routes/profiles/group.help.ts +0 -16
  305. package/lib/routes/profiles/group.ts +0 -25
  306. package/lib/routes/profiles/launch.help.ts +0 -4
  307. package/lib/routes/profiles/launch.ts +0 -36
  308. package/lib/routes/profiles/remove.help.ts +0 -3
  309. package/lib/routes/profiles/remove.ts +0 -17
  310. package/lib/routes/profiles/rename.help.ts +0 -5
  311. package/lib/routes/profiles/rename.ts +0 -17
  312. package/lib/routes/profiles/routes.ts +0 -18
  313. package/lib/routes/profiles/set.help.ts +0 -5
  314. package/lib/routes/profiles/set.ts +0 -32
  315. package/lib/routes/repos/add.help.ts +0 -6
  316. package/lib/routes/repos/add.ts +0 -20
  317. package/lib/routes/repos/group.help.ts +0 -11
  318. package/lib/routes/repos/group.ts +0 -18
  319. package/lib/routes/repos/remove.help.ts +0 -3
  320. package/lib/routes/repos/remove.ts +0 -17
  321. package/lib/routes/repos/rename.help.ts +0 -5
  322. package/lib/routes/repos/rename.ts +0 -17
  323. package/lib/routes/repos/routes.ts +0 -17
  324. package/lib/routes/repos/set.help.ts +0 -5
  325. package/lib/routes/repos/set.ts +0 -21
  326. package/lib/routes/repos/show.help.ts +0 -1
  327. package/lib/routes/repos/show.ts +0 -19
  328. package/lib/routes/request/discord-help.ts +0 -9
  329. package/lib/routes/request/discord.help.ts +0 -19
  330. package/lib/routes/request/discord.ts +0 -65
  331. package/lib/routes/request/group.help.ts +0 -15
  332. package/lib/routes/request/group.ts +0 -9
  333. package/lib/routes/request/routes.ts +0 -14
  334. package/lib/routes/request/slack-help.ts +0 -9
  335. package/lib/routes/request/slack.help.ts +0 -19
  336. package/lib/routes/request/slack.ts +0 -61
  337. package/lib/routes/status/routes.ts +0 -4
  338. package/lib/routes/status/status.help.ts +0 -6
  339. package/lib/routes/status/status.ts +0 -77
  340. package/lib/routes/update/routes.ts +0 -4
  341. package/lib/routes/update/update.help.ts +0 -5
  342. package/lib/routes/update/update.ts +0 -21
  343. package/lib/routes.ts +0 -40
  344. /package/lib/{factory.ts → cli/factory.ts} +0 -0
  345. /package/lib/{modules → cli}/router/query-to-cli-args.ts +0 -0
  346. /package/lib/{modules → cli}/router/validator.ts +0 -0
  347. /package/lib/{modules/connectors/funnel-connector-adapter.ts → connectors/connector-adapter.ts} +0 -0
  348. /package/lib/{modules/connectors/funnel-discord-event-processor.ts → connectors/discord-event-processor.ts} +0 -0
  349. /package/lib/{modules/http/funnel-http-client.ts → engine/http/http-client.ts} +0 -0
package/package.json CHANGED
@@ -1,65 +1,82 @@
1
1
  {
2
2
  "name": "@interactive-inc/claude-funnel",
3
- "version": "0.4.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
- "module": "lib/index.ts",
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"
24
+ },
27
25
  "bin": {
28
- "fnl": "./lib/index.ts",
29
- "funnel": "./lib/index.ts"
26
+ "fnl": "./dist/bin.js",
27
+ "funnel": "./dist/bin.js"
30
28
  },
31
29
  "files": [
32
30
  "lib/**/*.ts",
33
31
  "lib/**/*.tsx",
34
32
  "!lib/**/*.test.ts",
35
33
  "!lib/**/*.test.tsx",
34
+ "!lib/**/*.bun-test.ts",
35
+ "dist/**/*",
36
36
  "README.md",
37
37
  "LICENSE"
38
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
+ },
39
56
  "publishConfig": {
40
57
  "access": "public"
41
58
  },
42
- "engines": {
43
- "bun": ">=1.3.0"
44
- },
45
59
  "dependencies": {
46
60
  "@hono/zod-validator": "^0.7.6",
47
61
  "@modelcontextprotocol/sdk": "^1.29.0",
48
- "@opentui/core": "^0.1.97",
49
- "@opentui/react": "^0.1.97",
50
- "@slack/bolt": "^4.7.0",
51
- "@slack/web-api": "^7.15.0",
52
- "@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",
53
66
  "@types/react": "^19.2.14",
54
- "discord.js": "^14.26.3",
55
- "hono": "^4.12.12",
67
+ "discord.js": "^14.26.4",
68
+ "hono": "^4.12.16",
56
69
  "react": "^19.2.5",
57
- "yaml": "^2.8.3",
58
- "zod": "^4.3.6"
70
+ "yaml": "^2.8.4",
71
+ "zod": "^4.4.2"
59
72
  },
60
73
  "devDependencies": {
61
- "@types/bun": "^1.3.12",
62
- "@typescript/native-preview": "^7.0.0-dev.20260411.1",
63
- "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"
64
81
  }
65
82
  }
@@ -1,4 +0,0 @@
1
- export type ChannelConnectorRefUpdater = {
2
- renameRef(oldName: string, newName: string): void
3
- removeRef(connectorName: string): void
4
- }
@@ -1,155 +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
- export class FunnelChannels {
15
- private readonly store: FunnelSettingsReader
16
- private readonly connectorChecker: ConnectorExistenceChecker
17
- private readonly profileChecker: ProfileChannelChecker
18
- private readonly profileRefUpdater: ProfileChannelRefUpdater
19
-
20
- constructor(deps: Deps) {
21
- this.store = deps.store
22
- this.connectorChecker = deps.connectorChecker
23
- this.profileChecker = deps.profileChecker
24
- this.profileRefUpdater = deps.profileRefUpdater
25
- Object.freeze(this)
26
- }
27
-
28
- list(): ChannelConfig[] {
29
- return this.store.read().channels
30
- }
31
-
32
- get(name: string): ChannelConfig | null {
33
- return this.list().find((c) => c.name === name) ?? null
34
- }
35
-
36
- add(config: ChannelConfig): void {
37
- const settings = this.store.read()
38
-
39
- if (settings.channels.some((c) => c.name === config.name)) {
40
- throw new Error(`channel "${config.name}" already exists`)
41
- }
42
-
43
- for (const connectorName of config.connectors) {
44
- if (!this.connectorChecker.has(connectorName)) {
45
- throw new Error(`connector "${connectorName}" not found`)
46
- }
47
- }
48
-
49
- settings.channels.push(config)
50
-
51
- this.store.write(settings)
52
- }
53
-
54
- remove(name: string): void {
55
- const settings = this.store.read()
56
-
57
- const index = settings.channels.findIndex((c) => c.name === name)
58
-
59
- if (index < 0) throw new Error(`channel "${name}" not found`)
60
-
61
- if (this.profileChecker.hasChannelRef(name)) {
62
- throw new Error(`channel "${name}" is referenced by a profile`)
63
- }
64
-
65
- settings.channels.splice(index, 1)
66
-
67
- this.store.write(settings)
68
- }
69
-
70
- rename(oldName: string, newName: string): void {
71
- const settings = this.store.read()
72
-
73
- const channel = settings.channels.find((c) => c.name === oldName)
74
-
75
- if (!channel) throw new Error(`channel "${oldName}" not found`)
76
-
77
- if (settings.channels.some((c) => c.name === newName)) {
78
- throw new Error(`channel "${newName}" already exists`)
79
- }
80
-
81
- channel.name = newName
82
-
83
- this.store.write(settings)
84
-
85
- this.profileRefUpdater.renameChannelRef(oldName, newName)
86
- }
87
-
88
- attachConnector(name: string, connectorName: string): void {
89
- const settings = this.store.read()
90
-
91
- const channel = settings.channels.find((c) => c.name === name)
92
-
93
- if (!channel) throw new Error(`channel "${name}" not found`)
94
-
95
- if (!this.connectorChecker.has(connectorName)) {
96
- throw new Error(`connector "${connectorName}" not found`)
97
- }
98
-
99
- if (channel.connectors.includes(connectorName)) {
100
- throw new Error(`connector "${connectorName}" is already attached`)
101
- }
102
-
103
- channel.connectors.push(connectorName)
104
-
105
- this.store.write(settings)
106
- }
107
-
108
- detachConnector(name: string, connectorName: string): void {
109
- const settings = this.store.read()
110
-
111
- const channel = settings.channels.find((c) => c.name === name)
112
-
113
- if (!channel) throw new Error(`channel "${name}" not found`)
114
-
115
- const index = channel.connectors.indexOf(connectorName)
116
-
117
- if (index < 0) throw new Error(`connector "${connectorName}" is not attached`)
118
-
119
- channel.connectors.splice(index, 1)
120
-
121
- this.store.write(settings)
122
- }
123
-
124
- renameRef(oldName: string, newName: string): void {
125
- const settings = this.store.read()
126
- let changed = false
127
-
128
- for (const channel of settings.channels) {
129
- const i = channel.connectors.indexOf(oldName)
130
-
131
- if (i >= 0) {
132
- channel.connectors[i] = newName
133
- changed = true
134
- }
135
- }
136
-
137
- if (changed) this.store.write(settings)
138
- }
139
-
140
- removeRef(connectorName: string): void {
141
- const settings = this.store.read()
142
- let changed = false
143
-
144
- for (const channel of settings.channels) {
145
- const i = channel.connectors.indexOf(connectorName)
146
-
147
- if (i >= 0) {
148
- channel.connectors.splice(i, 1)
149
- changed = true
150
- }
151
- }
152
-
153
- if (changed) this.store.write(settings)
154
- }
155
- }
@@ -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,24 +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
-
7
- export type ConnectorStoresBundle = {
8
- slack: FunnelSlackStore
9
- gh: FunnelGhStore
10
- discord: FunnelDiscordStore
11
- schedule: FunnelScheduleStore
12
- }
13
-
14
- type Deps = {
15
- fs?: FunnelFileSystem
16
- dir?: string
17
- }
18
-
19
- export const createConnectorStores = (deps: Deps = {}): ConnectorStoresBundle => ({
20
- slack: new FunnelSlackStore(deps),
21
- gh: new FunnelGhStore(deps),
22
- discord: new FunnelDiscordStore(deps),
23
- schedule: new FunnelScheduleStore(deps),
24
- })
@@ -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,145 +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
- export class FunnelConnectors {
22
- private readonly slack: FunnelSlackStore
23
- private readonly gh: FunnelGhStore
24
- private readonly discord: FunnelDiscordStore
25
- private readonly schedule: FunnelScheduleStore
26
- private readonly refUpdater: ChannelConnectorRefUpdater
27
-
28
- constructor(deps: Deps) {
29
- this.slack = deps.slack
30
- this.gh = deps.gh
31
- this.discord = deps.discord
32
- this.schedule = deps.schedule
33
- this.refUpdater = deps.refUpdater
34
- Object.freeze(this)
35
- }
36
-
37
- list(): ConnectorConfig[] {
38
- return [
39
- ...this.slack.list(),
40
- ...this.gh.list(),
41
- ...this.discord.list(),
42
- ...this.schedule.list(),
43
- ]
44
- }
45
-
46
- get(name: string): ConnectorConfig | null {
47
- return (
48
- this.slack.get(name) ??
49
- this.gh.get(name) ??
50
- this.discord.get(name) ??
51
- this.schedule.get(name)
52
- )
53
- }
54
-
55
- has(name: string): boolean {
56
- return (
57
- this.slack.has(name) ||
58
- this.gh.has(name) ||
59
- this.discord.has(name) ||
60
- this.schedule.has(name)
61
- )
62
- }
63
-
64
- add(config: ConnectorConfig): void {
65
- if (this.has(config.name)) throw new Error(`connector "${config.name}" already exists`)
66
-
67
- if (config.type === "slack") return this.slack.add(config)
68
- if (config.type === "gh") return this.gh.add(config)
69
- if (config.type === "discord") return this.discord.add(config)
70
-
71
- return this.schedule.add(config)
72
- }
73
-
74
- updateSlack(name: string, fields: SlackUpdateFields): void {
75
- this.slack.update(name, fields)
76
- }
77
-
78
- updateGh(name: string, fields: GhUpdateFields): void {
79
- this.gh.update(name, fields)
80
- }
81
-
82
- updateDiscord(name: string, fields: DiscordUpdateFields): void {
83
- this.discord.update(name, fields)
84
- }
85
-
86
- remove(name: string): void {
87
- const current = this.get(name)
88
-
89
- if (!current) throw new Error(`connector "${name}" not found`)
90
-
91
- if (current.type === "slack") this.slack.remove(name)
92
- else if (current.type === "gh") this.gh.remove(name)
93
- else if (current.type === "discord") this.discord.remove(name)
94
- else this.schedule.remove(name)
95
-
96
- this.refUpdater.removeRef(name)
97
- }
98
-
99
- rename(oldName: string, newName: string): void {
100
- const current = this.get(oldName)
101
-
102
- if (!current) throw new Error(`connector "${oldName}" not found`)
103
- if (this.has(newName)) throw new Error(`connector "${newName}" already exists`)
104
-
105
- if (current.type === "slack") this.slack.rename(oldName, newName)
106
- else if (current.type === "gh") this.gh.rename(oldName, newName)
107
- else if (current.type === "discord") this.discord.rename(oldName, newName)
108
- else this.schedule.rename(oldName, newName)
109
-
110
- this.refUpdater.renameRef(oldName, newName)
111
- }
112
-
113
- async callSlack(name: string, input: CallInput): Promise<unknown> {
114
- const config = this.slack.get(name)
115
-
116
- if (!config) throw new Error(`slack connector "${name}" not found`)
117
-
118
- return await this.slack.createAdapter(config).call(input)
119
- }
120
-
121
- async callGh(name: string, input: CallInput): Promise<unknown> {
122
- const config = this.gh.get(name)
123
-
124
- if (!config) throw new Error(`gh connector "${name}" not found`)
125
-
126
- return await this.gh.createAdapter(config).call(input)
127
- }
128
-
129
- async callDiscord(name: string, input: CallInput): Promise<unknown> {
130
- const config = this.discord.get(name)
131
-
132
- if (!config) throw new Error(`discord connector "${name}" not found`)
133
-
134
- return await this.discord.createAdapter(config).call(input)
135
- }
136
-
137
- createListeners(): { config: ConnectorConfig; listener: FunnelConnectorListener }[] {
138
- return [
139
- ...this.slack.createAllListeners(),
140
- ...this.gh.createAllListeners(),
141
- ...this.discord.createAllListeners(),
142
- ...this.schedule.createAllListeners(),
143
- ]
144
- }
145
- }
@@ -1,65 +0,0 @@
1
- import { Client, GatewayIntentBits, Partials } from "discord.js"
2
- import {
3
- FunnelConnectorListener,
4
- type NotifyFn,
5
- } from "@/modules/connectors/funnel-connector-listener"
6
- import { FunnelDiscordEventProcessor } from "@/modules/connectors/funnel-discord-event-processor"
7
- import { logger } from "@/modules/logger"
8
- import type { DiscordConnectorConfig } from "@/modules/connectors/discord-connector-schema"
9
-
10
- type Deps = {
11
- config: DiscordConnectorConfig
12
- }
13
-
14
- export class FunnelDiscordListener extends FunnelConnectorListener {
15
- private readonly config: DiscordConnectorConfig
16
-
17
- constructor(deps: Deps) {
18
- super()
19
- this.config = deps.config
20
- Object.freeze(this)
21
- }
22
-
23
- async start(notify: NotifyFn): Promise<void> {
24
- const client = new Client({
25
- intents: [
26
- GatewayIntentBits.Guilds,
27
- GatewayIntentBits.GuildMessages,
28
- GatewayIntentBits.MessageContent,
29
- GatewayIntentBits.DirectMessages,
30
- ],
31
- partials: [Partials.Channel],
32
- })
33
-
34
- client.on("messageCreate", async (message) => {
35
- const processor = new FunnelDiscordEventProcessor({ ownUserId: client.user?.id ?? "" })
36
-
37
- const result = processor.process({
38
- authorId: message.author.id,
39
- authorIsBot: message.author.bot,
40
- channelId: message.channelId,
41
- guildId: message.guildId,
42
- mentionedUserIds: [...message.mentions.users.keys()],
43
- raw: message.toJSON(),
44
- })
45
-
46
- if (result.skip) return
47
-
48
- try {
49
- await notify(result.content, result.meta)
50
- } catch (error) {
51
- logger.error("discord notify error", {
52
- error: error instanceof Error ? error.message : String(error),
53
- })
54
- }
55
- })
56
-
57
- client.on("error", (error) => {
58
- logger.error("discord client error", {
59
- error: error instanceof Error ? error.message : String(error),
60
- })
61
- })
62
-
63
- await client.login(this.config.botToken)
64
- }
65
- }
@@ -1,84 +0,0 @@
1
- import { FunnelCallableConnectorStore } from "@/modules/connectors/funnel-callable-connector-store"
2
- import type { FunnelConnectorAdapter } from "@/modules/connectors/funnel-connector-adapter"
3
- import type { FunnelConnectorListener } from "@/modules/connectors/funnel-connector-listener"
4
- import {
5
- DEFAULT_FUNNEL_DIR,
6
- FunnelJsonConnectorStore,
7
- } from "@/modules/connectors/funnel-json-connector-store"
8
- import { FunnelDiscordAdapter } from "@/modules/connectors/funnel-discord-adapter"
9
- import { FunnelDiscordListener } from "@/modules/connectors/funnel-discord-listener"
10
- import {
11
- type DiscordConnectorConfig,
12
- discordConnectorSchema,
13
- } from "@/modules/connectors/discord-connector-schema"
14
- import { FunnelFileSystem } from "@/modules/fs/funnel-file-system"
15
-
16
- type Deps = {
17
- fs?: FunnelFileSystem
18
- dir?: string
19
- }
20
-
21
- export type DiscordUpdateFields = {
22
- botToken?: string
23
- }
24
-
25
- export class FunnelDiscordStore extends FunnelCallableConnectorStore<DiscordConnectorConfig> {
26
- readonly type = "discord" as const
27
- private readonly store: FunnelJsonConnectorStore<DiscordConnectorConfig>
28
-
29
- constructor(deps: Deps = {}) {
30
- super()
31
- this.store = new FunnelJsonConnectorStore<DiscordConnectorConfig>({
32
- type: "discord",
33
- schema: discordConnectorSchema,
34
- fs: deps.fs,
35
- dir: deps.dir ?? DEFAULT_FUNNEL_DIR,
36
- })
37
- Object.freeze(this)
38
- }
39
-
40
- list(): DiscordConnectorConfig[] {
41
- return this.store.list()
42
- }
43
-
44
- get(name: string): DiscordConnectorConfig | null {
45
- return this.store.get(name)
46
- }
47
-
48
- has(name: string): boolean {
49
- return this.store.has(name)
50
- }
51
-
52
- add(config: DiscordConnectorConfig): void {
53
- if (this.has(config.name)) throw new Error(`connector "${config.name}" already exists`)
54
-
55
- this.store.write(config)
56
- }
57
-
58
- update(name: string, fields: DiscordUpdateFields): void {
59
- const current = this.store.get(name)
60
-
61
- if (!current) throw new Error(`connector "${name}" not found`)
62
-
63
- this.store.write({
64
- ...current,
65
- botToken: fields.botToken ?? current.botToken,
66
- })
67
- }
68
-
69
- remove(name: string): void {
70
- this.store.remove(name)
71
- }
72
-
73
- rename(oldName: string, newName: string): void {
74
- this.store.rename(oldName, newName)
75
- }
76
-
77
- createListener(config: DiscordConnectorConfig): FunnelConnectorListener {
78
- return new FunnelDiscordListener({ config })
79
- }
80
-
81
- createAdapter(config: DiscordConnectorConfig): FunnelConnectorAdapter {
82
- return new FunnelDiscordAdapter({ config })
83
- }
84
- }