Skip to content

Commit e113bec

Browse files
committed
fix(memory): polish recall slot defaults
1 parent 96578ee commit e113bec

10 files changed

Lines changed: 22 additions & 34 deletions

File tree

extensions/migrate-hermes/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,12 @@ export function buildConfigItems(params: {
189189
id: "config:memory-plugin-slot",
190190
target: "plugins.slots",
191191
path: ["plugins", "slots"],
192-
value: { memory: "memory-core" },
192+
value: { "memory.recall": "memory-core" },
193193
message: "Select the default OpenClaw memory plugin for imported file memory.",
194194
conflict:
195195
!params.ctx.overwrite &&
196196
hasMigrationConfigPatchConflict(params.ctx.config, ["plugins", "slots"], {
197-
memory: true,
197+
"memory.recall": true,
198198
}),
199199
}),
200200
);

extensions/migrate-hermes/provider.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,11 @@ describe("Hermes migration provider", () => {
125125
expect(plan.summary.sensitive).toBe(1);
126126
expect(itemById(plan.items, "config:default-model")?.status).toBe("conflict");
127127
expect(itemById(plan.items, "config:memory")?.status).toBe("planned");
128-
expect(itemById(plan.items, "config:memory-plugin-slot")?.status).toBe("planned");
128+
const memoryPluginSlot = itemById(plan.items, "config:memory-plugin-slot");
129+
expect(memoryPluginSlot?.status).toBe("planned");
130+
expect(memoryPluginSlot?.details).toMatchObject({
131+
value: { "memory.recall": "memory-core" },
132+
});
129133
expect(itemById(plan.items, "config:model-providers")?.status).toBe("planned");
130134
expect(itemById(plan.items, "workspace:SOUL.md")?.status).toBe("conflict");
131135
const memory = itemById(plan.items, "memory:MEMORY.md");

src/commands/doctor-memory-search.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ function hasActiveAlternateMemoryPluginSlot(cfg: OpenClawConfig): boolean {
371371
if (typeof memorySlot !== "string" || memorySlot.length === 0) {
372372
return false;
373373
}
374-
if (memorySlot === defaultSlotIdForKey("memory")) {
374+
if (memorySlot === defaultSlotIdForKey("memory.recall")) {
375375
return false;
376376
}
377377
if (plugins.deny.includes(memorySlot)) {

src/commands/status.scan.shared.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ export function resolveMemoryPluginStatus(cfg: OpenClawConfig): MemoryPluginStat
202202
: 'plugins.slots.memory="none"',
203203
};
204204
}
205-
return { enabled: true, slot: raw || defaultSlotIdForKey("memory") };
205+
return { enabled: true, slot: raw || defaultSlotIdForKey("memory.recall") };
206206
}
207207

208208
export async function resolveGatewayProbeSnapshot(params: {
@@ -320,7 +320,7 @@ export async function resolveSharedMemoryStatusSnapshot(params: {
320320
}
321321
const agentId = agentStatus.defaultId ?? "main";
322322

323-
if (memoryPlugin.slot !== defaultSlotIdForKey("memory")) {
323+
if (memoryPlugin.slot !== defaultSlotIdForKey("memory.recall")) {
324324
return await resolveMemoryManagerStatusSnapshot(params, agentId);
325325
}
326326

src/config/validation.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
} from "../plugins/plugin-metadata-snapshot.js";
2222
import { validateJsonSchemaValue } from "../plugins/schema-validator.js";
2323
import { listConfiguredMemoryRolePluginIds } from "../plugins/slot-resolution.js";
24-
import { hasKind } from "../plugins/slots.js";
24+
import { MEMORY_PLUGIN_SLOT_KEYS, hasKind } from "../plugins/slots.js";
2525
import { resolveWebSearchInstallCatalogEntries } from "../plugins/web-search-install-catalog.js";
2626
import { collectUnsupportedSecretRefConfigCandidates } from "../secrets/unsupported-surface-policy.js";
2727
import {
@@ -45,22 +45,13 @@ import { collectChannelSchemaMetadata } from "./channel-config-metadata.js";
4545
import { materializeRuntimeConfig } from "./materialize.js";
4646
import { collectConfiguredModelRefs } from "./model-refs.js";
4747
import type { OpenClawConfig, ConfigValidationIssue } from "./types.js";
48-
import type { PluginSlotsConfig } from "./types.plugins.js";
4948
import { coerceSecretRef } from "./types.secrets.js";
5049
import { isBuiltInModelProviderOverlayId } from "./zod-schema.core.js";
5150
import { OpenClawSchema } from "./zod-schema.js";
5251

5352
const LEGACY_REMOVED_PLUGIN_IDS = new Set(["google-antigravity-auth", "google-gemini-cli-auth"]);
5453
const BLOCKED_PLUGIN_CANDIDATE_PREFIX = "blocked plugin candidate:";
55-
const MEMORY_SLOT_KEYS = [
56-
"memory",
57-
"memory.recall",
58-
"memory.compaction",
59-
"memory.capture",
60-
"memory.dreaming",
61-
"memory.userModel",
62-
] as const satisfies readonly (keyof PluginSlotsConfig)[];
63-
const GRANULAR_MEMORY_SLOT_KEYS = MEMORY_SLOT_KEYS.filter((key) => key !== "memory");
54+
const GRANULAR_MEMORY_SLOT_KEYS = MEMORY_PLUGIN_SLOT_KEYS.filter((key) => key !== "memory");
6455

6556
type UnknownIssueRecord = Record<string, unknown>;
6657
type ConfigPathSegment = string | number;
@@ -1815,7 +1806,7 @@ function validateConfigObjectWithPluginsBase(
18151806

18161807
// Default slot values are inferred; only user-configured slot refs should block startup.
18171808
const pluginSlots = pluginsConfig?.slots;
1818-
for (const slotKey of MEMORY_SLOT_KEYS) {
1809+
for (const slotKey of MEMORY_PLUGIN_SLOT_KEYS) {
18191810
const hasExplicitSlot =
18201811
pluginSlots !== undefined && Object.prototype.hasOwnProperty.call(pluginSlots, slotKey);
18211812
const slotValue = normalizedPlugins.slots[slotKey];
@@ -1848,7 +1839,7 @@ function validateConfigObjectWithPluginsBase(
18481839
if (!agentSlots) {
18491840
continue;
18501841
}
1851-
for (const slotKey of MEMORY_SLOT_KEYS) {
1842+
for (const slotKey of MEMORY_PLUGIN_SLOT_KEYS) {
18521843
if (!Object.prototype.hasOwnProperty.call(agentSlots, slotKey)) {
18531844
continue;
18541845
}

src/gateway/tools-invoke-shared.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ export async function invokeGatewayTool(params: {
180180
type: "invalid_request",
181181
message:
182182
`memory tools are disabled in tests${suffix}. ` +
183-
`Enable by setting plugins.slots.memory.recall="${defaultSlotIdForKey("memory")}" (and ensure plugins.enabled is not false).`,
183+
`Enable by setting plugins.slots.memory.recall="${defaultSlotIdForKey("memory.recall")}" (and ensure plugins.enabled is not false).`,
184184
},
185185
};
186186
}

src/plugins/config-normalization-shared.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export function normalizePluginsConfigWithResolver(
241241
"memory.recall":
242242
memoryRecallSlot === undefined
243243
? memorySlot === undefined
244-
? defaultSlotIdForKey("memory")
244+
? defaultSlotIdForKey("memory.recall")
245245
: memorySlot
246246
: memoryRecallSlot,
247247
"memory.compaction": normalizeSlotValue(config?.slots?.["memory.compaction"]),

src/plugins/config-state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ const hasExplicitMemorySlot = (plugins?: OpenClawConfig["plugins"]) =>
104104
const hasExplicitMemoryEntry = (plugins?: OpenClawConfig["plugins"]) =>
105105
Boolean(
106106
plugins?.entries &&
107-
Object.prototype.hasOwnProperty.call(plugins.entries, defaultSlotIdForKey("memory")),
107+
Object.prototype.hasOwnProperty.call(plugins.entries, defaultSlotIdForKey("memory.recall")),
108108
);
109109

110110
export const hasExplicitPluginConfig = (plugins?: OpenClawConfig["plugins"]) =>

src/plugins/effective-plugin-ids.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ function collectSelectedContextEnginePluginIds(config: OpenClawConfig): string[]
143143

144144
function collectSelectedMemoryRolePluginIds(config: OpenClawConfig): string[] {
145145
return listSelectedMemoryRolePluginIds({ cfg: config }).filter(
146-
(pluginId) => pluginId !== defaultSlotIdForKey("memory"),
146+
(pluginId) => pluginId !== defaultSlotIdForKey("memory.recall"),
147147
);
148148
}
149149

src/plugins/loader.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { resolveConfigEnvVars } from "../config/env-substitution.js";
1010
import { createConfigRuntimeEnv } from "../config/env-vars.js";
1111
import type { OpenClawConfig } from "../config/types.openclaw.js";
12-
import type { PluginInstallRecord, PluginSlotsConfig } from "../config/types.plugins.js";
12+
import type { PluginInstallRecord } from "../config/types.plugins.js";
1313
import type { GatewayRequestHandler } from "../gateway/server-methods/types.js";
1414
import { openRootFileSync } from "../infra/boundary-file-read.js";
1515
import { tryReadJsonSync } from "../infra/json-files.js";
@@ -165,13 +165,11 @@ import {
165165
shouldPreferNativeModuleLoad,
166166
} from "./sdk-alias.js";
167167
import {
168-
MEMORY_PLUGIN_ROLES,
169168
listConfiguredMemoryRolePluginIds,
170169
listMemoryRolesSelectedForPlugin,
171-
memoryRoleToSlotKey,
172170
resolveMemoryRoleSlots,
173171
} from "./slot-resolution.js";
174-
import { hasKind, kindsEqual } from "./slots.js";
172+
import { MEMORY_PLUGIN_SLOT_KEYS, hasKind, kindsEqual } from "./slots.js";
175173
import { encodeStartupTraceSegment } from "./startup-trace-segment.js";
176174
import type {
177175
OpenClawPluginApi,
@@ -1104,11 +1102,6 @@ function redactPluginConfigForCacheKey(plugins: NormalizedPluginsConfig): Normal
11041102
return { ...plugins, entries };
11051103
}
11061104

1107-
const MEMORY_SLOT_CACHE_KEYS = [
1108-
"memory",
1109-
...MEMORY_PLUGIN_ROLES.map((role) => memoryRoleToSlotKey(role)),
1110-
] as const satisfies readonly (keyof PluginSlotsConfig)[];
1111-
11121105
function collectAgentMemorySlotCacheEntries(config?: OpenClawConfig) {
11131106
return (config?.agents?.list ?? [])
11141107
.map((agent, index) => {
@@ -1117,8 +1110,8 @@ function collectAgentMemorySlotCacheEntries(config?: OpenClawConfig) {
11171110
return null;
11181111
}
11191112
const normalizedSlots = normalizePluginsConfig({ slots: rawSlots }).slots;
1120-
const slots: Partial<Record<(typeof MEMORY_SLOT_CACHE_KEYS)[number], string | null>> = {};
1121-
for (const slotKey of MEMORY_SLOT_CACHE_KEYS) {
1113+
const slots: Partial<Record<(typeof MEMORY_PLUGIN_SLOT_KEYS)[number], string | null>> = {};
1114+
for (const slotKey of MEMORY_PLUGIN_SLOT_KEYS) {
11221115
if (Object.prototype.hasOwnProperty.call(rawSlots, slotKey)) {
11231116
slots[slotKey] = normalizedSlots[slotKey] ?? null;
11241117
}

0 commit comments

Comments
 (0)