From 0b299246488b90cea223dd86ce516116270b1215 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 26 Feb 2026 20:43:54 -0800 Subject: [PATCH] Recover bootstrap thread from snapshot when IDs are missing - Fetch orchestration snapshot when bootstrap project/thread IDs are absent - Resolve project by current workspace and choose latest non-deleted thread - Continue auto-navigation and expansion using resolved fallback IDs --- apps/web/src/routes/__root.tsx | 36 +++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/apps/web/src/routes/__root.tsx b/apps/web/src/routes/__root.tsx index 000e132048071c15a26c393ea514572d9f328a4e..80bf213b40a88065df45b7ceddb34d4ab7ed7a34 100644 --- a/apps/web/src/routes/__root.tsx +++ b/apps/web/src/routes/__root.tsx @@ -198,26 +198,52 @@ function EventRouter() { return; } - if (!payload.bootstrapProjectId || !payload.bootstrapThreadId) { + const fallbackSnapshot = + payload.bootstrapProjectId && payload.bootstrapThreadId + ? null + : await api.orchestration.getSnapshot().catch(() => null); + if (disposed) { + return; + } + + const bootstrapProjectId = + payload.bootstrapProjectId ?? + fallbackSnapshot?.projects.find( + (project) => project.workspaceRoot === payload.cwd && project.deletedAt === null, + )?.id; + if (!bootstrapProjectId) { return; } dispatch({ type: "SET_PROJECT_EXPANDED", - projectId: payload.bootstrapProjectId, + projectId: bootstrapProjectId, expanded: true, }); + + const bootstrapThreadId = + payload.bootstrapThreadId ?? + fallbackSnapshot?.threads + .filter((thread) => thread.projectId === bootstrapProjectId && thread.deletedAt === null) + .toSorted((a, b) => { + const byDate = new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(); + if (byDate !== 0) return byDate; + return b.id.localeCompare(a.id); + })[0]?.id; + if (!bootstrapThreadId) { + return; + } if (pathnameRef.current !== "/") { return; } - if (handledBootstrapThreadIdRef.current === payload.bootstrapThreadId) { + if (handledBootstrapThreadIdRef.current === bootstrapThreadId) { return; } await navigate({ to: "/$threadId", - params: { threadId: payload.bootstrapThreadId }, + params: { threadId: bootstrapThreadId }, replace: true, }); - handledBootstrapThreadIdRef.current = payload.bootstrapThreadId; + handledBootstrapThreadIdRef.current = bootstrapThreadId; })().catch(() => undefined); }); const unsubServerConfigUpdated = onServerConfigUpdated((payload) => { -- 2.54.0