@interactive-inc/claude-funnel 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/README.md +155 -133
  2. package/dist/bin.js +1417 -0
  3. package/dist/gateway/daemon.js +513 -0
  4. package/dist/highlights-eq9cgrbb.scm +604 -0
  5. package/dist/highlights-ghv9g403.scm +205 -0
  6. package/dist/highlights-hk7bwhj4.scm +284 -0
  7. package/dist/highlights-r812a2qc.scm +150 -0
  8. package/dist/highlights-x6tmsnaa.scm +115 -0
  9. package/dist/injections-73j83es3.scm +27 -0
  10. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  11. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  12. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  13. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  14. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  15. package/lib/bin.ts +78 -0
  16. package/lib/{modules → cli}/router/to-request.ts +13 -20
  17. package/lib/cli/routes/channels.$channel.connectors.$connector.rename.$newName.ts +27 -0
  18. package/lib/cli/routes/channels.$channel.connectors.$connector.request.ts +40 -0
  19. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.add.$id.ts +41 -0
  20. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.remove.$id.ts +22 -0
  21. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.ts +23 -0
  22. package/lib/cli/routes/channels.$channel.connectors.$connector.ts +26 -0
  23. package/lib/cli/routes/channels.$channel.connectors.add.$connector.ts +92 -0
  24. package/lib/cli/routes/channels.$channel.connectors.remove.$connector.ts +22 -0
  25. package/lib/cli/routes/channels.$channel.connectors.set.$connector.ts +63 -0
  26. package/lib/cli/routes/channels.$channel.connectors.ts +26 -0
  27. package/lib/cli/routes/channels.$channel.rename.$newName.ts +22 -0
  28. package/lib/cli/routes/channels.$channel.set.delivery.$mode.ts +34 -0
  29. package/lib/cli/routes/channels.$channel.ts +34 -0
  30. package/lib/cli/routes/channels.add.$channel.ts +33 -0
  31. package/lib/cli/routes/channels.remove.$channel.ts +20 -0
  32. package/lib/cli/routes/channels.ts +39 -0
  33. package/lib/cli/routes/claude.ts +69 -0
  34. package/lib/cli/routes/gateway.listeners.ts +41 -0
  35. package/lib/cli/routes/gateway.logs.ts +123 -0
  36. package/lib/{routes/gateway/restart.ts → cli/routes/gateway.restart.ts} +20 -5
  37. package/lib/cli/routes/gateway.run.ts +41 -0
  38. package/lib/cli/routes/gateway.start.ts +50 -0
  39. package/lib/cli/routes/gateway.status.ts +19 -0
  40. package/lib/cli/routes/gateway.stop.ts +32 -0
  41. package/lib/cli/routes/gateway.ts +55 -0
  42. package/lib/cli/routes/index.ts +202 -0
  43. package/lib/cli/routes/profiles.$profile.as-default.ts +22 -0
  44. package/lib/cli/routes/profiles.$profile.rename.$newName.ts +22 -0
  45. package/lib/cli/routes/profiles.$profile.run.ts +36 -0
  46. package/lib/cli/routes/profiles.add.$profile.ts +46 -0
  47. package/lib/cli/routes/profiles.remove.$profile.ts +20 -0
  48. package/lib/cli/routes/profiles.set.$profile.ts +46 -0
  49. package/lib/cli/routes/profiles.ts +40 -0
  50. package/lib/cli/routes/status.ts +93 -0
  51. package/lib/cli/routes/update.ts +27 -0
  52. package/lib/connectors/connector-config-schema.ts +16 -0
  53. package/lib/connectors/connector-factory.ts +94 -0
  54. package/lib/connectors/connector-listener.ts +20 -0
  55. package/lib/{modules/connectors/funnel-discord-adapter.ts → connectors/discord-adapter.ts} +6 -11
  56. package/lib/{modules/connectors → connectors}/discord-connector-schema.ts +4 -1
  57. package/lib/connectors/discord-listener.ts +111 -0
  58. package/lib/{modules/connectors/funnel-gh-adapter.ts → connectors/gh-adapter.ts} +3 -6
  59. package/lib/{modules/connectors → connectors}/gh-connector-schema.ts +4 -1
  60. package/lib/{modules/connectors/funnel-gh-listener.ts → connectors/gh-listener.ts} +45 -19
  61. package/lib/{modules/connectors → connectors}/match-cron.ts +10 -4
  62. package/lib/connectors/schedule-connector-schema.ts +33 -0
  63. package/lib/connectors/schedule-listener.ts +207 -0
  64. package/lib/connectors/schedule-state-store.ts +54 -0
  65. package/lib/connectors/slack-adapter.ts +36 -0
  66. package/lib/{modules/connectors → connectors}/slack-connector-schema.ts +4 -1
  67. package/lib/{modules/connectors/funnel-slack-event-processor.ts → connectors/slack-event-processor.ts} +15 -9
  68. package/lib/{modules/connectors/funnel-slack-listener.ts → connectors/slack-listener.ts} +33 -14
  69. package/lib/engine/channels/channels.ts +520 -0
  70. package/lib/{modules/claude/funnel-claude.ts → engine/claude/claude.ts} +28 -55
  71. package/lib/engine/claude/gateway-controller.ts +4 -0
  72. package/lib/{modules/fs/funnel-file-system.ts → engine/fs/file-system.ts} +4 -0
  73. package/lib/{modules/fs/memory-funnel-file-system.ts → engine/fs/memory-file-system.ts} +20 -3
  74. package/lib/{modules/fs/node-funnel-file-system.ts → engine/fs/node-file-system.ts} +14 -2
  75. package/lib/{modules/http/memory-funnel-http-client.ts → engine/http/memory-http-client.ts} +1 -5
  76. package/lib/{modules/http/node-funnel-http-client.ts → engine/http/node-http-client.ts} +1 -5
  77. package/lib/{modules/id/memory-funnel-id-generator.ts → engine/id/memory-id-generator.ts} +1 -1
  78. package/lib/{modules/id/node-funnel-id-generator.ts → engine/id/node-id-generator.ts} +1 -1
  79. package/lib/{modules/logger/memory-funnel-logger.ts → engine/logger/memory-logger.ts} +1 -1
  80. package/lib/{modules/logger/node-funnel-logger.ts → engine/logger/node-logger.ts} +1 -1
  81. package/lib/{modules/logger/noop-funnel-logger.ts → engine/logger/noop-logger.ts} +1 -1
  82. package/lib/engine/mcp/channel-server.ts +204 -0
  83. package/lib/{modules/mcp/funnel-mcp.ts → engine/mcp/mcp.ts} +24 -10
  84. package/lib/{modules/process/memory-funnel-process-runner.ts → engine/process/memory-process-runner.ts} +1 -1
  85. package/lib/{modules/process/node-funnel-process-runner.ts → engine/process/node-process-runner.ts} +12 -21
  86. package/lib/engine/profiles/profile-channel-checker.ts +7 -0
  87. package/lib/{modules/profiles/funnel-profiles.ts → engine/profiles/profiles.ts} +41 -43
  88. package/lib/{modules/settings/mock-funnel-settings-reader.ts → engine/settings/mock-settings-reader.ts} +4 -3
  89. package/lib/{modules/settings/funnel-settings-reader.ts → engine/settings/settings-reader.ts} +1 -1
  90. package/lib/engine/settings/settings-schema.ts +46 -0
  91. package/lib/engine/settings/settings-store.ts +110 -0
  92. package/lib/{modules/time/memory-funnel-clock.ts → engine/time/memory-clock.ts} +1 -1
  93. package/lib/{modules/time/node-funnel-clock.ts → engine/time/node-clock.ts} +1 -1
  94. package/lib/funnel.ts +83 -78
  95. package/lib/gateway/auth-middleware.ts +44 -0
  96. package/lib/gateway/broadcaster.ts +319 -0
  97. package/lib/gateway/daemon.ts +47 -0
  98. package/lib/gateway/factory.ts +10 -0
  99. package/lib/gateway/funnel-event-store.ts +155 -0
  100. package/lib/gateway/gateway-server.ts +414 -0
  101. package/lib/gateway/gateway-token.ts +79 -0
  102. package/lib/{modules/gateway/funnel-gateway.ts → gateway/gateway.ts} +27 -13
  103. package/lib/{modules/gateway → gateway}/kill-competing-slack-gateways.ts +4 -4
  104. package/lib/gateway/listener-supervisor.ts +339 -0
  105. package/lib/gateway/listeners-client.ts +128 -0
  106. package/lib/gateway/resolve-daemon-script.ts +26 -0
  107. package/lib/gateway/routes/channels.connectors.call.ts +39 -0
  108. package/lib/gateway/routes/health.ts +13 -0
  109. package/lib/gateway/routes/index.ts +24 -0
  110. package/lib/gateway/routes/listeners.list.ts +6 -0
  111. package/lib/gateway/routes/listeners.restart.ts +15 -0
  112. package/lib/gateway/routes/listeners.start.ts +15 -0
  113. package/lib/gateway/routes/listeners.stop.ts +15 -0
  114. package/lib/gateway/routes/route-deps.ts +11 -0
  115. package/lib/gateway/routes/status.ts +15 -0
  116. package/lib/gateway/routes/validator.ts +17 -0
  117. package/lib/index.ts +50 -92
  118. package/lib/logger/leuco-human-file-writer.ts +65 -0
  119. package/lib/logger/leuco-human-logger.ts +98 -0
  120. package/lib/logger/leuco-human-record.ts +16 -0
  121. package/lib/logger/leuco-human-stdout-writer.ts +26 -0
  122. package/lib/logger/leuco-human-writer.ts +14 -0
  123. package/lib/logger/leuco-logger-memory-sink.ts +67 -0
  124. package/lib/logger/leuco-logger-record.ts +13 -0
  125. package/lib/logger/leuco-logger-sink.ts +33 -0
  126. package/lib/logger/leuco-logger-sqlite-sink.ts +355 -0
  127. package/lib/logger/leuco-logger.ts +135 -0
  128. package/lib/tui/app.tsx +357 -0
  129. package/lib/tui/components/add-row.tsx +18 -0
  130. package/lib/tui/components/brand.tsx +27 -0
  131. package/lib/tui/components/card.tsx +44 -0
  132. package/lib/tui/components/detail-bar.tsx +46 -0
  133. package/lib/tui/components/editable-field.tsx +33 -0
  134. package/lib/tui/components/empty-state.tsx +11 -0
  135. package/lib/tui/components/gateway-status.tsx +66 -0
  136. package/lib/tui/components/keymap.tsx +29 -0
  137. package/lib/tui/components/menu-item.tsx +73 -0
  138. package/lib/tui/components/menu.tsx +26 -0
  139. package/lib/tui/components/panel-header.tsx +22 -0
  140. package/lib/tui/components/readonly-field.tsx +18 -0
  141. package/lib/tui/components/section-header.tsx +25 -0
  142. package/lib/tui/components/selection-accent.tsx +32 -0
  143. package/lib/tui/components/session-item.tsx +33 -0
  144. package/lib/tui/components/session-list.tsx +33 -0
  145. package/lib/tui/components/ui/hascii/accordion-item.tsx +88 -0
  146. package/lib/tui/components/ui/hascii/accordion.tsx +96 -0
  147. package/lib/tui/components/ui/hascii/alert-dialog.tsx +43 -0
  148. package/lib/tui/components/ui/hascii/badge.tsx +51 -0
  149. package/lib/tui/components/ui/hascii/breadcrumb.tsx +58 -0
  150. package/lib/tui/components/ui/hascii/button.tsx +194 -0
  151. package/lib/tui/components/ui/hascii/card-content.tsx +14 -0
  152. package/lib/tui/components/ui/hascii/card-description.tsx +13 -0
  153. package/lib/tui/components/ui/hascii/card-footer.tsx +14 -0
  154. package/lib/tui/components/ui/hascii/card-header.tsx +14 -0
  155. package/lib/tui/components/ui/hascii/card-title.tsx +13 -0
  156. package/lib/tui/components/ui/hascii/card.tsx +27 -0
  157. package/lib/tui/components/ui/hascii/checkbox.tsx +65 -0
  158. package/lib/tui/components/ui/hascii/command.tsx +159 -0
  159. package/lib/tui/components/ui/hascii/dialog-content.tsx +14 -0
  160. package/lib/tui/components/ui/hascii/dialog-description.tsx +13 -0
  161. package/lib/tui/components/ui/hascii/dialog-footer.tsx +14 -0
  162. package/lib/tui/components/ui/hascii/dialog-header.tsx +14 -0
  163. package/lib/tui/components/ui/hascii/dialog-title.tsx +13 -0
  164. package/lib/tui/components/ui/hascii/dialog.tsx +27 -0
  165. package/lib/tui/components/ui/hascii/file-tree.tsx +142 -0
  166. package/lib/tui/components/ui/hascii/focus-group.tsx +62 -0
  167. package/lib/tui/components/ui/hascii/form-item.tsx +43 -0
  168. package/lib/tui/components/ui/hascii/input-otp.tsx +86 -0
  169. package/lib/tui/components/ui/hascii/input.tsx +130 -0
  170. package/lib/tui/components/ui/hascii/pagination.tsx +105 -0
  171. package/lib/tui/components/ui/hascii/progress.tsx +28 -0
  172. package/lib/tui/components/ui/hascii/select.tsx +131 -0
  173. package/lib/tui/components/ui/hascii/separator.tsx +35 -0
  174. package/lib/tui/components/ui/hascii/sidebar-content.tsx +23 -0
  175. package/lib/tui/components/ui/hascii/sidebar-header.tsx +14 -0
  176. package/lib/tui/components/ui/hascii/sidebar-menu-item.tsx +67 -0
  177. package/lib/tui/components/ui/hascii/sidebar.tsx +24 -0
  178. package/lib/tui/components/ui/hascii/skeleton.tsx +60 -0
  179. package/lib/tui/components/ui/hascii/slider.tsx +91 -0
  180. package/lib/tui/components/ui/hascii/snackbar.tsx +75 -0
  181. package/lib/tui/components/ui/hascii/sparkline.tsx +53 -0
  182. package/lib/tui/components/ui/hascii/spinner.tsx +47 -0
  183. package/lib/tui/components/ui/hascii/stepper.tsx +54 -0
  184. package/lib/tui/components/ui/hascii/switch.tsx +66 -0
  185. package/lib/tui/components/ui/hascii/table.tsx +95 -0
  186. package/lib/tui/components/ui/hascii/tabs.tsx +59 -0
  187. package/lib/tui/components/ui/hascii/toggle-group-item.tsx +45 -0
  188. package/lib/tui/components/ui/hascii/toggle-group.tsx +99 -0
  189. package/lib/tui/components/ui/hascii/tree.tsx +104 -0
  190. package/lib/tui/components/view-shell.tsx +44 -0
  191. package/lib/tui/filter-input.tsx +33 -0
  192. package/lib/tui/hooks/hascii/use-pressable.ts +54 -0
  193. package/lib/tui/parse-comma-list.ts +14 -0
  194. package/lib/tui/profile-launcher.tsx +61 -0
  195. package/lib/tui/scrollbar-options.ts +19 -0
  196. package/lib/tui/sidebar.tsx +50 -0
  197. package/lib/tui/theme.ts +40 -0
  198. package/lib/tui/tui.tsx +20 -0
  199. package/lib/tui/types.ts +38 -0
  200. package/lib/tui/unique-name.ts +18 -0
  201. package/lib/tui/use-event-stream.ts +133 -0
  202. package/lib/tui/use-snapshot.ts +99 -0
  203. package/lib/tui/utils/hascii/form-item-context.tsx +23 -0
  204. package/lib/tui/utils/hascii/input-focus-context.tsx +31 -0
  205. package/lib/tui/utils/hascii/theme-context.tsx +26 -0
  206. package/lib/tui/utils/hascii/theme.ts +176 -0
  207. package/lib/tui/views/channels-view.tsx +108 -0
  208. package/lib/tui/views/connectors-view.tsx +164 -0
  209. package/lib/tui/views/events-view.tsx +160 -0
  210. package/lib/tui/views/listeners-view.tsx +80 -0
  211. package/lib/tui/views/profiles-view.tsx +152 -0
  212. package/package.json +50 -44
  213. package/lib/api.ts +0 -54
  214. package/lib/modules/channels/channel-connector-ref-updater.ts +0 -4
  215. package/lib/modules/channels/funnel-channels.ts +0 -160
  216. package/lib/modules/connectors/connector-config-schema.ts +0 -16
  217. package/lib/modules/connectors/connector-existence-checker.ts +0 -3
  218. package/lib/modules/connectors/funnel-callable-connector-store.ts +0 -9
  219. package/lib/modules/connectors/funnel-connector-listener.ts +0 -5
  220. package/lib/modules/connectors/funnel-connector-stores.ts +0 -52
  221. package/lib/modules/connectors/funnel-connector-type-store.ts +0 -24
  222. package/lib/modules/connectors/funnel-connectors.ts +0 -151
  223. package/lib/modules/connectors/funnel-discord-listener.ts +0 -71
  224. package/lib/modules/connectors/funnel-discord-store.ts +0 -88
  225. package/lib/modules/connectors/funnel-gh-store.ts +0 -101
  226. package/lib/modules/connectors/funnel-json-connector-store.ts +0 -100
  227. package/lib/modules/connectors/funnel-schedule-listener.ts +0 -130
  228. package/lib/modules/connectors/funnel-schedule-store.ts +0 -195
  229. package/lib/modules/connectors/funnel-slack-adapter.ts +0 -31
  230. package/lib/modules/connectors/funnel-slack-store.ts +0 -90
  231. package/lib/modules/connectors/migrate-legacy-connectors.ts +0 -81
  232. package/lib/modules/connectors/schedule-connector-schema.ts +0 -18
  233. package/lib/modules/connectors/schedule-last-fired-store.ts +0 -48
  234. package/lib/modules/gateway/daemon.ts +0 -74
  235. package/lib/modules/gateway/funnel-broadcaster.ts +0 -37
  236. package/lib/modules/gateway/funnel-event-logger.ts +0 -59
  237. package/lib/modules/gateway/funnel-gateway-server.ts +0 -241
  238. package/lib/modules/mcp/channel-server.ts +0 -76
  239. package/lib/modules/profiles/profile-channel-checker.ts +0 -3
  240. package/lib/modules/profiles/profile-channel-ref-updater.ts +0 -3
  241. package/lib/modules/repos/funnel-repositories.ts +0 -112
  242. package/lib/modules/schedule/funnel-schedule.ts +0 -39
  243. package/lib/modules/settings/funnel-settings-store.ts +0 -56
  244. package/lib/modules/settings/settings-schema.ts +0 -33
  245. package/lib/modules/tui/app.tsx +0 -44
  246. package/lib/modules/tui/tui.tsx +0 -13
  247. package/lib/routes/channels/add.help.ts +0 -3
  248. package/lib/routes/channels/add.ts +0 -21
  249. package/lib/routes/channels/connectors-attach.help.ts +0 -3
  250. package/lib/routes/channels/connectors-attach.ts +0 -17
  251. package/lib/routes/channels/connectors-detach.help.ts +0 -3
  252. package/lib/routes/channels/connectors-detach.ts +0 -17
  253. package/lib/routes/channels/group.help.ts +0 -16
  254. package/lib/routes/channels/group.ts +0 -22
  255. package/lib/routes/channels/remove.help.ts +0 -3
  256. package/lib/routes/channels/remove.ts +0 -17
  257. package/lib/routes/channels/rename.help.ts +0 -5
  258. package/lib/routes/channels/rename.ts +0 -17
  259. package/lib/routes/channels/routes.ts +0 -19
  260. package/lib/routes/channels/show.help.ts +0 -1
  261. package/lib/routes/channels/show.ts +0 -26
  262. package/lib/routes/claude/claude.help.ts +0 -16
  263. package/lib/routes/claude/claude.ts +0 -76
  264. package/lib/routes/claude/routes.ts +0 -4
  265. package/lib/routes/connectors/add.help.ts +0 -28
  266. package/lib/routes/connectors/add.ts +0 -64
  267. package/lib/routes/connectors/group.help.ts +0 -14
  268. package/lib/routes/connectors/group.ts +0 -18
  269. package/lib/routes/connectors/remove.help.ts +0 -3
  270. package/lib/routes/connectors/remove.ts +0 -17
  271. package/lib/routes/connectors/rename.help.ts +0 -5
  272. package/lib/routes/connectors/rename.ts +0 -17
  273. package/lib/routes/connectors/routes.ts +0 -23
  274. package/lib/routes/connectors/schedules-add.help.ts +0 -11
  275. package/lib/routes/connectors/schedules-add.ts +0 -33
  276. package/lib/routes/connectors/schedules-group.help.ts +0 -1
  277. package/lib/routes/connectors/schedules-group.ts +0 -38
  278. package/lib/routes/connectors/schedules-remove.help.ts +0 -3
  279. package/lib/routes/connectors/schedules-remove.ts +0 -17
  280. package/lib/routes/connectors/set.help.ts +0 -8
  281. package/lib/routes/connectors/set.ts +0 -72
  282. package/lib/routes/connectors/show.help.ts +0 -1
  283. package/lib/routes/connectors/show.ts +0 -41
  284. package/lib/routes/gateway/group.help.ts +0 -15
  285. package/lib/routes/gateway/group.ts +0 -28
  286. package/lib/routes/gateway/logs.help.ts +0 -13
  287. package/lib/routes/gateway/logs.ts +0 -102
  288. package/lib/routes/gateway/restart.help.ts +0 -10
  289. package/lib/routes/gateway/routes.ts +0 -18
  290. package/lib/routes/gateway/run.help.ts +0 -12
  291. package/lib/routes/gateway/run.ts +0 -35
  292. package/lib/routes/gateway/start.help.ts +0 -15
  293. package/lib/routes/gateway/start.ts +0 -32
  294. package/lib/routes/gateway/status.help.ts +0 -9
  295. package/lib/routes/gateway/status.ts +0 -28
  296. package/lib/routes/gateway/stop.help.ts +0 -8
  297. package/lib/routes/gateway/stop.ts +0 -21
  298. package/lib/routes/profiles/add.help.ts +0 -3
  299. package/lib/routes/profiles/add.ts +0 -33
  300. package/lib/routes/profiles/group.help.ts +0 -16
  301. package/lib/routes/profiles/group.ts +0 -25
  302. package/lib/routes/profiles/launch.help.ts +0 -4
  303. package/lib/routes/profiles/launch.ts +0 -36
  304. package/lib/routes/profiles/remove.help.ts +0 -3
  305. package/lib/routes/profiles/remove.ts +0 -17
  306. package/lib/routes/profiles/rename.help.ts +0 -5
  307. package/lib/routes/profiles/rename.ts +0 -17
  308. package/lib/routes/profiles/routes.ts +0 -18
  309. package/lib/routes/profiles/set.help.ts +0 -5
  310. package/lib/routes/profiles/set.ts +0 -32
  311. package/lib/routes/repos/add.help.ts +0 -6
  312. package/lib/routes/repos/add.ts +0 -20
  313. package/lib/routes/repos/group.help.ts +0 -11
  314. package/lib/routes/repos/group.ts +0 -18
  315. package/lib/routes/repos/remove.help.ts +0 -3
  316. package/lib/routes/repos/remove.ts +0 -17
  317. package/lib/routes/repos/rename.help.ts +0 -5
  318. package/lib/routes/repos/rename.ts +0 -17
  319. package/lib/routes/repos/routes.ts +0 -17
  320. package/lib/routes/repos/set.help.ts +0 -5
  321. package/lib/routes/repos/set.ts +0 -21
  322. package/lib/routes/repos/show.help.ts +0 -1
  323. package/lib/routes/repos/show.ts +0 -19
  324. package/lib/routes/request/discord-help.ts +0 -9
  325. package/lib/routes/request/discord.help.ts +0 -19
  326. package/lib/routes/request/discord.ts +0 -65
  327. package/lib/routes/request/group.help.ts +0 -15
  328. package/lib/routes/request/group.ts +0 -9
  329. package/lib/routes/request/routes.ts +0 -14
  330. package/lib/routes/request/slack-help.ts +0 -9
  331. package/lib/routes/request/slack.help.ts +0 -19
  332. package/lib/routes/request/slack.ts +0 -61
  333. package/lib/routes/status/routes.ts +0 -4
  334. package/lib/routes/status/status.help.ts +0 -6
  335. package/lib/routes/status/status.ts +0 -77
  336. package/lib/routes/update/routes.ts +0 -4
  337. package/lib/routes/update/update.help.ts +0 -5
  338. package/lib/routes/update/update.ts +0 -21
  339. package/lib/routes.ts +0 -40
  340. /package/lib/{factory.ts → cli/factory.ts} +0 -0
  341. /package/lib/{modules → cli}/router/query-to-cli-args.ts +0 -0
  342. /package/lib/{modules → cli}/router/validator.ts +0 -0
  343. /package/lib/{modules/connectors/funnel-connector-adapter.ts → connectors/connector-adapter.ts} +0 -0
  344. /package/lib/{modules/connectors/funnel-discord-event-processor.ts → connectors/discord-event-processor.ts} +0 -0
  345. /package/lib/{modules/http/funnel-http-client.ts → engine/http/http-client.ts} +0 -0
  346. /package/lib/{modules/id/funnel-id-generator.ts → engine/id/id-generator.ts} +0 -0
  347. /package/lib/{modules/logger/funnel-logger.ts → engine/logger/logger.ts} +0 -0
  348. /package/lib/{modules/process/funnel-process-runner.ts → engine/process/process-runner.ts} +0 -0
  349. /package/lib/{modules/time/funnel-clock.ts → engine/time/clock.ts} +0 -0
@@ -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`