From 96724e5a4b8db406ee7c85ae86067fa79273ff52 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 7 Apr 2026 16:45:22 +0100 Subject: [PATCH] Messaging: align adapter compile surfaces --- extensions/googlechat/src/channel.test.ts | 16 +++------- extensions/googlechat/src/channel.ts | 1 + .../line/src/bot-message-context.test.ts | 23 --------------- extensions/qqbot/src/config.test.ts | 20 ++++++------- extensions/zalouser/src/channel.ts | 1 + test/helpers/plugins/setup-wizard.ts | 29 ++++++++++--------- 6 files changed, 32 insertions(+), 58 deletions(-) diff --git a/extensions/googlechat/src/channel.test.ts b/extensions/googlechat/src/channel.test.ts index 85a30e2e692..7bf58715e6a 100644 --- a/extensions/googlechat/src/channel.test.ts +++ b/extensions/googlechat/src/channel.test.ts @@ -58,7 +58,7 @@ function resolveGoogleChatAccountImpl(params: { cfg: OpenClawConfig; accountId?: name: typeof config.name === "string" ? config.name : undefined, enabled: channelConfig.enabled !== false && scoped.enabled !== false, config, - credentialSource: serviceAccount ? "inline" : "none", + credentialSource: serviceAccount ? ("inline" as const) : ("none" as const), }; } @@ -360,8 +360,6 @@ describe("googlechatPlugin outbound resolveTarget", () => { it("resolves valid chat targets", () => { const result = resolveTarget({ to: "spaces/AAA", - mode: "explicit", - allowFrom: [], }); expect(result.ok).toBe(true); @@ -374,8 +372,6 @@ describe("googlechatPlugin outbound resolveTarget", () => { it("resolves email targets", () => { const result = resolveTarget({ to: "user@example.com", - mode: "explicit", - allowFrom: [], }); expect(result.ok).toBe(true); @@ -388,8 +384,6 @@ describe("googlechatPlugin outbound resolveTarget", () => { it("errors on invalid targets", () => { const result = resolveTarget({ to: " ", - mode: "explicit", - allowFrom: [], }); expect(result.ok).toBe(false); @@ -402,8 +396,6 @@ describe("googlechatPlugin outbound resolveTarget", () => { it("errors when no target is provided", () => { const result = resolveTarget({ to: undefined, - mode: "explicit", - allowFrom: [], }); expect(result.ok).toBe(false); @@ -433,7 +425,7 @@ describe("googlechatPlugin outbound cfg threading", () => { const account = { accountId: "work", config: {}, - credentialSource: "inline", + credentialSource: "inline" as const, }; resolveGoogleChatAccountMock.mockReturnValue(account); resolveGoogleChatOutboundSpaceMock.mockResolvedValue("spaces/WORK"); @@ -474,7 +466,7 @@ describe("googlechatPlugin outbound cfg threading", () => { const account = { accountId: "default", config: {}, - credentialSource: "inline", + credentialSource: "inline" as const, }; resolveGoogleChatAccountMock.mockReturnValue(account); resolveGoogleChatOutboundSpaceMock.mockResolvedValue("spaces/AAA"); @@ -516,7 +508,7 @@ describe("googlechatPlugin outbound cfg threading", () => { const account = { accountId: "default", config: { mediaMaxMb: 20 }, - credentialSource: "inline", + credentialSource: "inline" as const, }; const { fetchRemoteMedia } = setupRuntimeMediaMocks({ loadFileName: "unused.png", diff --git a/extensions/googlechat/src/channel.ts b/extensions/googlechat/src/channel.ts index 7b359e9079f..2c7cc73026c 100644 --- a/extensions/googlechat/src/channel.ts +++ b/extensions/googlechat/src/channel.ts @@ -17,6 +17,7 @@ import { formatAllowFromEntry, googlechatDirectoryAdapter, googlechatGroupsAdapter, + loadGoogleChatChannelRuntime, googlechatOutboundAdapter, googlechatPairingTextAdapter, googlechatSecurityAdapter, diff --git a/extensions/line/src/bot-message-context.test.ts b/extensions/line/src/bot-message-context.test.ts index de45ab14f68..803c4b5c77a 100644 --- a/extensions/line/src/bot-message-context.test.ts +++ b/extensions/line/src/bot-message-context.test.ts @@ -17,8 +17,6 @@ import type { ResolvedLineAccount } from "./types.js"; type MessageEvent = webhook.MessageEvent; type PostbackEvent = webhook.PostbackEvent; -type AgentBinding = NonNullable[number]; - const lineBindingsPlugin = { id: "line", bindings: lineBindingsAdapter, @@ -331,11 +329,6 @@ describe("buildLineMessageContext", () => { it("normalizes LINE ACP binding conversation ids through the plugin bindings surface", async () => { const compiled = lineBindingsAdapter.compileConfiguredBinding({ - binding: { - type: "acp", - agentId: "codex", - match: { channel: "line", accountId: "default", peer: { kind: "direct", id: "unused" } }, - } as AgentBinding, conversationId: "line:user:U1234567890abcdef1234567890abcdef", }); @@ -344,11 +337,6 @@ describe("buildLineMessageContext", () => { }); expect( lineBindingsAdapter.matchInboundConversation({ - binding: { - type: "acp", - agentId: "codex", - match: { channel: "line", accountId: "default", peer: { kind: "direct", id: "unused" } }, - } as AgentBinding, compiledBinding: compiled!, conversationId: "U1234567890abcdef1234567890abcdef", }), @@ -360,11 +348,6 @@ describe("buildLineMessageContext", () => { it("normalizes canonical LINE targets through the plugin bindings surface", async () => { const compiled = lineBindingsAdapter.compileConfiguredBinding({ - binding: { - type: "acp", - agentId: "codex", - match: { channel: "line", accountId: "default", peer: { kind: "direct", id: "unused" } }, - } as AgentBinding, conversationId: "line:U1234567890abcdef1234567890abcdef", }); @@ -373,7 +356,6 @@ describe("buildLineMessageContext", () => { }); expect( lineBindingsAdapter.resolveCommandConversation({ - accountId: "default", originatingTo: "line:U1234567890abcdef1234567890abcdef", }), ).toEqual({ @@ -381,11 +363,6 @@ describe("buildLineMessageContext", () => { }); expect( lineBindingsAdapter.matchInboundConversation({ - binding: { - type: "acp", - agentId: "codex", - match: { channel: "line", accountId: "default", peer: { kind: "direct", id: "unused" } }, - } as AgentBinding, compiledBinding: compiled!, conversationId: "U1234567890abcdef1234567890abcdef", }), diff --git a/extensions/qqbot/src/config.test.ts b/extensions/qqbot/src/config.test.ts index d90b03bfb08..46893b5f916 100644 --- a/extensions/qqbot/src/config.test.ts +++ b/extensions/qqbot/src/config.test.ts @@ -276,28 +276,28 @@ describe("qqbot config", () => { cfg: {} as OpenClawConfig, accountId: DEFAULT_ACCOUNT_ID, input, - }), + } as never), ).toBe("QQBot --token must be in appId:clientSecret format"); expect( lightweightSetup!.validateInput?.({ cfg: {} as OpenClawConfig, accountId: DEFAULT_ACCOUNT_ID, input, - }), + } as never), ).toBe("QQBot --token must be in appId:clientSecret format"); expect( runtimeSetup.applyAccountConfig?.({ cfg: {} as OpenClawConfig, accountId: DEFAULT_ACCOUNT_ID, input, - }), + } as never), ).toEqual({}); expect( lightweightSetup!.applyAccountConfig?.({ cfg: {} as OpenClawConfig, accountId: DEFAULT_ACCOUNT_ID, input, - }), + } as never), ).toEqual({}); }); @@ -314,7 +314,7 @@ describe("qqbot config", () => { cfg: {} as OpenClawConfig, accountId: DEFAULT_ACCOUNT_ID, input, - }), + } as never), ).toMatchObject({ channels: { qqbot: { @@ -329,7 +329,7 @@ describe("qqbot config", () => { cfg: {} as OpenClawConfig, accountId: DEFAULT_ACCOUNT_ID, input, - }), + } as never), ).toMatchObject({ channels: { qqbot: { @@ -375,28 +375,28 @@ describe("qqbot config", () => { cfg: {} as OpenClawConfig, accountId: "bot2", input, - }), + } as never), ).toBe("QQBot --use-env only supports the default account"); expect( lightweightSetup!.validateInput?.({ cfg: {} as OpenClawConfig, accountId: "bot2", input, - }), + } as never), ).toBe("QQBot --use-env only supports the default account"); expect( runtimeSetup.applyAccountConfig?.({ cfg: {} as OpenClawConfig, accountId: "bot2", input, - }), + } as never), ).toEqual({}); expect( lightweightSetup!.applyAccountConfig?.({ cfg: {} as OpenClawConfig, accountId: "bot2", input, - }), + } as never), ).toEqual({}); }); }); diff --git a/extensions/zalouser/src/channel.ts b/extensions/zalouser/src/channel.ts index eddbcee2fc6..d7b93741b59 100644 --- a/extensions/zalouser/src/channel.ts +++ b/extensions/zalouser/src/channel.ts @@ -1,6 +1,7 @@ import { createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core"; import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-lifecycle"; +import { buildPassiveProbedChannelStatusSummary } from "openclaw/plugin-sdk/extension-shared"; import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime"; import { createAsyncComputedAccountStatusAdapter, diff --git a/test/helpers/plugins/setup-wizard.ts b/test/helpers/plugins/setup-wizard.ts index 0141fb33c64..f30cc211af8 100644 --- a/test/helpers/plugins/setup-wizard.ts +++ b/test/helpers/plugins/setup-wizard.ts @@ -90,6 +90,11 @@ type SetupWizardAdapterParams = Parameters; type SetupWizardCredentialValues = Record; +type SetupWizardTestPlugin = { + id: string; + setupWizard?: ChannelPlugin["setupWizard"]; + config: Record; +} & Record; function isDeclarativeSetupWizard( setupWizard: ChannelPlugin["setupWizard"], @@ -102,9 +107,7 @@ function isDeclarativeSetupWizard( ); } -function requireDeclarativeSetupWizard( - plugin: SetupWizardPlugin & Pick, -): SetupWizard { +function requireDeclarativeSetupWizard(plugin: SetupWizardTestPlugin): SetupWizard { const { setupWizard } = plugin; if (!setupWizard) { throw new Error(`${plugin.id} is missing setupWizard`); @@ -148,25 +151,25 @@ export function createSetupWizardAdapter(params: SetupWizardAdapterParams) { return buildChannelSetupWizardAdapterFromSetupWizard(params); } -export function createPluginSetupWizardAdapter< - TPlugin extends SetupWizardPlugin & Pick, ->(plugin: TPlugin) { +export function createPluginSetupWizardAdapter( + plugin: TPlugin, +) { const wizard = requireDeclarativeSetupWizard(plugin); return createSetupWizardAdapter({ - plugin, + plugin: plugin as unknown as SetupWizardPlugin, wizard, }); } -export function createPluginSetupWizardConfigure< - TPlugin extends SetupWizardPlugin & Pick, ->(plugin: TPlugin) { +export function createPluginSetupWizardConfigure( + plugin: TPlugin, +) { return createPluginSetupWizardAdapter(plugin).configure; } -export function createPluginSetupWizardStatus< - TPlugin extends SetupWizardPlugin & Pick, ->(plugin: TPlugin) { +export function createPluginSetupWizardStatus( + plugin: TPlugin, +) { return createPluginSetupWizardAdapter(plugin).getStatus; }