@sena-ai/connector-slack 1.4.1 → 1.4.3
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/dist/__tests__/triggers.test.d.ts +2 -0
- package/dist/__tests__/triggers.test.d.ts.map +1 -0
- package/dist/__tests__/triggers.test.js +205 -0
- package/dist/__tests__/triggers.test.js.map +1 -0
- package/dist/connector.d.ts +95 -1
- package/dist/connector.d.ts.map +1 -1
- package/dist/connector.js +585 -233
- package/dist/connector.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/triggers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { mkdtemp, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { WebClient } from '@slack/web-api';
|
|
6
|
+
import { normalizeTriggerConfig, processSlackEvent, resolvePromptSource } from '../connector.js';
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === 'object' && value !== null;
|
|
9
|
+
}
|
|
10
|
+
function createSlackMock(options) {
|
|
11
|
+
const usersInfo = vi.fn(async ({ user }) => ({
|
|
12
|
+
ok: true,
|
|
13
|
+
user: {
|
|
14
|
+
profile: {
|
|
15
|
+
display_name: `${user}-name`,
|
|
16
|
+
real_name: `${user}-real`,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
const history = vi.fn(async () => ({
|
|
21
|
+
ok: true,
|
|
22
|
+
messages: options?.historyMessage ? [options.historyMessage] : [],
|
|
23
|
+
}));
|
|
24
|
+
const replies = vi.fn(async () => ({ ok: true, messages: [] }));
|
|
25
|
+
const addReaction = vi.fn(async () => ({ ok: true }));
|
|
26
|
+
const slack = {
|
|
27
|
+
users: { info: usersInfo },
|
|
28
|
+
conversations: { history, replies },
|
|
29
|
+
reactions: { add: addReaction },
|
|
30
|
+
auth: {
|
|
31
|
+
test: vi.fn(async () => ({ ok: true, user_id: 'UBOT' })),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
return { slack, usersInfo, history, replies, addReaction };
|
|
35
|
+
}
|
|
36
|
+
function createEngineMock() {
|
|
37
|
+
const submitTurn = vi.fn(async () => { });
|
|
38
|
+
const abortConversation = vi.fn(() => true);
|
|
39
|
+
return {
|
|
40
|
+
submitTurn,
|
|
41
|
+
abortConversation,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function firstSubmittedEvent(engine) {
|
|
45
|
+
expect(engine.submitTurn).toHaveBeenCalledOnce();
|
|
46
|
+
const inbound = engine.submitTurn.mock.calls[0]?.[0];
|
|
47
|
+
expect(inbound).toBeDefined();
|
|
48
|
+
return inbound;
|
|
49
|
+
}
|
|
50
|
+
describe('slack trigger config', () => {
|
|
51
|
+
it('uses legacy defaults only when triggers are omitted', () => {
|
|
52
|
+
const legacy = normalizeTriggerConfig(undefined);
|
|
53
|
+
const explicit = normalizeTriggerConfig({ mention: '' });
|
|
54
|
+
expect(legacy.mention).toBe('');
|
|
55
|
+
expect(legacy.thread).toBe('');
|
|
56
|
+
expect(legacy.reactions.x).toEqual({ action: 'abort' });
|
|
57
|
+
expect(explicit.mention).toBe('');
|
|
58
|
+
expect(explicit.thread).toBeUndefined();
|
|
59
|
+
expect(explicit.reactions).toEqual({});
|
|
60
|
+
});
|
|
61
|
+
it('resolves prompt files from the provided base directory', async () => {
|
|
62
|
+
const dir = await mkdtemp(join(tmpdir(), 'sena-slack-trigger-'));
|
|
63
|
+
const promptPath = join(dir, 'mention.md');
|
|
64
|
+
await writeFile(promptPath, '멘션 프롬프트');
|
|
65
|
+
const resolved = await resolvePromptSource({ file: './mention.md' }, dir);
|
|
66
|
+
expect(resolved).toBe('멘션 프롬프트');
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('processSlackEvent', () => {
|
|
70
|
+
it('falls through to the next message trigger when a higher-priority filter returns false', async () => {
|
|
71
|
+
const { slack } = createSlackMock();
|
|
72
|
+
const engine = createEngineMock();
|
|
73
|
+
const userNameCache = new Map();
|
|
74
|
+
const activeThreads = new Set();
|
|
75
|
+
const processedEvents = new Set();
|
|
76
|
+
const processingEvents = new Set();
|
|
77
|
+
const mentionFilter = vi.fn(() => false);
|
|
78
|
+
const triggerConfig = normalizeTriggerConfig({
|
|
79
|
+
mention: { text: 'mention prompt', filter: mentionFilter },
|
|
80
|
+
channel: { text: 'channel prompt' },
|
|
81
|
+
});
|
|
82
|
+
await processSlackEvent({
|
|
83
|
+
event: {
|
|
84
|
+
type: 'message',
|
|
85
|
+
channel: 'C1',
|
|
86
|
+
ts: '100.1',
|
|
87
|
+
user: 'U1',
|
|
88
|
+
text: '<@UBOT> hello',
|
|
89
|
+
},
|
|
90
|
+
}, engine, slack, 'xoxb-token', userNameCache, activeThreads, processedEvents, processingEvents, triggerConfig, '/tmp', 'UBOT');
|
|
91
|
+
expect(mentionFilter).toHaveBeenCalledOnce();
|
|
92
|
+
const inbound = firstSubmittedEvent(engine);
|
|
93
|
+
expect(isRecord(inbound.raw) ? inbound.raw.triggerKind : undefined).toBe('channel');
|
|
94
|
+
expect(inbound.text).toContain('channel prompt');
|
|
95
|
+
expect(inbound.userName).toBe('U1-name');
|
|
96
|
+
});
|
|
97
|
+
it('hydrates reaction filter events with actor and target message fields', async () => {
|
|
98
|
+
const filter = vi.fn(() => true);
|
|
99
|
+
const { slack } = createSlackMock({
|
|
100
|
+
historyMessage: {
|
|
101
|
+
ts: '200.2',
|
|
102
|
+
text: '대상 메시지',
|
|
103
|
+
user: 'U_TARGET',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
const engine = createEngineMock();
|
|
107
|
+
await processSlackEvent({
|
|
108
|
+
event: {
|
|
109
|
+
type: 'reaction_added',
|
|
110
|
+
reaction: 'eyes',
|
|
111
|
+
user: 'U_ACTOR',
|
|
112
|
+
event_ts: '300.3',
|
|
113
|
+
item: {
|
|
114
|
+
type: 'message',
|
|
115
|
+
channel: 'C1',
|
|
116
|
+
ts: '200.2',
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
}, engine, slack, 'xoxb-token', new Map(), new Set(), new Set(), new Set(), normalizeTriggerConfig({
|
|
120
|
+
reactions: {
|
|
121
|
+
eyes: { text: 'reaction prompt', filter },
|
|
122
|
+
},
|
|
123
|
+
}), '/tmp', 'UBOT');
|
|
124
|
+
expect(filter).toHaveBeenCalledWith(expect.objectContaining({
|
|
125
|
+
kind: 'reaction',
|
|
126
|
+
userId: 'U_ACTOR',
|
|
127
|
+
userName: 'U_ACTOR-name',
|
|
128
|
+
messageUserId: 'U_TARGET',
|
|
129
|
+
messageUserName: 'U_TARGET-name',
|
|
130
|
+
threadTs: '200.2',
|
|
131
|
+
text: '대상 메시지',
|
|
132
|
+
}));
|
|
133
|
+
const inbound = firstSubmittedEvent(engine);
|
|
134
|
+
expect(inbound.conversationId).toBe('C1:200.2');
|
|
135
|
+
expect(inbound.text).toContain('reaction prompt');
|
|
136
|
+
expect(inbound.text).toContain('messageUserId: U_TARGET');
|
|
137
|
+
});
|
|
138
|
+
it('exposes bot-authored reacted messages via messageBotId', async () => {
|
|
139
|
+
const filter = vi.fn(() => true);
|
|
140
|
+
const { slack } = createSlackMock({
|
|
141
|
+
historyMessage: {
|
|
142
|
+
ts: '210.2',
|
|
143
|
+
text: '봇이 쓴 메시지',
|
|
144
|
+
bot_id: 'B_BREN',
|
|
145
|
+
username: '브렌',
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
const engine = createEngineMock();
|
|
149
|
+
await processSlackEvent({
|
|
150
|
+
event: {
|
|
151
|
+
type: 'reaction_added',
|
|
152
|
+
reaction: 'eyes',
|
|
153
|
+
user: 'U_ACTOR',
|
|
154
|
+
event_ts: '301.3',
|
|
155
|
+
item: {
|
|
156
|
+
type: 'message',
|
|
157
|
+
channel: 'C1',
|
|
158
|
+
ts: '210.2',
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
}, engine, slack, 'xoxb-token', new Map(), new Set(), new Set(), new Set(), normalizeTriggerConfig({
|
|
162
|
+
reactions: {
|
|
163
|
+
eyes: { text: 'reaction prompt', filter },
|
|
164
|
+
},
|
|
165
|
+
}), '/tmp', 'UBOT');
|
|
166
|
+
expect(filter).toHaveBeenCalledWith(expect.objectContaining({
|
|
167
|
+
userId: 'U_ACTOR',
|
|
168
|
+
messageUserId: undefined,
|
|
169
|
+
messageBotId: 'B_BREN',
|
|
170
|
+
threadTs: '210.2',
|
|
171
|
+
}));
|
|
172
|
+
});
|
|
173
|
+
it('aborts the conversation selected by the reacted message thread ts', async () => {
|
|
174
|
+
const { slack, addReaction } = createSlackMock({
|
|
175
|
+
historyMessage: {
|
|
176
|
+
ts: '220.2',
|
|
177
|
+
thread_ts: '220.0',
|
|
178
|
+
text: '스레드 메시지',
|
|
179
|
+
user: 'U_TARGET',
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
const engine = createEngineMock();
|
|
183
|
+
await processSlackEvent({
|
|
184
|
+
event: {
|
|
185
|
+
type: 'reaction_added',
|
|
186
|
+
reaction: 'x',
|
|
187
|
+
user: 'U_ACTOR',
|
|
188
|
+
event_ts: '302.3',
|
|
189
|
+
item: {
|
|
190
|
+
type: 'message',
|
|
191
|
+
channel: 'C1',
|
|
192
|
+
ts: '220.2',
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
}, engine, slack, 'xoxb-token', new Map(), new Set(), new Set(), new Set(), normalizeTriggerConfig({
|
|
196
|
+
reactions: {
|
|
197
|
+
x: { action: 'abort' },
|
|
198
|
+
},
|
|
199
|
+
}), '/tmp', 'UBOT');
|
|
200
|
+
expect(engine.abortConversation).toHaveBeenCalledWith('C1:220.0');
|
|
201
|
+
expect(addReaction).toHaveBeenCalledWith({ channel: 'C1', name: 'x', timestamp: '220.2' });
|
|
202
|
+
expect(engine.submitTurn).not.toHaveBeenCalled();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=triggers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.test.js","sourceRoot":"","sources":["../../src/__tests__/triggers.test.ts"],"names":[],"mappings":"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"}
|
package/dist/connector.d.ts
CHANGED
|
@@ -1,10 +1,71 @@
|
|
|
1
|
-
import type { Connector, ConnectorOutput, ConnectorOutputContext } from '@sena-ai/core';
|
|
1
|
+
import type { Connector, ConnectorOutput, ConnectorOutputContext, TurnEngine } from '@sena-ai/core';
|
|
2
2
|
import { WebClient } from '@slack/web-api';
|
|
3
|
+
export type SlackMessageTriggerEvent = {
|
|
4
|
+
kind: 'mention' | 'thread' | 'channel';
|
|
5
|
+
channelId: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
userName?: string;
|
|
8
|
+
text: string;
|
|
9
|
+
ts: string;
|
|
10
|
+
threadTs?: string;
|
|
11
|
+
files?: Array<{
|
|
12
|
+
id?: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
mimeType?: string;
|
|
15
|
+
}>;
|
|
16
|
+
raw: unknown;
|
|
17
|
+
};
|
|
18
|
+
export type SlackReactionTriggerEvent = {
|
|
19
|
+
kind: 'reaction';
|
|
20
|
+
channelId: string;
|
|
21
|
+
userId: string;
|
|
22
|
+
userName?: string;
|
|
23
|
+
messageUserId?: string;
|
|
24
|
+
messageUserName?: string;
|
|
25
|
+
messageBotId?: string;
|
|
26
|
+
text: string;
|
|
27
|
+
ts: string;
|
|
28
|
+
threadTs: string;
|
|
29
|
+
reaction: string;
|
|
30
|
+
files?: Array<{
|
|
31
|
+
id?: string;
|
|
32
|
+
name?: string;
|
|
33
|
+
mimeType?: string;
|
|
34
|
+
}>;
|
|
35
|
+
raw: unknown;
|
|
36
|
+
};
|
|
37
|
+
export type SlackMessageTriggerFilter = (event: SlackMessageTriggerEvent) => boolean | void | Promise<boolean | void>;
|
|
38
|
+
export type SlackReactionTriggerFilter = (event: SlackReactionTriggerEvent) => boolean | void | Promise<boolean | void>;
|
|
39
|
+
export type SlackMessagePromptTrigger = string | {
|
|
40
|
+
text: string;
|
|
41
|
+
filter?: SlackMessageTriggerFilter;
|
|
42
|
+
} | {
|
|
43
|
+
file: string;
|
|
44
|
+
filter?: SlackMessageTriggerFilter;
|
|
45
|
+
};
|
|
46
|
+
export type SlackReactionPromptTrigger = string | {
|
|
47
|
+
text: string;
|
|
48
|
+
filter?: SlackReactionTriggerFilter;
|
|
49
|
+
} | {
|
|
50
|
+
file: string;
|
|
51
|
+
filter?: SlackReactionTriggerFilter;
|
|
52
|
+
};
|
|
53
|
+
export type SlackReactionRule = SlackReactionPromptTrigger | {
|
|
54
|
+
action: 'abort';
|
|
55
|
+
filter?: SlackReactionTriggerFilter;
|
|
56
|
+
};
|
|
57
|
+
export type SlackTriggerConfig = {
|
|
58
|
+
mention?: SlackMessagePromptTrigger;
|
|
59
|
+
thread?: SlackMessagePromptTrigger;
|
|
60
|
+
channel?: SlackMessagePromptTrigger;
|
|
61
|
+
reactions?: Record<string, SlackReactionRule>;
|
|
62
|
+
};
|
|
3
63
|
export type SlackConnectorOptions = {
|
|
4
64
|
appId: string;
|
|
5
65
|
botToken: string;
|
|
6
66
|
/** Message shown immediately when a turn starts (e.g. ":loading-dots: *세나가 생각중이에요*"). Set to false to disable. */
|
|
7
67
|
thinkingMessage?: string | false;
|
|
68
|
+
triggers?: SlackTriggerConfig;
|
|
8
69
|
} & ({
|
|
9
70
|
/** HTTP Events API mode (default). Requires a public endpoint + signingSecret. */
|
|
10
71
|
mode?: 'http';
|
|
@@ -25,6 +86,38 @@ export type SlackChatApi = {
|
|
|
25
86
|
export type SlackClientLike = {
|
|
26
87
|
chat: SlackChatApi;
|
|
27
88
|
};
|
|
89
|
+
type NormalizedSlackTriggerConfig = {
|
|
90
|
+
mention?: SlackMessagePromptTrigger;
|
|
91
|
+
thread?: SlackMessagePromptTrigger;
|
|
92
|
+
channel?: SlackMessagePromptTrigger;
|
|
93
|
+
reactions: Record<string, SlackReactionRule>;
|
|
94
|
+
};
|
|
95
|
+
type ParsedSlackFile = {
|
|
96
|
+
id: string;
|
|
97
|
+
name: string;
|
|
98
|
+
mimetype: string;
|
|
99
|
+
url_private?: string;
|
|
100
|
+
};
|
|
101
|
+
type ParsedSlackMessageEvent = {
|
|
102
|
+
type: 'app_mention' | 'message';
|
|
103
|
+
channel: string;
|
|
104
|
+
ts: string;
|
|
105
|
+
userId: string;
|
|
106
|
+
text: string;
|
|
107
|
+
threadTs?: string;
|
|
108
|
+
files: ParsedSlackFile[];
|
|
109
|
+
subtype?: string;
|
|
110
|
+
botId?: string;
|
|
111
|
+
};
|
|
112
|
+
type MessageTriggerKind = 'mention' | 'thread' | 'channel';
|
|
113
|
+
type MessageCandidate = {
|
|
114
|
+
kind: MessageTriggerKind;
|
|
115
|
+
source: SlackMessagePromptTrigger;
|
|
116
|
+
};
|
|
117
|
+
export declare function normalizeTriggerConfig(triggers?: SlackTriggerConfig): NormalizedSlackTriggerConfig;
|
|
118
|
+
export declare function resolvePromptSource(source: SlackMessagePromptTrigger | SlackReactionPromptTrigger, baseDir: string): Promise<string>;
|
|
119
|
+
export declare function selectMessageCandidates(event: ParsedSlackMessageEvent, triggerConfig: NormalizedSlackTriggerConfig, activeThreads: Set<string>, botUserId: string | undefined): MessageCandidate[];
|
|
120
|
+
export declare function processSlackEvent(body: Record<string, unknown>, engine: TurnEngine, slack: WebClient, botToken: string, userNameCache: Map<string, string>, activeThreads: Set<string>, processedEvents: Set<string>, processingEvents: Set<string>, triggerConfig: NormalizedSlackTriggerConfig, promptBaseDir: string, botUserId?: string): Promise<void>;
|
|
28
121
|
export declare function slackConnector(options: SlackConnectorOptions): Connector;
|
|
29
122
|
/**
|
|
30
123
|
* Slack Output with step accumulation.
|
|
@@ -39,4 +132,5 @@ export declare function slackConnector(options: SlackConnectorOptions): Connecto
|
|
|
39
132
|
* (= new step). The previous text is flushed to the completed-steps buffer.
|
|
40
133
|
*/
|
|
41
134
|
export declare function createSlackOutput(slack: SlackClientLike, context: ConnectorOutputContext, thinkingMessage?: string | false): ConnectorOutput;
|
|
135
|
+
export {};
|
|
42
136
|
//# sourceMappingURL=connector.d.ts.map
|
package/dist/connector.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"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"}
|