@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.
- package/dist/api/AgentOSOrchestrator.js +1 -1
- package/dist/api/AgentOSOrchestrator.js.map +1 -1
- package/dist/channels/ChannelRouter.d.ts.map +1 -1
- package/dist/channels/ChannelRouter.js +1 -1
- package/dist/channels/ChannelRouter.js.map +1 -1
- package/dist/channels/IChannelAdapter.d.ts.map +1 -1
- package/dist/channels/adapters/BaseChannelAdapter.d.ts +130 -0
- package/dist/channels/adapters/BaseChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/BaseChannelAdapter.js +257 -0
- package/dist/channels/adapters/BaseChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/DiscordChannelAdapter.d.ts +86 -0
- package/dist/channels/adapters/DiscordChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/DiscordChannelAdapter.js +550 -0
- package/dist/channels/adapters/DiscordChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts +117 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.js +632 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/IRCChannelAdapter.d.ts +86 -0
- package/dist/channels/adapters/IRCChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/IRCChannelAdapter.js +253 -0
- package/dist/channels/adapters/IRCChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/RedditChannelAdapter.d.ts +123 -0
- package/dist/channels/adapters/RedditChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/RedditChannelAdapter.js +516 -0
- package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/SignalChannelAdapter.d.ts +120 -0
- package/dist/channels/adapters/SignalChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/SignalChannelAdapter.js +521 -0
- package/dist/channels/adapters/SignalChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/SlackChannelAdapter.d.ts +96 -0
- package/dist/channels/adapters/SlackChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/SlackChannelAdapter.js +535 -0
- package/dist/channels/adapters/SlackChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TeamsChannelAdapter.d.ts +138 -0
- package/dist/channels/adapters/TeamsChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TeamsChannelAdapter.js +639 -0
- package/dist/channels/adapters/TeamsChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TelegramChannelAdapter.d.ts +83 -0
- package/dist/channels/adapters/TelegramChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TelegramChannelAdapter.js +463 -0
- package/dist/channels/adapters/TelegramChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TwitterChannelAdapter.d.ts +117 -0
- package/dist/channels/adapters/TwitterChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TwitterChannelAdapter.js +489 -0
- package/dist/channels/adapters/TwitterChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/WebChatChannelAdapter.d.ts +141 -0
- package/dist/channels/adapters/WebChatChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/WebChatChannelAdapter.js +539 -0
- package/dist/channels/adapters/WebChatChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts +122 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.js +643 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/index.d.ts +34 -0
- package/dist/channels/adapters/index.d.ts.map +1 -0
- package/dist/channels/adapters/index.js +25 -0
- package/dist/channels/adapters/index.js.map +1 -0
- package/dist/channels/index.d.ts +24 -0
- package/dist/channels/index.d.ts.map +1 -1
- package/dist/channels/index.js +16 -0
- package/dist/channels/index.js.map +1 -1
- package/dist/cognitive_substrate/personas/metaprompt_presets.d.ts.map +1 -1
- package/dist/cognitive_substrate/personas/metaprompt_presets.js +0 -2
- package/dist/cognitive_substrate/personas/metaprompt_presets.js.map +1 -1
- package/dist/core/provenance/crypto/HashChain.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/AutonomyGuard.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js +2 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js.map +1 -1
- package/dist/core/provenance/ledger/EventTypes.d.ts.map +1 -1
- package/dist/core/safety/ToolExecutionGuard.d.ts.map +1 -1
- package/dist/core/safety/ToolExecutionGuard.js +0 -1
- package/dist/core/safety/ToolExecutionGuard.js.map +1 -1
- package/dist/extensions/ExtensionManager.d.ts.map +1 -1
- package/dist/extensions/ExtensionManager.js +3 -9
- package/dist/extensions/ExtensionManager.js.map +1 -1
- package/dist/rag/RetrievalAugmentor.js.map +1 -1
- 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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"}
|