@copilotkit/channels-slack 0.1.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 (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +353 -0
  3. package/dist/__tests__/assistant.test.d.ts +2 -0
  4. package/dist/__tests__/assistant.test.d.ts.map +1 -0
  5. package/dist/__tests__/assistant.test.js +153 -0
  6. package/dist/__tests__/auto-close-streaming.test.d.ts +2 -0
  7. package/dist/__tests__/auto-close-streaming.test.d.ts.map +1 -0
  8. package/dist/__tests__/auto-close-streaming.test.js +139 -0
  9. package/dist/__tests__/built-ins.test.d.ts +2 -0
  10. package/dist/__tests__/built-ins.test.d.ts.map +1 -0
  11. package/dist/__tests__/built-ins.test.js +67 -0
  12. package/dist/__tests__/chunked-message-stream.test.d.ts +2 -0
  13. package/dist/__tests__/chunked-message-stream.test.d.ts.map +1 -0
  14. package/dist/__tests__/chunked-message-stream.test.js +226 -0
  15. package/dist/__tests__/conversation-store.test.d.ts +2 -0
  16. package/dist/__tests__/conversation-store.test.d.ts.map +1 -0
  17. package/dist/__tests__/conversation-store.test.js +209 -0
  18. package/dist/__tests__/download-files.test.d.ts +2 -0
  19. package/dist/__tests__/download-files.test.d.ts.map +1 -0
  20. package/dist/__tests__/download-files.test.js +142 -0
  21. package/dist/__tests__/ephemeral.test.d.ts +2 -0
  22. package/dist/__tests__/ephemeral.test.d.ts.map +1 -0
  23. package/dist/__tests__/ephemeral.test.js +85 -0
  24. package/dist/__tests__/event-renderer.test.d.ts +2 -0
  25. package/dist/__tests__/event-renderer.test.d.ts.map +1 -0
  26. package/dist/__tests__/event-renderer.test.js +521 -0
  27. package/dist/__tests__/markdown-to-mrkdwn.test.d.ts +2 -0
  28. package/dist/__tests__/markdown-to-mrkdwn.test.d.ts.map +1 -0
  29. package/dist/__tests__/markdown-to-mrkdwn.test.js +80 -0
  30. package/dist/__tests__/message-stream.test.d.ts +2 -0
  31. package/dist/__tests__/message-stream.test.d.ts.map +1 -0
  32. package/dist/__tests__/message-stream.test.js +116 -0
  33. package/dist/__tests__/native-renderer.test.d.ts +2 -0
  34. package/dist/__tests__/native-renderer.test.d.ts.map +1 -0
  35. package/dist/__tests__/native-renderer.test.js +236 -0
  36. package/dist/__tests__/native-stream.test.d.ts +2 -0
  37. package/dist/__tests__/native-stream.test.d.ts.map +1 -0
  38. package/dist/__tests__/native-stream.test.js +235 -0
  39. package/dist/__tests__/reactions.test.d.ts +2 -0
  40. package/dist/__tests__/reactions.test.d.ts.map +1 -0
  41. package/dist/__tests__/reactions.test.js +193 -0
  42. package/dist/__tests__/slack-listener.test.d.ts +2 -0
  43. package/dist/__tests__/slack-listener.test.d.ts.map +1 -0
  44. package/dist/__tests__/slack-listener.test.js +559 -0
  45. package/dist/__tests__/views.test.d.ts +2 -0
  46. package/dist/__tests__/views.test.d.ts.map +1 -0
  47. package/dist/__tests__/views.test.js +143 -0
  48. package/dist/adapter.d.ts +188 -0
  49. package/dist/adapter.d.ts.map +1 -0
  50. package/dist/adapter.js +859 -0
  51. package/dist/adapter.test.d.ts +2 -0
  52. package/dist/adapter.test.d.ts.map +1 -0
  53. package/dist/adapter.test.js +368 -0
  54. package/dist/assistant.d.ts +19 -0
  55. package/dist/assistant.d.ts.map +1 -0
  56. package/dist/assistant.js +124 -0
  57. package/dist/auto-close-streaming.d.ts +62 -0
  58. package/dist/auto-close-streaming.d.ts.map +1 -0
  59. package/dist/auto-close-streaming.js +273 -0
  60. package/dist/built-in-context.d.ts +22 -0
  61. package/dist/built-in-context.d.ts.map +1 -0
  62. package/dist/built-in-context.js +65 -0
  63. package/dist/built-in-tools.d.ts +23 -0
  64. package/dist/built-in-tools.d.ts.map +1 -0
  65. package/dist/built-in-tools.js +45 -0
  66. package/dist/chunked-message-stream.d.ts +67 -0
  67. package/dist/chunked-message-stream.d.ts.map +1 -0
  68. package/dist/chunked-message-stream.js +134 -0
  69. package/dist/codec.d.ts +18 -0
  70. package/dist/codec.d.ts.map +1 -0
  71. package/dist/codec.js +18 -0
  72. package/dist/codec.test.d.ts +2 -0
  73. package/dist/codec.test.d.ts.map +1 -0
  74. package/dist/codec.test.js +19 -0
  75. package/dist/conversation-store.d.ts +92 -0
  76. package/dist/conversation-store.d.ts.map +1 -0
  77. package/dist/conversation-store.js +196 -0
  78. package/dist/download-files.d.ts +59 -0
  79. package/dist/download-files.d.ts.map +1 -0
  80. package/dist/download-files.js +116 -0
  81. package/dist/event-renderer.d.ts +98 -0
  82. package/dist/event-renderer.d.ts.map +1 -0
  83. package/dist/event-renderer.js +493 -0
  84. package/dist/index.d.ts +34 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +23 -0
  87. package/dist/ingress-normalize.d.ts +75 -0
  88. package/dist/ingress-normalize.d.ts.map +1 -0
  89. package/dist/ingress-normalize.js +153 -0
  90. package/dist/ingress-normalize.test.d.ts +2 -0
  91. package/dist/ingress-normalize.test.d.ts.map +1 -0
  92. package/dist/ingress-normalize.test.js +187 -0
  93. package/dist/interaction.d.ts +30 -0
  94. package/dist/interaction.d.ts.map +1 -0
  95. package/dist/interaction.js +219 -0
  96. package/dist/interaction.test.d.ts +2 -0
  97. package/dist/interaction.test.d.ts.map +1 -0
  98. package/dist/interaction.test.js +137 -0
  99. package/dist/markdown-to-mrkdwn.d.ts +21 -0
  100. package/dist/markdown-to-mrkdwn.d.ts.map +1 -0
  101. package/dist/markdown-to-mrkdwn.js +99 -0
  102. package/dist/message-stream.d.ts +44 -0
  103. package/dist/message-stream.d.ts.map +1 -0
  104. package/dist/message-stream.js +70 -0
  105. package/dist/native-stream.d.ts +131 -0
  106. package/dist/native-stream.d.ts.map +1 -0
  107. package/dist/native-stream.js +208 -0
  108. package/dist/render/block-kit.d.ts +35 -0
  109. package/dist/render/block-kit.d.ts.map +1 -0
  110. package/dist/render/block-kit.js +399 -0
  111. package/dist/render/block-kit.test.d.ts +2 -0
  112. package/dist/render/block-kit.test.d.ts.map +1 -0
  113. package/dist/render/block-kit.test.js +289 -0
  114. package/dist/render/budget.d.ts +24 -0
  115. package/dist/render/budget.d.ts.map +1 -0
  116. package/dist/render/budget.js +30 -0
  117. package/dist/render/budget.test.d.ts +2 -0
  118. package/dist/render/budget.test.d.ts.map +1 -0
  119. package/dist/render/budget.test.js +49 -0
  120. package/dist/render/modal.d.ts +13 -0
  121. package/dist/render/modal.d.ts.map +1 -0
  122. package/dist/render/modal.js +108 -0
  123. package/dist/render/transport.d.ts +42 -0
  124. package/dist/render/transport.d.ts.map +1 -0
  125. package/dist/render/transport.js +1 -0
  126. package/dist/render.d.ts +23 -0
  127. package/dist/render.d.ts.map +1 -0
  128. package/dist/render.js +20 -0
  129. package/dist/sanitizing-http-agent.d.ts +28 -0
  130. package/dist/sanitizing-http-agent.d.ts.map +1 -0
  131. package/dist/sanitizing-http-agent.js +51 -0
  132. package/dist/slack-listener.d.ts +73 -0
  133. package/dist/slack-listener.d.ts.map +1 -0
  134. package/dist/slack-listener.js +126 -0
  135. package/dist/slack-listener.test.d.ts +2 -0
  136. package/dist/slack-listener.test.d.ts.map +1 -0
  137. package/dist/slack-listener.test.js +115 -0
  138. package/dist/types.d.ts +153 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +20 -0
  141. package/package.json +73 -0
@@ -0,0 +1,143 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { decodeViewSubmission, decodeViewClosed } from "../interaction.js";
3
+ import { SlackAdapter } from "../adapter.js";
4
+ describe("decodeViewSubmission", () => {
5
+ it("parses field values from a view_submission payload", () => {
6
+ const evt = decodeViewSubmission({
7
+ callback_id: "triage",
8
+ private_metadata: "meta",
9
+ state: {
10
+ values: {
11
+ summary: { summary: { type: "plain_text_input", value: "boom" } },
12
+ prio: {
13
+ prio: {
14
+ type: "static_select",
15
+ selected_option: { value: "high" },
16
+ },
17
+ },
18
+ team: {
19
+ team: {
20
+ type: "radio_buttons",
21
+ selected_option: { value: "core" },
22
+ },
23
+ },
24
+ },
25
+ },
26
+ }, { id: "U1" });
27
+ expect(evt).toMatchObject({
28
+ callbackId: "triage",
29
+ privateMetadata: "meta",
30
+ values: { summary: "boom", prio: "high", team: "core" },
31
+ user: { id: "U1" },
32
+ platform: "slack",
33
+ });
34
+ });
35
+ it("decodes a __cpk envelope into conversationKey + replyTarget and restores pm", () => {
36
+ const evt = decodeViewSubmission({
37
+ callback_id: "file_issue",
38
+ private_metadata: JSON.stringify({
39
+ __cpk: { channel: "C123", threadTs: "1700.5" },
40
+ pm: "authorMeta",
41
+ }),
42
+ state: { values: {} },
43
+ }, { id: "U1" });
44
+ expect(evt.conversationKey).toBe("C123::1700.5");
45
+ expect(evt.replyTarget).toEqual({ channel: "C123", threadTs: "1700.5" });
46
+ expect(evt.privateMetadata).toBe("authorMeta");
47
+ });
48
+ it("uses DM_SCOPE when the envelope has no threadTs", () => {
49
+ const evt = decodeViewSubmission({
50
+ callback_id: "file_issue",
51
+ private_metadata: JSON.stringify({
52
+ __cpk: { channel: "D999" },
53
+ }),
54
+ state: { values: {} },
55
+ }, { id: "U1" });
56
+ expect(evt.conversationKey).toBe("D999::dm");
57
+ expect(evt.replyTarget).toEqual({ channel: "D999" });
58
+ expect(evt.privateMetadata).toBeUndefined();
59
+ });
60
+ it("passes a plain (non-envelope) private_metadata through with no conversationKey/replyTarget", () => {
61
+ const evt = decodeViewSubmission({
62
+ callback_id: "triage",
63
+ private_metadata: "just-a-string",
64
+ state: { values: {} },
65
+ }, { id: "U1" });
66
+ expect(evt.privateMetadata).toBe("just-a-string");
67
+ expect(evt.conversationKey).toBeUndefined();
68
+ expect(evt.replyTarget).toBeUndefined();
69
+ });
70
+ });
71
+ describe("decodeViewClosed", () => {
72
+ it("decodes a __cpk envelope into conversationKey + replyTarget and restores pm", () => {
73
+ const evt = decodeViewClosed({
74
+ callback_id: "file_issue",
75
+ private_metadata: JSON.stringify({
76
+ __cpk: { channel: "C123", threadTs: "1700.5" },
77
+ pm: "authorMeta",
78
+ }),
79
+ }, { id: "U1" });
80
+ expect(evt.conversationKey).toBe("C123::1700.5");
81
+ expect(evt.replyTarget).toEqual({ channel: "C123", threadTs: "1700.5" });
82
+ expect(evt.privateMetadata).toBe("authorMeta");
83
+ });
84
+ it("passes a plain private_metadata through with no conversationKey/replyTarget", () => {
85
+ const evt = decodeViewClosed({
86
+ callback_id: "triage",
87
+ private_metadata: "plain",
88
+ }, { id: "U1" });
89
+ expect(evt.privateMetadata).toBe("plain");
90
+ expect(evt.conversationKey).toBeUndefined();
91
+ expect(evt.replyTarget).toBeUndefined();
92
+ });
93
+ });
94
+ describe("SlackAdapter.openModal", () => {
95
+ const modalIr = [
96
+ {
97
+ type: "modal",
98
+ props: {
99
+ callbackId: "file_issue",
100
+ title: "File issue",
101
+ children: [],
102
+ },
103
+ },
104
+ ];
105
+ function makeAdapter() {
106
+ const adapter = new SlackAdapter({
107
+ botToken: "xoxb-test",
108
+ appToken: "xapp-test",
109
+ });
110
+ const open = vi.fn().mockResolvedValue({ ok: true });
111
+ // Replace the WebClient with a stub exposing only views.open.
112
+ adapter.client = { views: { open } };
113
+ return { adapter, open };
114
+ }
115
+ it("stamps a __cpk envelope carrying the target channel/threadTs into private_metadata", async () => {
116
+ const { adapter, open } = makeAdapter();
117
+ const res = await adapter.openModal({ channel: "C123", threadTs: "1700.5" }, "trigger-1", modalIr);
118
+ expect(res.ok).toBe(true);
119
+ expect(open).toHaveBeenCalledTimes(1);
120
+ const arg = open.mock.calls[0][0];
121
+ const envelope = JSON.parse(arg.view.private_metadata);
122
+ expect(envelope.__cpk).toEqual({ channel: "C123", threadTs: "1700.5" });
123
+ });
124
+ it("preserves an author-set private_metadata under pm", async () => {
125
+ const { adapter, open } = makeAdapter();
126
+ const irWithMeta = [
127
+ {
128
+ type: "modal",
129
+ props: {
130
+ callbackId: "file_issue",
131
+ title: "File issue",
132
+ privateMetadata: "authorMeta",
133
+ children: [],
134
+ },
135
+ },
136
+ ];
137
+ await adapter.openModal({ channel: "C123" }, "trigger-1", irWithMeta);
138
+ const arg = open.mock.calls[0][0];
139
+ const envelope = JSON.parse(arg.view.private_metadata);
140
+ expect(envelope.__cpk).toEqual({ channel: "C123" });
141
+ expect(envelope.pm).toBe("authorMeta");
142
+ });
143
+ });
@@ -0,0 +1,188 @@
1
+ import { App, LogLevel } from "@slack/bolt";
2
+ import type { WebClient } from "@slack/web-api";
3
+ import type { KnownBlock } from "@slack/types";
4
+ import type { PlatformAdapter, SurfaceCapabilities, IngressSink, InteractionEvent, RunRenderer, ReplyTarget as BotReplyTarget, ConversationStore, MessageRef, PlatformUser, UserQuery, EphemeralResult, NativePayload } from "@copilotkit/channels";
5
+ import type { BotNode, ThreadMessage, EmojiValue } from "@copilotkit/channels-ui";
6
+ import type { SlackAssistantOptions, SlackFeedbackOptions, SlackRespondToOptions } from "./types.js";
7
+ export interface SlackAdapterOptions {
8
+ /** Slack bot token (xoxb-…). */
9
+ botToken: string;
10
+ /** Slack app-level token (xapp-…) used for Socket Mode. */
11
+ appToken: string;
12
+ /** Signing secret; required when not using Socket Mode. */
13
+ signingSecret?: string;
14
+ /** Use Socket Mode (default true). HTTP mode requires `signingSecret`. */
15
+ socketMode?: boolean;
16
+ /** HTTP port for non-socket mode (ignored under Socket Mode). */
17
+ port?: number;
18
+ /** Bolt log level. */
19
+ logLevel?: LogLevel;
20
+ /** Custom-event names treated as interrupts by the run renderer. */
21
+ interruptEventNames?: ReadonlySet<string>;
22
+ /** Surface `:wrench:`/`:white_check_mark:` tool-status rows. Default true. */
23
+ showToolStatus?: boolean;
24
+ /**
25
+ * Assistant-pane behavior ("Agents & AI Apps"). ON by default — the pane
26
+ * activates whenever the app's Slack config has the toggle (see the README),
27
+ * and lies dormant without it. Pass an object to customize, or `false` to
28
+ * disable pane handling entirely.
29
+ */
30
+ assistant?: SlackAssistantOptions | false;
31
+ /**
32
+ * Controls which Slack message surfaces become bot turns. Defaults: DMs
33
+ * respond, app mentions respond in-thread, and plain channel thread replies
34
+ * require another app mention.
35
+ */
36
+ respondTo?: SlackRespondToOptions;
37
+ /**
38
+ * Reply-stream transport. "native" (default): `chat.startStream` wherever the
39
+ * reply target is a thread; flat DMs and workspaces where the streaming API
40
+ * is unavailable fall back to legacy automatically. "legacy": the shipped
41
+ * `chat.update` transport.
42
+ */
43
+ streaming?: "native" | "legacy";
44
+ /**
45
+ * Opt-in native AI feedback buttons (👍/👎). When set, streamed replies on
46
+ * the native path finalize with a `feedback_buttons` row and clicks are
47
+ * routed to `onFeedback` (they never reach the engine). Omit for no feedback.
48
+ */
49
+ feedback?: SlackFeedbackOptions;
50
+ }
51
+ /** Slack `PlatformAdapter`: ingress via Bolt, egress via Block Kit + streaming. */
52
+ export declare class SlackAdapter implements PlatformAdapter {
53
+ private readonly opts;
54
+ readonly platform = "slack";
55
+ readonly capabilities: SurfaceCapabilities;
56
+ readonly ackDeadlineMs = 3000;
57
+ readonly app: App;
58
+ client: WebClient;
59
+ botUserId: string;
60
+ private readonly store;
61
+ private sink;
62
+ /** Per-id cache for sender-profile resolution (repeat turns are cheap). */
63
+ private readonly userCache;
64
+ /** Set once the Assistant middleware is attached (when assistant !== false). */
65
+ private assistantHandle;
66
+ /** Our team id (from auth.test); native channel streams need it. */
67
+ private teamId;
68
+ /**
69
+ * In-memory native-streaming health for this workspace. Flipped to false the
70
+ * first time `chat.startStream` fails, so subsequent streams skip the native
71
+ * path and go straight to the legacy transport.
72
+ */
73
+ private nativeStreamingOk;
74
+ /**
75
+ * In-memory health of native structured `task_update` chunks for this
76
+ * workspace. Flipped to false the first time a chunk append fails (old
77
+ * workspace / missing `assistant:write`), so later turns surface tool
78
+ * progress as `:wrench:` rows instead of retrying chunks.
79
+ */
80
+ private nativeTaskChunksOk;
81
+ constructor(opts: SlackAdapterOptions);
82
+ start(sink: IngressSink): Promise<void>;
83
+ stop(): Promise<void>;
84
+ render(ir: BotNode[]): KnownBlock[];
85
+ post(target: BotReplyTarget, ir: BotNode[]): Promise<MessageRef>;
86
+ update(ref: MessageRef, ir: BotNode[]): Promise<void>;
87
+ stream(target: BotReplyTarget, chunks: AsyncIterable<string>): Promise<MessageRef>;
88
+ /**
89
+ * Build the {@link NativeStreamTransport} (chat.startStream/appendStream/
90
+ * stopStream) for a thread target. `onFirstTs` records the first streamed
91
+ * message's ts/channel for the returned MessageRef. Native channel streams
92
+ * pass `recipient_user_id` (the turn sender) + `recipient_team_id`.
93
+ */
94
+ private nativeTransport;
95
+ /**
96
+ * The credentialed {@link SlackRenderTransport} the run renderer calls
97
+ * (setStatus / postMessage / update), wrapping this adapter's `WebClient`.
98
+ * Extracted so `createRunRenderer` stays Bolt-free and the managed Connector
99
+ * Outbox can drive the identical renderer with its own sender.
100
+ */
101
+ private renderTransport;
102
+ /**
103
+ * Route a `feedback_buttons` click to the configured feedback callback.
104
+ * Returns `true` if this was a feedback click (so the caller skips the
105
+ * engine's interaction dispatch). Best-effort: payload-shape or handler
106
+ * errors are logged, never thrown.
107
+ */
108
+ private handleFeedbackClick;
109
+ delete(ref: MessageRef): Promise<void>;
110
+ /**
111
+ * True if `target` is a known assistant-pane thread (recorded by the
112
+ * Assistant middleware). Pane targets drive native status and back the
113
+ * pane-only `setSuggestedPrompts` / `setThreadTitle` methods.
114
+ */
115
+ private isPaneTarget;
116
+ createRunRenderer(target: BotReplyTarget): RunRenderer;
117
+ /** Backs the capability-gated `Thread.setSuggestedPrompts` for pane threads. */
118
+ setSuggestedPrompts(target: BotReplyTarget, prompts: ReadonlyArray<{
119
+ title: string;
120
+ message: string;
121
+ }>, opts?: {
122
+ title?: string;
123
+ }): Promise<{
124
+ ok: boolean;
125
+ error?: string;
126
+ }>;
127
+ /** Backs the capability-gated `Thread.setTitle` for pane threads. */
128
+ setThreadTitle(target: BotReplyTarget, title: string): Promise<{
129
+ ok: boolean;
130
+ error?: string;
131
+ }>;
132
+ decodeInteraction(raw: unknown): InteractionEvent | undefined;
133
+ lookupUser(q: UserQuery): Promise<PlatformUser | undefined>;
134
+ /**
135
+ * Resolve a Slack user id to a richer `PlatformUser` (name + email) for each
136
+ * turn, cached by id so repeat turns in the same conversation are cheap.
137
+ * Tolerates lookup failure by falling back to a bare `{ id }`.
138
+ */
139
+ resolveUser(userId: string): Promise<PlatformUser>;
140
+ get conversationStore(): ConversationStore;
141
+ /**
142
+ * Read the conversation's recent messages. Backs the capability-gated
143
+ * `Thread.getMessages()`. For a thread target we read its replies; a flat
144
+ * target (DM, no `threadTs`) has no thread to fetch, so we return `[]`.
145
+ * Capped defensively to the last 100 messages.
146
+ */
147
+ getMessages(target: BotReplyTarget): Promise<ThreadMessage[]>;
148
+ postFile(target: BotReplyTarget, { bytes, filename, title, altText, }: {
149
+ bytes: Uint8Array;
150
+ filename: string;
151
+ title?: string;
152
+ altText?: string;
153
+ }): Promise<{
154
+ ok: boolean;
155
+ fileId?: string;
156
+ error?: string;
157
+ }>;
158
+ addReaction(target: BotReplyTarget, messageRef: MessageRef, emoji: EmojiValue): Promise<{
159
+ ok: boolean;
160
+ error?: string;
161
+ }>;
162
+ removeReaction(target: BotReplyTarget, messageRef: MessageRef, emoji: EmojiValue): Promise<{
163
+ ok: boolean;
164
+ error?: string;
165
+ }>;
166
+ /**
167
+ * Post an ephemeral message visible only to `user`. Slack always supports
168
+ * native ephemeral, so `fallbackToDM` is ignored and `usedFallback` is
169
+ * always `false` on success. On API error returns `{ ok: false, error }`.
170
+ */
171
+ postEphemeral(target: BotReplyTarget, user: PlatformUser | string, ir: BotNode[], _opts: {
172
+ fallbackToDM: boolean;
173
+ }): Promise<EphemeralResult | null>;
174
+ /** Render a modal IR tree to a Slack `views.open` `View` (pure; backs `openModal`). */
175
+ renderModal(ir: BotNode[]): NativePayload;
176
+ /**
177
+ * Open a modal against a Slack `trigger_id` via `views.open`. Degrades rather
178
+ * than throwing: a render error (unsupported element) or API failure (expired
179
+ * trigger, etc.) resolves to `{ ok: false, error }`.
180
+ */
181
+ openModal(target: BotReplyTarget, triggerId: string, ir: BotNode[]): Promise<{
182
+ ok: boolean;
183
+ error?: string;
184
+ }>;
185
+ }
186
+ /** Construct a Slack `PlatformAdapter`. */
187
+ export declare function slack(opts: SlackAdapterOptions): SlackAdapter;
188
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}