





















@@ -590,6 +590,76 @@ describe("session_status tool", () => {
590590expect(details.statusText).toContain("🧠 Model:");
591591});
592592593+it("resolves the default session_status lookup for a channel-plugin requester via implicit fallback", async () => {
594+resetSessionStore({});
595+596+const tool = getSessionStatusTool("agent:main:scope:scopy:direct:scopy");
597+598+const result = await tool.execute("call-current-channel-plugin-default", {});
599+const details = result.details as { ok?: boolean; sessionKey?: string; statusText?: string };
600+expect(details.ok).toBe(true);
601+expect(details.sessionKey).toBe("agent:main:scope:scopy:direct:scopy");
602+expect(details.statusText).toContain("OpenClaw");
603+expect(details.statusText).toContain("🧠 Model:");
604+});
605+606+it("materializes a valid persisted session entry when implicit current fallback mutates model state", async () => {
607+resetSessionStore({});
608+609+const tool = getSessionStatusTool("agent:main:scope:scopy:direct:scopy");
610+611+const result = await tool.execute("call-current-channel-plugin-model", {
612+sessionKey: "current",
613+model: "anthropic/claude-sonnet-4-6",
614+});
615+const details = result.details as { ok?: boolean; sessionKey?: string };
616+expect(details.ok).toBe(true);
617+expect(details.sessionKey).toBe("agent:main:scope:scopy:direct:scopy");
618+expect(updateSessionStoreMock).toHaveBeenCalled();
619+const [, savedStore] = updateSessionStoreMock.mock.calls.at(-1) as [
620+string,
621+Record<string, SessionEntry>,
622+];
623+const saved = savedStore["agent:main:scope:scopy:direct:scopy"];
624+expect(saved).toEqual(
625+expect.objectContaining({
626+providerOverride: "anthropic",
627+modelOverride: "claude-sonnet-4-6",
628+liveModelSwitchPending: true,
629+}),
630+);
631+expect(saved.sessionId).toEqual(expect.any(String));
632+expect(saved.sessionId.trim().length).toBeGreaterThan(0);
633+});
634+635+it("materializes a valid persisted session entry when the default implicit current fallback mutates model state", async () => {
636+resetSessionStore({});
637+638+const tool = getSessionStatusTool("agent:main:scope:scopy:direct:scopy");
639+640+const result = await tool.execute("call-current-channel-plugin-default-model", {
641+model: "anthropic/claude-sonnet-4-6",
642+});
643+const details = result.details as { ok?: boolean; sessionKey?: string };
644+expect(details.ok).toBe(true);
645+expect(details.sessionKey).toBe("agent:main:scope:scopy:direct:scopy");
646+expect(updateSessionStoreMock).toHaveBeenCalled();
647+const [, savedStore] = updateSessionStoreMock.mock.calls.at(-1) as [
648+string,
649+Record<string, SessionEntry>,
650+];
651+const saved = savedStore["agent:main:scope:scopy:direct:scopy"];
652+expect(saved).toEqual(
653+expect.objectContaining({
654+providerOverride: "anthropic",
655+modelOverride: "claude-sonnet-4-6",
656+liveModelSwitchPending: true,
657+}),
658+);
659+expect(saved.sessionId).toEqual(expect.any(String));
660+expect(saved.sessionId.trim().length).toBeGreaterThan(0);
661+});
662+593663it("does not synthesize a current fallback for unknown non-literal session keys", async () => {
594664resetSessionStore({});
595665此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。