


























@@ -213,6 +213,82 @@ describe("tui-event-handlers: handleAgentEvent", () => {
213213expect(tui.requestRender).toHaveBeenCalledTimes(1);
214214});
215215216+it("updates the displayed model from fallback lifecycle steps", () => {
217+const { state, tui, handleAgentEvent } = createHandlersHarness({
218+state: {
219+activeChatRunId: "run-fallback",
220+sessionInfo: {
221+verboseLevel: "on",
222+modelProvider: "llamaforge",
223+model: "qwen/qwen3.5-9b",
224+},
225+},
226+});
227+228+handleAgentEvent({
229+runId: "run-fallback",
230+stream: "lifecycle",
231+data: {
232+phase: "fallback_step",
233+fallbackStepFinalOutcome: "next_fallback",
234+fallbackStepFromModel: "openai-codex/gpt-5.5",
235+fallbackStepToModel: "openrouter/meta-llama/llama-3.1-70b",
236+},
237+});
238+239+expect(state.sessionInfo.modelProvider).toBe("openrouter");
240+expect(state.sessionInfo.model).toBe("meta-llama/llama-3.1-70b");
241+expect(tui.requestRender).toHaveBeenCalled();
242+});
243+244+it("accepts fallback model updates for the pending run before chat registration", () => {
245+const { state, tui, handleAgentEvent } = createHandlersHarness({
246+state: {
247+activeChatRunId: null,
248+pendingChatRunId: "run-pending",
249+sessionInfo: {
250+verboseLevel: "on",
251+modelProvider: "llamaforge",
252+model: "qwen/qwen3.5-9b",
253+},
254+},
255+});
256+257+handleAgentEvent({
258+runId: "run-pending",
259+stream: "lifecycle",
260+data: {
261+phase: "fallback_step",
262+fallbackStepFinalOutcome: "succeeded",
263+fallbackStepFromModel: "openrouter/meta-llama/llama-3.1-70b",
264+fallbackStepToModel: "nvidia/deepseek-ai/deepseek-v3.2",
265+},
266+});
267+268+expect(state.sessionInfo.modelProvider).toBe("nvidia");
269+expect(state.sessionInfo.model).toBe("deepseek-ai/deepseek-v3.2");
270+expect(tui.requestRender).toHaveBeenCalled();
271+});
272+273+it("ignores fallback model updates for unrelated runs", () => {
274+const { state, tui, handleAgentEvent } = createHandlersHarness({
275+state: {
276+activeChatRunId: "run-active",
277+sessionInfo: { verboseLevel: "on", modelProvider: "openai", model: "gpt-5.5" },
278+},
279+});
280+281+handleAgentEvent({
282+runId: "run-other",
283+stream: "lifecycle",
284+data: { phase: "fallback_step", fallbackStepToModel: "openrouter/other-model" },
285+});
286+287+expect(state.sessionInfo.modelProvider).toBe("openai");
288+expect(state.sessionInfo.model).toBe("gpt-5.5");
289+expect(tui.requestRender).not.toHaveBeenCalled();
290+});
291+216292it("captures runId from chat events when activeChatRunId is unset", () => {
217293const { state, chatLog, handleChatEvent, handleAgentEvent } = createHandlersHarness({
218294state: { activeChatRunId: null },
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。