




























@@ -59,6 +59,7 @@ function createHarness(params?: {
5959currentSessionId: params?.currentSessionId ?? null,
6060activeChatRunId: params?.activeChatRunId ?? null,
6161pendingOptimisticUserMessage: params?.pendingOptimisticUserMessage ?? false,
62+pendingChatRunId: null as string | null,
6263isConnected: params?.isConnected ?? true,
6364sessionInfo: {},
6465};
@@ -292,6 +293,29 @@ describe("tui command handlers", () => {
292293expect(state.pendingOptimisticUserMessage).toBe(true);
293294});
294295296+it("tracks the in-flight runId so escape can abort during the wait", async () => {
297+const sendChat = vi.fn().mockResolvedValue({ runId: "ignored" });
298+const { handleCommand, state } = createHarness({ sendChat });
299+300+await handleCommand("hello");
301+302+const sentRunId = (sendChat.mock.calls[0]?.[0] as { runId: string }).runId;
303+expect(typeof sentRunId).toBe("string");
304+expect(sentRunId.length).toBeGreaterThan(0);
305+expect(state.activeChatRunId).toBeNull();
306+expect(state.pendingChatRunId).toBe(sentRunId);
307+});
308+309+it("clears the pending runId if sendChat fails", async () => {
310+const sendChat = vi.fn().mockRejectedValue(new Error("boom"));
311+const { handleCommand, state } = createHarness({ sendChat });
312+313+await handleCommand("hello");
314+315+expect(state.pendingChatRunId).toBeNull();
316+expect(state.pendingOptimisticUserMessage).toBe(false);
317+});
318+295319it("sends /btw without hijacking the active main run", async () => {
296320const setActivityStatus = vi.fn();
297321const { handleCommand, sendChat, addUser, noteLocalRunId, noteLocalBtwRunId, state } =
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。