From 7729e6c10473d0721944c5153d20dd6852238fa0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 2 May 2026 05:26:38 +0100 Subject: [PATCH] fix: restore current main ci checks --- .../google/src/gemini-web-search-provider.ts | 3 +- extensions/google/web-search-provider.test.ts | 43 +++++++++++++------ extensions/line/index.ts | 3 +- src/plugin-sdk/channel-entry-contract.ts | 14 +++++- src/plugins/clawhub.ts | 2 +- src/secrets/runtime-web-tools.shared.ts | 5 +++ src/web-search/runtime.test.ts | 2 + 7 files changed, 53 insertions(+), 19 deletions(-) diff --git a/extensions/google/src/gemini-web-search-provider.ts b/extensions/google/src/gemini-web-search-provider.ts index fb3a3f1625d..0f2f98ff0d4 100644 --- a/extensions/google/src/gemini-web-search-provider.ts +++ b/extensions/google/src/gemini-web-search-provider.ts @@ -95,6 +95,7 @@ function withGoogleModelProviderFallbacks( return searchConfig; } const gemini = isRecord(searchConfig?.gemini) ? { ...searchConfig.gemini } : {}; + const mergedSearchConfig = searchConfig ? { ...searchConfig } : {}; if (provider.apiKey !== undefined) { gemini.providerApiKey = provider.apiKey; } @@ -102,7 +103,7 @@ function withGoogleModelProviderFallbacks( gemini.providerBaseUrl = provider.baseUrl; } return { - ...(searchConfig ?? {}), + ...mergedSearchConfig, gemini, }; } diff --git a/extensions/google/web-search-provider.test.ts b/extensions/google/web-search-provider.test.ts index f911dcde485..2c4d25eab2e 100644 --- a/extensions/google/web-search-provider.test.ts +++ b/extensions/google/web-search-provider.test.ts @@ -3,6 +3,10 @@ import { withEnv, withEnvAsync, withFetchPreconnect } from "openclaw/plugin-sdk/ import { afterEach, describe, expect, it, vi } from "vitest"; import { __testing, createGeminiWebSearchProvider } from "./src/gemini-web-search-provider.js"; +type TestModelProviderConfig = NonNullable< + NonNullable["providers"] +>[string]; + function installGeminiFetch() { const mockFetch = vi.fn((_input?: unknown, _init?: unknown) => Promise.resolve({ @@ -24,6 +28,21 @@ function installGeminiFetch() { return mockFetch; } +function createGoogleModelProviderConfig( + overrides: Partial, +): TestModelProviderConfig { + return { + baseUrl: "https://generativelanguage.googleapis.com/v1beta/", + models: [], + ...overrides, + }; +} + +function getFetchHeaders(mockFetch: ReturnType): Record { + const init = mockFetch.mock.calls[0]?.[1] as { headers?: Record } | undefined; + return init?.headers ?? {}; +} + afterEach(() => { vi.useRealTimers(); vi.restoreAllMocks(); @@ -118,9 +137,9 @@ describe("google web search provider", () => { config: { models: { providers: { - google: { + google: createGoogleModelProviderConfig({ apiKey: "AIza-provider-test", - }, + }), }, }, }, @@ -129,9 +148,7 @@ describe("google web search provider", () => { await tool?.execute({ query: "OpenClaw provider key fallback" }); - expect( - (mockFetch.mock.calls[0]?.[1]?.headers as Record)["x-goog-api-key"], - ).toBe("AIza-provider-test"); + expect(getFetchHeaders(mockFetch)["x-goog-api-key"]).toBe("AIza-provider-test"); }); }); @@ -154,9 +171,9 @@ describe("google web search provider", () => { }, models: { providers: { - google: { + google: createGoogleModelProviderConfig({ apiKey: "AIza-provider-test", - }, + }), }, }, }, @@ -165,9 +182,7 @@ describe("google web search provider", () => { await tool?.execute({ query: "OpenClaw plugin key precedence" }); - expect( - (mockFetch.mock.calls[0]?.[1]?.headers as Record)["x-goog-api-key"], - ).toBe("AIza-plugin-test"); + expect(getFetchHeaders(mockFetch)["x-goog-api-key"]).toBe("AIza-plugin-test"); }); }); @@ -178,10 +193,10 @@ describe("google web search provider", () => { config: { models: { providers: { - google: { + google: createGoogleModelProviderConfig({ apiKey: "AIza-provider-test", baseUrl: "https://generativelanguage.googleapis.com/provider/v1beta/", - }, + }), }, }, }, @@ -214,9 +229,9 @@ describe("google web search provider", () => { }, models: { providers: { - google: { + google: createGoogleModelProviderConfig({ baseUrl: "https://generativelanguage.googleapis.com/provider/v1beta/", - }, + }), }, }, }, diff --git a/extensions/line/index.ts b/extensions/line/index.ts index 338e4dfe1f3..e730a4fb6f7 100644 --- a/extensions/line/index.ts +++ b/extensions/line/index.ts @@ -1,9 +1,10 @@ import { defineBundledChannelEntry, + type OpenClawPluginCommandDefinition, type OpenClawPluginApi, } from "openclaw/plugin-sdk/channel-entry-contract"; -type RegisteredLineCardCommand = Parameters[0]; +type RegisteredLineCardCommand = OpenClawPluginCommandDefinition; let lineCardCommandPromise: Promise | null = null; diff --git a/src/plugin-sdk/channel-entry-contract.ts b/src/plugin-sdk/channel-entry-contract.ts index 9e5e47d398b..4ccd32934d7 100644 --- a/src/plugin-sdk/channel-entry-contract.ts +++ b/src/plugin-sdk/channel-entry-contract.ts @@ -19,11 +19,21 @@ import { } from "../plugins/plugin-module-loader-cache.js"; import type { PluginRuntime } from "../plugins/runtime/types.js"; import { resolveLoaderPackageRoot } from "../plugins/sdk-alias.js"; -import type { AnyAgentTool, OpenClawPluginApi, PluginCommandContext } from "../plugins/types.js"; +import type { + AnyAgentTool, + OpenClawPluginApi, + OpenClawPluginCommandDefinition, + PluginCommandContext, +} from "../plugins/types.js"; import { toSafeImportPath } from "../shared/import-specifier.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; -export type { AnyAgentTool, OpenClawPluginApi, PluginCommandContext }; +export type { + AnyAgentTool, + OpenClawPluginApi, + OpenClawPluginCommandDefinition, + PluginCommandContext, +}; type ChannelEntryConfigSchema = TPlugin extends ChannelPlugin diff --git a/src/plugins/clawhub.ts b/src/plugins/clawhub.ts index 05cd687358c..79d07fc3189 100644 --- a/src/plugins/clawhub.ts +++ b/src/plugins/clawhub.ts @@ -165,7 +165,7 @@ function isTrustedSourceLinkedOfficialPackage(pkg: NonNullable unknown; + readConfiguredCredentialFallback?: (params: { + provider: TProvider; + config: OpenClawConfig; + toolConfig: TToolConfig; + }) => { path: string; value: unknown } | undefined; ignoreKeylessProvidersForConfiguredSurface?: boolean; emptyProvidersWhenSurfaceMissing?: boolean; normalizeConfiguredProviderAgainstActiveProviders?: boolean; diff --git a/src/web-search/runtime.test.ts b/src/web-search/runtime.test.ts index aae87c34220..d349024c10f 100644 --- a/src/web-search/runtime.test.ts +++ b/src/web-search/runtime.test.ts @@ -183,6 +183,8 @@ describe("web search runtime", () => { providers: { "custom-search": { apiKey: "custom-provider-key", + baseUrl: "https://custom-search.example/v1", + models: [], }, }, },