diff --git a/extensions/bluebubbles/src/runtime.ts b/extensions/bluebubbles/src/runtime.ts index 439e62d2503..c9468234d3e 100644 --- a/extensions/bluebubbles/src/runtime.ts +++ b/extensions/bluebubbles/src/runtime.ts @@ -1,6 +1,7 @@ import type { PluginRuntime } from "openclaw/plugin-sdk"; let runtime: PluginRuntime | null = null; +type LegacyRuntimeLogShape = { log?: (message: string) => void }; export function setBlueBubblesRuntime(next: PluginRuntime): void { runtime = next; @@ -23,7 +24,8 @@ export function getBlueBubblesRuntime(): PluginRuntime { export function warnBlueBubbles(message: string): void { const formatted = `[bluebubbles] ${message}`; - const log = runtime?.log; + // Backward-compatible with tests/legacy injections that pass { log }. + const log = (runtime as unknown as LegacyRuntimeLogShape | null)?.log; if (typeof log === "function") { log(formatted); return; diff --git a/extensions/bluebubbles/src/test-harness.ts b/extensions/bluebubbles/src/test-harness.ts index 7c6938a9681..5f7351b2e9f 100644 --- a/extensions/bluebubbles/src/test-harness.ts +++ b/extensions/bluebubbles/src/test-harness.ts @@ -2,10 +2,10 @@ import type { Mock } from "vitest"; import { afterEach, beforeEach, vi } from "vitest"; export const BLUE_BUBBLES_PRIVATE_API_STATUS = { - enabled: true as const, - disabled: false as const, - unknown: null as const, -}; + enabled: true, + disabled: false, + unknown: null, +} as const; type BlueBubblesPrivateApiStatusMock = { mockReturnValue: (value: boolean | null) => unknown; @@ -47,6 +47,7 @@ export function createBlueBubblesAccountsMockModule() { type BlueBubblesProbeMockModule = { getCachedBlueBubblesPrivateApiStatus: Mock<() => boolean | null>; + isBlueBubblesPrivateApiStatusEnabled: Mock<(status: boolean | null) => boolean>; }; export function createBlueBubblesProbeMockModule(): BlueBubblesProbeMockModule { @@ -54,6 +55,7 @@ export function createBlueBubblesProbeMockModule(): BlueBubblesProbeMockModule { getCachedBlueBubblesPrivateApiStatus: vi .fn() .mockReturnValue(BLUE_BUBBLES_PRIVATE_API_STATUS.unknown), + isBlueBubblesPrivateApiStatusEnabled: vi.fn((status: boolean | null) => status === true), }; } diff --git a/extensions/feishu/src/channel.ts b/extensions/feishu/src/channel.ts index c1f29be85e5..dbd1e46facb 100644 --- a/extensions/feishu/src/channel.ts +++ b/extensions/feishu/src/channel.ts @@ -225,9 +225,7 @@ export const feishuPlugin: ChannelPlugin = { collectWarnings: ({ cfg, accountId }) => { const account = resolveFeishuAccount({ cfg, accountId }); const feishuCfg = account.config; - const defaultGroupPolicy = ( - cfg.channels as Record | undefined - )?.defaults?.groupPolicy; + const defaultGroupPolicy = cfg.channels?.defaults?.groupPolicy; const { groupPolicy } = resolveRuntimeGroupPolicy({ providerConfigPresent: cfg.channels?.feishu !== undefined, groupPolicy: feishuCfg?.groupPolicy, diff --git a/extensions/line/src/channel.ts b/extensions/line/src/channel.ts index f5c72cf81b4..b70aa4f1c05 100644 --- a/extensions/line/src/channel.ts +++ b/extensions/line/src/channel.ts @@ -162,8 +162,7 @@ export const linePlugin: ChannelPlugin = { }; }, collectWarnings: ({ account, cfg }) => { - const defaultGroupPolicy = (cfg.channels?.defaults as { groupPolicy?: string } | undefined) - ?.groupPolicy; + const defaultGroupPolicy = cfg.channels?.defaults?.groupPolicy; const { groupPolicy } = resolveRuntimeGroupPolicy({ providerConfigPresent: cfg.channels?.line !== undefined, groupPolicy: account.config.groupPolicy,