diff --git a/extensions/googlechat/src/monitor.ts b/extensions/googlechat/src/monitor.ts index b3ad36049..459902795 100644 --- a/extensions/googlechat/src/monitor.ts +++ b/extensions/googlechat/src/monitor.ts @@ -264,6 +264,19 @@ export async function handleGoogleChatWebhookRequest( } selected.statusSink?.({ lastInboundAt: Date.now() }); + + // For synchronous responses in spaces, handle non-MESSAGE events immediately + const evtType = (event.type ?? (event as { eventType?: string }).eventType)?.toUpperCase(); + const isGroup = event.space?.type?.toUpperCase() !== "DM"; + + // For non-MESSAGE events in groups (like ADDED_TO_SPACE), return an acknowledgment + if (isGroup && evtType !== "MESSAGE") { + res.statusCode = 200; + res.setHeader("Content-Type", "application/json"); + res.end(JSON.stringify({ text: "Hello! I'm ready to help. 🦞" })); + return true; + } + processGoogleChatEvent(event, selected).catch((err) => { selected?.runtime.error?.( `[${selected.account.accountId}] Google Chat webhook failed: ${String(err)}`, @@ -642,6 +655,9 @@ async function processMessageWithPipeline(params: { GroupSystemPrompt: isGroup ? groupSystemPrompt : undefined, OriginatingChannel: "googlechat", OriginatingTo: `googlechat:${spaceId}`, + // Thread reply context + IsThreadReply: message.threadReply, + QuotedMessageId: message.quotedMessageMetadata?.name, }); void core.channel.session diff --git a/extensions/googlechat/src/types.ts b/extensions/googlechat/src/types.ts index 820c96425..74c9d7867 100644 --- a/extensions/googlechat/src/types.ts +++ b/extensions/googlechat/src/types.ts @@ -47,6 +47,11 @@ export type GoogleChatAnnotation = { customEmojiMetadata?: Record; }; +export type GoogleChatQuotedMessageMetadata = { + name?: string; + lastUpdateTime?: string; +}; + export type GoogleChatMessage = { name?: string; text?: string; @@ -55,6 +60,10 @@ export type GoogleChatMessage = { thread?: GoogleChatThread; attachment?: GoogleChatAttachment[]; annotations?: GoogleChatAnnotation[]; + /** True if this message is a reply in a thread */ + threadReply?: boolean; + /** Metadata about the quoted/original message being replied to */ + quotedMessageMetadata?: GoogleChatQuotedMessageMetadata; }; export type GoogleChatEvent = {