@mono-agent/slack-adapter 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -0
- package/dist/adapter.d.ts +124 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +370 -0
- package/dist/adapter.js.map +1 -0
- package/dist/config.d.ts +46 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +119 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/message-stream.d.ts +54 -0
- package/dist/message-stream.d.ts.map +1 -0
- package/dist/message-stream.js +169 -0
- package/dist/message-stream.js.map +1 -0
- package/dist/slack-client.d.ts +44 -0
- package/dist/slack-client.d.ts.map +1 -0
- package/dist/slack-client.js +204 -0
- package/dist/slack-client.js.map +1 -0
- package/dist/slack-markdown.d.ts +2 -0
- package/dist/slack-markdown.d.ts.map +1 -0
- package/dist/slack-markdown.js +82 -0
- package/dist/slack-markdown.js.map +1 -0
- package/dist/socket-mode-runner.d.ts +50 -0
- package/dist/socket-mode-runner.d.ts.map +1 -0
- package/dist/socket-mode-runner.js +222 -0
- package/dist/socket-mode-runner.js.map +1 -0
- package/dist/start.d.ts +59 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +101 -0
- package/dist/start.js.map +1 -0
- package/dist/types.d.ts +89 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# @mono-agent/slack-adapter
|
|
2
|
+
|
|
3
|
+
Category: `communication`
|
|
4
|
+
|
|
5
|
+
## Category
|
|
6
|
+
|
|
7
|
+
Communication adapter.
|
|
8
|
+
|
|
9
|
+
## Responsibility
|
|
10
|
+
|
|
11
|
+
Adapt Slack Socket Mode events into structural agent requests and streamed Slack replies. The package owns Slack-specific credentials, channel allowlists, mention cleanup, Web API calls, and Socket Mode message handling.
|
|
12
|
+
|
|
13
|
+
## Install / Usage
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pnpm --filter @mono-agent/slack-adapter run build
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Adapter settings can be loaded from nested JSON under `slack` or explicit environment variables such as `MONO_AGENT_SLACK_BOT_TOKEN`, `MONO_AGENT_SLACK_APP_TOKEN`, and `MONO_AGENT_SLACK_ALLOWED_CHANNEL_IDS`.
|
|
20
|
+
|
|
21
|
+
## Public API
|
|
22
|
+
|
|
23
|
+
- `slackFieldGroup`
|
|
24
|
+
- `loadSlackAdapterConfig`
|
|
25
|
+
- `redactSlackAdapterConfig`
|
|
26
|
+
- Slack config, event, Web API, and Socket Mode types
|
|
27
|
+
- Message stream and Slack client helpers
|
|
28
|
+
|
|
29
|
+
## Dependency Boundary
|
|
30
|
+
|
|
31
|
+
This package may depend on core agent contracts/settings plus Slack transport dependencies. It must not depend on the agent harness, runtime adapter, operator surfaces, other communication adapters, or host/demo code.
|
|
32
|
+
|
|
33
|
+
## What This Package Does Not Own
|
|
34
|
+
|
|
35
|
+
It does not own model execution, memory, prompt context, tool policy, browser/terminal operator surfaces, Slack app provisioning, or workspace-level authorization policy beyond explicit local adapter allowlists.
|
|
36
|
+
|
|
37
|
+
## Verification
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pnpm --filter @mono-agent/slack-adapter run build
|
|
41
|
+
pnpm --filter @mono-agent/slack-adapter run typecheck
|
|
42
|
+
pnpm --filter @mono-agent/slack-adapter run test
|
|
43
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { type AgentRequestBase, type AgentResponder as SharedAgentResponder, type AgentResponse } from "@mono-agent/agent-contracts";
|
|
2
|
+
import { type AgentMessageStream, type SlackMessageStreamLogger } from "./message-stream.js";
|
|
3
|
+
import type { SlackChannelId, SlackEventCallback, SlackMessageTs, SlackUserId, SlackWebApi } from "./types.js";
|
|
4
|
+
export type SlackTriggerKind = "direct" | "app_mention";
|
|
5
|
+
export interface AgentRequest extends AgentRequestBase {
|
|
6
|
+
conversationId: string;
|
|
7
|
+
channelId: SlackChannelId;
|
|
8
|
+
messageTs: SlackMessageTs;
|
|
9
|
+
threadTs: SlackMessageTs;
|
|
10
|
+
eventId: string;
|
|
11
|
+
teamId?: string;
|
|
12
|
+
userId?: SlackUserId;
|
|
13
|
+
text: string;
|
|
14
|
+
trigger: SlackTriggerKind;
|
|
15
|
+
abortSignal: AbortSignal;
|
|
16
|
+
metadata: {
|
|
17
|
+
slack: SlackRequestMetadata;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface SlackRequestMetadata {
|
|
22
|
+
teamId?: string;
|
|
23
|
+
apiAppId?: string;
|
|
24
|
+
eventId: string;
|
|
25
|
+
eventTime?: number;
|
|
26
|
+
channel: {
|
|
27
|
+
id: SlackChannelId;
|
|
28
|
+
type?: string;
|
|
29
|
+
};
|
|
30
|
+
message: {
|
|
31
|
+
ts: SlackMessageTs;
|
|
32
|
+
threadTs?: SlackMessageTs;
|
|
33
|
+
eventTs?: SlackMessageTs;
|
|
34
|
+
};
|
|
35
|
+
user?: {
|
|
36
|
+
id: SlackUserId;
|
|
37
|
+
};
|
|
38
|
+
trigger: SlackTriggerKind;
|
|
39
|
+
}
|
|
40
|
+
export type { AgentResponse };
|
|
41
|
+
export type AgentResponder = SharedAgentResponder<AgentRequest, AgentMessageStream, AgentResponse>;
|
|
42
|
+
export interface SlackAdapterMessages {
|
|
43
|
+
welcomeText?: string;
|
|
44
|
+
helpText?: string;
|
|
45
|
+
busyText?: string;
|
|
46
|
+
unauthorizedText?: string;
|
|
47
|
+
cancelledText?: string;
|
|
48
|
+
errorText?: string;
|
|
49
|
+
unsupportedText?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface SlackAdapterStreamOptions {
|
|
52
|
+
initialStatusText?: string;
|
|
53
|
+
editDebounceMs?: number;
|
|
54
|
+
maxMessageChars?: number;
|
|
55
|
+
}
|
|
56
|
+
export interface SlackAdapterLogger extends SlackMessageStreamLogger {
|
|
57
|
+
debug?(message: string, metadata?: Record<string, unknown>): void;
|
|
58
|
+
info?(message: string, metadata?: Record<string, unknown>): void;
|
|
59
|
+
}
|
|
60
|
+
export interface SlackAdapterOptions {
|
|
61
|
+
api: SlackWebApi;
|
|
62
|
+
responder: AgentResponder;
|
|
63
|
+
allowedChannelIds?: SlackChannelId[];
|
|
64
|
+
allowAllChannels?: boolean;
|
|
65
|
+
botUserIds?: SlackUserId[];
|
|
66
|
+
mentionTextAliases?: string[];
|
|
67
|
+
stripMentionText?: boolean;
|
|
68
|
+
stream?: SlackAdapterStreamOptions;
|
|
69
|
+
messages?: SlackAdapterMessages;
|
|
70
|
+
logger?: SlackAdapterLogger;
|
|
71
|
+
}
|
|
72
|
+
export type SlackEventIgnoredReason = "unsupported_event" | "unsupported_message" | "empty_text" | "from_bot" | "from_self";
|
|
73
|
+
export type SlackEventHandlingResult = {
|
|
74
|
+
kind: "handled";
|
|
75
|
+
eventId: string;
|
|
76
|
+
channelId: SlackChannelId;
|
|
77
|
+
action: "command" | "responded";
|
|
78
|
+
command?: "start" | "help";
|
|
79
|
+
trigger: SlackTriggerKind;
|
|
80
|
+
metadata?: Record<string, unknown>;
|
|
81
|
+
} | {
|
|
82
|
+
kind: "ignored";
|
|
83
|
+
reason: SlackEventIgnoredReason;
|
|
84
|
+
eventId?: string;
|
|
85
|
+
channelId?: SlackChannelId;
|
|
86
|
+
} | {
|
|
87
|
+
kind: "unauthorized";
|
|
88
|
+
eventId: string;
|
|
89
|
+
channelId: SlackChannelId;
|
|
90
|
+
} | {
|
|
91
|
+
kind: "busy";
|
|
92
|
+
eventId: string;
|
|
93
|
+
channelId: SlackChannelId;
|
|
94
|
+
} | {
|
|
95
|
+
kind: "cancelled";
|
|
96
|
+
eventId: string;
|
|
97
|
+
channelId: SlackChannelId;
|
|
98
|
+
} | {
|
|
99
|
+
kind: "error";
|
|
100
|
+
eventId: string;
|
|
101
|
+
channelId?: SlackChannelId;
|
|
102
|
+
error: unknown;
|
|
103
|
+
};
|
|
104
|
+
export declare class SlackAdapter {
|
|
105
|
+
private readonly api;
|
|
106
|
+
private readonly responder;
|
|
107
|
+
private readonly allowAllChannels;
|
|
108
|
+
private readonly allowedChannelIds;
|
|
109
|
+
private readonly botUserIds;
|
|
110
|
+
private readonly rawBotUserIds;
|
|
111
|
+
private readonly mentionTextAliases;
|
|
112
|
+
private readonly stripMentionText;
|
|
113
|
+
private readonly streamOptions;
|
|
114
|
+
private readonly messages;
|
|
115
|
+
private readonly logger;
|
|
116
|
+
private readonly activeRuns;
|
|
117
|
+
constructor(options: SlackAdapterOptions);
|
|
118
|
+
handleEventCallback(callback: SlackEventCallback): Promise<SlackEventHandlingResult>;
|
|
119
|
+
private respondToEvent;
|
|
120
|
+
private normalizeEventCallback;
|
|
121
|
+
private prepareText;
|
|
122
|
+
private isAuthorized;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,cAAc,IAAI,oBAAoB,EAC3C,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAE9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,aAAa,CAAC;AAExD,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE;QACR,KAAK,EAAE,oBAAoB,CAAC;QAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE;QACP,EAAE,EAAE,cAAc,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,EAAE;QACP,EAAE,EAAE,cAAc,CAAC;QACnB,QAAQ,CAAC,EAAE,cAAc,CAAC;QAC1B,OAAO,CAAC,EAAE,cAAc,CAAC;KAC1B,CAAC;IACF,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,WAAW,CAAC;KACjB,CAAC;IACF,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,YAAY,EAAE,aAAa,EAAE,CAAC;AAC9B,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC,YAAY,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IAClE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,WAAW,CAAC;IACjB,SAAS,EAAE,cAAc,CAAC;IAC1B,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,MAAM,uBAAuB,GAC/B,mBAAmB,GACnB,qBAAqB,GACrB,YAAY,GACZ,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,cAAc,CAAC;CAC3B,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,cAAc,CAAC;CAC3B,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,cAAc,CAAC;CAC3B,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAqCN,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;gBAE/C,OAAO,EAAE,mBAAmB;IAyBlC,mBAAmB,CACvB,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,wBAAwB,CAAC;YAsGtB,cAAc;IAyE5B,OAAO,CAAC,sBAAsB;IAiE9B,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,YAAY;CAGrB"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { isAgentResponseCancelledError, } from "@mono-agent/agent-contracts";
|
|
2
|
+
import { SlackMessageStream, } from "./message-stream.js";
|
|
3
|
+
const DEFAULT_MESSAGES = {
|
|
4
|
+
welcomeText: "Hello! Send me a Slack message and I will pass it to the configured agent.",
|
|
5
|
+
helpText: "Send a Slack DM or mention the app in a channel. Use /cancel in a thread to stop the current response.",
|
|
6
|
+
busyText: "I am still working on this Slack thread. Use /cancel to stop it.",
|
|
7
|
+
unauthorizedText: "This Slack channel is not authorized to use this bot.",
|
|
8
|
+
cancelledText: "Cancelled.",
|
|
9
|
+
errorText: "The agent failed while processing your Slack message.",
|
|
10
|
+
unsupportedText: "I can only handle Slack text messages in this adapter for now.",
|
|
11
|
+
};
|
|
12
|
+
export class SlackAdapter {
|
|
13
|
+
api;
|
|
14
|
+
responder;
|
|
15
|
+
allowAllChannels;
|
|
16
|
+
allowedChannelIds;
|
|
17
|
+
botUserIds;
|
|
18
|
+
rawBotUserIds;
|
|
19
|
+
mentionTextAliases;
|
|
20
|
+
stripMentionText;
|
|
21
|
+
streamOptions;
|
|
22
|
+
messages;
|
|
23
|
+
logger;
|
|
24
|
+
activeRuns = new Map();
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.api = options.api;
|
|
27
|
+
this.responder = options.responder;
|
|
28
|
+
this.allowAllChannels = options.allowAllChannels === true;
|
|
29
|
+
this.allowedChannelIds = new Set(options.allowedChannelIds?.map((channelId) => normalizeIdForMatch(channelId)) ?? []);
|
|
30
|
+
this.botUserIds = new Set(options.botUserIds?.map((userId) => normalizeIdForMatch(userId)) ?? []);
|
|
31
|
+
this.rawBotUserIds = options.botUserIds ?? [];
|
|
32
|
+
this.mentionTextAliases = options.mentionTextAliases ?? [];
|
|
33
|
+
this.stripMentionText =
|
|
34
|
+
options.stripMentionText ?? (this.botUserIds.size > 0 || this.mentionTextAliases.length > 0);
|
|
35
|
+
this.streamOptions = options.stream ?? {};
|
|
36
|
+
this.messages = { ...DEFAULT_MESSAGES, ...options.messages };
|
|
37
|
+
this.logger = options.logger;
|
|
38
|
+
if (!this.allowAllChannels && this.allowedChannelIds.size === 0) {
|
|
39
|
+
throw new TypeError("SlackAdapter requires allowedChannelIds or allowAllChannels: true.");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async handleEventCallback(callback) {
|
|
43
|
+
const normalized = this.normalizeEventCallback(callback);
|
|
44
|
+
if (normalized.kind === "ignored") {
|
|
45
|
+
return normalized;
|
|
46
|
+
}
|
|
47
|
+
const event = normalized.event;
|
|
48
|
+
if (!this.isAuthorized(event.channelId)) {
|
|
49
|
+
await this.api.chatPostMessage({
|
|
50
|
+
channel: event.channelId,
|
|
51
|
+
text: this.messages.unauthorizedText,
|
|
52
|
+
thread_ts: event.threadTs,
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
kind: "unauthorized",
|
|
56
|
+
eventId: event.eventId,
|
|
57
|
+
channelId: event.channelId,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const text = event.text.trim();
|
|
61
|
+
if (text.length === 0) {
|
|
62
|
+
await this.api.chatPostMessage({
|
|
63
|
+
channel: event.channelId,
|
|
64
|
+
text: this.messages.unsupportedText,
|
|
65
|
+
thread_ts: event.threadTs,
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
kind: "ignored",
|
|
69
|
+
reason: "empty_text",
|
|
70
|
+
eventId: event.eventId,
|
|
71
|
+
channelId: event.channelId,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const command = parseCommand(text);
|
|
75
|
+
if (command?.name === "start") {
|
|
76
|
+
await this.api.chatPostMessage({
|
|
77
|
+
channel: event.channelId,
|
|
78
|
+
text: this.messages.welcomeText,
|
|
79
|
+
thread_ts: event.threadTs,
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
kind: "handled",
|
|
83
|
+
eventId: event.eventId,
|
|
84
|
+
channelId: event.channelId,
|
|
85
|
+
action: "command",
|
|
86
|
+
command: "start",
|
|
87
|
+
trigger: event.trigger,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (command?.name === "help") {
|
|
91
|
+
await this.api.chatPostMessage({
|
|
92
|
+
channel: event.channelId,
|
|
93
|
+
text: this.messages.helpText,
|
|
94
|
+
thread_ts: event.threadTs,
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
kind: "handled",
|
|
98
|
+
eventId: event.eventId,
|
|
99
|
+
channelId: event.channelId,
|
|
100
|
+
action: "command",
|
|
101
|
+
command: "help",
|
|
102
|
+
trigger: event.trigger,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const runKey = runKeyFor(event);
|
|
106
|
+
const activeRun = this.activeRuns.get(runKey);
|
|
107
|
+
if (command?.name === "cancel") {
|
|
108
|
+
if (activeRun !== undefined) {
|
|
109
|
+
activeRun.controller.abort(new Error("Cancelled by Slack user."));
|
|
110
|
+
}
|
|
111
|
+
await this.api.chatPostMessage({
|
|
112
|
+
channel: event.channelId,
|
|
113
|
+
text: this.messages.cancelledText,
|
|
114
|
+
thread_ts: event.threadTs,
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
kind: "cancelled",
|
|
118
|
+
eventId: event.eventId,
|
|
119
|
+
channelId: event.channelId,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (activeRun !== undefined) {
|
|
123
|
+
await this.api.chatPostMessage({
|
|
124
|
+
channel: event.channelId,
|
|
125
|
+
text: this.messages.busyText,
|
|
126
|
+
thread_ts: event.threadTs,
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
kind: "busy",
|
|
130
|
+
eventId: event.eventId,
|
|
131
|
+
channelId: event.channelId,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return await this.respondToEvent(event, text, runKey);
|
|
135
|
+
}
|
|
136
|
+
async respondToEvent(event, text, runKey) {
|
|
137
|
+
const controller = new AbortController();
|
|
138
|
+
const activeRun = { controller };
|
|
139
|
+
this.activeRuns.set(runKey, activeRun);
|
|
140
|
+
const streamOptions = {
|
|
141
|
+
api: this.api,
|
|
142
|
+
channelId: event.channelId,
|
|
143
|
+
threadTs: event.threadTs,
|
|
144
|
+
};
|
|
145
|
+
if (this.streamOptions.initialStatusText !== undefined) {
|
|
146
|
+
streamOptions.initialStatusText = this.streamOptions.initialStatusText;
|
|
147
|
+
}
|
|
148
|
+
if (this.streamOptions.editDebounceMs !== undefined) {
|
|
149
|
+
streamOptions.editDebounceMs = this.streamOptions.editDebounceMs;
|
|
150
|
+
}
|
|
151
|
+
if (this.streamOptions.maxMessageChars !== undefined) {
|
|
152
|
+
streamOptions.maxMessageChars = this.streamOptions.maxMessageChars;
|
|
153
|
+
}
|
|
154
|
+
if (this.logger !== undefined) {
|
|
155
|
+
streamOptions.logger = this.logger;
|
|
156
|
+
}
|
|
157
|
+
const stream = new SlackMessageStream(streamOptions);
|
|
158
|
+
try {
|
|
159
|
+
await stream.status(this.streamOptions.initialStatusText ?? "Thinking...");
|
|
160
|
+
if (controller.signal.aborted) {
|
|
161
|
+
await stream.finish(this.messages.cancelledText);
|
|
162
|
+
return { kind: "cancelled", eventId: event.eventId, channelId: event.channelId };
|
|
163
|
+
}
|
|
164
|
+
const request = buildAgentRequest(event, text, controller.signal);
|
|
165
|
+
const response = await this.responder.respond(request, stream);
|
|
166
|
+
if (controller.signal.aborted) {
|
|
167
|
+
await stream.finish(this.messages.cancelledText);
|
|
168
|
+
return { kind: "cancelled", eventId: event.eventId, channelId: event.channelId };
|
|
169
|
+
}
|
|
170
|
+
await stream.finish(response.text);
|
|
171
|
+
const result = {
|
|
172
|
+
kind: "handled",
|
|
173
|
+
eventId: event.eventId,
|
|
174
|
+
channelId: event.channelId,
|
|
175
|
+
action: "responded",
|
|
176
|
+
trigger: event.trigger,
|
|
177
|
+
};
|
|
178
|
+
if (response.metadata !== undefined) {
|
|
179
|
+
result.metadata = response.metadata;
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (controller.signal.aborted || isAgentResponseCancelledError(error)) {
|
|
185
|
+
await finishSafely(stream, this.messages.cancelledText, this.logger);
|
|
186
|
+
return { kind: "cancelled", eventId: event.eventId, channelId: event.channelId };
|
|
187
|
+
}
|
|
188
|
+
this.logger?.error?.("Slack adapter responder failed.", {
|
|
189
|
+
error: error instanceof Error ? error.message : String(error),
|
|
190
|
+
});
|
|
191
|
+
await finishSafely(stream, this.messages.errorText, this.logger);
|
|
192
|
+
return { kind: "error", eventId: event.eventId, channelId: event.channelId, error };
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
if (this.activeRuns.get(runKey) === activeRun) {
|
|
196
|
+
this.activeRuns.delete(runKey);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
normalizeEventCallback(callback) {
|
|
201
|
+
const rawEvent = callback.event;
|
|
202
|
+
const eventType = rawEvent.type;
|
|
203
|
+
const trigger = triggerFromEvent(rawEvent);
|
|
204
|
+
if (trigger === undefined) {
|
|
205
|
+
return ignored("unsupported_event", callback, rawEvent);
|
|
206
|
+
}
|
|
207
|
+
if (rawEvent.bot_id !== undefined) {
|
|
208
|
+
return ignored("from_bot", callback, rawEvent);
|
|
209
|
+
}
|
|
210
|
+
if (rawEvent.user !== undefined && this.botUserIds.has(normalizeIdForMatch(rawEvent.user))) {
|
|
211
|
+
return ignored("from_self", callback, rawEvent);
|
|
212
|
+
}
|
|
213
|
+
if (rawEvent.subtype !== undefined) {
|
|
214
|
+
return ignored("unsupported_message", callback, rawEvent);
|
|
215
|
+
}
|
|
216
|
+
if (eventType === "message" &&
|
|
217
|
+
rawEvent.channel_type !== "im") {
|
|
218
|
+
return ignored("unsupported_event", callback, rawEvent);
|
|
219
|
+
}
|
|
220
|
+
if (typeof rawEvent.channel !== "string" ||
|
|
221
|
+
typeof rawEvent.ts !== "string" ||
|
|
222
|
+
typeof rawEvent.text !== "string") {
|
|
223
|
+
return ignored("unsupported_message", callback, rawEvent);
|
|
224
|
+
}
|
|
225
|
+
const threadTs = typeof rawEvent.thread_ts === "string" && rawEvent.thread_ts.trim().length > 0
|
|
226
|
+
? rawEvent.thread_ts
|
|
227
|
+
: rawEvent.ts;
|
|
228
|
+
const event = {
|
|
229
|
+
eventId: callback.event_id,
|
|
230
|
+
channelId: rawEvent.channel,
|
|
231
|
+
text: this.prepareText(rawEvent.text),
|
|
232
|
+
messageTs: rawEvent.ts,
|
|
233
|
+
threadTs,
|
|
234
|
+
trigger,
|
|
235
|
+
};
|
|
236
|
+
if (callback.team_id !== undefined) {
|
|
237
|
+
event.teamId = callback.team_id;
|
|
238
|
+
}
|
|
239
|
+
if (callback.api_app_id !== undefined) {
|
|
240
|
+
event.apiAppId = callback.api_app_id;
|
|
241
|
+
}
|
|
242
|
+
if (callback.event_time !== undefined) {
|
|
243
|
+
event.eventTime = callback.event_time;
|
|
244
|
+
}
|
|
245
|
+
if (rawEvent.channel_type !== undefined) {
|
|
246
|
+
event.channelType = rawEvent.channel_type;
|
|
247
|
+
}
|
|
248
|
+
if (rawEvent.user !== undefined) {
|
|
249
|
+
event.userId = rawEvent.user;
|
|
250
|
+
}
|
|
251
|
+
if (rawEvent.event_ts !== undefined) {
|
|
252
|
+
event.eventTs = rawEvent.event_ts;
|
|
253
|
+
}
|
|
254
|
+
return { kind: "event", event };
|
|
255
|
+
}
|
|
256
|
+
prepareText(text) {
|
|
257
|
+
if (!this.stripMentionText) {
|
|
258
|
+
return text.trim();
|
|
259
|
+
}
|
|
260
|
+
let stripped = text;
|
|
261
|
+
for (const botUserId of this.rawBotUserIds) {
|
|
262
|
+
stripped = stripped.replaceAll(`<@${botUserId}>`, " ");
|
|
263
|
+
}
|
|
264
|
+
for (const alias of this.mentionTextAliases) {
|
|
265
|
+
const normalizedAlias = alias.trim();
|
|
266
|
+
if (normalizedAlias.length > 0) {
|
|
267
|
+
stripped = stripped.replaceAll(normalizedAlias, " ");
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return stripped.replace(/\s+/gu, " ").trim();
|
|
271
|
+
}
|
|
272
|
+
isAuthorized(channelId) {
|
|
273
|
+
return this.allowAllChannels || this.allowedChannelIds.has(normalizeIdForMatch(channelId));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function triggerFromEvent(event) {
|
|
277
|
+
if (event.type === "app_mention") {
|
|
278
|
+
return "app_mention";
|
|
279
|
+
}
|
|
280
|
+
if (event.type === "message" && event.channel_type === "im") {
|
|
281
|
+
return "direct";
|
|
282
|
+
}
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
function ignored(reason, callback, event) {
|
|
286
|
+
const result = {
|
|
287
|
+
kind: "ignored",
|
|
288
|
+
reason,
|
|
289
|
+
eventId: callback.event_id,
|
|
290
|
+
};
|
|
291
|
+
if (event.channel !== undefined) {
|
|
292
|
+
result.channelId = event.channel;
|
|
293
|
+
}
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
function buildAgentRequest(event, text, abortSignal) {
|
|
297
|
+
const metadata = {
|
|
298
|
+
eventId: event.eventId,
|
|
299
|
+
channel: {
|
|
300
|
+
id: event.channelId,
|
|
301
|
+
},
|
|
302
|
+
message: {
|
|
303
|
+
ts: event.messageTs,
|
|
304
|
+
},
|
|
305
|
+
trigger: event.trigger,
|
|
306
|
+
};
|
|
307
|
+
if (event.teamId !== undefined) {
|
|
308
|
+
metadata.teamId = event.teamId;
|
|
309
|
+
}
|
|
310
|
+
if (event.apiAppId !== undefined) {
|
|
311
|
+
metadata.apiAppId = event.apiAppId;
|
|
312
|
+
}
|
|
313
|
+
if (event.eventTime !== undefined) {
|
|
314
|
+
metadata.eventTime = event.eventTime;
|
|
315
|
+
}
|
|
316
|
+
if (event.channelType !== undefined) {
|
|
317
|
+
metadata.channel.type = event.channelType;
|
|
318
|
+
}
|
|
319
|
+
if (event.threadTs !== event.messageTs) {
|
|
320
|
+
metadata.message.threadTs = event.threadTs;
|
|
321
|
+
}
|
|
322
|
+
if (event.eventTs !== undefined) {
|
|
323
|
+
metadata.message.eventTs = event.eventTs;
|
|
324
|
+
}
|
|
325
|
+
if (event.userId !== undefined) {
|
|
326
|
+
metadata.user = { id: event.userId };
|
|
327
|
+
}
|
|
328
|
+
const request = {
|
|
329
|
+
conversationId: `slack:${event.channelId}:${event.threadTs}`,
|
|
330
|
+
channelId: event.channelId,
|
|
331
|
+
messageTs: event.messageTs,
|
|
332
|
+
threadTs: event.threadTs,
|
|
333
|
+
eventId: event.eventId,
|
|
334
|
+
text,
|
|
335
|
+
trigger: event.trigger,
|
|
336
|
+
abortSignal,
|
|
337
|
+
metadata: { slack: metadata },
|
|
338
|
+
};
|
|
339
|
+
if (event.teamId !== undefined) {
|
|
340
|
+
request.teamId = event.teamId;
|
|
341
|
+
}
|
|
342
|
+
if (event.userId !== undefined) {
|
|
343
|
+
request.userId = event.userId;
|
|
344
|
+
}
|
|
345
|
+
return request;
|
|
346
|
+
}
|
|
347
|
+
function parseCommand(text) {
|
|
348
|
+
const match = text.match(/^\/([A-Za-z0-9_]+)(?:\s|$)/u);
|
|
349
|
+
if (match?.[1] === undefined) {
|
|
350
|
+
return undefined;
|
|
351
|
+
}
|
|
352
|
+
return { name: match[1].toLowerCase() };
|
|
353
|
+
}
|
|
354
|
+
async function finishSafely(stream, text, logger) {
|
|
355
|
+
try {
|
|
356
|
+
await stream.finish(text);
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
logger?.error?.("Failed to send Slack terminal stream message.", {
|
|
360
|
+
error: error instanceof Error ? error.message : String(error),
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function runKeyFor(event) {
|
|
365
|
+
return `${event.channelId}:${event.threadTs}`;
|
|
366
|
+
}
|
|
367
|
+
function normalizeIdForMatch(value) {
|
|
368
|
+
return value.trim().toLowerCase();
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { FieldGroup, RedactedSecretValue, SettingsJson } from "@mono-agent/settings";
|
|
2
|
+
export interface SlackAdapterConfig {
|
|
3
|
+
readonly botToken: string;
|
|
4
|
+
readonly appToken: string;
|
|
5
|
+
readonly allowedChannelIds: readonly string[];
|
|
6
|
+
readonly allowAllChannels: boolean;
|
|
7
|
+
readonly botUserIds: readonly string[];
|
|
8
|
+
readonly mentionTextAliases: readonly string[];
|
|
9
|
+
readonly stripMentionText: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface RedactedSlackAdapterConfig {
|
|
12
|
+
readonly botToken: RedactedSecretValue;
|
|
13
|
+
readonly appToken: RedactedSecretValue;
|
|
14
|
+
readonly allowedChannelIds: {
|
|
15
|
+
readonly count: number;
|
|
16
|
+
};
|
|
17
|
+
readonly allowAllChannels: boolean;
|
|
18
|
+
readonly botUserIds: {
|
|
19
|
+
readonly count: number;
|
|
20
|
+
};
|
|
21
|
+
readonly mentionTextAliases: {
|
|
22
|
+
readonly count: number;
|
|
23
|
+
};
|
|
24
|
+
readonly stripMentionText: boolean;
|
|
25
|
+
}
|
|
26
|
+
export type SlackAdapterConfigErrorCode = "missing_required_config" | "invalid_config";
|
|
27
|
+
export interface SlackAdapterConfigErrorDetails {
|
|
28
|
+
readonly code?: SlackAdapterConfigErrorCode;
|
|
29
|
+
readonly env?: string;
|
|
30
|
+
readonly reason?: string;
|
|
31
|
+
readonly [key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
export declare class SlackAdapterConfigError extends Error {
|
|
34
|
+
readonly code: SlackAdapterConfigErrorCode;
|
|
35
|
+
readonly details: SlackAdapterConfigErrorDetails;
|
|
36
|
+
constructor(code: SlackAdapterConfigErrorCode, message: string, details?: SlackAdapterConfigErrorDetails);
|
|
37
|
+
}
|
|
38
|
+
export interface LoadSlackAdapterConfigInput {
|
|
39
|
+
readonly env: Record<string, string | undefined>;
|
|
40
|
+
readonly json?: SettingsJson;
|
|
41
|
+
readonly jsonPath?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare const slackFieldGroup: FieldGroup;
|
|
44
|
+
export declare function loadSlackAdapterConfig(input: LoadSlackAdapterConfigInput): Promise<SlackAdapterConfig>;
|
|
45
|
+
export declare function redactSlackAdapterConfig(config: SlackAdapterConfig): RedactedSlackAdapterConfig;
|
|
46
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACb,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,QAAQ,CAAC,kBAAkB,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,MAAM,2BAA2B,GACnC,yBAAyB,GACzB,gBAAgB,CAAC;AAErB,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,2BAA2B,CAAC;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,8BAA8B,CAAC;gBAG/C,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,8BAAmC;CAO/C;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,eAAe,EAAE,UA0D5B,CAAC;AAcH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAqC7B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,GACzB,0BAA0B,CAU5B"}
|