fix: preserve qmd command paths

This commit is contained in:
Peter Steinberger
2026-04-13 10:50:52 +01:00
parent 380de88a61
commit 2e1b5407dd
3 changed files with 4 additions and 11 deletions

View File

@@ -77,6 +77,7 @@ Docs: https://docs.openclaw.ai
- iMessage: retry transient `watch.subscribe` startup failures before tearing down the monitor, and sanitize startup error logging so brief local transport stalls do not immediately bounce the channel or leak raw imsg RPC payloads into logs. (#65393) Thanks @vincentkoc.
- CLI/audio providers: report env-authenticated providers as configured in `openclaw infer audio providers --json`, while keeping trusted workspace provider env lookup defaults stable during auth setup. (#65491)
- Plugins/install: reinstall bundled runtime packages when the matching platform native optional child is missing, so packaged Windows installs can recover dependencies that were packed on another host OS.
- Memory/QMD: preserve explicit `memory.qmd.command` paths when resolving the QMD backend, so service and gateway environments can use Homebrew installs without falling back to builtin search.
## 2026.4.11

View File

@@ -89,7 +89,7 @@ describe("resolveMemoryBackendConfig", () => {
expect(resolved.qmd?.command).toBe("/Applications/QMD Tools/qmd");
});
it("normalizes stale homebrew qmd paths to the portable command", () => {
it("preserves explicit homebrew qmd paths for service environments", () => {
const cfg = {
agents: { defaults: { workspace: "/tmp/memory-test" } },
memory: {
@@ -100,7 +100,7 @@ describe("resolveMemoryBackendConfig", () => {
},
} as OpenClawConfig;
const resolved = resolveMemoryBackendConfig({ cfg, agentId: "main" });
expect(resolved.qmd?.command).toBe("qmd");
expect(resolved.qmd?.command).toBe("/opt/homebrew/bin/qmd");
});
it("resolves custom paths relative to workspace", () => {

View File

@@ -244,14 +244,6 @@ function resolveSearchTool(raw?: MemoryQmdConfig["searchTool"]): string | undefi
return value ? value : undefined;
}
function normalizeQmdCommand(command: string): string {
const normalized = path.normalize(command);
if (normalized === "/opt/homebrew/bin/qmd" || normalized === "/usr/local/bin/qmd") {
return "qmd";
}
return command;
}
function resolveSessionConfig(
cfg: MemoryQmdConfig["sessions"],
workspaceDir: string,
@@ -405,7 +397,7 @@ export function resolveMemoryBackendConfig(params: {
const rawCommand = normalizeOptionalString(qmdCfg?.command) || "qmd";
const parsedCommand = splitShellArgs(rawCommand);
const command = normalizeQmdCommand(parsedCommand?.[0] || rawCommand.split(/\s+/)[0] || "qmd");
const command = parsedCommand?.[0] || rawCommand.split(/\s+/)[0] || "qmd";
const resolved: ResolvedQmdConfig = {
command,
mcporter: resolveMcporterConfig(qmdCfg?.mcporter),