mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-07-17 21:40:39 -07:00
feat: add Google Chat bridge for A2UI integration
Implements a Google Chat HTTP webhook bridge that connects Google Chat to the A2A server. Each Chat thread maps to an A2A contextId/taskId pair. The bridge converts A2UI tool approval surfaces to Google Chat Cards V2 with Approve/Always Allow/Reject buttons, and handles CARD_CLICKED events to forward tool confirmations back to the A2A server. Components: - chat-bridge/types.ts: Google Chat event/response types - chat-bridge/session-store.ts: Thread -> A2A session mapping - chat-bridge/a2a-bridge-client.ts: A2A SDK client wrapper - chat-bridge/response-renderer.ts: A2UI -> Google Chat Cards V2 - chat-bridge/handler.ts: Event handler (MESSAGE, CARD_CLICKED) - chat-bridge/routes.ts: Express routes mounted at /chat/webhook
This commit is contained in:
@@ -29,6 +29,7 @@ import { debugLogger, SimpleExtensionLoader } from '@google/gemini-cli-core';
|
||||
import type { Command, CommandArgument } from '../commands/types.js';
|
||||
import { GitService } from '@google/gemini-cli-core';
|
||||
import { getA2UIAgentExtension } from '../a2ui/a2ui-extension.js';
|
||||
import { createChatBridgeRoutes } from '../chat-bridge/routes.js';
|
||||
|
||||
type CommandResponse = {
|
||||
name: string;
|
||||
@@ -305,6 +306,22 @@ export async function createApp() {
|
||||
}
|
||||
});
|
||||
|
||||
// Mount Google Chat bridge routes if configured
|
||||
const chatBridgeUrl =
|
||||
process.env['CHAT_BRIDGE_A2A_URL'] || process.env['CODER_AGENT_PORT']
|
||||
? `http://localhost:${process.env['CODER_AGENT_PORT'] || '8080'}`
|
||||
: undefined;
|
||||
if (chatBridgeUrl) {
|
||||
const chatRoutes = createChatBridgeRoutes({
|
||||
a2aServerUrl: chatBridgeUrl,
|
||||
debug: process.env['CHAT_BRIDGE_DEBUG'] === 'true',
|
||||
});
|
||||
expressApp.use(chatRoutes);
|
||||
logger.info(
|
||||
`[CoreAgent] Google Chat bridge enabled at /chat/webhook (A2A: ${chatBridgeUrl})`,
|
||||
);
|
||||
}
|
||||
|
||||
expressApp.get('/tasks/:taskId/metadata', async (req, res) => {
|
||||
const taskId = req.params.taskId;
|
||||
let wrapper = agentExecutor.getTask(taskId);
|
||||
|
||||
Reference in New Issue
Block a user