diff --git a/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts b/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts index 62912a66bd9..74cbb2932d3 100644 --- a/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts +++ b/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts @@ -176,6 +176,27 @@ function createRuntimeCore(cfg: OpenClawConfig) { }; }, ); + const run = vi.fn( + async (params: { + raw: unknown; + adapter: { + ingest: (raw: unknown) => unknown; + resolveTurn: ( + input: unknown, + eventClass: { kind: "message"; canStartAgentTurn: true }, + preflight: Record, + ) => Parameters[0]; + }; + }) => { + const input = params.adapter.ingest(params.raw); + const turn = params.adapter.resolveTurn( + input, + { kind: "message", canStartAgentTurn: true }, + {}, + ); + return await runPrepared(turn); + }, + ); return { config: { current: () => cfg, @@ -260,6 +281,7 @@ function createRuntimeCore(cfg: OpenClawConfig) { updateLastRoute: vi.fn(async () => {}), }, turn: { + run, runPrepared, }, text: { diff --git a/src/plugins/bundled-runtime-deps-materialization.ts b/src/plugins/bundled-runtime-deps-materialization.ts index 4ec44a3f08d..eb0bea2834e 100644 --- a/src/plugins/bundled-runtime-deps-materialization.ts +++ b/src/plugins/bundled-runtime-deps-materialization.ts @@ -77,7 +77,10 @@ function hasInstalledRuntimeDepEntryFiles(packageDir: string, packageJson: JsonO if (mainPath !== packageDir && !mainPath.startsWith(`${packageDir}${path.sep}`)) { return false; } - return fs.existsSync(mainPath); + if (fs.existsSync(mainPath)) { + return true; + } + return [".js", ".json", ".node"].some((extension) => fs.existsSync(`${mainPath}${extension}`)); } export function isRuntimeDepSatisfied( diff --git a/src/plugins/bundled-runtime-deps.test.ts b/src/plugins/bundled-runtime-deps.test.ts index 00c75f8bd35..7fc9bf6279a 100644 --- a/src/plugins/bundled-runtime-deps.test.ts +++ b/src/plugins/bundled-runtime-deps.test.ts @@ -886,6 +886,33 @@ describe("installBundledRuntimeDeps", () => { ); }); + it("accepts extensionless package main entries resolved by Node", () => { + const installRoot = makeTempDir(); + spawnSyncMock.mockImplementation((_command, _args, options) => { + const packageDir = path.join(String(options?.cwd ?? ""), "node_modules", "jszip"); + fs.mkdirSync(path.join(packageDir, "lib"), { recursive: true }); + fs.writeFileSync( + path.join(packageDir, "package.json"), + JSON.stringify({ name: "jszip", version: "3.10.1", main: "./lib/index" }), + ); + fs.writeFileSync(path.join(packageDir, "lib", "index.js"), "export default {};\n"); + return { + pid: 123, + output: [], + stdout: "", + stderr: "", + signal: null, + status: 0, + }; + }); + + installBundledRuntimeDeps({ + installRoot, + missingSpecs: ["jszip@^3.10.1"], + env: {}, + }); + }); + it("cleans an owned isolated execution root after copying node_modules back", () => { const installRoot = makeTempDir(); const installExecutionRoot = path.join(installRoot, ".openclaw-install-stage"); diff --git a/src/plugins/capability-provider-runtime.test.ts b/src/plugins/capability-provider-runtime.test.ts index 33655de6562..be4dbfeb770 100644 --- a/src/plugins/capability-provider-runtime.test.ts +++ b/src/plugins/capability-provider-runtime.test.ts @@ -103,6 +103,7 @@ function expectBundledCompatLoadPath(params: { config: params.enablementCompat, onlyPluginIds: ["openai"], activate: false, + installBundledRuntimeDeps: false, }); } @@ -408,6 +409,7 @@ describe("resolvePluginCapabilityProviders", () => { }), onlyPluginIds: ["microsoft"], activate: false, + installBundledRuntimeDeps: false, }); }); @@ -582,6 +584,7 @@ describe("resolvePluginCapabilityProviders", () => { config: expect.anything(), onlyPluginIds: [], activate: false, + installBundledRuntimeDeps: false, }); }); @@ -626,6 +629,7 @@ describe("resolvePluginCapabilityProviders", () => { config: compatConfig, onlyPluginIds: ["google"], activate: false, + installBundledRuntimeDeps: false, }); }); @@ -649,6 +653,7 @@ describe("resolvePluginCapabilityProviders", () => { config: expect.anything(), onlyPluginIds: [], activate: false, + installBundledRuntimeDeps: false, }); }); @@ -786,6 +791,7 @@ describe("resolvePluginCapabilityProviders", () => { config: enablementCompat, onlyPluginIds: ["google"], activate: false, + installBundledRuntimeDeps: false, }); }); }); diff --git a/src/plugins/capability-provider-runtime.ts b/src/plugins/capability-provider-runtime.ts index 8d30641b35b..548847f0130 100644 --- a/src/plugins/capability-provider-runtime.ts +++ b/src/plugins/capability-provider-runtime.ts @@ -226,8 +226,13 @@ export function resolvePluginCapabilityProvider