fix(sessions): accept in-flight draft rewrite to the fallback directory

Create no longer aborts when recoverStaleDraftDirectory rewrites the
implicit new-chat draft to the active project during the create probe.
Also rank the Unreleased Chat bullet below the changelog highlights.

Co-authored-by: serkraser <serkraser@gmail.com>
This commit is contained in:
Cursor Agent
2026-08-15 06:33:28 +00:00
co-authored by serkraser
parent a500a5d4e9
commit d817c44c46
4 changed files with 47 additions and 3 deletions
@@ -555,6 +555,37 @@ describe('createSession draft lifecycle', () => {
expect(useDirectoryStore.getState().currentDirectory).toBe('/private/unavailable-worktree');
});
test('still creates against the active project when the draft is rewritten during the create probe', async () => {
const createSessionCalls = [];
const availabilityResolvers = [];
useProjectsStore.setState({
projects: [{ id: 'project-main', path: '/projects/main', label: 'Main' }],
activeProjectId: 'project-main',
});
useDirectoryStore.getState().setDirectory('/private/deleted-worktree', { showOverlay: false });
opencodeClient.getDirectoryAvailability = () => new Promise((resolve) => {
availabilityResolvers.push(resolve);
});
opencodeClient.createSession = async (_params, directory) => {
createSessionCalls.push(directory);
return { id: 'session-race', directory };
};
useSessionUIStore.getState().openNewSessionDraft();
const createPromise = useSessionUIStore.getState().createSession('Draft title', '/private/deleted-worktree');
expect(availabilityResolvers.length).toBe(2);
availabilityResolvers[0]('missing');
await Bun.sleep(0);
expect(useSessionUIStore.getState().newSessionDraft.directoryOverride).toBe('/projects/main');
availabilityResolvers[1]('missing');
const session = await createPromise;
expect(session).not.toBeNull();
expect(createSessionCalls).toEqual(['/projects/main']);
});
test('does not persist a fallback when session creation fails', async () => {
useProjectsStore.setState({
projects: [{ id: 'project-main', path: '/projects/main', label: 'Main' }],