Skip to content

Commit 9408380

Browse files
fix(memory-core): keep qmd json search one-shot (#91837)
1 parent 0a3aa5f commit 9408380

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

extensions/memory-core/src/memory/qmd-manager.test.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,55 @@ describe("QmdMemoryManager", () => {
703703
await manager?.close();
704704
});
705705

706+
it("keeps one-shot CLI searches from scheduling session-start updates", async () => {
707+
cfg = {
708+
...cfg,
709+
agents: {
710+
...cfg.agents,
711+
defaults: {
712+
...cfg.agents?.defaults,
713+
workspace: workspaceDir,
714+
memorySearch: {
715+
...cfg.agents?.defaults?.memorySearch,
716+
sync: { watch: false, onSessionStart: true, onSearch: true },
717+
},
718+
},
719+
},
720+
memory: {
721+
backend: "qmd",
722+
qmd: {
723+
includeDefaultMemory: false,
724+
searchMode: "search",
725+
update: { interval: "0s", debounceMs: 60_000, onBoot: false },
726+
paths: [{ path: workspaceDir, pattern: "**/*.md", name: "workspace" }],
727+
},
728+
},
729+
} as OpenClawConfig;
730+
spawnMock.mockImplementation((_cmd: string, args: string[]) => {
731+
if (args[0] === "search") {
732+
const child = createMockChild({ autoClose: false });
733+
emitAndClose(child, "stdout", "[]");
734+
return child;
735+
}
736+
return createMockChild();
737+
});
738+
739+
const { manager } = await createManager({ mode: "cli" });
740+
741+
await expect(
742+
manager.search("glacier", { sessionKey: "agent:main:cli:memory-search" }),
743+
).resolves.toStrictEqual([]);
744+
await manager.close();
745+
746+
const updateCalls = spawnMock.mock.calls
747+
.map((call: unknown[]) => call[1] as string[])
748+
.filter((args: string[]) => args[0] === "update" || args[0] === "embed");
749+
expect(updateCalls).toStrictEqual([]);
750+
expect(
751+
spawnMock.mock.calls.some((call: unknown[]) => (call[1] as string[])?.[0] === "search"),
752+
).toBe(true);
753+
});
754+
706755
it("can be configured to block startup on boot update", async () => {
707756
cfg = {
708757
...cfg,

extensions/memory-core/src/memory/qmd-manager.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ export class QmdMemoryManager implements MemorySearchManager {
376376
private queuedForcedRuns = 0;
377377
private dirty = false;
378378
private closed = false;
379+
private mode: QmdManagerMode = "full";
379380
private readonly closeSignal: Promise<void>;
380381
private resolveCloseSignal!: () => void;
381382
private db: SqliteDatabase | null = null;
@@ -449,6 +450,7 @@ export class QmdMemoryManager implements MemorySearchManager {
449450
}
450451

451452
private async initialize(mode: QmdManagerMode): Promise<void> {
453+
this.mode = mode;
452454
const startTime = Date.now();
453455
this.bootstrapCollections();
454456
if (mode === "status") {
@@ -1729,6 +1731,9 @@ export class QmdMemoryManager implements MemorySearchManager {
17291731
}
17301732

17311733
private async maybeWarmSession(sessionKey?: string): Promise<void> {
1734+
if (this.mode === "cli") {
1735+
return;
1736+
}
17321737
if (!this.syncSettings?.onSessionStart) {
17331738
return;
17341739
}
@@ -1743,6 +1748,9 @@ export class QmdMemoryManager implements MemorySearchManager {
17431748
}
17441749

17451750
private async maybeSyncDirtySearchState(): Promise<void> {
1751+
if (this.mode === "cli") {
1752+
return;
1753+
}
17461754
if (!this.syncSettings?.onSearch || !this.dirty) {
17471755
return;
17481756
}

0 commit comments

Comments
 (0)