





























@@ -55,12 +55,20 @@ function expectNoMemoryBackendStartup(log: ReturnType<typeof createGatewayLogMoc
5555}
56565757function expectQmdManagerRequests(cfg: OpenClawConfig, agentIds: string[]) {
58+expectQmdManagerRequestsWithPurpose(cfg, agentIds, "cli");
59+}
60+61+function expectQmdManagerRequestsWithPurpose(
62+cfg: OpenClawConfig,
63+agentIds: string[],
64+purpose: "cli" | "default",
65+) {
5866expect(getMemorySearchManagerMock).toHaveBeenCalledTimes(agentIds.length);
5967for (const [index, agentId] of agentIds.entries()) {
6068expect(getMemorySearchManagerMock).toHaveBeenNthCalledWith(index + 1, {
6169 cfg,
6270 agentId,
63-purpose: "cli",
71+ purpose,
6472});
6573}
6674}
@@ -104,13 +112,16 @@ describe("startGatewayMemoryBackend", () => {
104112});
105113106114it("runs qmd boot sync for the default and explicitly configured agents", async () => {
107-const cfg = createQmdConfig({
108-list: [
109-{ id: "ops", default: true },
110-{ id: "main", memorySearch: { enabled: true } },
111-{ id: "lazy" },
112-],
113-});
115+const cfg = createQmdConfig(
116+{
117+list: [
118+{ id: "ops", default: true },
119+{ id: "main", memorySearch: { enabled: true } },
120+{ id: "lazy" },
121+],
122+},
123+{ startup: "immediate", interval: "0s", embedInterval: "0s" },
124+);
114125115126const log = await startQmdBackendWithManager(cfg);
116127@@ -123,10 +134,13 @@ describe("startGatewayMemoryBackend", () => {
123134});
124135125136it("initializes all qmd agents when memory search is explicitly enabled in defaults", async () => {
126-const cfg = createQmdConfig({
127-defaults: { memorySearch: { enabled: true } },
128-list: [{ id: "ops", default: true }, { id: "main" }],
129-});
137+const cfg = createQmdConfig(
138+{
139+defaults: { memorySearch: { enabled: true } },
140+list: [{ id: "ops", default: true }, { id: "main" }],
141+},
142+{ startup: "immediate", interval: "0s", embedInterval: "0s" },
143+);
130144131145const log = await startQmdBackendWithManager(cfg);
132146@@ -138,12 +152,15 @@ describe("startGatewayMemoryBackend", () => {
138152});
139153140154it("logs a warning when qmd manager init fails and continues with other agents", async () => {
141-const cfg = createQmdConfig({
142-list: [
143-{ id: "main", default: true },
144-{ id: "ops", memorySearch: { enabled: true } },
145-],
146-});
155+const cfg = createQmdConfig(
156+{
157+list: [
158+{ id: "main", default: true },
159+{ id: "ops", memorySearch: { enabled: true } },
160+],
161+},
162+{ startup: "immediate", interval: "0s", embedInterval: "0s" },
163+);
147164const log = createGatewayLogMock();
148165getMemorySearchManagerMock
149166.mockResolvedValueOnce({ manager: null, error: "qmd missing" })
@@ -158,13 +175,16 @@ describe("startGatewayMemoryBackend", () => {
158175});
159176160177it("skips agents with memory search disabled", async () => {
161-const cfg = createQmdConfig({
162-defaults: { memorySearch: { enabled: true } },
163-list: [
164-{ id: "main", default: true },
165-{ id: "ops", memorySearch: { enabled: false } },
166-],
167-});
178+const cfg = createQmdConfig(
179+{
180+defaults: { memorySearch: { enabled: true } },
181+list: [
182+{ id: "main", default: true },
183+{ id: "ops", memorySearch: { enabled: false } },
184+],
185+},
186+{ startup: "immediate", interval: "0s", embedInterval: "0s" },
187+);
168188169189const log = await startQmdBackendWithManager(cfg);
170190@@ -188,4 +208,41 @@ describe("startGatewayMemoryBackend", () => {
188208189209expectNoMemoryBackendStartup(log);
190210});
211+212+it("keeps the full qmd manager alive for startup interval maintenance", async () => {
213+const manager = createQmdManagerMock();
214+getMemorySearchManagerMock.mockResolvedValue({ manager });
215+const cfg = createQmdConfig(
216+{ list: [{ id: "main", default: true }] },
217+{ startup: "immediate", onBoot: false, interval: "5m", embedInterval: "0s" },
218+);
219+220+const log = await startMemoryBackendForTest(cfg);
221+222+expectQmdManagerRequestsWithPurpose(cfg, ["main"], "default");
223+expect(manager.sync).not.toHaveBeenCalled();
224+expect(manager.close).not.toHaveBeenCalled();
225+expect(log.info).toHaveBeenCalledWith(
226+'qmd memory startup manager initialized for 1 agent: "main"',
227+);
228+expect(log.warn).not.toHaveBeenCalled();
229+});
230+231+it("does not manually boot sync full qmd managers that own their startup update", async () => {
232+const manager = createQmdManagerMock();
233+getMemorySearchManagerMock.mockResolvedValue({ manager });
234+const cfg = createQmdConfig(
235+{ list: [{ id: "main", default: true }] },
236+{ startup: "immediate", onBoot: true, interval: "5m", embedInterval: "0s" },
237+);
238+239+const log = await startMemoryBackendForTest(cfg);
240+241+expectQmdManagerRequestsWithPurpose(cfg, ["main"], "default");
242+expect(manager.sync).not.toHaveBeenCalled();
243+expect(manager.close).not.toHaveBeenCalled();
244+expect(log.info).toHaveBeenCalledWith(
245+'qmd memory startup manager initialized for 1 agent: "main"',
246+);
247+});
191248});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。