@interactive-inc/claude-funnel 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +179 -80
  2. package/dist/bin.js +724 -656
  3. package/dist/connector-adapter-CXB-q_XC.d.ts +11 -0
  4. package/dist/connector-adapter-D5Utumgz.js +4 -0
  5. package/dist/connectors/discord.d.ts +76 -0
  6. package/dist/connectors/discord.js +2 -0
  7. package/dist/connectors/gh.d.ts +38 -0
  8. package/dist/connectors/gh.js +2 -0
  9. package/dist/connectors/schedule.d.ts +53 -0
  10. package/dist/connectors/schedule.js +2 -0
  11. package/dist/connectors/slack.d.ts +62 -0
  12. package/dist/connectors/slack.js +2 -0
  13. package/dist/discord-connector-schema-Dww2I4zH.d.ts +14 -0
  14. package/dist/discord-connector-schema-ygf5Df-2.js +173 -0
  15. package/dist/file-system-Co60LrmR.d.ts +74 -0
  16. package/dist/gateway/daemon.js +233 -183
  17. package/dist/gh-connector-schema-2ml29MBC.js +218 -0
  18. package/dist/gh-connector-schema-BZFAS-p-.d.ts +45 -0
  19. package/dist/index.d.ts +3888 -36
  20. package/dist/index.js +6206 -3485
  21. package/dist/logger-CTlXs7z4.d.ts +33 -0
  22. package/dist/node-logger-DQz_BGOD.js +61 -0
  23. package/dist/schedule-connector-schema-CkuIQ0JQ.js +325 -0
  24. package/dist/slack-connector-schema-Cd22WiHB.js +153 -0
  25. package/dist/slack-connector-schema-D7zAHN8k.d.ts +15 -0
  26. package/lib/bin.ts +1 -76
  27. package/lib/cli/index.ts +85 -0
  28. package/lib/cli/router/to-request.ts +1 -0
  29. package/lib/cli/routes/channels.$channel.publish.ts +52 -0
  30. package/lib/cli/routes/claude.ts +1 -0
  31. package/lib/cli/routes/index.ts +35 -18
  32. package/lib/cli/routes/profiles.add.$profile.ts +5 -2
  33. package/lib/cli/routes/profiles.set.$profile.ts +10 -11
  34. package/lib/connectors/discord.ts +4 -0
  35. package/lib/connectors/gh.ts +3 -0
  36. package/lib/connectors/schedule.ts +4 -0
  37. package/lib/connectors/slack.ts +4 -0
  38. package/lib/engine/claude/claude.ts +6 -0
  39. package/lib/engine/mcp/channel-server.ts +34 -115
  40. package/lib/engine/mcp/channel-subscriber.ts +82 -0
  41. package/lib/engine/mcp/read-channel-connectors.ts +34 -0
  42. package/lib/engine/mcp/read-gateway-token.ts +16 -0
  43. package/lib/engine/mcp/usage-hint-for-type.ts +15 -0
  44. package/lib/engine/settings/settings-schema.ts +2 -0
  45. package/lib/funnel.ts +162 -55
  46. package/lib/gateway/broadcaster.ts +1 -1
  47. package/lib/gateway/channel-publisher.ts +67 -0
  48. package/lib/gateway/gateway-server.ts +28 -16
  49. package/lib/gateway/publish-schema.ts +27 -0
  50. package/lib/gateway/routes/channels.publish.ts +44 -0
  51. package/lib/gateway/routes/index.ts +2 -0
  52. package/lib/gateway/routes/route-deps.ts +8 -0
  53. package/lib/index.ts +15 -0
  54. package/package.json +34 -23
  55. package/dist/cli/factory.d.ts +0 -7
  56. package/dist/cli/router/query-to-cli-args.d.ts +0 -1
  57. package/dist/cli/router/to-request.d.ts +0 -5
  58. package/dist/cli/router/validator.d.ts +0 -5
  59. package/dist/cli/routes/channels.$channel.connectors.$connector.d.ts +0 -42
  60. package/dist/cli/routes/channels.$channel.connectors.$connector.rename.$newName.d.ts +0 -46
  61. package/dist/cli/routes/channels.$channel.connectors.$connector.request.d.ts +0 -54
  62. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.add.$id.d.ts +0 -66
  63. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.d.ts +0 -42
  64. package/dist/cli/routes/channels.$channel.connectors.$connector.schedules.remove.$id.d.ts +0 -46
  65. package/dist/cli/routes/channels.$channel.connectors.add.$connector.d.ts +0 -90
  66. package/dist/cli/routes/channels.$channel.connectors.d.ts +0 -38
  67. package/dist/cli/routes/channels.$channel.connectors.remove.$connector.d.ts +0 -42
  68. package/dist/cli/routes/channels.$channel.connectors.set.$connector.d.ts +0 -62
  69. package/dist/cli/routes/channels.$channel.d.ts +0 -38
  70. package/dist/cli/routes/channels.$channel.rename.$newName.d.ts +0 -42
  71. package/dist/cli/routes/channels.$channel.set.delivery.$mode.d.ts +0 -28
  72. package/dist/cli/routes/channels.add.$channel.d.ts +0 -46
  73. package/dist/cli/routes/channels.d.ts +0 -16
  74. package/dist/cli/routes/channels.remove.$channel.d.ts +0 -38
  75. package/dist/cli/routes/claude.d.ts +0 -32
  76. package/dist/cli/routes/gateway.d.ts +0 -20
  77. package/dist/cli/routes/gateway.listeners.d.ts +0 -17
  78. package/dist/cli/routes/gateway.logs.d.ts +0 -24
  79. package/dist/cli/routes/gateway.restart.d.ts +0 -24
  80. package/dist/cli/routes/gateway.run.d.ts +0 -24
  81. package/dist/cli/routes/gateway.start.d.ts +0 -24
  82. package/dist/cli/routes/gateway.status.d.ts +0 -13
  83. package/dist/cli/routes/gateway.stop.d.ts +0 -16
  84. package/dist/cli/routes/index.d.ts +0 -1222
  85. package/dist/cli/routes/profiles.$profile.as-default.d.ts +0 -38
  86. package/dist/cli/routes/profiles.$profile.rename.$newName.d.ts +0 -42
  87. package/dist/cli/routes/profiles.$profile.run.d.ts +0 -46
  88. package/dist/cli/routes/profiles.add.$profile.d.ts +0 -54
  89. package/dist/cli/routes/profiles.d.ts +0 -16
  90. package/dist/cli/routes/profiles.remove.$profile.d.ts +0 -38
  91. package/dist/cli/routes/profiles.set.$profile.d.ts +0 -54
  92. package/dist/cli/routes/status.d.ts +0 -16
  93. package/dist/cli/routes/update.d.ts +0 -16
  94. package/dist/connectors/connector-adapter.d.ts +0 -8
  95. package/dist/connectors/connector-config-schema.d.ts +0 -43
  96. package/dist/connectors/connector-factory.d.ts +0 -32
  97. package/dist/connectors/connector-listener.d.ts +0 -17
  98. package/dist/connectors/discord-adapter.d.ts +0 -14
  99. package/dist/connectors/discord-connector-schema.d.ts +0 -10
  100. package/dist/connectors/discord-event-processor.d.ts +0 -26
  101. package/dist/connectors/discord-listener.d.ts +0 -17
  102. package/dist/connectors/gh-adapter.d.ts +0 -11
  103. package/dist/connectors/gh-connector-schema.d.ts +0 -10
  104. package/dist/connectors/gh-listener.d.ts +0 -26
  105. package/dist/connectors/match-cron.d.ts +0 -1
  106. package/dist/connectors/schedule-connector-schema.d.ts +0 -45
  107. package/dist/connectors/schedule-listener.d.ts +0 -30
  108. package/dist/connectors/schedule-state-store.d.ts +0 -19
  109. package/dist/connectors/slack-adapter.d.ts +0 -15
  110. package/dist/connectors/slack-connector-schema.d.ts +0 -11
  111. package/dist/connectors/slack-event-processor.d.ts +0 -27
  112. package/dist/connectors/slack-listener.d.ts +0 -17
  113. package/dist/engine/channels/channels.d.ts +0 -106
  114. package/dist/engine/claude/claude.d.ts +0 -49
  115. package/dist/engine/claude/gateway-controller.d.ts +0 -6
  116. package/dist/engine/fs/file-system.d.ts +0 -24
  117. package/dist/engine/fs/memory-file-system.d.ts +0 -31
  118. package/dist/engine/fs/node-file-system.d.ts +0 -15
  119. package/dist/engine/http/http-client.d.ts +0 -15
  120. package/dist/engine/http/memory-http-client.d.ts +0 -12
  121. package/dist/engine/http/node-http-client.d.ts +0 -5
  122. package/dist/engine/id/id-generator.d.ts +0 -7
  123. package/dist/engine/id/memory-id-generator.d.ts +0 -11
  124. package/dist/engine/id/node-id-generator.d.ts +0 -4
  125. package/dist/engine/logger/logger.d.ts +0 -11
  126. package/dist/engine/logger/memory-logger.d.ts +0 -14
  127. package/dist/engine/logger/node-logger.d.ts +0 -15
  128. package/dist/engine/logger/noop-logger.d.ts +0 -7
  129. package/dist/engine/mcp/channel-server.d.ts +0 -1
  130. package/dist/engine/mcp/mcp.d.ts +0 -22
  131. package/dist/engine/process/memory-process-runner.d.ts +0 -43
  132. package/dist/engine/process/node-process-runner.d.ts +0 -9
  133. package/dist/engine/process/process-runner.d.ts +0 -29
  134. package/dist/engine/profiles/profile-channel-checker.d.ts +0 -7
  135. package/dist/engine/profiles/profiles.d.ts +0 -31
  136. package/dist/engine/settings/mock-settings-reader.d.ts +0 -9
  137. package/dist/engine/settings/settings-reader.d.ts +0 -5
  138. package/dist/engine/settings/settings-schema.d.ts +0 -132
  139. package/dist/engine/settings/settings-store.d.ts +0 -18
  140. package/dist/engine/time/clock.d.ts +0 -9
  141. package/dist/engine/time/memory-clock.d.ts +0 -12
  142. package/dist/engine/time/node-clock.d.ts +0 -4
  143. package/dist/funnel.d.ts +0 -95
  144. package/dist/gateway/auth-middleware.d.ts +0 -14
  145. package/dist/gateway/broadcaster.d.ts +0 -122
  146. package/dist/gateway/daemon.d.ts +0 -2
  147. package/dist/gateway/factory.d.ts +0 -7
  148. package/dist/gateway/funnel-event-store.d.ts +0 -81
  149. package/dist/gateway/gateway-server.d.ts +0 -94
  150. package/dist/gateway/gateway-token.d.ts +0 -33
  151. package/dist/gateway/gateway.d.ts +0 -58
  152. package/dist/gateway/kill-competing-slack-gateways.d.ts +0 -9
  153. package/dist/gateway/listener-supervisor.d.ts +0 -85
  154. package/dist/gateway/listeners-client.d.ts +0 -53
  155. package/dist/gateway/resolve-daemon-script.d.ts +0 -11
  156. package/dist/gateway/routes/channels.connectors.call.d.ts +0 -41
  157. package/dist/gateway/routes/health.d.ts +0 -17
  158. package/dist/gateway/routes/index.d.ts +0 -209
  159. package/dist/gateway/routes/listeners.list.d.ts +0 -14
  160. package/dist/gateway/routes/listeners.restart.d.ts +0 -34
  161. package/dist/gateway/routes/listeners.start.d.ts +0 -34
  162. package/dist/gateway/routes/listeners.stop.d.ts +0 -34
  163. package/dist/gateway/routes/route-deps.d.ts +0 -10
  164. package/dist/gateway/routes/status.d.ts +0 -30
  165. package/dist/gateway/routes/validator.d.ts +0 -19
  166. package/dist/logger/leuco-human-file-writer.d.ts +0 -33
  167. package/dist/logger/leuco-human-logger.d.ts +0 -46
  168. package/dist/logger/leuco-human-record.d.ts +0 -15
  169. package/dist/logger/leuco-human-stdout-writer.d.ts +0 -20
  170. package/dist/logger/leuco-human-writer.d.ts +0 -13
  171. package/dist/logger/leuco-logger-memory-sink.d.ts +0 -33
  172. package/dist/logger/leuco-logger-record.d.ts +0 -13
  173. package/dist/logger/leuco-logger-sink.d.ts +0 -34
  174. package/dist/logger/leuco-logger-sqlite-sink.d.ts +0 -102
  175. package/dist/logger/leuco-logger.d.ts +0 -56
@@ -0,0 +1,218 @@
1
+ import { t as FunnelConnectorAdapter } from "./connector-adapter-D5Utumgz.js";
2
+ import { r as FunnelConnectorListener, t as NodeFunnelLogger } from "./node-logger-DQz_BGOD.js";
3
+ import { z } from "zod";
4
+ //#region lib/engine/process/process-runner.ts
5
+ /**
6
+ * Process boundary covering one-shot runs, sync runs, foreground attach, and
7
+ * detached background spawns. Default is NodeFunnelProcessRunner (Bun.spawn);
8
+ * MemoryFunnelProcessRunner records calls and lets tests stub responses.
9
+ */
10
+ var FunnelProcessRunner = class {};
11
+ //#endregion
12
+ //#region lib/engine/process/node-process-runner.ts
13
+ const toEnv = (env) => {
14
+ if (!env) return void 0;
15
+ const merged = {};
16
+ for (const [key, value] of Object.entries(process.env)) if (typeof value === "string") merged[key] = value;
17
+ for (const [key, value] of Object.entries(env)) merged[key] = value;
18
+ return merged;
19
+ };
20
+ var NodeFunnelProcessRunner = class extends FunnelProcessRunner {
21
+ constructor() {
22
+ super();
23
+ Object.freeze(this);
24
+ }
25
+ runSync(command) {
26
+ const result = Bun.spawnSync(command, {
27
+ stdout: "pipe",
28
+ stderr: "pipe"
29
+ });
30
+ return {
31
+ exitCode: result.exitCode ?? 0,
32
+ stdout: result.stdout.toString(),
33
+ stderr: result.stderr.toString()
34
+ };
35
+ }
36
+ async run(command, options = {}) {
37
+ const proc = Bun.spawn(command, {
38
+ cwd: options.cwd,
39
+ env: toEnv(options.env),
40
+ stdin: options.input !== void 0 ? "pipe" : "ignore",
41
+ stdout: "pipe",
42
+ stderr: "pipe"
43
+ });
44
+ if (options.input !== void 0 && proc.stdin) {
45
+ proc.stdin.write(options.input);
46
+ proc.stdin.end();
47
+ }
48
+ return {
49
+ exitCode: await proc.exited,
50
+ stdout: await new Response(proc.stdout).text(),
51
+ stderr: await new Response(proc.stderr).text()
52
+ };
53
+ }
54
+ async attach(command, options = {}) {
55
+ return await Bun.spawn(command, {
56
+ cwd: options.cwd,
57
+ env: toEnv(options.env),
58
+ stdio: [
59
+ "inherit",
60
+ "inherit",
61
+ "inherit"
62
+ ]
63
+ }).exited;
64
+ }
65
+ detach(command, options = {}) {
66
+ Bun.spawn(command, {
67
+ env: toEnv(options.env),
68
+ stdio: [
69
+ "ignore",
70
+ "ignore",
71
+ "ignore"
72
+ ]
73
+ }).unref();
74
+ }
75
+ kill(pid, signal = "SIGTERM") {
76
+ try {
77
+ process.kill(pid, signal);
78
+ } catch {}
79
+ }
80
+ };
81
+ //#endregion
82
+ //#region lib/connectors/gh-adapter.ts
83
+ const defaultProcess$1 = new NodeFunnelProcessRunner();
84
+ var FunnelGhAdapter = class extends FunnelConnectorAdapter {
85
+ process;
86
+ constructor(deps = {}) {
87
+ super();
88
+ this.process = deps.process ?? defaultProcess$1;
89
+ Object.freeze(this);
90
+ }
91
+ async call(input) {
92
+ const args = ["api", input.path];
93
+ if (input.method && input.method.toLowerCase() !== "get") args.push("-X", input.method.toUpperCase());
94
+ const hasBody = input.body && typeof input.body === "object" && Object.keys(input.body).length > 0;
95
+ if (hasBody) args.push("--input", "-");
96
+ const result = await this.process.run(["gh", ...args], { input: hasBody ? JSON.stringify(input.body) : void 0 });
97
+ if (result.exitCode !== 0) throw new Error(`gh api failed: ${result.stderr.trim() || result.stdout.trim()}`);
98
+ try {
99
+ return JSON.parse(result.stdout);
100
+ } catch {
101
+ return result.stdout;
102
+ }
103
+ }
104
+ };
105
+ //#endregion
106
+ //#region lib/connectors/gh-listener.ts
107
+ const ghNotificationSchema = z.object({
108
+ id: z.string(),
109
+ reason: z.string(),
110
+ subject: z.object({
111
+ type: z.string(),
112
+ url: z.string(),
113
+ title: z.string()
114
+ }),
115
+ repository: z.object({ full_name: z.string() }),
116
+ updated_at: z.string()
117
+ });
118
+ const ghNotificationsSchema = z.array(ghNotificationSchema);
119
+ const defaultProcess = new NodeFunnelProcessRunner();
120
+ const defaultLogger = new NodeFunnelLogger();
121
+ const MAX_SEEN = 1e4;
122
+ const KEEP_SEEN = 5e3;
123
+ var FunnelGhListener = class extends FunnelConnectorListener {
124
+ config;
125
+ process;
126
+ logger;
127
+ now;
128
+ seen = /* @__PURE__ */ new Map();
129
+ bootstrapped = false;
130
+ since;
131
+ timer = null;
132
+ constructor(deps) {
133
+ super();
134
+ this.config = deps.config;
135
+ this.process = deps.process ?? defaultProcess;
136
+ this.logger = deps.logger ?? defaultLogger;
137
+ this.now = deps.now ?? (() => /* @__PURE__ */ new Date());
138
+ this.since = this.now().toISOString();
139
+ }
140
+ async start(notify) {
141
+ await this.pollOnce(notify);
142
+ const interval = this.config.pollInterval ?? 60;
143
+ this.timer = setInterval(() => void this.pollOnce(notify), interval * 1e3);
144
+ this.timer.unref();
145
+ }
146
+ async stop() {
147
+ if (!this.timer) return;
148
+ clearInterval(this.timer);
149
+ this.timer = null;
150
+ }
151
+ isAlive() {
152
+ return this.timer !== null;
153
+ }
154
+ async pollOnce(notify) {
155
+ const nextSince = this.now().toISOString();
156
+ const params = new URLSearchParams({
157
+ since: this.since,
158
+ all: "false"
159
+ });
160
+ try {
161
+ const result = await this.process.run([
162
+ "gh",
163
+ "api",
164
+ `/notifications?${params}`
165
+ ]);
166
+ if (result.exitCode !== 0) {
167
+ this.logger.error("gh poll failed", { stderr: result.stderr });
168
+ return;
169
+ }
170
+ const parsed = ghNotificationsSchema.safeParse(JSON.parse(result.stdout));
171
+ if (!parsed.success) {
172
+ this.logger.warn("gh response did not match schema", { error: parsed.error.message });
173
+ return;
174
+ }
175
+ const items = parsed.data;
176
+ for (const item of items) {
177
+ if (this.seen.get(item.id) === item.updated_at) continue;
178
+ this.seen.set(item.id, item.updated_at);
179
+ if (!this.bootstrapped) continue;
180
+ const meta = {
181
+ event_type: "gh",
182
+ reason: item.reason,
183
+ subject_type: item.subject.type,
184
+ subject_url: item.subject.url,
185
+ repository: item.repository.full_name,
186
+ thread_id: item.id,
187
+ updated_at: item.updated_at
188
+ };
189
+ await notify(JSON.stringify(item), meta);
190
+ }
191
+ if (this.seen.size > MAX_SEEN) {
192
+ const toDrop = this.seen.size - KEEP_SEEN;
193
+ let dropped = 0;
194
+ for (const key of this.seen.keys()) {
195
+ if (dropped >= toDrop) break;
196
+ this.seen.delete(key);
197
+ dropped++;
198
+ }
199
+ }
200
+ this.since = nextSince;
201
+ this.bootstrapped = true;
202
+ } catch (error) {
203
+ this.logger.error("gh poll error", { error: error instanceof Error ? error.message : String(error) });
204
+ }
205
+ }
206
+ };
207
+ //#endregion
208
+ //#region lib/connectors/gh-connector-schema.ts
209
+ const ghConnectorSchema = z.object({
210
+ id: z.string(),
211
+ name: z.string(),
212
+ type: z.literal("gh"),
213
+ pollInterval: z.number().int().positive().optional(),
214
+ createdAt: z.string().datetime().optional(),
215
+ updatedAt: z.string().datetime().optional()
216
+ });
217
+ //#endregion
218
+ export { FunnelProcessRunner as a, NodeFunnelProcessRunner as i, FunnelGhListener as n, FunnelGhAdapter as r, ghConnectorSchema as t };
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+
3
+ //#region lib/engine/process/process-runner.d.ts
4
+ type RunOptions = {
5
+ cwd?: string;
6
+ env?: Record<string, string>;
7
+ input?: string;
8
+ };
9
+ type RunResult = {
10
+ exitCode: number;
11
+ stdout: string;
12
+ stderr: string;
13
+ };
14
+ type AttachOptions = {
15
+ cwd?: string;
16
+ env?: Record<string, string>;
17
+ };
18
+ type DetachOptions = {
19
+ env?: Record<string, string>;
20
+ };
21
+ /**
22
+ * Process boundary covering one-shot runs, sync runs, foreground attach, and
23
+ * detached background spawns. Default is NodeFunnelProcessRunner (Bun.spawn);
24
+ * MemoryFunnelProcessRunner records calls and lets tests stub responses.
25
+ */
26
+ declare abstract class FunnelProcessRunner {
27
+ abstract run(command: string[], options?: RunOptions): Promise<RunResult>;
28
+ abstract runSync(command: string[]): RunResult;
29
+ abstract attach(command: string[], options?: AttachOptions): Promise<number>;
30
+ abstract detach(command: string[], options?: DetachOptions): void;
31
+ abstract kill(pid: number, signal?: string): void;
32
+ }
33
+ //#endregion
34
+ //#region lib/connectors/gh-connector-schema.d.ts
35
+ declare const ghConnectorSchema: z.ZodObject<{
36
+ id: z.ZodString;
37
+ name: z.ZodString;
38
+ type: z.ZodLiteral<"gh">;
39
+ pollInterval: z.ZodOptional<z.ZodNumber>;
40
+ createdAt: z.ZodOptional<z.ZodString>;
41
+ updatedAt: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strip>;
43
+ type GhConnectorConfig = z.infer<typeof ghConnectorSchema>;
44
+ //#endregion
45
+ export { FunnelProcessRunner as a, DetachOptions as i, ghConnectorSchema as n, RunOptions as o, AttachOptions as r, RunResult as s, GhConnectorConfig as t };