@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.
- package/LICENSE +21 -0
- package/README.md +353 -0
- package/dist/__tests__/assistant.test.d.ts +2 -0
- package/dist/__tests__/assistant.test.d.ts.map +1 -0
- package/dist/__tests__/assistant.test.js +153 -0
- package/dist/__tests__/auto-close-streaming.test.d.ts +2 -0
- package/dist/__tests__/auto-close-streaming.test.d.ts.map +1 -0
- package/dist/__tests__/auto-close-streaming.test.js +139 -0
- package/dist/__tests__/built-ins.test.d.ts +2 -0
- package/dist/__tests__/built-ins.test.d.ts.map +1 -0
- package/dist/__tests__/built-ins.test.js +67 -0
- package/dist/__tests__/chunked-message-stream.test.d.ts +2 -0
- package/dist/__tests__/chunked-message-stream.test.d.ts.map +1 -0
- package/dist/__tests__/chunked-message-stream.test.js +226 -0
- package/dist/__tests__/conversation-store.test.d.ts +2 -0
- package/dist/__tests__/conversation-store.test.d.ts.map +1 -0
- package/dist/__tests__/conversation-store.test.js +209 -0
- package/dist/__tests__/download-files.test.d.ts +2 -0
- package/dist/__tests__/download-files.test.d.ts.map +1 -0
- package/dist/__tests__/download-files.test.js +142 -0
- package/dist/__tests__/ephemeral.test.d.ts +2 -0
- package/dist/__tests__/ephemeral.test.d.ts.map +1 -0
- package/dist/__tests__/ephemeral.test.js +85 -0
- package/dist/__tests__/event-renderer.test.d.ts +2 -0
- package/dist/__tests__/event-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/event-renderer.test.js +521 -0
- package/dist/__tests__/markdown-to-mrkdwn.test.d.ts +2 -0
- package/dist/__tests__/markdown-to-mrkdwn.test.d.ts.map +1 -0
- package/dist/__tests__/markdown-to-mrkdwn.test.js +80 -0
- package/dist/__tests__/message-stream.test.d.ts +2 -0
- package/dist/__tests__/message-stream.test.d.ts.map +1 -0
- package/dist/__tests__/message-stream.test.js +116 -0
- package/dist/__tests__/native-renderer.test.d.ts +2 -0
- package/dist/__tests__/native-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/native-renderer.test.js +236 -0
- package/dist/__tests__/native-stream.test.d.ts +2 -0
- package/dist/__tests__/native-stream.test.d.ts.map +1 -0
- package/dist/__tests__/native-stream.test.js +235 -0
- package/dist/__tests__/reactions.test.d.ts +2 -0
- package/dist/__tests__/reactions.test.d.ts.map +1 -0
- package/dist/__tests__/reactions.test.js +193 -0
- package/dist/__tests__/slack-listener.test.d.ts +2 -0
- package/dist/__tests__/slack-listener.test.d.ts.map +1 -0
- package/dist/__tests__/slack-listener.test.js +559 -0
- package/dist/__tests__/views.test.d.ts +2 -0
- package/dist/__tests__/views.test.d.ts.map +1 -0
- package/dist/__tests__/views.test.js +143 -0
- package/dist/adapter.d.ts +188 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +859 -0
- package/dist/adapter.test.d.ts +2 -0
- package/dist/adapter.test.d.ts.map +1 -0
- package/dist/adapter.test.js +368 -0
- package/dist/assistant.d.ts +19 -0
- package/dist/assistant.d.ts.map +1 -0
- package/dist/assistant.js +124 -0
- package/dist/auto-close-streaming.d.ts +62 -0
- package/dist/auto-close-streaming.d.ts.map +1 -0
- package/dist/auto-close-streaming.js +273 -0
- package/dist/built-in-context.d.ts +22 -0
- package/dist/built-in-context.d.ts.map +1 -0
- package/dist/built-in-context.js +65 -0
- package/dist/built-in-tools.d.ts +23 -0
- package/dist/built-in-tools.d.ts.map +1 -0
- package/dist/built-in-tools.js +45 -0
- package/dist/chunked-message-stream.d.ts +67 -0
- package/dist/chunked-message-stream.d.ts.map +1 -0
- package/dist/chunked-message-stream.js +134 -0
- package/dist/codec.d.ts +18 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +18 -0
- package/dist/codec.test.d.ts +2 -0
- package/dist/codec.test.d.ts.map +1 -0
- package/dist/codec.test.js +19 -0
- package/dist/conversation-store.d.ts +92 -0
- package/dist/conversation-store.d.ts.map +1 -0
- package/dist/conversation-store.js +196 -0
- package/dist/download-files.d.ts +59 -0
- package/dist/download-files.d.ts.map +1 -0
- package/dist/download-files.js +116 -0
- package/dist/event-renderer.d.ts +98 -0
- package/dist/event-renderer.d.ts.map +1 -0
- package/dist/event-renderer.js +493 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/ingress-normalize.d.ts +75 -0
- package/dist/ingress-normalize.d.ts.map +1 -0
- package/dist/ingress-normalize.js +153 -0
- package/dist/ingress-normalize.test.d.ts +2 -0
- package/dist/ingress-normalize.test.d.ts.map +1 -0
- package/dist/ingress-normalize.test.js +187 -0
- package/dist/interaction.d.ts +30 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +219 -0
- package/dist/interaction.test.d.ts +2 -0
- package/dist/interaction.test.d.ts.map +1 -0
- package/dist/interaction.test.js +137 -0
- package/dist/markdown-to-mrkdwn.d.ts +21 -0
- package/dist/markdown-to-mrkdwn.d.ts.map +1 -0
- package/dist/markdown-to-mrkdwn.js +99 -0
- package/dist/message-stream.d.ts +44 -0
- package/dist/message-stream.d.ts.map +1 -0
- package/dist/message-stream.js +70 -0
- package/dist/native-stream.d.ts +131 -0
- package/dist/native-stream.d.ts.map +1 -0
- package/dist/native-stream.js +208 -0
- package/dist/render/block-kit.d.ts +35 -0
- package/dist/render/block-kit.d.ts.map +1 -0
- package/dist/render/block-kit.js +399 -0
- package/dist/render/block-kit.test.d.ts +2 -0
- package/dist/render/block-kit.test.d.ts.map +1 -0
- package/dist/render/block-kit.test.js +289 -0
- package/dist/render/budget.d.ts +24 -0
- package/dist/render/budget.d.ts.map +1 -0
- package/dist/render/budget.js +30 -0
- package/dist/render/budget.test.d.ts +2 -0
- package/dist/render/budget.test.d.ts.map +1 -0
- package/dist/render/budget.test.js +49 -0
- package/dist/render/modal.d.ts +13 -0
- package/dist/render/modal.d.ts.map +1 -0
- package/dist/render/modal.js +108 -0
- package/dist/render/transport.d.ts +42 -0
- package/dist/render/transport.d.ts.map +1 -0
- package/dist/render/transport.js +1 -0
- package/dist/render.d.ts +23 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +20 -0
- package/dist/sanitizing-http-agent.d.ts +28 -0
- package/dist/sanitizing-http-agent.d.ts.map +1 -0
- package/dist/sanitizing-http-agent.js +51 -0
- package/dist/slack-listener.d.ts +73 -0
- package/dist/slack-listener.d.ts.map +1 -0
- package/dist/slack-listener.js +126 -0
- package/dist/slack-listener.test.d.ts +2 -0
- package/dist/slack-listener.test.d.ts.map +1 -0
- package/dist/slack-listener.test.js +115 -0
- package/dist/types.d.ts +153 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- 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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"}
|