@interactive-inc/claude-funnel 0.8.1 → 0.10.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 (354) hide show
  1. package/README.md +179 -80
  2. package/dist/bin.js +726 -658
  3. package/dist/connector-adapter-CXB-q_XC.d.ts +11 -0
  4. package/dist/connector-adapter-D5Utumgz.js +4 -0
  5. package/dist/connectors/discord.d.ts +76 -0
  6. package/dist/connectors/discord.js +2 -0
  7. package/dist/connectors/gh.d.ts +38 -0
  8. package/dist/connectors/gh.js +2 -0
  9. package/dist/connectors/schedule.d.ts +53 -0
  10. package/dist/connectors/schedule.js +2 -0
  11. package/dist/connectors/slack.d.ts +34 -0
  12. package/dist/connectors/slack.js +2 -0
  13. package/dist/discord-connector-schema-Dww2I4zH.d.ts +14 -0
  14. package/dist/discord-connector-schema-ygf5Df-2.js +173 -0
  15. package/dist/file-system-Co60LrmR.d.ts +74 -0
  16. package/dist/gateway/daemon.js +233 -183
  17. package/dist/gh-connector-schema-2ml29MBC.js +218 -0
  18. package/dist/gh-connector-schema-BZFAS-p-.d.ts +45 -0
  19. package/dist/index.d.ts +3881 -36
  20. package/dist/index.js +6217 -3483
  21. package/dist/logger-CTlXs7z4.d.ts +33 -0
  22. package/dist/node-logger-DQz_BGOD.js +61 -0
  23. package/dist/schedule-connector-schema-CkuIQ0JQ.js +325 -0
  24. package/dist/slack-connector-schema-Cd22WiHB.js +153 -0
  25. package/dist/slack-event-processor-CS-bAit9.d.ts +43 -0
  26. package/package.json +34 -28
  27. package/dist/cli/factory.d.ts +0 -7
  28. package/dist/cli/router/query-to-cli-args.d.ts +0 -1
  29. package/dist/cli/router/to-request.d.ts +0 -5
  30. package/dist/cli/router/validator.d.ts +0 -5
  31. package/dist/cli/routes/channels.$channel.connectors.$connector.d.ts +0 -42
  32. package/dist/cli/routes/channels.$channel.connectors.$connector.rename.$newName.d.ts +0 -46
  33. package/dist/cli/routes/channels.$channel.connectors.$connector.request.d.ts +0 -54
  34. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.add.$id.d.ts +0 -66
  35. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.d.ts +0 -42
  36. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.remove.$id.d.ts +0 -46
  37. package/dist/cli/routes/channels.$channel.connectors.add.$connector.d.ts +0 -90
  38. package/dist/cli/routes/channels.$channel.connectors.d.ts +0 -38
  39. package/dist/cli/routes/channels.$channel.connectors.remove.$connector.d.ts +0 -42
  40. package/dist/cli/routes/channels.$channel.connectors.set.$connector.d.ts +0 -62
  41. package/dist/cli/routes/channels.$channel.d.ts +0 -38
  42. package/dist/cli/routes/channels.$channel.rename.$newName.d.ts +0 -42
  43. package/dist/cli/routes/channels.$channel.set.delivery.$mode.d.ts +0 -28
  44. package/dist/cli/routes/channels.add.$channel.d.ts +0 -46
  45. package/dist/cli/routes/channels.d.ts +0 -16
  46. package/dist/cli/routes/channels.remove.$channel.d.ts +0 -38
  47. package/dist/cli/routes/claude.d.ts +0 -32
  48. package/dist/cli/routes/gateway.d.ts +0 -20
  49. package/dist/cli/routes/gateway.listeners.d.ts +0 -17
  50. package/dist/cli/routes/gateway.logs.d.ts +0 -24
  51. package/dist/cli/routes/gateway.restart.d.ts +0 -24
  52. package/dist/cli/routes/gateway.run.d.ts +0 -24
  53. package/dist/cli/routes/gateway.start.d.ts +0 -24
  54. package/dist/cli/routes/gateway.status.d.ts +0 -13
  55. package/dist/cli/routes/gateway.stop.d.ts +0 -16
  56. package/dist/cli/routes/index.d.ts +0 -1222
  57. package/dist/cli/routes/profiles.$profile.as-default.d.ts +0 -38
  58. package/dist/cli/routes/profiles.$profile.rename.$newName.d.ts +0 -42
  59. package/dist/cli/routes/profiles.$profile.run.d.ts +0 -46
  60. package/dist/cli/routes/profiles.add.$profile.d.ts +0 -54
  61. package/dist/cli/routes/profiles.d.ts +0 -16
  62. package/dist/cli/routes/profiles.remove.$profile.d.ts +0 -38
  63. package/dist/cli/routes/profiles.set.$profile.d.ts +0 -54
  64. package/dist/cli/routes/status.d.ts +0 -16
  65. package/dist/cli/routes/update.d.ts +0 -16
  66. package/dist/connectors/connector-adapter.d.ts +0 -8
  67. package/dist/connectors/connector-config-schema.d.ts +0 -43
  68. package/dist/connectors/connector-factory.d.ts +0 -32
  69. package/dist/connectors/connector-listener.d.ts +0 -17
  70. package/dist/connectors/discord-adapter.d.ts +0 -14
  71. package/dist/connectors/discord-connector-schema.d.ts +0 -10
  72. package/dist/connectors/discord-event-processor.d.ts +0 -26
  73. package/dist/connectors/discord-listener.d.ts +0 -17
  74. package/dist/connectors/gh-adapter.d.ts +0 -11
  75. package/dist/connectors/gh-connector-schema.d.ts +0 -10
  76. package/dist/connectors/gh-listener.d.ts +0 -26
  77. package/dist/connectors/match-cron.d.ts +0 -1
  78. package/dist/connectors/schedule-connector-schema.d.ts +0 -45
  79. package/dist/connectors/schedule-listener.d.ts +0 -30
  80. package/dist/connectors/schedule-state-store.d.ts +0 -19
  81. package/dist/connectors/slack-adapter.d.ts +0 -15
  82. package/dist/connectors/slack-connector-schema.d.ts +0 -11
  83. package/dist/connectors/slack-event-processor.d.ts +0 -27
  84. package/dist/connectors/slack-listener.d.ts +0 -17
  85. package/dist/engine/channels/channels.d.ts +0 -106
  86. package/dist/engine/claude/claude.d.ts +0 -49
  87. package/dist/engine/claude/gateway-controller.d.ts +0 -6
  88. package/dist/engine/fs/file-system.d.ts +0 -24
  89. package/dist/engine/fs/memory-file-system.d.ts +0 -31
  90. package/dist/engine/fs/node-file-system.d.ts +0 -15
  91. package/dist/engine/http/http-client.d.ts +0 -15
  92. package/dist/engine/http/memory-http-client.d.ts +0 -12
  93. package/dist/engine/http/node-http-client.d.ts +0 -5
  94. package/dist/engine/id/id-generator.d.ts +0 -7
  95. package/dist/engine/id/memory-id-generator.d.ts +0 -11
  96. package/dist/engine/id/node-id-generator.d.ts +0 -4
  97. package/dist/engine/logger/logger.d.ts +0 -11
  98. package/dist/engine/logger/memory-logger.d.ts +0 -14
  99. package/dist/engine/logger/node-logger.d.ts +0 -15
  100. package/dist/engine/logger/noop-logger.d.ts +0 -7
  101. package/dist/engine/mcp/channel-server.d.ts +0 -1
  102. package/dist/engine/mcp/mcp.d.ts +0 -22
  103. package/dist/engine/process/memory-process-runner.d.ts +0 -43
  104. package/dist/engine/process/node-process-runner.d.ts +0 -9
  105. package/dist/engine/process/process-runner.d.ts +0 -29
  106. package/dist/engine/profiles/profile-channel-checker.d.ts +0 -7
  107. package/dist/engine/profiles/profiles.d.ts +0 -31
  108. package/dist/engine/settings/mock-settings-reader.d.ts +0 -9
  109. package/dist/engine/settings/settings-reader.d.ts +0 -5
  110. package/dist/engine/settings/settings-schema.d.ts +0 -132
  111. package/dist/engine/settings/settings-store.d.ts +0 -18
  112. package/dist/engine/time/clock.d.ts +0 -9
  113. package/dist/engine/time/memory-clock.d.ts +0 -12
  114. package/dist/engine/time/node-clock.d.ts +0 -4
  115. package/dist/funnel.d.ts +0 -95
  116. package/dist/gateway/auth-middleware.d.ts +0 -14
  117. package/dist/gateway/broadcaster.d.ts +0 -122
  118. package/dist/gateway/daemon.d.ts +0 -2
  119. package/dist/gateway/factory.d.ts +0 -7
  120. package/dist/gateway/funnel-event-store.d.ts +0 -81
  121. package/dist/gateway/gateway-server.d.ts +0 -94
  122. package/dist/gateway/gateway-token.d.ts +0 -33
  123. package/dist/gateway/gateway.d.ts +0 -58
  124. package/dist/gateway/kill-competing-slack-gateways.d.ts +0 -9
  125. package/dist/gateway/listener-supervisor.d.ts +0 -85
  126. package/dist/gateway/listeners-client.d.ts +0 -53
  127. package/dist/gateway/resolve-daemon-script.d.ts +0 -11
  128. package/dist/gateway/routes/channels.connectors.call.d.ts +0 -41
  129. package/dist/gateway/routes/health.d.ts +0 -17
  130. package/dist/gateway/routes/index.d.ts +0 -209
  131. package/dist/gateway/routes/listeners.list.d.ts +0 -14
  132. package/dist/gateway/routes/listeners.restart.d.ts +0 -34
  133. package/dist/gateway/routes/listeners.start.d.ts +0 -34
  134. package/dist/gateway/routes/listeners.stop.d.ts +0 -34
  135. package/dist/gateway/routes/route-deps.d.ts +0 -10
  136. package/dist/gateway/routes/status.d.ts +0 -30
  137. package/dist/gateway/routes/validator.d.ts +0 -19
  138. package/dist/logger/leuco-human-file-writer.d.ts +0 -33
  139. package/dist/logger/leuco-human-logger.d.ts +0 -46
  140. package/dist/logger/leuco-human-record.d.ts +0 -15
  141. package/dist/logger/leuco-human-stdout-writer.d.ts +0 -20
  142. package/dist/logger/leuco-human-writer.d.ts +0 -13
  143. package/dist/logger/leuco-logger-memory-sink.d.ts +0 -33
  144. package/dist/logger/leuco-logger-record.d.ts +0 -13
  145. package/dist/logger/leuco-logger-sink.d.ts +0 -34
  146. package/dist/logger/leuco-logger-sqlite-sink.d.ts +0 -102
  147. package/dist/logger/leuco-logger.d.ts +0 -56
  148. package/lib/bin.ts +0 -78
  149. package/lib/cli/factory.ts +0 -10
  150. package/lib/cli/router/query-to-cli-args.ts +0 -20
  151. package/lib/cli/router/to-request.ts +0 -112
  152. package/lib/cli/router/validator.ts +0 -27
  153. package/lib/cli/routes/channels.$channel.connectors.$connector.rename.$newName.ts +0 -27
  154. package/lib/cli/routes/channels.$channel.connectors.$connector.request.ts +0 -40
  155. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.add.$id.ts +0 -41
  156. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.remove.$id.ts +0 -22
  157. package/lib/cli/routes/channels.$channel.connectors.$connector.schedules.ts +0 -23
  158. package/lib/cli/routes/channels.$channel.connectors.$connector.ts +0 -26
  159. package/lib/cli/routes/channels.$channel.connectors.add.$connector.ts +0 -92
  160. package/lib/cli/routes/channels.$channel.connectors.remove.$connector.ts +0 -22
  161. package/lib/cli/routes/channels.$channel.connectors.set.$connector.ts +0 -63
  162. package/lib/cli/routes/channels.$channel.connectors.ts +0 -26
  163. package/lib/cli/routes/channels.$channel.rename.$newName.ts +0 -22
  164. package/lib/cli/routes/channels.$channel.set.delivery.$mode.ts +0 -34
  165. package/lib/cli/routes/channels.$channel.ts +0 -34
  166. package/lib/cli/routes/channels.add.$channel.ts +0 -33
  167. package/lib/cli/routes/channels.remove.$channel.ts +0 -20
  168. package/lib/cli/routes/channels.ts +0 -39
  169. package/lib/cli/routes/claude.ts +0 -69
  170. package/lib/cli/routes/gateway.listeners.ts +0 -41
  171. package/lib/cli/routes/gateway.logs.ts +0 -123
  172. package/lib/cli/routes/gateway.restart.ts +0 -50
  173. package/lib/cli/routes/gateway.run.ts +0 -41
  174. package/lib/cli/routes/gateway.start.ts +0 -50
  175. package/lib/cli/routes/gateway.status.ts +0 -19
  176. package/lib/cli/routes/gateway.stop.ts +0 -32
  177. package/lib/cli/routes/gateway.ts +0 -55
  178. package/lib/cli/routes/index.ts +0 -202
  179. package/lib/cli/routes/profiles.$profile.as-default.ts +0 -22
  180. package/lib/cli/routes/profiles.$profile.rename.$newName.ts +0 -22
  181. package/lib/cli/routes/profiles.$profile.run.ts +0 -36
  182. package/lib/cli/routes/profiles.add.$profile.ts +0 -46
  183. package/lib/cli/routes/profiles.remove.$profile.ts +0 -20
  184. package/lib/cli/routes/profiles.set.$profile.ts +0 -46
  185. package/lib/cli/routes/profiles.ts +0 -40
  186. package/lib/cli/routes/status.ts +0 -93
  187. package/lib/cli/routes/update.ts +0 -27
  188. package/lib/connectors/connector-adapter.ts +0 -9
  189. package/lib/connectors/connector-config-schema.ts +0 -16
  190. package/lib/connectors/connector-factory.ts +0 -94
  191. package/lib/connectors/connector-listener.ts +0 -20
  192. package/lib/connectors/discord-adapter.ts +0 -51
  193. package/lib/connectors/discord-connector-schema.ts +0 -12
  194. package/lib/connectors/discord-event-processor.ts +0 -48
  195. package/lib/connectors/discord-listener.ts +0 -111
  196. package/lib/connectors/gh-adapter.ts +0 -48
  197. package/lib/connectors/gh-connector-schema.ts +0 -12
  198. package/lib/connectors/gh-listener.ts +0 -137
  199. package/lib/connectors/match-cron.ts +0 -78
  200. package/lib/connectors/schedule-connector-schema.ts +0 -33
  201. package/lib/connectors/schedule-listener.ts +0 -207
  202. package/lib/connectors/schedule-state-store.ts +0 -54
  203. package/lib/connectors/slack-adapter.ts +0 -36
  204. package/lib/connectors/slack-connector-schema.ts +0 -13
  205. package/lib/connectors/slack-event-processor.ts +0 -97
  206. package/lib/connectors/slack-listener.ts +0 -97
  207. package/lib/engine/channels/channels.ts +0 -520
  208. package/lib/engine/claude/claude.ts +0 -199
  209. package/lib/engine/claude/gateway-controller.ts +0 -4
  210. package/lib/engine/fs/file-system.ts +0 -23
  211. package/lib/engine/fs/memory-file-system.ts +0 -102
  212. package/lib/engine/fs/node-file-system.ts +0 -68
  213. package/lib/engine/http/http-client.ts +0 -17
  214. package/lib/engine/http/memory-http-client.ts +0 -36
  215. package/lib/engine/http/node-http-client.ts +0 -23
  216. package/lib/engine/id/id-generator.ts +0 -7
  217. package/lib/engine/id/memory-id-generator.ts +0 -20
  218. package/lib/engine/id/node-id-generator.ts +0 -7
  219. package/lib/engine/logger/logger.ts +0 -11
  220. package/lib/engine/logger/memory-logger.ts +0 -28
  221. package/lib/engine/logger/node-logger.ts +0 -49
  222. package/lib/engine/logger/noop-logger.ts +0 -9
  223. package/lib/engine/mcp/channel-server.ts +0 -204
  224. package/lib/engine/mcp/mcp.ts +0 -126
  225. package/lib/engine/process/memory-process-runner.ts +0 -88
  226. package/lib/engine/process/node-process-runner.ts +0 -91
  227. package/lib/engine/process/process-runner.ts +0 -33
  228. package/lib/engine/profiles/profile-channel-checker.ts +0 -7
  229. package/lib/engine/profiles/profiles.ts +0 -126
  230. package/lib/engine/settings/mock-settings-reader.ts +0 -27
  231. package/lib/engine/settings/settings-reader.ts +0 -6
  232. package/lib/engine/settings/settings-schema.ts +0 -46
  233. package/lib/engine/settings/settings-store.ts +0 -110
  234. package/lib/engine/time/clock.ts +0 -15
  235. package/lib/engine/time/memory-clock.ts +0 -26
  236. package/lib/engine/time/node-clock.ts +0 -7
  237. package/lib/funnel.ts +0 -187
  238. package/lib/gateway/auth-middleware.ts +0 -44
  239. package/lib/gateway/broadcaster.ts +0 -319
  240. package/lib/gateway/daemon.ts +0 -47
  241. package/lib/gateway/factory.ts +0 -10
  242. package/lib/gateway/funnel-event-store.ts +0 -155
  243. package/lib/gateway/gateway-server.ts +0 -414
  244. package/lib/gateway/gateway-token.ts +0 -79
  245. package/lib/gateway/gateway.ts +0 -209
  246. package/lib/gateway/kill-competing-slack-gateways.ts +0 -56
  247. package/lib/gateway/listener-supervisor.ts +0 -339
  248. package/lib/gateway/listeners-client.ts +0 -128
  249. package/lib/gateway/resolve-daemon-script.ts +0 -26
  250. package/lib/gateway/routes/channels.connectors.call.ts +0 -39
  251. package/lib/gateway/routes/health.ts +0 -13
  252. package/lib/gateway/routes/index.ts +0 -24
  253. package/lib/gateway/routes/listeners.list.ts +0 -6
  254. package/lib/gateway/routes/listeners.restart.ts +0 -15
  255. package/lib/gateway/routes/listeners.start.ts +0 -15
  256. package/lib/gateway/routes/listeners.stop.ts +0 -15
  257. package/lib/gateway/routes/route-deps.ts +0 -11
  258. package/lib/gateway/routes/status.ts +0 -15
  259. package/lib/gateway/routes/validator.ts +0 -17
  260. package/lib/index.ts +0 -52
  261. package/lib/logger/leuco-human-file-writer.ts +0 -65
  262. package/lib/logger/leuco-human-logger.ts +0 -98
  263. package/lib/logger/leuco-human-record.ts +0 -16
  264. package/lib/logger/leuco-human-stdout-writer.ts +0 -26
  265. package/lib/logger/leuco-human-writer.ts +0 -14
  266. package/lib/logger/leuco-logger-memory-sink.ts +0 -67
  267. package/lib/logger/leuco-logger-record.ts +0 -13
  268. package/lib/logger/leuco-logger-sink.ts +0 -33
  269. package/lib/logger/leuco-logger-sqlite-sink.ts +0 -355
  270. package/lib/logger/leuco-logger.ts +0 -135
  271. package/lib/tui/app.tsx +0 -357
  272. package/lib/tui/components/add-row.tsx +0 -18
  273. package/lib/tui/components/brand.tsx +0 -27
  274. package/lib/tui/components/card.tsx +0 -44
  275. package/lib/tui/components/detail-bar.tsx +0 -46
  276. package/lib/tui/components/editable-field.tsx +0 -33
  277. package/lib/tui/components/empty-state.tsx +0 -11
  278. package/lib/tui/components/gateway-status.tsx +0 -66
  279. package/lib/tui/components/keymap.tsx +0 -29
  280. package/lib/tui/components/menu-item.tsx +0 -73
  281. package/lib/tui/components/menu.tsx +0 -26
  282. package/lib/tui/components/panel-header.tsx +0 -22
  283. package/lib/tui/components/readonly-field.tsx +0 -18
  284. package/lib/tui/components/section-header.tsx +0 -25
  285. package/lib/tui/components/selection-accent.tsx +0 -32
  286. package/lib/tui/components/session-item.tsx +0 -33
  287. package/lib/tui/components/session-list.tsx +0 -33
  288. package/lib/tui/components/ui/hascii/accordion-item.tsx +0 -88
  289. package/lib/tui/components/ui/hascii/accordion.tsx +0 -96
  290. package/lib/tui/components/ui/hascii/alert-dialog.tsx +0 -43
  291. package/lib/tui/components/ui/hascii/badge.tsx +0 -51
  292. package/lib/tui/components/ui/hascii/breadcrumb.tsx +0 -58
  293. package/lib/tui/components/ui/hascii/button.tsx +0 -194
  294. package/lib/tui/components/ui/hascii/card-content.tsx +0 -14
  295. package/lib/tui/components/ui/hascii/card-description.tsx +0 -13
  296. package/lib/tui/components/ui/hascii/card-footer.tsx +0 -14
  297. package/lib/tui/components/ui/hascii/card-header.tsx +0 -14
  298. package/lib/tui/components/ui/hascii/card-title.tsx +0 -13
  299. package/lib/tui/components/ui/hascii/card.tsx +0 -27
  300. package/lib/tui/components/ui/hascii/checkbox.tsx +0 -65
  301. package/lib/tui/components/ui/hascii/command.tsx +0 -159
  302. package/lib/tui/components/ui/hascii/dialog-content.tsx +0 -14
  303. package/lib/tui/components/ui/hascii/dialog-description.tsx +0 -13
  304. package/lib/tui/components/ui/hascii/dialog-footer.tsx +0 -14
  305. package/lib/tui/components/ui/hascii/dialog-header.tsx +0 -14
  306. package/lib/tui/components/ui/hascii/dialog-title.tsx +0 -13
  307. package/lib/tui/components/ui/hascii/dialog.tsx +0 -27
  308. package/lib/tui/components/ui/hascii/file-tree.tsx +0 -142
  309. package/lib/tui/components/ui/hascii/focus-group.tsx +0 -62
  310. package/lib/tui/components/ui/hascii/form-item.tsx +0 -43
  311. package/lib/tui/components/ui/hascii/input-otp.tsx +0 -86
  312. package/lib/tui/components/ui/hascii/input.tsx +0 -130
  313. package/lib/tui/components/ui/hascii/pagination.tsx +0 -105
  314. package/lib/tui/components/ui/hascii/progress.tsx +0 -28
  315. package/lib/tui/components/ui/hascii/select.tsx +0 -131
  316. package/lib/tui/components/ui/hascii/separator.tsx +0 -35
  317. package/lib/tui/components/ui/hascii/sidebar-content.tsx +0 -23
  318. package/lib/tui/components/ui/hascii/sidebar-header.tsx +0 -14
  319. package/lib/tui/components/ui/hascii/sidebar-menu-item.tsx +0 -67
  320. package/lib/tui/components/ui/hascii/sidebar.tsx +0 -24
  321. package/lib/tui/components/ui/hascii/skeleton.tsx +0 -60
  322. package/lib/tui/components/ui/hascii/slider.tsx +0 -91
  323. package/lib/tui/components/ui/hascii/snackbar.tsx +0 -75
  324. package/lib/tui/components/ui/hascii/sparkline.tsx +0 -53
  325. package/lib/tui/components/ui/hascii/spinner.tsx +0 -47
  326. package/lib/tui/components/ui/hascii/stepper.tsx +0 -54
  327. package/lib/tui/components/ui/hascii/switch.tsx +0 -66
  328. package/lib/tui/components/ui/hascii/table.tsx +0 -95
  329. package/lib/tui/components/ui/hascii/tabs.tsx +0 -59
  330. package/lib/tui/components/ui/hascii/toggle-group-item.tsx +0 -45
  331. package/lib/tui/components/ui/hascii/toggle-group.tsx +0 -99
  332. package/lib/tui/components/ui/hascii/tree.tsx +0 -104
  333. package/lib/tui/components/view-shell.tsx +0 -44
  334. package/lib/tui/filter-input.tsx +0 -33
  335. package/lib/tui/hooks/hascii/use-pressable.ts +0 -54
  336. package/lib/tui/parse-comma-list.ts +0 -14
  337. package/lib/tui/profile-launcher.tsx +0 -61
  338. package/lib/tui/scrollbar-options.ts +0 -19
  339. package/lib/tui/sidebar.tsx +0 -50
  340. package/lib/tui/theme.ts +0 -40
  341. package/lib/tui/tui.tsx +0 -20
  342. package/lib/tui/types.ts +0 -38
  343. package/lib/tui/unique-name.ts +0 -18
  344. package/lib/tui/use-event-stream.ts +0 -133
  345. package/lib/tui/use-snapshot.ts +0 -99
  346. package/lib/tui/utils/hascii/form-item-context.tsx +0 -23
  347. package/lib/tui/utils/hascii/input-focus-context.tsx +0 -31
  348. package/lib/tui/utils/hascii/theme-context.tsx +0 -26
  349. package/lib/tui/utils/hascii/theme.ts +0 -176
  350. package/lib/tui/views/channels-view.tsx +0 -108
  351. package/lib/tui/views/connectors-view.tsx +0 -164
  352. package/lib/tui/views/events-view.tsx +0 -160
  353. package/lib/tui/views/listeners-view.tsx +0 -80
  354. package/lib/tui/views/profiles-view.tsx +0 -152
@@ -1,15 +0,0 @@
1
- import { FunnelConnectorAdapter, type CallInput } from "./connector-adapter";
2
- import type { SlackConnectorConfig } from "./slack-connector-schema";
3
- export type SlackWebClientLike = {
4
- apiCall: (method: string, options?: Record<string, unknown>) => Promise<unknown>;
5
- };
6
- type Deps = {
7
- config: SlackConnectorConfig;
8
- client?: SlackWebClientLike;
9
- };
10
- export declare class FunnelSlackAdapter extends FunnelConnectorAdapter {
11
- private readonly client;
12
- constructor(deps: Deps);
13
- call(input: CallInput): Promise<unknown>;
14
- }
15
- export {};
@@ -1,11 +0,0 @@
1
- import { z } from "zod";
2
- export declare const slackConnectorSchema: 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>;
11
- export type SlackConnectorConfig = z.infer<typeof slackConnectorSchema>;
@@ -1,27 +0,0 @@
1
- export type SlackRawEvent = Record<string, unknown>;
2
- export type SlackProcessedSkip = {
3
- skip: true;
4
- };
5
- export type SlackProcessedEmit = {
6
- skip: false;
7
- content: string;
8
- meta: Record<string, string>;
9
- shouldReact: boolean;
10
- channel: string;
11
- timestamp: string;
12
- };
13
- export type SlackProcessed = SlackProcessedSkip | SlackProcessedEmit;
14
- type Props = {
15
- ownBotUserId: string;
16
- ownBotId: string;
17
- now?: () => number;
18
- };
19
- export declare class FunnelSlackEventProcessor {
20
- private readonly ownBotUserId;
21
- private readonly ownBotId;
22
- private readonly now;
23
- private readonly dedup;
24
- constructor(props: Props);
25
- process(event: SlackRawEvent): SlackProcessed;
26
- }
27
- export {};
@@ -1,17 +0,0 @@
1
- import { FunnelConnectorListener, type NotifyFn } from "./connector-listener";
2
- import { FunnelLogger } from "../engine/logger/logger";
3
- import type { SlackConnectorConfig } from "./slack-connector-schema";
4
- type Deps = {
5
- config: SlackConnectorConfig;
6
- logger?: FunnelLogger;
7
- };
8
- export declare class FunnelSlackListener extends FunnelConnectorListener {
9
- private readonly config;
10
- private readonly logger;
11
- private app;
12
- constructor(deps: Deps);
13
- start(notify: NotifyFn): Promise<void>;
14
- stop(): Promise<void>;
15
- isAlive(): boolean;
16
- }
17
- export {};
@@ -1,106 +0,0 @@
1
- import type { CallInput } from "../../connectors/connector-adapter";
2
- import type { ConnectorConfig } from "../../connectors/connector-config-schema";
3
- import type { FunnelConnectorFactory } from "../../connectors/connector-factory";
4
- import type { FunnelConnectorListener } from "../../connectors/connector-listener";
5
- import type { ScheduleConnectorConfig, ScheduleEntry } from "../../connectors/schedule-connector-schema";
6
- import type { ProfileChannelChecker } from "../profiles/profile-channel-checker";
7
- import { FunnelClock } from "../time/clock";
8
- import { FunnelIdGenerator } from "../id/id-generator";
9
- import { FunnelSettingsReader } from "../settings/settings-reader";
10
- import type { ChannelConfig, ChannelDeliveryMode } from "../settings/settings-schema";
11
- type Deps = {
12
- store: FunnelSettingsReader;
13
- factory: FunnelConnectorFactory;
14
- profileChecker: ProfileChannelChecker;
15
- clock?: FunnelClock;
16
- idGenerator?: FunnelIdGenerator;
17
- };
18
- export type ChannelConnectorView = ConnectorConfig & {
19
- channelId: string;
20
- channelName: string;
21
- };
22
- type AddConnectorInput = {
23
- type: "slack";
24
- name: string;
25
- botToken: string;
26
- appToken: string;
27
- } | {
28
- type: "gh";
29
- name: string;
30
- pollInterval?: number;
31
- } | {
32
- type: "discord";
33
- name: string;
34
- botToken: string;
35
- } | {
36
- type: "schedule";
37
- name: string;
38
- entries?: ScheduleEntry[];
39
- };
40
- /**
41
- * Channels own their connectors. Each channel has a stable id (UUID); the
42
- * `name` is the human-facing label used by the CLI. Connectors live nested
43
- * inside `channel.connectors[]`, so add/remove/rename are channel-scoped — no
44
- * global connector namespace exists. Token uniqueness is enforced across all
45
- * channels at add/update time so the same Slack/Discord credentials cannot
46
- * be registered twice.
47
- */
48
- export declare class FunnelChannels {
49
- private readonly store;
50
- private readonly factory;
51
- private readonly profileChecker;
52
- private readonly clock;
53
- private readonly idGenerator;
54
- constructor(deps: Deps);
55
- list(): ChannelConfig[];
56
- get(name: string): ChannelConfig | null;
57
- getById(id: string): ChannelConfig | null;
58
- add(input: {
59
- name: string;
60
- delivery?: ChannelDeliveryMode;
61
- }): ChannelConfig;
62
- setDelivery(name: string, delivery: ChannelDeliveryMode): void;
63
- remove(name: string): void;
64
- rename(oldName: string, newName: string): void;
65
- listConnectors(channelName: string): ConnectorConfig[];
66
- getConnector(channelName: string, connectorName: string): ConnectorConfig | null;
67
- listAllConnectors(): ChannelConnectorView[];
68
- addConnector(channelName: string, input: AddConnectorInput): ConnectorConfig;
69
- private fromInput;
70
- removeConnector(channelName: string, connectorName: string): void;
71
- renameConnector(channelName: string, oldName: string, newName: string): void;
72
- updateSlackConnector(channelName: string, connectorName: string, fields: {
73
- botToken?: string;
74
- appToken?: string;
75
- }): void;
76
- updateGhConnector(channelName: string, connectorName: string, fields: {
77
- pollInterval?: number;
78
- }): void;
79
- updateDiscordConnector(channelName: string, connectorName: string, fields: {
80
- botToken?: string;
81
- }): void;
82
- listScheduleEntries(channelName: string, connectorName: string): ScheduleEntry[];
83
- addScheduleEntry(channelName: string, connectorName: string, entry: Pick<ScheduleEntry, "cron" | "prompt"> & Partial<Pick<ScheduleEntry, "id" | "enabled" | "catchupPolicy">>): ScheduleEntry;
84
- removeScheduleEntry(channelName: string, connectorName: string, id: string): void;
85
- call(channelName: string, connectorName: string, input: CallInput): Promise<unknown>;
86
- createListener(channelName: string, connectorName: string): {
87
- config: ConnectorConfig;
88
- channelId: string;
89
- listener: FunnelConnectorListener;
90
- } | null;
91
- createAllListeners(): {
92
- config: ConnectorConfig;
93
- channelId: string;
94
- channelName: string;
95
- listener: FunnelConnectorListener;
96
- }[];
97
- private requireChannel;
98
- private requireConnector;
99
- private requireSlackConnector;
100
- private requireGhConnector;
101
- private requireDiscordConnector;
102
- private requireScheduleConnector;
103
- private assertNoTokenCollision;
104
- private tokensOf;
105
- }
106
- export type { ScheduleConnectorConfig };
@@ -1,49 +0,0 @@
1
- import type { FunnelChannels } from "../channels/channels";
2
- import type { GatewayController } from "./gateway-controller";
3
- import { FunnelFileSystem } from "../fs/file-system";
4
- import { FunnelLogger } from "../logger/logger";
5
- import type { FunnelMcp } from "../mcp/mcp";
6
- import { FunnelProcessRunner } from "../process/process-runner";
7
- export type LaunchOptions = {
8
- channel: string;
9
- cwd?: string;
10
- subAgent?: string;
11
- userArgs?: string[];
12
- profileName?: string;
13
- };
14
- type Deps = {
15
- channels: FunnelChannels;
16
- mcp: FunnelMcp;
17
- gateway: GatewayController;
18
- process?: FunnelProcessRunner;
19
- fs?: FunnelFileSystem;
20
- logger?: FunnelLogger;
21
- dir?: string;
22
- };
23
- /**
24
- * Launches Claude Code with funnel pre-wired: ensures the gateway is running,
25
- * installs the funnel MCP into the target repo's `.mcp.json` if missing,
26
- * injects `FUNNEL_CHANNEL_ID` into the child env, and writes a per-profile
27
- * PID file to enforce singleton launches.
28
- */
29
- export declare class FunnelClaude {
30
- private readonly channels;
31
- private readonly mcp;
32
- private readonly gateway;
33
- private readonly process;
34
- private readonly fs;
35
- private readonly logger;
36
- private readonly pidDir;
37
- constructor(deps: Deps);
38
- launch(options: LaunchOptions): Promise<number>;
39
- isRunning(profileName: string): boolean;
40
- private pidPath;
41
- private readPid;
42
- private writePidFile;
43
- private removePidFile;
44
- private installCleanup;
45
- private isProcessAlive;
46
- private buildArgs;
47
- private buildEnv;
48
- }
49
- export {};
@@ -1,6 +0,0 @@
1
- export type GatewayController = {
2
- isRunning(): boolean;
3
- start(options?: {
4
- caffeinate?: boolean;
5
- }): Promise<boolean>;
6
- };
@@ -1,24 +0,0 @@
1
- export type FileStat = {
2
- mtimeMs: number;
3
- /** POSIX mode bits (e.g. 0o600). `null` when the underlying FS does not expose mode. */
4
- mode: number | null;
5
- };
6
- /**
7
- * Filesystem boundary used everywhere funnel reads or writes.
8
- * Default is NodeFunnelFileSystem (real `node:fs`); MemoryFunnelFileSystem
9
- * provides a sandbox for tests and embedded use.
10
- */
11
- export declare abstract class FunnelFileSystem {
12
- abstract existsSync(path: string): boolean;
13
- abstract readFileSync(path: string): string;
14
- abstract writeFileSync(path: string, data: string): void;
15
- /** Write `data` and ensure the resulting file is owner-only (0600). Use for tokens and any file that may contain secrets. */
16
- abstract writeSecretFileSync(path: string, data: string): void;
17
- abstract appendFileSync(path: string, data: string): void;
18
- abstract unlink(path: string): void;
19
- abstract mkdirSync(path: string, options?: {
20
- recursive?: boolean;
21
- }): void;
22
- abstract readdirSync(path: string): string[];
23
- abstract statSync(path: string): FileStat;
24
- }
@@ -1,31 +0,0 @@
1
- import { type FileStat, FunnelFileSystem } from "./file-system";
2
- type Props = {
3
- dirs?: string[];
4
- files?: Record<string, string>;
5
- mtimes?: Record<string, number>;
6
- modes?: Record<string, number>;
7
- now?: () => number;
8
- };
9
- export declare class MemoryFunnelFileSystem extends FunnelFileSystem {
10
- private readonly dirs;
11
- private readonly files;
12
- private readonly mtimes;
13
- private readonly modes;
14
- private readonly now;
15
- constructor(props?: Props);
16
- existsSync(path: string): boolean;
17
- readFileSync(path: string): string;
18
- writeFileSync(path: string, data: string): void;
19
- writeSecretFileSync(path: string, data: string): void;
20
- appendFileSync(path: string, data: string): void;
21
- unlink(path: string): void;
22
- mkdirSync(path: string, options?: {
23
- recursive?: boolean;
24
- }): void;
25
- readdirSync(path: string): string[];
26
- statSync(path: string): FileStat;
27
- setMtime(path: string, mtimeMs: number): void;
28
- setMode(path: string, mode: number): void;
29
- private touch;
30
- }
31
- export {};
@@ -1,15 +0,0 @@
1
- import { type FileStat, FunnelFileSystem } from "./file-system";
2
- export declare class NodeFunnelFileSystem extends FunnelFileSystem {
3
- constructor();
4
- existsSync(path: string): boolean;
5
- readFileSync(path: string): string;
6
- writeFileSync(path: string, data: string): void;
7
- writeSecretFileSync(path: string, data: string): void;
8
- appendFileSync(path: string, data: string): void;
9
- unlink(path: string): void;
10
- mkdirSync(path: string, options?: {
11
- recursive?: boolean;
12
- }): void;
13
- readdirSync(path: string): string[];
14
- statSync(path: string): FileStat;
15
- }
@@ -1,15 +0,0 @@
1
- export type HttpRequest = {
2
- method: string;
3
- url: string;
4
- headers?: Record<string, string>;
5
- body?: string;
6
- };
7
- export type HttpResponse = {
8
- status: number;
9
- ok: boolean;
10
- text(): Promise<string>;
11
- json(): Promise<unknown>;
12
- };
13
- export declare abstract class FunnelHttpClient {
14
- abstract fetch(request: HttpRequest): Promise<HttpResponse>;
15
- }
@@ -1,12 +0,0 @@
1
- import { FunnelHttpClient, type HttpRequest, type HttpResponse } from "./http-client";
2
- export type MemoryHttpResponse = {
3
- status?: number;
4
- body?: string;
5
- };
6
- export type MemoryHttpHandler = (request: HttpRequest) => MemoryHttpResponse | Promise<MemoryHttpResponse>;
7
- export declare class MemoryFunnelHttpClient extends FunnelHttpClient {
8
- readonly calls: HttpRequest[];
9
- private handler;
10
- on(handler: MemoryHttpHandler): this;
11
- fetch(request: HttpRequest): Promise<HttpResponse>;
12
- }
@@ -1,5 +0,0 @@
1
- import { FunnelHttpClient, type HttpRequest, type HttpResponse } from "./http-client";
2
- export declare class NodeFunnelHttpClient extends FunnelHttpClient {
3
- constructor();
4
- fetch(request: HttpRequest): Promise<HttpResponse>;
5
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * ID generator boundary. Default NodeFunnelIdGenerator wraps `crypto.randomUUID()`;
3
- * MemoryFunnelIdGenerator emits `<prefix>-1, <prefix>-2, ...` for deterministic tests.
4
- */
5
- export declare abstract class FunnelIdGenerator {
6
- abstract generate(): string;
7
- }
@@ -1,11 +0,0 @@
1
- import { FunnelIdGenerator } from "./id-generator";
2
- type Props = {
3
- prefix?: string;
4
- };
5
- export declare class MemoryFunnelIdGenerator extends FunnelIdGenerator {
6
- private counter;
7
- private readonly prefix;
8
- constructor(props?: Props);
9
- generate(): string;
10
- }
11
- export {};
@@ -1,4 +0,0 @@
1
- import { FunnelIdGenerator } from "./id-generator";
2
- export declare class NodeFunnelIdGenerator extends FunnelIdGenerator {
3
- generate(): string;
4
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * Structured logger with three levels and an optional log-file path.
3
- * Defaults to NodeFunnelLogger (appends to /tmp/funnel/funnel.log);
4
- * MemoryFunnelLogger captures entries in memory and NoopFunnelLogger silences output.
5
- */
6
- export declare abstract class FunnelLogger {
7
- abstract info(message: string, meta?: Record<string, unknown>): void;
8
- abstract warn(message: string, meta?: Record<string, unknown>): void;
9
- abstract error(message: string, meta?: Record<string, unknown>): void;
10
- abstract readonly file: string | null;
11
- }
@@ -1,14 +0,0 @@
1
- import { FunnelLogger } from "./logger";
2
- export type LogEntry = {
3
- level: "info" | "warn" | "error";
4
- message: string;
5
- meta?: Record<string, unknown>;
6
- };
7
- export declare class MemoryFunnelLogger extends FunnelLogger {
8
- readonly file: null;
9
- readonly entries: LogEntry[];
10
- info(message: string, meta?: Record<string, unknown>): void;
11
- warn(message: string, meta?: Record<string, unknown>): void;
12
- error(message: string, meta?: Record<string, unknown>): void;
13
- clear(): void;
14
- }
@@ -1,15 +0,0 @@
1
- import { FunnelLogger } from "./logger";
2
- type Props = {
3
- file?: string;
4
- now?: () => Date;
5
- };
6
- export declare class NodeFunnelLogger extends FunnelLogger {
7
- readonly file: string;
8
- private readonly now;
9
- constructor(props?: Props);
10
- info(message: string, meta?: Record<string, unknown>): void;
11
- warn(message: string, meta?: Record<string, unknown>): void;
12
- error(message: string, meta?: Record<string, unknown>): void;
13
- private write;
14
- }
15
- export {};
@@ -1,7 +0,0 @@
1
- import { FunnelLogger } from "./logger";
2
- export declare class NoopFunnelLogger extends FunnelLogger {
3
- readonly file: null;
4
- info(): void;
5
- warn(): void;
6
- error(): void;
7
- }
@@ -1 +0,0 @@
1
- export declare const startChannelServer: () => Promise<void>;
@@ -1,22 +0,0 @@
1
- import { FunnelFileSystem } from "../fs/file-system";
2
- export declare const FUNNEL_MCP_COMMAND = "funnel";
3
- export declare const FUNNEL_MCP_NAME = "funnel";
4
- type Deps = {
5
- fs?: FunnelFileSystem;
6
- };
7
- /**
8
- * Installs/uninstalls the funnel MCP entry into a target repository's
9
- * `.mcp.json`. Detects an existing entry by command match so renaming is
10
- * preserved across re-installs.
11
- */
12
- export declare class FunnelMcp {
13
- private readonly fs;
14
- constructor(deps?: Deps);
15
- install(repoPath: string): void;
16
- uninstall(repoPath: string): void;
17
- findInstalledName(cwd: string): string | null;
18
- private findServerName;
19
- private readConfig;
20
- private writeConfig;
21
- }
22
- export {};
@@ -1,43 +0,0 @@
1
- import { type AttachOptions, type DetachOptions, FunnelProcessRunner, type RunOptions, type RunResult } from "./process-runner";
2
- export type MemoryProcessResponse = {
3
- exitCode?: number;
4
- stdout?: string;
5
- stderr?: string;
6
- };
7
- export type MemoryProcessHandler = (command: string[]) => MemoryProcessResponse | Promise<MemoryProcessResponse>;
8
- export type MemoryProcessSyncHandler = (command: string[]) => MemoryProcessResponse;
9
- export type MemoryProcessCall = {
10
- kind: "run";
11
- command: string[];
12
- options: RunOptions;
13
- } | {
14
- kind: "runSync";
15
- command: string[];
16
- } | {
17
- kind: "attach";
18
- command: string[];
19
- options: AttachOptions;
20
- } | {
21
- kind: "detach";
22
- command: string[];
23
- options: DetachOptions;
24
- } | {
25
- kind: "kill";
26
- command: string[];
27
- };
28
- export declare class MemoryFunnelProcessRunner extends FunnelProcessRunner {
29
- readonly calls: MemoryProcessCall[];
30
- readonly killed: {
31
- pid: number;
32
- signal: string;
33
- }[];
34
- private handler;
35
- private syncHandler;
36
- on(handler: MemoryProcessHandler): this;
37
- onSync(handler: MemoryProcessSyncHandler): this;
38
- run(command: string[], options?: RunOptions): Promise<RunResult>;
39
- runSync(command: string[]): RunResult;
40
- attach(command: string[], options?: AttachOptions): Promise<number>;
41
- detach(command: string[], options?: DetachOptions): void;
42
- kill(pid: number, signal?: string): void;
43
- }
@@ -1,9 +0,0 @@
1
- import { type AttachOptions, type DetachOptions, FunnelProcessRunner, type RunOptions, type RunResult } from "./process-runner";
2
- export declare class NodeFunnelProcessRunner extends FunnelProcessRunner {
3
- constructor();
4
- runSync(command: string[]): RunResult;
5
- run(command: string[], options?: RunOptions): Promise<RunResult>;
6
- attach(command: string[], options?: AttachOptions): Promise<number>;
7
- detach(command: string[], options?: DetachOptions): void;
8
- kill(pid: number, signal?: string): void;
9
- }
@@ -1,29 +0,0 @@
1
- export type RunOptions = {
2
- cwd?: string;
3
- env?: Record<string, string>;
4
- input?: string;
5
- };
6
- export type RunResult = {
7
- exitCode: number;
8
- stdout: string;
9
- stderr: string;
10
- };
11
- export type AttachOptions = {
12
- cwd?: string;
13
- env?: Record<string, string>;
14
- };
15
- export type DetachOptions = {
16
- env?: Record<string, string>;
17
- };
18
- /**
19
- * Process boundary covering one-shot runs, sync runs, foreground attach, and
20
- * detached background spawns. Default is NodeFunnelProcessRunner (Bun.spawn);
21
- * MemoryFunnelProcessRunner records calls and lets tests stub responses.
22
- */
23
- export declare abstract class FunnelProcessRunner {
24
- abstract run(command: string[], options?: RunOptions): Promise<RunResult>;
25
- abstract runSync(command: string[]): RunResult;
26
- abstract attach(command: string[], options?: AttachOptions): Promise<number>;
27
- abstract detach(command: string[], options?: DetachOptions): void;
28
- abstract kill(pid: number, signal?: string): void;
29
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * Read-side dependency that lets FunnelChannels ask whether a profile
3
- * references a given channel id, without depending on FunnelProfiles directly.
4
- */
5
- export type ProfileChannelChecker = {
6
- hasChannelRef(channelId: string): boolean;
7
- };
@@ -1,31 +0,0 @@
1
- import { FunnelSettingsReader } from "../settings/settings-reader";
2
- import type { ProfileConfig } from "../settings/settings-schema";
3
- type Deps = {
4
- store: FunnelSettingsReader;
5
- };
6
- /**
7
- * Named launch presets for `fnl claude`. Each profile bundles a working
8
- * directory, a sub-agent name, and the channel id its Claude instance will
9
- * subscribe to. Implements ProfileChannelChecker so FunnelChannels can refuse
10
- * to remove a channel that is still referenced.
11
- *
12
- * The first entry in the persisted array is treated as the default profile;
13
- * `asDefault` reorders the array to put a named profile first.
14
- *
15
- * `channelId` always stores the channel's stable id (uuid). CLI surfaces
16
- * resolve channel name → id before calling `add`/`update` here.
17
- */
18
- export declare class FunnelProfiles {
19
- private readonly store;
20
- constructor(deps: Deps);
21
- list(): ProfileConfig[];
22
- get(name: string): ProfileConfig | null;
23
- getDefault(): ProfileConfig | null;
24
- add(config: ProfileConfig): void;
25
- remove(name: string): void;
26
- rename(oldName: string, newName: string): void;
27
- asDefault(name: string): void;
28
- hasChannelRef(channelId: string): boolean;
29
- update(name: string, fields: Partial<Omit<ProfileConfig, "name">>): void;
30
- }
31
- export {};
@@ -1,9 +0,0 @@
1
- import { FunnelSettingsReader } from "./settings-reader";
2
- import type { Settings } from "./settings-schema";
3
- export declare const createSettings: (partial?: Partial<Settings>) => Settings;
4
- export declare class MockFunnelSettingsReader extends FunnelSettingsReader {
5
- private state;
6
- constructor(initial?: Partial<Settings>);
7
- read(): Settings;
8
- write(settings: Settings): void;
9
- }
@@ -1,5 +0,0 @@
1
- import type { Settings } from "./settings-schema";
2
- export declare abstract class FunnelSettingsReader {
3
- abstract read(): Settings;
4
- abstract write(settings: Settings): void;
5
- }