fix(check): repair plugin and secret type drift

This commit is contained in:
Vincent Koc
2026-04-06 15:36:17 +01:00
parent a253dc44a3
commit 7bb61a07db
8 changed files with 56 additions and 38 deletions

View File

@@ -46,8 +46,8 @@ export function resolvePluginSnapshotCacheTtlMs(env: NodeJS.ProcessEnv): number
return Math.min(discoveryCacheMs, manifestCacheMs);
}
export function buildPluginSnapshotCacheEnvKey(env: NodeJS.ProcessEnv) {
return {
export function buildPluginSnapshotCacheEnvKey(env: NodeJS.ProcessEnv): string {
return JSON.stringify({
OPENCLAW_BUNDLED_PLUGINS_DIR: env.OPENCLAW_BUNDLED_PLUGINS_DIR ?? "",
OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE: env.OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE ?? "",
OPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE: env.OPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE ?? "",
@@ -59,5 +59,5 @@ export function buildPluginSnapshotCacheEnvKey(env: NodeJS.ProcessEnv) {
HOME: env.HOME ?? "",
USERPROFILE: env.USERPROFILE ?? "",
VITEST: env.VITEST ?? "",
};
});
}

View File

@@ -1,22 +1,25 @@
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
const resolveRuntimePluginRegistryMock = vi.fn();
const applyPluginAutoEnableMock = vi.fn();
const resolveRuntimePluginRegistryMock = vi.fn((_options: unknown): unknown => undefined);
const applyPluginAutoEnableMock = vi.fn((_params: { config: unknown }): unknown => undefined);
const getMemoryRuntimeMock = vi.fn();
const resolveAgentWorkspaceDirMock = vi.fn();
const resolveDefaultAgentIdMock = vi.fn(() => "default");
const resolveAgentWorkspaceDirMock = vi.fn(
(_config: unknown, _agentId: unknown): unknown => undefined,
);
const resolveDefaultAgentIdMock = vi.fn((_config: unknown) => "default");
vi.mock("../config/plugin-auto-enable.js", () => ({
applyPluginAutoEnable: (...args: unknown[]) => applyPluginAutoEnableMock(...args),
applyPluginAutoEnable: (params: { config: unknown }) => applyPluginAutoEnableMock(params),
}));
vi.mock("../agents/agent-scope.js", () => ({
resolveAgentWorkspaceDir: (...args: unknown[]) => resolveAgentWorkspaceDirMock(...args),
resolveDefaultAgentId: (...args: unknown[]) => resolveDefaultAgentIdMock(...args),
resolveAgentWorkspaceDir: (config: unknown, agentId: unknown) =>
resolveAgentWorkspaceDirMock(config, agentId),
resolveDefaultAgentId: (config: unknown) => resolveDefaultAgentIdMock(config),
}));
vi.mock("./loader.js", () => ({
resolveRuntimePluginRegistry: (...args: unknown[]) => resolveRuntimePluginRegistryMock(...args),
resolveRuntimePluginRegistry: (options: unknown) => resolveRuntimePluginRegistryMock(options),
}));
vi.mock("./memory-state.js", () => ({

View File

@@ -1,9 +1,11 @@
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
const loadConfigMock = vi.fn();
const applyPluginAutoEnableMock = vi.fn();
const resolveAgentWorkspaceDirMock = vi.fn(() => "/resolved-workspace");
const resolveDefaultAgentIdMock = vi.fn(() => "default");
const applyPluginAutoEnableMock = vi.fn((_params: { config: unknown }): unknown => undefined);
const resolveAgentWorkspaceDirMock = vi.fn(
(_config: unknown, _agentId: unknown): string => "/resolved-workspace",
);
const resolveDefaultAgentIdMock = vi.fn((_config: unknown): string => "default");
let resolvePluginRuntimeLoadContext: typeof import("./load-context.js").resolvePluginRuntimeLoadContext;
let buildPluginRuntimeLoadOptions: typeof import("./load-context.js").buildPluginRuntimeLoadOptions;
@@ -13,12 +15,13 @@ vi.mock("../../config/config.js", () => ({
}));
vi.mock("../../config/plugin-auto-enable.js", () => ({
applyPluginAutoEnable: (...args: unknown[]) => applyPluginAutoEnableMock(...args),
applyPluginAutoEnable: (params: { config: unknown }) => applyPluginAutoEnableMock(params),
}));
vi.mock("../../agents/agent-scope.js", () => ({
resolveAgentWorkspaceDir: (...args: unknown[]) => resolveAgentWorkspaceDirMock(...args),
resolveDefaultAgentId: (...args: unknown[]) => resolveDefaultAgentIdMock(...args),
resolveAgentWorkspaceDir: (config: unknown, agentId: unknown) =>
resolveAgentWorkspaceDirMock(config, agentId),
resolveDefaultAgentId: (config: unknown) => resolveDefaultAgentIdMock(config),
}));
describe("resolvePluginRuntimeLoadContext", () => {

View File

@@ -1,37 +1,42 @@
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
const loadOpenClawPluginsMock = vi.fn();
const loadOpenClawPluginsMock = vi.fn((_options: unknown): unknown => undefined);
const getActivePluginRegistryMock = vi.fn();
const resolveConfiguredChannelPluginIdsMock = vi.fn();
const resolveChannelPluginIdsMock = vi.fn();
const applyPluginAutoEnableMock = vi.fn();
const resolveAgentWorkspaceDirMock = vi.fn(() => "/resolved-workspace");
const resolveDefaultAgentIdMock = vi.fn(() => "default");
const resolveConfiguredChannelPluginIdsMock = vi.fn(
(_options: unknown): string[] | undefined => undefined,
);
const resolveChannelPluginIdsMock = vi.fn((_options: unknown): string[] | undefined => undefined);
const applyPluginAutoEnableMock = vi.fn((_params: { config: unknown }): unknown => undefined);
const resolveAgentWorkspaceDirMock = vi.fn(
(_config: unknown, _agentId: unknown): string => "/resolved-workspace",
);
const resolveDefaultAgentIdMock = vi.fn((_config: unknown): string => "default");
let ensurePluginRegistryLoaded: typeof import("./runtime-registry-loader.js").ensurePluginRegistryLoaded;
let resetPluginRegistryLoadedForTests: typeof import("./runtime-registry-loader.js").__testing.resetPluginRegistryLoadedForTests;
vi.mock("../loader.js", () => ({
loadOpenClawPlugins: (...args: unknown[]) => loadOpenClawPluginsMock(...args),
loadOpenClawPlugins: (options: unknown) => loadOpenClawPluginsMock(options),
}));
vi.mock("../runtime.js", () => ({
getActivePluginRegistry: (...args: unknown[]) => getActivePluginRegistryMock(...args),
getActivePluginRegistry: () => getActivePluginRegistryMock(),
}));
vi.mock("../channel-plugin-ids.js", () => ({
resolveConfiguredChannelPluginIds: (...args: unknown[]) =>
resolveConfiguredChannelPluginIdsMock(...args),
resolveChannelPluginIds: (...args: unknown[]) => resolveChannelPluginIdsMock(...args),
resolveConfiguredChannelPluginIds: (options: unknown) =>
resolveConfiguredChannelPluginIdsMock(options),
resolveChannelPluginIds: (options: unknown) => resolveChannelPluginIdsMock(options),
}));
vi.mock("../../config/plugin-auto-enable.js", () => ({
applyPluginAutoEnable: (...args: unknown[]) => applyPluginAutoEnableMock(...args),
applyPluginAutoEnable: (params: { config: unknown }) => applyPluginAutoEnableMock(params),
}));
vi.mock("../../agents/agent-scope.js", () => ({
resolveAgentWorkspaceDir: (...args: unknown[]) => resolveAgentWorkspaceDirMock(...args),
resolveDefaultAgentId: (...args: unknown[]) => resolveDefaultAgentIdMock(...args),
resolveAgentWorkspaceDir: (config: unknown, agentId: unknown) =>
resolveAgentWorkspaceDirMock(config, agentId),
resolveDefaultAgentId: (config: unknown) => resolveDefaultAgentIdMock(config),
}));
describe("ensurePluginRegistryLoaded", () => {

View File

@@ -202,7 +202,6 @@ function buildPluginReport(
: loadPluginMetadataRegistrySnapshot({
config: runtimeCompatConfig,
activationSourceConfig: rawConfig,
activate: false,
workspaceDir,
env: params?.env,
loadModules: false,

View File

@@ -136,7 +136,7 @@ export function resolvePluginTools(params: {
}
if (!resolved) {
if (entry.names.length > 0) {
context.logger.debug(
context.logger.debug?.(
`plugin tool factory returned null (${entry.pluginId}): [${entry.names.join(", ")}]`,
);
}

View File

@@ -9,9 +9,11 @@ export type SecretResolverWarningCode =
| "SECRETS_REF_OVERRIDES_PLAINTEXT"
| "SECRETS_REF_IGNORED_INACTIVE_SURFACE"
| "WEB_SEARCH_PROVIDER_INVALID_AUTODETECT"
| "WEB_SEARCH_AUTODETECT_SELECTED"
| "WEB_SEARCH_KEY_UNRESOLVED_FALLBACK_USED"
| "WEB_SEARCH_KEY_UNRESOLVED_NO_FALLBACK"
| "WEB_FETCH_PROVIDER_INVALID_AUTODETECT"
| "WEB_FETCH_AUTODETECT_SELECTED"
| "WEB_FETCH_PROVIDER_KEY_UNRESOLVED_FALLBACK_USED"
| "WEB_FETCH_PROVIDER_KEY_UNRESOLVED_NO_FALLBACK";

View File

@@ -1,10 +1,16 @@
import type { OpenClawConfig } from "../config/config.js";
import { resolveSecretInputRef } from "../config/types.secrets.js";
import { resolveManifestContractOwnerPluginId } from "../plugins/manifest-registry.js";
import type { ResolverContext, SecretDefaults } from "./runtime-shared.js";
import type {
ResolverContext,
SecretDefaults,
SecretResolverWarningCode,
} from "./runtime-shared.js";
import { pushInactiveSurfaceWarning, pushWarning } from "./runtime-shared.js";
import type { RuntimeWebDiagnostic, RuntimeWebDiagnosticCode } from "./runtime-web-tools.types.js";
type RuntimeWebWarningDiagnosticCode = Extract<RuntimeWebDiagnosticCode, SecretResolverWarningCode>;
export type SecretResolutionResult<TSource extends string> = {
value?: string;
source: TSource;
@@ -43,9 +49,9 @@ export type RuntimeWebProviderSelectionParams<
context: ResolverContext;
defaults: SecretDefaults | undefined;
deferKeylessFallback: boolean;
fallbackUsedCode: string;
noFallbackCode: string;
autoDetectSelectedCode: string;
fallbackUsedCode: RuntimeWebWarningDiagnosticCode;
noFallbackCode: RuntimeWebWarningDiagnosticCode;
autoDetectSelectedCode: RuntimeWebDiagnosticCode;
readConfiguredCredential: (params: {
provider: TProvider;
config: OpenClawConfig;
@@ -134,7 +140,7 @@ export type ResolveRuntimeWebProviderSurfaceParams<
toolConfig: TToolConfig;
diagnostics: RuntimeWebDiagnostic[];
metadataDiagnostics: RuntimeWebDiagnostic[];
invalidAutoDetectCode: RuntimeWebDiagnosticCode;
invalidAutoDetectCode: RuntimeWebWarningDiagnosticCode;
sourceConfig: OpenClawConfig;
context: ResolverContext;
resolveProviders: (params: { configuredBundledPluginId?: string }) => TProvider[];