fix(hooks): stop memory-core runtime config fallback

This commit is contained in:
Vincent Koc
2026-04-22 13:56:20 -07:00
parent 4cb4aad7b1
commit 0f0d399c71
3 changed files with 80 additions and 4 deletions

View File

@@ -1470,6 +1470,74 @@ describe("gateway startup reconciliation", () => {
clearInternalHooks();
}
});
it("does not fall back to startup plugin config when live memory-core config is removed", async () => {
clearInternalHooks();
const logger = createLogger();
const harness = createCronHarness();
const onMock = vi.fn();
const runtimeLoadConfig = vi.fn(
() =>
({
agents: {
list: [{ id: "main", default: true }],
},
}) as OpenClawConfig,
);
const api: DreamingPluginApiTestDouble = {
config: {
plugins: {
entries: {
"memory-core": {
config: {
dreaming: {
enabled: true,
frequency: "15 4 * * *",
timezone: "UTC",
},
},
},
},
},
} as OpenClawConfig,
pluginConfig: {},
logger,
runtime: {
config: {
loadConfig: runtimeLoadConfig,
},
},
on: onMock,
};
try {
registerShortTermPromotionDreamingForTest(api);
await triggerGatewayStart(onMock, {
config: api.config,
getCron: () => harness.cron,
});
const sessionKey = "agent:main:main";
enqueueSystemEvent(constants.DREAMING_SYSTEM_EVENT_TEXT, {
sessionKey,
contextKey: "cron:memory-dreaming",
});
const beforeAgentReply = getBeforeAgentReplyHandler(onMock);
const result = await beforeAgentReply(
{ cleanedBody: constants.DREAMING_SYSTEM_EVENT_TEXT },
{ trigger: "heartbeat", workspaceDir: ".", sessionKey },
);
expect(runtimeLoadConfig).toHaveBeenCalled();
expect(result).toEqual({
handled: true,
reason: "memory-core: short-term dreaming disabled",
});
} finally {
clearInternalHooks();
}
});
});
describe("short-term dreaming trigger", () => {

View File

@@ -664,11 +664,14 @@ export function registerShortTermPromotionDreaming(api: OpenClawPluginApi): void
}): Promise<ShortTermPromotionDreamingConfig> => {
const startupCfg =
params.reason === "startup" ? (params.startupConfig ?? api.config) : resolveCurrentConfig();
const pluginConfig =
params.reason === "runtime"
? resolveMemoryCorePluginConfig(startupCfg)
: (resolveMemoryCorePluginConfig(startupCfg) ??
resolveMemoryCorePluginConfig(api.config) ??
api.pluginConfig);
const config = resolveShortTermPromotionDreamingConfig({
pluginConfig:
resolveMemoryCorePluginConfig(startupCfg) ??
resolveMemoryCorePluginConfig(api.config) ??
api.pluginConfig,
pluginConfig,
cfg: startupCfg,
});
if (params.reason === "startup") {

View File

@@ -51,6 +51,11 @@ const BUNDLED_LIVE_CONFIG_HOOK_GUARDS = {
'resolvePluginConfigObject(api.runtime.config.loadConfig(), "active-memory")',
"api.runtime.config.loadConfig()",
],
"extensions/memory-core/src/dreaming.ts": [
'params.reason === "runtime"',
"resolveMemoryCorePluginConfig(startupCfg)",
"api.runtime.config?.loadConfig?.() ?? api.config",
],
"extensions/memory-lancedb/index.ts": [
'resolvePluginConfigObject(runtimeConfig, "memory-lancedb")',
"api.runtime.config?.loadConfig?.()",