diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c7d21732e0..b4cd2e2e358 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Docs: https://docs.openclaw.ai - Plugins/update: treat official externalized bundled npm migrations and ClawHub-to-npm fallbacks as trusted source-linked installs, so prerelease-only official plugin packages can migrate from bundled builds without being rejected as unsafe prerelease resolutions. Thanks @vincentkoc. - Plugins/update: clean stale bundled load paths for already-externalized pinned npm and ClawHub plugin installs, so release-channel sync does not leave removed bundled paths ahead of the installed external package. Thanks @vincentkoc. - Plugins/CLI: include package dependency install state in `openclaw plugins list --json` so scripts can spot missing plugin dependencies without runtime-loading plugins. +- Google Meet: preserve `realtime.introMessage: ""` so realtime Chrome joins can stay silent instead of restoring the default spoken intro. Thanks @vincentkoc. - Discord/status: add degraded Discord transport and gateway event-loop starvation signals to `openclaw channels status`, `openclaw status --deep`, and fetch-timeout logs so intermittent socket resets do not look like a healthy running channel. (#76327) Thanks @joshavant. - Providers/OpenRouter: add opt-in response caching params that send OpenRouter's `X-OpenRouter-Cache`, `X-OpenRouter-Cache-TTL`, and cache-clear headers only on verified OpenRouter routes. Thanks @vincentkoc. - Providers/OpenRouter: expand app-attribution categories so OpenClaw advertises coding, programming, writing, chat, and personal-agent usage on verified OpenRouter routes. Thanks @vincentkoc. diff --git a/extensions/google-meet/index.test.ts b/extensions/google-meet/index.test.ts index acd3b7a165e..d1e550e8c51 100644 --- a/extensions/google-meet/index.test.ts +++ b/extensions/google-meet/index.test.ts @@ -451,6 +451,16 @@ describe("google-meet plugin", () => { ).toBe("jay"); }); + it("preserves an empty realtime intro message for silent joins", () => { + expect( + resolveGoogleMeetConfig({ + realtime: { + introMessage: "", + }, + }).realtime.introMessage, + ).toBe(""); + }); + it("keeps legacy command-pair audio format when custom commands omit a format", () => { expect( resolveGoogleMeetConfig({ diff --git a/extensions/google-meet/src/config.ts b/extensions/google-meet/src/config.ts index e160839c9da..5a094f96d24 100644 --- a/extensions/google-meet/src/config.ts +++ b/extensions/google-meet/src/config.ts @@ -271,6 +271,10 @@ function readEnvString(env: NodeJS.ProcessEnv, keys: readonly string[]): string return undefined; } +function normalizeStringAllowEmpty(value: unknown): string | undefined { + return typeof value === "string" ? value.trim() : undefined; +} + function readEnvBoolean(env: NodeJS.ProcessEnv, keys: readonly string[]): boolean | undefined { const normalized = normalizeOptionalLowercaseString(readEnvString(env, keys)); if (!normalized) { @@ -486,7 +490,7 @@ export function resolveGoogleMeetConfigWithEnv( normalizeOptionalString(realtime.instructions) ?? DEFAULT_GOOGLE_MEET_CONFIG.realtime.instructions, introMessage: - normalizeOptionalString(realtime.introMessage) ?? + normalizeStringAllowEmpty(realtime.introMessage) ?? DEFAULT_GOOGLE_MEET_CONFIG.realtime.introMessage, agentId: normalizeOptionalString(realtime.agentId), toolPolicy: resolveRealtimeVoiceAgentConsultToolPolicy(