

















@@ -149,6 +149,20 @@ function makeHost(overrides?: Partial<ChatHost>): ChatHost {
149149chatAvatarReason: null,
150150chatSideResult: null,
151151chatSideResultTerminalRuns: new Set<string>(),
152+sessionsLoading: false,
153+sessionsResult: null,
154+sessionsResultAgentId: null,
155+sessionsError: null,
156+sessionsFilterActive: "0",
157+sessionsFilterLimit: "50",
158+sessionsIncludeGlobal: true,
159+sessionsIncludeUnknown: true,
160+sessionsShowArchived: false,
161+sessionsExpandedCheckpointKey: null,
162+sessionsCheckpointItemsByKey: {},
163+sessionsCheckpointLoadingKey: null,
164+sessionsCheckpointBusyKey: null,
165+sessionsCheckpointErrorByKey: {},
152166chatModelOverrides: {},
153167chatModelSwitchPromises: {},
154168chatModelsLoading: false,
@@ -412,6 +426,86 @@ describe("refreshChat", () => {
412426expect(request).toHaveBeenCalledWith("models.list", { view: "configured" });
413427expect(requestUpdate).toHaveBeenCalled();
414428});
429+430+it("drains a restored queue after refresh proves the selected session is idle", async () => {
431+const request = vi.fn(async (method: string) => {
432+if (method === "chat.history") {
433+return { messages: [] };
434+}
435+if (method === "sessions.list") {
436+return createSessionsResult([row("main", { hasActiveRun: false, status: "done" })]);
437+}
438+return {};
439+});
440+const host = makeHost({
441+client: { request } as unknown as ChatHost["client"],
442+sessionKey: "main",
443+chatQueue: [{ id: "queued-1", text: "after reload", createdAt: 1 }],
444+});
445+446+await refreshChat(host, { scheduleScroll: false });
447+await new Promise<void>((resolve) => setImmediate(resolve));
448+449+expect(request).toHaveBeenCalledWith(
450+"chat.send",
451+expect.objectContaining({
452+sessionKey: "main",
453+message: "after reload",
454+}),
455+);
456+expect(host.chatQueue).toEqual([]);
457+});
458+459+it("keeps a restored queue while the selected session is still active", async () => {
460+const request = vi.fn(async (method: string) => {
461+if (method === "chat.history") {
462+return { messages: [] };
463+}
464+if (method === "sessions.list") {
465+return createSessionsResult([row("main", { hasActiveRun: true, status: "running" })]);
466+}
467+return {};
468+});
469+const restoredQueue = [{ id: "queued-1", text: "after active run", createdAt: 1 }];
470+const host = makeHost({
471+client: { request } as unknown as ChatHost["client"],
472+sessionKey: "main",
473+chatQueue: restoredQueue,
474+});
475+476+await refreshChat(host, { scheduleScroll: false });
477+await new Promise<void>((resolve) => setImmediate(resolve));
478+479+expect(request).not.toHaveBeenCalledWith("chat.send", expect.anything());
480+expect(host.chatQueue).toEqual(restoredQueue);
481+expect(host.chatRunId).toBeNull();
482+});
483+484+it("keeps a restored queue when idle proof is stale after sessions refresh fails", async () => {
485+const request = vi.fn(async (method: string) => {
486+if (method === "chat.history") {
487+return { messages: [] };
488+}
489+if (method === "sessions.list") {
490+throw new Error("sessions unavailable");
491+}
492+return {};
493+});
494+const restoredQueue = [{ id: "queued-1", text: "after reload", createdAt: 1 }];
495+const host = makeHost({
496+client: { request } as unknown as ChatHost["client"],
497+sessionKey: "main",
498+chatQueue: restoredQueue,
499+sessionsResult: createSessionsResult([row("main", { hasActiveRun: false, status: "done" })]),
500+});
501+502+await refreshChat(host, { scheduleScroll: false });
503+await new Promise<void>((resolve) => setImmediate(resolve));
504+505+expect(request).not.toHaveBeenCalledWith("chat.send", expect.anything());
506+expect(host.chatQueue).toEqual(restoredQueue);
507+expect(host.sessionsError).toContain("sessions unavailable");
508+});
415509});
416510417511describe("refreshChatAvatar", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。