fix(ui): select AGENTS.md when files open (#111967)

This commit is contained in:
Patrick Erichsen
2026-07-20 15:57:35 -07:00
committed by GitHub
parent e07de4c561
commit b628882d0b
2 changed files with 61 additions and 11 deletions
+47
View File
@@ -20,6 +20,7 @@ type TestAgentsPage = HTMLElement & {
routeData?: AgentsRouteData;
agentFilesLoading: boolean;
agentFilesList: AgentsFilesListResult | null;
agentFileActive: string | null;
agentFileContents: Record<string, string>;
agentIdentityLoading: boolean;
agentsPanel: string;
@@ -244,6 +245,52 @@ describe("AgentsPage gateway lifecycle", () => {
expect(page.agentFilesLoading).toBe(false);
});
it("selects and loads AGENTS.md when the file list opens", async () => {
const fileList: AgentsFilesListResult = {
agentId: "main",
workspace: "/tmp/workspace",
files: [
{
name: "AGENTS.md",
path: "/tmp/workspace/AGENTS.md",
missing: false,
},
{
name: "SOUL.md",
path: "/tmp/workspace/SOUL.md",
missing: false,
},
],
};
const request = vi.fn(async () => ({
file: {
...fileList.files[0],
content: "# Instructions",
},
}));
const client = { request } as unknown as GatewayBrowserClient;
const page = document.createElement("openclaw-agents-page") as TestAgentsPage;
page.client = client;
page.connected = true;
page.agentsSelectedId = "main";
page.context = {
agents: {
files: () => ({ list: null, loading: false, error: null }),
ensureFiles: vi.fn(async () => fileList),
refreshFiles: vi.fn(async () => fileList),
},
} as unknown as ApplicationContext;
await page.loadAgentFiles("main");
expect(page.agentFileActive).toBe("AGENTS.md");
expect(page.agentFileContents["AGENTS.md"]).toBe("# Instructions");
expect(request).toHaveBeenCalledWith("agents.files.get", {
agentId: "main",
name: "AGENTS.md",
});
});
it("retries an in-flight panel load after a same-client disconnect", async () => {
let resolveFirst!: (value: AgentsFilesListResult) => void;
let resolveSecond!: (value: AgentsFilesListResult) => void;
+14 -11
View File
@@ -316,11 +316,17 @@ class AgentsPage extends OpenClawLightDomElement implements AgentsState {
}
this.agentFilesList = status.list;
this.agentFilesError = status.error;
if (
this.agentFileActive &&
!status.list.files.some((file) => file.name === this.agentFileActive)
) {
this.agentFileActive = null;
void this.selectDefaultAgentFile(agentId);
}
private async selectDefaultAgentFile(agentId: string) {
const files = this.agentFilesList?.files ?? [];
if (this.agentFileActive && files.some((file) => file.name === this.agentFileActive)) {
return;
}
this.agentFileActive = files.find((file) => file.name === "AGENTS.md")?.name ?? null;
if (this.agentFileActive) {
await loadAgentFileContent(this, agentId, this.agentFileActive);
}
}
@@ -551,17 +557,14 @@ class AgentsPage extends OpenClawLightDomElement implements AgentsState {
}
this.agentFilesList = list ?? agents.files(agentId).list;
this.agentFilesError = agents.files(agentId).error;
if (
this.agentFileActive &&
!this.agentFilesList?.files.some((file) => file.name === this.agentFileActive)
) {
this.agentFileActive = null;
}
} finally {
if (this.isCurrentRequest(client, generation, agentId, { agents })) {
this.agentFilesLoading = false;
}
}
if (this.isCurrentRequest(client, generation, agentId, { agents })) {
await this.selectDefaultAgentFile(agentId);
}
}
private async refreshCron() {