@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,632 @@
1
+ /**
2
+ * @fileoverview Google Chat Channel Adapter for AgentOS.
3
+ *
4
+ * Integrates with Google Chat (formerly Hangouts Chat) via the
5
+ * Google Chat API. Supports sending messages, cards, and handling
6
+ * incoming events from Google Chat spaces.
7
+ *
8
+ * **Dependencies**: Requires `googleapis` (or `@googleapis/chat`)
9
+ * to be installed. Authentication is done via a Google Cloud
10
+ * service account.
11
+ *
12
+ * The adapter supports two authentication methods:
13
+ * 1. **Service account key file**: Path to a JSON key file.
14
+ * 2. **Credentials object**: Inline JSON credentials (for environments
15
+ * where file access is restricted).
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const gchat = new GoogleChatChannelAdapter();
20
+ * await gchat.initialize({
21
+ * platform: 'google-chat',
22
+ * credential: '/path/to/service-account-key.json',
23
+ * params: {
24
+ * // OR pass inline credentials:
25
+ * // credentials: '{"type":"service_account",...}',
26
+ * },
27
+ * });
28
+ * ```
29
+ *
30
+ * @module @framers/agentos/channels/adapters/GoogleChatChannelAdapter
31
+ */
32
+ import { BaseChannelAdapter } from './BaseChannelAdapter.js';
33
+ // ============================================================================
34
+ // GoogleChatChannelAdapter
35
+ // ============================================================================
36
+ /**
37
+ * Channel adapter for Google Chat.
38
+ *
39
+ * Uses the `googleapis` package via dynamic import.
40
+ *
41
+ * Capabilities: `text`, `rich_text`, `images`, `buttons`, `threads`,
42
+ * `reactions`, `group_chat`.
43
+ *
44
+ * Conversation ID format:
45
+ * - Space: `spaces/<spaceId>` (Google Chat space name)
46
+ * - Thread: pass `replyToMessageId` as the thread key
47
+ */
48
+ export class GoogleChatChannelAdapter extends BaseChannelAdapter {
49
+ constructor() {
50
+ super(...arguments);
51
+ this.platform = 'google-chat';
52
+ this.displayName = 'Google Chat';
53
+ this.capabilities = [
54
+ 'text',
55
+ 'rich_text',
56
+ 'images',
57
+ 'buttons',
58
+ 'threads',
59
+ 'reactions',
60
+ 'group_chat',
61
+ ];
62
+ }
63
+ // ── Abstract hook implementations ──
64
+ async doConnect(auth) {
65
+ const params = auth.params ?? {};
66
+ this.defaultSpace = params.defaultSpace;
67
+ // Dynamic import of googleapis
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
+ let google;
70
+ try {
71
+ const googleapis = await import('googleapis');
72
+ google = googleapis.google ?? googleapis.default?.google ?? googleapis;
73
+ }
74
+ catch {
75
+ throw new Error('The "googleapis" package is required for the Google Chat adapter. ' +
76
+ 'Install it with: npm install googleapis');
77
+ }
78
+ // Authenticate via service account
79
+ try {
80
+ if (params.credentials) {
81
+ // Inline credentials JSON
82
+ const credentialsObj = JSON.parse(params.credentials);
83
+ this.authClient = new google.auth.GoogleAuth({
84
+ credentials: credentialsObj,
85
+ scopes: ['https://www.googleapis.com/auth/chat.bot'],
86
+ });
87
+ }
88
+ else if (auth.credential) {
89
+ // File path to service account key
90
+ this.authClient = new google.auth.GoogleAuth({
91
+ keyFile: auth.credential,
92
+ scopes: ['https://www.googleapis.com/auth/chat.bot'],
93
+ });
94
+ }
95
+ else {
96
+ throw new Error('Google Chat authentication requires either a service account ' +
97
+ 'key file path (credential) or inline credentials (params.credentials).');
98
+ }
99
+ // Create the Chat API client
100
+ this.chatClient = google.chat({
101
+ version: 'v1',
102
+ auth: this.authClient,
103
+ });
104
+ // Verify access by listing spaces (limited to 1)
105
+ const spacesResponse = await this.chatClient.spaces.list({
106
+ pageSize: 1,
107
+ });
108
+ // Try to get bot identity
109
+ try {
110
+ const spaces = spacesResponse.data?.spaces ?? [];
111
+ if (spaces.length > 0) {
112
+ this.botInfo = {
113
+ name: 'AgentOS Bot',
114
+ displayName: 'AgentOS Bot',
115
+ };
116
+ }
117
+ }
118
+ catch {
119
+ // Bot identity fetch is best-effort
120
+ }
121
+ }
122
+ catch (err) {
123
+ if (err instanceof SyntaxError) {
124
+ throw new Error('Invalid JSON in Google Chat credentials. Ensure the credentials ' +
125
+ 'param contains valid service account JSON.');
126
+ }
127
+ const message = err instanceof Error ? err.message : String(err);
128
+ throw new Error(`Google Chat authentication failed: ${message}`);
129
+ }
130
+ this.platformInfo = {
131
+ botName: this.botInfo?.displayName ?? 'AgentOS Bot',
132
+ defaultSpace: this.defaultSpace,
133
+ authMethod: params.credentials ? 'inline-credentials' : 'key-file',
134
+ };
135
+ // Start polling if a default space is configured
136
+ if (this.defaultSpace) {
137
+ this.startPolling();
138
+ }
139
+ }
140
+ async doSendMessage(conversationId, content) {
141
+ if (!this.chatClient) {
142
+ throw new Error('[Google Chat] API client is not initialized.');
143
+ }
144
+ // Resolve the space name
145
+ const spaceName = this.resolveSpaceName(conversationId);
146
+ // Build the message payload
147
+ const messagePayload = this.buildMessagePayload(content);
148
+ // Build request parameters
149
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
150
+ const requestParams = {
151
+ parent: spaceName,
152
+ requestBody: messagePayload,
153
+ };
154
+ // Handle threading
155
+ if (content.replyToMessageId) {
156
+ requestParams.requestBody.thread = {
157
+ name: content.replyToMessageId,
158
+ };
159
+ requestParams.messageReplyOption = 'REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD';
160
+ }
161
+ try {
162
+ const response = await this.chatClient.spaces.messages.create(requestParams);
163
+ return {
164
+ messageId: response.data?.name ?? `gchat-${Date.now()}`,
165
+ timestamp: response.data?.createTime ?? new Date().toISOString(),
166
+ };
167
+ }
168
+ catch (err) {
169
+ const message = err instanceof Error ? err.message : String(err);
170
+ throw new Error(`[Google Chat] Failed to send message to ${spaceName}: ${message}`);
171
+ }
172
+ }
173
+ async doShutdown() {
174
+ this.stopPolling();
175
+ this.chatClient = undefined;
176
+ this.authClient = undefined;
177
+ this.defaultSpace = undefined;
178
+ this.botInfo = undefined;
179
+ this.lastPollTimestamp = undefined;
180
+ }
181
+ // ── IChannelAdapter optional methods ──
182
+ async editMessage(conversationId, messageId, content) {
183
+ if (!this.chatClient) {
184
+ throw new Error('[Google Chat] API client is not initialized.');
185
+ }
186
+ const messagePayload = this.buildMessagePayload(content);
187
+ await this.chatClient.spaces.messages.update({
188
+ name: messageId, // Google Chat uses the full message resource name as ID
189
+ updateMask: 'text,cards',
190
+ requestBody: messagePayload,
191
+ });
192
+ }
193
+ async deleteMessage(_conversationId, messageId) {
194
+ if (!this.chatClient) {
195
+ throw new Error('[Google Chat] API client is not initialized.');
196
+ }
197
+ await this.chatClient.spaces.messages.delete({
198
+ name: messageId,
199
+ });
200
+ }
201
+ async addReaction(_conversationId, messageId, emoji) {
202
+ if (!this.chatClient) {
203
+ throw new Error('[Google Chat] API client is not initialized.');
204
+ }
205
+ try {
206
+ await this.chatClient.spaces.messages.reactions.create({
207
+ parent: messageId,
208
+ requestBody: {
209
+ emoji: { unicode: emoji },
210
+ },
211
+ });
212
+ }
213
+ catch (err) {
214
+ const message = err instanceof Error ? err.message : String(err);
215
+ console.warn(`[Google Chat] Failed to add reaction: ${message}`);
216
+ }
217
+ }
218
+ async getConversationInfo(conversationId) {
219
+ if (!this.chatClient) {
220
+ throw new Error('[Google Chat] API client is not initialized.');
221
+ }
222
+ const spaceName = this.resolveSpaceName(conversationId);
223
+ try {
224
+ const response = await this.chatClient.spaces.get({
225
+ name: spaceName,
226
+ });
227
+ const space = response.data;
228
+ const isGroup = space?.type === 'ROOM' || space?.type === 'GROUP_CHAT';
229
+ let memberCount;
230
+ try {
231
+ const members = await this.chatClient.spaces.members.list({
232
+ parent: spaceName,
233
+ pageSize: 1,
234
+ });
235
+ // The API doesn't return total count directly in the list
236
+ // but we can check if there are members
237
+ memberCount = members.data?.memberships?.length;
238
+ }
239
+ catch {
240
+ // Member count is best-effort
241
+ }
242
+ return {
243
+ name: space?.displayName ?? space?.name,
244
+ memberCount,
245
+ isGroup,
246
+ metadata: {
247
+ spaceType: space?.type,
248
+ singleUserBotDm: space?.singleUserBotDm,
249
+ threaded: space?.threaded,
250
+ spaceThreadingState: space?.spaceThreadingState,
251
+ },
252
+ };
253
+ }
254
+ catch (err) {
255
+ const message = err instanceof Error ? err.message : String(err);
256
+ throw new Error(`[Google Chat] Failed to get space info: ${message}`);
257
+ }
258
+ }
259
+ // ── Teams-specific public methods ──
260
+ /**
261
+ * Process an incoming Google Chat webhook event.
262
+ * Call this from your HTTP endpoint that receives Google Chat events.
263
+ *
264
+ * Google Chat sends events via HTTP push to configured webhook URLs
265
+ * or Cloud Pub/Sub subscriptions.
266
+ */
267
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
268
+ async processWebhookEvent(event) {
269
+ if (!event?.type)
270
+ return;
271
+ switch (event.type) {
272
+ case 'MESSAGE':
273
+ this.handleIncomingMessage(event);
274
+ break;
275
+ case 'ADDED_TO_SPACE':
276
+ this.handleAddedToSpace(event);
277
+ break;
278
+ case 'REMOVED_FROM_SPACE':
279
+ this.handleRemovedFromSpace(event);
280
+ break;
281
+ case 'CARD_CLICKED':
282
+ this.handleCardClicked(event);
283
+ break;
284
+ default:
285
+ break;
286
+ }
287
+ }
288
+ /**
289
+ * List spaces the bot is a member of.
290
+ */
291
+ async listSpaces() {
292
+ if (!this.chatClient) {
293
+ throw new Error('[Google Chat] API client is not initialized.');
294
+ }
295
+ const response = await this.chatClient.spaces.list({
296
+ pageSize: 100,
297
+ });
298
+ return (response.data?.spaces ?? []).map((space) => ({
299
+ name: space.name ?? '',
300
+ displayName: space.displayName ?? '',
301
+ type: space.type ?? 'UNKNOWN',
302
+ }));
303
+ }
304
+ // ── Private: message building ──
305
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
306
+ buildMessagePayload(content) {
307
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
308
+ const payload = {};
309
+ const textParts = [];
310
+ const cards = [];
311
+ for (const block of content.blocks) {
312
+ switch (block.type) {
313
+ case 'text':
314
+ textParts.push(block.text);
315
+ break;
316
+ case 'embed':
317
+ // Google Chat supports a subset of HTML-like formatting via embeds
318
+ if ('text' in block && typeof block.text === 'string') {
319
+ textParts.push(block.text);
320
+ }
321
+ break;
322
+ case 'image':
323
+ // Images go into card widgets
324
+ cards.push({
325
+ sections: [{
326
+ widgets: [{
327
+ image: {
328
+ imageUrl: block.url,
329
+ ...(block.caption ? { onClick: { openLink: { url: block.url } } } : {}),
330
+ },
331
+ }],
332
+ }],
333
+ ...(block.caption ? { header: { title: block.caption } } : {}),
334
+ });
335
+ break;
336
+ case 'button_group':
337
+ cards.push({
338
+ sections: [{
339
+ widgets: [{
340
+ buttons: block.buttons.map((btn) => ({
341
+ textButton: {
342
+ text: btn.label,
343
+ onClick: btn.action === 'url'
344
+ ? { openLink: { url: btn.value } }
345
+ : { action: { actionMethodName: btn.id, parameters: [{ key: 'value', value: btn.value }] } },
346
+ },
347
+ })),
348
+ }],
349
+ }],
350
+ });
351
+ break;
352
+ case 'embed':
353
+ cards.push(this.buildEmbedCard(block));
354
+ break;
355
+ case 'poll':
356
+ cards.push(this.buildPollCard(block));
357
+ break;
358
+ default:
359
+ break;
360
+ }
361
+ }
362
+ if (textParts.length > 0) {
363
+ payload.text = textParts.join('\n\n');
364
+ }
365
+ if (cards.length > 0) {
366
+ // Google Chat API v1 uses "cardsV2" for newer card format
367
+ payload.cardsV2 = cards.map((card, idx) => ({
368
+ cardId: `card-${idx}`,
369
+ card: {
370
+ header: card.header,
371
+ sections: card.sections,
372
+ },
373
+ }));
374
+ }
375
+ // Platform options pass-through
376
+ if (content.platformOptions) {
377
+ Object.assign(payload, content.platformOptions);
378
+ }
379
+ return payload;
380
+ }
381
+ buildEmbedCard(block) {
382
+ const widgets = [];
383
+ if (block.description) {
384
+ widgets.push({
385
+ textParagraph: { text: block.description },
386
+ });
387
+ }
388
+ if (block.fields) {
389
+ for (const field of block.fields) {
390
+ widgets.push({
391
+ decoratedText: {
392
+ topLabel: field.name,
393
+ text: field.value,
394
+ },
395
+ });
396
+ }
397
+ }
398
+ if (block.url) {
399
+ widgets.push({
400
+ buttonList: {
401
+ buttons: [{
402
+ text: 'Open Link',
403
+ onClick: { openLink: { url: block.url } },
404
+ }],
405
+ },
406
+ });
407
+ }
408
+ return {
409
+ header: {
410
+ title: block.title,
411
+ ...(block.description ? { subtitle: block.description.slice(0, 100) } : {}),
412
+ },
413
+ sections: [{ widgets }],
414
+ };
415
+ }
416
+ buildPollCard(block) {
417
+ const widgets = [];
418
+ widgets.push({
419
+ textParagraph: { text: `<b>${block.question}</b>` },
420
+ });
421
+ // Each option as a button
422
+ widgets.push({
423
+ buttonList: {
424
+ buttons: block.options.map((opt, idx) => ({
425
+ text: opt,
426
+ onClick: {
427
+ action: {
428
+ actionMethodName: 'pollVote',
429
+ parameters: [
430
+ { key: 'option', value: String(idx) },
431
+ { key: 'question', value: block.question },
432
+ ],
433
+ },
434
+ },
435
+ })),
436
+ },
437
+ });
438
+ return {
439
+ header: { title: 'Poll' },
440
+ sections: [{ widgets }],
441
+ };
442
+ }
443
+ // ── Private: space name resolution ──
444
+ resolveSpaceName(conversationId) {
445
+ // If it already looks like a space name, use it directly
446
+ if (conversationId.startsWith('spaces/')) {
447
+ return conversationId;
448
+ }
449
+ // If it's a bare space ID, prefix it
450
+ if (conversationId && !conversationId.includes('/')) {
451
+ return `spaces/${conversationId}`;
452
+ }
453
+ // Fall back to default space
454
+ if (this.defaultSpace) {
455
+ return this.defaultSpace.startsWith('spaces/')
456
+ ? this.defaultSpace
457
+ : `spaces/${this.defaultSpace}`;
458
+ }
459
+ throw new Error('[Google Chat] Cannot resolve space name from conversation ID. ' +
460
+ 'Provide a full space name (e.g., "spaces/AAAA...") or set defaultSpace.');
461
+ }
462
+ // ── Private: incoming event handlers ──
463
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
464
+ handleIncomingMessage(event) {
465
+ const msg = event.message;
466
+ if (!msg)
467
+ return;
468
+ const spaceName = event.space?.name ?? 'unknown';
469
+ const isGroup = event.space?.type === 'ROOM' || event.space?.type === 'GROUP_CHAT';
470
+ const contentBlocks = [];
471
+ if (msg.text) {
472
+ contentBlocks.push({ type: 'text', text: msg.text });
473
+ }
474
+ // Handle attachment content
475
+ if (msg.attachment) {
476
+ for (const att of Array.isArray(msg.attachment) ? msg.attachment : [msg.attachment]) {
477
+ if (att.contentType?.startsWith('image/')) {
478
+ contentBlocks.push({
479
+ type: 'image',
480
+ url: att.downloadUri ?? att.attachmentDataRef?.resourceName ?? '',
481
+ mimeType: att.contentType,
482
+ });
483
+ }
484
+ else {
485
+ contentBlocks.push({
486
+ type: 'document',
487
+ url: att.downloadUri ?? att.attachmentDataRef?.resourceName ?? '',
488
+ filename: att.source ?? 'attachment',
489
+ mimeType: att.contentType,
490
+ });
491
+ }
492
+ }
493
+ }
494
+ const message = {
495
+ messageId: msg.name ?? `gchat-${Date.now()}`,
496
+ platform: 'google-chat',
497
+ conversationId: spaceName,
498
+ conversationType: isGroup ? 'group' : 'direct',
499
+ sender: {
500
+ id: event.user?.name ?? 'unknown',
501
+ displayName: event.user?.displayName,
502
+ username: event.user?.email,
503
+ avatarUrl: event.user?.avatarUrl,
504
+ },
505
+ content: contentBlocks.length > 0 ? contentBlocks : [{ type: 'text', text: '' }],
506
+ text: msg.text ?? '',
507
+ timestamp: msg.createTime ?? new Date().toISOString(),
508
+ replyToMessageId: msg.thread?.name,
509
+ rawEvent: event,
510
+ };
511
+ this.emit({
512
+ type: 'message',
513
+ platform: 'google-chat',
514
+ conversationId: spaceName,
515
+ timestamp: message.timestamp,
516
+ data: message,
517
+ });
518
+ }
519
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
520
+ handleAddedToSpace(event) {
521
+ const spaceName = event.space?.name ?? 'unknown';
522
+ this.emit({
523
+ type: 'member_joined',
524
+ platform: 'google-chat',
525
+ conversationId: spaceName,
526
+ timestamp: new Date().toISOString(),
527
+ data: {
528
+ user: {
529
+ id: event.user?.name ?? 'bot',
530
+ displayName: event.user?.displayName ?? 'Bot',
531
+ },
532
+ space: event.space,
533
+ },
534
+ });
535
+ }
536
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
537
+ handleRemovedFromSpace(event) {
538
+ const spaceName = event.space?.name ?? 'unknown';
539
+ this.emit({
540
+ type: 'member_left',
541
+ platform: 'google-chat',
542
+ conversationId: spaceName,
543
+ timestamp: new Date().toISOString(),
544
+ data: {
545
+ user: {
546
+ id: event.user?.name ?? 'bot',
547
+ displayName: event.user?.displayName ?? 'Bot',
548
+ },
549
+ space: event.space,
550
+ },
551
+ });
552
+ }
553
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
554
+ handleCardClicked(event) {
555
+ const spaceName = event.space?.name ?? 'unknown';
556
+ const action = event.action;
557
+ if (!action)
558
+ return;
559
+ this.emit({
560
+ type: 'button_callback',
561
+ platform: 'google-chat',
562
+ conversationId: spaceName,
563
+ timestamp: new Date().toISOString(),
564
+ data: {
565
+ callbackId: action.actionMethodName ?? 'unknown',
566
+ buttonId: action.actionMethodName ?? 'unknown',
567
+ sender: {
568
+ id: event.user?.name ?? 'unknown',
569
+ displayName: event.user?.displayName,
570
+ },
571
+ messageId: event.message?.name ?? 'unknown',
572
+ parameters: action.parameters,
573
+ },
574
+ });
575
+ }
576
+ // ── Private: polling ──
577
+ startPolling() {
578
+ if (!this.defaultSpace)
579
+ return;
580
+ // Poll every 30 seconds for new messages in the default space
581
+ this.pollTimer = setInterval(() => {
582
+ this.pollSpace().catch((err) => {
583
+ console.warn('[Google Chat] Space poll error:', err);
584
+ });
585
+ }, 30000);
586
+ }
587
+ stopPolling() {
588
+ if (this.pollTimer) {
589
+ clearInterval(this.pollTimer);
590
+ this.pollTimer = undefined;
591
+ }
592
+ }
593
+ async pollSpace() {
594
+ if (!this.chatClient || !this.defaultSpace)
595
+ return;
596
+ try {
597
+ const spaceName = this.resolveSpaceName(this.defaultSpace);
598
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
599
+ const params = {
600
+ parent: spaceName,
601
+ pageSize: 25,
602
+ orderBy: 'createTime desc',
603
+ };
604
+ if (this.lastPollTimestamp) {
605
+ params.filter = `createTime > "${this.lastPollTimestamp}"`;
606
+ }
607
+ const response = await this.chatClient.spaces.messages.list(params);
608
+ const messages = response.data?.messages ?? [];
609
+ for (const msg of messages) {
610
+ // Skip bot's own messages
611
+ if (msg.sender?.type === 'BOT')
612
+ continue;
613
+ // Build a synthetic event matching the webhook format
614
+ const syntheticEvent = {
615
+ type: 'MESSAGE',
616
+ message: msg,
617
+ space: { name: spaceName },
618
+ user: msg.sender,
619
+ };
620
+ this.handleIncomingMessage(syntheticEvent);
621
+ // Track the latest timestamp
622
+ if (msg.createTime && (!this.lastPollTimestamp || msg.createTime > this.lastPollTimestamp)) {
623
+ this.lastPollTimestamp = msg.createTime;
624
+ }
625
+ }
626
+ }
627
+ catch {
628
+ // Non-fatal — will retry on next poll
629
+ }
630
+ }
631
+ }
632
+ //# sourceMappingURL=GoogleChatChannelAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleChatChannelAdapter.js","sourceRoot":"","sources":["../../../src/channels/adapters/GoogleChatChannelAdapter.ts"],"names":[],"mappings":"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"}