



























@@ -113,6 +113,11 @@ import {
113113import type { ModelAliasIndex } from "../../agents/model-selection.js";
114114import type { ModelDefinitionConfig, OpenClawConfig } from "../../config/config.js";
115115import type { SessionEntry } from "../../config/sessions.js";
116+import {
117+clearInternalHooks,
118+registerInternalHook,
119+type InternalHookEvent,
120+} from "../../hooks/internal-hooks.js";
116121import { enqueueSystemEvent } from "../../infra/system-events.js";
117122import { createEmptyPluginRegistry } from "../../plugins/registry-empty.js";
118123import { setActivePluginRegistry } from "../../plugins/runtime.js";
@@ -243,11 +248,13 @@ beforeEach(() => {
243248vi.mocked(enqueueSystemEvent).mockClear();
244249liveModelSwitchMocks.requestLiveSessionModelSwitch.mockReset().mockReturnValue(false);
245250queueMocks.refreshQueuedFollowupSession.mockReset();
251+clearInternalHooks();
246252});
247253248254afterEach(() => {
249255setDirectiveTestProviders([]);
250256clearRuntimeAuthProfileStoreSnapshots();
257+clearInternalHooks();
251258});
252259253260function setAuthProfiles(profiles: Record<string, AuthProfileForTest>) {
@@ -1267,6 +1274,34 @@ describe("handleDirectiveOnly model persist behavior (fixes #1435)", () => {
12671274});
12681275});
126912761277+it("fires session:patch when /model changes the persisted session model", async () => {
1278+const events: InternalHookEvent[] = [];
1279+registerInternalHook("session:patch", async (event) => {
1280+events.push(event);
1281+});
1282+const sessionEntry = createSessionEntry();
1283+1284+await handleDirectiveOnly(
1285+createHandleParams({
1286+directives: parseInlineDirectives("/model openai/gpt-4o"),
1287+ sessionEntry,
1288+}),
1289+);
1290+1291+await vi.waitFor(() => expect(events).toHaveLength(1));
1292+const event = events[0];
1293+expect(event.type).toBe("session");
1294+expect(event.action).toBe("patch");
1295+expect(event.sessionKey).toBe(sessionKey);
1296+const context = event.context;
1297+expect(context.patch).toMatchObject({ key: sessionKey, model: "openai/gpt-4o" });
1298+expect(context.sessionEntry).toMatchObject({
1299+providerOverride: "openai",
1300+modelOverride: "gpt-4o",
1301+liveModelSwitchPending: true,
1302+});
1303+});
1304+12701305it("keeps xhigh when switching to OpenCode Claude Opus 4.7", async () => {
12711306const sessionEntry = createSessionEntry({ thinkingLevel: "xhigh" });
12721307const sessionStore = { [sessionKey]: sessionEntry };
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。