fix(sessions): rewrite stale new-chat drafts before send
When a regular new-chat draft inherits a deleted lastDirectory, update the visible draft target to the active project immediately. lastDirectory still stays unchanged until session creation succeeds. Co-authored-by: serkraser <serkraser@gmail.com>
This commit is contained in:
co-authored by
serkraser
parent
90e79b04a4
commit
9090733908
@@ -456,6 +456,22 @@ describe('createSession draft lifecycle', () => {
|
|||||||
expect(useSessionUIStore.getState().newSessionDraft.title).toBe('Draft title');
|
expect(useSessionUIStore.getState().newSessionDraft.title).toBe('Draft title');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('rewrites an implicit new-chat draft to the active project before the session is created', async () => {
|
||||||
|
useProjectsStore.setState({
|
||||||
|
projects: [{ id: 'project-main', path: '/projects/main', label: 'Main' }],
|
||||||
|
activeProjectId: 'project-main',
|
||||||
|
});
|
||||||
|
useDirectoryStore.getState().setDirectory('/private/deleted-worktree', { showOverlay: false });
|
||||||
|
opencodeClient.getDirectoryAvailability = async () => 'missing';
|
||||||
|
|
||||||
|
useSessionUIStore.getState().openNewSessionDraft();
|
||||||
|
await Bun.sleep(0);
|
||||||
|
|
||||||
|
expect(useSessionUIStore.getState().newSessionDraft.directoryOverride).toBe('/projects/main');
|
||||||
|
expect(useSessionUIStore.getState().newSessionDraft.selectedProjectId).toBe('project-main');
|
||||||
|
expect(getDeferredSafeStorage().getItem('lastDirectory')).toBe('/private/deleted-worktree');
|
||||||
|
});
|
||||||
|
|
||||||
test('falls back to the current active project when a regular new-chat directory is missing', async () => {
|
test('falls back to the current active project when a regular new-chat directory is missing', async () => {
|
||||||
const createSessionCalls = [];
|
const createSessionCalls = [];
|
||||||
useProjectsStore.setState({
|
useProjectsStore.setState({
|
||||||
|
|||||||
@@ -660,6 +660,33 @@ const resolveCreatableDraftDirectory = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const recoverStaleDraftDirectory = async (openedDraft: NewSessionDraftState): Promise<void> => {
|
||||||
|
const resolved = await resolveCreatableDraftDirectory(openedDraft, openedDraft.directoryOverride)
|
||||||
|
if (resolved.status !== "ok") return
|
||||||
|
const recovered = normalizePath(resolved.directory ?? null)
|
||||||
|
const original = normalizePath(openedDraft.directoryOverride)
|
||||||
|
if (!recovered || recovered === original) return
|
||||||
|
|
||||||
|
const currentDraft = useSessionUIStore.getState().newSessionDraft
|
||||||
|
if (!currentDraft.open) return
|
||||||
|
if (currentDraft.preserveDirectoryOverride === true) return
|
||||||
|
if (currentDraft.pendingWorktreeRequestId) return
|
||||||
|
if (normalizePath(currentDraft.directoryOverride) !== original) return
|
||||||
|
|
||||||
|
const recoveredProject = useProjectsStore.getState().projects.find((project) => (
|
||||||
|
normalizePath(project.path) === recovered
|
||||||
|
))
|
||||||
|
const nextDraft: NewSessionDraftState = {
|
||||||
|
...currentDraft,
|
||||||
|
selectedProjectId: recoveredProject?.id ?? currentDraft.selectedProjectId,
|
||||||
|
directoryOverride: recovered,
|
||||||
|
}
|
||||||
|
useSessionUIStore.setState({ newSessionDraft: nextDraft })
|
||||||
|
writeRuntimeSessionMemory(runtimeMemoryKey(), { draft: nextDraft })
|
||||||
|
persistDraftTarget({ projectId: nextDraft.selectedProjectId ?? null, directory: recovered })
|
||||||
|
void activateConfigForDirectory(recovered)
|
||||||
|
}
|
||||||
|
|
||||||
export async function materializeOpenDraftSession(selection: {
|
export async function materializeOpenDraftSession(selection: {
|
||||||
providerID: string
|
providerID: string
|
||||||
modelID: string
|
modelID: string
|
||||||
@@ -1021,6 +1048,8 @@ export const useSessionUIStore = create<SessionUIState>()((set, get) => ({
|
|||||||
if (directory && directory !== useDirectoryStore.getState().currentDirectory) {
|
if (directory && directory !== useDirectoryStore.getState().currentDirectory) {
|
||||||
useDirectoryStore.getState().setDirectory(directory)
|
useDirectoryStore.getState().setDirectory(directory)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void recoverStaleDraftDirectory(nextDraft)
|
||||||
},
|
},
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user