@interactive-inc/claude-funnel 0.40.0 → 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -9
- package/dist/bin.js +255 -256
- package/dist/gateway/daemon.js +151 -152
- package/dist/index.d.ts +160 -286
- package/dist/index.js +520 -981
- package/package.json +16 -1
package/dist/index.d.ts
CHANGED
|
@@ -69,7 +69,7 @@ type SlackListenerOptions = {
|
|
|
69
69
|
type ScheduleListenerOptions = {
|
|
70
70
|
onFired?: ScheduleOnFired;
|
|
71
71
|
};
|
|
72
|
-
type Deps$
|
|
72
|
+
type Deps$13 = {
|
|
73
73
|
fs?: FunnelFileSystem;
|
|
74
74
|
process?: FunnelProcessRunner;
|
|
75
75
|
logger?: FunnelLogger;
|
|
@@ -98,7 +98,7 @@ declare class FunnelConnectorFactory {
|
|
|
98
98
|
private readonly dir;
|
|
99
99
|
private readonly slackListenerOptions;
|
|
100
100
|
private readonly scheduleListenerOptions;
|
|
101
|
-
constructor(deps?: Deps$
|
|
101
|
+
constructor(deps?: Deps$13);
|
|
102
102
|
createListener(channelId: string, config: ConnectorConfig): FunnelConnectorListener;
|
|
103
103
|
createAdapter(config: ConnectorConfig): FunnelConnectorAdapter | null;
|
|
104
104
|
connectorDir(channelId: string, connectorId: string): string;
|
|
@@ -290,10 +290,10 @@ declare abstract class FunnelSettingsReader {
|
|
|
290
290
|
}
|
|
291
291
|
//#endregion
|
|
292
292
|
//#region lib/engine/channels/channels.d.ts
|
|
293
|
-
type Deps$
|
|
293
|
+
type Deps$12 = {
|
|
294
294
|
store: FunnelSettingsReader;
|
|
295
295
|
factory: FunnelConnectorFactory;
|
|
296
|
-
profileChecker
|
|
296
|
+
profileChecker?: ProfileChannelChecker;
|
|
297
297
|
clock?: FunnelClock;
|
|
298
298
|
idGenerator?: FunnelIdGenerator;
|
|
299
299
|
};
|
|
@@ -337,7 +337,7 @@ declare class FunnelChannels {
|
|
|
337
337
|
private readonly profileChecker;
|
|
338
338
|
private readonly clock;
|
|
339
339
|
private readonly idGenerator;
|
|
340
|
-
constructor(deps: Deps$
|
|
340
|
+
constructor(deps: Deps$12);
|
|
341
341
|
list(): ChannelConfig[];
|
|
342
342
|
get(name: string): ChannelConfig | null;
|
|
343
343
|
getById(id: string): ChannelConfig | null;
|
|
@@ -403,9 +403,8 @@ type OnFunnelError = (error: Error, context?: Record<string, unknown>) => void;
|
|
|
403
403
|
//#region lib/gateway/broadcaster.d.ts
|
|
404
404
|
type ClientData = {
|
|
405
405
|
/** Stable channel id (uuid) that the WS client subscribed to. */channel: string; /** Human-facing channel name resolved at upgrade time, kept for log readability. */
|
|
406
|
-
channelName?: string | null; /** Connector names belonging to that channel
|
|
407
|
-
connectors: string[];
|
|
408
|
-
tapAll?: boolean; /** Routing mode resolved from channel config at upgrade time. Defaults to fanout. */
|
|
406
|
+
channelName?: string | null; /** Connector names belonging to that channel. */
|
|
407
|
+
connectors: string[]; /** Routing mode resolved from channel config at upgrade time. Defaults to fanout. */
|
|
409
408
|
delivery?: "fanout" | "exclusive";
|
|
410
409
|
/**
|
|
411
410
|
* Opaque per-client id declared at upgrade time (`?id=<subscriberId>`). When an
|
|
@@ -433,7 +432,7 @@ type BroadcastSubscriber = (event: ReplayableEvent) => void;
|
|
|
433
432
|
type ReplaySource = {
|
|
434
433
|
loadSince(since: number): ReplayableEvent[];
|
|
435
434
|
};
|
|
436
|
-
type Deps$
|
|
435
|
+
type Deps$11 = {
|
|
437
436
|
logger?: FunnelLogger; /** Host hook for surfacing subscriber-throw exceptions. Defaults to no-op. */
|
|
438
437
|
onError?: OnFunnelError;
|
|
439
438
|
maxBufferedBytes?: number;
|
|
@@ -485,7 +484,7 @@ declare class FunnelBroadcaster {
|
|
|
485
484
|
private droppedSlowClients;
|
|
486
485
|
private lastBroadcastAt;
|
|
487
486
|
private latestOffset;
|
|
488
|
-
constructor(deps?: Deps$
|
|
487
|
+
constructor(deps?: Deps$11);
|
|
489
488
|
getMetrics(): BroadcasterMetrics;
|
|
490
489
|
/**
|
|
491
490
|
* Returns events with offset > since, filtered by the connector subscription
|
|
@@ -502,15 +501,12 @@ declare class FunnelBroadcaster {
|
|
|
502
501
|
replaySince(since: number, data: ClientData): ReplayableEvent[];
|
|
503
502
|
private matchesClient;
|
|
504
503
|
/**
|
|
505
|
-
* Returns the list of WS clients that should receive `event`.
|
|
506
|
-
* receive (passive observation). For each per-channel group:
|
|
504
|
+
* Returns the list of WS clients that should receive `event`. For each per-channel group:
|
|
507
505
|
* - fanout → every matching client receives
|
|
508
506
|
* - exclusive → exactly one client receives, picked round-robin per channel
|
|
509
507
|
*
|
|
510
|
-
* `meta.target` narrows the
|
|
511
|
-
*
|
|
512
|
-
* stays in the running, so a targeted event reaches one named instance while
|
|
513
|
-
* still being observable by tap=all clients.
|
|
508
|
+
* `meta.target` narrows the recipient set via `matchesClient`: only the subscriber
|
|
509
|
+
* whose `subscriberId` equals `target` receives a targeted event.
|
|
514
510
|
*/
|
|
515
511
|
private pickRecipients;
|
|
516
512
|
addClient(ws: ServerWebSocket<unknown>, data: ClientData): void;
|
|
@@ -536,7 +532,7 @@ type ConnectorRegistry = {
|
|
|
536
532
|
} | null;
|
|
537
533
|
};
|
|
538
534
|
type SupervisorNotify = (channelName: string, connectorName: string, content: string, meta?: Record<string, string>) => Promise<void>;
|
|
539
|
-
type Deps$
|
|
535
|
+
type Deps$10 = {
|
|
540
536
|
channels: ConnectorRegistry;
|
|
541
537
|
notify: SupervisorNotify;
|
|
542
538
|
logger?: FunnelLogger; /** Host hook for surfacing listener lifecycle exceptions. Defaults to no-op. */
|
|
@@ -583,7 +579,7 @@ declare class FunnelListenerSupervisor {
|
|
|
583
579
|
private readonly now;
|
|
584
580
|
private healthCheckTimer;
|
|
585
581
|
private healthCheckInFlight;
|
|
586
|
-
constructor(deps: Deps$
|
|
582
|
+
constructor(deps: Deps$10);
|
|
587
583
|
static keyOf(channelName: string, connectorName: string): string;
|
|
588
584
|
isRunning(channelName: string, connectorName: string): boolean;
|
|
589
585
|
list(): ListenerEntryStatus[];
|
|
@@ -956,6 +952,12 @@ declare function buildGatewayRoutes(): _$hono_hono_base0.HonoBase<Env$1, {
|
|
|
956
952
|
};
|
|
957
953
|
}, "/", "/channels/:channel/publish">;
|
|
958
954
|
//#endregion
|
|
955
|
+
//#region lib/engine/claude/channel-resolver.d.ts
|
|
956
|
+
type ChannelResolver = {
|
|
957
|
+
get(name: string): ChannelConfig | null;
|
|
958
|
+
getById(id: string): ChannelConfig | null;
|
|
959
|
+
};
|
|
960
|
+
//#endregion
|
|
959
961
|
//#region lib/engine/claude/gateway-controller.d.ts
|
|
960
962
|
type GatewayController = {
|
|
961
963
|
isRunning(): boolean;
|
|
@@ -964,78 +966,25 @@ type GatewayController = {
|
|
|
964
966
|
}): Promise<boolean>;
|
|
965
967
|
};
|
|
966
968
|
//#endregion
|
|
967
|
-
//#region lib/engine/
|
|
968
|
-
|
|
969
|
-
declare const FUNNEL_MCP_ARGS: string[];
|
|
970
|
-
declare const FUNNEL_MCP_NAME = "funnel";
|
|
971
|
-
type Deps$11 = {
|
|
972
|
-
fs?: FunnelFileSystem;
|
|
973
|
-
};
|
|
974
|
-
/**
|
|
975
|
-
* Installs/uninstalls the funnel MCP entry into a target repository's
|
|
976
|
-
* `.mcp.json`. Detects an existing entry by command match so renaming is
|
|
977
|
-
* preserved across re-installs.
|
|
978
|
-
*/
|
|
979
|
-
declare class FunnelMcp {
|
|
980
|
-
private readonly fs;
|
|
981
|
-
constructor(deps?: Deps$11);
|
|
982
|
-
install(repoPath: string): void;
|
|
983
|
-
uninstall(repoPath: string): void;
|
|
969
|
+
//#region lib/engine/claude/mcp-installer.d.ts
|
|
970
|
+
type McpInstaller = {
|
|
984
971
|
findInstalledName(cwd: string): string | null;
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
private readConfig;
|
|
988
|
-
private writeConfig;
|
|
989
|
-
}
|
|
972
|
+
install(cwd: string): void;
|
|
973
|
+
};
|
|
990
974
|
//#endregion
|
|
991
|
-
//#region lib/engine/
|
|
992
|
-
type
|
|
993
|
-
|
|
994
|
-
|
|
975
|
+
//#region lib/engine/claude/process-guard.d.ts
|
|
976
|
+
type ProcessGuard = {
|
|
977
|
+
/** Returns true if a live process is already registered for this profile. */isRunning(profileId: string): boolean; /** Writes the PID file and registers an exit hook to clean it up. */
|
|
978
|
+
acquire(profileId: string): void; /** Removes the PID file. */
|
|
979
|
+
release(profileId: string): void;
|
|
980
|
+
};
|
|
981
|
+
//#endregion
|
|
982
|
+
//#region lib/engine/claude/session-store.d.ts
|
|
983
|
+
type SessionStore = {
|
|
984
|
+
getSessionId(profileId: string): string | null;
|
|
985
|
+
setSessionId(profileId: string, sessionId: string): void; /** Returns true when the session jsonl exists on disk and is non-empty. */
|
|
986
|
+
sessionFileExists(cwd: string, sessionId: string, env: Record<string, string>): boolean;
|
|
995
987
|
};
|
|
996
|
-
/**
|
|
997
|
-
* Named launch presets for `fnl claude`. Each profile bundles a working
|
|
998
|
-
* directory, the channel id its Claude instance subscribes to, and the launch
|
|
999
|
-
* recipe (`options` prepended to the claude argv, `env` layered under the
|
|
1000
|
-
* process, `resume` toggling session reuse). Implements ProfileChannelChecker
|
|
1001
|
-
* so FunnelChannels can refuse to remove a channel that is still referenced.
|
|
1002
|
-
*
|
|
1003
|
-
* Each profile has a stable `id` (uuid) minted at `add`. That id is the unit
|
|
1004
|
-
* everything internal keys on — the PID file, the resumable session id — so a
|
|
1005
|
-
* rename never strands either. `name` is purely the CLI/TUI handle; the CRUD
|
|
1006
|
-
* methods here take it because that is what the user types, but resolve to the
|
|
1007
|
-
* id before touching id-keyed state. The first array entry is the default
|
|
1008
|
-
* profile; `asDefault` reorders to put one first.
|
|
1009
|
-
*
|
|
1010
|
-
* `channelId` always stores the channel's stable id (uuid). CLI surfaces
|
|
1011
|
-
* resolve channel name → id before calling `add`/`update` here.
|
|
1012
|
-
*/
|
|
1013
|
-
declare class FunnelProfiles {
|
|
1014
|
-
private readonly store;
|
|
1015
|
-
private readonly idGenerator;
|
|
1016
|
-
constructor(deps: Deps$10);
|
|
1017
|
-
list(): ProfileConfig[];
|
|
1018
|
-
get(name: string): ProfileConfig | null;
|
|
1019
|
-
getById(id: string): ProfileConfig | null;
|
|
1020
|
-
getDefault(): ProfileConfig | null;
|
|
1021
|
-
add(input: {
|
|
1022
|
-
name: string;
|
|
1023
|
-
path: string;
|
|
1024
|
-
channelId: string;
|
|
1025
|
-
options?: string[];
|
|
1026
|
-
env?: Record<string, string>;
|
|
1027
|
-
resume?: boolean;
|
|
1028
|
-
}): void;
|
|
1029
|
-
remove(name: string): void;
|
|
1030
|
-
rename(oldName: string, newName: string): void;
|
|
1031
|
-
asDefault(name: string): void;
|
|
1032
|
-
hasChannelRef(channelId: string): boolean;
|
|
1033
|
-
/** Resumable claude session id last launched by this profile (by id), or null. */
|
|
1034
|
-
getSessionId(id: string): string | null;
|
|
1035
|
-
/** Records the claude session id this profile launched, overwriting any prior one. */
|
|
1036
|
-
setSessionId(id: string, sessionId: string): void;
|
|
1037
|
-
update(name: string, fields: Partial<Omit<ProfileConfig, "name">>): void;
|
|
1038
|
-
}
|
|
1039
988
|
//#endregion
|
|
1040
989
|
//#region lib/engine/claude/claude.d.ts
|
|
1041
990
|
type LaunchOptions = {
|
|
@@ -1063,41 +1012,32 @@ type LaunchOptions = {
|
|
|
1063
1012
|
installMcp?: boolean;
|
|
1064
1013
|
};
|
|
1065
1014
|
type Deps$9 = {
|
|
1066
|
-
channels:
|
|
1067
|
-
mcp:
|
|
1015
|
+
channels: ChannelResolver;
|
|
1016
|
+
mcp: McpInstaller;
|
|
1068
1017
|
gateway: GatewayController;
|
|
1069
|
-
|
|
1018
|
+
sessions: SessionStore;
|
|
1019
|
+
guard: ProcessGuard;
|
|
1070
1020
|
process?: FunnelProcessRunner;
|
|
1071
|
-
fs?: FunnelFileSystem;
|
|
1072
1021
|
idGenerator?: FunnelIdGenerator;
|
|
1073
1022
|
logger?: FunnelLogger;
|
|
1074
|
-
dir?: string;
|
|
1075
1023
|
};
|
|
1076
1024
|
/**
|
|
1077
1025
|
* Launches Claude Code with funnel pre-wired: ensures the gateway is running,
|
|
1078
1026
|
* installs the funnel MCP into the target repo's `.mcp.json` if missing,
|
|
1079
|
-
* injects `FUNNEL_CHANNEL_ID` into the child env, and
|
|
1080
|
-
*
|
|
1027
|
+
* injects `FUNNEL_CHANNEL_ID` into the child env, and delegates singleton
|
|
1028
|
+
* enforcement to a ProcessGuard.
|
|
1081
1029
|
*/
|
|
1082
1030
|
declare class FunnelClaude {
|
|
1083
1031
|
private readonly channels;
|
|
1084
1032
|
private readonly mcp;
|
|
1085
1033
|
private readonly gateway;
|
|
1086
|
-
private readonly
|
|
1034
|
+
private readonly sessions;
|
|
1035
|
+
private readonly guard;
|
|
1087
1036
|
private readonly process;
|
|
1088
|
-
private readonly fs;
|
|
1089
1037
|
private readonly idGenerator;
|
|
1090
1038
|
private readonly logger;
|
|
1091
|
-
private readonly pidDir;
|
|
1092
1039
|
constructor(deps: Deps$9);
|
|
1093
1040
|
launch(options: LaunchOptions): Promise<number>;
|
|
1094
|
-
isRunning(profileId: string): boolean;
|
|
1095
|
-
private pidPath;
|
|
1096
|
-
private readPid;
|
|
1097
|
-
private writePidFile;
|
|
1098
|
-
private removePidFile;
|
|
1099
|
-
private installCleanup;
|
|
1100
|
-
private isProcessAlive;
|
|
1101
1041
|
private buildArgs;
|
|
1102
1042
|
/**
|
|
1103
1043
|
* Decides whether funnel should resume an existing claude session or start
|
|
@@ -1119,35 +1059,10 @@ declare class FunnelClaude {
|
|
|
1119
1059
|
* overwrites the dangling entry — so the store self-heals.
|
|
1120
1060
|
*/
|
|
1121
1061
|
private resolveSession;
|
|
1122
|
-
/**
|
|
1123
|
-
* Mirrors claude's session storage path
|
|
1124
|
-
* (`<config-dir>/projects/<cwd-with-slashes-as-dashes>/<id>.jsonl`) to check
|
|
1125
|
-
* whether a recorded session still exists AND is non-empty. Reads the same
|
|
1126
|
-
* `CLAUDE_CONFIG_DIR` the child will run under so the check matches reality; a
|
|
1127
|
-
* wrong guess can only ever produce a false negative (start fresh), never a
|
|
1128
|
-
* bad resume.
|
|
1129
|
-
*/
|
|
1130
|
-
private sessionFileExists;
|
|
1131
1062
|
private buildEnv;
|
|
1132
1063
|
}
|
|
1133
1064
|
//#endregion
|
|
1134
1065
|
//#region lib/engine/local-config/local-config-schema.d.ts
|
|
1135
|
-
declare const connectorSpecSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
1136
|
-
type: z.ZodLiteral<"slack">;
|
|
1137
|
-
name: z.ZodString;
|
|
1138
|
-
minify: z.ZodOptional<z.ZodBoolean>;
|
|
1139
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
1140
|
-
type: z.ZodLiteral<"discord">;
|
|
1141
|
-
name: z.ZodString;
|
|
1142
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
1143
|
-
type: z.ZodLiteral<"gh">;
|
|
1144
|
-
name: z.ZodString;
|
|
1145
|
-
pollInterval: z.ZodOptional<z.ZodNumber>;
|
|
1146
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
1147
|
-
type: z.ZodLiteral<"schedule">;
|
|
1148
|
-
name: z.ZodString;
|
|
1149
|
-
}, z.core.$strip>], "type">;
|
|
1150
|
-
type ConnectorSpec = z.infer<typeof connectorSpecSchema>;
|
|
1151
1066
|
declare const channelSpecSchema: z.ZodObject<{
|
|
1152
1067
|
name: z.ZodString;
|
|
1153
1068
|
connectors: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
@@ -1167,14 +1082,6 @@ declare const channelSpecSchema: z.ZodObject<{
|
|
|
1167
1082
|
}, z.core.$strip>], "type">>>;
|
|
1168
1083
|
}, z.core.$strip>;
|
|
1169
1084
|
type ChannelSpec = z.infer<typeof channelSpecSchema>;
|
|
1170
|
-
declare const profileSpecSchema: z.ZodObject<{
|
|
1171
|
-
name: z.ZodString;
|
|
1172
|
-
channel: z.ZodString;
|
|
1173
|
-
options: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1174
|
-
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
1175
|
-
resume: z.ZodOptional<z.ZodBoolean>;
|
|
1176
|
-
}, z.core.$strip>;
|
|
1177
|
-
type ProfileSpec = z.infer<typeof profileSpecSchema>;
|
|
1178
1085
|
declare const localConfigSchema: z.ZodObject<{
|
|
1179
1086
|
$schema: z.ZodOptional<z.ZodString>;
|
|
1180
1087
|
id: z.ZodOptional<z.ZodString>;
|
|
@@ -1205,7 +1112,6 @@ declare const localConfigSchema: z.ZodObject<{
|
|
|
1205
1112
|
}, z.core.$strip>>>;
|
|
1206
1113
|
}, z.core.$strip>;
|
|
1207
1114
|
type LocalConfig = z.infer<typeof localConfigSchema>;
|
|
1208
|
-
declare const LOCAL_CONFIG_FILENAME = "funnel.json";
|
|
1209
1115
|
//#endregion
|
|
1210
1116
|
//#region lib/engine/local-config/local-config.d.ts
|
|
1211
1117
|
type Deps$8 = {
|
|
@@ -1291,21 +1197,64 @@ declare class FunnelLocalConfigSync {
|
|
|
1291
1197
|
private resolveSlot;
|
|
1292
1198
|
}
|
|
1293
1199
|
//#endregion
|
|
1294
|
-
//#region lib/engine/
|
|
1200
|
+
//#region lib/engine/profiles/profiles.d.ts
|
|
1295
1201
|
type Deps$6 = {
|
|
1296
|
-
|
|
1202
|
+
store: FunnelSettingsReader;
|
|
1203
|
+
idGenerator: FunnelIdGenerator;
|
|
1204
|
+
fs?: FunnelFileSystem;
|
|
1297
1205
|
};
|
|
1298
1206
|
/**
|
|
1299
|
-
*
|
|
1300
|
-
*
|
|
1301
|
-
*
|
|
1302
|
-
*
|
|
1303
|
-
*
|
|
1207
|
+
* Named launch presets for `fnl claude`. Each profile bundles a working
|
|
1208
|
+
* directory, the channel id its Claude instance subscribes to, and the launch
|
|
1209
|
+
* recipe (`options` prepended to the claude argv, `env` layered under the
|
|
1210
|
+
* process, `resume` toggling session reuse). Implements ProfileChannelChecker
|
|
1211
|
+
* so FunnelChannels can refuse to remove a channel that is still referenced.
|
|
1212
|
+
*
|
|
1213
|
+
* Each profile has a stable `id` (uuid) minted at `add`. That id is the unit
|
|
1214
|
+
* everything internal keys on — the PID file, the resumable session id — so a
|
|
1215
|
+
* rename never strands either. `name` is purely the CLI/TUI handle; the CRUD
|
|
1216
|
+
* methods here take it because that is what the user types, but resolve to the
|
|
1217
|
+
* id before touching id-keyed state. The first array entry is the default
|
|
1218
|
+
* profile; `asDefault` reorders to put one first.
|
|
1219
|
+
*
|
|
1220
|
+
* `channelId` always stores the channel's stable id (uuid). CLI surfaces
|
|
1221
|
+
* resolve channel name → id before calling `add`/`update` here.
|
|
1304
1222
|
*/
|
|
1305
|
-
declare class
|
|
1223
|
+
declare class FunnelProfiles {
|
|
1224
|
+
private readonly store;
|
|
1225
|
+
private readonly idGenerator;
|
|
1306
1226
|
private readonly fs;
|
|
1307
1227
|
constructor(deps: Deps$6);
|
|
1308
|
-
|
|
1228
|
+
list(): ProfileConfig[];
|
|
1229
|
+
get(name: string): ProfileConfig | null;
|
|
1230
|
+
getById(id: string): ProfileConfig | null;
|
|
1231
|
+
getDefault(): ProfileConfig | null;
|
|
1232
|
+
add(input: {
|
|
1233
|
+
name: string;
|
|
1234
|
+
path: string;
|
|
1235
|
+
channelId: string;
|
|
1236
|
+
options?: string[];
|
|
1237
|
+
env?: Record<string, string>;
|
|
1238
|
+
resume?: boolean;
|
|
1239
|
+
}): void;
|
|
1240
|
+
remove(name: string): void;
|
|
1241
|
+
rename(oldName: string, newName: string): void;
|
|
1242
|
+
asDefault(name: string): void;
|
|
1243
|
+
hasChannelRef(channelId: string): boolean;
|
|
1244
|
+
/** Resumable claude session id last launched by this profile (by id), or null. */
|
|
1245
|
+
getSessionId(id: string): string | null;
|
|
1246
|
+
/** Records the claude session id this profile launched, overwriting any prior one. */
|
|
1247
|
+
setSessionId(id: string, sessionId: string): void;
|
|
1248
|
+
/**
|
|
1249
|
+
* Mirrors claude's session storage path
|
|
1250
|
+
* (`<config-dir>/projects/<cwd-with-slashes-as-dashes>/<id>.jsonl`) to check
|
|
1251
|
+
* whether a recorded session still exists AND is non-empty. Reads the same
|
|
1252
|
+
* `CLAUDE_CONFIG_DIR` the child will run under so the check matches reality; a
|
|
1253
|
+
* wrong guess can only ever produce a false negative (start fresh), never a
|
|
1254
|
+
* bad resume.
|
|
1255
|
+
*/
|
|
1256
|
+
sessionFileExists(cwd: string, sessionId: string, env: Record<string, string>): boolean;
|
|
1257
|
+
update(name: string, fields: Partial<Omit<ProfileConfig, "name">>): void;
|
|
1309
1258
|
}
|
|
1310
1259
|
//#endregion
|
|
1311
1260
|
//#region lib/gateway/publish-schema.d.ts
|
|
@@ -1463,7 +1412,6 @@ declare class FunnelGateway {
|
|
|
1463
1412
|
//#region lib/gateway/gateway-server.d.ts
|
|
1464
1413
|
type Deps$3 = {
|
|
1465
1414
|
channels: FunnelChannels;
|
|
1466
|
-
settings: FunnelSettingsReader;
|
|
1467
1415
|
port?: number; /** Bind address for `Bun.serve`. Defaults to `127.0.0.1` (loopback only). Set to `0.0.0.0` to expose on the network. */
|
|
1468
1416
|
hostname?: string; /** SQLite event store file path. Parent directory is created on demand. Defaults to `<os.tmpdir()>/funnel/events.db`. Ignored when `eventLog` is supplied. */
|
|
1469
1417
|
dbPath?: string; /** Durable replay log. Defaults to a `SqliteFunnelEventLog` at `dbPath`. Inject a `MemoryFunnelEventLog` (or any `FunnelEventLog`) to swap or disable persistence. */
|
|
@@ -1485,10 +1433,9 @@ type Deps$3 = {
|
|
|
1485
1433
|
extraRoutes?: Hono<Env$1>;
|
|
1486
1434
|
};
|
|
1487
1435
|
type WsData = {
|
|
1488
|
-
/** Stable channel id (uuid) the client subscribed to.
|
|
1489
|
-
channelName: string | null; /** Connector names belonging to that channel
|
|
1490
|
-
connectors: string[];
|
|
1491
|
-
tapAll?: boolean; /** Routing mode for this channel; resolved at upgrade time from settings. */
|
|
1436
|
+
/** Stable channel id (uuid) the client subscribed to. */channel: string; /** Resolved channel name (for log readability). null for unknown. */
|
|
1437
|
+
channelName: string | null; /** Connector names belonging to that channel. */
|
|
1438
|
+
connectors: string[]; /** Routing mode for this channel; resolved at upgrade time from settings. */
|
|
1492
1439
|
delivery: "fanout" | "exclusive"; /** Opaque client id from `?id=<subscriberId>`; lets publishers target this client via `meta.target`. */
|
|
1493
1440
|
subscriberId?: string; /** Replay any events with offset strictly greater than this on open, then resume the live stream. */
|
|
1494
1441
|
since?: number;
|
|
@@ -1505,7 +1452,6 @@ type WsData = {
|
|
|
1505
1452
|
*/
|
|
1506
1453
|
declare class FunnelGatewayServer {
|
|
1507
1454
|
private readonly channels;
|
|
1508
|
-
private readonly settings;
|
|
1509
1455
|
private readonly port;
|
|
1510
1456
|
private readonly hostname;
|
|
1511
1457
|
private readonly dbPath;
|
|
@@ -1691,14 +1637,13 @@ type FunnelDebugReport = {
|
|
|
1691
1637
|
};
|
|
1692
1638
|
//#endregion
|
|
1693
1639
|
//#region lib/funnel.d.ts
|
|
1694
|
-
type Props$
|
|
1640
|
+
type Props$7 = {
|
|
1695
1641
|
/** 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. */
|
|
1696
1642
|
fs?: FunnelFileSystem; /** Process runner used by gateway / claude / gh listener. Replace with MemoryFunnelProcessRunner for tests. */
|
|
1697
1643
|
process?: FunnelProcessRunner; /** Logger flowed into every facet. Replace with MemoryFunnelLogger or NoopFunnelLogger to silence/inspect. */
|
|
1698
1644
|
logger?: FunnelLogger; /** Clock used by schedule listener, gh poll watermarks, and gateway timeouts. */
|
|
1699
1645
|
clock?: FunnelClock; /** ID generator for channel and connector ids. Use MemoryFunnelIdGenerator for deterministic tests. */
|
|
1700
|
-
idGenerator?: FunnelIdGenerator; /**
|
|
1701
|
-
tokenPrompter?: FunnelTokenPrompter; /** Funnel home directory (settings.json + per-channel/per-connector dirs). Defaults to ~/.funnel. */
|
|
1646
|
+
idGenerator?: FunnelIdGenerator; /** Funnel home directory (settings.json + per-channel/per-connector dirs). Defaults to ~/.funnel. */
|
|
1702
1647
|
dir?: string; /** Temp / runtime directory (gateway logs and PID adjacent files). Defaults to `<os.tmpdir()>/funnel`. */
|
|
1703
1648
|
tmpDir?: string;
|
|
1704
1649
|
/**
|
|
@@ -1725,17 +1670,26 @@ type Props$8 = {
|
|
|
1725
1670
|
* `Sentry.captureException` from the host to surface these. Defaults to no-op.
|
|
1726
1671
|
*/
|
|
1727
1672
|
onError?: OnFunnelError;
|
|
1673
|
+
/**
|
|
1674
|
+
* Gateway daemon port. Passed directly to FunnelGateway so hosts can override
|
|
1675
|
+
* the default (9742) without setting FUNNEL_PORT in the environment.
|
|
1676
|
+
*/
|
|
1677
|
+
port?: number;
|
|
1678
|
+
/**
|
|
1679
|
+
* Token prompter used by FunnelLocalConfigSync when funnel.json omits a token.
|
|
1680
|
+
* Defaults to a TTY-only stdin prompter. Inject MemoryFunnelTokenPrompter in tests.
|
|
1681
|
+
*/
|
|
1682
|
+
tokenPrompter?: FunnelTokenPrompter;
|
|
1728
1683
|
};
|
|
1729
1684
|
/**
|
|
1730
|
-
* Facade
|
|
1685
|
+
* Facade that wires every funnel facet together and exposes the public surface.
|
|
1731
1686
|
*
|
|
1732
|
-
*
|
|
1733
|
-
*
|
|
1734
|
-
* injectable via `Props` — passing memory implementations gives a fully sandboxed
|
|
1687
|
+
* All side-effecting boundaries (filesystem, process, logger, clock, id, paths)
|
|
1688
|
+
* are injected via Props — passing memory implementations gives a fully sandboxed
|
|
1735
1689
|
* Funnel that touches no real disk, processes, or wall-clock time.
|
|
1736
1690
|
*
|
|
1737
|
-
*
|
|
1738
|
-
*
|
|
1691
|
+
* Fully immutable: all fields are resolved in the constructor and frozen.
|
|
1692
|
+
* No lazy initialisation — every dependency is wired at construction time.
|
|
1739
1693
|
*
|
|
1740
1694
|
* @example
|
|
1741
1695
|
* ```ts
|
|
@@ -1746,114 +1700,57 @@ type Props$8 = {
|
|
|
1746
1700
|
* ```
|
|
1747
1701
|
*/
|
|
1748
1702
|
declare class Funnel {
|
|
1749
|
-
|
|
1750
|
-
private readonly memos;
|
|
1751
|
-
constructor(props?: Props$8);
|
|
1752
|
-
/**
|
|
1753
|
-
* Sandboxed Funnel wired with in-memory implementations for every IO boundary.
|
|
1754
|
-
* Touches no real disk, processes, wall-clock time, or UUIDs — safe for tests
|
|
1755
|
-
* and ad-hoc experiments. Override individual fields by passing them in `props`.
|
|
1756
|
-
*/
|
|
1757
|
-
static inMemory(props?: Props$8): Funnel;
|
|
1758
|
-
/** Resolved on-disk paths the facade will read/write when methods are called. Pure compute, not memoized. */
|
|
1759
|
-
get paths(): {
|
|
1703
|
+
readonly paths: {
|
|
1760
1704
|
dir: string;
|
|
1761
1705
|
tmpDir: string;
|
|
1762
1706
|
settings: string;
|
|
1763
1707
|
};
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
/** Settings reader. If not injected, a FunnelSettingsStore rooted at `dir` is created. */
|
|
1780
|
-
get store(): FunnelSettingsReader;
|
|
1781
|
-
/** Pure factory that constructs per-type listeners and adapters from connector configs. */
|
|
1782
|
-
get factory(): FunnelConnectorFactory;
|
|
1783
|
-
/** Channel CRUD + nested connector CRUD + schedule entries + listener/adapter dispatch. */
|
|
1784
|
-
get channels(): FunnelChannels;
|
|
1785
|
-
/** Launch profiles (named presets for `fnl claude`: path + sub-agent + channel id). */
|
|
1786
|
-
get profiles(): FunnelProfiles;
|
|
1787
|
-
/** Reads `funnel.json` from a cwd. `fnl claude` consults it before falling back to the default profile. */
|
|
1788
|
-
get localConfig(): FunnelLocalConfig;
|
|
1789
|
-
/** Writes the stable `id` into funnel.json on first launch so state can be scoped to `~/.funnel/projects/<id>/`. */
|
|
1790
|
-
get localConfigWriter(): FunnelLocalConfigWriter;
|
|
1791
|
-
/** Secret prompter. Defaults to a TTY-only stdin reader; tests inject MemoryFunnelTokenPrompter. */
|
|
1792
|
-
get tokenPrompter(): FunnelTokenPrompter;
|
|
1793
|
-
/** Reconciles funnel.json's channel + connectors with `~/.funnel/settings.json` on launch. */
|
|
1794
|
-
get localConfigSync(): FunnelLocalConfigSync;
|
|
1795
|
-
/** funnel MCP installer (writes/removes `.mcp.json` entries in target repos). */
|
|
1796
|
-
get mcp(): FunnelMcp;
|
|
1797
|
-
/** Launch Claude Code with a channel injected via env, MCP installed, gateway ensured. */
|
|
1798
|
-
get claude(): FunnelClaude;
|
|
1799
|
-
/** Gateway daemon controller (PID-file, start/stop the separate `bun daemon.ts` process). */
|
|
1800
|
-
get gateway(): FunnelGateway;
|
|
1801
|
-
/** Read / generate the daemon's gateway token (mode 0600 file under `dir`). */
|
|
1802
|
-
get gatewayToken(): FunnelGatewayToken;
|
|
1803
|
-
/**
|
|
1804
|
-
* HTTP client for `POST /channels/:channel/publish` on the running gateway
|
|
1805
|
-
* daemon. Use it to push arbitrary content into a channel from outside any
|
|
1806
|
-
* connector. Returns `{ state: "offline" }` if the daemon isn't up.
|
|
1807
|
-
*/
|
|
1808
|
-
get publisher(): FunnelChannelPublisher;
|
|
1708
|
+
readonly channels: FunnelChannels;
|
|
1709
|
+
readonly gateway: FunnelGateway;
|
|
1710
|
+
readonly gatewayToken: FunnelGatewayToken;
|
|
1711
|
+
readonly publisher: FunnelChannelPublisher;
|
|
1712
|
+
readonly listeners: FunnelListenersClient;
|
|
1713
|
+
readonly claude: FunnelClaude;
|
|
1714
|
+
readonly profiles: FunnelProfiles;
|
|
1715
|
+
readonly localConfig: FunnelLocalConfig;
|
|
1716
|
+
readonly localConfigSync: FunnelLocalConfigSync;
|
|
1717
|
+
private readonly fs;
|
|
1718
|
+
private readonly process;
|
|
1719
|
+
private readonly logger;
|
|
1720
|
+
private readonly clock;
|
|
1721
|
+
private readonly onError;
|
|
1722
|
+
constructor(props?: Props$7);
|
|
1809
1723
|
/**
|
|
1810
|
-
*
|
|
1811
|
-
*
|
|
1812
|
-
*
|
|
1724
|
+
* Sandboxed Funnel wired with in-memory implementations for every IO boundary.
|
|
1725
|
+
* Touches no real disk, processes, wall-clock time, or UUIDs — safe for tests
|
|
1726
|
+
* and ad-hoc experiments. Override individual fields by passing them in `props`.
|
|
1813
1727
|
*/
|
|
1814
|
-
|
|
1728
|
+
static inMemory(props?: Props$7): Funnel;
|
|
1815
1729
|
/**
|
|
1816
1730
|
* In-process gateway server. Unlike `gateway.start()` (which spawns a daemon),
|
|
1817
1731
|
* this returns a class that runs `Bun.serve` + listeners inside the current process —
|
|
1818
1732
|
* useful for tests, embedding, or custom hosts.
|
|
1819
1733
|
*/
|
|
1820
1734
|
gatewayServer(options?: {
|
|
1821
|
-
port?: number;
|
|
1735
|
+
port?: number;
|
|
1822
1736
|
hostname?: string;
|
|
1823
1737
|
dbPath?: string;
|
|
1824
|
-
killCompetingSlack?: boolean;
|
|
1825
|
-
token?: string;
|
|
1738
|
+
killCompetingSlack?: boolean;
|
|
1739
|
+
token?: string;
|
|
1826
1740
|
eventLog?: FunnelEventLog;
|
|
1827
|
-
/**
|
|
1828
|
-
* Additional hono app mounted before the built-in gateway routes.
|
|
1829
|
-
* Use to embed host-specific endpoints (e.g. an MCP route, custom `/api/*`).
|
|
1830
|
-
* Host routes are mounted first; built-in `/listeners`, `/status`,
|
|
1831
|
-
* `/channels`, `/health` are mounted after and take precedence on conflict.
|
|
1832
|
-
*/
|
|
1833
1741
|
extraRoutes?: Hono<Env$1>;
|
|
1834
1742
|
}): FunnelGatewayServer;
|
|
1743
|
+
/**
|
|
1744
|
+
* Run the gateway daemon in the foreground (tied to this terminal).
|
|
1745
|
+
* For background daemon management, use `funnel.gateway.start()` instead.
|
|
1746
|
+
*/
|
|
1747
|
+
runGatewayForeground(options?: {
|
|
1748
|
+
caffeinate?: boolean;
|
|
1749
|
+
}): Promise<number>;
|
|
1835
1750
|
debug(channelName?: string): Promise<FunnelDebugReport>;
|
|
1836
1751
|
gatewayClient(): ReturnType<typeof hc<GatewayApp>>;
|
|
1837
1752
|
}
|
|
1838
1753
|
//#endregion
|
|
1839
|
-
//#region lib/engine/mcp/channel-server.d.ts
|
|
1840
|
-
type ChannelServerOptions = {
|
|
1841
|
-
/** Funnel home directory (settings.json + gateway.token). Defaults to ~/.funnel. */dir?: string; /** Gateway base URL. Defaults to `$FUNNEL_GATEWAY_URL` or `http://127.0.0.1:<port>`. */
|
|
1842
|
-
gatewayUrl?: string; /** Channel id to subscribe to. Defaults to `$FUNNEL_CHANNEL_ID`. */
|
|
1843
|
-
channelId?: string; /** Auth token. Defaults to `$FUNNEL_GATEWAY_TOKEN` then `<dir>/gateway.token`. */
|
|
1844
|
-
token?: string;
|
|
1845
|
-
};
|
|
1846
|
-
declare const startChannelServer: (options?: ChannelServerOptions) => Promise<void>;
|
|
1847
|
-
//#endregion
|
|
1848
|
-
//#region lib/engine/local-config/local-config-json-schema.d.ts
|
|
1849
|
-
/**
|
|
1850
|
-
* Generates the JSON Schema (draft 2020-12) for `funnel.json`. Useful for
|
|
1851
|
-
* `$schema` references in committed `funnel.json` files so editors can give
|
|
1852
|
-
* autocomplete and validation for channels[] (transport) and profiles[]
|
|
1853
|
-
* (launch recipe) without anyone hand-maintaining a separate schema.
|
|
1854
|
-
*/
|
|
1855
|
-
declare const funnelJsonSchema: () => Record<string, unknown>;
|
|
1856
|
-
//#endregion
|
|
1857
1754
|
//#region lib/engine/settings/settings-store.d.ts
|
|
1858
1755
|
/**
|
|
1859
1756
|
* Resolves the funnel home dir. Defaults to `~/.funnel`, overridable via
|
|
@@ -1923,7 +1820,7 @@ declare class NodeFunnelFileSystem extends FunnelFileSystem {
|
|
|
1923
1820
|
}
|
|
1924
1821
|
//#endregion
|
|
1925
1822
|
//#region lib/engine/fs/memory-file-system.d.ts
|
|
1926
|
-
type Props$
|
|
1823
|
+
type Props$6 = {
|
|
1927
1824
|
dirs?: string[];
|
|
1928
1825
|
files?: Record<string, string>;
|
|
1929
1826
|
mtimes?: Record<string, number>;
|
|
@@ -1936,7 +1833,7 @@ declare class MemoryFunnelFileSystem extends FunnelFileSystem {
|
|
|
1936
1833
|
private readonly mtimes;
|
|
1937
1834
|
private readonly modes;
|
|
1938
1835
|
private readonly now;
|
|
1939
|
-
constructor(props?: Props$
|
|
1836
|
+
constructor(props?: Props$6);
|
|
1940
1837
|
existsSync(path: string): boolean;
|
|
1941
1838
|
readFileSync(path: string): string;
|
|
1942
1839
|
writeFileSync(path: string, data: string): void;
|
|
@@ -2022,14 +1919,14 @@ declare class MemoryFunnelProcessRunner extends FunnelProcessRunner {
|
|
|
2022
1919
|
}
|
|
2023
1920
|
//#endregion
|
|
2024
1921
|
//#region lib/engine/logger/node-logger.d.ts
|
|
2025
|
-
type Props$
|
|
1922
|
+
type Props$5 = {
|
|
2026
1923
|
file?: string;
|
|
2027
1924
|
now?: () => Date;
|
|
2028
1925
|
};
|
|
2029
1926
|
declare class NodeFunnelLogger extends FunnelLogger {
|
|
2030
1927
|
readonly file: string;
|
|
2031
1928
|
private readonly now;
|
|
2032
|
-
constructor(props?: Props$
|
|
1929
|
+
constructor(props?: Props$5);
|
|
2033
1930
|
info(message: string, meta?: Record<string, unknown>): void;
|
|
2034
1931
|
warn(message: string, meta?: Record<string, unknown>): void;
|
|
2035
1932
|
error(message: string, meta?: Record<string, unknown>): void;
|
|
@@ -2065,12 +1962,12 @@ declare class NodeFunnelClock extends FunnelClock {
|
|
|
2065
1962
|
}
|
|
2066
1963
|
//#endregion
|
|
2067
1964
|
//#region lib/engine/time/memory-clock.d.ts
|
|
2068
|
-
type Props$
|
|
1965
|
+
type Props$4 = {
|
|
2069
1966
|
start?: Date;
|
|
2070
1967
|
};
|
|
2071
1968
|
declare class MemoryFunnelClock extends FunnelClock {
|
|
2072
1969
|
private current;
|
|
2073
|
-
constructor(props?: Props$
|
|
1970
|
+
constructor(props?: Props$4);
|
|
2074
1971
|
now(): Date;
|
|
2075
1972
|
set(date: Date): void;
|
|
2076
1973
|
advance(ms: number): void;
|
|
@@ -2082,41 +1979,14 @@ declare class NodeFunnelIdGenerator extends FunnelIdGenerator {
|
|
|
2082
1979
|
}
|
|
2083
1980
|
//#endregion
|
|
2084
1981
|
//#region lib/engine/id/memory-id-generator.d.ts
|
|
2085
|
-
type Props$
|
|
1982
|
+
type Props$3 = {
|
|
2086
1983
|
prefix?: string;
|
|
2087
1984
|
};
|
|
2088
1985
|
declare class MemoryFunnelIdGenerator extends FunnelIdGenerator {
|
|
2089
1986
|
private counter;
|
|
2090
1987
|
private readonly prefix;
|
|
2091
|
-
constructor(props?: Props$4);
|
|
2092
|
-
generate(): string;
|
|
2093
|
-
}
|
|
2094
|
-
//#endregion
|
|
2095
|
-
//#region lib/engine/token-prompter/node-token-prompter.d.ts
|
|
2096
|
-
/**
|
|
2097
|
-
* Reads a secret from stdin in raw mode. Echoes a `*` per byte so the user
|
|
2098
|
-
* can see progress without exposing the token. Refuses to prompt when stdin
|
|
2099
|
-
* is not a TTY — callers should surface the resulting error with a hint
|
|
2100
|
-
* pointing at the corresponding env var or CLI command.
|
|
2101
|
-
*/
|
|
2102
|
-
declare class NodeFunnelTokenPrompter extends FunnelTokenPrompter {
|
|
2103
|
-
promptSecret(label: string): Promise<string>;
|
|
2104
|
-
private readSecret;
|
|
2105
|
-
}
|
|
2106
|
-
//#endregion
|
|
2107
|
-
//#region lib/engine/token-prompter/memory-token-prompter.d.ts
|
|
2108
|
-
type Props$3 = {
|
|
2109
|
-
answers?: Record<string, string>;
|
|
2110
|
-
};
|
|
2111
|
-
/**
|
|
2112
|
-
* Pre-seeded answers keyed by prompt label. Tests configure the map up front;
|
|
2113
|
-
* unmapped labels throw so the test surfaces unexpected prompts loudly.
|
|
2114
|
-
*/
|
|
2115
|
-
declare class MemoryFunnelTokenPrompter extends FunnelTokenPrompter {
|
|
2116
|
-
private readonly answers;
|
|
2117
|
-
readonly asked: string[];
|
|
2118
1988
|
constructor(props?: Props$3);
|
|
2119
|
-
|
|
1989
|
+
generate(): string;
|
|
2120
1990
|
}
|
|
2121
1991
|
//#endregion
|
|
2122
1992
|
//#region lib/gateway/sqlite-funnel-event-log.d.ts
|
|
@@ -2307,6 +2177,10 @@ declare class ConnectorDiagnosticSqlReader {
|
|
|
2307
2177
|
type Env = {
|
|
2308
2178
|
Bindings: {
|
|
2309
2179
|
funnel: Funnel;
|
|
2180
|
+
claude: FunnelClaude;
|
|
2181
|
+
profiles: FunnelProfiles;
|
|
2182
|
+
localConfig: FunnelLocalConfig;
|
|
2183
|
+
localConfigSync: FunnelLocalConfigSync;
|
|
2310
2184
|
};
|
|
2311
2185
|
};
|
|
2312
2186
|
declare const factory: _$hono_factory0.Factory<Env, string>;
|
|
@@ -2372,7 +2246,7 @@ declare const routes: _$hono_hono_base0.HonoBase<Env, {
|
|
|
2372
2246
|
connectors: {
|
|
2373
2247
|
id: string;
|
|
2374
2248
|
name: string;
|
|
2375
|
-
type: "
|
|
2249
|
+
type: "gh" | "discord" | "slack" | "schedule";
|
|
2376
2250
|
}[];
|
|
2377
2251
|
}[];
|
|
2378
2252
|
outputFormat: "json";
|
|
@@ -4206,4 +4080,4 @@ ${string}`;
|
|
|
4206
4080
|
}, "/", "/update">;
|
|
4207
4081
|
type CliApp = typeof routes;
|
|
4208
4082
|
//#endregion
|
|
4209
|
-
export { AliveStub, AttachOptions, BroadcastEvent, BroadcastSubscriber, CONNECTOR_CONNECTION_STATUSES, ChannelConfig, ChannelConnectorView, ChannelDeliveryMode,
|
|
4083
|
+
export { AliveStub, AttachOptions, BroadcastEvent, BroadcastSubscriber, CONNECTOR_CONNECTION_STATUSES, ChannelConfig, ChannelConnectorView, ChannelDeliveryMode, type CliApp, ConnectorConfig, ConnectorConnectionEvent, ConnectorConnectionQuery, ConnectorConnectionRecord, ConnectorConnectionStatus, ConnectorDiagnosticLog, ConnectorDiagnosticSqlReader, ConnectorProcessedEvent, ConnectorProcessedQuery, ConnectorProcessedRecord, ConnectorQuery, ConnectorRawEvent, ConnectorRawQuery, ConnectorRawRecord, ConnectorType, DEFAULT_GATEWAY_PORT, DEFAULT_GATEWAY_TOKEN_PATH, DetachOptions, DiscordConnectorConfig, Env, FUNNEL_DIR, FileStat, Funnel, FunnelBroadcaster, FunnelChannelPublisher, FunnelChannels, FunnelClock, FunnelConnectorFactory, FunnelConnectorListener, type FunnelDebugReport, FunnelEvent, FunnelEventLog, FunnelEventRecord, FunnelFileSystem, FunnelGateway, FunnelGatewayServer, FunnelGatewayToken, FunnelIdGenerator, FunnelListenerSupervisor, FunnelListenersClient, FunnelLogger, FunnelProcessRunner, FunnelSettingsReader, FunnelSettingsStore, FunnelSlackEventProcessor, type GatewayApp, type GatewayEmitInput, type GatewayRouteDeps, type Env$1 as GatewayServerEnv, GhConnectorConfig, ListListenersResult, ListenerEntry, ListenerOpResult, LogEntry, MemoryConnectorDiagnosticLog, MemoryFunnelClock, MemoryFunnelEventLog, MemoryFunnelFileSystem, MemoryFunnelIdGenerator, MemoryFunnelLogger, MemoryFunnelProcessRunner, MemoryProcessCall, MemoryProcessHandler, MemoryProcessResponse, MemoryProcessSyncHandler, MockFunnelSettingsReader, NodeFunnelClock, NodeFunnelFileSystem, NodeFunnelIdGenerator, NodeFunnelLogger, NodeFunnelProcessRunner, NoopFunnelLogger, NotifyFn, OnFunnelError, ProcessListStub, ProcessSnapshot, ProfileConfig, PublishRequest, PublishResponse, PublishResult, ReplayableEvent, RunOptions, RunResult, SETTINGS_PATH, SETTINGS_VERSION, ScheduleCatchupPolicy, ScheduleConnectorConfig, ScheduleEntry, ScheduleListenerOptions, Settings, SlackConnectorConfig, SlackListenerOptions, SlackProcessed, SlackProcessedEmit, SlackProcessedSkip, SlackRawEvent, SlackSkipReason, SqliteConnectorDiagnosticLog, SqliteFunnelEventLog, StoredConnectionEvent, StoredProcessedEvent, StoredRawEvent, channelConfigSchema, channelDeliveryModeSchema, routes as cliRoutes, connectorConfigSchema, connectorConnectionEventSchema, connectorProcessedEventSchema, connectorRawEventSchema, createSettings, discordConnectorSchema, factory, funnelEventSchema, ghConnectorSchema, profileConfigSchema, publishRequestSchema, publishResponseSchema, queryToCliArgs, resolveFunnelDir, resolveFunnelPort, scheduleCatchupPolicySchema, scheduleConnectorSchema, scheduleEntrySchema, settingsSchema, slackConnectorSchema, toRequest };
|