@elizaos/plugin-google-chat 2.0.0-alpha.5 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -0
- package/auto-enable.ts +21 -0
- package/dist/src/accounts.d.ts +16 -0
- package/dist/src/accounts.d.ts.map +1 -0
- package/dist/src/accounts.js +163 -0
- package/dist/src/accounts.js.map +1 -0
- package/dist/src/actions/index.d.ts +1 -0
- package/dist/src/actions/index.d.ts.map +1 -0
- package/dist/src/actions/index.js +3 -0
- package/dist/src/actions/index.js.map +1 -0
- package/dist/src/config.d.ts +91 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +8 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/connector-account-provider.d.ts +22 -0
- package/dist/src/connector-account-provider.d.ts.map +1 -0
- package/dist/src/connector-account-provider.js +89 -0
- package/dist/src/connector-account-provider.js.map +1 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +66 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/providers/index.d.ts +1 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +3 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/service.d.ts +62 -0
- package/dist/src/service.d.ts.map +1 -0
- package/dist/src/service.js +724 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/types.d.ts +216 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +144 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/workflow-credential-provider.d.ts +21 -0
- package/dist/src/workflow-credential-provider.d.ts.map +1 -0
- package/dist/src/workflow-credential-provider.js +57 -0
- package/dist/src/workflow-credential-provider.js.map +1 -0
- package/package.json +20 -11
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1115
- package/dist/index.js.map +0 -17
package/dist/index.js.map
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/types.ts", "../src/actions/listSpaces.ts", "../src/actions/sendMessage.ts", "../src/actions/sendReaction.ts", "../src/providers/spaceState.ts", "../src/providers/userContext.ts", "../src/service.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Google Chat Plugin for ElizaOS\n *\n * Provides Google Chat messaging integration for ElizaOS agents,\n * supporting spaces, direct messages, threads, and reactions.\n */\n\nimport type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { listSpaces, sendMessage, sendReaction } from \"./actions/index.js\";\nimport { spaceStateProvider, userContextProvider } from \"./providers/index.js\";\nimport { GoogleChatService } from \"./service.js\";\n\n// Export types\nexport * from \"./types.js\";\n\n// Export service\nexport { GoogleChatService };\n\n// Export actions\nexport { sendMessage, sendReaction, listSpaces };\n\n// Export providers\nexport { spaceStateProvider, userContextProvider };\n\n/**\n * Google Chat plugin definition\n */\nconst googleChatPlugin: Plugin = {\n name: \"google-chat\",\n description: \"Google Chat integration plugin for ElizaOS agents\",\n\n services: [GoogleChatService],\n\n actions: [sendMessage, sendReaction, listSpaces],\n\n providers: [spaceStateProvider, userContextProvider],\n\n tests: [],\n\n /**\n * Plugin initialization hook\n */\n init: async (\n config: Record<string, string>,\n _runtime: IAgentRuntime,\n ): Promise<void> => {\n logger.info(\"Initializing Google Chat plugin...\");\n\n // Log configuration status\n const serviceAccount =\n config.GOOGLE_CHAT_SERVICE_ACCOUNT ||\n process.env.GOOGLE_CHAT_SERVICE_ACCOUNT;\n const serviceAccountFile =\n config.GOOGLE_CHAT_SERVICE_ACCOUNT_FILE ||\n process.env.GOOGLE_CHAT_SERVICE_ACCOUNT_FILE;\n const hasCredentials = Boolean(\n serviceAccount ||\n serviceAccountFile ||\n process.env.GOOGLE_APPLICATION_CREDENTIALS,\n );\n\n logger.info(`Google Chat plugin configuration:`);\n logger.info(` - Credentials configured: ${hasCredentials ? \"Yes\" : \"No\"}`);\n logger.info(\n ` - Audience type: ${config.GOOGLE_CHAT_AUDIENCE_TYPE || process.env.GOOGLE_CHAT_AUDIENCE_TYPE || \"(not set)\"}`,\n );\n logger.info(\n ` - Audience: ${config.GOOGLE_CHAT_AUDIENCE || process.env.GOOGLE_CHAT_AUDIENCE ? \"(set)\" : \"(not set)\"}`,\n );\n logger.info(\n ` - Webhook path: ${config.GOOGLE_CHAT_WEBHOOK_PATH || process.env.GOOGLE_CHAT_WEBHOOK_PATH || \"/googlechat\"}`,\n );\n\n if (!hasCredentials) {\n logger.warn(\n \"Google Chat service account credentials not configured. \" +\n \"Set GOOGLE_CHAT_SERVICE_ACCOUNT, GOOGLE_CHAT_SERVICE_ACCOUNT_FILE, or GOOGLE_APPLICATION_CREDENTIALS.\",\n );\n }\n\n logger.info(\"Google Chat plugin initialized\");\n },\n};\n\nexport default googleChatPlugin;\n\n// Channel configuration types\nexport type {\n GoogleChatAccountConfig,\n GoogleChatActionConfig,\n GoogleChatConfig,\n GoogleChatReactionNotificationMode,\n GoogleChatSpaceConfig,\n} from \"./config.js\";\n",
|
|
6
|
-
"/**\n * Type definitions for the Google Chat plugin.\n */\n\nimport type { Service } from \"@elizaos/core\";\n\n/** Maximum message length for Google Chat */\nexport const MAX_GOOGLE_CHAT_MESSAGE_LENGTH = 4000;\n\n/** Google Chat service name */\nexport const GOOGLE_CHAT_SERVICE_NAME = \"google-chat\";\n\n/** Event types emitted by the Google Chat plugin */\nexport enum GoogleChatEventTypes {\n MESSAGE_RECEIVED = \"GOOGLE_CHAT_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"GOOGLE_CHAT_MESSAGE_SENT\",\n SPACE_JOINED = \"GOOGLE_CHAT_SPACE_JOINED\",\n SPACE_LEFT = \"GOOGLE_CHAT_SPACE_LEFT\",\n REACTION_RECEIVED = \"GOOGLE_CHAT_REACTION_RECEIVED\",\n REACTION_SENT = \"GOOGLE_CHAT_REACTION_SENT\",\n WEBHOOK_READY = \"GOOGLE_CHAT_WEBHOOK_READY\",\n CONNECTION_READY = \"GOOGLE_CHAT_CONNECTION_READY\",\n}\n\n/** Audience type for token verification */\nexport type GoogleChatAudienceType = \"app-url\" | \"project-number\";\n\n/** Configuration settings for the Google Chat plugin */\nexport interface GoogleChatSettings {\n /** Service account JSON credentials */\n serviceAccount?: string;\n /** Path to service account JSON file */\n serviceAccountFile?: string;\n /** Audience type for verification */\n audienceType: GoogleChatAudienceType;\n /** Audience value for verification */\n audience: string;\n /** Webhook path for receiving messages */\n webhookPath: string;\n /** List of spaces to interact with */\n spaces: string[];\n /** Whether to require @mention in spaces */\n requireMention: boolean;\n /** Whether the plugin is enabled */\n enabled: boolean;\n /** Bot user identifier */\n botUser?: string;\n}\n\n/** Google Chat space information */\nexport interface GoogleChatSpace {\n name: string;\n displayName?: string;\n type: \"DM\" | \"ROOM\" | \"SPACE\";\n singleUserBotDm?: boolean;\n threaded?: boolean;\n spaceType?: string;\n}\n\n/** Google Chat user information */\nexport interface GoogleChatUser {\n name: string;\n displayName?: string;\n email?: string;\n type?: string;\n domainId?: string;\n isAnonymous?: boolean;\n}\n\n/** Google Chat thread information */\nexport interface GoogleChatThread {\n name: string;\n threadKey?: string;\n}\n\n/** Google Chat attachment data reference */\nexport interface GoogleChatAttachmentDataRef {\n resourceName?: string;\n attachmentUploadToken?: string;\n}\n\n/** Google Chat attachment */\nexport interface GoogleChatAttachment {\n name?: string;\n contentName?: string;\n contentType?: string;\n thumbnailUri?: string;\n downloadUri?: string;\n source?: string;\n attachmentDataRef?: GoogleChatAttachmentDataRef;\n driveDataRef?: Record<string, unknown>;\n}\n\n/** Google Chat message */\nexport interface GoogleChatMessage {\n name: string;\n text?: string;\n argumentText?: string;\n sender: GoogleChatUser;\n createTime: string;\n thread?: GoogleChatThread;\n space: GoogleChatSpace;\n attachment?: GoogleChatAttachment[];\n annotations?: GoogleChatAnnotation[];\n}\n\n/** Google Chat annotation (mention, etc.) */\nexport interface GoogleChatAnnotation {\n type?: string;\n startIndex?: number;\n length?: number;\n userMention?: {\n user?: GoogleChatUser;\n type?: string;\n };\n slashCommand?: Record<string, unknown>;\n}\n\n/** Google Chat webhook event */\nexport interface GoogleChatEvent {\n type: string;\n eventTime?: string;\n space?: GoogleChatSpace;\n user?: GoogleChatUser;\n message?: GoogleChatMessage;\n}\n\n/** Google Chat reaction */\nexport interface GoogleChatReaction {\n name?: string;\n user?: GoogleChatUser;\n emoji?: {\n unicode?: string;\n };\n}\n\n/** Options for sending a message */\nexport interface GoogleChatMessageSendOptions {\n /** Target space name */\n space?: string;\n /** Thread name for replying in thread */\n thread?: string;\n /** Text message content */\n text?: string;\n /** Attachment upload tokens */\n attachments?: Array<{\n attachmentUploadToken: string;\n contentName?: string;\n }>;\n}\n\n/** Result from sending a message */\nexport interface GoogleChatSendResult {\n success: boolean;\n messageName?: string;\n space?: string;\n error?: string;\n}\n\n/** Google Chat service interface */\nexport interface IGoogleChatService extends Service {\n /** Check if the service is connected */\n isConnected(): boolean;\n\n /** Get the bot user name */\n getBotUser(): string | undefined;\n\n /** Get spaces the bot is in */\n getSpaces(): Promise<GoogleChatSpace[]>;\n\n /** Send a message */\n sendMessage(\n options: GoogleChatMessageSendOptions,\n ): Promise<GoogleChatSendResult>;\n\n /** Send a reaction */\n sendReaction(\n messageName: string,\n emoji: string,\n ): Promise<{ success: boolean; name?: string; error?: string }>;\n\n /** Delete a message */\n deleteMessage(\n messageName: string,\n ): Promise<{ success: boolean; error?: string }>;\n\n /** Update a message */\n updateMessage(\n messageName: string,\n text: string,\n ): Promise<{ success: boolean; messageName?: string; error?: string }>;\n\n /** Find or create a DM space with a user */\n findDirectMessage(userName: string): Promise<GoogleChatSpace | null>;\n\n /** Get an access token for API calls */\n getAccessToken(): Promise<string>;\n}\n\n// Custom error classes\n\n/** Base error class for Google Chat plugin errors */\nexport class GoogleChatPluginError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"GoogleChatPluginError\";\n }\n}\n\n/** Configuration error */\nexport class GoogleChatConfigurationError extends GoogleChatPluginError {\n public readonly setting?: string;\n\n constructor(message: string, setting?: string, cause?: Error) {\n super(message, \"CONFIGURATION_ERROR\", cause);\n this.name = \"GoogleChatConfigurationError\";\n this.setting = setting;\n }\n}\n\n/** API error */\nexport class GoogleChatApiError extends GoogleChatPluginError {\n public readonly statusCode?: number;\n\n constructor(message: string, statusCode?: number, cause?: Error) {\n super(message, \"API_ERROR\", cause);\n this.name = \"GoogleChatApiError\";\n this.statusCode = statusCode;\n }\n}\n\n/** Authentication error */\nexport class GoogleChatAuthenticationError extends GoogleChatPluginError {\n constructor(message: string, cause?: Error) {\n super(message, \"AUTHENTICATION_ERROR\", cause);\n this.name = \"GoogleChatAuthenticationError\";\n }\n}\n\n// Utility functions\n\n/** Regex for validating Google Chat space names */\nconst SPACE_NAME_REGEX = /^spaces\\/[A-Za-z0-9_-]+$/;\n\n/** Regex for validating Google Chat user names */\nconst USER_NAME_REGEX = /^users\\/[A-Za-z0-9_-]+$/;\n\n/** Check if a string is a valid Google Chat space name */\nexport function isValidGoogleChatSpaceName(name: string): boolean {\n return SPACE_NAME_REGEX.test(name);\n}\n\n/** Check if a string is a valid Google Chat user name */\nexport function isValidGoogleChatUserName(name: string): boolean {\n return USER_NAME_REGEX.test(name);\n}\n\n/** Normalize a Google Chat space target */\nexport function normalizeSpaceTarget(target: string): string | null {\n const trimmed = target.trim();\n if (!trimmed) {\n return null;\n }\n if (trimmed.startsWith(\"spaces/\")) {\n return trimmed;\n }\n if (/^[A-Za-z0-9_-]+$/.test(trimmed)) {\n return `spaces/${trimmed}`;\n }\n return null;\n}\n\n/** Normalize a Google Chat user target */\nexport function normalizeUserTarget(target: string): string | null {\n const trimmed = target.trim();\n if (!trimmed) {\n return null;\n }\n if (trimmed.startsWith(\"users/\")) {\n return trimmed;\n }\n if (/^[A-Za-z0-9_-]+$/.test(trimmed)) {\n return `users/${trimmed}`;\n }\n return null;\n}\n\n/** Extract the ID from a Google Chat resource name */\nexport function extractResourceId(resourceName: string): string {\n const parts = resourceName.split(\"/\");\n return parts[parts.length - 1];\n}\n\n/** Get display name for a user */\nexport function getUserDisplayName(user: GoogleChatUser): string {\n return user.displayName || extractResourceId(user.name);\n}\n\n/** Get display name for a space */\nexport function getSpaceDisplayName(space: GoogleChatSpace): string {\n return space.displayName || extractResourceId(space.name);\n}\n\n/** Check if a space is a DM */\nexport function isDirectMessage(space: GoogleChatSpace): boolean {\n return space.type === \"DM\" || space.singleUserBotDm === true;\n}\n\n/** Split long text into chunks for Google Chat */\nexport function splitMessageForGoogleChat(\n text: string,\n maxLength: number = MAX_GOOGLE_CHAT_MESSAGE_LENGTH,\n): string[] {\n if (text.length <= maxLength) {\n return [text];\n }\n\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= maxLength) {\n chunks.push(remaining);\n break;\n }\n\n // Find a good break point\n let breakPoint = maxLength;\n const newlineIndex = remaining.lastIndexOf(\"\\n\", maxLength);\n if (newlineIndex > maxLength * 0.5) {\n breakPoint = newlineIndex + 1;\n } else {\n const spaceIndex = remaining.lastIndexOf(\" \", maxLength);\n if (spaceIndex > maxLength * 0.5) {\n breakPoint = spaceIndex + 1;\n }\n }\n\n chunks.push(remaining.slice(0, breakPoint).trimEnd());\n remaining = remaining.slice(breakPoint).trimStart();\n }\n\n return chunks;\n}\n",
|
|
7
|
-
"/**\n * List spaces action for Google Chat plugin.\n */\n\nimport type {\n Action,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { GoogleChatService } from \"../service.js\";\nimport {\n GOOGLE_CHAT_SERVICE_NAME,\n getSpaceDisplayName,\n isDirectMessage,\n} from \"../types.js\";\n\nexport const listSpaces: Action = {\n name: \"GOOGLE_CHAT_LIST_SPACES\",\n similes: [\n \"LIST_GOOGLE_CHAT_SPACES\",\n \"GCHAT_SPACES\",\n \"SHOW_GOOGLE_CHAT_SPACES\",\n ],\n description: \"List all Google Chat spaces the bot is a member of\",\n\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"google-chat\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state: State | undefined,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n const gchatService = runtime.getService<GoogleChatService>(\n GOOGLE_CHAT_SERVICE_NAME,\n );\n\n if (!gchatService || !gchatService.isConnected()) {\n if (callback) {\n callback({\n text: \"Google Chat service is not available.\",\n source: \"google-chat\",\n });\n }\n return { success: false, error: \"Google Chat service not available\" };\n }\n\n const spaces = await gchatService.getSpaces();\n\n if (spaces.length === 0) {\n if (callback) {\n callback({\n text: \"I'm not currently in any Google Chat spaces.\",\n source: message.content.source as string,\n });\n }\n return {\n success: true,\n data: { spaceCount: 0, spaces: [] },\n };\n }\n\n // Format space list\n const spaceLines = spaces.map((space) => {\n const name = getSpaceDisplayName(space);\n const type = isDirectMessage(space) ? \"DM\" : space.type || \"SPACE\";\n const threaded = space.threaded ? \" (threaded)\" : \"\";\n return `• ${name} [${type}]${threaded}`;\n });\n\n const responseText = `Currently in ${spaces.length} space(s):\\n\\n${spaceLines.join(\"\\n\")}`;\n\n if (callback) {\n callback({\n text: responseText,\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n spaceCount: spaces.length,\n spaces: spaces.map((s) => ({\n name: s.name,\n displayName: s.displayName,\n type: s.type,\n threaded: s.threaded,\n })),\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"What Google Chat spaces are you in?\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"Let me check my Google Chat spaces.\",\n actions: [\"GOOGLE_CHAT_LIST_SPACES\"],\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"List all spaces\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll list all the Google Chat spaces I'm in.\",\n actions: [\"GOOGLE_CHAT_LIST_SPACES\"],\n },\n },\n ],\n ],\n};\n",
|
|
8
|
-
"/**\n * Send message action for Google Chat plugin.\n */\n\nimport {\n type Action,\n type ActionResult,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseJSONObjectFromText,\n type State,\n} from \"@elizaos/core\";\nimport type { GoogleChatService } from \"../service.js\";\nimport {\n GOOGLE_CHAT_SERVICE_NAME,\n normalizeSpaceTarget,\n splitMessageForGoogleChat,\n} from \"../types.js\";\n\ninterface SendMessageParams {\n text: string;\n space: string;\n thread?: string;\n}\n\nconst SEND_MESSAGE_TEMPLATE = `# Task: Extract Google Chat send message parameters\nBased on the conversation, determine what message to send and to which space.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n- text: The message content to send\n- space: The target space ID (or \"current\" for the current space)\n- thread: Optional thread name to reply in\n\nRespond with a JSON object:\n\\`\\`\\`json\n{\n \"text\": \"message content here\",\n \"space\": \"spaces/xxx or current\",\n \"thread\": \"optional thread name\"\n}\n\\`\\`\\``;\n\nexport const sendMessage: Action = {\n name: \"GOOGLE_CHAT_SEND_MESSAGE\",\n similes: [\n \"SEND_GOOGLE_CHAT_MESSAGE\",\n \"MESSAGE_GOOGLE_CHAT\",\n \"GCHAT_SEND\",\n \"GOOGLE_CHAT_TEXT\",\n ],\n description: \"Send a message to a Google Chat space\",\n\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"google-chat\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n const gchatService = runtime.getService<GoogleChatService>(\n GOOGLE_CHAT_SERVICE_NAME,\n );\n\n if (!gchatService || !gchatService.isConnected()) {\n if (callback) {\n callback({\n text: \"Google Chat service is not available.\",\n source: \"google-chat\",\n });\n }\n return { success: false, error: \"Google Chat service not available\" };\n }\n\n const currentState = state ?? (await runtime.composeState(message));\n\n const prompt = await composePromptFromState({\n template: SEND_MESSAGE_TEMPLATE,\n state: currentState,\n });\n\n let messageInfo: SendMessageParams | null = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(response);\n if (parsed?.text) {\n messageInfo = {\n text: String(parsed.text),\n space: String(parsed.space || \"current\"),\n thread: parsed.thread ? String(parsed.thread) : undefined,\n };\n break;\n }\n }\n\n if (!messageInfo || !messageInfo.text) {\n if (callback) {\n callback({\n text: \"I couldn't understand what message you want me to send. Please try again.\",\n source: \"google-chat\",\n });\n }\n return { success: false, error: \"Could not extract message parameters\" };\n }\n\n let targetSpace: string | undefined;\n if (messageInfo.space && messageInfo.space !== \"current\") {\n const normalized = normalizeSpaceTarget(messageInfo.space);\n if (normalized) {\n targetSpace = normalized;\n }\n }\n\n const spaceData = currentState.data?.space as\n | Record<string, unknown>\n | undefined;\n if (!targetSpace && spaceData?.name) {\n targetSpace = String(spaceData.name);\n }\n\n if (!targetSpace) {\n if (callback) {\n callback({\n text: \"I couldn't determine which space to send to. Please specify a space.\",\n source: \"google-chat\",\n });\n }\n return { success: false, error: \"Could not determine target space\" };\n }\n\n const chunks = splitMessageForGoogleChat(messageInfo.text);\n\n let lastResult: { messageName?: string } | undefined;\n for (const chunk of chunks) {\n const result = await gchatService.sendMessage({\n space: targetSpace,\n text: chunk,\n thread: messageInfo.thread,\n });\n\n if (!result.success) {\n if (callback) {\n callback({\n text: `Failed to send message: ${result.error}`,\n source: \"google-chat\",\n });\n }\n return { success: false, error: result.error };\n }\n\n lastResult = { messageName: result.messageName };\n logger.debug(`Sent Google Chat message: ${result.messageName}`);\n }\n\n if (callback) {\n callback({\n text: \"Message sent successfully.\",\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n space: targetSpace,\n messageName: lastResult?.messageName,\n chunksCount: chunks.length,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Send a message saying 'Hello everyone!'\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll send that message to the space.\",\n actions: [\"GOOGLE_CHAT_SEND_MESSAGE\"],\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Post 'Meeting starts in 5 minutes' to the team space\",\n },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll post that reminder to the team space.\",\n actions: [\"GOOGLE_CHAT_SEND_MESSAGE\"],\n },\n },\n ],\n ],\n};\n",
|
|
9
|
-
"/**\n * Send reaction action for Google Chat plugin.\n */\n\nimport {\n type Action,\n type ActionResult,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n type Memory,\n ModelType,\n parseJSONObjectFromText,\n type State,\n} from \"@elizaos/core\";\nimport type { GoogleChatService } from \"../service.js\";\nimport { GOOGLE_CHAT_SERVICE_NAME } from \"../types.js\";\n\ninterface SendReactionParams {\n emoji: string;\n messageName: string;\n remove?: boolean;\n}\n\nconst SEND_REACTION_TEMPLATE = `# Task: Extract Google Chat reaction parameters\nBased on the conversation, determine the emoji reaction to add or remove.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n- emoji: The emoji to react with (Unicode emoji character)\n- messageName: The message resource name to react to\n- remove: Whether to remove the reaction (true/false)\n\nRespond with a JSON object:\n\\`\\`\\`json\n{\n \"emoji\": \"👍\",\n \"messageName\": \"spaces/xxx/messages/yyy\",\n \"remove\": false\n}\n\\`\\`\\``;\n\nexport const sendReaction: Action = {\n name: \"GOOGLE_CHAT_SEND_REACTION\",\n similes: [\n \"REACT_GOOGLE_CHAT\",\n \"GCHAT_REACT\",\n \"GOOGLE_CHAT_EMOJI\",\n \"ADD_GOOGLE_CHAT_REACTION\",\n ],\n description: \"Add or remove an emoji reaction to a Google Chat message\",\n\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"google-chat\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n const gchatService = runtime.getService<GoogleChatService>(\n GOOGLE_CHAT_SERVICE_NAME,\n );\n\n if (!gchatService || !gchatService.isConnected()) {\n if (callback) {\n callback({\n text: \"Google Chat service is not available.\",\n source: \"google-chat\",\n });\n }\n return { success: false, error: \"Google Chat service not available\" };\n }\n\n // Compose state if not provided\n const currentState = state ?? (await runtime.composeState(message));\n\n // Compose prompt\n const prompt = await composePromptFromState({\n template: SEND_REACTION_TEMPLATE,\n state: currentState,\n });\n\n // Extract parameters using LLM\n let reactionInfo: SendReactionParams | null = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(response);\n if (parsed?.emoji && parsed?.messageName) {\n reactionInfo = {\n emoji: String(parsed.emoji),\n messageName: String(parsed.messageName),\n remove: parsed.remove === true,\n };\n break;\n }\n }\n\n if (!reactionInfo) {\n if (callback) {\n callback({\n text: \"I couldn't understand the reaction details. Please try again.\",\n source: \"google-chat\",\n });\n }\n return { success: false, error: \"Could not extract reaction parameters\" };\n }\n\n // Get message name from state if not provided\n let targetMessage = reactionInfo.messageName;\n const messageData = currentState.data?.message as\n | Record<string, unknown>\n | undefined;\n if (!targetMessage && messageData?.name) {\n targetMessage = String(messageData.name);\n }\n\n if (!targetMessage) {\n if (callback) {\n callback({\n text: \"I couldn't determine which message to react to. Please specify the message.\",\n source: \"google-chat\",\n });\n }\n return { success: false, error: \"Could not determine target message\" };\n }\n\n // Handle remove case\n if (reactionInfo.remove) {\n const reactions = await gchatService.listReactions(targetMessage);\n const botUser = gchatService.getBotUser();\n const toRemove = reactions.filter((r) => {\n const userName = r.user?.name;\n if (botUser && userName !== botUser && userName !== \"users/app\") {\n return false;\n }\n if (reactionInfo?.emoji && r.emoji?.unicode !== reactionInfo?.emoji) {\n return false;\n }\n return true;\n });\n\n for (const reaction of toRemove) {\n if (reaction.name) {\n await gchatService.deleteReaction(reaction.name);\n }\n }\n\n if (callback) {\n callback({\n text: `Removed ${toRemove.length} reaction(s).`,\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n removed: toRemove.length,\n },\n };\n }\n\n // Add reaction\n const result = await gchatService.sendReaction(\n targetMessage,\n reactionInfo.emoji,\n );\n\n if (!result.success) {\n if (callback) {\n callback({\n text: `Failed to add reaction: ${result.error}`,\n source: \"google-chat\",\n });\n }\n return { success: false, error: result.error };\n }\n\n if (callback) {\n callback({\n text: `Added ${reactionInfo.emoji} reaction.`,\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n reactionName: result.name,\n emoji: reactionInfo.emoji,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"React with a thumbs up to that message\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll add a thumbs up reaction.\",\n actions: [\"GOOGLE_CHAT_SEND_REACTION\"],\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Remove my reaction from that message\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll remove the reaction.\",\n actions: [\"GOOGLE_CHAT_SEND_REACTION\"],\n },\n },\n ],\n ],\n};\n",
|
|
10
|
-
"/**\n * Space state provider for Google Chat plugin.\n */\n\nimport type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\nimport type { GoogleChatService } from \"../service.js\";\nimport { GOOGLE_CHAT_SERVICE_NAME } from \"../types.js\";\n\nexport const spaceStateProvider: Provider = {\n name: \"googleChatSpaceState\",\n description:\n \"Provides information about the current Google Chat space context\",\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n if (message.content.source !== \"google-chat\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const gchatService = runtime.getService<GoogleChatService>(\n GOOGLE_CHAT_SERVICE_NAME,\n );\n\n if (!gchatService || !gchatService.isConnected()) {\n return {\n data: { connected: false },\n values: { connected: false },\n text: \"\",\n };\n }\n\n const agentName = state?.agentName || \"The agent\";\n\n const space = state?.data?.space as Record<string, unknown> | undefined;\n const spaceName = space?.name as string | undefined;\n const spaceDisplayName = space?.displayName as string | undefined;\n const spaceType = space?.type as string | undefined;\n const isThreaded = space?.threaded as boolean | undefined;\n const isDm = spaceType === \"DM\" || space?.singleUserBotDm === true;\n\n let responseText = \"\";\n\n if (isDm) {\n responseText = `${agentName} is in a direct message conversation on Google Chat.`;\n } else {\n const label = spaceDisplayName || spaceName || \"a Google Chat space\";\n responseText = `${agentName} is currently in Google Chat space \"${label}\".`;\n if (isThreaded) {\n responseText += \" This space uses threaded conversations.\";\n }\n }\n\n responseText += `\\n\\nGoogle Chat is Google Workspace's team communication platform.`;\n\n return {\n data: {\n spaceName,\n spaceDisplayName,\n spaceType,\n isThreaded: isThreaded || false,\n isDirect: isDm || false,\n connected: true,\n },\n values: {\n spaceName,\n spaceDisplayName,\n spaceType,\n isThreaded: isThreaded || false,\n isDirect: isDm || false,\n },\n text: responseText,\n };\n },\n};\n",
|
|
11
|
-
"/**\n * User context provider for Google Chat plugin.\n */\n\nimport type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\nimport type { GoogleChatService } from \"../service.js\";\nimport {\n extractResourceId,\n GOOGLE_CHAT_SERVICE_NAME,\n type GoogleChatUser,\n getUserDisplayName,\n} from \"../types.js\";\n\nexport const userContextProvider: Provider = {\n name: \"googleChatUserContext\",\n description:\n \"Provides information about the Google Chat user in the current conversation\",\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n if (message.content.source !== \"google-chat\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const gchatService = runtime.getService<GoogleChatService>(\n GOOGLE_CHAT_SERVICE_NAME,\n );\n\n if (!gchatService || !gchatService.isConnected()) {\n return {\n data: { connected: false },\n values: { connected: false },\n text: \"\",\n };\n }\n\n const agentName = state?.agentName || \"The agent\";\n\n const sender = state?.data?.sender as GoogleChatUser | undefined;\n\n if (!sender) {\n return {\n data: { connected: true },\n values: { connected: true },\n text: \"\",\n };\n }\n\n const userName = sender.name;\n const displayName = getUserDisplayName(sender);\n const userId = extractResourceId(userName);\n const email = sender.email;\n const userType = sender.type;\n\n let responseText = `${agentName} is talking to ${displayName}`;\n if (email) {\n responseText += ` (${email})`;\n }\n responseText += \" on Google Chat.\";\n\n if (userType === \"BOT\") {\n responseText += \" This user is a bot.\";\n }\n\n return {\n data: {\n userName,\n userId,\n displayName,\n email: email || undefined,\n userType: userType || \"HUMAN\",\n isBot: userType === \"BOT\",\n },\n values: {\n userName,\n userId,\n displayName,\n email: email || undefined,\n },\n text: responseText,\n };\n },\n};\n",
|
|
12
|
-
"/**\n * Google Chat service implementation for ElizaOS.\n */\n\nimport {\n type EventPayload,\n type IAgentRuntime,\n logger,\n Service,\n} from \"@elizaos/core\";\nimport { GoogleAuth } from \"google-auth-library\";\nimport {\n GOOGLE_CHAT_SERVICE_NAME,\n GoogleChatApiError,\n GoogleChatAuthenticationError,\n GoogleChatConfigurationError,\n type GoogleChatEvent,\n GoogleChatEventTypes,\n type GoogleChatMessageSendOptions,\n type GoogleChatReaction,\n type GoogleChatSendResult,\n type GoogleChatSettings,\n type GoogleChatSpace,\n type IGoogleChatService,\n} from \"./types.js\";\n\nconst CHAT_API_BASE = \"https://chat.googleapis.com/v1\";\nconst CHAT_UPLOAD_BASE = \"https://chat.googleapis.com/upload/v1\";\nconst CHAT_SCOPE = \"https://www.googleapis.com/auth/chat.bot\";\n\nexport class GoogleChatService extends Service implements IGoogleChatService {\n static serviceType = GOOGLE_CHAT_SERVICE_NAME;\n\n capabilityDescription =\n \"Google Chat service for sending and receiving messages in Google Workspace\";\n\n private settings: GoogleChatSettings | null = null;\n private auth: GoogleAuth | null = null;\n private connected = false;\n private cachedSpaces: GoogleChatSpace[] = [];\n\n static async start(runtime: IAgentRuntime): Promise<GoogleChatService> {\n logger.info(\"Starting Google Chat service...\");\n\n const service = new GoogleChatService(runtime);\n service.settings = service.loadSettings();\n service.validateSettings();\n\n await service.initializeAuth();\n await service.testConnection();\n\n service.connected = true;\n logger.info(\"Google Chat service started successfully\");\n runtime.emitEvent(GoogleChatEventTypes.CONNECTION_READY, {\n runtime,\n service,\n } as EventPayload);\n\n return service;\n }\n\n async stop(): Promise<void> {\n logger.info(\"Stopping Google Chat service...\");\n this.connected = false;\n this.auth = null;\n logger.info(\"Google Chat service stopped\");\n }\n\n private loadSettings(): GoogleChatSettings {\n const runtime = this.runtime;\n if (!runtime) {\n throw new GoogleChatConfigurationError(\"Runtime not initialized\");\n }\n\n const getStringSetting = (\n key: string,\n envKey: string,\n defaultValue = \"\",\n ): string => {\n const value = runtime.getSetting(key);\n if (typeof value === \"string\") return value;\n return process.env[envKey] || defaultValue;\n };\n\n const serviceAccount = getStringSetting(\n \"GOOGLE_CHAT_SERVICE_ACCOUNT\",\n \"GOOGLE_CHAT_SERVICE_ACCOUNT\",\n );\n const serviceAccountFile = getStringSetting(\n \"GOOGLE_CHAT_SERVICE_ACCOUNT_FILE\",\n \"GOOGLE_CHAT_SERVICE_ACCOUNT_FILE\",\n );\n const audienceType = getStringSetting(\n \"GOOGLE_CHAT_AUDIENCE_TYPE\",\n \"GOOGLE_CHAT_AUDIENCE_TYPE\",\n \"app-url\",\n );\n const audience = getStringSetting(\n \"GOOGLE_CHAT_AUDIENCE\",\n \"GOOGLE_CHAT_AUDIENCE\",\n );\n const webhookPath = getStringSetting(\n \"GOOGLE_CHAT_WEBHOOK_PATH\",\n \"GOOGLE_CHAT_WEBHOOK_PATH\",\n \"/googlechat\",\n );\n const spacesRaw = getStringSetting(\n \"GOOGLE_CHAT_SPACES\",\n \"GOOGLE_CHAT_SPACES\",\n );\n const requireMention = getStringSetting(\n \"GOOGLE_CHAT_REQUIRE_MENTION\",\n \"GOOGLE_CHAT_REQUIRE_MENTION\",\n \"true\",\n );\n const enabled = getStringSetting(\n \"GOOGLE_CHAT_ENABLED\",\n \"GOOGLE_CHAT_ENABLED\",\n \"true\",\n );\n const botUser =\n getStringSetting(\"GOOGLE_CHAT_BOT_USER\", \"GOOGLE_CHAT_BOT_USER\") ||\n undefined;\n\n return {\n serviceAccount: serviceAccount || undefined,\n serviceAccountFile: serviceAccountFile || undefined,\n audienceType: audienceType as \"app-url\" | \"project-number\",\n audience,\n webhookPath: webhookPath.startsWith(\"/\")\n ? webhookPath\n : `/${webhookPath}`,\n spaces: spacesRaw\n ? spacesRaw\n .split(\",\")\n .map((s: string) => s.trim())\n .filter(Boolean)\n : [],\n requireMention: requireMention.toLowerCase() !== \"false\",\n enabled: enabled.toLowerCase() !== \"false\",\n botUser: botUser || undefined,\n };\n }\n\n private validateSettings(): void {\n const settings = this.settings;\n if (!settings) {\n throw new GoogleChatConfigurationError(\"Settings not loaded\");\n }\n\n if (!settings.serviceAccount && !settings.serviceAccountFile) {\n if (!process.env.GOOGLE_APPLICATION_CREDENTIALS) {\n throw new GoogleChatConfigurationError(\n \"Google Chat requires service account credentials. Set GOOGLE_CHAT_SERVICE_ACCOUNT, GOOGLE_CHAT_SERVICE_ACCOUNT_FILE, or GOOGLE_APPLICATION_CREDENTIALS.\",\n \"GOOGLE_CHAT_SERVICE_ACCOUNT\",\n );\n }\n }\n\n if (!settings.audience) {\n throw new GoogleChatConfigurationError(\n \"GOOGLE_CHAT_AUDIENCE is required for webhook verification\",\n \"GOOGLE_CHAT_AUDIENCE\",\n );\n }\n\n if (![\"app-url\", \"project-number\"].includes(settings.audienceType)) {\n throw new GoogleChatConfigurationError(\n \"GOOGLE_CHAT_AUDIENCE_TYPE must be 'app-url' or 'project-number'\",\n \"GOOGLE_CHAT_AUDIENCE_TYPE\",\n );\n }\n }\n\n private async initializeAuth(): Promise<void> {\n const settings = this.settings;\n if (!settings) {\n throw new GoogleChatConfigurationError(\"Settings not loaded\");\n }\n\n if (settings.serviceAccountFile) {\n this.auth = new GoogleAuth({\n keyFile: settings.serviceAccountFile,\n scopes: [CHAT_SCOPE],\n });\n } else if (settings.serviceAccount) {\n const credentials = JSON.parse(settings.serviceAccount) as Record<\n string,\n unknown\n >;\n this.auth = new GoogleAuth({\n credentials,\n scopes: [CHAT_SCOPE],\n });\n } else {\n this.auth = new GoogleAuth({\n scopes: [CHAT_SCOPE],\n });\n }\n\n logger.info(\"Google Auth initialized\");\n }\n\n private async testConnection(): Promise<void> {\n const token = await this.getAccessToken();\n if (!token) {\n throw new GoogleChatAuthenticationError(\"Failed to obtain access token\");\n }\n\n const url = `${CHAT_API_BASE}/spaces?pageSize=1`;\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new GoogleChatApiError(\n `Failed to connect to Google Chat API: ${text || response.statusText}`,\n response.status,\n );\n }\n\n logger.info(\"Google Chat API connection verified\");\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n getBotUser(): string | undefined {\n return this.settings?.botUser;\n }\n\n async getAccessToken(): Promise<string> {\n if (!this.auth) {\n throw new GoogleChatAuthenticationError(\"Auth not initialized\");\n }\n\n const client = await this.auth.getClient();\n const tokenResponse = await client.getAccessToken();\n const token =\n typeof tokenResponse === \"string\" ? tokenResponse : tokenResponse?.token;\n\n if (!token) {\n throw new GoogleChatAuthenticationError(\"Failed to obtain access token\");\n }\n\n return token;\n }\n\n private async fetchApi<T>(url: string, init: RequestInit = {}): Promise<T> {\n const token = await this.getAccessToken();\n\n const response = await fetch(url, {\n ...init,\n headers: {\n ...init.headers,\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new GoogleChatApiError(\n `Google Chat API error: ${text || response.statusText}`,\n response.status,\n );\n }\n\n return (await response.json()) as T;\n }\n\n async getSpaces(): Promise<GoogleChatSpace[]> {\n const url = `${CHAT_API_BASE}/spaces`;\n const response = await this.fetchApi<{ spaces?: GoogleChatSpace[] }>(url);\n this.cachedSpaces = response.spaces || [];\n return this.cachedSpaces;\n }\n\n async sendMessage(\n options: GoogleChatMessageSendOptions,\n ): Promise<GoogleChatSendResult> {\n if (!options.space) {\n return {\n success: false,\n error: \"Space is required\",\n };\n }\n\n const body: Record<string, unknown> = {};\n\n if (options.text) {\n body.text = options.text;\n }\n\n if (options.thread) {\n body.thread = { name: options.thread };\n }\n\n if (options.attachments && options.attachments.length > 0) {\n body.attachment = options.attachments.map((att) => ({\n attachmentDataRef: { attachmentUploadToken: att.attachmentUploadToken },\n ...(att.contentName ? { contentName: att.contentName } : {}),\n }));\n }\n\n const url = `${CHAT_API_BASE}/${options.space}/messages`;\n\n const result = await this.fetchApi<{ name?: string }>(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n\n logger.debug(`Message sent to ${options.space}: ${result.name}`);\n\n if (this.runtime) {\n this.runtime.emitEvent(GoogleChatEventTypes.MESSAGE_SENT, {\n runtime: this.runtime,\n messageName: result.name,\n space: options.space,\n } as EventPayload);\n }\n\n return {\n success: true,\n messageName: result.name,\n space: options.space,\n };\n }\n\n async updateMessage(\n messageName: string,\n text: string,\n ): Promise<{ success: boolean; messageName?: string; error?: string }> {\n const url = `${CHAT_API_BASE}/${messageName}?updateMask=text`;\n\n const result = await this.fetchApi<{ name?: string }>(url, {\n method: \"PATCH\",\n body: JSON.stringify({ text }),\n });\n\n return {\n success: true,\n messageName: result.name,\n };\n }\n\n async deleteMessage(\n messageName: string,\n ): Promise<{ success: boolean; error?: string }> {\n const url = `${CHAT_API_BASE}/${messageName}`;\n const token = await this.getAccessToken();\n\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n success: false,\n error: `Failed to delete message: ${text || response.statusText}`,\n };\n }\n\n return { success: true };\n }\n\n async sendReaction(\n messageName: string,\n emoji: string,\n ): Promise<{ success: boolean; name?: string; error?: string }> {\n const url = `${CHAT_API_BASE}/${messageName}/reactions`;\n\n const result = await this.fetchApi<GoogleChatReaction>(url, {\n method: \"POST\",\n body: JSON.stringify({ emoji: { unicode: emoji } }),\n });\n\n if (this.runtime) {\n this.runtime.emitEvent(GoogleChatEventTypes.REACTION_SENT, {\n runtime: this.runtime,\n messageName,\n emoji,\n reactionName: result.name,\n } as EventPayload);\n }\n\n return {\n success: true,\n name: result.name,\n };\n }\n\n async deleteReaction(\n reactionName: string,\n ): Promise<{ success: boolean; error?: string }> {\n const url = `${CHAT_API_BASE}/${reactionName}`;\n const token = await this.getAccessToken();\n\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n success: false,\n error: `Failed to delete reaction: ${text || response.statusText}`,\n };\n }\n\n return { success: true };\n }\n\n async listReactions(\n messageName: string,\n limit?: number,\n ): Promise<GoogleChatReaction[]> {\n const url = new URL(`${CHAT_API_BASE}/${messageName}/reactions`);\n if (limit && limit > 0) {\n url.searchParams.set(\"pageSize\", String(limit));\n }\n\n const result = await this.fetchApi<{ reactions?: GoogleChatReaction[] }>(\n url.toString(),\n );\n\n return result.reactions || [];\n }\n\n async findDirectMessage(userName: string): Promise<GoogleChatSpace | null> {\n const url = new URL(`${CHAT_API_BASE}/spaces:findDirectMessage`);\n url.searchParams.set(\"name\", userName);\n\n const result = await this.fetchApi<GoogleChatSpace | null>(url.toString());\n return result;\n }\n\n async uploadAttachment(\n space: string,\n filename: string,\n buffer: Buffer,\n contentType?: string,\n ): Promise<{ attachmentUploadToken?: string }> {\n const boundary = `elizaos-${crypto.randomUUID()}`;\n const metadata = JSON.stringify({ filename });\n const header = `--${boundary}\\r\\nContent-Type: application/json; charset=UTF-8\\r\\n\\r\\n${metadata}\\r\\n`;\n const mediaHeader = `--${boundary}\\r\\nContent-Type: ${contentType || \"application/octet-stream\"}\\r\\n\\r\\n`;\n const footer = `\\r\\n--${boundary}--\\r\\n`;\n\n const body = Buffer.concat([\n Buffer.from(header, \"utf8\"),\n Buffer.from(mediaHeader, \"utf8\"),\n buffer,\n Buffer.from(footer, \"utf8\"),\n ]);\n\n const token = await this.getAccessToken();\n const url = `${CHAT_UPLOAD_BASE}/${space}/attachments:upload?uploadType=multipart`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": `multipart/related; boundary=${boundary}`,\n },\n body,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new GoogleChatApiError(\n `Failed to upload attachment: ${text || response.statusText}`,\n response.status,\n );\n }\n\n const payload = (await response.json()) as {\n attachmentDataRef?: { attachmentUploadToken?: string };\n };\n\n return {\n attachmentUploadToken: payload.attachmentDataRef?.attachmentUploadToken,\n };\n }\n\n async downloadMedia(\n resourceName: string,\n maxBytes?: number,\n ): Promise<{ buffer: Buffer; contentType?: string }> {\n const url = `${CHAT_API_BASE}/media/${resourceName}?alt=media`;\n const token = await this.getAccessToken();\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new GoogleChatApiError(\n `Failed to download media: ${text || response.statusText}`,\n response.status,\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n if (maxBytes && contentLength) {\n const length = Number(contentLength);\n if (Number.isFinite(length) && length > maxBytes) {\n throw new GoogleChatApiError(\n `Media exceeds max bytes (${maxBytes})`,\n 413,\n );\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const contentType = response.headers.get(\"content-type\") || undefined;\n\n return { buffer, contentType };\n }\n\n getSettings(): GoogleChatSettings | null {\n return this.settings;\n }\n\n async processWebhookEvent(event: GoogleChatEvent): Promise<void> {\n const eventType = event.type;\n\n if (!this.runtime) return;\n\n if (eventType === \"MESSAGE\") {\n this.runtime.emitEvent(GoogleChatEventTypes.MESSAGE_RECEIVED, {\n runtime: this.runtime,\n event,\n message: event.message,\n space: event.space,\n user: event.user,\n } as EventPayload);\n } else if (eventType === \"ADDED_TO_SPACE\") {\n this.runtime.emitEvent(GoogleChatEventTypes.SPACE_JOINED, {\n runtime: this.runtime,\n space: event.space,\n user: event.user,\n } as EventPayload);\n } else if (eventType === \"REMOVED_FROM_SPACE\") {\n this.runtime.emitEvent(GoogleChatEventTypes.SPACE_LEFT, {\n runtime: this.runtime,\n space: event.space,\n user: event.user,\n } as EventPayload);\n }\n }\n}\n"
|
|
13
|
-
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "636667934C16DD1564756E2164756E21",
|
|
16
|
-
"names": []
|
|
17
|
-
}
|