@framers/agentos 0.1.27 → 0.1.29

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.
Files changed (60) hide show
  1. package/dist/channels/adapters/BaseChannelAdapter.d.ts +130 -0
  2. package/dist/channels/adapters/BaseChannelAdapter.d.ts.map +1 -0
  3. package/dist/channels/adapters/BaseChannelAdapter.js +257 -0
  4. package/dist/channels/adapters/BaseChannelAdapter.js.map +1 -0
  5. package/dist/channels/adapters/DiscordChannelAdapter.d.ts +86 -0
  6. package/dist/channels/adapters/DiscordChannelAdapter.d.ts.map +1 -0
  7. package/dist/channels/adapters/DiscordChannelAdapter.js +550 -0
  8. package/dist/channels/adapters/DiscordChannelAdapter.js.map +1 -0
  9. package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts +117 -0
  10. package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts.map +1 -0
  11. package/dist/channels/adapters/GoogleChatChannelAdapter.js +632 -0
  12. package/dist/channels/adapters/GoogleChatChannelAdapter.js.map +1 -0
  13. package/dist/channels/adapters/IRCChannelAdapter.d.ts +86 -0
  14. package/dist/channels/adapters/IRCChannelAdapter.d.ts.map +1 -0
  15. package/dist/channels/adapters/IRCChannelAdapter.js +253 -0
  16. package/dist/channels/adapters/IRCChannelAdapter.js.map +1 -0
  17. package/dist/channels/adapters/RedditChannelAdapter.d.ts +123 -0
  18. package/dist/channels/adapters/RedditChannelAdapter.d.ts.map +1 -0
  19. package/dist/channels/adapters/RedditChannelAdapter.js +516 -0
  20. package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -0
  21. package/dist/channels/adapters/SignalChannelAdapter.d.ts +120 -0
  22. package/dist/channels/adapters/SignalChannelAdapter.d.ts.map +1 -0
  23. package/dist/channels/adapters/SignalChannelAdapter.js +521 -0
  24. package/dist/channels/adapters/SignalChannelAdapter.js.map +1 -0
  25. package/dist/channels/adapters/SlackChannelAdapter.d.ts +96 -0
  26. package/dist/channels/adapters/SlackChannelAdapter.d.ts.map +1 -0
  27. package/dist/channels/adapters/SlackChannelAdapter.js +535 -0
  28. package/dist/channels/adapters/SlackChannelAdapter.js.map +1 -0
  29. package/dist/channels/adapters/TeamsChannelAdapter.d.ts +138 -0
  30. package/dist/channels/adapters/TeamsChannelAdapter.d.ts.map +1 -0
  31. package/dist/channels/adapters/TeamsChannelAdapter.js +639 -0
  32. package/dist/channels/adapters/TeamsChannelAdapter.js.map +1 -0
  33. package/dist/channels/adapters/TelegramChannelAdapter.d.ts +83 -0
  34. package/dist/channels/adapters/TelegramChannelAdapter.d.ts.map +1 -0
  35. package/dist/channels/adapters/TelegramChannelAdapter.js +463 -0
  36. package/dist/channels/adapters/TelegramChannelAdapter.js.map +1 -0
  37. package/dist/channels/adapters/TwitterChannelAdapter.d.ts +117 -0
  38. package/dist/channels/adapters/TwitterChannelAdapter.d.ts.map +1 -0
  39. package/dist/channels/adapters/TwitterChannelAdapter.js +489 -0
  40. package/dist/channels/adapters/TwitterChannelAdapter.js.map +1 -0
  41. package/dist/channels/adapters/WebChatChannelAdapter.d.ts +141 -0
  42. package/dist/channels/adapters/WebChatChannelAdapter.d.ts.map +1 -0
  43. package/dist/channels/adapters/WebChatChannelAdapter.js +539 -0
  44. package/dist/channels/adapters/WebChatChannelAdapter.js.map +1 -0
  45. package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts +122 -0
  46. package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts.map +1 -0
  47. package/dist/channels/adapters/WhatsAppChannelAdapter.js +643 -0
  48. package/dist/channels/adapters/WhatsAppChannelAdapter.js.map +1 -0
  49. package/dist/channels/adapters/index.d.ts +34 -0
  50. package/dist/channels/adapters/index.d.ts.map +1 -0
  51. package/dist/channels/adapters/index.js +25 -0
  52. package/dist/channels/adapters/index.js.map +1 -0
  53. package/dist/channels/index.d.ts +24 -0
  54. package/dist/channels/index.d.ts.map +1 -1
  55. package/dist/channels/index.js +16 -0
  56. package/dist/channels/index.js.map +1 -1
  57. package/dist/cognitive_substrate/GMIManager.d.ts.map +1 -1
  58. package/dist/cognitive_substrate/GMIManager.js +0 -2
  59. package/dist/cognitive_substrate/GMIManager.js.map +1 -1
  60. package/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @fileoverview Abstract base class for channel adapters.
3
+ *
4
+ * Provides common infrastructure that all concrete adapters share:
5
+ * - Connection state machine (disconnected -> connecting -> connected)
6
+ * - Retry logic with exponential back-off
7
+ * - Event handler registration and dispatch
8
+ * - Lifecycle management (initialize, shutdown, reconnect)
9
+ *
10
+ * Subclasses implement three abstract methods:
11
+ * `doConnect()`, `doSendMessage()`, `doShutdown()`
12
+ *
13
+ * @module @framers/agentos/channels/adapters/BaseChannelAdapter
14
+ */
15
+ import type { IChannelAdapter } from '../IChannelAdapter.js';
16
+ import type { ChannelAuthConfig, ChannelCapability, ChannelConnectionInfo, ChannelConnectionStatus, ChannelEvent, ChannelEventHandler, ChannelEventType, ChannelPlatform, ChannelSendResult, MessageContent } from '../types.js';
17
+ /** Options governing connection retry behaviour. */
18
+ export interface RetryConfig {
19
+ /** Maximum number of retry attempts before giving up. Default: 5. */
20
+ maxRetries: number;
21
+ /** Initial delay in milliseconds before the first retry. Default: 1000. */
22
+ baseDelayMs: number;
23
+ /** Upper-bound delay in milliseconds. Default: 30_000. */
24
+ maxDelayMs: number;
25
+ /** Jitter factor (0-1) applied to each delay. Default: 0.25. */
26
+ jitterFactor: number;
27
+ }
28
+ /**
29
+ * Abstract base class that implements common {@link IChannelAdapter}
30
+ * behaviour. Concrete adapters (Telegram, Discord, IRC, ...) extend this
31
+ * class and implement the three abstract hooks:
32
+ *
33
+ * - `doConnect(auth)` -- establish the platform connection.
34
+ * - `doSendMessage(conversationId, content)` -- deliver a message.
35
+ * - `doShutdown()` -- tear down the platform connection.
36
+ *
37
+ * @typeParam TAuthParams - Shape of the platform-specific `params` object
38
+ * inside {@link ChannelAuthConfig}. Defaults to `Record<string, string>`.
39
+ */
40
+ export declare abstract class BaseChannelAdapter<TAuthParams extends Record<string, string | undefined> = Record<string, string>> implements IChannelAdapter {
41
+ abstract readonly platform: ChannelPlatform;
42
+ abstract readonly displayName: string;
43
+ abstract readonly capabilities: readonly ChannelCapability[];
44
+ protected status: ChannelConnectionStatus;
45
+ protected connectedSince: string | undefined;
46
+ protected errorMessage: string | undefined;
47
+ protected platformInfo: Record<string, unknown>;
48
+ /** Stored auth config so `reconnect()` can re-use it. */
49
+ protected auth: (ChannelAuthConfig & {
50
+ params?: TAuthParams;
51
+ }) | undefined;
52
+ protected readonly retryConfig: RetryConfig;
53
+ private retryCount;
54
+ private retryTimer;
55
+ private subscriptions;
56
+ constructor(retryConfig?: Partial<RetryConfig>);
57
+ /**
58
+ * Establish the platform connection using the supplied credentials.
59
+ * Called by {@link initialize} after state has been set to `connecting`.
60
+ * Must throw on failure — the base class handles retry and state changes.
61
+ */
62
+ protected abstract doConnect(auth: ChannelAuthConfig & {
63
+ params?: TAuthParams;
64
+ }): Promise<void>;
65
+ /**
66
+ * Deliver a message to the external platform.
67
+ * Called by {@link sendMessage} only when the adapter is `connected`.
68
+ */
69
+ protected abstract doSendMessage(conversationId: string, content: MessageContent): Promise<ChannelSendResult>;
70
+ /**
71
+ * Release platform resources (close WebSocket, stop polling, etc.).
72
+ * Called by {@link shutdown} before the state transitions to `disconnected`.
73
+ */
74
+ protected abstract doShutdown(): Promise<void>;
75
+ /**
76
+ * Initialize the adapter with auth credentials. If already connected this
77
+ * will shut down the existing connection first (idempotent).
78
+ */
79
+ initialize(auth: ChannelAuthConfig): Promise<void>;
80
+ /**
81
+ * Gracefully shut down the adapter and release all resources.
82
+ */
83
+ shutdown(): Promise<void>;
84
+ /**
85
+ * Manually trigger a reconnection attempt using stored credentials.
86
+ * Useful for UI-driven "reconnect" buttons.
87
+ */
88
+ reconnect(): Promise<void>;
89
+ getConnectionInfo(): ChannelConnectionInfo;
90
+ sendMessage(conversationId: string, content: MessageContent): Promise<ChannelSendResult>;
91
+ /**
92
+ * Default stub — platforms that support typing indicators should override.
93
+ */
94
+ sendTypingIndicator(_conversationId: string, _isTyping: boolean): Promise<void>;
95
+ /**
96
+ * Register an event handler. Returns an unsubscribe function.
97
+ */
98
+ on(handler: ChannelEventHandler, eventTypes?: ChannelEventType[]): () => void;
99
+ /**
100
+ * Emit an event to all matching subscribers.
101
+ * Subclasses call this when the platform SDK receives an inbound event.
102
+ */
103
+ protected emit(event: ChannelEvent): void;
104
+ /**
105
+ * Convenience helper: emit a `connection_change` event with the current
106
+ * status. Called automatically by {@link setStatus}.
107
+ */
108
+ protected emitConnectionChange(): void;
109
+ /**
110
+ * Check whether this adapter declares a specific capability.
111
+ */
112
+ protected hasCapability(cap: ChannelCapability): boolean;
113
+ /**
114
+ * Transition to a new connection status and emit an event.
115
+ */
116
+ protected setStatus(newStatus: ChannelConnectionStatus, error?: string): void;
117
+ /**
118
+ * Single connection attempt with automatic retry on failure.
119
+ */
120
+ private attemptConnect;
121
+ /**
122
+ * Calculate next retry delay using exponential back-off with jitter.
123
+ *
124
+ * delay = min(baseDelay * 2^(retryCount-1), maxDelay) * (1 +/- jitter)
125
+ */
126
+ private calculateBackoff;
127
+ private clearRetryState;
128
+ private sleep;
129
+ }
130
+ //# sourceMappingURL=BaseChannelAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseChannelAdapter.d.ts","sourceRoot":"","sources":["../../../src/channels/adapters/BaseChannelAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * @fileoverview Abstract base class for channel adapters.
3
+ *
4
+ * Provides common infrastructure that all concrete adapters share:
5
+ * - Connection state machine (disconnected -> connecting -> connected)
6
+ * - Retry logic with exponential back-off
7
+ * - Event handler registration and dispatch
8
+ * - Lifecycle management (initialize, shutdown, reconnect)
9
+ *
10
+ * Subclasses implement three abstract methods:
11
+ * `doConnect()`, `doSendMessage()`, `doShutdown()`
12
+ *
13
+ * @module @framers/agentos/channels/adapters/BaseChannelAdapter
14
+ */
15
+ const DEFAULT_RETRY_CONFIG = {
16
+ maxRetries: 5,
17
+ baseDelayMs: 1000,
18
+ maxDelayMs: 30000,
19
+ jitterFactor: 0.25,
20
+ };
21
+ // ============================================================================
22
+ // BaseChannelAdapter
23
+ // ============================================================================
24
+ /**
25
+ * Abstract base class that implements common {@link IChannelAdapter}
26
+ * behaviour. Concrete adapters (Telegram, Discord, IRC, ...) extend this
27
+ * class and implement the three abstract hooks:
28
+ *
29
+ * - `doConnect(auth)` -- establish the platform connection.
30
+ * - `doSendMessage(conversationId, content)` -- deliver a message.
31
+ * - `doShutdown()` -- tear down the platform connection.
32
+ *
33
+ * @typeParam TAuthParams - Shape of the platform-specific `params` object
34
+ * inside {@link ChannelAuthConfig}. Defaults to `Record<string, string>`.
35
+ */
36
+ export class BaseChannelAdapter {
37
+ // ── Constructor ──
38
+ constructor(retryConfig) {
39
+ // ── Connection state ──
40
+ this.status = 'disconnected';
41
+ this.platformInfo = {};
42
+ this.retryCount = 0;
43
+ // ── Event subscriptions ──
44
+ this.subscriptions = new Set();
45
+ this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };
46
+ }
47
+ // ════════════════════════════════════════════════════════════════════════
48
+ // IChannelAdapter — Lifecycle
49
+ // ════════════════════════════════════════════════════════════════════════
50
+ /**
51
+ * Initialize the adapter with auth credentials. If already connected this
52
+ * will shut down the existing connection first (idempotent).
53
+ */
54
+ async initialize(auth) {
55
+ // Idempotency: tear down any previous connection
56
+ if (this.status === 'connected' || this.status === 'reconnecting') {
57
+ await this.shutdown();
58
+ }
59
+ this.auth = auth;
60
+ this.clearRetryState();
61
+ await this.attemptConnect();
62
+ }
63
+ /**
64
+ * Gracefully shut down the adapter and release all resources.
65
+ */
66
+ async shutdown() {
67
+ this.clearRetryState();
68
+ if (this.status === 'disconnected')
69
+ return;
70
+ try {
71
+ await this.doShutdown();
72
+ }
73
+ catch (err) {
74
+ // Best-effort shutdown — log and continue
75
+ console.error(`[${this.displayName}] Error during shutdown:`, err);
76
+ }
77
+ finally {
78
+ this.setStatus('disconnected');
79
+ this.connectedSince = undefined;
80
+ }
81
+ }
82
+ /**
83
+ * Manually trigger a reconnection attempt using stored credentials.
84
+ * Useful for UI-driven "reconnect" buttons.
85
+ */
86
+ async reconnect() {
87
+ if (!this.auth) {
88
+ throw new Error(`[${this.displayName}] Cannot reconnect — adapter has never been initialized.`);
89
+ }
90
+ if (this.status === 'connected') {
91
+ await this.shutdown();
92
+ }
93
+ this.clearRetryState();
94
+ await this.attemptConnect();
95
+ }
96
+ // ════════════════════════════════════════════════════════════════════════
97
+ // IChannelAdapter — Connection Info
98
+ // ════════════════════════════════════════════════════════════════════════
99
+ getConnectionInfo() {
100
+ return {
101
+ status: this.status,
102
+ connectedSince: this.connectedSince,
103
+ errorMessage: this.errorMessage,
104
+ platformInfo: { ...this.platformInfo },
105
+ };
106
+ }
107
+ // ════════════════════════════════════════════════════════════════════════
108
+ // IChannelAdapter — Outbound Messaging
109
+ // ════════════════════════════════════════════════════════════════════════
110
+ async sendMessage(conversationId, content) {
111
+ if (this.status !== 'connected') {
112
+ throw new Error(`[${this.displayName}] Cannot send message — adapter is ${this.status}, not connected.`);
113
+ }
114
+ return this.doSendMessage(conversationId, content);
115
+ }
116
+ /**
117
+ * Default stub — platforms that support typing indicators should override.
118
+ */
119
+ async sendTypingIndicator(_conversationId, _isTyping) {
120
+ // No-op by default. Subclasses override if capability is declared.
121
+ }
122
+ // ════════════════════════════════════════════════════════════════════════
123
+ // IChannelAdapter — Event Handling
124
+ // ════════════════════════════════════════════════════════════════════════
125
+ /**
126
+ * Register an event handler. Returns an unsubscribe function.
127
+ */
128
+ on(handler, eventTypes) {
129
+ const sub = { handler, eventTypes };
130
+ this.subscriptions.add(sub);
131
+ return () => {
132
+ this.subscriptions.delete(sub);
133
+ };
134
+ }
135
+ // ════════════════════════════════════════════════════════════════════════
136
+ // Protected helpers for subclasses
137
+ // ════════════════════════════════════════════════════════════════════════
138
+ /**
139
+ * Emit an event to all matching subscribers.
140
+ * Subclasses call this when the platform SDK receives an inbound event.
141
+ */
142
+ emit(event) {
143
+ for (const sub of this.subscriptions) {
144
+ // Filter by event types if the subscription specified a filter
145
+ if (sub.eventTypes && !sub.eventTypes.includes(event.type)) {
146
+ continue;
147
+ }
148
+ try {
149
+ // Fire-and-forget; errors in handlers should not crash the adapter
150
+ const result = sub.handler(event);
151
+ if (result && typeof result.catch === 'function') {
152
+ result.catch((err) => {
153
+ console.error(`[${this.displayName}] Unhandled error in event handler:`, err);
154
+ });
155
+ }
156
+ }
157
+ catch (err) {
158
+ console.error(`[${this.displayName}] Synchronous error in event handler:`, err);
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * Convenience helper: emit a `connection_change` event with the current
164
+ * status. Called automatically by {@link setStatus}.
165
+ */
166
+ emitConnectionChange() {
167
+ this.emit({
168
+ type: 'connection_change',
169
+ platform: this.platform,
170
+ conversationId: '',
171
+ timestamp: new Date().toISOString(),
172
+ data: {
173
+ status: this.status,
174
+ errorMessage: this.errorMessage,
175
+ },
176
+ });
177
+ }
178
+ /**
179
+ * Check whether this adapter declares a specific capability.
180
+ */
181
+ hasCapability(cap) {
182
+ return this.capabilities.includes(cap);
183
+ }
184
+ /**
185
+ * Transition to a new connection status and emit an event.
186
+ */
187
+ setStatus(newStatus, error) {
188
+ const prev = this.status;
189
+ this.status = newStatus;
190
+ this.errorMessage = error;
191
+ if (newStatus === 'connected' && prev !== 'connected') {
192
+ this.connectedSince = new Date().toISOString();
193
+ }
194
+ this.emitConnectionChange();
195
+ }
196
+ // ════════════════════════════════════════════════════════════════════════
197
+ // Private — Connection and Retry Logic
198
+ // ════════════════════════════════════════════════════════════════════════
199
+ /**
200
+ * Single connection attempt with automatic retry on failure.
201
+ */
202
+ async attemptConnect() {
203
+ if (!this.auth)
204
+ return;
205
+ this.setStatus(this.retryCount === 0 ? 'connecting' : 'reconnecting');
206
+ try {
207
+ await this.doConnect(this.auth);
208
+ // Success
209
+ this.retryCount = 0;
210
+ this.setStatus('connected');
211
+ }
212
+ catch (err) {
213
+ const message = err instanceof Error ? err.message : String(err);
214
+ console.error(`[${this.displayName}] Connection attempt ${this.retryCount + 1} failed: ${message}`);
215
+ this.retryCount++;
216
+ if (this.retryCount > this.retryConfig.maxRetries) {
217
+ // Exhausted all retries
218
+ this.setStatus('error', `Failed after ${this.retryConfig.maxRetries} retries: ${message}`);
219
+ return;
220
+ }
221
+ // Schedule retry with exponential back-off + jitter
222
+ const delay = this.calculateBackoff();
223
+ console.warn(`[${this.displayName}] Retrying in ${delay}ms (attempt ${this.retryCount}/${this.retryConfig.maxRetries})...`);
224
+ await this.sleep(delay);
225
+ // Guard: shutdown may have been called while we were sleeping
226
+ if (this.status === 'disconnected')
227
+ return;
228
+ await this.attemptConnect();
229
+ }
230
+ }
231
+ /**
232
+ * Calculate next retry delay using exponential back-off with jitter.
233
+ *
234
+ * delay = min(baseDelay * 2^(retryCount-1), maxDelay) * (1 +/- jitter)
235
+ */
236
+ calculateBackoff() {
237
+ const { baseDelayMs, maxDelayMs, jitterFactor } = this.retryConfig;
238
+ const exponential = baseDelayMs * Math.pow(2, this.retryCount - 1);
239
+ const clamped = Math.min(exponential, maxDelayMs);
240
+ // Apply jitter: uniformly between (1-j)*clamped and (1+j)*clamped
241
+ const jitter = 1 + (Math.random() * 2 - 1) * jitterFactor;
242
+ return Math.round(clamped * jitter);
243
+ }
244
+ clearRetryState() {
245
+ this.retryCount = 0;
246
+ if (this.retryTimer) {
247
+ clearTimeout(this.retryTimer);
248
+ this.retryTimer = undefined;
249
+ }
250
+ }
251
+ sleep(ms) {
252
+ return new Promise((resolve) => {
253
+ this.retryTimer = setTimeout(resolve, ms);
254
+ });
255
+ }
256
+ }
257
+ //# sourceMappingURL=BaseChannelAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseChannelAdapter.js","sourceRoot":"","sources":["../../../src/channels/adapters/BaseChannelAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @fileoverview Discord Channel Adapter for AgentOS.
3
+ *
4
+ * Wraps the `discord.js` npm package to connect agents to Discord servers.
5
+ * Supports rich messaging including text, embeds, images, video, audio,
6
+ * reactions, threads, mentions, buttons, and message management.
7
+ *
8
+ * **Dependencies**: Requires `discord.js` to be installed. The adapter
9
+ * uses a dynamic import so the package is only loaded at connection time,
10
+ * avoiding hard failures if it is not present.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const discord = new DiscordChannelAdapter();
15
+ * await discord.initialize({
16
+ * platform: 'discord',
17
+ * credential: 'DISCORD_BOT_TOKEN',
18
+ * params: {
19
+ * botToken: 'DISCORD_BOT_TOKEN',
20
+ * applicationId: 'APP_ID',
21
+ * guildId: 'OPTIONAL_GUILD_ID',
22
+ * },
23
+ * });
24
+ * ```
25
+ *
26
+ * @module @framers/agentos/channels/adapters/DiscordChannelAdapter
27
+ */
28
+ import type { ChannelAuthConfig, ChannelCapability, ChannelPlatform, ChannelSendResult, MessageContent } from '../types.js';
29
+ import { BaseChannelAdapter } from './BaseChannelAdapter.js';
30
+ /** Platform-specific parameters for Discord connections. */
31
+ export interface DiscordAuthParams extends Record<string, string | undefined> {
32
+ /** Bot token. If provided, overrides credential. */
33
+ botToken?: string;
34
+ /** Discord application ID. */
35
+ applicationId?: string;
36
+ /** Optional guild (server) ID to scope interactions to a single guild. */
37
+ guildId?: string;
38
+ /** Comma-separated list of additional gateway intents. */
39
+ intents?: string;
40
+ }
41
+ /**
42
+ * Channel adapter for Discord using the discord.js SDK.
43
+ *
44
+ * Uses dynamic import so `discord.js` is only required at runtime when the
45
+ * adapter is actually initialized.
46
+ *
47
+ * Capabilities: text, rich_text, images, video, audio, embeds, reactions,
48
+ * threads, mentions, buttons, group_chat, channels, editing, deletion.
49
+ */
50
+ export declare class DiscordChannelAdapter extends BaseChannelAdapter<DiscordAuthParams> {
51
+ readonly platform: ChannelPlatform;
52
+ readonly displayName = "Discord";
53
+ readonly capabilities: readonly ChannelCapability[];
54
+ /** The discord.js Client instance. */
55
+ private client;
56
+ /** discord.js module reference for building embeds, buttons, etc. */
57
+ private djs;
58
+ protected doConnect(auth: ChannelAuthConfig & {
59
+ params?: DiscordAuthParams;
60
+ }): Promise<void>;
61
+ protected doSendMessage(conversationId: string, content: MessageContent): Promise<ChannelSendResult>;
62
+ protected doShutdown(): Promise<void>;
63
+ editMessage(conversationId: string, messageId: string, content: MessageContent): Promise<void>;
64
+ deleteMessage(conversationId: string, messageId: string): Promise<void>;
65
+ addReaction(conversationId: string, messageId: string, emoji: string): Promise<void>;
66
+ sendTypingIndicator(conversationId: string, _isTyping: boolean): Promise<void>;
67
+ getConversationInfo(conversationId: string): Promise<{
68
+ name?: string;
69
+ memberCount?: number;
70
+ isGroup: boolean;
71
+ metadata?: Record<string, unknown>;
72
+ }>;
73
+ /**
74
+ * Wire up discord.js event handlers for inbound messages and interactions.
75
+ */
76
+ private wireEventHandlers;
77
+ /**
78
+ * Handle an inbound discord.js Message and emit a channel event.
79
+ */
80
+ private handleInboundMessage;
81
+ /**
82
+ * Build a discord.js message payload from MessageContent.
83
+ */
84
+ private buildMessagePayload;
85
+ }
86
+ //# sourceMappingURL=DiscordChannelAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscordChannelAdapter.d.ts","sourceRoot":"","sources":["../../../src/channels/adapters/DiscordChannelAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAEjB,eAAe,EACf,iBAAiB,EACjB,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAM7D,4DAA4D;AAC5D,MAAM,WAAW,iBAAkB,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3E,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,SAAQ,kBAAkB,CAAC,iBAAiB,CAAC;IAC9E,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAa;IAC/C,QAAQ,CAAC,WAAW,aAAa;IACjC,QAAQ,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAexC;IAEX,sCAAsC;IAEtC,OAAO,CAAC,MAAM,CAAkB;IAEhC,qEAAqE;IAErE,OAAO,CAAC,GAAG,CAAkB;cAIb,SAAS,CACvB,IAAI,EAAE,iBAAiB,GAAG;QAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,GACvD,OAAO,CAAC,IAAI,CAAC;cA4FA,aAAa,CAC3B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;cA+Bb,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAerC,WAAW,CACf,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IAeV,aAAa,CACjB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAYV,WAAW,CACf,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAUV,mBAAmB,CACvB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAaV,mBAAmB,CACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAuBzG;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4GzB;;OAEG;IAEH,OAAO,CAAC,oBAAoB;IAmG5B;;OAEG;IAEH,OAAO,CAAC,mBAAmB;CAgH5B"}