fix(ui): preserve agent file edits during save (#105359)

* fix(ui): preserve agent file edits during save

* chore: defer agent file note to release
This commit is contained in:
Peter Steinberger
2026-07-12 13:27:46 +01:00
committed by GitHub
parent 165651fb79
commit 35b527c5bb
2 changed files with 44 additions and 1 deletions

View File

@@ -89,4 +89,43 @@ describe("agent file requests", () => {
expect(state.agentFileContents).toEqual({});
expect(state.agentFileSaving).toBe(false);
});
it("commits the submitted draft when it stays current", async () => {
const client = {
request: vi.fn().mockResolvedValue({ ok: true, ...fileResult("submitted") }),
} as unknown as GatewayBrowserClient;
const state = createState(client);
state.agentFileContents = { "AGENTS.md": "original" };
state.agentFileDrafts = { "AGENTS.md": "submitted" };
await saveAgentFile(state, "main", "AGENTS.md", "submitted");
expect(state.agentFileContents).toEqual({ "AGENTS.md": "submitted" });
expect(state.agentFileDrafts).toEqual({ "AGENTS.md": "submitted" });
expect(state.agentFileSaving).toBe(false);
});
it("preserves edits made while a save is pending", async () => {
let resolveSave!: (value: AgentsFilesSetResult) => void;
const client = {
request: vi.fn(
() =>
new Promise<AgentsFilesSetResult>((resolve) => {
resolveSave = resolve;
}),
),
} as unknown as GatewayBrowserClient;
const state = createState(client);
state.agentFileContents = { "AGENTS.md": "original" };
state.agentFileDrafts = { "AGENTS.md": "submitted" };
const save = saveAgentFile(state, "main", "AGENTS.md", "submitted");
state.agentFileDrafts = { "AGENTS.md": "typed while saving" };
resolveSave({ ok: true, ...fileResult("submitted") });
await save;
expect(state.agentFileContents).toEqual({ "AGENTS.md": "submitted" });
expect(state.agentFileDrafts).toEqual({ "AGENTS.md": "typed while saving" });
expect(state.agentFileSaving).toBe(false);
});
});

View File

@@ -110,7 +110,11 @@ export async function saveAgentFile(
if (res?.file && isCurrent()) {
state.agentFilesList = mergeFileEntry(state.agentFilesList, res.file);
state.agentFileContents = { ...state.agentFileContents, [name]: content };
state.agentFileDrafts = { ...state.agentFileDrafts, [name]: content };
// The response establishes the saved base, but must not discard text
// entered after this save started.
if (!Object.hasOwn(state.agentFileDrafts, name) || state.agentFileDrafts[name] === content) {
state.agentFileDrafts = { ...state.agentFileDrafts, [name]: content };
}
}
} catch (err) {
if (isCurrent()) {