@zhin.js/adapter-slack 4.1.0 → 4.1.1
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/CHANGELOG.md +41 -0
- package/README.md +58 -250
- package/adapters/slack.ts +34 -0
- package/agent/tools/add_reaction.ts +2 -2
- package/agent/tools/archive_channel.ts +2 -2
- package/agent/tools/edit_message.ts +5 -4
- package/agent/tools/invite_to_channel.ts +2 -2
- package/agent/tools/pin_message.ts +2 -2
- package/agent/tools/remove_reaction.ts +2 -2
- package/agent/tools/set_purpose.ts +2 -2
- package/agent/tools/set_topic.ts +2 -2
- package/agent/tools/unarchive.ts +2 -2
- package/agent/tools/unpin_message.ts +2 -2
- package/agent/tools/user_info.ts +2 -2
- package/lib/endpoint.d.ts +147 -0
- package/lib/endpoint.js +335 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.js +11 -0
- package/lib/markdown-to-mrkdwn.d.ts +9 -0
- package/lib/markdown-to-mrkdwn.js +121 -0
- package/lib/mrkdwn-to-markdown.d.ts +4 -0
- package/lib/{src/mrkdwn-to-markdown.js → mrkdwn-to-markdown.js} +0 -1
- package/lib/platform-permit.d.ts +16 -0
- package/lib/{src/platform-permit.js → platform-permit.js} +1 -2
- package/lib/protocol.d.ts +143 -0
- package/lib/protocol.js +225 -0
- package/lib/slack-agent-deps.d.ts +28 -0
- package/lib/slack-agent-deps.js +30 -0
- package/lib/slack-inbound-filter.d.ts +12 -0
- package/lib/{src/slack-inbound-filter.js → slack-inbound-filter.js} +0 -1
- package/lib/slack-message-ref.d.ts +7 -0
- package/lib/{src/slack-message-ref.js → slack-message-ref.js} +0 -1
- package/lib/slack-outbound.d.ts +24 -0
- package/lib/slack-outbound.js +109 -0
- package/lib/slack-reaction.d.ts +1 -0
- package/lib/{src/slack-reaction.js → slack-reaction.js} +0 -1
- package/lib/slack-response-url.d.ts +5 -0
- package/lib/{src/slack-response-url.js → slack-response-url.js} +0 -1
- package/lib/webhook.d.ts +14 -0
- package/lib/webhook.js +69 -0
- package/package.json +41 -20
- package/plugin.ts +13 -0
- package/schema.json +38 -0
- package/src/endpoint.ts +317 -227
- package/src/index.ts +62 -66
- package/src/markdown-to-mrkdwn.ts +63 -4
- package/src/platform-permit.ts +1 -1
- package/src/protocol.ts +380 -0
- package/src/slack-agent-deps.ts +46 -11
- package/src/slack-inbound-filter.ts +1 -1
- package/src/slack-outbound.ts +32 -134
- package/src/webhook.ts +103 -0
- package/lib/agent/tools/add_reaction.js +0 -21
- package/lib/agent/tools/add_reaction.js.map +0 -1
- package/lib/agent/tools/archive_channel.js +0 -21
- package/lib/agent/tools/archive_channel.js.map +0 -1
- package/lib/agent/tools/edit_message.js +0 -22
- package/lib/agent/tools/edit_message.js.map +0 -1
- package/lib/agent/tools/invite_to_channel.js +0 -22
- package/lib/agent/tools/invite_to_channel.js.map +0 -1
- package/lib/agent/tools/pin_message.js +0 -22
- package/lib/agent/tools/pin_message.js.map +0 -1
- package/lib/agent/tools/remove_reaction.js +0 -21
- package/lib/agent/tools/remove_reaction.js.map +0 -1
- package/lib/agent/tools/set_purpose.js +0 -22
- package/lib/agent/tools/set_purpose.js.map +0 -1
- package/lib/agent/tools/set_topic.js +0 -22
- package/lib/agent/tools/set_topic.js.map +0 -1
- package/lib/agent/tools/unarchive.js +0 -21
- package/lib/agent/tools/unarchive.js.map +0 -1
- package/lib/agent/tools/unpin_message.js +0 -22
- package/lib/agent/tools/unpin_message.js.map +0 -1
- package/lib/agent/tools/user_info.js +0 -28
- package/lib/agent/tools/user_info.js.map +0 -1
- package/lib/src/adapter.js +0 -62
- package/lib/src/adapter.js.map +0 -1
- package/lib/src/endpoint.js +0 -312
- package/lib/src/endpoint.js.map +0 -1
- package/lib/src/event-dispatcher.js +0 -233
- package/lib/src/event-dispatcher.js.map +0 -1
- package/lib/src/index.js +0 -51
- package/lib/src/index.js.map +0 -1
- package/lib/src/markdown-to-mrkdwn.js +0 -61
- package/lib/src/markdown-to-mrkdwn.js.map +0 -1
- package/lib/src/mrkdwn-to-markdown.js.map +0 -1
- package/lib/src/platform-permit.js.map +0 -1
- package/lib/src/segment-mapper.js +0 -2
- package/lib/src/segment-mapper.js.map +0 -1
- package/lib/src/signing.js +0 -21
- package/lib/src/signing.js.map +0 -1
- package/lib/src/slack-agent-deps.js +0 -10
- package/lib/src/slack-agent-deps.js.map +0 -1
- package/lib/src/slack-inbound-filter.js.map +0 -1
- package/lib/src/slack-inbound.js +0 -127
- package/lib/src/slack-inbound.js.map +0 -1
- package/lib/src/slack-message-ref.js.map +0 -1
- package/lib/src/slack-outbound.js +0 -223
- package/lib/src/slack-outbound.js.map +0 -1
- package/lib/src/slack-reaction.js.map +0 -1
- package/lib/src/slack-response-url.js.map +0 -1
- package/lib/src/slack-side-events.js +0 -64
- package/lib/src/slack-side-events.js.map +0 -1
- package/lib/src/transport-http.js +0 -83
- package/lib/src/transport-http.js.map +0 -1
- package/lib/src/transport-socket.js +0 -68
- package/lib/src/transport-socket.js.map +0 -1
- package/lib/src/types.js +0 -5
- package/lib/src/types.js.map +0 -1
- package/plugin.yml +0 -3
- package/src/adapter.ts +0 -75
- package/src/event-dispatcher.ts +0 -255
- package/src/segment-mapper.ts +0 -1
- package/src/signing.ts +0 -28
- package/src/slack-inbound.ts +0 -140
- package/src/slack-side-events.ts +0 -74
- package/src/transport-http.ts +0 -95
- package/src/transport-socket.ts +0 -77
- package/src/types.ts +0 -113
package/src/slack-outbound.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Slack
|
|
2
|
+
* Slack outbound — chat.postMessage + Block Kit + files.uploadV2
|
|
3
3
|
*/
|
|
4
|
-
import type { WebClient } from '@slack/web-api';
|
|
5
|
-
import type { MessageSegment, SendContent } from 'zhin.js';
|
|
6
4
|
import type { Logger } from '@zhin.js/logger';
|
|
7
5
|
import { markdownToMrkdwn, mrkdwnToPlainFallback, splitMrkdwnText } from './markdown-to-mrkdwn.js';
|
|
6
|
+
import { formatOutboundWire, keyboardToBlockKitBlocks } from './protocol.js';
|
|
8
7
|
|
|
9
8
|
export interface SlackOutboundResult {
|
|
10
9
|
ts: string;
|
|
@@ -15,71 +14,27 @@ export interface SlackSendOptions {
|
|
|
15
14
|
threadTs?: string;
|
|
16
15
|
}
|
|
17
16
|
|
|
17
|
+
export interface SlackChatClient {
|
|
18
|
+
chat: {
|
|
19
|
+
postMessage(opts: Record<string, unknown>): Promise<{ ts?: string }>;
|
|
20
|
+
update(opts: Record<string, unknown>): Promise<unknown>;
|
|
21
|
+
};
|
|
22
|
+
filesUploadV2?(opts: Record<string, unknown>): Promise<unknown>;
|
|
23
|
+
}
|
|
24
|
+
|
|
18
25
|
const SLACK_MAX_BLOCKS_PER_MESSAGE = 48;
|
|
19
26
|
|
|
20
27
|
export async function sendSlackContent(
|
|
21
|
-
client:
|
|
22
|
-
content:
|
|
28
|
+
client: SlackChatClient,
|
|
29
|
+
content: unknown,
|
|
23
30
|
opts: SlackSendOptions,
|
|
24
31
|
logger: Logger,
|
|
25
32
|
): Promise<SlackOutboundResult> {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
const attachments: Record<string, unknown>[] = [];
|
|
30
|
-
const pendingFiles: Array<{ buffer?: Buffer; url?: string; path?: string; name?: string }> = [];
|
|
31
|
-
|
|
32
|
-
for (const seg of segments) {
|
|
33
|
-
if (typeof seg === 'string') {
|
|
34
|
-
textContent += seg;
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
const { type, data } = seg as MessageSegment;
|
|
38
|
-
switch (type) {
|
|
39
|
-
case 'text':
|
|
40
|
-
textContent += data.text ?? '';
|
|
41
|
-
break;
|
|
42
|
-
case 'at':
|
|
43
|
-
case 'mention':
|
|
44
|
-
textContent += `<@${data.id ?? data.target}>`;
|
|
45
|
-
break;
|
|
46
|
-
case 'channel_mention':
|
|
47
|
-
textContent += `<#${data.id}>`;
|
|
48
|
-
break;
|
|
49
|
-
case 'link':
|
|
50
|
-
if (data.text && data.text !== data.url) {
|
|
51
|
-
textContent += `<${data.url}|${data.text}>`;
|
|
52
|
-
} else {
|
|
53
|
-
textContent += `<${data.url}>`;
|
|
54
|
-
}
|
|
55
|
-
break;
|
|
56
|
-
case 'image':
|
|
57
|
-
if (data.url) {
|
|
58
|
-
attachments.push({ image_url: data.url, title: data.name ?? data.title ?? '' });
|
|
59
|
-
} else if (data.media) {
|
|
60
|
-
pendingFiles.push(resolveMediaToFile(data.media, data.alt ?? 'image'));
|
|
61
|
-
}
|
|
62
|
-
break;
|
|
63
|
-
case 'audio':
|
|
64
|
-
case 'video':
|
|
65
|
-
case 'file':
|
|
66
|
-
if (data.media) {
|
|
67
|
-
pendingFiles.push(resolveMediaToFile(data.media, data.name ?? type));
|
|
68
|
-
} else if (data.file || data.url) {
|
|
69
|
-
pendingFiles.push({ path: data.file, url: data.url, name: data.name ?? type });
|
|
70
|
-
}
|
|
71
|
-
break;
|
|
72
|
-
case 'keyboard':
|
|
73
|
-
blocks.push(...keyboardToBlockKitBlocks(data));
|
|
74
|
-
break;
|
|
75
|
-
default:
|
|
76
|
-
textContent += data.text ?? `[${type}]`;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const textDelivery = applyTextMrkdwnBlocks(textContent, blocks);
|
|
33
|
+
const wire = formatOutboundWire(content);
|
|
34
|
+
const blocks = [...wire.blocks];
|
|
35
|
+
const textDelivery = applyTextMrkdwnBlocks(wire.text, blocks);
|
|
81
36
|
|
|
82
|
-
for (const pf of
|
|
37
|
+
for (const pf of wire.files) {
|
|
83
38
|
try {
|
|
84
39
|
await uploadFile(client, opts.channel, pf, opts.threadTs, logger);
|
|
85
40
|
} catch (e) {
|
|
@@ -91,39 +46,20 @@ export async function sendSlackContent(
|
|
|
91
46
|
channel: opts.channel,
|
|
92
47
|
threadTs: opts.threadTs,
|
|
93
48
|
blocks,
|
|
94
|
-
attachments,
|
|
49
|
+
attachments: wire.attachments,
|
|
95
50
|
fallbackText: textDelivery.fallbackText,
|
|
96
51
|
});
|
|
97
52
|
}
|
|
98
53
|
|
|
99
54
|
export async function editSlackContent(
|
|
100
|
-
client:
|
|
55
|
+
client: SlackChatClient,
|
|
101
56
|
channel: string,
|
|
102
57
|
ts: string,
|
|
103
|
-
content:
|
|
58
|
+
content: unknown,
|
|
104
59
|
): Promise<void> {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
for (const seg of segments) {
|
|
110
|
-
if (typeof seg === 'string') { textContent += seg; continue; }
|
|
111
|
-
const { type, data } = seg as MessageSegment;
|
|
112
|
-
switch (type) {
|
|
113
|
-
case 'text': textContent += data.text ?? ''; break;
|
|
114
|
-
case 'at': case 'mention': textContent += `<@${data.id ?? data.target}>`; break;
|
|
115
|
-
case 'channel_mention': textContent += `<#${data.id}>`; break;
|
|
116
|
-
case 'link':
|
|
117
|
-
textContent += data.text && data.text !== data.url ? `<${data.url}|${data.text}>` : `<${data.url}>`;
|
|
118
|
-
break;
|
|
119
|
-
case 'keyboard':
|
|
120
|
-
blocks.push(...keyboardToBlockKitBlocks(data));
|
|
121
|
-
break;
|
|
122
|
-
default: textContent += data.text ?? `[${type}]`;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const textDelivery = applyTextMrkdwnBlocks(textContent, blocks);
|
|
60
|
+
const wire = formatOutboundWire(content);
|
|
61
|
+
const blocks = [...wire.blocks];
|
|
62
|
+
const textDelivery = applyTextMrkdwnBlocks(wire.text, blocks);
|
|
127
63
|
const payloadBlocks = blocks.slice(0, SLACK_MAX_BLOCKS_PER_MESSAGE);
|
|
128
64
|
|
|
129
65
|
const updateOpts: Record<string, unknown> = {
|
|
@@ -132,13 +68,7 @@ export async function editSlackContent(
|
|
|
132
68
|
text: textDelivery.fallbackText || ' ',
|
|
133
69
|
};
|
|
134
70
|
if (payloadBlocks.length > 0) updateOpts.blocks = payloadBlocks;
|
|
135
|
-
await client.chat.update(updateOpts
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function normalizeContent(content: SendContent): Array<string | MessageSegment> {
|
|
139
|
-
if (typeof content === 'string') return [content];
|
|
140
|
-
if (!Array.isArray(content)) return [content as MessageSegment];
|
|
141
|
-
return content as Array<string | MessageSegment>;
|
|
71
|
+
await client.chat.update(updateOpts);
|
|
142
72
|
}
|
|
143
73
|
|
|
144
74
|
function applyTextMrkdwnBlocks(
|
|
@@ -163,7 +93,7 @@ function applyTextMrkdwnBlocks(
|
|
|
163
93
|
}
|
|
164
94
|
|
|
165
95
|
async function postSlackMessage(
|
|
166
|
-
client:
|
|
96
|
+
client: SlackChatClient,
|
|
167
97
|
opts: {
|
|
168
98
|
channel: string;
|
|
169
99
|
threadTs?: string;
|
|
@@ -182,8 +112,8 @@ async function postSlackMessage(
|
|
|
182
112
|
text: fallbackText || 'Message',
|
|
183
113
|
...(threadTs ? { thread_ts: threadTs } : {}),
|
|
184
114
|
...(attachments.length > 0 ? { attachments } : {}),
|
|
185
|
-
}
|
|
186
|
-
return { ts:
|
|
115
|
+
});
|
|
116
|
+
return { ts: result.ts ?? '' };
|
|
187
117
|
}
|
|
188
118
|
|
|
189
119
|
for (let offset = 0; offset < blocks.length; offset += SLACK_MAX_BLOCKS_PER_MESSAGE) {
|
|
@@ -194,8 +124,8 @@ async function postSlackMessage(
|
|
|
194
124
|
blocks: chunk,
|
|
195
125
|
...(threadTs ? { thread_ts: threadTs } : {}),
|
|
196
126
|
...(offset === 0 && attachments.length > 0 ? { attachments } : {}),
|
|
197
|
-
}
|
|
198
|
-
const ts =
|
|
127
|
+
});
|
|
128
|
+
const ts = result.ts ?? '';
|
|
199
129
|
if (!firstTs) firstTs = ts;
|
|
200
130
|
if (!threadTs) threadTs = ts;
|
|
201
131
|
}
|
|
@@ -203,48 +133,14 @@ async function postSlackMessage(
|
|
|
203
133
|
return { ts: firstTs };
|
|
204
134
|
}
|
|
205
135
|
|
|
206
|
-
function resolveMediaToFile(
|
|
207
|
-
media: { kind: string; value: string; mime_type?: string },
|
|
208
|
-
name: string,
|
|
209
|
-
): { buffer?: Buffer; url?: string; name: string } {
|
|
210
|
-
if (media.kind === 'base64') {
|
|
211
|
-
return { buffer: Buffer.from(media.value, 'base64'), name };
|
|
212
|
-
}
|
|
213
|
-
if (media.kind === 'url') {
|
|
214
|
-
return { url: media.value, name };
|
|
215
|
-
}
|
|
216
|
-
return { url: media.value, name };
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/** 每行 keyboard → 独立 actions block(Slack 每 block 最多 5 个按钮) */
|
|
220
|
-
export function keyboardToBlockKitBlocks(data: Record<string, unknown>): Record<string, unknown>[] {
|
|
221
|
-
const rows = data.rows as Array<Array<Record<string, unknown>>> | undefined;
|
|
222
|
-
if (!rows?.length) return [];
|
|
223
|
-
|
|
224
|
-
const blocks: Record<string, unknown>[] = [];
|
|
225
|
-
for (const row of rows) {
|
|
226
|
-
const elements = row.slice(0, 5).map((btn, index) => ({
|
|
227
|
-
type: 'button',
|
|
228
|
-
text: { type: 'plain_text', text: String(btn.label ?? btn.text ?? 'button').slice(0, 75) },
|
|
229
|
-
action_id: String(btn.id ?? btn.action_id ?? `btn_${blocks.length}_${index}`),
|
|
230
|
-
...(btn.value != null ? { value: String(btn.value) } : {}),
|
|
231
|
-
...(btn.style === 'primary' ? { style: 'primary' } : {}),
|
|
232
|
-
...(btn.style === 'danger' ? { style: 'danger' } : {}),
|
|
233
|
-
}));
|
|
234
|
-
if (elements.length > 0) {
|
|
235
|
-
blocks.push({ type: 'actions', elements });
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return blocks;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
136
|
async function uploadFile(
|
|
242
|
-
client:
|
|
137
|
+
client: SlackChatClient,
|
|
243
138
|
channel: string,
|
|
244
139
|
file: { buffer?: Buffer; url?: string; path?: string; name?: string },
|
|
245
140
|
threadTs?: string,
|
|
246
141
|
logger?: Logger,
|
|
247
142
|
): Promise<void> {
|
|
143
|
+
if (!client.filesUploadV2) return;
|
|
248
144
|
try {
|
|
249
145
|
let buffer = file.buffer;
|
|
250
146
|
if (!buffer && file.path) {
|
|
@@ -267,3 +163,5 @@ async function uploadFile(
|
|
|
267
163
|
logger?.error('File upload failed:', e);
|
|
268
164
|
}
|
|
269
165
|
}
|
|
166
|
+
|
|
167
|
+
export { keyboardToBlockKitBlocks };
|
package/src/webhook.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack webhook HTTP: signature → parse → admit.
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
|
+
import type { HttpHost, HttpRouteRegistration } from '@zhin.js/host-http';
|
|
6
|
+
import { formatCompact, getLogger } from '@zhin.js/logger';
|
|
7
|
+
import {
|
|
8
|
+
headerValue,
|
|
9
|
+
readTextBody,
|
|
10
|
+
verifySlackSignature,
|
|
11
|
+
type ResolvedSlackConfig,
|
|
12
|
+
type SlackInteractionPayload,
|
|
13
|
+
type SlackSlashCommand,
|
|
14
|
+
type SlackUrlVerification,
|
|
15
|
+
} from './protocol.js';
|
|
16
|
+
|
|
17
|
+
const logger = getLogger('slack');
|
|
18
|
+
|
|
19
|
+
export interface SlackWebhookHandler {
|
|
20
|
+
readonly config: ResolvedSlackConfig;
|
|
21
|
+
handleEnvelope(body: unknown): void;
|
|
22
|
+
admitInteraction(payload: SlackInteractionPayload): void;
|
|
23
|
+
admitSlashCommand(cmd: SlackSlashCommand): void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function registerSlackWebhookRoutes(
|
|
27
|
+
http: HttpHost,
|
|
28
|
+
handler: SlackWebhookHandler,
|
|
29
|
+
): HttpRouteRegistration[] {
|
|
30
|
+
const path = handler.config.webhookPath;
|
|
31
|
+
return [
|
|
32
|
+
http.route('POST', path, async (request, response) => {
|
|
33
|
+
await handleSlackWebhookRequest(request, response, handler);
|
|
34
|
+
}, { summary: 'Slack Events API / Interactivity', tags: ['slack'] }),
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function handleSlackWebhookRequest(
|
|
39
|
+
request: IncomingMessage,
|
|
40
|
+
response: ServerResponse,
|
|
41
|
+
handler: SlackWebhookHandler,
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
try {
|
|
44
|
+
const rawBody = await readTextBody(request);
|
|
45
|
+
const timestamp = headerValue(request.headers, 'x-slack-request-timestamp');
|
|
46
|
+
const signature = headerValue(request.headers, 'x-slack-signature');
|
|
47
|
+
|
|
48
|
+
if (!verifySlackSignature(handler.config.signingSecret, rawBody, timestamp, signature)) {
|
|
49
|
+
response.writeHead(401, { 'Content-Type': 'text/plain' });
|
|
50
|
+
response.end('Invalid signature');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const contentType = headerValue(request.headers, 'content-type');
|
|
55
|
+
if (contentType.includes('application/x-www-form-urlencoded')) {
|
|
56
|
+
const params = new URLSearchParams(rawBody);
|
|
57
|
+
const payloadStr = params.get('payload');
|
|
58
|
+
if (payloadStr) {
|
|
59
|
+
response.writeHead(200);
|
|
60
|
+
response.end('');
|
|
61
|
+
handler.admitInteraction(JSON.parse(payloadStr) as SlackInteractionPayload);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const body = Object.fromEntries(params) as unknown as SlackSlashCommand;
|
|
65
|
+
if (body.command) {
|
|
66
|
+
response.writeHead(200);
|
|
67
|
+
response.end('');
|
|
68
|
+
handler.admitSlashCommand(body);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let envelope: Record<string, unknown>;
|
|
74
|
+
try {
|
|
75
|
+
envelope = JSON.parse(rawBody) as Record<string, unknown>;
|
|
76
|
+
} catch {
|
|
77
|
+
response.writeHead(200);
|
|
78
|
+
response.end('');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (envelope.type === 'url_verification') {
|
|
83
|
+
const challenge = (envelope as unknown as SlackUrlVerification).challenge;
|
|
84
|
+
response.writeHead(200, { 'Content-Type': 'application/json' });
|
|
85
|
+
response.end(JSON.stringify({ challenge }));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (envelope.type === 'event_callback' && envelope.event) {
|
|
90
|
+
response.writeHead(200);
|
|
91
|
+
response.end('');
|
|
92
|
+
handler.handleEnvelope(envelope);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
response.writeHead(200);
|
|
97
|
+
response.end('');
|
|
98
|
+
} catch (error) {
|
|
99
|
+
logger.error('Slack webhook error:', error);
|
|
100
|
+
response.writeHead(200);
|
|
101
|
+
response.end('');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '给 Slack 消息添加表情反应',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
channel: z.string().describe('频道 ID'),
|
|
9
|
-
timestamp: z.string().describe('消息时间戳'),
|
|
10
|
-
emoji: z.string().describe('表情名称(不含冒号)'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
async execute({ endpoint_id, channel, timestamp, emoji }) {
|
|
15
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
16
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
17
|
-
const success = await endpoint.addReaction(channel, timestamp, emoji);
|
|
18
|
-
return { success, message: success ? `已添加反应 :${emoji}:` : '操作失败' };
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=add_reaction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add_reaction.js","sourceRoot":"","sources":["../../../agent/tools/add_reaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAKtB;IACD,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;KACzC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;QACtD,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { platformPermit } from '../../src/platform-permit.js';
|
|
4
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '归档 Slack 频道',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
channel: z.string().describe('频道 ID'),
|
|
10
|
-
}),
|
|
11
|
-
platforms: ['slack'],
|
|
12
|
-
tags: ['slack'],
|
|
13
|
-
permissions: [platformPermit('workspace_admin')],
|
|
14
|
-
async execute({ endpoint_id, channel }) {
|
|
15
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
16
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
17
|
-
const success = await endpoint.archiveChannel(channel);
|
|
18
|
-
return { success, message: success ? '已归档频道' : '操作失败' };
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=archive_channel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive_channel.js","sourceRoot":"","sources":["../../../agent/tools/archive_channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAGtB;IACD,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,WAAW,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE;QACpC,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '编辑 Slack 消息',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
channel: z.string().describe('频道 ID'),
|
|
9
|
-
message_ts: z.string().describe('消息时间戳'),
|
|
10
|
-
text: z.string().describe('新的消息文本'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
async execute({ endpoint_id, channel, message_ts, text }) {
|
|
15
|
-
const { getAdapter } = getSlackAgentDeps();
|
|
16
|
-
await getAdapter().editMessage(endpoint_id, channel, message_ts, [
|
|
17
|
-
{ type: 'text', data: { text } },
|
|
18
|
-
]);
|
|
19
|
-
return { success: true, message: '消息已编辑' };
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=edit_message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edit_message.js","sourceRoot":"","sources":["../../../agent/tools/edit_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAKtB;IACD,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACpC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;QACtD,MAAM,EAAE,UAAU,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC3C,MAAM,UAAU,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE;YAC/D,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE;SACjC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { platformPermit } from '../../src/platform-permit.js';
|
|
4
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '邀请用户加入 Slack 频道',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
channel: z.string().describe('频道 ID'),
|
|
10
|
-
users: z.string().describe('用户 ID 列表(逗号分隔)'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
permissions: [platformPermit('channel_manager')],
|
|
15
|
-
async execute({ endpoint_id, channel, users }) {
|
|
16
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
17
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
18
|
-
const success = await endpoint.inviteToChannel(channel, users.split(','));
|
|
19
|
-
return { success, message: success ? '已邀请用户加入频道' : '操作失败' };
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=invite_to_channel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invite_to_channel.js","sourceRoot":"","sources":["../../../agent/tools/invite_to_channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAItB;IACD,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC7C,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,WAAW,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3C,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { platformPermit } from '../../src/platform-permit.js';
|
|
4
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '置顶 Slack 消息',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
channel: z.string().describe('频道 ID'),
|
|
10
|
-
timestamp: z.string().describe('消息时间戳'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
permissions: [platformPermit('channel_manager')],
|
|
15
|
-
async execute({ endpoint_id, channel, timestamp }) {
|
|
16
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
17
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
18
|
-
const success = await endpoint.pinMessage(channel, timestamp);
|
|
19
|
-
return { success, message: success ? '已置顶消息' : '操作失败' };
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=pin_message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pin_message.js","sourceRoot":"","sources":["../../../agent/tools/pin_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAItB;IACD,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACxC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,WAAW,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE;QAC/C,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '移除 Slack 消息上的表情反应',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
channel_id: z.string().describe('频道 ID'),
|
|
9
|
-
timestamp: z.string().describe('消息时间戳'),
|
|
10
|
-
name: z.string().describe('表情名称(如 thumbsup、heart)'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
async execute({ endpoint_id, channel_id, timestamp, name }) {
|
|
15
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
16
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
17
|
-
const success = await endpoint.removeReaction(channel_id, timestamp, name);
|
|
18
|
-
return { success, message: success ? `已移除反应 :${name}:` : '操作失败' };
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=remove_reaction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remove_reaction.js","sourceRoot":"","sources":["../../../agent/tools/remove_reaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAKtB;IACD,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACpD,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE;QACxD,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { platformPermit } from '../../src/platform-permit.js';
|
|
4
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '设置 Slack 频道的用途/目的',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
channel_id: z.string().describe('频道 ID'),
|
|
10
|
-
purpose: z.string().describe('频道用途描述'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
permissions: [platformPermit('channel_manager')],
|
|
15
|
-
async execute({ endpoint_id, channel_id, purpose }) {
|
|
16
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
17
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
18
|
-
const success = await endpoint.setChannelPurpose(channel_id, purpose);
|
|
19
|
-
return { success, message: success ? '频道用途已更新' : '操作失败' };
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=set_purpose.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"set_purpose.js","sourceRoot":"","sources":["../../../agent/tools/set_purpose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAItB;IACD,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACvC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,WAAW,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE;QAChD,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { platformPermit } from '../../src/platform-permit.js';
|
|
4
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '设置 Slack 频道话题',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
channel: z.string().describe('频道 ID'),
|
|
10
|
-
topic: z.string().describe('新话题'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
permissions: [platformPermit('channel_manager')],
|
|
15
|
-
async execute({ endpoint_id, channel, topic }) {
|
|
16
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
17
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
18
|
-
const success = await endpoint.setChannelTopic(channel, topic);
|
|
19
|
-
return { success, message: success ? '已设置频道话题' : '操作失败' };
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=set_topic.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"set_topic.js","sourceRoot":"","sources":["../../../agent/tools/set_topic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAItB;IACD,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;KAClC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,WAAW,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3C,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { platformPermit } from '../../src/platform-permit.js';
|
|
4
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '恢复已归档的 Slack 频道',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
channel_id: z.string().describe('频道 ID'),
|
|
10
|
-
}),
|
|
11
|
-
platforms: ['slack'],
|
|
12
|
-
tags: ['slack'],
|
|
13
|
-
permissions: [platformPermit('workspace_admin')],
|
|
14
|
-
async execute({ endpoint_id, channel_id }) {
|
|
15
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
16
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
17
|
-
const success = await endpoint.unarchiveChannel(channel_id);
|
|
18
|
-
return { success, message: success ? '频道已恢复' : '操作失败' };
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=unarchive.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unarchive.js","sourceRoot":"","sources":["../../../agent/tools/unarchive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAGtB;IACD,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACzC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,WAAW,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE;QACvC,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { platformPermit } from '../../src/platform-permit.js';
|
|
4
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
5
|
-
export default defineTool({
|
|
6
|
-
description: '取消 Slack 频道中消息的置顶',
|
|
7
|
-
inputSchema: z.object({
|
|
8
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
9
|
-
channel_id: z.string().describe('频道 ID'),
|
|
10
|
-
timestamp: z.string().describe('消息时间戳'),
|
|
11
|
-
}),
|
|
12
|
-
platforms: ['slack'],
|
|
13
|
-
tags: ['slack'],
|
|
14
|
-
permissions: [platformPermit('channel_manager')],
|
|
15
|
-
async execute({ endpoint_id, channel_id, timestamp }) {
|
|
16
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
17
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
18
|
-
const success = await endpoint.unpinMessage(channel_id, timestamp);
|
|
19
|
-
return { success, message: success ? '已取消置顶' : '操作失败' };
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=unpin_message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unpin_message.js","sourceRoot":"","sources":["../../../agent/tools/unpin_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,eAAe,UAAU,CAItB;IACD,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;KACxC,CAAC;IACF,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,WAAW,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE;QAClD,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
|
|
4
|
-
export default defineTool({
|
|
5
|
-
description: '查询 Slack 用户详细信息',
|
|
6
|
-
inputSchema: z.object({
|
|
7
|
-
endpoint_id: z.string().describe('Endpoint 名称'),
|
|
8
|
-
user_id: z.string().describe('用户 ID'),
|
|
9
|
-
}),
|
|
10
|
-
platforms: ['slack'],
|
|
11
|
-
tags: ['slack'],
|
|
12
|
-
async execute({ endpoint_id, user_id }) {
|
|
13
|
-
const { getEndpoint } = getSlackAgentDeps();
|
|
14
|
-
const endpoint = getEndpoint(endpoint_id);
|
|
15
|
-
const user = await endpoint.getUserInfo(user_id);
|
|
16
|
-
return {
|
|
17
|
-
id: user.id,
|
|
18
|
-
name: user.name,
|
|
19
|
-
real_name: user.real_name,
|
|
20
|
-
display_name: user.profile?.display_name,
|
|
21
|
-
email: user.profile?.email,
|
|
22
|
-
is_admin: user.is_admin,
|
|
23
|
-
is_bot: user.is_bot,
|
|
24
|
-
status_text: user.profile?.status_text,
|
|
25
|
-
};
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
//# sourceMappingURL=user_info.js.map
|