Skip to content

Commit c177355

Browse files
committed
fix(memory): report close-time pending work failures
1 parent 57ca1b0 commit c177355

3 files changed

Lines changed: 54 additions & 4 deletions

File tree

extensions/memory-core/src/memory/manager-async-state.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@ export async function startAsyncSearchSync(params: {
1919
export async function awaitPendingManagerWork(params: {
2020
pendingSync?: Promise<void> | null;
2121
pendingProviderInit?: Promise<void> | null;
22+
onError?: (err: unknown) => void;
2223
}): Promise<void> {
2324
if (params.pendingSync) {
2425
try {
2526
await params.pendingSync;
26-
} catch {}
27+
} catch (err: unknown) {
28+
params.onError?.(err);
29+
}
2730
}
2831
if (params.pendingProviderInit) {
2932
try {
3033
await params.pendingProviderInit;
31-
} catch {}
34+
} catch (err: unknown) {
35+
params.onError?.(err);
36+
}
3237
}
3338
}

extensions/memory-core/src/memory/manager.async-search.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,42 @@ describe("memory search async sync", () => {
7272
await closePromise;
7373
});
7474

75+
it("reports pending sync failures during close", async () => {
76+
const onError = vi.fn();
77+
const syncError = new Error("sync failed");
78+
79+
await awaitPendingManagerWork({
80+
pendingSync: Promise.reject(syncError),
81+
onError,
82+
});
83+
84+
expect(onError).toHaveBeenCalledWith(syncError);
85+
});
86+
87+
it("reports pending provider initialization failures during close", async () => {
88+
const onError = vi.fn();
89+
const providerError = new Error("provider init failed");
90+
91+
await awaitPendingManagerWork({
92+
pendingProviderInit: Promise.reject(providerError),
93+
onError,
94+
});
95+
96+
expect(onError).toHaveBeenCalledWith(providerError);
97+
});
98+
99+
it("does not report errors for completed pending close work", async () => {
100+
const onError = vi.fn();
101+
102+
await awaitPendingManagerWork({
103+
pendingSync: Promise.resolve(),
104+
pendingProviderInit: Promise.resolve(),
105+
onError,
106+
});
107+
108+
expect(onError).not.toHaveBeenCalled();
109+
});
110+
75111
it("skips background search sync when search-triggered sync is disabled", async () => {
76112
const syncMock = vi.fn(async () => {});
77113
await startAsyncSearchSync({

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,14 +1364,23 @@ export class MemoryIndexManager extends MemoryManagerEmbeddingOps implements Mem
13641364
}
13651365
}
13661366
};
1367+
const reportPendingWorkError = (err: unknown) => {
1368+
log.warn(`memory close: pending manager work failed: ${formatErrorMessage(err)}`);
1369+
};
13671370
const awaitCurrentSync = async () => {
13681371
const pendingSync = this.syncing;
13691372
if (!pendingSync) {
13701373
return;
13711374
}
1372-
await awaitPendingManagerWork({ pendingSync });
1375+
await awaitPendingManagerWork({
1376+
pendingSync,
1377+
onError: reportPendingWorkError,
1378+
});
13731379
};
1374-
await awaitPendingManagerWork({ pendingProviderInit });
1380+
await awaitPendingManagerWork({
1381+
pendingProviderInit,
1382+
onError: reportPendingWorkError,
1383+
});
13751384
rememberCurrentProvider();
13761385
try {
13771386
await awaitCurrentSync();

0 commit comments

Comments
 (0)