From f571f6d534645853feb02bf9b8d5b82eed0b8fcc Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Thu, 19 Mar 2026 08:14:41 -0500 Subject: [PATCH] Fix Windows bundle MCP and Matrix contract seams --- extensions/matrix/runtime-api.ts | 5 ++++ src/channels/plugins/contracts/registry.ts | 4 +-- .../session-binding.contract.test.ts | 2 +- src/plugins/bundle-mcp.test.ts | 26 ++++++++++++------- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/extensions/matrix/runtime-api.ts b/extensions/matrix/runtime-api.ts index 52df80f9843..4bed7dc6449 100644 --- a/extensions/matrix/runtime-api.ts +++ b/extensions/matrix/runtime-api.ts @@ -12,3 +12,8 @@ export { resolveMatrixLegacyFlatStoreRoot, sanitizeMatrixPathSegment, } from "./helper-api.js"; +export { + createMatrixThreadBindingManager, + resetMatrixThreadBindingsForTests, +} from "./src/matrix/thread-bindings.js"; +export { setMatrixRuntime } from "./src/runtime.js"; diff --git a/src/channels/plugins/contracts/registry.ts b/src/channels/plugins/contracts/registry.ts index 572cfb302aa..60f6a31ba30 100644 --- a/src/channels/plugins/contracts/registry.ts +++ b/src/channels/plugins/contracts/registry.ts @@ -10,8 +10,8 @@ import { createFeishuThreadBindingManager } from "../../../../extensions/feishu/ import { createMatrixThreadBindingManager, resetMatrixThreadBindingsForTests, -} from "../../../../extensions/matrix/src/matrix/thread-bindings.js"; -import { setMatrixRuntime } from "../../../../extensions/matrix/src/runtime.js"; + setMatrixRuntime, +} from "../../../../extensions/matrix/runtime-api.js"; import { createTelegramThreadBindingManager } from "../../../../extensions/telegram/runtime-api.js"; import type { OpenClawConfig } from "../../../config/config.js"; import { diff --git a/src/channels/plugins/contracts/session-binding.contract.test.ts b/src/channels/plugins/contracts/session-binding.contract.test.ts index c876b716604..2cc7d082669 100644 --- a/src/channels/plugins/contracts/session-binding.contract.test.ts +++ b/src/channels/plugins/contracts/session-binding.contract.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, vi } from "vitest"; import { __testing as discordThreadBindingTesting } from "../../../../extensions/discord/src/monitor/thread-bindings.manager.js"; import { __testing as feishuThreadBindingTesting } from "../../../../extensions/feishu/src/thread-bindings.js"; -import { resetMatrixThreadBindingsForTests } from "../../../../extensions/matrix/src/matrix/thread-bindings.js"; +import { resetMatrixThreadBindingsForTests } from "../../../../extensions/matrix/runtime-api.js"; import { __testing as telegramThreadBindingTesting } from "../../../../extensions/telegram/src/thread-bindings.js"; import { __testing as sessionBindingTesting } from "../../../infra/outbound/session-binding-service.js"; import { sessionBindingContractRegistry } from "./registry.js"; diff --git a/src/plugins/bundle-mcp.test.ts b/src/plugins/bundle-mcp.test.ts index dc1f98ab882..03161cc17fb 100644 --- a/src/plugins/bundle-mcp.test.ts +++ b/src/plugins/bundle-mcp.test.ts @@ -11,6 +11,10 @@ function getServerArgs(value: unknown): unknown[] | undefined { return isRecord(value) && Array.isArray(value.args) ? value.args : undefined; } +function normalizePluginPath(value: string): string { + return path.normalize(value.replaceAll("/", path.sep)); +} + const tempHarness = createBundleMcpTempHarness(); afterEach(async () => { @@ -177,16 +181,18 @@ describe("loadEnabledBundleMcpConfig", () => { }, }); expect(loaded.diagnostics).toEqual([]); - expect(loaded.config.mcpServers.inlineProbe).toEqual({ - command: path.join(pluginRoot, "bin", "server.sh"), - args: [ - path.join(pluginRoot, "servers", "probe.mjs"), - path.join(pluginRoot, "local-probe.mjs"), - ], - cwd: pluginRoot, - env: { - PLUGIN_ROOT: pluginRoot, - }, + const inlineProbe = loaded.config.mcpServers.inlineProbe; + expect(isRecord(inlineProbe)).toBe(true); + expect(normalizePluginPath(String(isRecord(inlineProbe) ? inlineProbe.command : ""))).toBe( + normalizePluginPath(path.join(pluginRoot, "bin", "server.sh")), + ); + expect(getServerArgs(inlineProbe)?.map((arg) => normalizePluginPath(String(arg)))).toEqual([ + normalizePluginPath(path.join(pluginRoot, "servers", "probe.mjs")), + normalizePluginPath(path.join(pluginRoot, "local-probe.mjs")), + ]); + expect(isRecord(inlineProbe) ? inlineProbe.cwd : undefined).toBe(pluginRoot); + expect(isRecord(inlineProbe) ? inlineProbe.env : undefined).toEqual({ + PLUGIN_ROOT: pluginRoot, }); } finally { env.restore();