managed-deepagents 0.4.0-dev.67 → 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 +3 -5
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +76 -209
- 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 +5 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +15 -10
- package/dist/evals-run.d.ts +0 -3
- package/dist/evals-run.d.ts.map +0 -1
- package/dist/evals-run.js +0 -14
- package/dist/evals-run.js.map +0 -1
- package/dist/evals.d.ts +0 -238
- package/dist/evals.d.ts.map +0 -1
- package/dist/evals.js +0 -291
- package/dist/evals.js.map +0 -1
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Managed Slack Events HTTP handler + agent runner.
|
|
3
|
+
*
|
|
4
|
+
* Verifies Slack signatures, normalizes Phase 1 events, acknowledges within the
|
|
5
|
+
* Slack 3s window, then invokes the graph over a trusted loopback and posts an
|
|
6
|
+
* auto-reply when needed.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
import { Client } from "@langchain/langgraph-sdk";
|
|
10
|
+
import { ChannelError } from "../errors.js";
|
|
11
|
+
import { InMemoryChannelStore } from "../store.js";
|
|
12
|
+
import { CHANNEL_BINDING_KEY, clearFinalPosted, wasDeliveryFinalPosted, } from "../binding.js";
|
|
13
|
+
import { extractAssistantText } from "../assistant-text.js";
|
|
14
|
+
import { createRuntimeChannel } from "../runtime.js";
|
|
15
|
+
import { normalizeSlackEvent, verifySlackRequest, } from "./normalize.js";
|
|
16
|
+
import { createSlackWebApiTransport, DEFAULT_ASSISTANT_STATUS, DEFAULT_LOADING_MESSAGES, setSlackAssistantStatus, } from "./transport.js";
|
|
17
|
+
import { SLACK_BOT_TOKEN_ENV } from "../binding.js";
|
|
18
|
+
import { getIdentityLinkStore, } from "../../identity/links.js";
|
|
19
|
+
import { readSlackOidcConfig, slackConnectUrl, } from "../../identity/slack-oauth.js";
|
|
20
|
+
import { ACTOR_HEADER, INGRESS_SECRET_ENV, INGRESS_SECRET_HEADER, SOURCE_PROVIDER_HEADER, SOURCE_THREAD_HEADER, TENANT_HEADER, } from "../../runtime/auth.js";
|
|
21
|
+
/** Env vars for Phase 1 single-workspace Slack install. */
|
|
22
|
+
export const SLACK_SIGNING_SECRET_ENV = "SLACK_SIGNING_SECRET";
|
|
23
|
+
export const SLACK_API_APP_ID_ENV = "SLACK_API_APP_ID";
|
|
24
|
+
export const SLACK_TEAM_ID_ENV = "SLACK_TEAM_ID";
|
|
25
|
+
export const SLACK_BOT_USER_ID_ENV = "SLACK_BOT_USER_ID";
|
|
26
|
+
/** Default assistant id compiled by mda (`langgraph.json` graphs key). */
|
|
27
|
+
const DEFAULT_ASSISTANT_ID = "agent";
|
|
28
|
+
/** Slack expires assistant status after ~2 minutes; refresh while the run waits. */
|
|
29
|
+
const ASSISTANT_STATUS_HEARTBEAT_MS = 60_000;
|
|
30
|
+
/**
|
|
31
|
+
* Process-local dedupe store for Phase 1.
|
|
32
|
+
*
|
|
33
|
+
* Idempotency is best-effort within a single process; multi-replica Host
|
|
34
|
+
* deployments can still double-invoke on Slack retries until durable
|
|
35
|
+
* placement lands.
|
|
36
|
+
*/
|
|
37
|
+
const defaultStore = new InMemoryChannelStore();
|
|
38
|
+
/**
|
|
39
|
+
* Handle `POST /channels/{name}/events` for a Slack Events API request.
|
|
40
|
+
*
|
|
41
|
+
* Always verifies the signature against the raw body before parsing JSON.
|
|
42
|
+
*/
|
|
43
|
+
export async function handleSlackEventsRequest(request, channel) {
|
|
44
|
+
const signingSecret = channel.signingSecret ?? process.env[SLACK_SIGNING_SECRET_ENV] ?? "";
|
|
45
|
+
if (!signingSecret) {
|
|
46
|
+
return jsonError(503, "Slack signing secret is not configured");
|
|
47
|
+
}
|
|
48
|
+
const rawBody = channel.rawBody ?? (await request.text());
|
|
49
|
+
const signature = request.headers.get("x-slack-signature") ?? "";
|
|
50
|
+
const timestamp = request.headers.get("x-slack-request-timestamp") ?? "";
|
|
51
|
+
try {
|
|
52
|
+
await verifySlackRequest(rawBody, { signature, timestamp }, signingSecret);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error instanceof ChannelError) {
|
|
56
|
+
const status = error.code === "channel_replay_rejected" ? 403 : 401;
|
|
57
|
+
return jsonError(status, error.message);
|
|
58
|
+
}
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
let body;
|
|
62
|
+
try {
|
|
63
|
+
const text = typeof rawBody === "string" ? rawBody : new TextDecoder().decode(rawBody);
|
|
64
|
+
body = JSON.parse(text);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return jsonError(400, "invalid JSON body");
|
|
68
|
+
}
|
|
69
|
+
// URL verification has no installation context yet — answer before env checks.
|
|
70
|
+
if (body !== null &&
|
|
71
|
+
typeof body === "object" &&
|
|
72
|
+
!Array.isArray(body) &&
|
|
73
|
+
body.type === "url_verification") {
|
|
74
|
+
const challenge = body.challenge;
|
|
75
|
+
if (typeof challenge !== "string") {
|
|
76
|
+
return jsonError(400, "invalid url_verification");
|
|
77
|
+
}
|
|
78
|
+
return new Response(JSON.stringify({ challenge }), {
|
|
79
|
+
status: 200,
|
|
80
|
+
headers: { "Content-Type": "application/json" },
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const installation = channel.installation ?? readInstallationFromEnv(body);
|
|
84
|
+
if (!installation) {
|
|
85
|
+
return jsonError(503, "Slack installation is not configured");
|
|
86
|
+
}
|
|
87
|
+
const deliveryId = crypto.randomUUID();
|
|
88
|
+
const normalized = normalizeSlackEvent({
|
|
89
|
+
body,
|
|
90
|
+
config: channel.config,
|
|
91
|
+
installation,
|
|
92
|
+
deliveryId,
|
|
93
|
+
});
|
|
94
|
+
if (normalized.status === "url_verification") {
|
|
95
|
+
return new Response(JSON.stringify({ challenge: normalized.challenge }), {
|
|
96
|
+
status: 200,
|
|
97
|
+
headers: { "Content-Type": "application/json" },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
const store = channel.store ?? defaultStore;
|
|
101
|
+
const deploymentId = channel.deploymentId ??
|
|
102
|
+
process.env.LANGSMITH_HOST_PROJECT_ID ??
|
|
103
|
+
process.env.LANGGRAPH_CLOUD_ID ??
|
|
104
|
+
"local";
|
|
105
|
+
if (normalized.status === "filtered") {
|
|
106
|
+
store.acceptDelivery({
|
|
107
|
+
deploymentId,
|
|
108
|
+
channelDefinitionId: channel.name,
|
|
109
|
+
provider: "slack",
|
|
110
|
+
apiAppId: installation.apiAppId,
|
|
111
|
+
eventId: normalized.eventId,
|
|
112
|
+
status: "filtered",
|
|
113
|
+
filterReason: normalized.reason,
|
|
114
|
+
});
|
|
115
|
+
return new Response("", { status: 200 });
|
|
116
|
+
}
|
|
117
|
+
// Accept + ack first (Slack 3s window). Involvement / link / invoke run after.
|
|
118
|
+
const { delivery, duplicate } = store.acceptDelivery({
|
|
119
|
+
deploymentId,
|
|
120
|
+
channelDefinitionId: channel.name,
|
|
121
|
+
provider: "slack",
|
|
122
|
+
apiAppId: installation.apiAppId,
|
|
123
|
+
eventId: normalized.event.eventId,
|
|
124
|
+
sourceThreadKey: normalized.sourceThreadKey,
|
|
125
|
+
status: "accepted",
|
|
126
|
+
event: normalized.event,
|
|
127
|
+
});
|
|
128
|
+
if (duplicate) {
|
|
129
|
+
return new Response("", { status: 200 });
|
|
130
|
+
}
|
|
131
|
+
const schedule = channel.schedule ??
|
|
132
|
+
((work) => {
|
|
133
|
+
// Fire-and-forget after ack; unhandled rejections are logged.
|
|
134
|
+
work().catch((error) => {
|
|
135
|
+
console.error(`[mda] channel "${channel.name}" delivery ${delivery.deliveryId} failed:`, error);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
const botToken = channel.botToken ?? process.env[SLACK_BOT_TOKEN_ENV] ?? "";
|
|
139
|
+
const invoke = channel.invokeAgent ?? invokeChannelAgent;
|
|
140
|
+
const linkStore = channel.linkStore ?? getIdentityLinkStore();
|
|
141
|
+
// When Connect-with-Slack OAuth is configured, unlinked users must connect
|
|
142
|
+
// before the agent runs. Shared-bot projects without OAuth keep Slack actors.
|
|
143
|
+
const requireLink = readSlackOidcConfig() !== null;
|
|
144
|
+
schedule(async () => {
|
|
145
|
+
clearFinalPosted(delivery.deliveryId);
|
|
146
|
+
delivery.status = "running";
|
|
147
|
+
delivery.updatedAt = new Date().toISOString();
|
|
148
|
+
const binding = {
|
|
149
|
+
name: channel.name,
|
|
150
|
+
provider: "slack",
|
|
151
|
+
event: normalized.event,
|
|
152
|
+
address: normalized.event.address,
|
|
153
|
+
autoReply: channel.config.autoReply,
|
|
154
|
+
deliveryId: delivery.deliveryId,
|
|
155
|
+
};
|
|
156
|
+
const text = normalized.event.message?.text?.trim() ?? "";
|
|
157
|
+
if (!text) {
|
|
158
|
+
delivery.status = "delivered";
|
|
159
|
+
delivery.updatedAt = new Date().toISOString();
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
let actorId = normalized.actorId;
|
|
163
|
+
if (requireLink) {
|
|
164
|
+
const link = await linkStore.getBySlackActorId(normalized.actorId);
|
|
165
|
+
if (!link) {
|
|
166
|
+
if (botToken) {
|
|
167
|
+
await postConnectPrompt({
|
|
168
|
+
botToken,
|
|
169
|
+
channelName: channel.name,
|
|
170
|
+
event: normalized.event,
|
|
171
|
+
address: normalized.event.address,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
delivery.status = "delivered";
|
|
175
|
+
delivery.updatedAt = new Date().toISOString();
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
actorId = link.actorId;
|
|
179
|
+
}
|
|
180
|
+
// Gate thread_reply after ack + identity remap so ownership probes use the
|
|
181
|
+
// same actor that created the MDA thread (critical for threads: "actor").
|
|
182
|
+
if (normalized.trigger === "thread_reply") {
|
|
183
|
+
const existsInput = {
|
|
184
|
+
sourceThreadKey: normalized.sourceThreadKey,
|
|
185
|
+
actorId,
|
|
186
|
+
...(normalized.tenantId ? { tenantId: normalized.tenantId } : {}),
|
|
187
|
+
};
|
|
188
|
+
const exists = channel.sourceThreadExists
|
|
189
|
+
? await channel.sourceThreadExists(existsInput)
|
|
190
|
+
: await channelSourceThreadExists(existsInput);
|
|
191
|
+
if (!exists) {
|
|
192
|
+
delivery.status = "filtered";
|
|
193
|
+
delivery.filterReason = "thread_not_active";
|
|
194
|
+
delivery.updatedAt = new Date().toISOString();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const address = normalized.event.address;
|
|
199
|
+
await withSlackAssistantStatusHeartbeat({
|
|
200
|
+
botToken,
|
|
201
|
+
channelId: address.conversationId,
|
|
202
|
+
threadTs: address.threadId ?? "",
|
|
203
|
+
}, async () => {
|
|
204
|
+
const result = await invoke({
|
|
205
|
+
actorId,
|
|
206
|
+
tenantId: normalized.tenantId,
|
|
207
|
+
sourceThreadKey: normalized.sourceThreadKey,
|
|
208
|
+
binding,
|
|
209
|
+
text,
|
|
210
|
+
assistantId: channel.assistantId ?? DEFAULT_ASSISTANT_ID,
|
|
211
|
+
});
|
|
212
|
+
delivery.runId = result.runId;
|
|
213
|
+
delivery.status = "response_pending";
|
|
214
|
+
delivery.updatedAt = new Date().toISOString();
|
|
215
|
+
if (channel.config.autoReply &&
|
|
216
|
+
!wasDeliveryFinalPosted(delivery.deliveryId) &&
|
|
217
|
+
result.replyText.trim().length > 0) {
|
|
218
|
+
if (!botToken) {
|
|
219
|
+
throw new ChannelError("channel_run_failed", "auto-reply requires SLACK_BOT_TOKEN");
|
|
220
|
+
}
|
|
221
|
+
const transport = createSlackWebApiTransport({ botToken });
|
|
222
|
+
const runtimeChannel = createRuntimeChannel({
|
|
223
|
+
name: channel.name,
|
|
224
|
+
provider: "slack",
|
|
225
|
+
event: normalized.event,
|
|
226
|
+
address: normalized.event.address,
|
|
227
|
+
transport,
|
|
228
|
+
onFinalPosted: () => undefined,
|
|
229
|
+
});
|
|
230
|
+
const posted = await runtimeChannel.post({ text: result.replyText }, { final: true });
|
|
231
|
+
delivery.outboundMessageIds.push(posted.id);
|
|
232
|
+
}
|
|
233
|
+
delivery.status = "delivered";
|
|
234
|
+
delivery.updatedAt = new Date().toISOString();
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
return new Response("", { status: 200 });
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* True when an MDA thread already exists for this Slack source-thread key.
|
|
241
|
+
* Used to gate `thread_reply` so unrelated channel threads are ignored.
|
|
242
|
+
*
|
|
243
|
+
* Call with the **resolved** actor (post Connect-with-Slack remap) so
|
|
244
|
+
* `threads: "actor"` ownership matches the thread created on the first run.
|
|
245
|
+
*/
|
|
246
|
+
export async function channelSourceThreadExists(input) {
|
|
247
|
+
const ingressSecret = process.env[INGRESS_SECRET_ENV];
|
|
248
|
+
if (!ingressSecret) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
const client = createChannelLoopbackClient({
|
|
252
|
+
actorId: input.actorId,
|
|
253
|
+
tenantId: input.tenantId,
|
|
254
|
+
sourceThreadKey: input.sourceThreadKey,
|
|
255
|
+
ingressSecret,
|
|
256
|
+
});
|
|
257
|
+
const threadId = stableThreadId(input.sourceThreadKey);
|
|
258
|
+
try {
|
|
259
|
+
await client.threads.get(threadId);
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Invoke the managed graph over a trusted loopback with channel identity stamped.
|
|
268
|
+
*/
|
|
269
|
+
export async function invokeChannelAgent(input) {
|
|
270
|
+
const ingressSecret = process.env[INGRESS_SECRET_ENV];
|
|
271
|
+
if (!ingressSecret) {
|
|
272
|
+
throw new ChannelError("channel_run_failed", "MDA_INGRESS_SECRET is required for channel agent invocation");
|
|
273
|
+
}
|
|
274
|
+
const client = createChannelLoopbackClient({
|
|
275
|
+
actorId: input.actorId,
|
|
276
|
+
tenantId: input.tenantId,
|
|
277
|
+
sourceThreadKey: input.sourceThreadKey,
|
|
278
|
+
ingressSecret,
|
|
279
|
+
});
|
|
280
|
+
const threadId = stableThreadId(input.sourceThreadKey);
|
|
281
|
+
try {
|
|
282
|
+
await client.threads.create({
|
|
283
|
+
threadId,
|
|
284
|
+
metadata: { owner: input.sourceThreadKey },
|
|
285
|
+
ifExists: "do_nothing",
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// Some SDK versions use different ifExists semantics; continue and let run fail loudly.
|
|
290
|
+
}
|
|
291
|
+
const run = (await client.runs.wait(threadId, input.assistantId, {
|
|
292
|
+
input: {
|
|
293
|
+
messages: [{ role: "human", content: input.text }],
|
|
294
|
+
},
|
|
295
|
+
config: {
|
|
296
|
+
configurable: {
|
|
297
|
+
[CHANNEL_BINDING_KEY]: input.binding,
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
}));
|
|
301
|
+
return {
|
|
302
|
+
replyText: extractAssistantText(run),
|
|
303
|
+
runId: run.runId ?? run.run_id,
|
|
304
|
+
threadId,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
function createChannelLoopbackClient(input) {
|
|
308
|
+
const apiUrl = resolveLoopbackApiUrl();
|
|
309
|
+
const apiKey = process.env.LANGSMITH_API_KEY ?? process.env.LANGGRAPH_API_KEY ?? "local";
|
|
310
|
+
const headers = {
|
|
311
|
+
[INGRESS_SECRET_HEADER]: input.ingressSecret,
|
|
312
|
+
[ACTOR_HEADER]: input.actorId,
|
|
313
|
+
[SOURCE_PROVIDER_HEADER]: "slack",
|
|
314
|
+
[SOURCE_THREAD_HEADER]: input.sourceThreadKey,
|
|
315
|
+
};
|
|
316
|
+
if (input.tenantId) {
|
|
317
|
+
headers[TENANT_HEADER] = input.tenantId;
|
|
318
|
+
}
|
|
319
|
+
return new Client({
|
|
320
|
+
apiUrl,
|
|
321
|
+
apiKey,
|
|
322
|
+
defaultHeaders: headers,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
function resolveLoopbackApiUrl() {
|
|
326
|
+
const explicit = process.env.MDA_CHANNEL_API_URL ??
|
|
327
|
+
process.env.LANGGRAPH_API_URL ??
|
|
328
|
+
process.env.LANGSMITH_ENDPOINT;
|
|
329
|
+
if (explicit && explicit.trim().length > 0) {
|
|
330
|
+
return explicit.replace(/\/$/, "");
|
|
331
|
+
}
|
|
332
|
+
const port = process.env.PORT ?? "8000";
|
|
333
|
+
return `http://127.0.0.1:${port}`;
|
|
334
|
+
}
|
|
335
|
+
/** Deterministic LangGraph thread id from the Slack source-thread key. */
|
|
336
|
+
export function stableThreadId(sourceThreadKey) {
|
|
337
|
+
const hex = createHash("sha256").update(sourceThreadKey).digest("hex");
|
|
338
|
+
return [
|
|
339
|
+
hex.slice(0, 8),
|
|
340
|
+
hex.slice(8, 12),
|
|
341
|
+
`5${hex.slice(13, 16)}`,
|
|
342
|
+
`a${hex.slice(17, 20)}`,
|
|
343
|
+
hex.slice(20, 32),
|
|
344
|
+
].join("-");
|
|
345
|
+
}
|
|
346
|
+
function readInstallationFromEnv(body) {
|
|
347
|
+
const apiAppId = process.env[SLACK_API_APP_ID_ENV];
|
|
348
|
+
const teamId = process.env[SLACK_TEAM_ID_ENV];
|
|
349
|
+
if (!apiAppId || !teamId) {
|
|
350
|
+
// Fall back to values on the verified envelope when env is incomplete
|
|
351
|
+
// (useful for url_verification before secrets are fully wired in tests).
|
|
352
|
+
const record = body !== null && typeof body === "object" && !Array.isArray(body)
|
|
353
|
+
? body
|
|
354
|
+
: undefined;
|
|
355
|
+
const fromBodyApp = typeof record?.api_app_id === "string" ? record.api_app_id : undefined;
|
|
356
|
+
const fromBodyTeam = typeof record?.team_id === "string" ? record.team_id : undefined;
|
|
357
|
+
if (!apiAppId && !fromBodyApp)
|
|
358
|
+
return undefined;
|
|
359
|
+
if (!teamId && !fromBodyTeam)
|
|
360
|
+
return undefined;
|
|
361
|
+
return {
|
|
362
|
+
kind: "team",
|
|
363
|
+
id: teamId ?? fromBodyTeam,
|
|
364
|
+
contextTeamId: teamId ?? fromBodyTeam,
|
|
365
|
+
apiAppId: apiAppId ?? fromBodyApp,
|
|
366
|
+
...(process.env[SLACK_BOT_USER_ID_ENV]
|
|
367
|
+
? { botUserId: process.env[SLACK_BOT_USER_ID_ENV] }
|
|
368
|
+
: {}),
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
kind: "team",
|
|
373
|
+
id: teamId,
|
|
374
|
+
contextTeamId: teamId,
|
|
375
|
+
apiAppId,
|
|
376
|
+
...(process.env[SLACK_BOT_USER_ID_ENV]
|
|
377
|
+
? { botUserId: process.env[SLACK_BOT_USER_ID_ENV] }
|
|
378
|
+
: {}),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Show Slack's Assistants status while `work` runs, refreshing every ~60s.
|
|
383
|
+
* Clears the indicator in `finally` (Slack also auto-clears on bot posts).
|
|
384
|
+
*/
|
|
385
|
+
async function withSlackAssistantStatusHeartbeat(options, work) {
|
|
386
|
+
const botToken = options.botToken.trim();
|
|
387
|
+
const channelId = options.channelId.trim();
|
|
388
|
+
const threadTs = options.threadTs.trim();
|
|
389
|
+
if (!botToken || !channelId || !threadTs) {
|
|
390
|
+
return work();
|
|
391
|
+
}
|
|
392
|
+
const refresh = () => setSlackAssistantStatus({
|
|
393
|
+
botToken,
|
|
394
|
+
channelId,
|
|
395
|
+
threadTs,
|
|
396
|
+
status: DEFAULT_ASSISTANT_STATUS,
|
|
397
|
+
loadingMessages: DEFAULT_LOADING_MESSAGES,
|
|
398
|
+
});
|
|
399
|
+
await refresh();
|
|
400
|
+
const timer = setInterval(() => {
|
|
401
|
+
refresh().catch(() => undefined);
|
|
402
|
+
}, ASSISTANT_STATUS_HEARTBEAT_MS);
|
|
403
|
+
try {
|
|
404
|
+
return await work();
|
|
405
|
+
}
|
|
406
|
+
finally {
|
|
407
|
+
clearInterval(timer);
|
|
408
|
+
await setSlackAssistantStatus({
|
|
409
|
+
botToken,
|
|
410
|
+
channelId,
|
|
411
|
+
threadTs,
|
|
412
|
+
status: "",
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
async function postConnectPrompt(input) {
|
|
417
|
+
const oauth = readSlackOidcConfig();
|
|
418
|
+
const connectUrl = oauth
|
|
419
|
+
? slackConnectUrl(oauth.publicAppUrl)
|
|
420
|
+
: "your app settings";
|
|
421
|
+
const transport = createSlackWebApiTransport({ botToken: input.botToken });
|
|
422
|
+
const runtimeChannel = createRuntimeChannel({
|
|
423
|
+
name: input.channelName,
|
|
424
|
+
provider: "slack",
|
|
425
|
+
event: input.event,
|
|
426
|
+
address: input.address,
|
|
427
|
+
transport,
|
|
428
|
+
onFinalPosted: () => undefined,
|
|
429
|
+
});
|
|
430
|
+
await runtimeChannel.post({
|
|
431
|
+
text: `Connect your account to use this agent in Slack.\n` +
|
|
432
|
+
`Open ${connectUrl} while signed in, then try again.`,
|
|
433
|
+
}, { final: true });
|
|
434
|
+
}
|
|
435
|
+
function jsonError(status, message) {
|
|
436
|
+
return new Response(JSON.stringify({ error: message }), {
|
|
437
|
+
status,
|
|
438
|
+
headers: { "Content-Type": "application/json" },
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/channels/slack/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack channel integration.
|
|
3
|
+
*
|
|
4
|
+
* Shared channel-neutral contracts live in `managed-deepagents/channels`.
|
|
5
|
+
* Provider-specific authoring, normalization, and source-thread encoding live
|
|
6
|
+
* here so Discord/email adapters can ship beside Slack without mixing concerns.
|
|
7
|
+
*/
|
|
8
|
+
export { defineSlackChannel, requiredSlackScopes, toChannelManifest, } from "./define.js";
|
|
9
|
+
export type { ChannelManifest, RequiredSlackChannelConfig, SlackChannelConfig, SlackChannelDefinition, SlackChannelFilters, SlackChannelTrigger, SlackConversationMapping, SlackConversationPolicy, SlackMentionBehavior, } from "./define.js";
|
|
10
|
+
export { decodeSlackEscaping, normalizeSlackEvent, verifySlackRequest, } from "./normalize.js";
|
|
11
|
+
export type { NormalizeSlackEventInput, NormalizeSlackEventResult, SlackInstallationContext, SlackSignatureHeaders, } from "./normalize.js";
|
|
12
|
+
export { createSlackWebApiTransport, setSlackAssistantStatus, DEFAULT_ASSISTANT_STATUS, DEFAULT_LOADING_MESSAGES, SLACK_API_BASE_ENV, } from "./transport.js";
|
|
13
|
+
export type { SetSlackAssistantStatusOptions, SlackWebApiTransportOptions, } from "./transport.js";
|
|
14
|
+
export { handleSlackEventsRequest, invokeChannelAgent, stableThreadId, SLACK_SIGNING_SECRET_ENV, SLACK_API_APP_ID_ENV, SLACK_TEAM_ID_ENV, SLACK_BOT_USER_ID_ENV, } from "./http.js";
|
|
15
|
+
export type { InvokeChannelAgentInput, InvokeChannelAgentResult, SlackChannelHttpConfig, } from "./http.js";
|
|
16
|
+
export { decodeSlackSourceThreadKey, encodeSlackSourceThreadKey, slackGroupingId, } from "./source-thread.js";
|
|
17
|
+
export type { InstallationKind, SlackSourceThreadParts, SourceThreadMode, } from "./source-thread.js";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack channel integration.
|
|
3
|
+
*
|
|
4
|
+
* Shared channel-neutral contracts live in `managed-deepagents/channels`.
|
|
5
|
+
* Provider-specific authoring, normalization, and source-thread encoding live
|
|
6
|
+
* here so Discord/email adapters can ship beside Slack without mixing concerns.
|
|
7
|
+
*/
|
|
8
|
+
export { defineSlackChannel, requiredSlackScopes, toChannelManifest, } from "./define.js";
|
|
9
|
+
export { decodeSlackEscaping, normalizeSlackEvent, verifySlackRequest, } from "./normalize.js";
|
|
10
|
+
export { createSlackWebApiTransport, setSlackAssistantStatus, DEFAULT_ASSISTANT_STATUS, DEFAULT_LOADING_MESSAGES, SLACK_API_BASE_ENV, } from "./transport.js";
|
|
11
|
+
export { handleSlackEventsRequest, invokeChannelAgent, stableThreadId, SLACK_SIGNING_SECRET_ENV, SLACK_API_APP_ID_ENV, SLACK_TEAM_ID_ENV, SLACK_BOT_USER_ID_ENV, } from "./http.js";
|
|
12
|
+
export { decodeSlackSourceThreadKey, encodeSlackSourceThreadKey, slackGroupingId, } from "./source-thread.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/slack/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAarB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAOnB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 { type InstallationKind, type SourceThreadMode } from "./source-thread.js";
|
|
8
|
+
import type { ChannelEvent } from "../types.js";
|
|
9
|
+
import type { RequiredSlackChannelConfig, SlackChannelTrigger } from "./define.js";
|
|
10
|
+
export interface SlackSignatureHeaders {
|
|
11
|
+
signature: string;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SlackInstallationContext {
|
|
15
|
+
kind: InstallationKind;
|
|
16
|
+
id: string;
|
|
17
|
+
/** Workspace context for the conversation (team_id or context_team_id). */
|
|
18
|
+
contextTeamId: string;
|
|
19
|
+
/** Bot user id used to filter the adapter's own messages. */
|
|
20
|
+
botUserId?: string;
|
|
21
|
+
apiAppId: string;
|
|
22
|
+
}
|
|
23
|
+
export interface NormalizeSlackEventInput {
|
|
24
|
+
body: unknown;
|
|
25
|
+
config: RequiredSlackChannelConfig;
|
|
26
|
+
installation: SlackInstallationContext;
|
|
27
|
+
deliveryId: string;
|
|
28
|
+
/** When true, treat `message` events as `message.im` (DM surface). */
|
|
29
|
+
isDirectMessageSurface?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export type NormalizeSlackEventResult = {
|
|
32
|
+
status: "url_verification";
|
|
33
|
+
challenge: string;
|
|
34
|
+
} | {
|
|
35
|
+
status: "filtered";
|
|
36
|
+
reason: string;
|
|
37
|
+
eventId?: string;
|
|
38
|
+
} | {
|
|
39
|
+
status: "accepted";
|
|
40
|
+
event: ChannelEvent;
|
|
41
|
+
actorId: string;
|
|
42
|
+
tenantId?: string;
|
|
43
|
+
sourceThreadKey: string;
|
|
44
|
+
trigger: SlackChannelTrigger;
|
|
45
|
+
groupingMode: SourceThreadMode;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Verify a Slack request signature over the exact raw body bytes.
|
|
49
|
+
*
|
|
50
|
+
* Computes HMAC-SHA256 of `v0:{timestamp}:{raw_body}` and compares safely.
|
|
51
|
+
* Rejects timestamps older than five minutes.
|
|
52
|
+
*/
|
|
53
|
+
export declare function verifySlackRequest(rawBody: string | Uint8Array, headers: SlackSignatureHeaders, signingSecret: string, nowSeconds?: number): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Normalize a verified Slack Events API payload into a channel-neutral event.
|
|
56
|
+
*
|
|
57
|
+
* Filters bot/system/unsupported shapes and applies declarative trigger/filters.
|
|
58
|
+
*/
|
|
59
|
+
export declare function normalizeSlackEvent(input: NormalizeSlackEventInput): NormalizeSlackEventResult;
|
|
60
|
+
/** Decode Slack transport escaping (`&` `<` `>`). */
|
|
61
|
+
export declare function decodeSlackEscaping(text: string): string;
|
|
62
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/normalize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EACV,0BAA0B,EAC1B,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,0BAA0B,CAAC;IACnC,YAAY,EAAE,wBAAwB,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,YAAY,EAAE,gBAAgB,CAAC;CAChC,CAAC;AAEN;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,OAAO,EAAE,qBAAqB,EAC9B,aAAa,EAAE,MAAM,EACrB,UAAU,GAAE,MAAsC,GACjD,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,yBAAyB,CAiM3B;AAyFD,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxD"}
|