managed-deepagents 0.4.0-dev.68 → 0.4.0-dev.69
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/README.md +1 -1
- package/dist/channels/assistant-text.d.ts +7 -0
- package/dist/channels/assistant-text.d.ts.map +1 -0
- package/dist/channels/assistant-text.js +28 -0
- package/dist/channels/assistant-text.js.map +1 -0
- package/dist/channels/binding.d.ts +34 -0
- package/dist/channels/binding.d.ts.map +1 -0
- package/dist/channels/binding.js +67 -0
- package/dist/channels/binding.js.map +1 -0
- package/dist/channels/errors.d.ts +11 -0
- package/dist/channels/errors.d.ts.map +1 -0
- package/dist/channels/errors.js +25 -0
- package/dist/channels/errors.js.map +1 -0
- package/dist/channels/index.d.ts +19 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +14 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/runtime.d.ts +40 -0
- package/dist/channels/runtime.d.ts.map +1 -0
- package/dist/channels/runtime.js +76 -0
- package/dist/channels/runtime.js.map +1 -0
- package/dist/channels/schedule-delivery.d.ts +67 -0
- package/dist/channels/schedule-delivery.d.ts.map +1 -0
- package/dist/channels/schedule-delivery.js +193 -0
- package/dist/channels/schedule-delivery.js.map +1 -0
- package/dist/channels/slack/define.d.ts +87 -0
- package/dist/channels/slack/define.d.ts.map +1 -0
- package/dist/channels/slack/define.js +141 -0
- package/dist/channels/slack/define.js.map +1 -0
- package/dist/channels/slack/http.d.ts +86 -0
- package/dist/channels/slack/http.d.ts.map +1 -0
- package/dist/channels/slack/http.js +441 -0
- package/dist/channels/slack/http.js.map +1 -0
- package/dist/channels/slack/index.d.ts +18 -0
- package/dist/channels/slack/index.d.ts.map +1 -0
- package/dist/channels/slack/index.js +13 -0
- package/dist/channels/slack/index.js.map +1 -0
- package/dist/channels/slack/normalize.d.ts +62 -0
- package/dist/channels/slack/normalize.d.ts.map +1 -0
- package/dist/channels/slack/normalize.js +320 -0
- package/dist/channels/slack/normalize.js.map +1 -0
- package/dist/channels/slack/source-thread.d.ts +34 -0
- package/dist/channels/slack/source-thread.d.ts.map +1 -0
- package/dist/channels/slack/source-thread.js +92 -0
- package/dist/channels/slack/source-thread.js.map +1 -0
- package/dist/channels/slack/transport.d.ts +48 -0
- package/dist/channels/slack/transport.d.ts.map +1 -0
- package/dist/channels/slack/transport.js +178 -0
- package/dist/channels/slack/transport.js.map +1 -0
- package/dist/channels/store.d.ts +51 -0
- package/dist/channels/store.d.ts.map +1 -0
- package/dist/channels/store.js +76 -0
- package/dist/channels/store.js.map +1 -0
- package/dist/channels/types.d.ts +116 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +24 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/identity/links.d.ts +62 -0
- package/dist/identity/links.d.ts.map +1 -0
- package/dist/identity/links.js +176 -0
- package/dist/identity/links.js.map +1 -0
- package/dist/identity/slack-connect-http.d.ts +21 -0
- package/dist/identity/slack-connect-http.d.ts.map +1 -0
- package/dist/identity/slack-connect-http.js +129 -0
- package/dist/identity/slack-connect-http.js.map +1 -0
- package/dist/identity/slack-oauth.d.ts +60 -0
- package/dist/identity/slack-oauth.d.ts.map +1 -0
- package/dist/identity/slack-oauth.js +193 -0
- package/dist/identity/slack-oauth.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/auth.d.ts +40 -0
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +123 -9
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/cors.d.ts +28 -0
- package/dist/runtime/cors.d.ts.map +1 -0
- package/dist/runtime/cors.js +92 -0
- package/dist/runtime/cors.js.map +1 -0
- package/dist/runtime/identity-http.d.ts +6 -0
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +90 -2
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +41 -1
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +142 -2
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts +2 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +75 -191
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/langsmith-connector.d.ts.map +1 -1
- package/dist/runtime/langsmith-connector.js +4 -3
- package/dist/runtime/langsmith-connector.js.map +1 -1
- package/dist/runtime/managed-tools.d.ts +6 -0
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +10 -0
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/memory/context-io.d.ts +5 -0
- package/dist/runtime/memory/context-io.d.ts.map +1 -0
- package/dist/runtime/memory/context-io.js +28 -0
- package/dist/runtime/memory/context-io.js.map +1 -0
- package/dist/runtime/memory/index.d.ts +8 -0
- package/dist/runtime/memory/index.d.ts.map +1 -0
- package/dist/runtime/memory/index.js +6 -0
- package/dist/runtime/memory/index.js.map +1 -0
- package/dist/runtime/memory/mounts.d.ts +38 -0
- package/dist/runtime/memory/mounts.d.ts.map +1 -0
- package/dist/runtime/memory/mounts.js +185 -0
- package/dist/runtime/memory/mounts.js.map +1 -0
- package/dist/runtime/memory/paths.d.ts +10 -0
- package/dist/runtime/memory/paths.d.ts.map +1 -0
- package/dist/runtime/memory/paths.js +50 -0
- package/dist/runtime/memory/paths.js.map +1 -0
- package/dist/runtime/memory/seed.d.ts +30 -0
- package/dist/runtime/memory/seed.d.ts.map +1 -0
- package/dist/runtime/memory/seed.js +185 -0
- package/dist/runtime/memory/seed.js.map +1 -0
- package/dist/runtime/memory/user-repo.d.ts +19 -0
- package/dist/runtime/memory/user-repo.d.ts.map +1 -0
- package/dist/runtime/memory/user-repo.js +57 -0
- package/dist/runtime/memory/user-repo.js.map +1 -0
- package/dist/runtime/types.d.ts +11 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/schedules.d.ts +6 -3
- package/dist/schedules.d.ts.map +1 -1
- package/dist/schedules.js +22 -0
- package/dist/schedules.js.map +1 -1
- package/dist/types.d.ts +4 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +16 -7
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Events API verification and Phase 1 event normalization.
|
|
3
|
+
*
|
|
4
|
+
* These helpers are pure library primitives for the managed channel service.
|
|
5
|
+
* They do not perform HTTP I/O or durable enqueue.
|
|
6
|
+
*/
|
|
7
|
+
import { ChannelError } from "../errors.js";
|
|
8
|
+
import { encodeSlackSourceThreadKey, slackGroupingId, } from "./source-thread.js";
|
|
9
|
+
const REPLAY_WINDOW_SECONDS = 60 * 5;
|
|
10
|
+
/**
|
|
11
|
+
* Verify a Slack request signature over the exact raw body bytes.
|
|
12
|
+
*
|
|
13
|
+
* Computes HMAC-SHA256 of `v0:{timestamp}:{raw_body}` and compares safely.
|
|
14
|
+
* Rejects timestamps older than five minutes.
|
|
15
|
+
*/
|
|
16
|
+
export async function verifySlackRequest(rawBody, headers, signingSecret, nowSeconds = Math.floor(Date.now() / 1000)) {
|
|
17
|
+
const timestamp = Number(headers.timestamp);
|
|
18
|
+
if (!Number.isFinite(timestamp)) {
|
|
19
|
+
throw new ChannelError("channel_invalid_signature", "missing or invalid Slack request timestamp");
|
|
20
|
+
}
|
|
21
|
+
if (Math.abs(nowSeconds - timestamp) > REPLAY_WINDOW_SECONDS) {
|
|
22
|
+
throw new ChannelError("channel_replay_rejected", "Slack request timestamp outside replay window");
|
|
23
|
+
}
|
|
24
|
+
if (!headers.signature || !headers.signature.startsWith("v0=")) {
|
|
25
|
+
throw new ChannelError("channel_invalid_signature", "missing or invalid Slack signature header");
|
|
26
|
+
}
|
|
27
|
+
const body = typeof rawBody === "string" ? rawBody : new TextDecoder().decode(rawBody);
|
|
28
|
+
const base = `v0:${headers.timestamp}:${body}`;
|
|
29
|
+
const expected = `v0=${await hmacSha256Hex(signingSecret, base)}`;
|
|
30
|
+
if (!constantTimeEquals(expected, headers.signature)) {
|
|
31
|
+
throw new ChannelError("channel_invalid_signature", "Slack signature verification failed");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Normalize a verified Slack Events API payload into a channel-neutral event.
|
|
36
|
+
*
|
|
37
|
+
* Filters bot/system/unsupported shapes and applies declarative trigger/filters.
|
|
38
|
+
*/
|
|
39
|
+
export function normalizeSlackEvent(input) {
|
|
40
|
+
const body = asRecord(input.body);
|
|
41
|
+
if (!body) {
|
|
42
|
+
return { status: "filtered", reason: "unsupported_payload" };
|
|
43
|
+
}
|
|
44
|
+
if (body.type === "url_verification") {
|
|
45
|
+
const challenge = body.challenge;
|
|
46
|
+
if (typeof challenge !== "string") {
|
|
47
|
+
return { status: "filtered", reason: "invalid_url_verification" };
|
|
48
|
+
}
|
|
49
|
+
return { status: "url_verification", challenge };
|
|
50
|
+
}
|
|
51
|
+
if (body.type !== "event_callback") {
|
|
52
|
+
return {
|
|
53
|
+
status: "filtered",
|
|
54
|
+
reason: "unsupported_envelope",
|
|
55
|
+
eventId: stringField(body, "event_id"),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const eventId = stringField(body, "event_id");
|
|
59
|
+
const apiAppId = stringField(body, "api_app_id");
|
|
60
|
+
if (apiAppId && apiAppId !== input.installation.apiAppId) {
|
|
61
|
+
return { status: "filtered", reason: "app_mismatch", eventId };
|
|
62
|
+
}
|
|
63
|
+
if (body.is_ext_shared_channel === true) {
|
|
64
|
+
if (!input.config.filters.allowSharedConversations) {
|
|
65
|
+
return {
|
|
66
|
+
status: "filtered",
|
|
67
|
+
reason: "shared_conversation_denied",
|
|
68
|
+
eventId,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const event = asRecord(body.event);
|
|
73
|
+
if (!event) {
|
|
74
|
+
return { status: "filtered", reason: "missing_event", eventId };
|
|
75
|
+
}
|
|
76
|
+
// Always filter bot/app messages in Phase 1.
|
|
77
|
+
if (event.bot_id || event.subtype === "bot_message") {
|
|
78
|
+
return { status: "filtered", reason: "bot_message", eventId };
|
|
79
|
+
}
|
|
80
|
+
if (input.installation.botUserId &&
|
|
81
|
+
stringField(event, "user") === input.installation.botUserId) {
|
|
82
|
+
return { status: "filtered", reason: "own_bot_message", eventId };
|
|
83
|
+
}
|
|
84
|
+
if (typeof event.subtype === "string" &&
|
|
85
|
+
event.subtype !== "" &&
|
|
86
|
+
event.subtype !== "file_share") {
|
|
87
|
+
return { status: "filtered", reason: `subtype_${event.subtype}`, eventId };
|
|
88
|
+
}
|
|
89
|
+
const trigger = resolveTrigger(event, input.isDirectMessageSurface === true);
|
|
90
|
+
if (!trigger || !input.config.on.includes(trigger)) {
|
|
91
|
+
return {
|
|
92
|
+
status: "filtered",
|
|
93
|
+
reason: trigger ? "trigger_disabled" : "unsupported_trigger",
|
|
94
|
+
eventId,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const conversationId = stringField(event, "channel");
|
|
98
|
+
const userId = stringField(event, "user");
|
|
99
|
+
const messageTs = stringField(event, "ts");
|
|
100
|
+
if (!conversationId || !userId || !messageTs) {
|
|
101
|
+
return { status: "filtered", reason: "missing_identity_fields", eventId };
|
|
102
|
+
}
|
|
103
|
+
if (!conversationAllowed(conversationId, input.config)) {
|
|
104
|
+
return { status: "filtered", reason: "conversation_filtered", eventId };
|
|
105
|
+
}
|
|
106
|
+
const eventTeamId = stringField(event, "team") ?? stringField(body, "team_id");
|
|
107
|
+
if (eventTeamId &&
|
|
108
|
+
eventTeamId !== input.installation.contextTeamId &&
|
|
109
|
+
eventTeamId !== input.installation.id) {
|
|
110
|
+
return { status: "filtered", reason: "workspace_mismatch", eventId };
|
|
111
|
+
}
|
|
112
|
+
const actorTeamId = resolveActorTeamId(body, event, input.installation);
|
|
113
|
+
if (!actorTeamId) {
|
|
114
|
+
return { status: "filtered", reason: "ambiguous_actor_namespace", eventId };
|
|
115
|
+
}
|
|
116
|
+
const actorId = `slack:${actorTeamId}:${userId}`;
|
|
117
|
+
if (!actorAllowed(actorId, input.config)) {
|
|
118
|
+
return { status: "filtered", reason: "actor_filtered", eventId };
|
|
119
|
+
}
|
|
120
|
+
const threadTs = stringField(event, "thread_ts");
|
|
121
|
+
const usesAppMentionGrouping = trigger === "app_mention" || trigger === "thread_reply";
|
|
122
|
+
const addressThreadId = usesAppMentionGrouping
|
|
123
|
+
? (threadTs ?? messageTs)
|
|
124
|
+
: threadTs;
|
|
125
|
+
let text = typeof event.text === "string" ? event.text : "";
|
|
126
|
+
text = decodeSlackEscaping(text);
|
|
127
|
+
// When Slack dual-delivers message + app_mention for an @mention, drop the
|
|
128
|
+
// message path so app_mention owns the run.
|
|
129
|
+
if (trigger === "thread_reply" &&
|
|
130
|
+
input.config.on.includes("app_mention") &&
|
|
131
|
+
input.installation.botUserId &&
|
|
132
|
+
textMentionsBot(text, input.installation.botUserId)) {
|
|
133
|
+
return { status: "filtered", reason: "covered_by_app_mention", eventId };
|
|
134
|
+
}
|
|
135
|
+
if (trigger === "app_mention") {
|
|
136
|
+
text = applyMentionBehavior(text, input.config.mentionBehavior);
|
|
137
|
+
}
|
|
138
|
+
const groupingMode = usesAppMentionGrouping
|
|
139
|
+
? input.config.conversation.appMention
|
|
140
|
+
: input.config.conversation.directMessage;
|
|
141
|
+
const groupingId = slackGroupingId(groupingMode, messageTs, threadTs);
|
|
142
|
+
const sourceThreadKey = encodeSlackSourceThreadKey({
|
|
143
|
+
installationKind: input.installation.kind,
|
|
144
|
+
installationId: input.installation.id,
|
|
145
|
+
contextTeamId: input.installation.contextTeamId,
|
|
146
|
+
conversationId,
|
|
147
|
+
mode: groupingMode,
|
|
148
|
+
groupingId,
|
|
149
|
+
});
|
|
150
|
+
const attachments = [];
|
|
151
|
+
const files = event.files;
|
|
152
|
+
if (Array.isArray(files)) {
|
|
153
|
+
for (const [index, file] of files.entries()) {
|
|
154
|
+
const record = asRecord(file);
|
|
155
|
+
if (!record)
|
|
156
|
+
continue;
|
|
157
|
+
attachments.push({
|
|
158
|
+
id: `slack-file:${stringField(record, "id") ?? index}`,
|
|
159
|
+
kind: inferAttachmentKind(stringField(record, "mimetype")),
|
|
160
|
+
name: stringField(record, "name") ?? undefined,
|
|
161
|
+
contentType: stringField(record, "mimetype") ?? undefined,
|
|
162
|
+
size: typeof record.size === "number" && Number.isFinite(record.size)
|
|
163
|
+
? record.size
|
|
164
|
+
: undefined,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const message = {
|
|
169
|
+
id: messageTs,
|
|
170
|
+
text,
|
|
171
|
+
attachments,
|
|
172
|
+
};
|
|
173
|
+
const channelEvent = {
|
|
174
|
+
deliveryId: input.deliveryId,
|
|
175
|
+
...(eventId ? { eventId } : {}),
|
|
176
|
+
type: trigger,
|
|
177
|
+
...(typeof event.ts === "string"
|
|
178
|
+
? {
|
|
179
|
+
occurredAt: slackTsToIso(event.ts),
|
|
180
|
+
}
|
|
181
|
+
: {}),
|
|
182
|
+
address: {
|
|
183
|
+
conversationId,
|
|
184
|
+
...(addressThreadId ? { threadId: addressThreadId } : {}),
|
|
185
|
+
},
|
|
186
|
+
message,
|
|
187
|
+
};
|
|
188
|
+
const tenantId = input.installation.kind === "team"
|
|
189
|
+
? `slack:${input.installation.id}`
|
|
190
|
+
: `slack:${input.installation.id}`;
|
|
191
|
+
return {
|
|
192
|
+
status: "accepted",
|
|
193
|
+
event: channelEvent,
|
|
194
|
+
actorId,
|
|
195
|
+
tenantId,
|
|
196
|
+
sourceThreadKey,
|
|
197
|
+
trigger,
|
|
198
|
+
groupingMode,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function resolveTrigger(event, isDirectMessageSurface) {
|
|
202
|
+
if (event.type === "app_mention") {
|
|
203
|
+
return "app_mention";
|
|
204
|
+
}
|
|
205
|
+
if (event.type === "message") {
|
|
206
|
+
const channelType = stringField(event, "channel_type");
|
|
207
|
+
if (isDirectMessageSurface || channelType === "im") {
|
|
208
|
+
return "direct_message";
|
|
209
|
+
}
|
|
210
|
+
// Channel/group (or unknown surface) replies in a thread.
|
|
211
|
+
if (stringField(event, "thread_ts")) {
|
|
212
|
+
return "thread_reply";
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
function textMentionsBot(text, botUserId) {
|
|
218
|
+
const escaped = botUserId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
219
|
+
return new RegExp(`<@${escaped}(?:\\|[^>]+)?>`, "i").test(text);
|
|
220
|
+
}
|
|
221
|
+
function resolveActorTeamId(body, event, installation) {
|
|
222
|
+
const fromEvent = stringField(event, "team");
|
|
223
|
+
if (fromEvent)
|
|
224
|
+
return fromEvent;
|
|
225
|
+
const fromBody = stringField(body, "team_id");
|
|
226
|
+
if (fromBody)
|
|
227
|
+
return fromBody;
|
|
228
|
+
if (installation.kind === "team") {
|
|
229
|
+
return installation.contextTeamId || installation.id;
|
|
230
|
+
}
|
|
231
|
+
// Enterprise installs need an unambiguous workspace context for the actor.
|
|
232
|
+
return installation.contextTeamId || undefined;
|
|
233
|
+
}
|
|
234
|
+
function conversationAllowed(conversationId, config) {
|
|
235
|
+
const include = config.filters.includeConversations;
|
|
236
|
+
const exclude = config.filters.excludeConversations;
|
|
237
|
+
if (include && include.length > 0 && !include.includes(conversationId)) {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
if (exclude && exclude.includes(conversationId)) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
function actorAllowed(actorId, config) {
|
|
246
|
+
const include = config.filters.includeActors;
|
|
247
|
+
const exclude = config.filters.excludeActors;
|
|
248
|
+
if (include && include.length > 0 && !include.includes(actorId)) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
if (exclude && exclude.includes(actorId)) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
function applyMentionBehavior(text, behavior) {
|
|
257
|
+
if (behavior === "preserve") {
|
|
258
|
+
return text;
|
|
259
|
+
}
|
|
260
|
+
// Strip <@U…> / <@W…> / <@B…> mention tokens and collapse leftover whitespace.
|
|
261
|
+
return text
|
|
262
|
+
.replace(/<@[UWB][A-Z0-9]+(?:\|[^>]+)?>/gi, " ")
|
|
263
|
+
.replace(/[ \t]+\n/g, "\n")
|
|
264
|
+
.replace(/\n[ \t]+/g, "\n")
|
|
265
|
+
.replace(/[ \t]{2,}/g, " ")
|
|
266
|
+
.trim();
|
|
267
|
+
}
|
|
268
|
+
/** Decode Slack transport escaping (`&` `<` `>`). */
|
|
269
|
+
export function decodeSlackEscaping(text) {
|
|
270
|
+
// Decode `<` / `>` before `&` so a literal `&lt;` stays `<`
|
|
271
|
+
// instead of cascading into `<` (CodeQL double-unescape).
|
|
272
|
+
return text
|
|
273
|
+
.replace(/</g, "<")
|
|
274
|
+
.replace(/>/g, ">")
|
|
275
|
+
.replace(/&/g, "&");
|
|
276
|
+
}
|
|
277
|
+
function inferAttachmentKind(contentType) {
|
|
278
|
+
if (!contentType)
|
|
279
|
+
return "unknown";
|
|
280
|
+
if (contentType.startsWith("image/"))
|
|
281
|
+
return "image";
|
|
282
|
+
if (contentType.startsWith("audio/"))
|
|
283
|
+
return "audio";
|
|
284
|
+
if (contentType.startsWith("video/"))
|
|
285
|
+
return "video";
|
|
286
|
+
return "file";
|
|
287
|
+
}
|
|
288
|
+
function slackTsToIso(ts) {
|
|
289
|
+
const seconds = Number(ts);
|
|
290
|
+
if (!Number.isFinite(seconds))
|
|
291
|
+
return undefined;
|
|
292
|
+
return new Date(seconds * 1000).toISOString();
|
|
293
|
+
}
|
|
294
|
+
function asRecord(value) {
|
|
295
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
296
|
+
? value
|
|
297
|
+
: undefined;
|
|
298
|
+
}
|
|
299
|
+
function stringField(record, key) {
|
|
300
|
+
const value = record[key];
|
|
301
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
302
|
+
}
|
|
303
|
+
async function hmacSha256Hex(secret, value) {
|
|
304
|
+
const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
305
|
+
const signature = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(value));
|
|
306
|
+
return [...new Uint8Array(signature)]
|
|
307
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
308
|
+
.join("");
|
|
309
|
+
}
|
|
310
|
+
function constantTimeEquals(a, b) {
|
|
311
|
+
if (a.length !== b.length) {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
let mismatch = 0;
|
|
315
|
+
for (let i = 0; i < a.length; i += 1) {
|
|
316
|
+
mismatch |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
317
|
+
}
|
|
318
|
+
return mismatch === 0;
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/channels/slack/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned Slack source-thread key encoding.
|
|
3
|
+
*
|
|
4
|
+
* Format: `slack:v1:<base64url(JSON array)>` where the array is:
|
|
5
|
+
* `[installationKind, installationId, contextTeamId, conversationId, mode, groupingId]`
|
|
6
|
+
*
|
|
7
|
+
* Opaque provider IDs are never parsed with delimiter assumptions.
|
|
8
|
+
*/
|
|
9
|
+
export type SourceThreadMode = "thread" | "conversation" | "message";
|
|
10
|
+
export type InstallationKind = "team" | "enterprise";
|
|
11
|
+
export interface SlackSourceThreadParts {
|
|
12
|
+
installationKind: InstallationKind;
|
|
13
|
+
installationId: string;
|
|
14
|
+
contextTeamId: string;
|
|
15
|
+
conversationId: string;
|
|
16
|
+
mode: SourceThreadMode;
|
|
17
|
+
groupingId: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Encode a Slack source thread key. Array order is the canonical serialization;
|
|
21
|
+
* both runtimes share byte-level fixtures over this shape.
|
|
22
|
+
*/
|
|
23
|
+
export declare function encodeSlackSourceThreadKey(parts: SlackSourceThreadParts): string;
|
|
24
|
+
/** Decode a `slack:v1:` source thread key, or return `undefined` if malformed. */
|
|
25
|
+
export declare function decodeSlackSourceThreadKey(key: string): SlackSourceThreadParts | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the MDA grouping id for a Slack conversation mapping mode.
|
|
28
|
+
*
|
|
29
|
+
* - `"thread"`: parent `thread_ts`, or the message's own `ts` for a new thread
|
|
30
|
+
* - `"conversation"`: constant `root` (conversation id is a separate segment)
|
|
31
|
+
* - `"message"`: message `ts`
|
|
32
|
+
*/
|
|
33
|
+
export declare function slackGroupingId(mode: SourceThreadMode, messageTs: string, threadTs?: string): string;
|
|
34
|
+
//# sourceMappingURL=source-thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-thread.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/source-thread.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,YAAY,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,sBAAsB,GAC5B,MAAM,CAWR;AAED,kFAAkF;AAClF,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GACV,sBAAsB,GAAG,SAAS,CAuCpC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAQR"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned Slack source-thread key encoding.
|
|
3
|
+
*
|
|
4
|
+
* Format: `slack:v1:<base64url(JSON array)>` where the array is:
|
|
5
|
+
* `[installationKind, installationId, contextTeamId, conversationId, mode, groupingId]`
|
|
6
|
+
*
|
|
7
|
+
* Opaque provider IDs are never parsed with delimiter assumptions.
|
|
8
|
+
*/
|
|
9
|
+
const SOURCE_THREAD_PREFIX = "slack:v1:";
|
|
10
|
+
/**
|
|
11
|
+
* Encode a Slack source thread key. Array order is the canonical serialization;
|
|
12
|
+
* both runtimes share byte-level fixtures over this shape.
|
|
13
|
+
*/
|
|
14
|
+
export function encodeSlackSourceThreadKey(parts) {
|
|
15
|
+
const payload = [
|
|
16
|
+
parts.installationKind,
|
|
17
|
+
parts.installationId,
|
|
18
|
+
parts.contextTeamId,
|
|
19
|
+
parts.conversationId,
|
|
20
|
+
parts.mode,
|
|
21
|
+
parts.groupingId,
|
|
22
|
+
];
|
|
23
|
+
const json = JSON.stringify(payload);
|
|
24
|
+
return `${SOURCE_THREAD_PREFIX}${base64UrlEncode(json)}`;
|
|
25
|
+
}
|
|
26
|
+
/** Decode a `slack:v1:` source thread key, or return `undefined` if malformed. */
|
|
27
|
+
export function decodeSlackSourceThreadKey(key) {
|
|
28
|
+
if (!key.startsWith(SOURCE_THREAD_PREFIX)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const json = base64UrlDecode(key.slice(SOURCE_THREAD_PREFIX.length));
|
|
33
|
+
const payload = JSON.parse(json);
|
|
34
|
+
if (!Array.isArray(payload) || payload.length !== 6) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const [installationKind, installationId, contextTeamId, conversationId, mode, groupingId,] = payload;
|
|
38
|
+
if ((installationKind !== "team" && installationKind !== "enterprise") ||
|
|
39
|
+
typeof installationId !== "string" ||
|
|
40
|
+
typeof contextTeamId !== "string" ||
|
|
41
|
+
typeof conversationId !== "string" ||
|
|
42
|
+
(mode !== "thread" && mode !== "conversation" && mode !== "message") ||
|
|
43
|
+
typeof groupingId !== "string") {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
installationKind,
|
|
48
|
+
installationId,
|
|
49
|
+
contextTeamId,
|
|
50
|
+
conversationId,
|
|
51
|
+
mode,
|
|
52
|
+
groupingId,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the MDA grouping id for a Slack conversation mapping mode.
|
|
61
|
+
*
|
|
62
|
+
* - `"thread"`: parent `thread_ts`, or the message's own `ts` for a new thread
|
|
63
|
+
* - `"conversation"`: constant `root` (conversation id is a separate segment)
|
|
64
|
+
* - `"message"`: message `ts`
|
|
65
|
+
*/
|
|
66
|
+
export function slackGroupingId(mode, messageTs, threadTs) {
|
|
67
|
+
if (mode === "conversation") {
|
|
68
|
+
return "root";
|
|
69
|
+
}
|
|
70
|
+
if (mode === "message") {
|
|
71
|
+
return messageTs;
|
|
72
|
+
}
|
|
73
|
+
return threadTs ?? messageTs;
|
|
74
|
+
}
|
|
75
|
+
function base64UrlEncode(value) {
|
|
76
|
+
const bytes = new TextEncoder().encode(value);
|
|
77
|
+
let binary = "";
|
|
78
|
+
for (const byte of bytes) {
|
|
79
|
+
binary += String.fromCharCode(byte);
|
|
80
|
+
}
|
|
81
|
+
return btoa(binary)
|
|
82
|
+
.replace(/\+/g, "-")
|
|
83
|
+
.replace(/\//g, "_")
|
|
84
|
+
.replace(/=+$/, "");
|
|
85
|
+
}
|
|
86
|
+
function base64UrlDecode(value) {
|
|
87
|
+
const padded = value + "=".repeat((4 - (value.length % 4)) % 4);
|
|
88
|
+
const binary = atob(padded.replace(/-/g, "+").replace(/_/g, "/"));
|
|
89
|
+
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
90
|
+
return new TextDecoder().decode(bytes);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=source-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-thread.js","sourceRoot":"","sources":["../../../src/channels/slack/source-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Web API transport for managed channel egress.
|
|
3
|
+
*
|
|
4
|
+
* Uses `fetch` against `https://slack.com/api/*` — no Slack SDK dependency.
|
|
5
|
+
* Credentials stay in process env / constructor args; they never appear on
|
|
6
|
+
* `runtime.channel`.
|
|
7
|
+
*/
|
|
8
|
+
import type { ChannelTransport } from "../runtime.js";
|
|
9
|
+
/** Optional override so tests can point at a local mock Slack Web API. */
|
|
10
|
+
export declare const SLACK_API_BASE_ENV = "SLACK_API_BASE";
|
|
11
|
+
/** Default status string for Slack Assistants `assistant.threads.setStatus`. */
|
|
12
|
+
export declare const DEFAULT_ASSISTANT_STATUS = "is thinking\u2026";
|
|
13
|
+
/**
|
|
14
|
+
* Curated rotating loading strings shown by Slack while the indicator is active.
|
|
15
|
+
* Capped at 10 by Slack's API.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DEFAULT_LOADING_MESSAGES: readonly string[];
|
|
18
|
+
export interface SlackWebApiTransportOptions {
|
|
19
|
+
botToken: string;
|
|
20
|
+
/** Slack Web API base URL (default `https://slack.com/api`). */
|
|
21
|
+
apiBase?: string;
|
|
22
|
+
/** Optional fetch override for tests. */
|
|
23
|
+
fetch?: typeof fetch;
|
|
24
|
+
}
|
|
25
|
+
export interface SetSlackAssistantStatusOptions {
|
|
26
|
+
botToken: string;
|
|
27
|
+
channelId: string;
|
|
28
|
+
threadTs: string;
|
|
29
|
+
/** Status text; empty string clears the indicator. */
|
|
30
|
+
status?: string;
|
|
31
|
+
loadingMessages?: readonly string[];
|
|
32
|
+
apiBase?: string;
|
|
33
|
+
fetch?: typeof fetch;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build a {@link ChannelTransport} backed by Slack `chat.postMessage` /
|
|
37
|
+
* `chat.update`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createSlackWebApiTransport(options: SlackWebApiTransportOptions): ChannelTransport;
|
|
40
|
+
/**
|
|
41
|
+
* Set (or clear) Slack's Assistants thread status indicator.
|
|
42
|
+
*
|
|
43
|
+
* Wraps `assistant.threads.setStatus`. Failures are logged and never thrown —
|
|
44
|
+
* the indicator is a UX nicety, not a correctness requirement. Returns whether
|
|
45
|
+
* Slack accepted the update.
|
|
46
|
+
*/
|
|
47
|
+
export declare function setSlackAssistantStatus(options: SetSlackAssistantStatusOptions): Promise<boolean>;
|
|
48
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/transport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAEnD,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,sBAAiB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAWrD,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,gBAAgB,CAsElB;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,OAAO,CAAC,CAyClB"}
|