@framers/agentos 0.1.26 → 0.1.28

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 (79) hide show
  1. package/dist/api/AgentOSOrchestrator.js +1 -1
  2. package/dist/api/AgentOSOrchestrator.js.map +1 -1
  3. package/dist/channels/ChannelRouter.d.ts.map +1 -1
  4. package/dist/channels/ChannelRouter.js +1 -1
  5. package/dist/channels/ChannelRouter.js.map +1 -1
  6. package/dist/channels/IChannelAdapter.d.ts.map +1 -1
  7. package/dist/channels/adapters/BaseChannelAdapter.d.ts +130 -0
  8. package/dist/channels/adapters/BaseChannelAdapter.d.ts.map +1 -0
  9. package/dist/channels/adapters/BaseChannelAdapter.js +257 -0
  10. package/dist/channels/adapters/BaseChannelAdapter.js.map +1 -0
  11. package/dist/channels/adapters/DiscordChannelAdapter.d.ts +86 -0
  12. package/dist/channels/adapters/DiscordChannelAdapter.d.ts.map +1 -0
  13. package/dist/channels/adapters/DiscordChannelAdapter.js +550 -0
  14. package/dist/channels/adapters/DiscordChannelAdapter.js.map +1 -0
  15. package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts +117 -0
  16. package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts.map +1 -0
  17. package/dist/channels/adapters/GoogleChatChannelAdapter.js +632 -0
  18. package/dist/channels/adapters/GoogleChatChannelAdapter.js.map +1 -0
  19. package/dist/channels/adapters/IRCChannelAdapter.d.ts +86 -0
  20. package/dist/channels/adapters/IRCChannelAdapter.d.ts.map +1 -0
  21. package/dist/channels/adapters/IRCChannelAdapter.js +253 -0
  22. package/dist/channels/adapters/IRCChannelAdapter.js.map +1 -0
  23. package/dist/channels/adapters/RedditChannelAdapter.d.ts +123 -0
  24. package/dist/channels/adapters/RedditChannelAdapter.d.ts.map +1 -0
  25. package/dist/channels/adapters/RedditChannelAdapter.js +516 -0
  26. package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -0
  27. package/dist/channels/adapters/SignalChannelAdapter.d.ts +120 -0
  28. package/dist/channels/adapters/SignalChannelAdapter.d.ts.map +1 -0
  29. package/dist/channels/adapters/SignalChannelAdapter.js +521 -0
  30. package/dist/channels/adapters/SignalChannelAdapter.js.map +1 -0
  31. package/dist/channels/adapters/SlackChannelAdapter.d.ts +96 -0
  32. package/dist/channels/adapters/SlackChannelAdapter.d.ts.map +1 -0
  33. package/dist/channels/adapters/SlackChannelAdapter.js +535 -0
  34. package/dist/channels/adapters/SlackChannelAdapter.js.map +1 -0
  35. package/dist/channels/adapters/TeamsChannelAdapter.d.ts +138 -0
  36. package/dist/channels/adapters/TeamsChannelAdapter.d.ts.map +1 -0
  37. package/dist/channels/adapters/TeamsChannelAdapter.js +639 -0
  38. package/dist/channels/adapters/TeamsChannelAdapter.js.map +1 -0
  39. package/dist/channels/adapters/TelegramChannelAdapter.d.ts +83 -0
  40. package/dist/channels/adapters/TelegramChannelAdapter.d.ts.map +1 -0
  41. package/dist/channels/adapters/TelegramChannelAdapter.js +463 -0
  42. package/dist/channels/adapters/TelegramChannelAdapter.js.map +1 -0
  43. package/dist/channels/adapters/TwitterChannelAdapter.d.ts +117 -0
  44. package/dist/channels/adapters/TwitterChannelAdapter.d.ts.map +1 -0
  45. package/dist/channels/adapters/TwitterChannelAdapter.js +489 -0
  46. package/dist/channels/adapters/TwitterChannelAdapter.js.map +1 -0
  47. package/dist/channels/adapters/WebChatChannelAdapter.d.ts +141 -0
  48. package/dist/channels/adapters/WebChatChannelAdapter.d.ts.map +1 -0
  49. package/dist/channels/adapters/WebChatChannelAdapter.js +539 -0
  50. package/dist/channels/adapters/WebChatChannelAdapter.js.map +1 -0
  51. package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts +122 -0
  52. package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts.map +1 -0
  53. package/dist/channels/adapters/WhatsAppChannelAdapter.js +643 -0
  54. package/dist/channels/adapters/WhatsAppChannelAdapter.js.map +1 -0
  55. package/dist/channels/adapters/index.d.ts +34 -0
  56. package/dist/channels/adapters/index.d.ts.map +1 -0
  57. package/dist/channels/adapters/index.js +25 -0
  58. package/dist/channels/adapters/index.js.map +1 -0
  59. package/dist/channels/index.d.ts +24 -0
  60. package/dist/channels/index.d.ts.map +1 -1
  61. package/dist/channels/index.js +16 -0
  62. package/dist/channels/index.js.map +1 -1
  63. package/dist/cognitive_substrate/personas/metaprompt_presets.d.ts.map +1 -1
  64. package/dist/cognitive_substrate/personas/metaprompt_presets.js +0 -2
  65. package/dist/cognitive_substrate/personas/metaprompt_presets.js.map +1 -1
  66. package/dist/core/provenance/crypto/HashChain.d.ts.map +1 -1
  67. package/dist/core/provenance/enforcement/AutonomyGuard.d.ts.map +1 -1
  68. package/dist/core/provenance/enforcement/ProvenanceStorageHooks.d.ts.map +1 -1
  69. package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js +2 -1
  70. package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js.map +1 -1
  71. package/dist/core/provenance/ledger/EventTypes.d.ts.map +1 -1
  72. package/dist/core/safety/ToolExecutionGuard.d.ts.map +1 -1
  73. package/dist/core/safety/ToolExecutionGuard.js +0 -1
  74. package/dist/core/safety/ToolExecutionGuard.js.map +1 -1
  75. package/dist/extensions/ExtensionManager.d.ts.map +1 -1
  76. package/dist/extensions/ExtensionManager.js +3 -9
  77. package/dist/extensions/ExtensionManager.js.map +1 -1
  78. package/dist/rag/RetrievalAugmentor.js.map +1 -1
  79. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @fileoverview IRC Channel Adapter for AgentOS.
3
+ *
4
+ * Wraps the `irc-framework` npm package to connect agents to IRC servers.
5
+ * IRC was recently added to OpenClaw upstream — this adapter provides
6
+ * first-class support for the protocol within the channel system.
7
+ *
8
+ * **Dependencies**: Requires `irc-framework` 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 irc = new IRCChannelAdapter();
15
+ * await irc.initialize({
16
+ * platform: 'irc',
17
+ * credential: 'AgentNick', // used as nickname
18
+ * params: {
19
+ * host: 'irc.libera.chat',
20
+ * port: '6697', // TLS by default
21
+ * channels: '#agentos,#wunderland',
22
+ * realname: 'Wunderland Agent',
23
+ * password: '', // server password (optional)
24
+ * },
25
+ * });
26
+ * ```
27
+ *
28
+ * @module @framers/agentos/channels/adapters/IRCChannelAdapter
29
+ */
30
+ import type { ChannelAuthConfig, ChannelCapability, ChannelPlatform, ChannelSendResult, MessageContent } from '../types.js';
31
+ import { BaseChannelAdapter } from './BaseChannelAdapter.js';
32
+ /** Platform-specific parameters for IRC connections. */
33
+ export interface IRCAuthParams extends Record<string, string | undefined> {
34
+ /** IRC server hostname. */
35
+ host: string;
36
+ /** Server port (default: '6697' for TLS). */
37
+ port?: string;
38
+ /** Comma-separated list of channels to auto-join. */
39
+ channels?: string;
40
+ /** GECOS / real-name field. */
41
+ realname?: string;
42
+ /** Server password (not NickServ — use credential for that). */
43
+ password?: string;
44
+ /** Whether to use TLS. Default: 'true'. */
45
+ tls?: string;
46
+ }
47
+ /**
48
+ * Channel adapter for Internet Relay Chat (IRC).
49
+ *
50
+ * Uses the `irc-framework` package via dynamic import so that the
51
+ * dependency is optional — it is only required at runtime when the
52
+ * adapter is actually initialized.
53
+ *
54
+ * Capabilities: `text`, `group_chat`, `channels`, `mentions`.
55
+ * IRC does not natively support rich text, images, reactions, threads,
56
+ * typing indicators, or message editing/deletion.
57
+ */
58
+ export declare class IRCChannelAdapter extends BaseChannelAdapter<IRCAuthParams> {
59
+ readonly platform: ChannelPlatform;
60
+ readonly displayName = "IRC";
61
+ readonly capabilities: readonly ChannelCapability[];
62
+ /** The irc-framework Client instance. Typed as `any` because the
63
+ * package is dynamically imported and may not be installed. */
64
+ private client;
65
+ /** Channels the bot has joined, keyed by lowercase name. */
66
+ private joinedChannels;
67
+ protected doConnect(auth: ChannelAuthConfig & {
68
+ params?: IRCAuthParams;
69
+ }): Promise<void>;
70
+ protected doSendMessage(conversationId: string, content: MessageContent): Promise<ChannelSendResult>;
71
+ protected doShutdown(): Promise<void>;
72
+ /**
73
+ * Join an additional IRC channel at runtime.
74
+ */
75
+ joinChannel(channel: string): void;
76
+ /**
77
+ * Part (leave) an IRC channel.
78
+ */
79
+ partChannel(channel: string, reason?: string): void;
80
+ /**
81
+ * Get the set of channels the bot is currently in.
82
+ */
83
+ getJoinedChannels(): string[];
84
+ private handleIrcMessage;
85
+ }
86
+ //# sourceMappingURL=IRCChannelAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IRCChannelAdapter.d.ts","sourceRoot":"","sources":["../../../src/channels/adapters/IRCChannelAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAEjB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAM7D,wDAAwD;AACxD,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACvE,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB,CAAC,aAAa,CAAC;IACtE,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAS;IAC3C,QAAQ,CAAC,WAAW,SAAS;IAC7B,QAAQ,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAKxC;IAEX;oEACgE;IAEhE,OAAO,CAAC,MAAM,CAAkB;IAEhC,4DAA4D;IAC5D,OAAO,CAAC,cAAc,CAA0B;cAIhC,SAAS,CACvB,IAAI,EAAE,iBAAiB,GAAG;QAAE,MAAM,CAAC,EAAE,aAAa,CAAA;KAAE,GACnD,OAAO,CAAC,IAAI,CAAC;cA0GA,aAAa,CAC3B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;cAyCb,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3C;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOlC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAQnD;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAO7B,OAAO,CAAC,gBAAgB;CA4BzB"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * @fileoverview IRC Channel Adapter for AgentOS.
3
+ *
4
+ * Wraps the `irc-framework` npm package to connect agents to IRC servers.
5
+ * IRC was recently added to OpenClaw upstream — this adapter provides
6
+ * first-class support for the protocol within the channel system.
7
+ *
8
+ * **Dependencies**: Requires `irc-framework` 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 irc = new IRCChannelAdapter();
15
+ * await irc.initialize({
16
+ * platform: 'irc',
17
+ * credential: 'AgentNick', // used as nickname
18
+ * params: {
19
+ * host: 'irc.libera.chat',
20
+ * port: '6697', // TLS by default
21
+ * channels: '#agentos,#wunderland',
22
+ * realname: 'Wunderland Agent',
23
+ * password: '', // server password (optional)
24
+ * },
25
+ * });
26
+ * ```
27
+ *
28
+ * @module @framers/agentos/channels/adapters/IRCChannelAdapter
29
+ */
30
+ import { BaseChannelAdapter } from './BaseChannelAdapter.js';
31
+ // ============================================================================
32
+ // IRCChannelAdapter
33
+ // ============================================================================
34
+ /**
35
+ * Channel adapter for Internet Relay Chat (IRC).
36
+ *
37
+ * Uses the `irc-framework` package via dynamic import so that the
38
+ * dependency is optional — it is only required at runtime when the
39
+ * adapter is actually initialized.
40
+ *
41
+ * Capabilities: `text`, `group_chat`, `channels`, `mentions`.
42
+ * IRC does not natively support rich text, images, reactions, threads,
43
+ * typing indicators, or message editing/deletion.
44
+ */
45
+ export class IRCChannelAdapter extends BaseChannelAdapter {
46
+ constructor() {
47
+ super(...arguments);
48
+ this.platform = 'irc';
49
+ this.displayName = 'IRC';
50
+ this.capabilities = [
51
+ 'text',
52
+ 'group_chat',
53
+ 'channels',
54
+ 'mentions',
55
+ ];
56
+ /** Channels the bot has joined, keyed by lowercase name. */
57
+ this.joinedChannels = new Set();
58
+ }
59
+ // ── Abstract hook implementations ──
60
+ async doConnect(auth) {
61
+ // Dynamic import — fails gracefully if irc-framework is not installed
62
+ let IrcFramework; // eslint-disable-line @typescript-eslint/no-explicit-any
63
+ try {
64
+ IrcFramework = await import('irc-framework');
65
+ }
66
+ catch {
67
+ throw new Error('The "irc-framework" package is required for the IRC adapter. ' +
68
+ 'Install it with: npm install irc-framework');
69
+ }
70
+ const params = auth.params ?? {};
71
+ const host = params.host;
72
+ if (!host) {
73
+ throw new Error('IRC auth params must include "host".');
74
+ }
75
+ const nick = auth.credential;
76
+ if (!nick) {
77
+ throw new Error('IRC credential (nickname) is required.');
78
+ }
79
+ const port = parseInt(params.port ?? '6697', 10);
80
+ const useTls = (params.tls ?? 'true') !== 'false';
81
+ const channelsToJoin = (params.channels ?? '')
82
+ .split(',')
83
+ .map((c) => c.trim())
84
+ .filter(Boolean);
85
+ // Create the IRC client
86
+ const Client = IrcFramework.Client ?? IrcFramework.default?.Client ?? IrcFramework;
87
+ this.client = new Client();
88
+ // Wrap the connection in a promise so we can await it
89
+ await new Promise((resolve, reject) => {
90
+ const connectTimeout = setTimeout(() => {
91
+ reject(new Error(`IRC connection to ${host}:${port} timed out after 30s`));
92
+ }, 30000);
93
+ this.client.on('registered', () => {
94
+ clearTimeout(connectTimeout);
95
+ // Auto-join requested channels
96
+ for (const channel of channelsToJoin) {
97
+ this.client.join(channel);
98
+ }
99
+ resolve();
100
+ });
101
+ this.client.on('error', (err) => {
102
+ clearTimeout(connectTimeout);
103
+ reject(err);
104
+ });
105
+ this.client.on('close', () => {
106
+ if (this.status === 'connected') {
107
+ // Unexpected disconnect — trigger reconnect via base class
108
+ this.setStatus('reconnecting', 'Connection closed unexpectedly');
109
+ this.reconnect().catch((e) => {
110
+ console.error(`[IRC] Reconnect failed:`, e);
111
+ });
112
+ }
113
+ });
114
+ // Wire up inbound message events
115
+ this.client.on('privmsg', (event) => {
116
+ this.handleIrcMessage(event);
117
+ });
118
+ // Track channel joins
119
+ this.client.on('join', (event) => {
120
+ if (event.nick === nick) {
121
+ this.joinedChannels.add(event.channel.toLowerCase());
122
+ }
123
+ });
124
+ // Track channel parts
125
+ this.client.on('part', (event) => {
126
+ if (event.nick === nick) {
127
+ this.joinedChannels.delete(event.channel.toLowerCase());
128
+ }
129
+ });
130
+ this.client.connect({
131
+ host,
132
+ port,
133
+ nick,
134
+ gecos: params.realname ?? `AgentOS IRC (${nick})`,
135
+ password: params.password || undefined,
136
+ tls: useTls,
137
+ auto_reconnect: false, // We handle reconnection in BaseChannelAdapter
138
+ });
139
+ });
140
+ // Populate platform info
141
+ this.platformInfo = {
142
+ nick,
143
+ host,
144
+ port,
145
+ tls: useTls,
146
+ channels: channelsToJoin,
147
+ };
148
+ }
149
+ async doSendMessage(conversationId, content) {
150
+ if (!this.client) {
151
+ throw new Error('[IRC] Client is not connected.');
152
+ }
153
+ // Extract text from content blocks (IRC only supports plain text)
154
+ const textParts = [];
155
+ for (const block of content.blocks) {
156
+ if (block.type === 'text') {
157
+ textParts.push(block.text);
158
+ }
159
+ else if (block.type === 'image' || block.type === 'video' || block.type === 'document') {
160
+ // For media blocks, send the URL as a fallback
161
+ const url = 'url' in block ? block.url : undefined;
162
+ if (url) {
163
+ const caption = 'caption' in block && block.caption ? `${block.caption}: ` : '';
164
+ textParts.push(`${caption}${url}`);
165
+ }
166
+ }
167
+ }
168
+ const fullText = textParts.join('\n');
169
+ if (!fullText) {
170
+ throw new Error('[IRC] Cannot send empty message.');
171
+ }
172
+ // IRC messages have a ~512-byte line limit; split into multiple lines
173
+ const lines = fullText.split('\n');
174
+ for (const line of lines) {
175
+ if (line.trim()) {
176
+ this.client.say(conversationId, line);
177
+ }
178
+ }
179
+ // IRC does not provide message IDs; generate a synthetic one
180
+ const syntheticId = `irc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
181
+ return {
182
+ messageId: syntheticId,
183
+ timestamp: new Date().toISOString(),
184
+ };
185
+ }
186
+ async doShutdown() {
187
+ if (this.client) {
188
+ try {
189
+ this.client.quit('AgentOS shutting down');
190
+ }
191
+ catch {
192
+ // Best effort — connection may already be dead
193
+ }
194
+ this.client = undefined;
195
+ }
196
+ this.joinedChannels.clear();
197
+ }
198
+ // ── IRC-specific helpers ──
199
+ /**
200
+ * Join an additional IRC channel at runtime.
201
+ */
202
+ joinChannel(channel) {
203
+ if (!this.client || this.status !== 'connected') {
204
+ throw new Error('[IRC] Cannot join channel — not connected.');
205
+ }
206
+ this.client.join(channel);
207
+ }
208
+ /**
209
+ * Part (leave) an IRC channel.
210
+ */
211
+ partChannel(channel, reason) {
212
+ if (!this.client || this.status !== 'connected') {
213
+ throw new Error('[IRC] Cannot part channel — not connected.');
214
+ }
215
+ this.client.part(channel, reason ?? '');
216
+ this.joinedChannels.delete(channel.toLowerCase());
217
+ }
218
+ /**
219
+ * Get the set of channels the bot is currently in.
220
+ */
221
+ getJoinedChannels() {
222
+ return [...this.joinedChannels];
223
+ }
224
+ // ── Private ──
225
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
226
+ handleIrcMessage(event) {
227
+ const isChannel = event.target?.startsWith('#') || event.target?.startsWith('&');
228
+ const conversationId = event.target ?? event.nick ?? 'unknown';
229
+ const message = {
230
+ messageId: `irc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
231
+ platform: 'irc',
232
+ conversationId,
233
+ conversationType: isChannel ? 'channel' : 'direct',
234
+ sender: {
235
+ id: event.nick ?? 'unknown',
236
+ displayName: event.nick,
237
+ username: event.nick,
238
+ },
239
+ content: [{ type: 'text', text: event.message ?? '' }],
240
+ text: event.message ?? '',
241
+ timestamp: new Date().toISOString(),
242
+ rawEvent: event,
243
+ };
244
+ this.emit({
245
+ type: 'message',
246
+ platform: 'irc',
247
+ conversationId,
248
+ timestamp: message.timestamp,
249
+ data: message,
250
+ });
251
+ }
252
+ }
253
+ //# sourceMappingURL=IRCChannelAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IRCChannelAdapter.js","sourceRoot":"","sources":["../../../src/channels/adapters/IRCChannelAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @fileoverview Reddit Channel Adapter for AgentOS.
3
+ *
4
+ * Wraps the Reddit API (via `snoowrap`) to allow agents to submit
5
+ * posts, comments, and interact with subreddits. Uses dynamic import
6
+ * so that `snoowrap` is only loaded at connection time.
7
+ *
8
+ * Reddit's API has strict rate limits (60 requests per minute for
9
+ * OAuth apps). The adapter tracks and respects these limits with a
10
+ * request queue.
11
+ *
12
+ * **Dependencies**: Requires `snoowrap` to be installed.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const reddit = new RedditChannelAdapter();
17
+ * await reddit.initialize({
18
+ * platform: 'reddit',
19
+ * credential: '<client_id>',
20
+ * params: {
21
+ * clientSecret: 'your-client-secret',
22
+ * username: 'bot_username',
23
+ * password: 'bot_password',
24
+ * userAgent: 'agentos:v1.0 (by /u/your_username)',
25
+ * },
26
+ * });
27
+ * ```
28
+ *
29
+ * @module @framers/agentos/channels/adapters/RedditChannelAdapter
30
+ */
31
+ import type { ChannelAuthConfig, ChannelCapability, ChannelPlatform, ChannelSendResult, MessageContent } from '../types.js';
32
+ import { BaseChannelAdapter } from './BaseChannelAdapter.js';
33
+ /** Platform-specific authentication parameters for Reddit. */
34
+ export interface RedditAuthParams extends Record<string, string | undefined> {
35
+ /** OAuth2 client secret. */
36
+ clientSecret: string;
37
+ /** Reddit account username for the bot. */
38
+ username: string;
39
+ /** Reddit account password for the bot. */
40
+ password: string;
41
+ /** User-Agent string (required by Reddit API TOS). */
42
+ userAgent: string;
43
+ }
44
+ /**
45
+ * Channel adapter for Reddit.
46
+ *
47
+ * Uses the `snoowrap` package via dynamic import so the dependency
48
+ * is optional. Falls back to raw `fetch` against the Reddit OAuth2
49
+ * API if snoowrap is unavailable.
50
+ *
51
+ * Capabilities: `text`, `rich_text`, `images`, `video`, `reactions`,
52
+ * `threads`, `group_chat`, `hashtags`, `polls`.
53
+ *
54
+ * Conversation ID mapping:
55
+ * - Subreddit post: `r/<subreddit>` or `post:<thing_id>`
56
+ * - Comment reply: `comment:<thing_id>`
57
+ * - Direct message: `dm:<username>`
58
+ */
59
+ export declare class RedditChannelAdapter extends BaseChannelAdapter<RedditAuthParams> {
60
+ readonly platform: ChannelPlatform;
61
+ readonly displayName = "Reddit";
62
+ readonly capabilities: readonly ChannelCapability[];
63
+ private client;
64
+ /** Whether we're using snoowrap or raw fetch. */
65
+ private usingSnoowrap;
66
+ /** OAuth2 access token for raw fetch fallback. */
67
+ private accessToken;
68
+ private tokenExpiresAt;
69
+ private storedAuth;
70
+ /** Authenticated user info. */
71
+ private authenticatedUser;
72
+ /** Rate-limit: requests remaining in the current window. */
73
+ private rateLimitRemaining;
74
+ private rateLimitResetAt;
75
+ /** Polling interval for inbox messages. */
76
+ private pollTimer;
77
+ private lastInboxTimestamp;
78
+ protected doConnect(auth: ChannelAuthConfig & {
79
+ params?: RedditAuthParams;
80
+ }): Promise<void>;
81
+ protected doSendMessage(conversationId: string, content: MessageContent): Promise<ChannelSendResult>;
82
+ protected doShutdown(): Promise<void>;
83
+ /**
84
+ * Submit a new post to a subreddit.
85
+ */
86
+ submitPost(subreddit: string, content: MessageContent): Promise<ChannelSendResult>;
87
+ /**
88
+ * Upvote a post or comment.
89
+ */
90
+ upvote(thingId: string): Promise<void>;
91
+ /**
92
+ * Downvote a post or comment.
93
+ */
94
+ downvote(thingId: string): Promise<void>;
95
+ /**
96
+ * Get information about the authenticated user.
97
+ */
98
+ getAuthenticatedUser(): {
99
+ name: string;
100
+ id: string;
101
+ } | undefined;
102
+ private submitPostSnoowrap;
103
+ private replyToComment;
104
+ private replyToPost;
105
+ private sendPrivateMessage;
106
+ private authenticateRaw;
107
+ private ensureAccessToken;
108
+ private redditApiRequest;
109
+ private submitPostRaw;
110
+ private startPolling;
111
+ private stopPolling;
112
+ private pollInbox;
113
+ private extractText;
114
+ /**
115
+ * Extract the first line as a title. Reddit requires titles for posts.
116
+ */
117
+ private extractTitle;
118
+ /**
119
+ * Extract everything after the first line as the body.
120
+ */
121
+ private extractBody;
122
+ }
123
+ //# sourceMappingURL=RedditChannelAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedditChannelAdapter.d.ts","sourceRoot":"","sources":["../../../src/channels/adapters/RedditChannelAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;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,8DAA8D;AAC9D,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1E,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,oBAAqB,SAAQ,kBAAkB,CAAC,gBAAgB,CAAC;IAC5E,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAY;IAC9C,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAUxC;IAGX,OAAO,CAAC,MAAM,CAAkB;IAEhC,iDAAiD;IACjD,OAAO,CAAC,aAAa,CAAS;IAE9B,kDAAkD;IAClD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAAkE;IAEpF,+BAA+B;IAC/B,OAAO,CAAC,iBAAiB,CAA2C;IAEpE,4DAA4D;IAC5D,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAE7B,2CAA2C;IAC3C,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,kBAAkB,CAAK;cAIf,SAAS,CACvB,IAAI,EAAE,iBAAiB,GAAG;QAAE,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAAE,GACtD,OAAO,CAAC,IAAI,CAAC;cAmEA,aAAa,CAC3B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;cAsBb,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3C;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IAc7B;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9C;;OAEG;IACH,oBAAoB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;YAMlD,kBAAkB;YAgDlB,cAAc;YA4Bd,WAAW;YA4BX,kBAAkB;YA8BlB,eAAe;YAwCf,iBAAiB;YAcjB,gBAAgB;YAwDhB,aAAa;IA+B3B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;YAOL,SAAS;IAwDvB,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB"}