diff --git a/ui/src/ui/app-render.ts b/ui/src/ui/app-render.ts index 6489a5e7150..315da70daaa 100644 --- a/ui/src/ui/app-render.ts +++ b/ui/src/ui/app-render.ts @@ -743,6 +743,16 @@ export function renderApp(state: AppViewState) { state.agentFilesLoading = false; } }; + const resetAgentSelectionPanelState = () => { + resetAgentFilesState(true); + state.agentSkillsReport = null; + state.agentSkillsError = null; + state.agentSkillsAgentId = null; + state.toolsCatalogResult = null; + state.toolsCatalogError = null; + state.toolsCatalogLoading = false; + resetToolsEffectiveState(state); + }; return html` ${renderCommandPalette({ @@ -1378,14 +1388,7 @@ export function renderApp(state: AppViewState) { return; } state.agentsSelectedId = agentId; - resetAgentFilesState(true); - state.agentSkillsReport = null; - state.agentSkillsError = null; - state.agentSkillsAgentId = null; - state.toolsCatalogResult = null; - state.toolsCatalogError = null; - state.toolsCatalogLoading = false; - resetToolsEffectiveState(state); + resetAgentSelectionPanelState(); void loadAgentIdentity(state, agentId); loadAgentPanelDataForSelectedAgent(agentId); }, diff --git a/ui/src/ui/app-settings.refresh-active-tab.node.test.ts b/ui/src/ui/app-settings.refresh-active-tab.node.test.ts index 4d03a12350b..d41450d8e83 100644 --- a/ui/src/ui/app-settings.refresh-active-tab.node.test.ts +++ b/ui/src/ui/app-settings.refresh-active-tab.node.test.ts @@ -96,23 +96,36 @@ describe("refreshActiveTab", () => { const expectCommonAgentsTabRefresh = (host: ReturnType) => { expect(mocks.loadAgentsMock).toHaveBeenCalledOnce(); expect(mocks.loadConfigMock).toHaveBeenCalledOnce(); + expect(mocks.loadAgentIdentitiesMock).toHaveBeenCalledWith(host, ["agent-a", "agent-b"]); expect(mocks.loadAgentIdentityMock).toHaveBeenCalledWith(host, "agent-b"); }; - it("loads agents panel files data for the resolved selected agent", async () => { - const host = createHost(); - host.tab = "agents"; - host.agentsPanel = "files"; + for (const panel of ["files", "skills", "channels", "tools"] as const) { + it(`routes agents ${panel} panel refresh through the expected loaders`, async () => { + const host = createHost(); + host.tab = "agents"; + host.agentsPanel = panel; - await refreshActiveTab(host as never); + await refreshActiveTab(host as never); - expectCommonAgentsTabRefresh(host); - expect(mocks.loadAgentIdentitiesMock).toHaveBeenCalledWith(host, ["agent-a", "agent-b"]); - expect(mocks.loadAgentFilesMock).toHaveBeenCalledWith(host, "agent-b"); - expect(mocks.loadAgentSkillsMock).not.toHaveBeenCalled(); - expect(mocks.loadChannelsMock).not.toHaveBeenCalled(); - expect(mocks.loadCronStatusMock).not.toHaveBeenCalled(); - }); + expectCommonAgentsTabRefresh(host); + expect(mocks.loadAgentFilesMock).toHaveBeenCalledTimes(panel === "files" ? 1 : 0); + expect(mocks.loadAgentSkillsMock).toHaveBeenCalledTimes(panel === "skills" ? 1 : 0); + expect(mocks.loadChannelsMock).toHaveBeenCalledTimes(panel === "channels" ? 1 : 0); + if (panel === "files") { + expect(mocks.loadAgentFilesMock).toHaveBeenCalledWith(host, "agent-b"); + } + if (panel === "skills") { + expect(mocks.loadAgentSkillsMock).toHaveBeenCalledWith(host, "agent-b"); + } + if (panel === "channels") { + expect(mocks.loadChannelsMock).toHaveBeenCalledWith(host, false); + } + expect(mocks.loadCronStatusMock).not.toHaveBeenCalled(); + expect(mocks.loadCronJobsPageMock).not.toHaveBeenCalled(); + expect(mocks.loadCronRunsMock).not.toHaveBeenCalled(); + }); + } it("routes agents cron panel refresh through cron loaders", async () => { const host = createHost(); @@ -132,22 +145,6 @@ describe("refreshActiveTab", () => { expect(mocks.loadAgentSkillsMock).not.toHaveBeenCalled(); }); - it("keeps tools panel refresh narrow and skips files/skills/channels/cron loaders", async () => { - const host = createHost(); - host.tab = "agents"; - host.agentsPanel = "tools"; - - await refreshActiveTab(host as never); - - expectCommonAgentsTabRefresh(host); - expect(mocks.loadAgentFilesMock).not.toHaveBeenCalled(); - expect(mocks.loadAgentSkillsMock).not.toHaveBeenCalled(); - expect(mocks.loadChannelsMock).not.toHaveBeenCalled(); - expect(mocks.loadCronStatusMock).not.toHaveBeenCalled(); - expect(mocks.loadCronJobsPageMock).not.toHaveBeenCalled(); - expect(mocks.loadCronRunsMock).not.toHaveBeenCalled(); - }); - it("refreshes logs tab by resetting bottom-follow and scheduling scroll", async () => { const host = createHost(); host.tab = "logs"; diff --git a/ui/src/ui/app-settings.ts b/ui/src/ui/app-settings.ts index 2e19c9fc88b..aca261174a9 100644 --- a/ui/src/ui/app-settings.ts +++ b/ui/src/ui/app-settings.ts @@ -248,17 +248,13 @@ async function refreshAgentsTab(host: SettingsHost, app: OpenClawApp) { void loadAgentIdentity(app, agentId); switch (host.agentsPanel) { case "files": - void loadAgentFiles(app, agentId); - return; + return void loadAgentFiles(app, agentId); case "skills": - void loadAgentSkills(app, agentId); - return; + return void loadAgentSkills(app, agentId); case "channels": - void loadChannels(app, false); - return; + return void loadChannels(app, false); case "cron": - void loadCron(host); - return; + return void loadCron(host); } }