@interactive-inc/claude-funnel 0.63.0 → 0.64.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.
@@ -1,6 +1,6 @@
1
1
  import { n as ChannelDeliveryMode, t as ChannelConfig } from "./settings-schema-BL_c2Udm.js";
2
2
  import { n as FunnelIdGenerator, t as FunnelSettingsReader } from "./settings-reader-BNxjsxCB.js";
3
- import { B as FunnelProcessRunner, I as BaseConnectorConfig, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, c as FunnelClock, j as FunnelConnectorListener, l as FunnelHttpClient, n as ConnectorBuildContext, o as ConnectorOperationContext, r as ConnectorDescriptor, s as ConnectorUpdateContext } from "./connector-descriptor-ClEEbuW3.js";
3
+ import { B as FunnelProcessRunner, I as BaseConnectorConfig, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, c as FunnelClock, j as FunnelConnectorListener, l as FunnelHttpClient, n as ConnectorBuildContext, o as ConnectorOperationContext, r as ConnectorDescriptor, s as ConnectorUpdateContext } from "./connector-descriptor-BFIhyTfa.js";
4
4
  import { n as FunnelFileSystem } from "./file-system-VhwwXZbm.js";
5
5
 
6
6
  //#region lib/engine/connectors/connector-registry.d.ts
package/dist/claude.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { a as ProcessGuard, c as ChannelResolver, i as SessionStore, n as FunnelClaude, o as McpInstaller, r as LaunchOptions, s as GatewayController, t as FunnelFileProcessGuard } from "./file-process-guard-DGHxALfI.js";
2
- import { r as ConnectorDescriptor } from "./connector-descriptor-ClEEbuW3.js";
1
+ import { a as ProcessGuard, c as ChannelResolver, i as SessionStore, n as FunnelClaude, o as McpInstaller, r as LaunchOptions, s as GatewayController, t as FunnelFileProcessGuard } from "./file-process-guard-tVcgckH6.js";
2
+ import { r as ConnectorDescriptor } from "./connector-descriptor-BFIhyTfa.js";
3
3
  import { n as FunnelFileSystem } from "./file-system-VhwwXZbm.js";
4
4
  import { t as FunnelProfiles } from "./profiles-cVZQkM69.js";
5
5
 
package/dist/claude.js CHANGED
@@ -7,7 +7,7 @@ import { t as FunnelProfiles } from "./profiles-ZHLONml4.js";
7
7
  import { t as discordConnector } from "./discord-connector-DIFkYBbi.js";
8
8
  import { t as ghConnector } from "./gh-connector-BUGCOEWS.js";
9
9
  import { t as scheduleConnector } from "./schedule-connector-9k3gOIgl.js";
10
- import { t as slackConnector } from "./slack-connector-BU86fIge.js";
10
+ import { t as slackConnector } from "./slack-connector-CxpWagbT.js";
11
11
  import { join } from "node:path";
12
12
  import { existsSync, readFileSync } from "node:fs";
13
13
  import { homedir } from "node:os";
@@ -185,10 +185,10 @@ declare const connectorConnectionEventSchema: z.ZodObject<{
185
185
  channel_id: z.ZodNullable<z.ZodString>;
186
186
  status: z.ZodEnum<{
187
187
  error: "error";
188
- "auth-failed": "auth-failed";
189
188
  started: "started";
190
189
  connected: "connected";
191
190
  disconnected: "disconnected";
191
+ "auth-failed": "auth-failed";
192
192
  stopped: "stopped";
193
193
  }>;
194
194
  detail: z.ZodString;
@@ -1,6 +1,6 @@
1
- import { M as NotifyFn, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, l as FunnelHttpClient, r as ConnectorDescriptor } from "../connector-descriptor-ClEEbuW3.js";
1
+ import { M as NotifyFn, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, l as FunnelHttpClient, r as ConnectorDescriptor } from "../connector-descriptor-BFIhyTfa.js";
2
2
  import { n as discordConnectorSchema, t as DiscordConnectorConfig } from "../discord-connector-schema-D-bOVAKt.js";
3
- import { t as FunnelFlumeSourceListener } from "../flume-source-listener-Dim5szHG.js";
3
+ import { t as FunnelFlumeSourceListener } from "../flume-source-listener-BNyAII7N.js";
4
4
  import { FlumeRuntimeDeps } from "@interactive-inc/flume";
5
5
 
6
6
  //#region lib/engine/connectors/discord-adapter.d.ts
@@ -1,5 +1,5 @@
1
- import { B as FunnelProcessRunner, M as NotifyFn, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, r as ConnectorDescriptor } from "../connector-descriptor-ClEEbuW3.js";
2
- import { t as FunnelFlumeSourceListener } from "../flume-source-listener-Dim5szHG.js";
1
+ import { B as FunnelProcessRunner, M as NotifyFn, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, r as ConnectorDescriptor } from "../connector-descriptor-BFIhyTfa.js";
2
+ import { t as FunnelFlumeSourceListener } from "../flume-source-listener-BNyAII7N.js";
3
3
  import { n as ghConnectorSchema, t as GhConnectorConfig } from "../gh-connector-schema-DWQaB6gX.js";
4
4
  import { FlumeRuntimeDeps } from "@interactive-inc/flume";
5
5
 
@@ -1,4 +1,4 @@
1
- import { M as NotifyFn, W as FunnelLogger, _ as ConnectorDiagnosticLog, j as FunnelConnectorListener, r as ConnectorDescriptor } from "../connector-descriptor-ClEEbuW3.js";
1
+ import { M as NotifyFn, W as FunnelLogger, _ as ConnectorDiagnosticLog, j as FunnelConnectorListener, r as ConnectorDescriptor } from "../connector-descriptor-BFIhyTfa.js";
2
2
  import { n as FunnelFileSystem } from "../file-system-VhwwXZbm.js";
3
3
  import { a as scheduleConnectorSchema, i as scheduleCatchupPolicySchema, n as ScheduleConnectorConfig, o as scheduleEntrySchema, r as ScheduleEntry, t as ScheduleCatchupPolicy } from "../schedule-connector-schema-Z0RXLgPI.js";
4
4
 
@@ -1,5 +1,5 @@
1
- import { M as NotifyFn, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, l as FunnelHttpClient, r as ConnectorDescriptor } from "../connector-descriptor-ClEEbuW3.js";
2
- import { t as FunnelFlumeSourceListener } from "../flume-source-listener-Dim5szHG.js";
1
+ import { M as NotifyFn, N as CallInput, P as FunnelConnectorAdapter, W as FunnelLogger, _ as ConnectorDiagnosticLog, l as FunnelHttpClient, r as ConnectorDescriptor } from "../connector-descriptor-BFIhyTfa.js";
2
+ import { t as FunnelFlumeSourceListener } from "../flume-source-listener-BNyAII7N.js";
3
3
  import { a as SlackRawEvent, c as SlackMessageEvent, d as slackConnectorSchema, i as SlackProcessedSkip, l as SlackReactionEvent, n as SlackProcessed, o as SlackSkipReason, r as SlackProcessedEmit, s as SlackEvent, t as FunnelSlackEventProcessor, u as SlackConnectorConfig } from "../slack-event-processor-BhCf5Wiy.js";
4
4
  import { FlumeRuntimeDeps } from "@interactive-inc/flume";
5
5
 
@@ -48,6 +48,24 @@ declare class FunnelSlackAdapter extends FunnelConnectorAdapter {
48
48
  * are all valid uses.
49
49
  */
50
50
  type SlackPreprocessEvent = (event: SlackRawEvent) => SlackRawEvent | null | Promise<SlackRawEvent | null>;
51
+ /**
52
+ * Optional host hook for Slack interactivity (`block_actions`,
53
+ * `view_submission`, `view_closed`, `message_action`, `shortcut`) delivered
54
+ * via Socket Mode under the `interactive` envelope type. Funnel auto-acks
55
+ * the envelope for the host (flume's socket layer sends `{envelope_id}` back
56
+ * regardless of payload), so the host can take its time responding via the
57
+ * Slack web API (`views.open`, `chat.update`, …). Returning is enough — the
58
+ * return value is unused. Thrown errors land in the funnel logger and the
59
+ * connector's diagnostic log but never bubble up to flume's queue.
60
+ *
61
+ * Payload shape is intentionally `Record<string, unknown>` because Slack's
62
+ * interactive payload is a wide discriminated union (`type: "block_actions" |
63
+ * "view_submission" | "view_closed" | "message_action" | "shortcut"`) whose
64
+ * narrowest accurate type would couple funnel to Slack's API revisions.
65
+ * Hosts that need a typed payload should parse it with their own zod schema
66
+ * scoped to the interaction types they care about.
67
+ */
68
+ type SlackInteractiveHandler = (payload: Record<string, unknown>) => void | Promise<void>;
51
69
  type Deps = {
52
70
  config: SlackConnectorConfig;
53
71
  channelId?: string;
@@ -57,7 +75,8 @@ type Deps = {
57
75
  flumeDeps?: Partial<FlumeRuntimeDeps>; /** HTTP client for `auth.test` and `reactions.add`. Defaults to NodeFunnelHttpClient. */
58
76
  http?: FunnelHttpClient; /** Shutdown signal forwarded to the underlying Flume. */
59
77
  signal?: AbortSignal; /** See `SlackPreprocessEvent`. Default: identity (no preprocessing). */
60
- preprocessEvent?: SlackPreprocessEvent;
78
+ preprocessEvent?: SlackPreprocessEvent; /** See `SlackInteractiveHandler`. Default: drop interactive envelopes silently. */
79
+ onInteractive?: SlackInteractiveHandler;
61
80
  };
62
81
  /**
63
82
  * Slack listener backed by `@interactive-inc/flume`'s `FlumeSlackSource` (raw
@@ -76,11 +95,13 @@ declare class FunnelFlumeSlackListener extends FunnelFlumeSourceListener {
76
95
  private readonly http;
77
96
  private readonly signal;
78
97
  private readonly preprocessEvent;
98
+ private readonly onInteractive;
79
99
  private processor;
80
100
  private botToken;
81
101
  constructor(deps: Deps);
82
102
  start(notify: NotifyFn): Promise<void>;
83
103
  protected onStop(): void;
104
+ private handleInteractive;
84
105
  private callAuthTest;
85
106
  private handleEvent;
86
107
  private deliver;
@@ -101,18 +122,31 @@ type SlackConnectorOptions = {
101
122
  * way to drop an event for a reason the processor's gates do not cover.
102
123
  */
103
124
  preprocessEvent?: SlackPreprocessEvent;
125
+ /**
126
+ * Optional host handler for Slack interactivity (button clicks, modal
127
+ * submissions, message actions, global shortcuts) delivered via Socket
128
+ * Mode under the `interactive` envelope type. Funnel auto-acks the
129
+ * envelope for the host, so the handler can take its time and respond via
130
+ * the Slack web API. Setting this is the supported alternative to running
131
+ * a parallel Bolt app alongside funnel just for interactivity.
132
+ */
133
+ onInteractive?: SlackInteractiveHandler;
104
134
  };
105
135
  /**
106
136
  * Slack connector descriptor. Pass `slackConnector()` to
107
137
  * `new Funnel({ connectors: [...] })` to enable the type.
108
138
  *
109
139
  * The listener is backed by `@interactive-inc/flume`'s `FlumeSlackSource`
110
- * (raw Socket Mode WebSocket). Only the events API envelope is delivered —
111
- * there is no equivalent for the Bolt-style `app.action` / `app.command`
112
- * dispatch. For HTTP-side interactivity (buttons, slash commands), run a
113
- * separate Bolt app outside funnel; this descriptor only handles the
114
- * incoming events firehose.
140
+ * (raw Socket Mode WebSocket). Both the `events_api` envelope (messages,
141
+ * mentions, reactions, …) and the `interactive` envelope (block actions,
142
+ * view submissions, message actions, shortcuts) are delivered — the former
143
+ * runs through the funnel processor and emits notifications, the latter is
144
+ * handed to the optional `onInteractive` host hook (funnel auto-acks the
145
+ * envelope, so the host can respond via the Slack web API at its leisure).
146
+ * Slash commands (`slash_commands` envelope) and Bolt's middleware chain
147
+ * have no equivalent here yet — wire those via the Slack HTTP endpoints if
148
+ * needed.
115
149
  */
116
150
  declare const slackConnector: (options?: SlackConnectorOptions) => ConnectorDescriptor;
117
151
  //#endregion
118
- export { FunnelFlumeSlackListener, FunnelSlackAdapter, FunnelSlackEventProcessor, SlackConnectorConfig, SlackConnectorOptions, SlackEvent, SlackMessageEvent, SlackPreprocessEvent, SlackProcessed, SlackProcessedEmit, SlackProcessedSkip, SlackRawEvent, SlackReactionEvent, SlackSkipReason, slackConnector, slackConnectorSchema };
152
+ export { FunnelFlumeSlackListener, FunnelSlackAdapter, FunnelSlackEventProcessor, SlackConnectorConfig, SlackConnectorOptions, SlackEvent, SlackInteractiveHandler, SlackMessageEvent, SlackPreprocessEvent, SlackProcessed, SlackProcessedEmit, SlackProcessedSkip, SlackRawEvent, SlackReactionEvent, SlackSkipReason, slackConnector, slackConnectorSchema };
@@ -1,4 +1,4 @@
1
1
  import { t as slackConnectorSchema } from "../slack-connector-schema-Dem8to4P.js";
2
2
  import { t as FunnelSlackEventProcessor } from "../slack-event-processor-xFDG3US0.js";
3
- import { n as FunnelFlumeSlackListener, r as FunnelSlackAdapter, t as slackConnector } from "../slack-connector-BU86fIge.js";
3
+ import { n as FunnelFlumeSlackListener, r as FunnelSlackAdapter, t as slackConnector } from "../slack-connector-CxpWagbT.js";
4
4
  export { FunnelFlumeSlackListener, FunnelSlackAdapter, FunnelSlackEventProcessor, slackConnector, slackConnectorSchema };
@@ -1,6 +1,6 @@
1
1
  import { t as ChannelConfig } from "./settings-schema-BL_c2Udm.js";
2
2
  import { n as FunnelIdGenerator } from "./settings-reader-BNxjsxCB.js";
3
- import { B as FunnelProcessRunner, W as FunnelLogger } from "./connector-descriptor-ClEEbuW3.js";
3
+ import { B as FunnelProcessRunner, W as FunnelLogger } from "./connector-descriptor-BFIhyTfa.js";
4
4
  import { n as FunnelFileSystem } from "./file-system-VhwwXZbm.js";
5
5
 
6
6
  //#region lib/engine/claude/channel-resolver.d.ts
@@ -1,4 +1,4 @@
1
- import { W as FunnelLogger, _ as ConnectorDiagnosticLog, g as ConnectorConnectionStatus, j as FunnelConnectorListener } from "./connector-descriptor-ClEEbuW3.js";
1
+ import { W as FunnelLogger, _ as ConnectorDiagnosticLog, g as ConnectorConnectionStatus, j as FunnelConnectorListener } from "./connector-descriptor-BFIhyTfa.js";
2
2
  import { FlumeEventHandler, FlumeLogHandler, FlumeReconnectOptions, FlumeRunning, FlumeRuntimeDeps, FlumeSource, FlumeStatus } from "@interactive-inc/flume";
3
3
 
4
4
  //#region lib/engine/connectors/connector-diagnostics-recorder.d.ts