perf: avoid full config resolution in qmd sync

This commit is contained in:
Peter Steinberger
2026-04-06 17:46:24 +01:00
parent d1414477a4
commit 30c686423f
4 changed files with 114 additions and 10 deletions

View File

@@ -4,7 +4,7 @@ import {
clearMemoryEmbeddingProviders,
registerMemoryEmbeddingProvider,
} from "../plugins/memory-embedding-providers.js";
import { resolveMemorySearchConfig } from "./memory-search.js";
import { resolveMemorySearchConfig, resolveMemorySearchSyncConfig } from "./memory-search.js";
const asConfig = (cfg: OpenClawConfig): OpenClawConfig => cfg;
@@ -155,6 +155,25 @@ describe("memory search config", () => {
expect(resolved).toBeNull();
});
it("returns null sync config when disabled", () => {
const cfg = asConfig({
agents: {
defaults: {
memorySearch: { enabled: true },
},
list: [
{
id: "main",
default: true,
memorySearch: { enabled: false },
},
],
},
});
const resolved = resolveMemorySearchSyncConfig(cfg, "main");
expect(resolved).toBeNull();
});
it("defaults provider to auto when unspecified", () => {
const cfg = asConfig({
agents: {
@@ -170,6 +189,44 @@ describe("memory search config", () => {
expect(resolved?.fallback).toBe("none");
});
it("resolves sync config without consulting embedding providers", () => {
clearMemoryEmbeddingProviders();
const cfg = asConfig({
agents: {
defaults: {
memorySearch: {
provider: "openai",
sync: {
onSessionStart: false,
onSearch: true,
watch: false,
watchDebounceMs: 25,
intervalMinutes: 3,
sessions: {
deltaBytes: 321,
deltaMessages: 7,
postCompactionForce: false,
},
},
},
},
},
});
expect(resolveMemorySearchSyncConfig(cfg, "main")).toEqual({
onSessionStart: false,
onSearch: true,
watch: false,
watchDebounceMs: 25,
intervalMinutes: 3,
sessions: {
deltaBytes: 321,
deltaMessages: 7,
postCompactionForce: false,
},
});
});
it("merges defaults and overrides", () => {
const cfg = asConfig({
agents: {

View File

@@ -92,6 +92,8 @@ export type ResolvedMemorySearchConfig = {
};
};
export type ResolvedMemorySearchSyncConfig = ResolvedMemorySearchConfig["sync"];
const DEFAULT_CHUNK_TOKENS = 400;
const DEFAULT_CHUNK_OVERLAP = 80;
const DEFAULT_WATCH_DEBOUNCE_MS = 1500;
@@ -367,6 +369,36 @@ function mergeConfig(
};
}
function resolveSyncConfig(
defaults: MemorySearchConfig | undefined,
overrides: MemorySearchConfig | undefined,
): ResolvedMemorySearchSyncConfig {
return {
onSessionStart: overrides?.sync?.onSessionStart ?? defaults?.sync?.onSessionStart ?? true,
onSearch: overrides?.sync?.onSearch ?? defaults?.sync?.onSearch ?? true,
watch: overrides?.sync?.watch ?? defaults?.sync?.watch ?? true,
watchDebounceMs:
overrides?.sync?.watchDebounceMs ??
defaults?.sync?.watchDebounceMs ??
DEFAULT_WATCH_DEBOUNCE_MS,
intervalMinutes: overrides?.sync?.intervalMinutes ?? defaults?.sync?.intervalMinutes ?? 0,
sessions: {
deltaBytes:
overrides?.sync?.sessions?.deltaBytes ??
defaults?.sync?.sessions?.deltaBytes ??
DEFAULT_SESSION_DELTA_BYTES,
deltaMessages:
overrides?.sync?.sessions?.deltaMessages ??
defaults?.sync?.sessions?.deltaMessages ??
DEFAULT_SESSION_DELTA_MESSAGES,
postCompactionForce:
overrides?.sync?.sessions?.postCompactionForce ??
defaults?.sync?.sessions?.postCompactionForce ??
true,
},
};
}
export function resolveMemorySearchConfig(
cfg: OpenClawConfig,
agentId: string,
@@ -410,3 +442,16 @@ export function resolveMemorySearchConfig(
}
return resolved;
}
export function resolveMemorySearchSyncConfig(
cfg: OpenClawConfig,
agentId: string,
): ResolvedMemorySearchSyncConfig | null {
const defaults = cfg.agents?.defaults?.memorySearch;
const overrides = resolveAgentConfig(cfg, agentId)?.memorySearch;
const enabled = overrides?.enabled ?? defaults?.enabled ?? true;
if (!enabled) {
return null;
}
return resolveSyncConfig(defaults, overrides);
}

View File

@@ -8,7 +8,9 @@ export {
} from "../agents/agent-scope.js";
export {
resolveMemorySearchConfig,
resolveMemorySearchSyncConfig,
type ResolvedMemorySearchConfig,
type ResolvedMemorySearchSyncConfig,
} from "../agents/memory-search.js";
export { parseDurationMs } from "../cli/parse-duration.js";
export { loadConfig } from "../config/config.js";