@interactive-inc/claude-funnel 0.59.1 → 0.60.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 (85) hide show
  1. package/README.md +9 -3
  2. package/dist/bin.js +549 -487
  3. package/dist/channels-2g_BU1N0.d.ts +174 -0
  4. package/dist/claude.d.ts +9 -5
  5. package/dist/claude.js +54 -17
  6. package/dist/{diagnostic-log-Cb3v8P7p.d.ts → connector-descriptor-6SXJoszo.d.ts} +158 -2
  7. package/dist/connectors/discord.d.ts +30 -4
  8. package/dist/connectors/discord.js +2 -2
  9. package/dist/connectors/gh.d.ts +21 -5
  10. package/dist/connectors/gh.js +3 -3
  11. package/dist/connectors/schedule.d.ts +124 -2
  12. package/dist/connectors/schedule.js +3 -3
  13. package/dist/connectors/slack.d.ts +149 -5
  14. package/dist/connectors/slack.js +2 -2
  15. package/dist/{diagnostic-sql-reader-CzYgZpq2.js → diagnostic-sql-reader-C9zR-Csp.js} +5 -5
  16. package/dist/diagnostics.d.ts +1 -1
  17. package/dist/diagnostics.js +1 -1
  18. package/dist/{discord-listener-CKsZGTnH.js → discord-connector-BL36yvbL.js} +60 -37
  19. package/dist/docs.d.ts +1 -1
  20. package/dist/docs.js +1 -1
  21. package/dist/doctor.d.ts +1 -1
  22. package/dist/doctor.js +1 -1
  23. package/dist/error-message-of-Byi4y0Uf.js +9 -0
  24. package/dist/{file-process-guard-JhFpmHYo.d.ts → file-process-guard-C_PLxfUX.d.ts} +6 -5
  25. package/dist/{funnel-diagnostics-BpKYrMSu.js → funnel-diagnostics-CSiJmPlZ.js} +19 -2
  26. package/dist/{funnel-diagnostics-K-wON25Y.d.ts → funnel-diagnostics-DpXOsCty.d.ts} +3 -3
  27. package/dist/{funnel-docs-ng5K8w4j.js → funnel-docs-BxXZ9Ksx.js} +76 -3
  28. package/dist/{funnel-docs-DYBs1-H_.d.ts → funnel-docs-CNklHvbt.d.ts} +1 -1
  29. package/dist/{funnel-doctor-vxO96TCA.d.ts → funnel-doctor-CZf_0Luq.d.ts} +2 -2
  30. package/dist/{funnel-recovery-COExL9MD.d.ts → funnel-recovery-DnLrdWO9.d.ts} +1 -1
  31. package/dist/gateway/daemon.js +326 -266
  32. package/dist/gateway-base-url-Dy4Ykuoh.js +14 -0
  33. package/dist/gateway.d.ts +2 -2
  34. package/dist/gateway.js +2 -2
  35. package/dist/{gh-listener-B2I4s8qh.js → gh-connector-DpiixfQZ.js} +53 -5
  36. package/dist/gh-connector-schema-Rzwc1c1N.js +12 -0
  37. package/dist/http-client-oICicjuO.d.ts +18 -0
  38. package/dist/index-CgY8NdMz.d.ts +1057 -0
  39. package/dist/index.d.ts +1558 -17
  40. package/dist/index.js +376 -343
  41. package/dist/{local-config-json-schema-DE1zkMcb.js → local-config-json-schema-JyLqOQNX.js} +9 -5
  42. package/dist/local-config-sync-Dh1Croqe.d.ts +169 -0
  43. package/dist/local-config.d.ts +2 -2
  44. package/dist/local-config.js +2 -2
  45. package/dist/logger.js +1 -1
  46. package/dist/{memory-diagnostic-log-B9Us7X05.js → memory-diagnostic-log-CI60kNfB.js} +33 -18
  47. package/dist/{memory-token-prompter-CcShtF8B.d.ts → memory-token-prompter-B4sjyaAq.d.ts} +2 -2
  48. package/dist/{memory-token-prompter-C7vREzCL.js → memory-token-prompter-CZde7e6y.js} +1 -1
  49. package/dist/{node-file-system-BcrmWN9I.js → node-file-system-Blr8pAir.js} +1 -1
  50. package/dist/node-http-client-lowp60Oa.js +25 -0
  51. package/dist/{gh-connector-schema-ClPLSYD9.js → node-process-runner-DxTvycoK.js} +1 -12
  52. package/dist/{profiles-g2qGVOWv.d.ts → profiles-Cy5wXQ0L.d.ts} +3 -3
  53. package/dist/{profiles-MnXvYfZF.js → profiles-DSzTeKQw.js} +1 -1
  54. package/dist/profiles.d.ts +1 -1
  55. package/dist/profiles.js +1 -1
  56. package/dist/recovery.d.ts +1 -1
  57. package/dist/recovery.js +1 -1
  58. package/dist/{schedule-listener-DP9Jhc6U.js → schedule-connector-L4uzg5M8.js} +109 -9
  59. package/dist/{settings-reader-DPwqOVUm.d.ts → settings-reader-BIFB_j2f.d.ts} +1 -1
  60. package/dist/settings-schema-D1xcOqRu.d.ts +78 -0
  61. package/dist/{gateway-base-url-DxVjjDoW.js → settings-store-CUKSeTXC.js} +27 -29
  62. package/dist/{slack-listener-C4wlZaOq.js → slack-connector-DQIFPdBF.js} +67 -12
  63. package/dist/slot-fields-CMoRpwuy.js +45 -0
  64. package/dist/{yaml-render-cZu6CxkE.js → yaml-render-93pX7EF7.js} +7 -4
  65. package/package.json +1 -1
  66. package/dist/connector-adapter-DGacCppE.d.ts +0 -25
  67. package/dist/discord-connector-schema-CQyfDkLD.d.ts +0 -39
  68. package/dist/gh-connector-schema-CZzwzvqY.d.ts +0 -14
  69. package/dist/index-D7mjirUL.d.ts +0 -3602
  70. package/dist/local-config-sync-BGPAS9Be.d.ts +0 -401
  71. package/dist/process-runner-DIm1cy95.d.ts +0 -52
  72. package/dist/resolve-connector-token-CczqG_Ig.js +0 -22
  73. package/dist/schedule-listener-DoMPjHZj.d.ts +0 -112
  74. package/dist/settings-schema-1hh11jnN.d.ts +0 -152
  75. package/dist/slack-listener-Dj9NFbAJ.d.ts +0 -136
  76. /package/dist/{connector-adapter-qwXLjQId.js → connector-adapter-DU9Rvyec.js} +0 -0
  77. /package/dist/{connector-listener-CpHBecCj.js → connector-listener-DR3aKOuK.js} +0 -0
  78. /package/dist/{file-system-PWKKU7lA.js → file-system-Wvzc2ePY.js} +0 -0
  79. /package/dist/{file-system-DxpnnUVb.d.ts → file-system-o51IsM0W.d.ts} +0 -0
  80. /package/dist/{funnel-doctor-CApCezTq.js → funnel-doctor-DiJCjHsg.js} +0 -0
  81. /package/dist/{funnel-log-sqlite-sink-B_5_4ybn.js → funnel-log-sqlite-sink-kqJbx2H7.js} +0 -0
  82. /package/dist/{funnel-recovery-D9CxD5Zs.js → funnel-recovery-BFdPjL6Z.js} +0 -0
  83. /package/dist/{logger-BP6SisKt.js → logger-B6iyNbxM.js} +0 -0
  84. /package/dist/{schedule-connector-schema-B_xO5z5B.js → schedule-connector-schema-CfyuMCMh.js} +0 -0
  85. /package/dist/{settings-reader-DPqrpV7s.js → settings-reader-CtQ-Ix8_.js} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,17 +1,1558 @@
1
- import { a as Settings, c as profileConfigSchema, i as SETTINGS_VERSION, l as settingsSchema, n as ChannelDeliveryMode, o as channelConfigSchema, r as ProfileConfig, s as channelDeliveryModeSchema, t as ChannelConfig } from "./settings-schema-1hh11jnN.js";
2
- import { n as FunnelIdGenerator, t as FunnelSettingsReader } from "./settings-reader-DPwqOVUm.js";
3
- import { S as FunnelLogger, _ as connectorConnectionEventSchema, a as ConnectorConnectionStatus, b as FunnelConnectorListener, c as ConnectorProcessedQuery, d as ConnectorRawEvent, f as ConnectorRawQuery, g as StoredRawEvent, h as StoredProcessedEvent, i as ConnectorConnectionRecord, l as ConnectorProcessedRecord, m as StoredConnectionEvent, n as ConnectorConnectionEvent, o as ConnectorDiagnosticLog, p as ConnectorRawRecord, r as ConnectorConnectionQuery, s as ConnectorProcessedEvent, t as CONNECTOR_CONNECTION_STATUSES, u as ConnectorQuery, v as connectorProcessedEventSchema, x as NotifyFn, y as connectorRawEventSchema } from "./diagnostic-log-Cb3v8P7p.js";
4
- import { a as RunOptions, i as ProcessSnapshot, n as DetachOptions, o as RunResult, r as FunnelProcessRunner, t as AttachOptions } from "./process-runner-DIm1cy95.js";
5
- import { n as FunnelFileSystem, t as FileStat } from "./file-system-DxpnnUVb.js";
6
- import { a as ChannelConnectorView, c as FunnelConnectorFactory, d as ConnectorConfig, f as ConnectorType, l as ScheduleListenerOptions, o as FunnelChannels, p as connectorConfigSchema, s as FunnelClock, u as SlackListenerOptions } from "./local-config-sync-BGPAS9Be.js";
7
- import { n as FunnelConnectorAdapter, r as JsonValue, t as CallInput } from "./connector-adapter-DGacCppE.js";
8
- import { a as ScheduleEntry, c as scheduleEntrySchema, i as ScheduleConnectorConfig, o as scheduleCatchupPolicySchema, r as ScheduleCatchupPolicy, s as scheduleConnectorSchema } from "./schedule-listener-DoMPjHZj.js";
9
- import { a as slackConnectorSchema, c as SlackProcessedEmit, d as SlackSkipReason, i as SlackConnectorConfig, l as SlackProcessedSkip, o as FunnelSlackEventProcessor, s as SlackProcessed, u as SlackRawEvent } from "./slack-listener-Dj9NFbAJ.js";
10
- import { a as DiagnosticsGatewayProbe, c as FunnelDiagnostics, d as DiagnosticEvent, f as previewOf, g as ConnectorDiagnosticSqlReader, h as toDiagnosticEvent, i as DiagnosticsChannelSource, l as ReplayResult, m as toDiagnosticConnectionError, n as DiagnoseAllReport, o as DiagnosticsPublisher, p as queryRows, r as DiagnosisStatus, s as DiagnosticsTokenReader, t as ChannelDiagnosis, u as DiagnosticConnectionError } from "./funnel-diagnostics-K-wON25Y.js";
11
- import { n as FunnelDocs, t as DocsTopicListing } from "./funnel-docs-DYBs1-H_.js";
12
- import { a as RecoveryListenerControl, i as RecoveryGatewayControl, n as RecoveryAction, o as RecoveryResult, r as RecoveryChannelSource, t as FunnelRecovery } from "./funnel-recovery-COExL9MD.js";
13
- import { n as DoctorReport, r as FunnelDoctor, t as DoctorFixMode } from "./funnel-doctor-vxO96TCA.js";
14
- import { a as HttpResponse, i as HttpRequest, n as discordConnectorSchema, r as FunnelHttpClient, t as DiscordConnectorConfig } from "./discord-connector-schema-CQyfDkLD.js";
15
- import { n as ghConnectorSchema, t as GhConnectorConfig } from "./gh-connector-schema-CZzwzvqY.js";
16
- import { $ as PublishResponse, A as MemoryFunnelFileSystem, B as Funnel, C as MemoryProcessCall, Ct as OnFunnelError, D as ProcessListStub, E as MemoryProcessSyncHandler, F as FUNNEL_DIR, G as ListenerOpResult, H as FunnelListenersClient, I as FunnelSettingsStore, J as SqliteConnectorDiagnosticLog, K as FunnelGateway, L as SETTINGS_PATH, M as MockFunnelSettingsReader, N as createSettings, O as StartTimeStub, P as DEFAULT_GATEWAY_PORT, Q as PublishRequest, R as resolveFunnelDir, S as MemoryFunnelProcessRunner, St as ReplayableEvent, T as MemoryProcessResponse, U as ListListenersResult, V as GatewayServerOptions, W as ListenerEntry, X as SqliteFunnelEventLog, Y as MemoryFunnelEventLog, Z as FunnelChannelPublisher, _ as NoopFunnelLogger, _t as GatewayRouteDeps, a as toRequest, at as gatewayLoopbackUrl, b as NodeFunnelLogger, bt as BroadcastSubscriber, c as buildServiceRoutes, ct as channelWsUrl, d as MemoryHttpResponse, dt as FunnelEvent, et as PublishResult, f as NodeFunnelHttpClient, ft as FunnelEventLog, g as NodeFunnelClock, gt as GatewayEmitInput, h as MemoryFunnelClock, ht as Env$1, i as queryToCliArgs, it as FunnelGatewayToken, j as NodeFunnelFileSystem, k as NodeFunnelProcessRunner, l as MemoryFunnelHttpClient, lt as FunnelGatewayServer, m as NodeFunnelIdGenerator, mt as funnelEventSchema, n as CliApp, nt as publishResponseSchema, o as Env, ot as ChannelWsUrlInput, p as MemoryFunnelIdGenerator, pt as FunnelEventRecord, q as MemoryConnectorDiagnosticLog, r as routes, rt as DEFAULT_GATEWAY_TOKEN_PATH, s as factory, st as channelWsProtocols, t as GatewayApp, tt as publishRequestSchema, u as MemoryHttpHandler, ut as GatewayEventStore, v as LogEntry, vt as FunnelListenerSupervisor, w as MemoryProcessHandler, x as AliveStub, xt as FunnelBroadcaster, y as MemoryFunnelLogger, yt as BroadcastEvent, z as resolveFunnelPort } from "./index-D7mjirUL.js";
17
- export { AliveStub, AttachOptions, BroadcastEvent, BroadcastSubscriber, CONNECTOR_CONNECTION_STATUSES, CallInput, ChannelConfig, ChannelConnectorView, ChannelDeliveryMode, ChannelDiagnosis, ChannelWsUrlInput, CliApp, ConnectorConfig, ConnectorConnectionEvent, ConnectorConnectionQuery, ConnectorConnectionRecord, ConnectorConnectionStatus, ConnectorDiagnosticLog, ConnectorDiagnosticSqlReader, ConnectorProcessedEvent, ConnectorProcessedQuery, ConnectorProcessedRecord, ConnectorQuery, ConnectorRawEvent, ConnectorRawQuery, ConnectorRawRecord, ConnectorType, DEFAULT_GATEWAY_PORT, DEFAULT_GATEWAY_TOKEN_PATH, DetachOptions, DiagnoseAllReport, DiagnosisStatus, DiagnosticConnectionError, DiagnosticEvent, DiagnosticsChannelSource, DiagnosticsGatewayProbe, DiagnosticsPublisher, DiagnosticsTokenReader, DiscordConnectorConfig, DocsTopicListing, DoctorFixMode, DoctorReport, Env, FUNNEL_DIR, FileStat, Funnel, FunnelBroadcaster, FunnelChannelPublisher, FunnelChannels, FunnelClock, FunnelConnectorAdapter, FunnelConnectorFactory, FunnelConnectorListener, FunnelDiagnostics, FunnelDocs, FunnelDoctor, FunnelEvent, FunnelEventLog, FunnelEventRecord, FunnelFileSystem, FunnelGateway, FunnelGatewayServer, FunnelGatewayToken, FunnelHttpClient, FunnelIdGenerator, FunnelListenerSupervisor, FunnelListenersClient, FunnelLogger, FunnelProcessRunner, FunnelRecovery, FunnelSettingsReader, FunnelSettingsStore, FunnelSlackEventProcessor, GatewayApp, GatewayEmitInput, GatewayEventStore, GatewayRouteDeps, Env$1 as GatewayServerEnv, GatewayServerOptions, GhConnectorConfig, HttpRequest, HttpResponse, JsonValue, ListListenersResult, ListenerEntry, ListenerOpResult, LogEntry, MemoryConnectorDiagnosticLog, MemoryFunnelClock, MemoryFunnelEventLog, MemoryFunnelFileSystem, MemoryFunnelHttpClient, MemoryFunnelIdGenerator, MemoryFunnelLogger, MemoryFunnelProcessRunner, MemoryHttpHandler, MemoryHttpResponse, MemoryProcessCall, MemoryProcessHandler, MemoryProcessResponse, MemoryProcessSyncHandler, MockFunnelSettingsReader, NodeFunnelClock, NodeFunnelFileSystem, NodeFunnelHttpClient, NodeFunnelIdGenerator, NodeFunnelLogger, NodeFunnelProcessRunner, NoopFunnelLogger, NotifyFn, OnFunnelError, ProcessListStub, ProcessSnapshot, ProfileConfig, PublishRequest, PublishResponse, PublishResult, RecoveryAction, RecoveryChannelSource, RecoveryGatewayControl, RecoveryListenerControl, RecoveryResult, ReplayResult, ReplayableEvent, RunOptions, RunResult, SETTINGS_PATH, SETTINGS_VERSION, ScheduleCatchupPolicy, ScheduleConnectorConfig, ScheduleEntry, ScheduleListenerOptions, Settings, SlackConnectorConfig, SlackListenerOptions, SlackProcessed, SlackProcessedEmit, SlackProcessedSkip, SlackRawEvent, SlackSkipReason, SqliteConnectorDiagnosticLog, SqliteFunnelEventLog, StartTimeStub, StoredConnectionEvent, StoredProcessedEvent, StoredRawEvent, buildServiceRoutes, channelConfigSchema, channelDeliveryModeSchema, channelWsProtocols, channelWsUrl, routes as cliRoutes, connectorConfigSchema, connectorConnectionEventSchema, connectorProcessedEventSchema, connectorRawEventSchema, createSettings, discordConnectorSchema, factory, funnelEventSchema, gatewayLoopbackUrl, ghConnectorSchema, previewOf, profileConfigSchema, publishRequestSchema, publishResponseSchema, queryRows, queryToCliArgs, resolveFunnelDir, resolveFunnelPort, scheduleCatchupPolicySchema, scheduleConnectorSchema, scheduleEntrySchema, settingsSchema, slackConnectorSchema, toDiagnosticConnectionError, toDiagnosticEvent, toRequest };
1
+ import { a as Settings, c as profileConfigSchema, i as SETTINGS_VERSION, l as settingsSchema, n as ChannelDeliveryMode, o as channelConfigSchema, r as ProfileConfig, s as channelDeliveryModeSchema, t as ChannelConfig } from "./settings-schema-D1xcOqRu.js";
2
+ import { n as FunnelClaude, t as FileProcessGuard } from "./file-process-guard-C_PLxfUX.js";
3
+ import { n as FunnelIdGenerator, t as FunnelSettingsReader } from "./settings-reader-BIFB_j2f.js";
4
+ import { A as FunnelConnectorAdapter, B as FunnelLogger, C as StoredRawEvent, D as FunnelConnectorListener, E as connectorRawEventSchema, F as DetachOptions, I as FunnelProcessRunner, L as ProcessSnapshot, M as BaseConnectorConfig, N as baseConnectorConfigSchema, O as NotifyFn, P as AttachOptions, R as RunOptions, S as StoredProcessedEvent, T as connectorProcessedEventSchema, _ as ConnectorQuery, a as ConnectorOperation, b as ConnectorRawRecord, c as CONNECTOR_CONNECTION_STATUSES, d as ConnectorConnectionRecord, f as ConnectorConnectionStatus, g as ConnectorProcessedRecord, h as ConnectorProcessedQuery, i as ConnectorListenerDeps, j as JsonValue, k as CallInput, l as ConnectorConnectionEvent, m as ConnectorProcessedEvent, n as ConnectorBuildContext, o as ConnectorOperationContext, p as ConnectorDiagnosticLog, r as ConnectorDescriptor, s as ConnectorUpdateContext, t as ConnectorAdapterDeps, u as ConnectorConnectionQuery, v as ConnectorRawEvent, w as connectorConnectionEventSchema, x as StoredConnectionEvent, y as ConnectorRawQuery, z as RunResult } from "./connector-descriptor-6SXJoszo.js";
5
+ import { n as FunnelFileSystem, t as FileStat } from "./file-system-o51IsM0W.js";
6
+ import { t as FunnelProfiles } from "./profiles-Cy5wXQ0L.js";
7
+ import { a as FunnelLocalConfig, i as FunnelTokenPrompter, n as FunnelLocalConfigSync } from "./local-config-sync-Dh1Croqe.js";
8
+ import { a as FunnelConnectorRegistry, i as FunnelClock, n as ChannelConnectorView, r as FunnelChannels, t as AddConnectorInput } from "./channels-2g_BU1N0.js";
9
+ import { a as DiagnosticsGatewayProbe, c as FunnelDiagnostics, d as DiagnosticEvent, f as previewOf, g as ConnectorDiagnosticSqlReader, h as toDiagnosticEvent, i as DiagnosticsChannelSource, l as ReplayResult, m as toDiagnosticConnectionError, n as DiagnoseAllReport, o as DiagnosticsPublisher, p as queryRows, r as DiagnosisStatus, s as DiagnosticsTokenReader, t as ChannelDiagnosis, u as DiagnosticConnectionError } from "./funnel-diagnostics-DpXOsCty.js";
10
+ import { n as FunnelDocs, t as DocsTopicListing } from "./funnel-docs-CNklHvbt.js";
11
+ import { a as RecoveryListenerControl, i as RecoveryGatewayControl, n as RecoveryAction, o as RecoveryResult, r as RecoveryChannelSource, t as FunnelRecovery } from "./funnel-recovery-DnLrdWO9.js";
12
+ import { n as DoctorReport, r as FunnelDoctor, t as DoctorFixMode } from "./funnel-doctor-CZf_0Luq.js";
13
+ import { n as HttpRequest, r as HttpResponse, t as FunnelHttpClient } from "./http-client-oICicjuO.js";
14
+ import { A as FunnelBroadcaster, C as funnelEventSchema, D as FunnelListenerSupervisor, E as GatewayRouteDeps, M as OnFunnelError, O as BroadcastEvent, S as FunnelEventRecord, T as GatewayEmitInput, _ as channelWsUrl, a as SqliteFunnelEventLog, b as FunnelEvent, c as PublishResponse, d as publishResponseSchema, f as DEFAULT_GATEWAY_TOKEN_PATH, g as channelWsProtocols, h as ChannelWsUrlInput, i as MemoryFunnelEventLog, j as ReplayableEvent, k as BroadcastSubscriber, l as PublishResult, m as gatewayLoopbackUrl, n as MemoryConnectorDiagnosticLog, o as FunnelChannelPublisher, p as FunnelGatewayToken, r as SqliteConnectorDiagnosticLog, s as PublishRequest, t as GatewayApp, u as publishRequestSchema, v as FunnelGatewayServer, w as Env$1, x as FunnelEventLog, y as GatewayEventStore } from "./index-CgY8NdMz.js";
15
+ import { hc } from "hono/client";
16
+ import { z } from "zod";
17
+ import * as _$hono_factory0 from "hono/factory";
18
+ import { Hono } from "hono";
19
+ import * as _$hono_utils_http_status0 from "hono/utils/http-status";
20
+ import * as _$hono_hono_base0 from "hono/hono-base";
21
+
22
+ //#region lib/gateway/gateway.d.ts
23
+ type Deps$3 = {
24
+ process?: FunnelProcessRunner;
25
+ fs?: FunnelFileSystem;
26
+ clock?: FunnelClock;
27
+ dir?: string;
28
+ tmpDir?: string;
29
+ port?: number;
30
+ sleep?: (ms: number) => Promise<void>;
31
+ };
32
+ /**
33
+ * Manages the gateway daemon as a separate process via PID file.
34
+ * Use `start()` to spawn `bun daemon.ts` in the background and `stop()` to
35
+ * terminate it. For an in-process gateway, use `Funnel.gatewayServer` instead.
36
+ */
37
+ declare class FunnelGateway {
38
+ private readonly process;
39
+ private readonly fs;
40
+ private readonly clock;
41
+ private readonly dir;
42
+ private readonly pidFile;
43
+ private readonly gatewayLog;
44
+ private readonly tmpDir;
45
+ private readonly port;
46
+ private readonly sleep;
47
+ constructor(deps?: Deps$3);
48
+ isRunning(): boolean;
49
+ getStatus(): {
50
+ running: boolean;
51
+ pid: number | null;
52
+ port: number;
53
+ };
54
+ start(options?: {
55
+ caffeinate?: boolean;
56
+ }): Promise<boolean>;
57
+ buildStartCommand(gatewayScript: string, options?: {
58
+ caffeinate?: boolean;
59
+ }): string[];
60
+ stop(): Promise<boolean>;
61
+ restart(options?: {
62
+ onlyIfRunning?: boolean;
63
+ caffeinate?: boolean;
64
+ }): Promise<{
65
+ ok: boolean;
66
+ wasRunning: boolean;
67
+ stopped: boolean;
68
+ started: boolean;
69
+ }>;
70
+ getGatewayLog(): string;
71
+ getPort(): number;
72
+ private readPid;
73
+ private removePid;
74
+ private isProcessAlive;
75
+ }
76
+ //#endregion
77
+ //#region lib/gateway/listeners-client.d.ts
78
+ type Deps$2 = {
79
+ port: number;
80
+ isDaemonRunning: () => boolean; /** Returns the daemon's gateway token, or null if unavailable. Sent as `Authorization: Bearer`. */
81
+ getToken?: () => string | null;
82
+ };
83
+ declare const listenerEntrySchema: z.ZodObject<{
84
+ channelName: z.ZodString;
85
+ channelId: z.ZodString;
86
+ name: z.ZodString;
87
+ type: z.ZodString;
88
+ alive: z.ZodBoolean;
89
+ }, z.core.$strip>;
90
+ type ListenerEntry = z.infer<typeof listenerEntrySchema>;
91
+ type ListenerOpResult = {
92
+ state: "ok";
93
+ } | {
94
+ state: "offline";
95
+ } | {
96
+ state: "error";
97
+ reason: string;
98
+ };
99
+ type ListListenersResult = {
100
+ state: "ok";
101
+ listeners: ListenerEntry[];
102
+ } | {
103
+ state: "offline";
104
+ } | {
105
+ state: "error";
106
+ reason: string;
107
+ };
108
+ /**
109
+ * HTTP client for listener operations on a running gateway daemon.
110
+ *
111
+ * Returns `{ state: "offline" }` when the daemon isn't running so callers
112
+ * (CLI hot-reload paths) can treat that as a no-op without parsing strings.
113
+ * Pair this with `FunnelGateway` (process control) for the full picture.
114
+ */
115
+ declare class FunnelListenersClient {
116
+ private readonly port;
117
+ private readonly isDaemonRunning;
118
+ private readonly getToken;
119
+ constructor(deps: Deps$2);
120
+ list(): Promise<ListListenersResult>;
121
+ start(channelName: string, connectorName: string): Promise<ListenerOpResult>;
122
+ stop(channelName: string, connectorName: string): Promise<ListenerOpResult>;
123
+ restart(channelName: string, connectorName: string): Promise<ListenerOpResult>;
124
+ private path;
125
+ private authHeaders;
126
+ private call;
127
+ }
128
+ //#endregion
129
+ //#region lib/funnel.d.ts
130
+ type Props$4 = {
131
+ /** Settings persistence (channels with nested connectors / profiles). Defaults to a FunnelSettingsStore rooted at `dir`. */store?: FunnelSettingsReader; /** Filesystem boundary. Replace with MemoryFunnelFileSystem to sandbox all disk I/O. */
132
+ fs?: FunnelFileSystem; /** Process runner used by gateway / claude / gh listener. Replace with MemoryFunnelProcessRunner for tests. */
133
+ process?: FunnelProcessRunner; /** Logger flowed into every facet. Replace with MemoryFunnelLogger or NoopFunnelLogger to silence/inspect. */
134
+ logger?: FunnelLogger; /** Clock used by schedule listener, gh poll watermarks, and gateway timeouts. */
135
+ clock?: FunnelClock; /** ID generator for channel and connector ids. Use MemoryFunnelIdGenerator for deterministic tests. */
136
+ idGenerator?: FunnelIdGenerator; /** Funnel home directory (settings.json + per-channel/per-connector dirs). Defaults to ~/.funnel. */
137
+ dir?: string; /** Temp / runtime directory (gateway logs and PID adjacent files). Defaults to `<os.tmpdir()>/funnel`. */
138
+ tmpDir?: string;
139
+ /**
140
+ * Connector types this funnel handles, passed as descriptors. Core imports no
141
+ * connector, so a type's (heavy) listener/adapter code is bundled only when its
142
+ * descriptor is imported and listed here. Import from the per-type sub-entries:
143
+ * `import { slackConnector } from "@interactive-inc/claude-funnel/connectors/slack"`.
144
+ * Type-specific launch hooks (Slack `onAppCreated`/`preprocessEvent`, Schedule
145
+ * `onFired`) are passed to the descriptor factory, e.g. `slackConnector({ onAppCreated })`.
146
+ * Defaults to `[]` — no connectors handled.
147
+ */
148
+ connectors?: ConnectorDescriptor[];
149
+ /**
150
+ * Diagnostic log of inbound connector traffic (raw events before filtering
151
+ * and the processor's verdict after). Threaded into listeners that record
152
+ * it. Only the gateway daemon injects a `SqliteConnectorDiagnosticLog`; everywhere
153
+ * else this stays absent and recording is a no-op.
154
+ */
155
+ diagnosticLog?: ConnectorDiagnosticLog;
156
+ /**
157
+ * Called when Funnel catches an exception that would otherwise be silently
158
+ * swallowed (subscriber throw, listener start/stop failure, etc.). Pass
159
+ * `Sentry.captureException` from the host to surface these. Defaults to no-op.
160
+ */
161
+ onError?: OnFunnelError;
162
+ /**
163
+ * Gateway daemon port. Passed directly to FunnelGateway so hosts can override
164
+ * the default (9742) without setting FUNNEL_PORT in the environment.
165
+ */
166
+ port?: number;
167
+ /**
168
+ * Token prompter used by FunnelLocalConfigSync when funnel.json omits a token.
169
+ * Defaults to a TTY-only stdin prompter. Inject MemoryFunnelTokenPrompter in tests.
170
+ */
171
+ tokenPrompter?: FunnelTokenPrompter;
172
+ };
173
+ /**
174
+ * Options for `Funnel.gatewayServer()`. The event store is a union (`dbPath`
175
+ * xor `eventLog`) so the two storage modes can't be mixed.
176
+ */
177
+ type GatewayServerOptions = GatewayEventStore & {
178
+ port?: number;
179
+ hostname?: string;
180
+ killCompetingSlack?: boolean;
181
+ token?: string; /** Permit a non-loopback `hostname` without a token. See FunnelGatewayServer. */
182
+ allowInsecureHost?: boolean;
183
+ extraRoutes?: Hono<Env$1>;
184
+ };
185
+ /**
186
+ * Facade that wires every funnel facet together and exposes the public surface.
187
+ *
188
+ * All side-effecting boundaries (filesystem, process, logger, clock, id, paths)
189
+ * are injected via Props — passing memory implementations gives a fully sandboxed
190
+ * Funnel that touches no real disk, processes, or wall-clock time.
191
+ *
192
+ * Fully immutable: all fields are resolved in the constructor and frozen.
193
+ * No lazy initialisation — every dependency is wired at construction time.
194
+ *
195
+ * @example
196
+ * ```ts
197
+ * import { slackConnector } from "@interactive-inc/claude-funnel/connectors/slack"
198
+ *
199
+ * const funnel = new Funnel({ connectors: [slackConnector()] })
200
+ * const channel = funnel.channels.add({ name: "inbox" })
201
+ * funnel.channels.addConnector("inbox", { type: "slack", name: "ops", botToken, appToken })
202
+ * await funnel.gatewayServer({ port: 9742 }).start()
203
+ * ```
204
+ */
205
+ declare class Funnel {
206
+ readonly paths: {
207
+ dir: string;
208
+ tmpDir: string;
209
+ settings: string;
210
+ };
211
+ readonly channels: FunnelChannels;
212
+ readonly gateway: FunnelGateway;
213
+ readonly gatewayToken: FunnelGatewayToken;
214
+ readonly publisher: FunnelChannelPublisher;
215
+ readonly listeners: FunnelListenersClient;
216
+ readonly claude: FunnelClaude;
217
+ readonly profiles: FunnelProfiles;
218
+ readonly localConfig: FunnelLocalConfig;
219
+ readonly localConfigSync: FunnelLocalConfigSync;
220
+ readonly diagnostics: FunnelDiagnostics;
221
+ readonly recovery: FunnelRecovery;
222
+ readonly doctor: FunnelDoctor;
223
+ readonly docs: FunnelDocs;
224
+ private readonly fs;
225
+ private readonly process;
226
+ private readonly logger;
227
+ private readonly clock;
228
+ private readonly onError;
229
+ constructor(props?: Props$4);
230
+ /**
231
+ * Sandboxed Funnel wired with in-memory implementations for every IO boundary.
232
+ * Touches no real disk, processes, wall-clock time, or UUIDs — safe for tests
233
+ * and ad-hoc experiments. Override individual fields by passing them in `props`.
234
+ */
235
+ static inMemory(props?: Props$4): Funnel;
236
+ /**
237
+ * In-process gateway server. Unlike `gateway.start()` (which spawns a daemon),
238
+ * this returns a class that runs `Bun.serve` + listeners inside the current process —
239
+ * useful for tests, embedding, or custom hosts.
240
+ */
241
+ gatewayServer(options?: GatewayServerOptions): FunnelGatewayServer;
242
+ /**
243
+ * Create a ProcessGuard scoped to this Funnel's home directory.
244
+ * Useful for hosts that need to check or manage singleton PID files
245
+ * independently of FunnelClaude (e.g. checking if a named profile is running).
246
+ */
247
+ createProcessGuard(): FileProcessGuard;
248
+ /**
249
+ * Run the gateway daemon in the foreground (tied to this terminal).
250
+ * For background daemon management, use `funnel.gateway.start()` instead.
251
+ */
252
+ runGatewayForeground(options?: {
253
+ caffeinate?: boolean;
254
+ }): Promise<number>;
255
+ gatewayClient(): ReturnType<typeof hc<GatewayApp>>;
256
+ }
257
+ //#endregion
258
+ //#region lib/engine/settings/settings-store.d.ts
259
+ /**
260
+ * Resolves the funnel home dir. Defaults to `~/.funnel`, overridable via
261
+ * `FUNNEL_DIR` so a funnel.json-scoped launch can point everything (settings,
262
+ * gateway pid/token, claude pids) at a repo-local `<repo>/.funnel` and never
263
+ * touch the global home. Read at call time, not module load, so a daemon
264
+ * spawned with the env set resolves the override.
265
+ */
266
+ declare function resolveFunnelDir(): string;
267
+ declare const DEFAULT_GATEWAY_PORT = 9742;
268
+ /**
269
+ * Resolves the gateway port. Defaults to 9742 — the port a programmatically
270
+ * hosted gateway (`new Funnel().gatewayServer()`) uses. The `funnel` CLI entry
271
+ * sets `FUNNEL_PORT` to a distinct default so a CLI launch never collides with
272
+ * an embedding app's gateway on 9742. Read at call time so a daemon spawned
273
+ * with the env set resolves the override.
274
+ */
275
+ declare function resolveFunnelPort(): number;
276
+ declare const FUNNEL_DIR: string;
277
+ declare const SETTINGS_PATH: string;
278
+ type Deps$1 = {
279
+ path?: string;
280
+ fs?: FunnelFileSystem;
281
+ idGenerator?: FunnelIdGenerator;
282
+ };
283
+ declare class FunnelSettingsStore extends FunnelSettingsReader {
284
+ private readonly path;
285
+ private readonly fs;
286
+ private readonly idGenerator;
287
+ constructor(deps?: Deps$1);
288
+ read(): Settings;
289
+ private looksLikeLegacy;
290
+ /**
291
+ * Non-destructive migration for profiles written before `id` existed. Mints a
292
+ * uuid for each profile lacking one and returns whether anything was minted, so
293
+ * `read` can persist it immediately — a profile id must be STABLE across reads,
294
+ * otherwise `setSessionId` (a second read) sees a different id and can't match
295
+ * the one the launch used. Mutates `parsed` in place (freshly JSON-parsed).
296
+ */
297
+ private backfillProfileIds;
298
+ write(settings: Settings): void;
299
+ }
300
+ //#endregion
301
+ //#region lib/engine/settings/mock-settings-reader.d.ts
302
+ declare const createSettings: (partial?: Partial<Settings>) => Settings;
303
+ declare class MockFunnelSettingsReader extends FunnelSettingsReader {
304
+ private state;
305
+ constructor(initial?: Partial<Settings>);
306
+ read(): Settings;
307
+ write(settings: Settings): void;
308
+ }
309
+ //#endregion
310
+ //#region lib/engine/fs/node-file-system.d.ts
311
+ declare class NodeFunnelFileSystem extends FunnelFileSystem {
312
+ constructor();
313
+ existsSync(path: string): boolean;
314
+ readFileSync(path: string): string;
315
+ writeFileSync(path: string, data: string): void;
316
+ writeSecretFileSync(path: string, data: string): void;
317
+ appendFileSync(path: string, data: string): void;
318
+ unlink(path: string): void;
319
+ mkdirSync(path: string, options?: {
320
+ recursive?: boolean;
321
+ }): void;
322
+ readdirSync(path: string): string[];
323
+ statSync(path: string): FileStat;
324
+ }
325
+ //#endregion
326
+ //#region lib/engine/fs/memory-file-system.d.ts
327
+ type Props$3 = {
328
+ dirs?: string[];
329
+ files?: Record<string, string>;
330
+ mtimes?: Record<string, number>;
331
+ modes?: Record<string, number>;
332
+ now?: () => number;
333
+ };
334
+ declare class MemoryFunnelFileSystem extends FunnelFileSystem {
335
+ private readonly dirs;
336
+ private readonly files;
337
+ private readonly mtimes;
338
+ private readonly modes;
339
+ private readonly now;
340
+ constructor(props?: Props$3);
341
+ existsSync(path: string): boolean;
342
+ readFileSync(path: string): string;
343
+ writeFileSync(path: string, data: string): void;
344
+ writeSecretFileSync(path: string, data: string): void;
345
+ appendFileSync(path: string, data: string): void;
346
+ unlink(path: string): void;
347
+ mkdirSync(path: string, options?: {
348
+ recursive?: boolean;
349
+ }): void;
350
+ readdirSync(path: string): string[];
351
+ statSync(path: string): FileStat;
352
+ setMtime(path: string, mtimeMs: number): void;
353
+ setMode(path: string, mode: number): void;
354
+ private touch;
355
+ }
356
+ //#endregion
357
+ //#region lib/engine/process/node-process-runner.d.ts
358
+ declare class NodeFunnelProcessRunner extends FunnelProcessRunner {
359
+ constructor();
360
+ runSync(command: string[]): RunResult;
361
+ run(command: string[], options?: RunOptions): Promise<RunResult>;
362
+ attach(command: string[], options?: AttachOptions): Promise<number>;
363
+ detach(command: string[], options?: DetachOptions): void;
364
+ kill(pid: number, signal?: string): void;
365
+ isAlive(pid: number): boolean;
366
+ listProcessesContaining(marker: string): ProcessSnapshot[];
367
+ getStartTime(pid: number): string | null;
368
+ private isAlivePosix;
369
+ private isAliveWindows;
370
+ private listProcessesContainingPosix;
371
+ private getStartTimePosix;
372
+ private getStartTimeWindows;
373
+ private listProcessesContainingWindows;
374
+ }
375
+ //#endregion
376
+ //#region lib/engine/process/memory-process-runner.d.ts
377
+ type MemoryProcessResponse = {
378
+ exitCode?: number;
379
+ stdout?: string;
380
+ stderr?: string;
381
+ };
382
+ type MemoryProcessHandler = (command: string[]) => MemoryProcessResponse | Promise<MemoryProcessResponse>;
383
+ type MemoryProcessSyncHandler = (command: string[]) => MemoryProcessResponse;
384
+ type MemoryProcessCall = {
385
+ kind: "run";
386
+ command: string[];
387
+ options: RunOptions;
388
+ } | {
389
+ kind: "runSync";
390
+ command: string[];
391
+ } | {
392
+ kind: "attach";
393
+ command: string[];
394
+ options: AttachOptions;
395
+ } | {
396
+ kind: "detach";
397
+ command: string[];
398
+ options: DetachOptions;
399
+ } | {
400
+ kind: "kill";
401
+ command: string[];
402
+ };
403
+ type AliveStub = (pid: number) => boolean;
404
+ type ProcessListStub = (marker: string) => ProcessSnapshot[];
405
+ type StartTimeStub = (pid: number) => string | null;
406
+ declare class MemoryFunnelProcessRunner extends FunnelProcessRunner {
407
+ readonly calls: MemoryProcessCall[];
408
+ readonly killed: {
409
+ pid: number;
410
+ signal: string;
411
+ }[];
412
+ private handler;
413
+ private syncHandler;
414
+ private aliveStub;
415
+ private listStub;
416
+ private startTimeStub;
417
+ on(handler: MemoryProcessHandler): this;
418
+ onSync(handler: MemoryProcessSyncHandler): this;
419
+ onIsAlive(stub: AliveStub): this;
420
+ onListProcessesContaining(stub: ProcessListStub): this;
421
+ onGetStartTime(stub: StartTimeStub): this;
422
+ run(command: string[], options?: RunOptions): Promise<RunResult>;
423
+ runSync(command: string[]): RunResult;
424
+ attach(command: string[], options?: AttachOptions): Promise<number>;
425
+ detach(command: string[], options?: DetachOptions): void;
426
+ kill(pid: number, signal?: string): void;
427
+ isAlive(pid: number): boolean;
428
+ listProcessesContaining(marker: string): ProcessSnapshot[];
429
+ getStartTime(pid: number): string | null;
430
+ }
431
+ //#endregion
432
+ //#region lib/engine/logger/node-logger.d.ts
433
+ type Props$2 = {
434
+ file?: string;
435
+ now?: () => Date;
436
+ };
437
+ declare class NodeFunnelLogger extends FunnelLogger {
438
+ readonly file: string;
439
+ private readonly now;
440
+ constructor(props?: Props$2);
441
+ info(message: string, meta?: Record<string, unknown>): void;
442
+ warn(message: string, meta?: Record<string, unknown>): void;
443
+ error(message: string, meta?: Record<string, unknown>): void;
444
+ private write;
445
+ }
446
+ //#endregion
447
+ //#region lib/engine/logger/memory-logger.d.ts
448
+ type LogEntry = {
449
+ level: "info" | "warn" | "error";
450
+ message: string;
451
+ meta?: Record<string, unknown>;
452
+ };
453
+ declare class MemoryFunnelLogger extends FunnelLogger {
454
+ readonly file: null;
455
+ readonly entries: LogEntry[];
456
+ info(message: string, meta?: Record<string, unknown>): void;
457
+ warn(message: string, meta?: Record<string, unknown>): void;
458
+ error(message: string, meta?: Record<string, unknown>): void;
459
+ clear(): void;
460
+ }
461
+ //#endregion
462
+ //#region lib/engine/logger/noop-logger.d.ts
463
+ declare class NoopFunnelLogger extends FunnelLogger {
464
+ readonly file: null;
465
+ info(): void;
466
+ warn(): void;
467
+ error(): void;
468
+ }
469
+ //#endregion
470
+ //#region lib/engine/time/node-clock.d.ts
471
+ declare class NodeFunnelClock extends FunnelClock {
472
+ now(): Date;
473
+ }
474
+ //#endregion
475
+ //#region lib/engine/time/memory-clock.d.ts
476
+ type Props$1 = {
477
+ start?: Date;
478
+ };
479
+ declare class MemoryFunnelClock extends FunnelClock {
480
+ private current;
481
+ constructor(props?: Props$1);
482
+ now(): Date;
483
+ set(date: Date): void;
484
+ advance(ms: number): void;
485
+ }
486
+ //#endregion
487
+ //#region lib/engine/id/node-id-generator.d.ts
488
+ declare class NodeFunnelIdGenerator extends FunnelIdGenerator {
489
+ generate(): string;
490
+ }
491
+ //#endregion
492
+ //#region lib/engine/id/memory-id-generator.d.ts
493
+ type Props = {
494
+ prefix?: string;
495
+ };
496
+ declare class MemoryFunnelIdGenerator extends FunnelIdGenerator {
497
+ private counter;
498
+ private readonly prefix;
499
+ constructor(props?: Props);
500
+ generate(): string;
501
+ }
502
+ //#endregion
503
+ //#region lib/engine/http/node-http-client.d.ts
504
+ declare class NodeFunnelHttpClient extends FunnelHttpClient {
505
+ constructor();
506
+ fetch(request: HttpRequest): Promise<HttpResponse>;
507
+ }
508
+ //#endregion
509
+ //#region lib/engine/http/memory-http-client.d.ts
510
+ type MemoryHttpResponse = {
511
+ status?: number;
512
+ body?: string;
513
+ };
514
+ type MemoryHttpHandler = (request: HttpRequest) => MemoryHttpResponse | Promise<MemoryHttpResponse>;
515
+ declare class MemoryFunnelHttpClient extends FunnelHttpClient {
516
+ readonly calls: HttpRequest[];
517
+ private handler;
518
+ on(handler: MemoryHttpHandler): this;
519
+ fetch(request: HttpRequest): Promise<HttpResponse>;
520
+ }
521
+ //#endregion
522
+ //#region lib/gateway/service-routes.d.ts
523
+ type Deps = {
524
+ diagnostics: FunnelDiagnostics;
525
+ doctor: FunnelDoctor; /** Bearer token to gate every endpoint. Empty string disables auth (tests only). */
526
+ token: string;
527
+ };
528
+ /**
529
+ * Mountable Hono app that exposes the service layer (`FunnelDiagnostics` +
530
+ * `FunnelDoctor`) over loopback HTTP. The MCP server, which lives in a
531
+ * different process, calls these endpoints to drive the autonomous
532
+ * troubleshooting loop. The CLI bypasses HTTP and calls the same services
533
+ * directly through the in-process funnel facade, so CLI and MCP share one
534
+ * code path.
535
+ */
536
+ declare const buildServiceRoutes: (deps: Deps) => Hono<Env$1>;
537
+ //#endregion
538
+ //#region lib/cli/factory.d.ts
539
+ type Env = {
540
+ Bindings: {
541
+ funnel: Funnel;
542
+ claude: FunnelClaude;
543
+ profiles: FunnelProfiles;
544
+ localConfig: FunnelLocalConfig;
545
+ localConfigSync: FunnelLocalConfigSync;
546
+ };
547
+ };
548
+ declare const factory: _$hono_factory0.Factory<Env, string>;
549
+ //#endregion
550
+ //#region lib/cli/router/to-request.d.ts
551
+ declare const toRequest: (args: string[]) => {
552
+ method: string;
553
+ path: string;
554
+ url: string;
555
+ };
556
+ //#endregion
557
+ //#region lib/cli/router/query-to-cli-args.d.ts
558
+ declare const queryToCliArgs: (url: string, reservedKeys?: string[]) => string[];
559
+ //#endregion
560
+ //#region lib/cli/routes/index.d.ts
561
+ declare const routes: _$hono_hono_base0.HonoBase<Env, {
562
+ "/claude": {
563
+ $get: {
564
+ input: {
565
+ query: {
566
+ [x: string]: string | string[];
567
+ profile?: string | undefined;
568
+ channel?: string | undefined;
569
+ };
570
+ };
571
+ output: "funnel claude — launch Claude Code\n\nusage:\n funnel claude launch the first channel from funnel.json, or the default profile\n funnel claude --channel <name> with funnel.json: select that channel; without: raw launch\n funnel claude -p <name> launch a named profile\n funnel claude --profile <name> (long form)\n funnel claude [...] any other argument is forwarded to the claude CLI\n\nresolution order:\n 1. --help print this help\n 2. --profile <name> named profile (ignores funnel.json)\n 3. ./funnel.json in the current directory + --channel selects (or first wins)\n 4. --channel <name> with no funnel.json → raw launch using an existing settings.json channel\n 5. the default profile (first entry in fnl profiles)\n\nfunnel-specific options (everything else passes through to claude verbatim):\n -p, --profile profile name to launch\n --channel channel name (selects from funnel.json, or raw-launches if no funnel.json)\n -h, --help show this help\n\nPositional args, unknown short flags (e.g. -c, -r), and claude's own flags\n(--agent, --resume, --model, --print, --output-format ...) are all forwarded.\nOn launch the FUNNEL_CHANNEL_ID env var is set and MCP connects to the gateway.\n\nsee also:\n fnl docs claude full resolution order, side effects, double-launch guard\n fnl docs mcp what the MCP server exposes once Claude is up\n fnl docs debugging the diagnose → recover → verify loop\n\nprogrammable: funnel.claude.launch({ profileId | channelId, options, env, resume })";
572
+ outputFormat: "text";
573
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
574
+ };
575
+ };
576
+ } & {
577
+ "/channels": {
578
+ $get: {
579
+ input: {};
580
+ output: string;
581
+ outputFormat: "text";
582
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
583
+ };
584
+ };
585
+ } & {
586
+ "/channels/add": {
587
+ $post: {
588
+ input: {};
589
+ output: "funnel channels add — add a channel\n\nusage: funnel channels add <name> [--delivery fanout|exclusive]\n\noptions:\n --delivery routing mode (default fanout):\n fanout every connected client receives every event\n exclusive each event delivered to exactly one client (round-robin)\n\nA channel is a named event stream. After creating it, add connectors\n(Slack, Discord, GitHub, schedule) to feed events into it, then connect\nClaude Code clients to consume them.\n\nexamples:\n funnel channels add production\n funnel channels add ci-events --delivery exclusive\n\nsee also: funnel channels, funnel channels <name> connectors add";
590
+ outputFormat: "text";
591
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
592
+ };
593
+ };
594
+ } & {
595
+ "/channels/add/:channel": {
596
+ $post: {
597
+ input: {
598
+ param: {
599
+ channel: string;
600
+ };
601
+ } & {
602
+ query: {
603
+ delivery?: "fanout" | "exclusive" | undefined;
604
+ };
605
+ };
606
+ output: `added channel "${string}" (id: ${string})`;
607
+ outputFormat: "text";
608
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
609
+ };
610
+ };
611
+ } & {
612
+ "/channels/remove": {
613
+ $post: {
614
+ input: {};
615
+ output: "funnel channels remove — remove a channel and all its connectors\n\nusage: funnel channels remove <name>\n\nThe channel, its connectors, and their schedules are deleted from the\nconfiguration file. The gateway drops the channel on the next reload.\nNo external resources (Slack apps, Discord bots, etc.) are touched.\n\nexamples:\n funnel channels remove staging\n\nsee also: funnel channels, funnel channels add";
616
+ outputFormat: "text";
617
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
618
+ };
619
+ };
620
+ } & {
621
+ "/channels/remove/:channel": {
622
+ $post: {
623
+ input: {
624
+ param: {
625
+ channel: string;
626
+ };
627
+ } & {
628
+ query: Record<string, never>;
629
+ };
630
+ output: `removed channel "${string}"`;
631
+ outputFormat: "text";
632
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
633
+ };
634
+ };
635
+ } & {
636
+ "/channels/rename/:channel/:newName": {
637
+ $post: {
638
+ input: {
639
+ param: {
640
+ channel: string;
641
+ newName: string;
642
+ };
643
+ } & {
644
+ query: Record<string, never>;
645
+ };
646
+ output: `renamed channel "${string}" to "${string}"`;
647
+ outputFormat: "text";
648
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
649
+ };
650
+ };
651
+ } & {
652
+ "/channels/:channel/rename/:newName": {
653
+ $post: {
654
+ input: {
655
+ param: {
656
+ channel: string;
657
+ newName: string;
658
+ };
659
+ } & {
660
+ query: Record<string, never>;
661
+ };
662
+ output: `renamed channel "${string}" to "${string}"`;
663
+ outputFormat: "text";
664
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
665
+ };
666
+ };
667
+ } & {
668
+ "/channels/rename": {
669
+ $post: {
670
+ input: {};
671
+ output: "funnel channels rename — rename a channel\n\nusage:\n funnel channels rename <old-channel-name> <new-channel-name>\n funnel channels <old-channel-name> rename <new-channel-name>\n\nRenames the channel in the configuration file. Connectors, schedules,\nand delivery mode are preserved. The gateway picks up the new name on\nthe next reload.\n\nexamples:\n funnel channels rename staging production\n funnel channels staging rename production\n\nsee also: funnel channels, funnel channels <name>";
672
+ outputFormat: "text";
673
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
674
+ };
675
+ };
676
+ } & {
677
+ "/channels/:channel/rename": {
678
+ $post: {
679
+ input: {
680
+ param: {
681
+ channel: string;
682
+ };
683
+ };
684
+ output: "funnel channels rename — rename a channel\n\nusage:\n funnel channels rename <old-channel-name> <new-channel-name>\n funnel channels <old-channel-name> rename <new-channel-name>\n\nRenames the channel in the configuration file. Connectors, schedules,\nand delivery mode are preserved. The gateway picks up the new name on\nthe next reload.\n\nexamples:\n funnel channels rename staging production\n funnel channels staging rename production\n\nsee also: funnel channels, funnel channels <name>";
685
+ outputFormat: "text";
686
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
687
+ };
688
+ };
689
+ } & {
690
+ "/channels/:channel/set/delivery/:mode": {
691
+ $post: {
692
+ input: {
693
+ param: {
694
+ channel: string;
695
+ mode: "fanout" | "exclusive";
696
+ };
697
+ };
698
+ output: `channel "${string}" delivery set to fanout` | `channel "${string}" delivery set to exclusive`;
699
+ outputFormat: "text";
700
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
701
+ };
702
+ };
703
+ } & {
704
+ "/channels/publish": {
705
+ $post: {
706
+ input: {};
707
+ output: "funnel channels <channel> publish — push arbitrary content into a channel\n\nusage: funnel channels <channel> publish --content=\"<text>\" [--connector=<name>] [--meta-<key>=<value> ...]\n\noptions:\n --content Required. The event body delivered to subscribers.\n --connector Optional. Stamp the event with a connector name (resolved to id when found).\n --meta-<key> Optional. Repeatable. Added to meta. Example: --meta-source=cron";
708
+ outputFormat: "text";
709
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
710
+ };
711
+ };
712
+ } & {
713
+ "/channels/:channel/publish": {
714
+ $post: {
715
+ input: {
716
+ param: {
717
+ channel: string;
718
+ };
719
+ } & {
720
+ query: {
721
+ [x: string]: string | string[];
722
+ content: string | string[];
723
+ connector?: string | undefined;
724
+ };
725
+ };
726
+ output: `published (offset=${number})`;
727
+ outputFormat: "text";
728
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
729
+ };
730
+ };
731
+ } & {
732
+ "/channels/:channel/validate": {
733
+ $get: {
734
+ input: {
735
+ param: {
736
+ channel: string;
737
+ };
738
+ } & {
739
+ query: Record<string, never>;
740
+ };
741
+ output: string;
742
+ outputFormat: "text";
743
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
744
+ };
745
+ };
746
+ } & {
747
+ "/channels/validate": {
748
+ $get: {
749
+ input: {};
750
+ output: "funnel channels <channel> validate — check connector configuration\n\nusage: funnel channels <channel> validate [--json]\n\noptions:\n --json output as JSON\n\nChecks that each connector has the required tokens and fields set.\nDoes not make any network calls — static config check only.\n\nexamples:\n funnel channels open-karte validate\n funnel channels open-karte validate --json";
751
+ outputFormat: "text";
752
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
753
+ };
754
+ };
755
+ } & {
756
+ "/channels/:channel": {
757
+ $get: {
758
+ input: {
759
+ param: {
760
+ channel: string;
761
+ };
762
+ };
763
+ output: string;
764
+ outputFormat: "text";
765
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
766
+ };
767
+ };
768
+ } & {
769
+ "/channels/:channel/connectors": {
770
+ $get: {
771
+ input: {
772
+ param: {
773
+ channel: string;
774
+ };
775
+ };
776
+ output: string;
777
+ outputFormat: "text";
778
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
779
+ };
780
+ };
781
+ } & {
782
+ "/channels/:channel/connectors/add": {
783
+ $post: {
784
+ input: {
785
+ param: {
786
+ channel: string;
787
+ };
788
+ };
789
+ output: "funnel channels <channel> connectors add <name> — add a connector to a channel\n\nusage:\n funnel channels <channel> connectors add <name> --type=slack --bot-token=xoxb-... --app-token=xapp-...\n funnel channels <channel> connectors add <name> --type=gh [--poll-interval=60]\n funnel channels <channel> connectors add <name> --type=discord --bot-token=...\n funnel channels <channel> connectors add <name> --type=schedule\n\nconnector types:\n slack Slack Socket Mode (requires bot-token + app-token)\n gh GitHub webhook polling\n discord Discord bot gateway\n schedule cron / one-shot timer (no external service)\n\nToken uniqueness is enforced across all channels — the same bot-token\ncannot appear in two connectors.\n\nexamples:\n funnel channels prod connectors add main-slack --type=slack --bot-token=xoxb-... --app-token=xapp-...\n funnel channels ci connectors add gh-events --type=gh --poll-interval=30\n funnel channels alerts connectors add daily --type=schedule\n\nsee also: funnel channels <channel> connectors, funnel channels <channel> connectors remove";
790
+ outputFormat: "text";
791
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
792
+ };
793
+ };
794
+ } & {
795
+ "/channels/:channel/connectors/add/:connector": {
796
+ $post: {
797
+ input: {
798
+ param: {
799
+ channel: string;
800
+ connector: string;
801
+ };
802
+ } & {
803
+ query: {
804
+ type: string | string[];
805
+ "bot-token": string | string[];
806
+ "app-token": string | string[];
807
+ } | {
808
+ type: string | string[];
809
+ "poll-interval"?: string | string[] | undefined;
810
+ } | {
811
+ type: string | string[];
812
+ "bot-token": string | string[];
813
+ } | {
814
+ type: string | string[];
815
+ };
816
+ };
817
+ output: `added slack connector "${string}" to channel "${string}"`;
818
+ outputFormat: "text";
819
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
820
+ } | {
821
+ input: {
822
+ param: {
823
+ channel: string;
824
+ connector: string;
825
+ };
826
+ } & {
827
+ query: {
828
+ type: string | string[];
829
+ "bot-token": string | string[];
830
+ "app-token": string | string[];
831
+ } | {
832
+ type: string | string[];
833
+ "poll-interval"?: string | string[] | undefined;
834
+ } | {
835
+ type: string | string[];
836
+ "bot-token": string | string[];
837
+ } | {
838
+ type: string | string[];
839
+ };
840
+ };
841
+ output: `added gh connector "${string}" to channel "${string}"`;
842
+ outputFormat: "text";
843
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
844
+ } | {
845
+ input: {
846
+ param: {
847
+ channel: string;
848
+ connector: string;
849
+ };
850
+ } & {
851
+ query: {
852
+ type: string | string[];
853
+ "bot-token": string | string[];
854
+ "app-token": string | string[];
855
+ } | {
856
+ type: string | string[];
857
+ "poll-interval"?: string | string[] | undefined;
858
+ } | {
859
+ type: string | string[];
860
+ "bot-token": string | string[];
861
+ } | {
862
+ type: string | string[];
863
+ };
864
+ };
865
+ output: `added discord connector "${string}" to channel "${string}"`;
866
+ outputFormat: "text";
867
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
868
+ } | {
869
+ input: {
870
+ param: {
871
+ channel: string;
872
+ connector: string;
873
+ };
874
+ } & {
875
+ query: {
876
+ type: string | string[];
877
+ "bot-token": string | string[];
878
+ "app-token": string | string[];
879
+ } | {
880
+ type: string | string[];
881
+ "poll-interval"?: string | string[] | undefined;
882
+ } | {
883
+ type: string | string[];
884
+ "bot-token": string | string[];
885
+ } | {
886
+ type: string | string[];
887
+ };
888
+ };
889
+ output: `added schedule connector "${string}" to channel "${string}"`;
890
+ outputFormat: "text";
891
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
892
+ };
893
+ };
894
+ } & {
895
+ "/channels/:channel/connectors/remove": {
896
+ $post: {
897
+ input: {
898
+ param: {
899
+ channel: string;
900
+ };
901
+ };
902
+ output: "funnel channels <channel> connectors remove <connector> — remove a connector\n\nusage: funnel channels <channel> connectors remove <connector>\n\nRemoves the connector from the channel configuration. The gateway drops\nit on the next reload. No external resources (Slack apps, Discord bots,\nGitHub webhooks) are touched.\n\nexamples:\n funnel channels production connectors remove slack-main\n\nsee also: funnel channels <channel> connectors, funnel channels <channel> connectors add";
903
+ outputFormat: "text";
904
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
905
+ };
906
+ };
907
+ } & {
908
+ "/channels/:channel/connectors/remove/:connector": {
909
+ $post: {
910
+ input: {
911
+ param: {
912
+ channel: string;
913
+ connector: string;
914
+ };
915
+ } & {
916
+ query: Record<string, never>;
917
+ };
918
+ output: `removed connector "${string}" from channel "${string}"`;
919
+ outputFormat: "text";
920
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
921
+ };
922
+ };
923
+ } & {
924
+ "/channels/:channel/connectors/set": {
925
+ $post: {
926
+ input: {
927
+ param: {
928
+ channel: string;
929
+ };
930
+ };
931
+ output: "funnel channels <channel> connectors set <connector> — update connector fields\n\nusage:\n funnel channels <ch> connectors set <conn> [--bot-token=...] [--app-token=...] # slack\n funnel channels <ch> connectors set <conn> [--bot-token=...] # discord\n funnel channels <ch> connectors set <conn> [--poll-interval=N] # gh";
932
+ outputFormat: "text";
933
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
934
+ };
935
+ };
936
+ } & {
937
+ "/channels/:channel/connectors/set/:connector": {
938
+ $post: {
939
+ input: {
940
+ param: {
941
+ channel: string;
942
+ connector: string;
943
+ };
944
+ } & {
945
+ query: {
946
+ [x: string]: string | string[];
947
+ "bot-token"?: string | undefined;
948
+ "app-token"?: string | undefined;
949
+ "poll-interval"?: string | string[] | undefined;
950
+ };
951
+ };
952
+ output: `updated connector "${string}" in channel "${string}"`;
953
+ outputFormat: "text";
954
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
955
+ };
956
+ };
957
+ } & {
958
+ "/channels/:channel/connectors/rename/:connector/:newName": {
959
+ $post: {
960
+ input: {
961
+ param: {
962
+ channel: string;
963
+ connector: string;
964
+ newName: string;
965
+ };
966
+ } & {
967
+ query: Record<string, never>;
968
+ };
969
+ output: `renamed connector "${string}" to "${string}"`;
970
+ outputFormat: "text";
971
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
972
+ };
973
+ };
974
+ } & {
975
+ "/channels/:channel/connectors/:connector/rename/:newName": {
976
+ $post: {
977
+ input: {
978
+ param: {
979
+ channel: string;
980
+ connector: string;
981
+ newName: string;
982
+ };
983
+ } & {
984
+ query: Record<string, never>;
985
+ };
986
+ output: `renamed connector "${string}" to "${string}"`;
987
+ outputFormat: "text";
988
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
989
+ };
990
+ };
991
+ } & {
992
+ "/channels/:channel/connectors/rename": {
993
+ $post: {
994
+ input: {
995
+ param: {
996
+ channel: string;
997
+ };
998
+ };
999
+ output: "funnel channels <channel> connectors rename <old-connector-name> <new-connector-name> — rename a connector\n\nusage: funnel channels <channel> connectors rename <old-connector-name> <new-connector-name>\n\nRenames the connector in the configuration file. Tokens, type, and\nschedules are preserved. The gateway picks up the new name on the\nnext reload.\n\nexamples:\n funnel channels production connectors rename slack-1 slack-main\n\nsee also: funnel channels <channel> connectors";
1000
+ outputFormat: "text";
1001
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1002
+ };
1003
+ };
1004
+ } & {
1005
+ "/channels/:channel/connectors/:connector/rename": {
1006
+ $post: {
1007
+ input: {
1008
+ param: {
1009
+ channel: string;
1010
+ } & {
1011
+ connector: string;
1012
+ };
1013
+ };
1014
+ output: "funnel channels <channel> connectors rename <connector> <new-name>\n\nusage: funnel channels <channel> connectors rename <connector> <new-name>";
1015
+ outputFormat: "text";
1016
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1017
+ };
1018
+ };
1019
+ } & {
1020
+ "/channels/:channel/connectors/:connector/request": {
1021
+ $post: {
1022
+ input: {
1023
+ param: {
1024
+ channel: string;
1025
+ connector: string;
1026
+ };
1027
+ } & {
1028
+ query: {
1029
+ [x: string]: string | string[];
1030
+ method: string | string[];
1031
+ path?: string | undefined;
1032
+ };
1033
+ };
1034
+ output: string;
1035
+ outputFormat: "text";
1036
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1037
+ };
1038
+ };
1039
+ } & {
1040
+ "/channels/:channel/connectors/:connector": {
1041
+ $get: {
1042
+ input: {
1043
+ param: {
1044
+ channel: string;
1045
+ connector: string;
1046
+ };
1047
+ };
1048
+ output: string;
1049
+ outputFormat: "text";
1050
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1051
+ };
1052
+ };
1053
+ } & {
1054
+ "/channels/:channel/connectors/:connector/schedules": {
1055
+ $get: {
1056
+ input: {
1057
+ param: {
1058
+ channel: string;
1059
+ connector: string;
1060
+ };
1061
+ };
1062
+ output: string;
1063
+ outputFormat: "text";
1064
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1065
+ };
1066
+ };
1067
+ } & {
1068
+ "/channels/:channel/connectors/:connector/schedules/add": {
1069
+ $post: {
1070
+ input: {
1071
+ param: {
1072
+ channel: string;
1073
+ } & {
1074
+ connector: string;
1075
+ };
1076
+ };
1077
+ output: "funnel channels <ch> connectors <conn> schedules add <id> — add a schedule entry\n\nusage: funnel channels <ch> connectors <conn> schedules add <id> --cron=\"*/5 * * * *\" --prompt=\"...\" [--enabled|--enabled=false] [--catchup-policy=latest|all|skip]\n\noptions:\n --cron <expr> / 5-field cron expression (required)\n --prompt <text> / prompt delivered on each fire (required)\n --enabled / fire on schedule (default: true; --enabled=false stores it disabled)\n --catchup-policy latest|all|skip / how missed fires are replayed after downtime (default: latest)";
1078
+ outputFormat: "text";
1079
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1080
+ };
1081
+ };
1082
+ } & {
1083
+ "/channels/:channel/connectors/:connector/schedules/add/:id": {
1084
+ $post: {
1085
+ input: {
1086
+ param: {
1087
+ channel: string;
1088
+ connector: string;
1089
+ id: string;
1090
+ };
1091
+ } & {
1092
+ query: {
1093
+ cron: string;
1094
+ prompt: string;
1095
+ enabled?: "" | "true" | "false" | undefined;
1096
+ "catchup-policy"?: "latest" | "all" | "skip" | undefined;
1097
+ };
1098
+ };
1099
+ output: `added schedule entry "${string}"`;
1100
+ outputFormat: "text";
1101
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1102
+ };
1103
+ };
1104
+ } & {
1105
+ "/channels/:channel/connectors/:connector/schedules/remove": {
1106
+ $post: {
1107
+ input: {
1108
+ param: {
1109
+ channel: string;
1110
+ } & {
1111
+ connector: string;
1112
+ };
1113
+ };
1114
+ output: "funnel channels <ch> connectors <conn> schedules remove <id>\n\nusage: funnel channels <ch> connectors <conn> schedules remove <id>";
1115
+ outputFormat: "text";
1116
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1117
+ };
1118
+ };
1119
+ } & {
1120
+ "/channels/:channel/connectors/:connector/schedules/remove/:id": {
1121
+ $post: {
1122
+ input: {
1123
+ param: {
1124
+ channel: string;
1125
+ connector: string;
1126
+ id: string;
1127
+ };
1128
+ } & {
1129
+ query: Record<string, never>;
1130
+ };
1131
+ output: `removed schedule entry "${string}"`;
1132
+ outputFormat: "text";
1133
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1134
+ };
1135
+ };
1136
+ } & {
1137
+ "/profiles": {
1138
+ $get: {
1139
+ input: {};
1140
+ output: string;
1141
+ outputFormat: "text";
1142
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1143
+ };
1144
+ };
1145
+ } & {
1146
+ "/profiles/add": {
1147
+ $post: {
1148
+ input: {};
1149
+ output: "funnel profiles add — add a profile\n\nusage: funnel profiles add <name> --path <path> --channel <channel-name> [recipe]\n\noptions:\n --path working directory passed to claude as cwd\n --channel channel name (resolved to channel id internally)\n --agent sub-agent name, prepended to the launch argv as --agent <name>\n --options extra launch argv as one whitespace-split string (e.g. \"--brief\")\n --env env vars layered under the process, as \"KEY=VAL,KEY2=VAL2\"\n --no-resume start a fresh claude session every launch (default resumes)\n\nThe launch recipe (--agent / --options / --env / --resume) lives on the\nprofile; the channel only declares transport (connectors / delivery).";
1150
+ outputFormat: "text";
1151
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1152
+ };
1153
+ };
1154
+ } & {
1155
+ "/profiles/add/:profile": {
1156
+ $post: {
1157
+ input: {
1158
+ param: {
1159
+ profile: string;
1160
+ };
1161
+ } & {
1162
+ query: {
1163
+ path: string;
1164
+ channel: string;
1165
+ agent?: string | undefined;
1166
+ options?: string | undefined;
1167
+ env?: string | undefined;
1168
+ resume?: string | undefined;
1169
+ "no-resume"?: string | undefined;
1170
+ };
1171
+ };
1172
+ output: `added profile "${string}"`;
1173
+ outputFormat: "text";
1174
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1175
+ };
1176
+ };
1177
+ } & {
1178
+ "/profiles/set": {
1179
+ $post: {
1180
+ input: {};
1181
+ output: "funnel profiles <name> set — update a profile\n\nusage: funnel profiles <name> set [--path <path>] [--channel <channel-name>] [recipe]\n\noptions:\n --path working directory passed to claude as cwd\n --channel channel name (resolved to channel id internally)\n --agent sub-agent name, prepended to the launch argv as --agent <name>\n --options extra launch argv as one whitespace-split string (e.g. \"--brief\")\n --env env vars layered under the process, as \"KEY=VAL,KEY2=VAL2\"\n --resume / --no-resume toggle claude session reuse\n\nOnly the flags you pass are changed; --agent and --options together replace\nthe profile's whole options list.";
1182
+ outputFormat: "text";
1183
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1184
+ };
1185
+ };
1186
+ } & {
1187
+ "/profiles/set/:profile": {
1188
+ $post: {
1189
+ input: {
1190
+ param: {
1191
+ profile: string;
1192
+ };
1193
+ } & {
1194
+ query: {
1195
+ path?: string | undefined;
1196
+ channel?: string | undefined;
1197
+ agent?: string | undefined;
1198
+ options?: string | undefined;
1199
+ env?: string | undefined;
1200
+ resume?: string | undefined;
1201
+ "no-resume"?: string | undefined;
1202
+ };
1203
+ };
1204
+ output: `updated profile "${string}"`;
1205
+ outputFormat: "text";
1206
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1207
+ };
1208
+ };
1209
+ } & {
1210
+ "/profiles/remove": {
1211
+ $post: {
1212
+ input: {};
1213
+ output: "funnel profiles remove — remove a profile\n\nusage: funnel profiles remove <name>";
1214
+ outputFormat: "text";
1215
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1216
+ };
1217
+ };
1218
+ } & {
1219
+ "/profiles/remove/:profile": {
1220
+ $post: {
1221
+ input: {
1222
+ param: {
1223
+ profile: string;
1224
+ };
1225
+ } & {
1226
+ query: Record<string, never>;
1227
+ };
1228
+ output: `removed profile "${string}"`;
1229
+ outputFormat: "text";
1230
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1231
+ };
1232
+ };
1233
+ } & {
1234
+ "/profiles/rename/:profile/:newName": {
1235
+ $post: {
1236
+ input: {
1237
+ param: {
1238
+ profile: string;
1239
+ newName: string;
1240
+ };
1241
+ } & {
1242
+ query: Record<string, never>;
1243
+ };
1244
+ output: `renamed profile "${string}" to "${string}"`;
1245
+ outputFormat: "text";
1246
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1247
+ };
1248
+ };
1249
+ } & {
1250
+ "/profiles/:profile/rename/:newName": {
1251
+ $post: {
1252
+ input: {
1253
+ param: {
1254
+ profile: string;
1255
+ newName: string;
1256
+ };
1257
+ } & {
1258
+ query: Record<string, never>;
1259
+ };
1260
+ output: `renamed profile "${string}" to "${string}"`;
1261
+ outputFormat: "text";
1262
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1263
+ };
1264
+ };
1265
+ } & {
1266
+ "/profiles/rename": {
1267
+ $post: {
1268
+ input: {};
1269
+ output: "funnel profiles rename — rename a profile\n\nusage:\n funnel profiles rename <old> <new>\n funnel profiles <old> rename <new>";
1270
+ outputFormat: "text";
1271
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1272
+ };
1273
+ };
1274
+ } & {
1275
+ "/profiles/:profile/rename": {
1276
+ $post: {
1277
+ input: {
1278
+ param: {
1279
+ profile: string;
1280
+ };
1281
+ };
1282
+ output: "funnel profiles rename — rename a profile\n\nusage:\n funnel profiles rename <old> <new>\n funnel profiles <old> rename <new>";
1283
+ outputFormat: "text";
1284
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1285
+ };
1286
+ };
1287
+ } & {
1288
+ "/profiles/:profile/as-default": {
1289
+ $post: {
1290
+ input: {
1291
+ param: {
1292
+ profile: string;
1293
+ };
1294
+ };
1295
+ output: `profile "${string}" is now the default`;
1296
+ outputFormat: "text";
1297
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1298
+ };
1299
+ };
1300
+ } & {
1301
+ "/gateway": {
1302
+ $get: {
1303
+ input: {};
1304
+ output: string;
1305
+ outputFormat: "text";
1306
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1307
+ };
1308
+ };
1309
+ } & {
1310
+ "/gateway/status": {
1311
+ $get: {
1312
+ input: {};
1313
+ output: string;
1314
+ outputFormat: "text";
1315
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1316
+ };
1317
+ };
1318
+ } & {
1319
+ "/gateway/start": {
1320
+ $get: {
1321
+ input: {
1322
+ query: {
1323
+ "no-caffeine"?: string | undefined;
1324
+ };
1325
+ };
1326
+ output: "funnel gateway: already running (pid null)" | `funnel gateway: already running (pid ${number})`;
1327
+ outputFormat: "text";
1328
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1329
+ } | {
1330
+ input: {
1331
+ query: {
1332
+ "no-caffeine"?: string | undefined;
1333
+ };
1334
+ };
1335
+ output: `funnel gateway: started (pid null, port ${number}) but /health did not respond within ${number}s \u2014 check \`fnl gateway logs\`` | `funnel gateway: started (pid ${number}, port ${number}) but /health did not respond within ${number}s \u2014 check \`fnl gateway logs\``;
1336
+ outputFormat: "text";
1337
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1338
+ } | {
1339
+ input: {
1340
+ query: {
1341
+ "no-caffeine"?: string | undefined;
1342
+ };
1343
+ };
1344
+ output: `funnel gateway: started (pid null, port ${number})` | `funnel gateway: started (pid ${number}, port ${number})`;
1345
+ outputFormat: "text";
1346
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1347
+ };
1348
+ };
1349
+ } & {
1350
+ "/gateway/stop": {
1351
+ $get: {
1352
+ input: {};
1353
+ output: "funnel gateway: no running process";
1354
+ outputFormat: "text";
1355
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1356
+ } | {
1357
+ input: {};
1358
+ output: "funnel gateway: stopped";
1359
+ outputFormat: "text";
1360
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1361
+ };
1362
+ };
1363
+ } & {
1364
+ "/gateway/restart": {
1365
+ $get: {
1366
+ input: {
1367
+ query: {
1368
+ "no-caffeine"?: string | undefined;
1369
+ };
1370
+ };
1371
+ output: string;
1372
+ outputFormat: "text";
1373
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1374
+ };
1375
+ };
1376
+ } & {
1377
+ "/gateway/logs": {
1378
+ $get: {
1379
+ input: {
1380
+ query: {
1381
+ n?: string | undefined;
1382
+ format?: "json" | "plain" | undefined;
1383
+ };
1384
+ };
1385
+ output: "no logs";
1386
+ outputFormat: "text";
1387
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1388
+ };
1389
+ };
1390
+ } & {
1391
+ "/gateway/sql": {
1392
+ $get: {
1393
+ input: {
1394
+ query: {
1395
+ query?: string | undefined;
1396
+ preset?: string | undefined;
1397
+ channel?: string | undefined;
1398
+ limit?: string | undefined;
1399
+ };
1400
+ };
1401
+ output: string;
1402
+ outputFormat: "text";
1403
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1404
+ };
1405
+ };
1406
+ } & {
1407
+ "/gateway/listeners": {
1408
+ $get: {
1409
+ input: {};
1410
+ output: string;
1411
+ outputFormat: "text";
1412
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1413
+ };
1414
+ };
1415
+ } & {
1416
+ "/debug": {
1417
+ $get: {
1418
+ input: {
1419
+ query: {
1420
+ channel?: string | undefined;
1421
+ all?: "" | "true" | "false" | undefined;
1422
+ limit?: string | undefined;
1423
+ };
1424
+ };
1425
+ output: string;
1426
+ outputFormat: "text";
1427
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1428
+ };
1429
+ };
1430
+ } & {
1431
+ "/debug/events": {
1432
+ $get: {
1433
+ input: {
1434
+ query: {
1435
+ channel?: string | undefined;
1436
+ limit?: string | undefined;
1437
+ };
1438
+ };
1439
+ output: string;
1440
+ outputFormat: "text";
1441
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1442
+ };
1443
+ };
1444
+ } & {
1445
+ "/debug/dropped": {
1446
+ $get: {
1447
+ input: {
1448
+ query: {
1449
+ channel?: string | undefined;
1450
+ limit?: string | undefined;
1451
+ };
1452
+ };
1453
+ output: string;
1454
+ outputFormat: "text";
1455
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1456
+ };
1457
+ };
1458
+ } & {
1459
+ "/debug/errors": {
1460
+ $get: {
1461
+ input: {
1462
+ query: {
1463
+ channel?: string | undefined;
1464
+ limit?: string | undefined;
1465
+ };
1466
+ };
1467
+ output: string;
1468
+ outputFormat: "text";
1469
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1470
+ };
1471
+ };
1472
+ } & {
1473
+ "/debug/replay": {
1474
+ $get: {
1475
+ input: {
1476
+ query: {
1477
+ channel?: string | undefined;
1478
+ seq?: string | undefined;
1479
+ };
1480
+ };
1481
+ output: string;
1482
+ outputFormat: "text";
1483
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1484
+ };
1485
+ };
1486
+ } & {
1487
+ "/docs": {
1488
+ $get: {
1489
+ input: {};
1490
+ output: string;
1491
+ outputFormat: "text";
1492
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1493
+ };
1494
+ };
1495
+ } & {
1496
+ "/docs/:topic": {
1497
+ $get: {
1498
+ input: {
1499
+ param: {
1500
+ topic: string;
1501
+ };
1502
+ };
1503
+ output: string;
1504
+ outputFormat: "text";
1505
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1506
+ };
1507
+ };
1508
+ } & {
1509
+ "/doctor": {
1510
+ $get: {
1511
+ input: {
1512
+ query: {
1513
+ fix?: "" | "true" | "false" | undefined;
1514
+ aggressive?: "" | "true" | "false" | undefined;
1515
+ };
1516
+ };
1517
+ output: string;
1518
+ outputFormat: "text";
1519
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1520
+ };
1521
+ };
1522
+ } & {
1523
+ "/schema": {
1524
+ $get: {
1525
+ input: {};
1526
+ output: `${string}
1527
+ `;
1528
+ outputFormat: "text";
1529
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1530
+ };
1531
+ };
1532
+ } & {
1533
+ "/status": {
1534
+ $get: {
1535
+ input: {
1536
+ query: {
1537
+ watch?: "" | "true" | "false" | undefined;
1538
+ interval?: string | undefined;
1539
+ };
1540
+ };
1541
+ output: string;
1542
+ outputFormat: "text";
1543
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1544
+ };
1545
+ };
1546
+ } & {
1547
+ "/update": {
1548
+ $get: {
1549
+ input: {};
1550
+ output: "updated @interactive-inc/claude-funnel";
1551
+ outputFormat: "text";
1552
+ status: _$hono_utils_http_status0.ContentfulStatusCode;
1553
+ };
1554
+ };
1555
+ }, "/", "/update">;
1556
+ type CliApp = typeof routes;
1557
+ //#endregion
1558
+ export { AddConnectorInput, AliveStub, AttachOptions, BaseConnectorConfig, BroadcastEvent, BroadcastSubscriber, CONNECTOR_CONNECTION_STATUSES, CallInput, ChannelConfig, ChannelConnectorView, ChannelDeliveryMode, ChannelDiagnosis, ChannelWsUrlInput, type CliApp, ConnectorAdapterDeps, ConnectorBuildContext, ConnectorConnectionEvent, ConnectorConnectionQuery, ConnectorConnectionRecord, ConnectorConnectionStatus, ConnectorDescriptor, ConnectorDiagnosticLog, ConnectorDiagnosticSqlReader, ConnectorListenerDeps, ConnectorOperation, ConnectorOperationContext, ConnectorProcessedEvent, ConnectorProcessedQuery, ConnectorProcessedRecord, ConnectorQuery, ConnectorRawEvent, ConnectorRawQuery, ConnectorRawRecord, ConnectorUpdateContext, DEFAULT_GATEWAY_PORT, DEFAULT_GATEWAY_TOKEN_PATH, DetachOptions, DiagnoseAllReport, DiagnosisStatus, DiagnosticConnectionError, DiagnosticEvent, DiagnosticsChannelSource, DiagnosticsGatewayProbe, DiagnosticsPublisher, DiagnosticsTokenReader, DocsTopicListing, DoctorFixMode, DoctorReport, Env, FUNNEL_DIR, FileStat, Funnel, FunnelBroadcaster, FunnelChannelPublisher, FunnelChannels, FunnelClock, FunnelConnectorAdapter, FunnelConnectorListener, FunnelConnectorRegistry, FunnelDiagnostics, FunnelDocs, FunnelDoctor, FunnelEvent, FunnelEventLog, FunnelEventRecord, FunnelFileSystem, FunnelGateway, FunnelGatewayServer, FunnelGatewayToken, FunnelHttpClient, FunnelIdGenerator, FunnelListenerSupervisor, FunnelListenersClient, FunnelLogger, FunnelProcessRunner, FunnelRecovery, FunnelSettingsReader, FunnelSettingsStore, type GatewayApp, type GatewayEmitInput, GatewayEventStore, type GatewayRouteDeps, type Env$1 as GatewayServerEnv, GatewayServerOptions, HttpRequest, HttpResponse, JsonValue, ListListenersResult, ListenerEntry, ListenerOpResult, LogEntry, MemoryConnectorDiagnosticLog, MemoryFunnelClock, MemoryFunnelEventLog, MemoryFunnelFileSystem, MemoryFunnelHttpClient, MemoryFunnelIdGenerator, MemoryFunnelLogger, MemoryFunnelProcessRunner, MemoryHttpHandler, MemoryHttpResponse, MemoryProcessCall, MemoryProcessHandler, MemoryProcessResponse, MemoryProcessSyncHandler, MockFunnelSettingsReader, NodeFunnelClock, NodeFunnelFileSystem, NodeFunnelHttpClient, NodeFunnelIdGenerator, NodeFunnelLogger, NodeFunnelProcessRunner, NoopFunnelLogger, NotifyFn, OnFunnelError, ProcessListStub, ProcessSnapshot, ProfileConfig, PublishRequest, PublishResponse, PublishResult, RecoveryAction, RecoveryChannelSource, RecoveryGatewayControl, RecoveryListenerControl, RecoveryResult, ReplayResult, ReplayableEvent, RunOptions, RunResult, SETTINGS_PATH, SETTINGS_VERSION, Settings, SqliteConnectorDiagnosticLog, SqliteFunnelEventLog, StartTimeStub, StoredConnectionEvent, StoredProcessedEvent, StoredRawEvent, baseConnectorConfigSchema, buildServiceRoutes, channelConfigSchema, channelDeliveryModeSchema, channelWsProtocols, channelWsUrl, routes as cliRoutes, connectorConnectionEventSchema, connectorProcessedEventSchema, connectorRawEventSchema, createSettings, factory, funnelEventSchema, gatewayLoopbackUrl, previewOf, profileConfigSchema, publishRequestSchema, publishResponseSchema, queryRows, queryToCliArgs, resolveFunnelDir, resolveFunnelPort, settingsSchema, toDiagnosticConnectionError, toDiagnosticEvent, toRequest };