UI: characterize agents panel routing and extract selection reset helper

This commit is contained in:
joshavant
2026-04-09 18:42:26 -05:00
committed by Josh Avant
parent c097ba3fc2
commit ca21090455
3 changed files with 40 additions and 44 deletions

View File

@@ -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);
},

View File

@@ -96,23 +96,36 @@ describe("refreshActiveTab", () => {
const expectCommonAgentsTabRefresh = (host: ReturnType<typeof createHost>) => {
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";

View File

@@ -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);
}
}