@interactive-inc/claude-funnel 0.7.1 → 0.8.1

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 (472) hide show
  1. package/README.md +155 -133
  2. package/dist/bin.js +1344 -0
  3. package/dist/cli/factory.d.ts +7 -0
  4. package/dist/cli/router/query-to-cli-args.d.ts +1 -0
  5. package/dist/cli/router/to-request.d.ts +5 -0
  6. package/dist/cli/router/validator.d.ts +5 -0
  7. package/dist/cli/routes/channels.$channel.connectors.$connector.d.ts +42 -0
  8. package/dist/cli/routes/channels.$channel.connectors.$connector.rename.$newName.d.ts +46 -0
  9. package/dist/cli/routes/channels.$channel.connectors.$connector.request.d.ts +54 -0
  10. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.add.$id.d.ts +66 -0
  11. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.d.ts +42 -0
  12. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.remove.$id.d.ts +46 -0
  13. package/dist/cli/routes/channels.$channel.connectors.add.$connector.d.ts +90 -0
  14. package/dist/cli/routes/channels.$channel.connectors.d.ts +38 -0
  15. package/dist/cli/routes/channels.$channel.connectors.remove.$connector.d.ts +42 -0
  16. package/dist/cli/routes/channels.$channel.connectors.set.$connector.d.ts +62 -0
  17. package/dist/cli/routes/channels.$channel.d.ts +38 -0
  18. package/dist/cli/routes/channels.$channel.rename.$newName.d.ts +42 -0
  19. package/dist/cli/routes/channels.$channel.set.delivery.$mode.d.ts +28 -0
  20. package/dist/cli/routes/channels.add.$channel.d.ts +46 -0
  21. package/dist/cli/routes/channels.d.ts +16 -0
  22. package/dist/cli/routes/channels.remove.$channel.d.ts +38 -0
  23. package/dist/cli/routes/claude.d.ts +32 -0
  24. package/dist/cli/routes/gateway.d.ts +20 -0
  25. package/dist/cli/routes/gateway.listeners.d.ts +17 -0
  26. package/dist/cli/routes/gateway.logs.d.ts +24 -0
  27. package/dist/cli/routes/gateway.restart.d.ts +24 -0
  28. package/dist/cli/routes/gateway.run.d.ts +24 -0
  29. package/dist/cli/routes/gateway.start.d.ts +24 -0
  30. package/dist/cli/routes/gateway.status.d.ts +13 -0
  31. package/dist/cli/routes/gateway.stop.d.ts +16 -0
  32. package/dist/cli/routes/index.d.ts +1222 -0
  33. package/dist/cli/routes/profiles.$profile.as-default.d.ts +38 -0
  34. package/dist/cli/routes/profiles.$profile.rename.$newName.d.ts +42 -0
  35. package/dist/cli/routes/profiles.$profile.run.d.ts +46 -0
  36. package/dist/cli/routes/profiles.add.$profile.d.ts +54 -0
  37. package/dist/cli/routes/profiles.d.ts +16 -0
  38. package/dist/cli/routes/profiles.remove.$profile.d.ts +38 -0
  39. package/dist/cli/routes/profiles.set.$profile.d.ts +54 -0
  40. package/dist/cli/routes/status.d.ts +16 -0
  41. package/dist/cli/routes/update.d.ts +16 -0
  42. package/dist/connectors/connector-adapter.d.ts +8 -0
  43. package/dist/connectors/connector-config-schema.d.ts +43 -0
  44. package/dist/connectors/connector-factory.d.ts +32 -0
  45. package/dist/connectors/connector-listener.d.ts +17 -0
  46. package/dist/connectors/discord-adapter.d.ts +14 -0
  47. package/dist/connectors/discord-connector-schema.d.ts +10 -0
  48. package/dist/connectors/discord-event-processor.d.ts +26 -0
  49. package/dist/connectors/discord-listener.d.ts +17 -0
  50. package/dist/connectors/gh-adapter.d.ts +11 -0
  51. package/dist/connectors/gh-connector-schema.d.ts +10 -0
  52. package/dist/connectors/gh-listener.d.ts +26 -0
  53. package/dist/connectors/match-cron.d.ts +1 -0
  54. package/dist/connectors/schedule-connector-schema.d.ts +45 -0
  55. package/dist/connectors/schedule-listener.d.ts +30 -0
  56. package/dist/connectors/schedule-state-store.d.ts +19 -0
  57. package/dist/connectors/slack-adapter.d.ts +15 -0
  58. package/dist/connectors/slack-connector-schema.d.ts +11 -0
  59. package/dist/connectors/slack-event-processor.d.ts +27 -0
  60. package/dist/connectors/slack-listener.d.ts +17 -0
  61. package/dist/engine/channels/channels.d.ts +106 -0
  62. package/dist/engine/claude/claude.d.ts +49 -0
  63. package/dist/engine/claude/gateway-controller.d.ts +6 -0
  64. package/dist/engine/fs/file-system.d.ts +24 -0
  65. package/dist/engine/fs/memory-file-system.d.ts +31 -0
  66. package/dist/engine/fs/node-file-system.d.ts +15 -0
  67. package/dist/engine/http/http-client.d.ts +15 -0
  68. package/dist/engine/http/memory-http-client.d.ts +12 -0
  69. package/dist/engine/http/node-http-client.d.ts +5 -0
  70. package/dist/engine/id/id-generator.d.ts +7 -0
  71. package/dist/engine/id/memory-id-generator.d.ts +11 -0
  72. package/dist/engine/id/node-id-generator.d.ts +4 -0
  73. package/dist/engine/logger/logger.d.ts +11 -0
  74. package/dist/engine/logger/memory-logger.d.ts +14 -0
  75. package/dist/engine/logger/node-logger.d.ts +15 -0
  76. package/dist/engine/logger/noop-logger.d.ts +7 -0
  77. package/dist/engine/mcp/channel-server.d.ts +1 -0
  78. package/dist/engine/mcp/mcp.d.ts +22 -0
  79. package/dist/engine/process/memory-process-runner.d.ts +43 -0
  80. package/dist/engine/process/node-process-runner.d.ts +9 -0
  81. package/dist/engine/process/process-runner.d.ts +29 -0
  82. package/dist/engine/profiles/profile-channel-checker.d.ts +7 -0
  83. package/dist/engine/profiles/profiles.d.ts +31 -0
  84. package/dist/engine/settings/mock-settings-reader.d.ts +9 -0
  85. package/dist/engine/settings/settings-reader.d.ts +5 -0
  86. package/dist/engine/settings/settings-schema.d.ts +132 -0
  87. package/dist/engine/settings/settings-store.d.ts +18 -0
  88. package/dist/engine/time/clock.d.ts +9 -0
  89. package/dist/engine/time/memory-clock.d.ts +12 -0
  90. package/dist/engine/time/node-clock.d.ts +4 -0
  91. package/dist/funnel.d.ts +95 -0
  92. package/dist/gateway/auth-middleware.d.ts +14 -0
  93. package/dist/gateway/broadcaster.d.ts +122 -0
  94. package/dist/gateway/daemon.d.ts +2 -0
  95. package/dist/gateway/daemon.js +485 -0
  96. package/dist/gateway/factory.d.ts +7 -0
  97. package/dist/gateway/funnel-event-store.d.ts +81 -0
  98. package/dist/gateway/gateway-server.d.ts +94 -0
  99. package/dist/gateway/gateway-token.d.ts +33 -0
  100. package/dist/gateway/gateway.d.ts +58 -0
  101. package/dist/gateway/kill-competing-slack-gateways.d.ts +9 -0
  102. package/dist/gateway/listener-supervisor.d.ts +85 -0
  103. package/dist/gateway/listeners-client.d.ts +53 -0
  104. package/dist/gateway/resolve-daemon-script.d.ts +11 -0
  105. package/dist/gateway/routes/channels.connectors.call.d.ts +41 -0
  106. package/dist/gateway/routes/health.d.ts +17 -0
  107. package/dist/gateway/routes/index.d.ts +209 -0
  108. package/dist/gateway/routes/listeners.list.d.ts +14 -0
  109. package/dist/gateway/routes/listeners.restart.d.ts +34 -0
  110. package/dist/gateway/routes/listeners.start.d.ts +34 -0
  111. package/dist/gateway/routes/listeners.stop.d.ts +34 -0
  112. package/dist/gateway/routes/route-deps.d.ts +10 -0
  113. package/dist/gateway/routes/status.d.ts +30 -0
  114. package/dist/gateway/routes/validator.d.ts +19 -0
  115. package/dist/highlights-eq9cgrbb.scm +604 -0
  116. package/dist/highlights-ghv9g403.scm +205 -0
  117. package/dist/highlights-hk7bwhj4.scm +284 -0
  118. package/dist/highlights-r812a2qc.scm +150 -0
  119. package/dist/highlights-x6tmsnaa.scm +115 -0
  120. package/dist/index.d.ts +36 -0
  121. package/dist/index.js +3575 -0
  122. package/dist/injections-73j83es3.scm +27 -0
  123. package/dist/logger/leuco-human-file-writer.d.ts +33 -0
  124. package/dist/logger/leuco-human-logger.d.ts +46 -0
  125. package/dist/logger/leuco-human-record.d.ts +15 -0
  126. package/dist/logger/leuco-human-stdout-writer.d.ts +20 -0
  127. package/dist/logger/leuco-human-writer.d.ts +13 -0
  128. package/dist/logger/leuco-logger-memory-sink.d.ts +33 -0
  129. package/dist/logger/leuco-logger-record.d.ts +13 -0
  130. package/dist/logger/leuco-logger-sink.d.ts +34 -0
  131. package/dist/logger/leuco-logger-sqlite-sink.d.ts +102 -0
  132. package/dist/logger/leuco-logger.d.ts +56 -0
  133. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  134. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  135. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  136. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  137. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  138. package/lib/bin.ts +78 -0
  139. package/lib/{modules → cli}/router/to-request.ts +13 -20
  140. package/lib/cli/routes/channels.$channel.connectors.$connector.rename.$newName.ts +27 -0
  141. package/lib/cli/routes/channels.$channel.connectors.$connector.request.ts +40 -0
  142. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.add.$id.ts +41 -0
  143. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.remove.$id.ts +22 -0
  144. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.ts +23 -0
  145. package/lib/cli/routes/channels.$channel.connectors.$connector.ts +26 -0
  146. package/lib/cli/routes/channels.$channel.connectors.add.$connector.ts +92 -0
  147. package/lib/cli/routes/channels.$channel.connectors.remove.$connector.ts +22 -0
  148. package/lib/cli/routes/channels.$channel.connectors.set.$connector.ts +63 -0
  149. package/lib/cli/routes/channels.$channel.connectors.ts +26 -0
  150. package/lib/cli/routes/channels.$channel.rename.$newName.ts +22 -0
  151. package/lib/cli/routes/channels.$channel.set.delivery.$mode.ts +34 -0
  152. package/lib/cli/routes/channels.$channel.ts +34 -0
  153. package/lib/cli/routes/channels.add.$channel.ts +33 -0
  154. package/lib/cli/routes/channels.remove.$channel.ts +20 -0
  155. package/lib/cli/routes/channels.ts +39 -0
  156. package/lib/cli/routes/claude.ts +69 -0
  157. package/lib/cli/routes/gateway.listeners.ts +41 -0
  158. package/lib/cli/routes/gateway.logs.ts +123 -0
  159. package/lib/{routes/gateway/restart.ts → cli/routes/gateway.restart.ts} +20 -5
  160. package/lib/cli/routes/gateway.run.ts +41 -0
  161. package/lib/cli/routes/gateway.start.ts +50 -0
  162. package/lib/cli/routes/gateway.status.ts +19 -0
  163. package/lib/cli/routes/gateway.stop.ts +32 -0
  164. package/lib/cli/routes/gateway.ts +55 -0
  165. package/lib/cli/routes/index.ts +202 -0
  166. package/lib/cli/routes/profiles.$profile.as-default.ts +22 -0
  167. package/lib/cli/routes/profiles.$profile.rename.$newName.ts +22 -0
  168. package/lib/cli/routes/profiles.$profile.run.ts +36 -0
  169. package/lib/cli/routes/profiles.add.$profile.ts +46 -0
  170. package/lib/cli/routes/profiles.remove.$profile.ts +20 -0
  171. package/lib/cli/routes/profiles.set.$profile.ts +46 -0
  172. package/lib/cli/routes/profiles.ts +40 -0
  173. package/lib/cli/routes/status.ts +93 -0
  174. package/lib/cli/routes/update.ts +27 -0
  175. package/lib/connectors/connector-config-schema.ts +16 -0
  176. package/lib/connectors/connector-factory.ts +94 -0
  177. package/lib/connectors/connector-listener.ts +20 -0
  178. package/lib/{modules/connectors/funnel-discord-adapter.ts → connectors/discord-adapter.ts} +6 -11
  179. package/lib/{modules/connectors → connectors}/discord-connector-schema.ts +4 -1
  180. package/lib/connectors/discord-listener.ts +111 -0
  181. package/lib/{modules/connectors/funnel-gh-adapter.ts → connectors/gh-adapter.ts} +3 -6
  182. package/lib/{modules/connectors → connectors}/gh-connector-schema.ts +4 -1
  183. package/lib/{modules/connectors/funnel-gh-listener.ts → connectors/gh-listener.ts} +45 -19
  184. package/lib/{modules/connectors → connectors}/match-cron.ts +10 -4
  185. package/lib/connectors/schedule-connector-schema.ts +33 -0
  186. package/lib/connectors/schedule-listener.ts +207 -0
  187. package/lib/connectors/schedule-state-store.ts +54 -0
  188. package/lib/connectors/slack-adapter.ts +36 -0
  189. package/lib/{modules/connectors → connectors}/slack-connector-schema.ts +4 -1
  190. package/lib/{modules/connectors/funnel-slack-event-processor.ts → connectors/slack-event-processor.ts} +15 -9
  191. package/lib/{modules/connectors/funnel-slack-listener.ts → connectors/slack-listener.ts} +33 -14
  192. package/lib/engine/channels/channels.ts +520 -0
  193. package/lib/{modules/claude/funnel-claude.ts → engine/claude/claude.ts} +28 -55
  194. package/lib/engine/claude/gateway-controller.ts +4 -0
  195. package/lib/{modules/fs/funnel-file-system.ts → engine/fs/file-system.ts} +4 -0
  196. package/lib/{modules/fs/memory-funnel-file-system.ts → engine/fs/memory-file-system.ts} +20 -3
  197. package/lib/{modules/fs/node-funnel-file-system.ts → engine/fs/node-file-system.ts} +14 -2
  198. package/lib/{modules/http/memory-funnel-http-client.ts → engine/http/memory-http-client.ts} +1 -5
  199. package/lib/{modules/http/node-funnel-http-client.ts → engine/http/node-http-client.ts} +1 -5
  200. package/lib/{modules/id/memory-funnel-id-generator.ts → engine/id/memory-id-generator.ts} +1 -1
  201. package/lib/{modules/id/node-funnel-id-generator.ts → engine/id/node-id-generator.ts} +1 -1
  202. package/lib/{modules/logger/memory-funnel-logger.ts → engine/logger/memory-logger.ts} +1 -1
  203. package/lib/{modules/logger/node-funnel-logger.ts → engine/logger/node-logger.ts} +1 -1
  204. package/lib/{modules/logger/noop-funnel-logger.ts → engine/logger/noop-logger.ts} +1 -1
  205. package/lib/engine/mcp/channel-server.ts +204 -0
  206. package/lib/{modules/mcp/funnel-mcp.ts → engine/mcp/mcp.ts} +24 -10
  207. package/lib/{modules/process/memory-funnel-process-runner.ts → engine/process/memory-process-runner.ts} +1 -1
  208. package/lib/{modules/process/node-funnel-process-runner.ts → engine/process/node-process-runner.ts} +12 -21
  209. package/lib/engine/profiles/profile-channel-checker.ts +7 -0
  210. package/lib/{modules/profiles/funnel-profiles.ts → engine/profiles/profiles.ts} +41 -43
  211. package/lib/{modules/settings/mock-funnel-settings-reader.ts → engine/settings/mock-settings-reader.ts} +4 -3
  212. package/lib/{modules/settings/funnel-settings-reader.ts → engine/settings/settings-reader.ts} +1 -1
  213. package/lib/engine/settings/settings-schema.ts +46 -0
  214. package/lib/engine/settings/settings-store.ts +110 -0
  215. package/lib/{modules/time/memory-funnel-clock.ts → engine/time/memory-clock.ts} +1 -1
  216. package/lib/{modules/time/node-funnel-clock.ts → engine/time/node-clock.ts} +1 -1
  217. package/lib/funnel.ts +83 -78
  218. package/lib/gateway/auth-middleware.ts +44 -0
  219. package/lib/gateway/broadcaster.ts +319 -0
  220. package/lib/gateway/daemon.ts +47 -0
  221. package/lib/gateway/factory.ts +10 -0
  222. package/lib/gateway/funnel-event-store.ts +155 -0
  223. package/lib/gateway/gateway-server.ts +414 -0
  224. package/lib/gateway/gateway-token.ts +79 -0
  225. package/lib/{modules/gateway/funnel-gateway.ts → gateway/gateway.ts} +27 -13
  226. package/lib/{modules/gateway → gateway}/kill-competing-slack-gateways.ts +4 -4
  227. package/lib/gateway/listener-supervisor.ts +339 -0
  228. package/lib/gateway/listeners-client.ts +128 -0
  229. package/lib/gateway/resolve-daemon-script.ts +26 -0
  230. package/lib/gateway/routes/channels.connectors.call.ts +39 -0
  231. package/lib/gateway/routes/health.ts +13 -0
  232. package/lib/gateway/routes/index.ts +24 -0
  233. package/lib/gateway/routes/listeners.list.ts +6 -0
  234. package/lib/gateway/routes/listeners.restart.ts +15 -0
  235. package/lib/gateway/routes/listeners.start.ts +15 -0
  236. package/lib/gateway/routes/listeners.stop.ts +15 -0
  237. package/lib/gateway/routes/route-deps.ts +11 -0
  238. package/lib/gateway/routes/status.ts +15 -0
  239. package/lib/gateway/routes/validator.ts +17 -0
  240. package/lib/index.ts +52 -92
  241. package/lib/logger/leuco-human-file-writer.ts +65 -0
  242. package/lib/logger/leuco-human-logger.ts +98 -0
  243. package/lib/logger/leuco-human-record.ts +16 -0
  244. package/lib/logger/leuco-human-stdout-writer.ts +26 -0
  245. package/lib/logger/leuco-human-writer.ts +14 -0
  246. package/lib/logger/leuco-logger-memory-sink.ts +67 -0
  247. package/lib/logger/leuco-logger-record.ts +13 -0
  248. package/lib/logger/leuco-logger-sink.ts +33 -0
  249. package/lib/logger/leuco-logger-sqlite-sink.ts +355 -0
  250. package/lib/logger/leuco-logger.ts +135 -0
  251. package/lib/tui/app.tsx +357 -0
  252. package/lib/tui/components/add-row.tsx +18 -0
  253. package/lib/tui/components/brand.tsx +27 -0
  254. package/lib/tui/components/card.tsx +44 -0
  255. package/lib/tui/components/detail-bar.tsx +46 -0
  256. package/lib/tui/components/editable-field.tsx +33 -0
  257. package/lib/tui/components/empty-state.tsx +11 -0
  258. package/lib/tui/components/gateway-status.tsx +66 -0
  259. package/lib/tui/components/keymap.tsx +29 -0
  260. package/lib/tui/components/menu-item.tsx +73 -0
  261. package/lib/tui/components/menu.tsx +26 -0
  262. package/lib/tui/components/panel-header.tsx +22 -0
  263. package/lib/tui/components/readonly-field.tsx +18 -0
  264. package/lib/tui/components/section-header.tsx +25 -0
  265. package/lib/tui/components/selection-accent.tsx +32 -0
  266. package/lib/tui/components/session-item.tsx +33 -0
  267. package/lib/tui/components/session-list.tsx +33 -0
  268. package/lib/tui/components/ui/hascii/accordion-item.tsx +88 -0
  269. package/lib/tui/components/ui/hascii/accordion.tsx +96 -0
  270. package/lib/tui/components/ui/hascii/alert-dialog.tsx +43 -0
  271. package/lib/tui/components/ui/hascii/badge.tsx +51 -0
  272. package/lib/tui/components/ui/hascii/breadcrumb.tsx +58 -0
  273. package/lib/tui/components/ui/hascii/button.tsx +194 -0
  274. package/lib/tui/components/ui/hascii/card-content.tsx +14 -0
  275. package/lib/tui/components/ui/hascii/card-description.tsx +13 -0
  276. package/lib/tui/components/ui/hascii/card-footer.tsx +14 -0
  277. package/lib/tui/components/ui/hascii/card-header.tsx +14 -0
  278. package/lib/tui/components/ui/hascii/card-title.tsx +13 -0
  279. package/lib/tui/components/ui/hascii/card.tsx +27 -0
  280. package/lib/tui/components/ui/hascii/checkbox.tsx +65 -0
  281. package/lib/tui/components/ui/hascii/command.tsx +159 -0
  282. package/lib/tui/components/ui/hascii/dialog-content.tsx +14 -0
  283. package/lib/tui/components/ui/hascii/dialog-description.tsx +13 -0
  284. package/lib/tui/components/ui/hascii/dialog-footer.tsx +14 -0
  285. package/lib/tui/components/ui/hascii/dialog-header.tsx +14 -0
  286. package/lib/tui/components/ui/hascii/dialog-title.tsx +13 -0
  287. package/lib/tui/components/ui/hascii/dialog.tsx +27 -0
  288. package/lib/tui/components/ui/hascii/file-tree.tsx +142 -0
  289. package/lib/tui/components/ui/hascii/focus-group.tsx +62 -0
  290. package/lib/tui/components/ui/hascii/form-item.tsx +43 -0
  291. package/lib/tui/components/ui/hascii/input-otp.tsx +86 -0
  292. package/lib/tui/components/ui/hascii/input.tsx +130 -0
  293. package/lib/tui/components/ui/hascii/pagination.tsx +105 -0
  294. package/lib/tui/components/ui/hascii/progress.tsx +28 -0
  295. package/lib/tui/components/ui/hascii/select.tsx +131 -0
  296. package/lib/tui/components/ui/hascii/separator.tsx +35 -0
  297. package/lib/tui/components/ui/hascii/sidebar-content.tsx +23 -0
  298. package/lib/tui/components/ui/hascii/sidebar-header.tsx +14 -0
  299. package/lib/tui/components/ui/hascii/sidebar-menu-item.tsx +67 -0
  300. package/lib/tui/components/ui/hascii/sidebar.tsx +24 -0
  301. package/lib/tui/components/ui/hascii/skeleton.tsx +60 -0
  302. package/lib/tui/components/ui/hascii/slider.tsx +91 -0
  303. package/lib/tui/components/ui/hascii/snackbar.tsx +75 -0
  304. package/lib/tui/components/ui/hascii/sparkline.tsx +53 -0
  305. package/lib/tui/components/ui/hascii/spinner.tsx +47 -0
  306. package/lib/tui/components/ui/hascii/stepper.tsx +54 -0
  307. package/lib/tui/components/ui/hascii/switch.tsx +66 -0
  308. package/lib/tui/components/ui/hascii/table.tsx +95 -0
  309. package/lib/tui/components/ui/hascii/tabs.tsx +59 -0
  310. package/lib/tui/components/ui/hascii/toggle-group-item.tsx +45 -0
  311. package/lib/tui/components/ui/hascii/toggle-group.tsx +99 -0
  312. package/lib/tui/components/ui/hascii/tree.tsx +104 -0
  313. package/lib/tui/components/view-shell.tsx +44 -0
  314. package/lib/tui/filter-input.tsx +33 -0
  315. package/lib/tui/hooks/hascii/use-pressable.ts +54 -0
  316. package/lib/tui/parse-comma-list.ts +14 -0
  317. package/lib/tui/profile-launcher.tsx +61 -0
  318. package/lib/tui/scrollbar-options.ts +19 -0
  319. package/lib/tui/sidebar.tsx +50 -0
  320. package/lib/tui/theme.ts +40 -0
  321. package/lib/tui/tui.tsx +20 -0
  322. package/lib/tui/types.ts +38 -0
  323. package/lib/tui/unique-name.ts +18 -0
  324. package/lib/tui/use-event-stream.ts +133 -0
  325. package/lib/tui/use-snapshot.ts +99 -0
  326. package/lib/tui/utils/hascii/form-item-context.tsx +23 -0
  327. package/lib/tui/utils/hascii/input-focus-context.tsx +31 -0
  328. package/lib/tui/utils/hascii/theme-context.tsx +26 -0
  329. package/lib/tui/utils/hascii/theme.ts +176 -0
  330. package/lib/tui/views/channels-view.tsx +108 -0
  331. package/lib/tui/views/connectors-view.tsx +164 -0
  332. package/lib/tui/views/events-view.tsx +160 -0
  333. package/lib/tui/views/listeners-view.tsx +80 -0
  334. package/lib/tui/views/profiles-view.tsx +152 -0
  335. package/package.json +55 -44
  336. package/lib/api.ts +0 -54
  337. package/lib/modules/channels/channel-connector-ref-updater.ts +0 -4
  338. package/lib/modules/channels/funnel-channels.ts +0 -160
  339. package/lib/modules/connectors/connector-config-schema.ts +0 -16
  340. package/lib/modules/connectors/connector-existence-checker.ts +0 -3
  341. package/lib/modules/connectors/funnel-callable-connector-store.ts +0 -9
  342. package/lib/modules/connectors/funnel-connector-listener.ts +0 -5
  343. package/lib/modules/connectors/funnel-connector-stores.ts +0 -52
  344. package/lib/modules/connectors/funnel-connector-type-store.ts +0 -24
  345. package/lib/modules/connectors/funnel-connectors.ts +0 -151
  346. package/lib/modules/connectors/funnel-discord-listener.ts +0 -71
  347. package/lib/modules/connectors/funnel-discord-store.ts +0 -88
  348. package/lib/modules/connectors/funnel-gh-store.ts +0 -101
  349. package/lib/modules/connectors/funnel-json-connector-store.ts +0 -100
  350. package/lib/modules/connectors/funnel-schedule-listener.ts +0 -130
  351. package/lib/modules/connectors/funnel-schedule-store.ts +0 -195
  352. package/lib/modules/connectors/funnel-slack-adapter.ts +0 -31
  353. package/lib/modules/connectors/funnel-slack-store.ts +0 -90
  354. package/lib/modules/connectors/migrate-legacy-connectors.ts +0 -81
  355. package/lib/modules/connectors/schedule-connector-schema.ts +0 -18
  356. package/lib/modules/connectors/schedule-last-fired-store.ts +0 -48
  357. package/lib/modules/gateway/daemon.ts +0 -74
  358. package/lib/modules/gateway/funnel-broadcaster.ts +0 -37
  359. package/lib/modules/gateway/funnel-event-logger.ts +0 -59
  360. package/lib/modules/gateway/funnel-gateway-server.ts +0 -241
  361. package/lib/modules/mcp/channel-server.ts +0 -76
  362. package/lib/modules/profiles/profile-channel-checker.ts +0 -3
  363. package/lib/modules/profiles/profile-channel-ref-updater.ts +0 -3
  364. package/lib/modules/repos/funnel-repositories.ts +0 -112
  365. package/lib/modules/schedule/funnel-schedule.ts +0 -39
  366. package/lib/modules/settings/funnel-settings-store.ts +0 -56
  367. package/lib/modules/settings/settings-schema.ts +0 -33
  368. package/lib/modules/tui/app.tsx +0 -44
  369. package/lib/modules/tui/tui.tsx +0 -13
  370. package/lib/routes/channels/add.help.ts +0 -3
  371. package/lib/routes/channels/add.ts +0 -21
  372. package/lib/routes/channels/connectors-attach.help.ts +0 -3
  373. package/lib/routes/channels/connectors-attach.ts +0 -17
  374. package/lib/routes/channels/connectors-detach.help.ts +0 -3
  375. package/lib/routes/channels/connectors-detach.ts +0 -17
  376. package/lib/routes/channels/group.help.ts +0 -16
  377. package/lib/routes/channels/group.ts +0 -22
  378. package/lib/routes/channels/remove.help.ts +0 -3
  379. package/lib/routes/channels/remove.ts +0 -17
  380. package/lib/routes/channels/rename.help.ts +0 -5
  381. package/lib/routes/channels/rename.ts +0 -17
  382. package/lib/routes/channels/routes.ts +0 -19
  383. package/lib/routes/channels/show.help.ts +0 -1
  384. package/lib/routes/channels/show.ts +0 -26
  385. package/lib/routes/claude/claude.help.ts +0 -16
  386. package/lib/routes/claude/claude.ts +0 -76
  387. package/lib/routes/claude/routes.ts +0 -4
  388. package/lib/routes/connectors/add.help.ts +0 -28
  389. package/lib/routes/connectors/add.ts +0 -64
  390. package/lib/routes/connectors/group.help.ts +0 -14
  391. package/lib/routes/connectors/group.ts +0 -18
  392. package/lib/routes/connectors/remove.help.ts +0 -3
  393. package/lib/routes/connectors/remove.ts +0 -17
  394. package/lib/routes/connectors/rename.help.ts +0 -5
  395. package/lib/routes/connectors/rename.ts +0 -17
  396. package/lib/routes/connectors/routes.ts +0 -23
  397. package/lib/routes/connectors/schedules-add.help.ts +0 -11
  398. package/lib/routes/connectors/schedules-add.ts +0 -33
  399. package/lib/routes/connectors/schedules-group.help.ts +0 -1
  400. package/lib/routes/connectors/schedules-group.ts +0 -38
  401. package/lib/routes/connectors/schedules-remove.help.ts +0 -3
  402. package/lib/routes/connectors/schedules-remove.ts +0 -17
  403. package/lib/routes/connectors/set.help.ts +0 -8
  404. package/lib/routes/connectors/set.ts +0 -72
  405. package/lib/routes/connectors/show.help.ts +0 -1
  406. package/lib/routes/connectors/show.ts +0 -41
  407. package/lib/routes/gateway/group.help.ts +0 -15
  408. package/lib/routes/gateway/group.ts +0 -28
  409. package/lib/routes/gateway/logs.help.ts +0 -13
  410. package/lib/routes/gateway/logs.ts +0 -102
  411. package/lib/routes/gateway/restart.help.ts +0 -10
  412. package/lib/routes/gateway/routes.ts +0 -18
  413. package/lib/routes/gateway/run.help.ts +0 -12
  414. package/lib/routes/gateway/run.ts +0 -35
  415. package/lib/routes/gateway/start.help.ts +0 -15
  416. package/lib/routes/gateway/start.ts +0 -32
  417. package/lib/routes/gateway/status.help.ts +0 -9
  418. package/lib/routes/gateway/status.ts +0 -28
  419. package/lib/routes/gateway/stop.help.ts +0 -8
  420. package/lib/routes/gateway/stop.ts +0 -21
  421. package/lib/routes/profiles/add.help.ts +0 -3
  422. package/lib/routes/profiles/add.ts +0 -33
  423. package/lib/routes/profiles/group.help.ts +0 -16
  424. package/lib/routes/profiles/group.ts +0 -25
  425. package/lib/routes/profiles/launch.help.ts +0 -4
  426. package/lib/routes/profiles/launch.ts +0 -36
  427. package/lib/routes/profiles/remove.help.ts +0 -3
  428. package/lib/routes/profiles/remove.ts +0 -17
  429. package/lib/routes/profiles/rename.help.ts +0 -5
  430. package/lib/routes/profiles/rename.ts +0 -17
  431. package/lib/routes/profiles/routes.ts +0 -18
  432. package/lib/routes/profiles/set.help.ts +0 -5
  433. package/lib/routes/profiles/set.ts +0 -32
  434. package/lib/routes/repos/add.help.ts +0 -6
  435. package/lib/routes/repos/add.ts +0 -20
  436. package/lib/routes/repos/group.help.ts +0 -11
  437. package/lib/routes/repos/group.ts +0 -18
  438. package/lib/routes/repos/remove.help.ts +0 -3
  439. package/lib/routes/repos/remove.ts +0 -17
  440. package/lib/routes/repos/rename.help.ts +0 -5
  441. package/lib/routes/repos/rename.ts +0 -17
  442. package/lib/routes/repos/routes.ts +0 -17
  443. package/lib/routes/repos/set.help.ts +0 -5
  444. package/lib/routes/repos/set.ts +0 -21
  445. package/lib/routes/repos/show.help.ts +0 -1
  446. package/lib/routes/repos/show.ts +0 -19
  447. package/lib/routes/request/discord-help.ts +0 -9
  448. package/lib/routes/request/discord.help.ts +0 -19
  449. package/lib/routes/request/discord.ts +0 -65
  450. package/lib/routes/request/group.help.ts +0 -15
  451. package/lib/routes/request/group.ts +0 -9
  452. package/lib/routes/request/routes.ts +0 -14
  453. package/lib/routes/request/slack-help.ts +0 -9
  454. package/lib/routes/request/slack.help.ts +0 -19
  455. package/lib/routes/request/slack.ts +0 -61
  456. package/lib/routes/status/routes.ts +0 -4
  457. package/lib/routes/status/status.help.ts +0 -6
  458. package/lib/routes/status/status.ts +0 -77
  459. package/lib/routes/update/routes.ts +0 -4
  460. package/lib/routes/update/update.help.ts +0 -5
  461. package/lib/routes/update/update.ts +0 -21
  462. package/lib/routes.ts +0 -40
  463. /package/lib/{factory.ts → cli/factory.ts} +0 -0
  464. /package/lib/{modules → cli}/router/query-to-cli-args.ts +0 -0
  465. /package/lib/{modules → cli}/router/validator.ts +0 -0
  466. /package/lib/{modules/connectors/funnel-connector-adapter.ts → connectors/connector-adapter.ts} +0 -0
  467. /package/lib/{modules/connectors/funnel-discord-event-processor.ts → connectors/discord-event-processor.ts} +0 -0
  468. /package/lib/{modules/http/funnel-http-client.ts → engine/http/http-client.ts} +0 -0
  469. /package/lib/{modules/id/funnel-id-generator.ts → engine/id/id-generator.ts} +0 -0
  470. /package/lib/{modules/logger/funnel-logger.ts → engine/logger/logger.ts} +0 -0
  471. /package/lib/{modules/process/funnel-process-runner.ts → engine/process/process-runner.ts} +0 -0
  472. /package/lib/{modules/time/funnel-clock.ts → engine/time/clock.ts} +0 -0
@@ -1,76 +0,0 @@
1
- import { HTTPException } from "hono/http-exception"
2
- import { z } from "zod"
3
- import { factory } from "@/factory"
4
- import { queryToCliArgs } from "@/modules/router/query-to-cli-args"
5
- import { zValidator } from "@/modules/router/validator"
6
- import { help } from "@/routes/claude/claude.help"
7
-
8
- const RESERVED_KEYS = ["profile", "channel", "repo", "sub-agent", "env-file"]
9
-
10
- const DEFAULT_PROFILE_NAME = "default"
11
-
12
- export const claudeHandler = factory.createHandlers(
13
- zValidator(
14
- "query",
15
- z
16
- .object({
17
- profile: z.string().optional(),
18
- channel: z.string().optional(),
19
- repo: z.string().optional(),
20
- "sub-agent": z.string().optional(),
21
- "env-file": z.string().optional(),
22
- })
23
- .passthrough(),
24
- help,
25
- ),
26
- async (c) => {
27
- const query = c.req.valid("query")
28
- const funnel = c.var.funnel
29
-
30
- if (query.profile) {
31
- const profile = funnel.profiles.get(query.profile)
32
-
33
- if (!profile) {
34
- throw new HTTPException(404, { message: `profile "${query.profile}" not found` })
35
- }
36
-
37
- const exitCode = await funnel.claude.launch({
38
- channel: query.channel ?? profile.channel,
39
- repo: query.repo ?? profile.repo,
40
- subAgent: query["sub-agent"] ?? profile.subAgent,
41
- envFiles: query["env-file"] ? [query["env-file"]] : profile.envFiles,
42
- userArgs: queryToCliArgs(c.req.url, RESERVED_KEYS),
43
- profileName: profile.name,
44
- })
45
-
46
- process.exit(exitCode)
47
- }
48
-
49
- if (query.channel) {
50
- const exitCode = await funnel.claude.launch({
51
- channel: query.channel,
52
- repo: query.repo,
53
- subAgent: query["sub-agent"],
54
- envFiles: query["env-file"] ? [query["env-file"]] : undefined,
55
- userArgs: queryToCliArgs(c.req.url, RESERVED_KEYS),
56
- })
57
-
58
- process.exit(exitCode)
59
- }
60
-
61
- const defaultProfile = funnel.profiles.get(DEFAULT_PROFILE_NAME) ?? funnel.profiles.list()[0]
62
-
63
- if (!defaultProfile) return c.text(help)
64
-
65
- const exitCode = await funnel.claude.launch({
66
- channel: defaultProfile.channel,
67
- repo: query.repo ?? defaultProfile.repo,
68
- subAgent: query["sub-agent"] ?? defaultProfile.subAgent,
69
- envFiles: query["env-file"] ? [query["env-file"]] : defaultProfile.envFiles,
70
- userArgs: queryToCliArgs(c.req.url, RESERVED_KEYS),
71
- profileName: defaultProfile.name,
72
- })
73
-
74
- process.exit(exitCode)
75
- },
76
- )
@@ -1,4 +0,0 @@
1
- import { factory } from "@/factory"
2
- import { claudeHandler } from "@/routes/claude/claude"
3
-
4
- export const claudeRoutes = factory.createApp().get("/", ...claudeHandler)
@@ -1,28 +0,0 @@
1
- export const help = `funnel connectors add — add a connector
2
-
3
- usage:
4
- funnel connectors add <name> --type slack --bot-token xoxb-... --app-token xapp-...
5
- funnel connectors add <name> --type gh [--poll-interval <seconds>]
6
- funnel connectors add <name> --type discord --bot-token <discord-bot-token>
7
- funnel connectors add <name> --type schedule
8
-
9
- slack (Socket Mode):
10
- --bot-token Slack Bot Token (starts with xoxb-)
11
- --app-token Slack App Token (starts with xapp-)
12
-
13
- gh (GitHub, gh CLI):
14
- --poll-interval polling interval for /notifications (seconds, default 60)
15
- note: uses the gh CLI (must be authenticated via gh auth login); no token required
16
-
17
- discord (Discord Gateway):
18
- --bot-token Discord Bot Token
19
-
20
- schedule (cron-driven prompts):
21
- no extra flags at connector level — add entries with:
22
- funnel connectors <name> schedules add --cron "* * * * *" --prompt "..."
23
-
24
- examples:
25
- funnel connectors add prod-slack --type slack --bot-token xoxb-... --app-token xapp-...
26
- funnel connectors add my-gh --type gh --poll-interval 30
27
- funnel connectors add my-discord --type discord --bot-token MTI...
28
- funnel connectors add my-cron --type schedule`
@@ -1,64 +0,0 @@
1
- import { z } from "zod"
2
- import { factory } from "@/factory"
3
- import { zValidator } from "@/modules/router/validator"
4
- import { help } from "@/routes/connectors/add.help"
5
-
6
- export const connectorsAddHandler = factory.createHandlers(
7
- zValidator("param", z.object({ name: z.string() })),
8
- zValidator(
9
- "query",
10
- z.discriminatedUnion("type", [
11
- z.object({
12
- type: z.literal("slack"),
13
- "bot-token": z.string().startsWith("xoxb-"),
14
- "app-token": z.string().startsWith("xapp-"),
15
- }),
16
- z.object({
17
- type: z.literal("gh"),
18
- "poll-interval": z.string().optional(),
19
- }),
20
- z.object({
21
- type: z.literal("discord"),
22
- "bot-token": z.string().min(10),
23
- }),
24
- z.object({
25
- type: z.literal("schedule"),
26
- }),
27
- ]),
28
- help,
29
- ),
30
- (c) => {
31
- const param = c.req.valid("param")
32
- const query = c.req.valid("query")
33
- const funnel = c.var.funnel
34
-
35
- if (query.type === "slack") {
36
- funnel.connectors.add({
37
- type: "slack",
38
- name: param.name,
39
- botToken: query["bot-token"],
40
- appToken: query["app-token"],
41
- })
42
- } else if (query.type === "gh") {
43
- funnel.connectors.add({
44
- type: "gh",
45
- name: param.name,
46
- pollInterval: query["poll-interval"] ? Number(query["poll-interval"]) : undefined,
47
- })
48
- } else if (query.type === "discord") {
49
- funnel.connectors.add({
50
- type: "discord",
51
- name: param.name,
52
- botToken: query["bot-token"],
53
- })
54
- } else {
55
- funnel.connectors.add({
56
- type: "schedule",
57
- name: param.name,
58
- entries: [],
59
- })
60
- }
61
-
62
- return c.text(`added connector "${param.name}"`)
63
- },
64
- )
@@ -1,14 +0,0 @@
1
- export const help = `funnel connectors — manage external connections (Slack, etc.)
2
-
3
- usage: funnel connectors [subcommand]
4
-
5
- subcommands:
6
- (none) list
7
- add <name> --type slack --bot-token <t> --app-token <t>
8
- remove <name>
9
- <name> show details
10
-
11
- examples:
12
- funnel connectors add prod-slack --type slack --bot-token xoxb-... --app-token xapp-...
13
- funnel connectors
14
- funnel connectors remove prod-slack`
@@ -1,18 +0,0 @@
1
- import { z } from "zod"
2
- import { factory } from "@/factory"
3
- import { zValidator } from "@/modules/router/validator"
4
- import { help } from "@/routes/connectors/group.help"
5
-
6
- export const connectorsGroupHandler = factory.createHandlers(
7
- zValidator("query", z.object({}), help),
8
- (c) => {
9
- const funnel = c.var.funnel
10
- const connectors = funnel.connectors.list()
11
-
12
- if (connectors.length === 0) return c.text("no connectors")
13
-
14
- const lines = connectors.map((con) => `${con.name} (${con.type})`)
15
-
16
- return c.text(lines.join("\n"))
17
- },
18
- )
@@ -1,3 +0,0 @@
1
- export const help = `funnel connectors remove — remove a connector
2
-
3
- usage: funnel connectors remove <name>`
@@ -1,17 +0,0 @@
1
- import { z } from "zod"
2
- import { factory } from "@/factory"
3
- import { zValidator } from "@/modules/router/validator"
4
- import { help } from "@/routes/connectors/remove.help"
5
-
6
- export const connectorsRemoveHandler = factory.createHandlers(
7
- zValidator("param", z.object({ name: z.string() })),
8
- zValidator("query", z.object({}), help),
9
- (c) => {
10
- const param = c.req.valid("param")
11
- const funnel = c.var.funnel
12
-
13
- funnel.connectors.remove(param.name)
14
-
15
- return c.text(`removed connector "${param.name}"`)
16
- },
17
- )
@@ -1,5 +0,0 @@
1
- export const help = `funnel connectors rename — rename a connector
2
-
3
- usage:
4
- funnel connectors rename <old> <new>
5
- funnel connectors <old> rename <new>`
@@ -1,17 +0,0 @@
1
- import { z } from "zod"
2
- import { factory } from "@/factory"
3
- import { zValidator } from "@/modules/router/validator"
4
- import { help } from "@/routes/connectors/rename.help"
5
-
6
- export const connectorsRenameHandler = factory.createHandlers(
7
- zValidator("param", z.object({ name: z.string(), newName: z.string() })),
8
- zValidator("query", z.object({}), help),
9
- (c) => {
10
- const param = c.req.valid("param")
11
- const funnel = c.var.funnel
12
-
13
- funnel.connectors.rename(param.name, param["newName"])
14
-
15
- return c.text(`renamed connector "${param.name}" to "${param["newName"]}"`)
16
- },
17
- )
@@ -1,23 +0,0 @@
1
- import { factory } from "@/factory"
2
- import { connectorsAddHandler } from "@/routes/connectors/add"
3
- import { connectorsGroupHandler } from "@/routes/connectors/group"
4
- import { connectorsRemoveHandler } from "@/routes/connectors/remove"
5
- import { connectorsRenameHandler } from "@/routes/connectors/rename"
6
- import { connectorsSchedulesAddHandler } from "@/routes/connectors/schedules-add"
7
- import { connectorsSchedulesGroupHandler } from "@/routes/connectors/schedules-group"
8
- import { connectorsSchedulesRemoveHandler } from "@/routes/connectors/schedules-remove"
9
- import { connectorsSetHandler } from "@/routes/connectors/set"
10
- import { connectorsShowHandler } from "@/routes/connectors/show"
11
-
12
- export const connectorsRoutes = factory
13
- .createApp()
14
- .get("/", ...connectorsGroupHandler)
15
- .put("/:name/rename/:newName", ...connectorsRenameHandler)
16
- .put("/rename/:name/:newName", ...connectorsRenameHandler)
17
- .post("/:name/schedules", ...connectorsSchedulesAddHandler)
18
- .get("/:name/schedules", ...connectorsSchedulesGroupHandler)
19
- .delete("/:name/schedules/:id", ...connectorsSchedulesRemoveHandler)
20
- .post("/:name", ...connectorsAddHandler)
21
- .put("/:name", ...connectorsSetHandler)
22
- .delete("/:name", ...connectorsRemoveHandler)
23
- .get("/:name", ...connectorsShowHandler)
@@ -1,11 +0,0 @@
1
- export const help = `funnel connectors <name> schedules add — add a schedule entry
2
-
3
- usage: funnel connectors <name> schedules add --cron "<expr>" --prompt "<text>" [--disabled]
4
-
5
- options:
6
- --cron 5-field cron expression (min hour dom month dow)
7
- --prompt prompt text delivered to subscribing channels when the cron fires
8
- --disabled create the entry in disabled state
9
-
10
- example:
11
- funnel connectors my-cron schedules add --cron "*/5 * * * *" --prompt "status check"`
@@ -1,33 +0,0 @@
1
- import { z } from "zod"
2
- import { factory } from "@/factory"
3
- import { matchCron } from "@/modules/connectors/match-cron"
4
- import { zValidator } from "@/modules/router/validator"
5
- import { help } from "@/routes/connectors/schedules-add.help"
6
-
7
- export const connectorsSchedulesAddHandler = factory.createHandlers(
8
- zValidator("param", z.object({ name: z.string() })),
9
- zValidator(
10
- "query",
11
- z.object({
12
- cron: z.string(),
13
- prompt: z.string(),
14
- disabled: z.string().optional(),
15
- }),
16
- help,
17
- ),
18
- (c) => {
19
- const param = c.req.valid("param")
20
- const query = c.req.valid("query")
21
- const funnel = c.var.funnel
22
-
23
- matchCron(query.cron, new Date())
24
-
25
- const entry = funnel.schedule.addEntry(param.name, {
26
- cron: query.cron,
27
- prompt: query.prompt,
28
- enabled: query.disabled !== "true",
29
- })
30
-
31
- return c.text(`added schedule entry "${entry.id}" to connector "${param.name}"`)
32
- },
33
- )
@@ -1 +0,0 @@
1
- export const help = `funnel connectors <name> schedules — list schedule entries`
@@ -1,38 +0,0 @@
1
- import { HTTPException } from "hono/http-exception"
2
- import { z } from "zod"
3
- import { factory } from "@/factory"
4
- import { zValidator } from "@/modules/router/validator"
5
- import { help } from "@/routes/connectors/schedules-group.help"
6
-
7
- export const connectorsSchedulesGroupHandler = factory.createHandlers(
8
- zValidator("param", z.object({ name: z.string() })),
9
- zValidator("query", z.object({}), help),
10
- (c) => {
11
- const param = c.req.valid("param")
12
- const funnel = c.var.funnel
13
- const connector = funnel.connectors.get(param.name)
14
-
15
- if (!connector) {
16
- throw new HTTPException(404, { message: `connector "${param.name}" not found` })
17
- }
18
-
19
- if (connector.type !== "schedule") {
20
- throw new HTTPException(400, {
21
- message: `connector "${param.name}" is type "${connector.type}", not "schedule"`,
22
- })
23
- }
24
-
25
- const entries = funnel.schedule.listEntries(param.name)
26
-
27
- if (entries.length === 0) return c.text("no schedule entries")
28
-
29
- const lines: string[] = []
30
-
31
- for (const entry of entries) {
32
- const status = entry.enabled ? "" : " (disabled)"
33
- lines.push(`${entry.id}${status} ${entry.cron} ${entry.prompt}`)
34
- }
35
-
36
- return c.text(lines.join("\n"))
37
- },
38
- )
@@ -1,3 +0,0 @@
1
- export const help = `funnel connectors <name> schedules remove — remove a schedule entry
2
-
3
- usage: funnel connectors <name> schedules remove <id>`
@@ -1,17 +0,0 @@
1
- import { z } from "zod"
2
- import { factory } from "@/factory"
3
- import { zValidator } from "@/modules/router/validator"
4
- import { help } from "@/routes/connectors/schedules-remove.help"
5
-
6
- export const connectorsSchedulesRemoveHandler = factory.createHandlers(
7
- zValidator("param", z.object({ name: z.string(), id: z.string() })),
8
- zValidator("query", z.object({}), help),
9
- (c) => {
10
- const param = c.req.valid("param")
11
- const funnel = c.var.funnel
12
-
13
- funnel.schedule.removeEntry(param.name, param.id)
14
-
15
- return c.text(`removed schedule entry "${param.id}" from connector "${param.name}"`)
16
- },
17
- )
@@ -1,8 +0,0 @@
1
- export const help = `funnel connectors <name> set — update a connector
2
-
3
- usage: funnel connectors <name> set [--bot-token ...] [--app-token ...] [--poll-interval ...]
4
-
5
- fields available per type:
6
- slack : --bot-token / --app-token
7
- gh : --poll-interval
8
- discord : --bot-token`
@@ -1,72 +0,0 @@
1
- import { HTTPException } from "hono/http-exception"
2
- import { z } from "zod"
3
- import { factory } from "@/factory"
4
- import { zValidator } from "@/modules/router/validator"
5
- import { help } from "@/routes/connectors/set.help"
6
-
7
- const SLACK_FIELDS = ["bot-token", "app-token"] as const
8
- const GH_FIELDS = ["poll-interval"] as const
9
- const DISCORD_FIELDS = ["bot-token"] as const
10
-
11
- const rejectExtraneous = (
12
- query: Record<string, string | undefined>,
13
- allowed: ReadonlyArray<string>,
14
- type: string,
15
- ): void => {
16
- for (const key of ["bot-token", "app-token", "poll-interval"]) {
17
- if (query[key] === undefined) continue
18
- if (allowed.includes(key)) continue
19
-
20
- throw new HTTPException(400, {
21
- message: `connector type "${type}" does not accept --${key}`,
22
- })
23
- }
24
- }
25
-
26
- export const connectorsSetHandler = factory.createHandlers(
27
- zValidator("param", z.object({ name: z.string() })),
28
- zValidator(
29
- "query",
30
- z.object({
31
- "bot-token": z.string().optional(),
32
- "app-token": z.string().optional(),
33
- "poll-interval": z.string().optional(),
34
- }),
35
- help,
36
- ),
37
- (c) => {
38
- const param = c.req.valid("param")
39
- const query = c.req.valid("query")
40
- const funnel = c.var.funnel
41
-
42
- const current = funnel.connectors.get(param.name)
43
-
44
- if (!current) {
45
- throw new HTTPException(404, { message: `connector "${param.name}" not found` })
46
- }
47
-
48
- if (current.type === "slack") {
49
- rejectExtraneous(query, SLACK_FIELDS, "slack")
50
- funnel.connectors.updateSlack(param.name, {
51
- botToken: query["bot-token"],
52
- appToken: query["app-token"],
53
- })
54
- } else if (current.type === "gh") {
55
- rejectExtraneous(query, GH_FIELDS, "gh")
56
- funnel.connectors.updateGh(param.name, {
57
- pollInterval: query["poll-interval"] ? Number(query["poll-interval"]) : undefined,
58
- })
59
- } else if (current.type === "discord") {
60
- rejectExtraneous(query, DISCORD_FIELDS, "discord")
61
- funnel.connectors.updateDiscord(param.name, {
62
- botToken: query["bot-token"],
63
- })
64
- } else {
65
- throw new HTTPException(400, {
66
- message: `schedule connectors have no top-level fields — use schedules add/remove`,
67
- })
68
- }
69
-
70
- return c.text(`updated connector "${param.name}"`)
71
- },
72
- )
@@ -1 +0,0 @@
1
- export const help = `funnel connectors <name> — show connector details`
@@ -1,41 +0,0 @@
1
- import { HTTPException } from "hono/http-exception"
2
- import { z } from "zod"
3
- import { factory } from "@/factory"
4
- import { zValidator } from "@/modules/router/validator"
5
- import { help } from "@/routes/connectors/show.help"
6
-
7
- export const connectorsShowHandler = factory.createHandlers(
8
- zValidator("param", z.object({ name: z.string() })),
9
- zValidator("query", z.object({}), help),
10
- (c) => {
11
- const param = c.req.valid("param")
12
- const funnel = c.var.funnel
13
- const connector = funnel.connectors.get(param.name)
14
-
15
- if (!connector) {
16
- throw new HTTPException(404, { message: `connector "${param.name}" not found` })
17
- }
18
-
19
- const lines: string[] = [`name: ${connector.name}`, `type: ${connector.type}`]
20
-
21
- if (connector.type === "slack") {
22
- lines.push(`botToken: ${connector.botToken.slice(0, 8)}...`)
23
- lines.push(`appToken: ${connector.appToken.slice(0, 8)}...`)
24
- } else if (connector.type === "gh") {
25
- lines.push(`pollInterval: ${connector.pollInterval ?? 60}s`)
26
- } else if (connector.type === "discord") {
27
- lines.push(`botToken: ${connector.botToken.slice(0, 8)}...`)
28
- } else if (connector.type === "schedule") {
29
- lines.push(`entries: ${connector.entries.length}`)
30
-
31
- for (const entry of connector.entries) {
32
- const status = entry.enabled ? "" : " (disabled)"
33
- lines.push(` - ${entry.id}${status}`)
34
- lines.push(` cron: ${entry.cron}`)
35
- lines.push(` prompt: ${entry.prompt}`)
36
- }
37
- }
38
-
39
- return c.text(lines.join("\n"))
40
- },
41
- )
@@ -1,15 +0,0 @@
1
- export const help = `funnel gateway — manage the gateway
2
-
3
- usage: funnel gateway [subcommand]
4
-
5
- subcommands:
6
- status show running status (default)
7
- start start in background
8
- stop stop
9
- restart stop then start
10
- run start in foreground (for developers)
11
- logs [-n <N>] show event logs
12
-
13
- examples:
14
- funnel gateway check status
15
- funnel gateway restart restart`
@@ -1,28 +0,0 @@
1
- import { z } from "zod"
2
- import { factory } from "@/factory"
3
- import { zValidator } from "@/modules/router/validator"
4
- import { help } from "@/routes/gateway/group.help"
5
-
6
- export const gatewayGroupHandler = factory.createHandlers(
7
- zValidator("query", z.object({}), help),
8
- async (c) => {
9
- const funnel = c.var.funnel
10
- const status = funnel.gateway.getStatus()
11
-
12
- if (!status.running) {
13
- return c.text("funnel gateway: not running", 503)
14
- }
15
-
16
- const res = await fetch(`http://localhost:${status.port}/health`).catch(() => null)
17
-
18
- if (!res) {
19
- return c.text(`funnel gateway: running (pid ${status.pid}) — health check failed`)
20
- }
21
-
22
- const health = (await res.json()) as Record<string, unknown>
23
-
24
- return c.text(
25
- `funnel gateway: running (pid ${status.pid})\n port: ${status.port}\n clients: ${health.clients ?? 0}`,
26
- )
27
- },
28
- )
@@ -1,13 +0,0 @@
1
- export const help = `funnel gateway logs — tail event logs
2
-
3
- usage: funnel gateway logs [-n <N>]
4
-
5
- options:
6
- -n <N> number of trailing lines to show (default: 20)
7
-
8
- Tails the latest /tmp/funnel/events/*.jsonl file. Exit with SIGINT.
9
- Output is formatted as YAML.
10
-
11
- examples:
12
- funnel gateway logs
13
- funnel gateway logs -n 100`