@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
@@ -0,0 +1,38 @@
1
+ export declare const asDefaultHelp = "funnel profiles <name> as-default \u2014 move profile to the front of the list\n\nusage: funnel profiles <name> as-default\n\nthe first profile in the list is treated as the default for fnl claude.";
2
+ export declare const profilesAsDefaultHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ param: {
5
+ profile: string;
6
+ };
7
+ };
8
+ out: {
9
+ param: {
10
+ profile: string;
11
+ };
12
+ };
13
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("hono").Env, string, {
14
+ in: {
15
+ query: Record<string, never>;
16
+ };
17
+ out: {
18
+ query: Record<string, never>;
19
+ };
20
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
21
+ in: {
22
+ param: {
23
+ profile: string;
24
+ };
25
+ };
26
+ out: {
27
+ param: {
28
+ profile: string;
29
+ };
30
+ };
31
+ } & {
32
+ in: {
33
+ query: Record<string, never>;
34
+ };
35
+ out: {
36
+ query: Record<string, never>;
37
+ };
38
+ }, Response & import("hono").TypedResponse<`profile "${string}" is now the default`, import("hono/utils/http-status").ContentfulStatusCode, "text">>];
@@ -0,0 +1,42 @@
1
+ export declare const renameHelp = "funnel profiles rename \u2014 rename a profile\n\nusage:\n funnel profiles rename <old> <new>\n funnel profiles <old> rename <new>";
2
+ export declare const profilesRenameHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ param: {
5
+ profile: string;
6
+ newName: string;
7
+ };
8
+ };
9
+ out: {
10
+ param: {
11
+ profile: string;
12
+ newName: string;
13
+ };
14
+ };
15
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("hono").Env, string, {
16
+ in: {
17
+ query: Record<string, never>;
18
+ };
19
+ out: {
20
+ query: Record<string, never>;
21
+ };
22
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
23
+ in: {
24
+ param: {
25
+ profile: string;
26
+ newName: string;
27
+ };
28
+ };
29
+ out: {
30
+ param: {
31
+ profile: string;
32
+ newName: string;
33
+ };
34
+ };
35
+ } & {
36
+ in: {
37
+ query: Record<string, never>;
38
+ };
39
+ out: {
40
+ query: Record<string, never>;
41
+ };
42
+ }, Response & import("hono").TypedResponse<`renamed profile "${string}" to "${string}"`, import("hono/utils/http-status").ContentfulStatusCode, "text">>];
@@ -0,0 +1,46 @@
1
+ export declare const launchHelp = "funnel profiles <name> run \u2014 launch a profile (sugar for fnl claude)\n\nusage: funnel profiles <name> run [additional claude args...]\n funnel profiles <name> (alias)";
2
+ export declare const profilesLaunchHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ param: {
5
+ profile: string;
6
+ };
7
+ };
8
+ out: {
9
+ param: {
10
+ profile: string;
11
+ };
12
+ };
13
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("hono").Env, string, {
14
+ in: {
15
+ query: {
16
+ [x: string]: string | string[];
17
+ };
18
+ };
19
+ out: {
20
+ query: {
21
+ [x: string]: unknown;
22
+ };
23
+ };
24
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
25
+ in: {
26
+ param: {
27
+ profile: string;
28
+ };
29
+ };
30
+ out: {
31
+ param: {
32
+ profile: string;
33
+ };
34
+ };
35
+ } & {
36
+ in: {
37
+ query: {
38
+ [x: string]: string | string[];
39
+ };
40
+ };
41
+ out: {
42
+ query: {
43
+ [x: string]: unknown;
44
+ };
45
+ };
46
+ }, Promise<never>>];
@@ -0,0 +1,54 @@
1
+ export declare const addHelp = "funnel profiles add \u2014 add a profile\n\nusage: funnel profiles add <name> --path <path> --sub-agent <agent> --channel <channel-name>\n\noptions:\n --path working directory passed to claude as cwd\n --sub-agent sub-agent name passed to claude --agent\n --channel channel name (resolved to channel id internally)";
2
+ export declare const profilesAddHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ param: {
5
+ profile: string;
6
+ };
7
+ };
8
+ out: {
9
+ param: {
10
+ profile: string;
11
+ };
12
+ };
13
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("hono").Env, string, {
14
+ in: {
15
+ query: {
16
+ path: string;
17
+ "sub-agent": string;
18
+ channel: string;
19
+ };
20
+ };
21
+ out: {
22
+ query: {
23
+ path: string;
24
+ "sub-agent": string;
25
+ channel: string;
26
+ };
27
+ };
28
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
29
+ in: {
30
+ param: {
31
+ profile: string;
32
+ };
33
+ };
34
+ out: {
35
+ param: {
36
+ profile: string;
37
+ };
38
+ };
39
+ } & {
40
+ in: {
41
+ query: {
42
+ path: string;
43
+ "sub-agent": string;
44
+ channel: string;
45
+ };
46
+ };
47
+ out: {
48
+ query: {
49
+ path: string;
50
+ "sub-agent": string;
51
+ channel: string;
52
+ };
53
+ };
54
+ }, Response & import("hono").TypedResponse<`added profile "${string}"`, import("hono/utils/http-status").ContentfulStatusCode, "text">>];
@@ -0,0 +1,16 @@
1
+ export declare const groupHelp = "funnel profiles \u2014 manage launch profiles\n\nusage: funnel profiles [subcommand]\n\nsubcommands:\n (none) list (first entry is the default)\n add <name> --path <path> --sub-agent <agent> --channel <channel>\n <name> set [--path ...] [--sub-agent ...] [--channel ...]\n <name> as-default move profile to the front (becomes default)\n rename <old> <new> rename\n remove <name> remove\n <name> run launch (sugar for fnl claude -p <name>)\n <name> launch (alias for run)\n\nexamples:\n funnel profiles add cto --path /repo/myapp --sub-agent cto --channel prod-inbox\n funnel profiles cto as-default\n funnel profiles cto run";
2
+ export declare const profilesGroupHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ query: Record<string, never>;
5
+ };
6
+ out: {
7
+ query: Record<string, never>;
8
+ };
9
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
10
+ in: {
11
+ query: Record<string, never>;
12
+ };
13
+ out: {
14
+ query: Record<string, never>;
15
+ };
16
+ }, Response & import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>];
@@ -0,0 +1,38 @@
1
+ export declare const removeHelp = "funnel profiles remove \u2014 remove a profile\n\nusage: funnel profiles remove <name>";
2
+ export declare const profilesRemoveHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ param: {
5
+ profile: string;
6
+ };
7
+ };
8
+ out: {
9
+ param: {
10
+ profile: string;
11
+ };
12
+ };
13
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("hono").Env, string, {
14
+ in: {
15
+ query: Record<string, never>;
16
+ };
17
+ out: {
18
+ query: Record<string, never>;
19
+ };
20
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
21
+ in: {
22
+ param: {
23
+ profile: string;
24
+ };
25
+ };
26
+ out: {
27
+ param: {
28
+ profile: string;
29
+ };
30
+ };
31
+ } & {
32
+ in: {
33
+ query: Record<string, never>;
34
+ };
35
+ out: {
36
+ query: Record<string, never>;
37
+ };
38
+ }, Response & import("hono").TypedResponse<`removed profile "${string}"`, import("hono/utils/http-status").ContentfulStatusCode, "text">>];
@@ -0,0 +1,54 @@
1
+ export declare const setHelp = "funnel profiles <name> set \u2014 update a profile\n\nusage: funnel profiles <name> set [--path <path>] [--sub-agent <agent>] [--channel <channel-name>]";
2
+ export declare const profilesSetHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ param: {
5
+ profile: string;
6
+ };
7
+ };
8
+ out: {
9
+ param: {
10
+ profile: string;
11
+ };
12
+ };
13
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("hono").Env, string, {
14
+ in: {
15
+ query: {
16
+ path?: string | undefined;
17
+ "sub-agent"?: string | undefined;
18
+ channel?: string | undefined;
19
+ };
20
+ };
21
+ out: {
22
+ query: {
23
+ path?: string | undefined;
24
+ "sub-agent"?: string | undefined;
25
+ channel?: string | undefined;
26
+ };
27
+ };
28
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
29
+ in: {
30
+ param: {
31
+ profile: string;
32
+ };
33
+ };
34
+ out: {
35
+ param: {
36
+ profile: string;
37
+ };
38
+ };
39
+ } & {
40
+ in: {
41
+ query: {
42
+ path?: string | undefined;
43
+ "sub-agent"?: string | undefined;
44
+ channel?: string | undefined;
45
+ };
46
+ };
47
+ out: {
48
+ query: {
49
+ path?: string | undefined;
50
+ "sub-agent"?: string | undefined;
51
+ channel?: string | undefined;
52
+ };
53
+ };
54
+ }, Response & import("hono").TypedResponse<`updated profile "${string}"`, import("hono/utils/http-status").ContentfulStatusCode, "text">>];
@@ -0,0 +1,16 @@
1
+ export declare const statusHelp = "funnel status \u2014 show overall connection status\n\nusage: funnel status\n\nLists configured connectors / channels / profiles, gateway running status,\nand active MCP WebSocket clients.";
2
+ export declare const statusHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ query: Record<string, never>;
5
+ };
6
+ out: {
7
+ query: Record<string, never>;
8
+ };
9
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
10
+ in: {
11
+ query: Record<string, never>;
12
+ };
13
+ out: {
14
+ query: Record<string, never>;
15
+ };
16
+ }, Promise<Response & import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>>];
@@ -0,0 +1,16 @@
1
+ export declare const updateHelp = "funnel update \u2014 update funnel to the latest version\n\nusage: funnel update\n\nRuns \"bun i -g @interactive-inc/claude-funnel\".";
2
+ export declare const updateHandler: [import("hono/types").H<import("hono").Env, string, {
3
+ in: {
4
+ query: Record<string, never>;
5
+ };
6
+ out: {
7
+ query: Record<string, never>;
8
+ };
9
+ }, import("hono").TypedResponse<string, import("hono/utils/http-status").ContentfulStatusCode, "text">>, import("hono/types").H<import("../factory").Env, string, {
10
+ in: {
11
+ query: Record<string, never>;
12
+ };
13
+ out: {
14
+ query: Record<string, never>;
15
+ };
16
+ }, Promise<Response & import("hono").TypedResponse<"updated @interactive-inc/claude-funnel", import("hono/utils/http-status").ContentfulStatusCode, "text">>>];
@@ -0,0 +1,8 @@
1
+ export type CallInput = {
2
+ method: string;
3
+ path: string;
4
+ body?: unknown;
5
+ };
6
+ export declare abstract class FunnelConnectorAdapter {
7
+ abstract call(input: CallInput): Promise<unknown>;
8
+ }
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ export declare const connectorConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ type: z.ZodLiteral<"slack">;
6
+ botToken: z.ZodString;
7
+ appToken: z.ZodString;
8
+ createdAt: z.ZodOptional<z.ZodString>;
9
+ updatedAt: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ id: z.ZodString;
12
+ name: z.ZodString;
13
+ type: z.ZodLiteral<"gh">;
14
+ pollInterval: z.ZodOptional<z.ZodNumber>;
15
+ createdAt: z.ZodOptional<z.ZodString>;
16
+ updatedAt: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>, z.ZodObject<{
18
+ id: z.ZodString;
19
+ name: z.ZodString;
20
+ type: z.ZodLiteral<"discord">;
21
+ botToken: z.ZodString;
22
+ createdAt: z.ZodOptional<z.ZodString>;
23
+ updatedAt: z.ZodOptional<z.ZodString>;
24
+ }, z.core.$strip>, z.ZodObject<{
25
+ id: z.ZodString;
26
+ name: z.ZodString;
27
+ type: z.ZodLiteral<"schedule">;
28
+ entries: z.ZodDefault<z.ZodArray<z.ZodObject<{
29
+ id: z.ZodString;
30
+ cron: z.ZodString;
31
+ prompt: z.ZodString;
32
+ enabled: z.ZodDefault<z.ZodBoolean>;
33
+ catchupPolicy: z.ZodDefault<z.ZodEnum<{
34
+ latest: "latest";
35
+ all: "all";
36
+ skip: "skip";
37
+ }>>;
38
+ }, z.core.$strip>>>;
39
+ createdAt: z.ZodOptional<z.ZodString>;
40
+ updatedAt: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$strip>], "type">;
42
+ export type ConnectorConfig = z.infer<typeof connectorConfigSchema>;
43
+ export type ConnectorType = ConnectorConfig["type"];
@@ -0,0 +1,32 @@
1
+ import type { FunnelConnectorAdapter } from "./connector-adapter";
2
+ import type { ConnectorConfig } from "./connector-config-schema";
3
+ import type { FunnelConnectorListener } from "./connector-listener";
4
+ import { FunnelFileSystem } from "../engine/fs/file-system";
5
+ import { FunnelLogger } from "../engine/logger/logger";
6
+ import { FunnelProcessRunner } from "../engine/process/process-runner";
7
+ type Deps = {
8
+ fs?: FunnelFileSystem;
9
+ process?: FunnelProcessRunner;
10
+ logger?: FunnelLogger;
11
+ dir?: string;
12
+ };
13
+ /**
14
+ * Pure factory for per-type listeners and adapters. The factory has no CRUD
15
+ * responsibility — connector configs live inside settings.json under their
16
+ * channel, and FunnelChannels passes them in by value.
17
+ *
18
+ * `dir` is the funnel home (defaults to ~/.funnel); per-connector state files
19
+ * land at `<dir>/channels/<channel-id>/connectors/<connector-id>/state.json`.
20
+ */
21
+ export declare class FunnelConnectorFactory {
22
+ private readonly fs;
23
+ private readonly process;
24
+ private readonly logger;
25
+ private readonly dir;
26
+ constructor(deps?: Deps);
27
+ createListener(channelId: string, config: ConnectorConfig): FunnelConnectorListener;
28
+ createAdapter(config: ConnectorConfig): FunnelConnectorAdapter | null;
29
+ connectorDir(channelId: string, connectorId: string): string;
30
+ channelDir(channelId: string): string;
31
+ }
32
+ export {};
@@ -0,0 +1,17 @@
1
+ export type NotifyFn = (content: string, meta?: Record<string, string>) => Promise<void>;
2
+ /**
3
+ * Long-lived event source for one connector.
4
+ *
5
+ * `start()` opens the underlying connection (Slack Socket Mode, Discord
6
+ * Gateway, GH polling, schedule tick) and pushes events through `notify`.
7
+ * `stop()` releases the resources so the supervisor can recreate the listener
8
+ * with new config without restarting the whole gateway. `isAlive()` lets the
9
+ * supervisor periodically health-check and auto-restart dead listeners; the
10
+ * default optimistic implementation is fine for poll/tick-based listeners
11
+ * that self-heal.
12
+ */
13
+ export declare abstract class FunnelConnectorListener {
14
+ abstract start(notify: NotifyFn): Promise<void>;
15
+ abstract stop(): Promise<void>;
16
+ isAlive(): boolean;
17
+ }
@@ -0,0 +1,14 @@
1
+ import { FunnelConnectorAdapter, type CallInput } from "./connector-adapter";
2
+ import { FunnelHttpClient } from "../engine/http/http-client";
3
+ import type { DiscordConnectorConfig } from "./discord-connector-schema";
4
+ type Deps = {
5
+ config: DiscordConnectorConfig;
6
+ http?: FunnelHttpClient;
7
+ };
8
+ export declare class FunnelDiscordAdapter extends FunnelConnectorAdapter {
9
+ private readonly token;
10
+ private readonly http;
11
+ constructor(deps: Deps);
12
+ call(input: CallInput): Promise<unknown>;
13
+ }
14
+ export {};
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export declare const discordConnectorSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ type: z.ZodLiteral<"discord">;
6
+ botToken: z.ZodString;
7
+ createdAt: z.ZodOptional<z.ZodString>;
8
+ updatedAt: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ export type DiscordConnectorConfig = z.infer<typeof discordConnectorSchema>;
@@ -0,0 +1,26 @@
1
+ export type DiscordInboundMessage = {
2
+ authorId: string;
3
+ authorIsBot: boolean;
4
+ channelId: string;
5
+ guildId: string | null;
6
+ mentionedUserIds: string[];
7
+ raw: unknown;
8
+ };
9
+ export type DiscordProcessedSkip = {
10
+ skip: true;
11
+ };
12
+ export type DiscordProcessedEmit = {
13
+ skip: false;
14
+ content: string;
15
+ meta: Record<string, string>;
16
+ };
17
+ export type DiscordProcessed = DiscordProcessedSkip | DiscordProcessedEmit;
18
+ type Props = {
19
+ ownUserId: string;
20
+ };
21
+ export declare class FunnelDiscordEventProcessor {
22
+ private readonly ownUserId;
23
+ constructor(props: Props);
24
+ process(message: DiscordInboundMessage): DiscordProcessed;
25
+ }
26
+ export {};
@@ -0,0 +1,17 @@
1
+ import { FunnelConnectorListener, type NotifyFn } from "./connector-listener";
2
+ import { FunnelLogger } from "../engine/logger/logger";
3
+ import type { DiscordConnectorConfig } from "./discord-connector-schema";
4
+ type Deps = {
5
+ config: DiscordConnectorConfig;
6
+ logger?: FunnelLogger;
7
+ };
8
+ export declare class FunnelDiscordListener extends FunnelConnectorListener {
9
+ private readonly config;
10
+ private readonly logger;
11
+ private client;
12
+ constructor(deps: Deps);
13
+ start(notify: NotifyFn): Promise<void>;
14
+ stop(): Promise<void>;
15
+ isAlive(): boolean;
16
+ }
17
+ export {};
@@ -0,0 +1,11 @@
1
+ import { FunnelConnectorAdapter, type CallInput } from "./connector-adapter";
2
+ import { FunnelProcessRunner } from "../engine/process/process-runner";
3
+ type Deps = {
4
+ process?: FunnelProcessRunner;
5
+ };
6
+ export declare class FunnelGhAdapter extends FunnelConnectorAdapter {
7
+ private readonly process;
8
+ constructor(deps?: Deps);
9
+ call(input: CallInput): Promise<unknown>;
10
+ }
11
+ export {};
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export declare const ghConnectorSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ type: z.ZodLiteral<"gh">;
6
+ pollInterval: z.ZodOptional<z.ZodNumber>;
7
+ createdAt: z.ZodOptional<z.ZodString>;
8
+ updatedAt: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ export type GhConnectorConfig = z.infer<typeof ghConnectorSchema>;
@@ -0,0 +1,26 @@
1
+ import { FunnelConnectorListener, type NotifyFn } from "./connector-listener";
2
+ import { FunnelLogger } from "../engine/logger/logger";
3
+ import { FunnelProcessRunner } from "../engine/process/process-runner";
4
+ import type { GhConnectorConfig } from "./gh-connector-schema";
5
+ type Deps = {
6
+ config: GhConnectorConfig;
7
+ process?: FunnelProcessRunner;
8
+ logger?: FunnelLogger;
9
+ now?: () => Date;
10
+ };
11
+ export declare class FunnelGhListener extends FunnelConnectorListener {
12
+ private readonly config;
13
+ private readonly process;
14
+ private readonly logger;
15
+ private readonly now;
16
+ private readonly seen;
17
+ private bootstrapped;
18
+ private since;
19
+ private timer;
20
+ constructor(deps: Deps);
21
+ start(notify: NotifyFn): Promise<void>;
22
+ stop(): Promise<void>;
23
+ isAlive(): boolean;
24
+ pollOnce(notify: NotifyFn): Promise<void>;
25
+ }
26
+ export {};
@@ -0,0 +1 @@
1
+ export declare const matchCron: (expr: string, date: Date) => boolean;
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Catch-up behavior when the daemon was down past one or more matching minutes.
4
+ *
5
+ * - `latest`: fire once with the most recent missed match (default; preserves prior behavior).
6
+ * - `all`: fire once per missed minute, oldest first (capped at 24 h).
7
+ * - `skip`: never fire missed matches; only fire when the current minute matches.
8
+ */
9
+ export declare const scheduleCatchupPolicySchema: z.ZodEnum<{
10
+ latest: "latest";
11
+ all: "all";
12
+ skip: "skip";
13
+ }>;
14
+ export type ScheduleCatchupPolicy = z.infer<typeof scheduleCatchupPolicySchema>;
15
+ export declare const scheduleEntrySchema: z.ZodObject<{
16
+ id: z.ZodString;
17
+ cron: z.ZodString;
18
+ prompt: z.ZodString;
19
+ enabled: z.ZodDefault<z.ZodBoolean>;
20
+ catchupPolicy: z.ZodDefault<z.ZodEnum<{
21
+ latest: "latest";
22
+ all: "all";
23
+ skip: "skip";
24
+ }>>;
25
+ }, z.core.$strip>;
26
+ export type ScheduleEntry = z.infer<typeof scheduleEntrySchema>;
27
+ export declare const scheduleConnectorSchema: z.ZodObject<{
28
+ id: z.ZodString;
29
+ name: z.ZodString;
30
+ type: z.ZodLiteral<"schedule">;
31
+ entries: z.ZodDefault<z.ZodArray<z.ZodObject<{
32
+ id: z.ZodString;
33
+ cron: z.ZodString;
34
+ prompt: z.ZodString;
35
+ enabled: z.ZodDefault<z.ZodBoolean>;
36
+ catchupPolicy: z.ZodDefault<z.ZodEnum<{
37
+ latest: "latest";
38
+ all: "all";
39
+ skip: "skip";
40
+ }>>;
41
+ }, z.core.$strip>>>;
42
+ createdAt: z.ZodOptional<z.ZodString>;
43
+ updatedAt: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strip>;
45
+ export type ScheduleConnectorConfig = z.infer<typeof scheduleConnectorSchema>;
@@ -0,0 +1,30 @@
1
+ import { FunnelConnectorListener, type NotifyFn } from "./connector-listener";
2
+ import { ScheduleStateStore } from "./schedule-state-store";
3
+ import { FunnelLogger } from "../engine/logger/logger";
4
+ import type { ScheduleConnectorConfig } from "./schedule-connector-schema";
5
+ type Deps = {
6
+ config: ScheduleConnectorConfig;
7
+ lastFiredStore: ScheduleStateStore;
8
+ logger?: FunnelLogger;
9
+ now?: () => Date;
10
+ };
11
+ export declare class FunnelScheduleListener extends FunnelConnectorListener {
12
+ private readonly config;
13
+ private readonly lastFiredStore;
14
+ private readonly logger;
15
+ private readonly now;
16
+ private timer;
17
+ private stopped;
18
+ constructor(deps: Deps);
19
+ start(notify: NotifyFn): Promise<void>;
20
+ stop(): Promise<void>;
21
+ isAlive(): boolean;
22
+ tick(notify: NotifyFn): Promise<void>;
23
+ private fireEntry;
24
+ private notifyOne;
25
+ private findMostRecentMatch;
26
+ private findAllMatches;
27
+ private logInvalidCron;
28
+ private truncateToMinute;
29
+ }
30
+ export {};
@@ -0,0 +1,19 @@
1
+ import { FunnelFileSystem } from "../engine/fs/file-system";
2
+ type Deps = {
3
+ path: string;
4
+ fs?: FunnelFileSystem;
5
+ };
6
+ /**
7
+ * Per-connector lastFiredAt persistence for the schedule listener. The path is
8
+ * passed in by FunnelConnectorFactory so this store does not know about the
9
+ * funnel directory layout (`channels/<id>/connectors/<id>/state.json` lives
10
+ * outside this class).
11
+ */
12
+ export declare class ScheduleStateStore {
13
+ private readonly path;
14
+ private readonly fs;
15
+ constructor(deps: Deps);
16
+ load(): Map<string, Date>;
17
+ save(state: Map<string, Date>): void;
18
+ }
19
+ export {};