diff --git a/src/gateway/server-methods/tools-catalog.test.ts b/src/gateway/server-methods/tools-catalog.test.ts index e3cedd61bdf..028a068dcda 100644 --- a/src/gateway/server-methods/tools-catalog.test.ts +++ b/src/gateway/server-methods/tools-catalog.test.ts @@ -1,5 +1,8 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { resolvePluginTools } from "../../plugins/tools.js"; +import { + ensureStandalonePluginToolRegistryLoaded, + resolvePluginTools, +} from "../../plugins/tools.js"; import { ErrorCodes } from "../protocol/index.js"; import { toolsCatalogHandlers } from "./tools-catalog.js"; @@ -19,6 +22,7 @@ const pluginToolMetaState = new Map ({ buildPluginToolMetadataKey: (pluginId: string, toolName: string) => JSON.stringify([pluginId, toolName]), + ensureStandalonePluginToolRegistryLoaded: vi.fn(), resolvePluginTools: vi.fn(() => [ { name: "voice_call", label: "voice_call", description: "Plugin calling tool" }, { @@ -159,5 +163,10 @@ describe("tools.catalog handler", () => { allowGatewaySubagentBinding: true, }), ); + expect(vi.mocked(ensureStandalonePluginToolRegistryLoaded)).toHaveBeenCalledWith( + expect.objectContaining({ + allowGatewaySubagentBinding: true, + }), + ); }); }); diff --git a/src/gateway/server-methods/tools-catalog.ts b/src/gateway/server-methods/tools-catalog.ts index 66aaa112d29..9fc0a47c986 100644 --- a/src/gateway/server-methods/tools-catalog.ts +++ b/src/gateway/server-methods/tools-catalog.ts @@ -14,6 +14,7 @@ import type { OpenClawConfig } from "../../config/types.openclaw.js"; import { getActivePluginRegistry } from "../../plugins/runtime.js"; import { buildPluginToolMetadataKey, + ensureStandalonePluginToolRegistryLoaded, getPluginToolMeta, resolvePluginTools, } from "../../plugins/tools.js"; @@ -88,13 +89,19 @@ function buildPluginGroups(params: { }): ToolCatalogGroup[] { const workspaceDir = resolveAgentWorkspaceDir(params.cfg, params.agentId); const agentDir = resolveAgentDir(params.cfg, params.agentId); + const toolContext = { + config: params.cfg, + workspaceDir, + agentDir, + agentId: params.agentId, + }; + ensureStandalonePluginToolRegistryLoaded({ + context: toolContext, + toolAllowlist: ["group:plugins"], + allowGatewaySubagentBinding: true, + }); const pluginTools = resolvePluginTools({ - context: { - config: params.cfg, - workspaceDir, - agentDir, - agentId: params.agentId, - }, + context: toolContext, existingToolNames: params.existingToolNames, toolAllowlist: ["group:plugins"], suppressNameConflicts: true,