authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-02-26 20:48:32-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-02-26 21:05:53-08:00
log581aa7279f41c02b38f28a4cb05b184f0637e592
tree5a8447640d2f06681aacd8de69232a211a7bb8e3
parent0b299246488b90cea223dd86ce516116270b1215

Require bootstrap IDs for root thread auto-navigation

- Remove snapshot fallback lookup for missing bootstrap project/thread IDs - Only expand project and navigate when server payload includes both IDs

1 files changed, 5 insertions(+), 30 deletions(-)

apps/web/src/routes/__root.tsx+5-30
...@@ -198,52 +198,27 @@ function EventRouter() {...@@ -198,52 +198,27 @@ function EventRouter() {
198 return;198 return;
199 }199 }
200200
201 const fallbackSnapshot =201 if (!payload.bootstrapProjectId || !payload.bootstrapThreadId) {
202 payload.bootstrapProjectId && payload.bootstrapThreadId
203 ? null
204 : await api.orchestration.getSnapshot().catch(() => null);
205 if (disposed) {
206 return;
207 }
208
209 const bootstrapProjectId =
210 payload.bootstrapProjectId ??
211 fallbackSnapshot?.projects.find(
212 (project) => project.workspaceRoot === payload.cwd && project.deletedAt === null,
213 )?.id;
214 if (!bootstrapProjectId) {
215 return;202 return;
216 }203 }
217 dispatch({204 dispatch({
218 type: "SET_PROJECT_EXPANDED",205 type: "SET_PROJECT_EXPANDED",
219 projectId: bootstrapProjectId,206 projectId: payload.bootstrapProjectId,
220 expanded: true,207 expanded: true,
221 });208 });
222209
223 const bootstrapThreadId =
224 payload.bootstrapThreadId ??
225 fallbackSnapshot?.threads
226 .filter((thread) => thread.projectId === bootstrapProjectId && thread.deletedAt === null)
227 .toSorted((a, b) => {
228 const byDate = new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
229 if (byDate !== 0) return byDate;
230 return b.id.localeCompare(a.id);
231 })[0]?.id;
232 if (!bootstrapThreadId) {
233 return;
234 }
235 if (pathnameRef.current !== "/") {210 if (pathnameRef.current !== "/") {
236 return;211 return;
237 }212 }
238 if (handledBootstrapThreadIdRef.current === bootstrapThreadId) {213 if (handledBootstrapThreadIdRef.current === payload.bootstrapThreadId) {
239 return;214 return;
240 }215 }
241 await navigate({216 await navigate({
242 to: "/$threadId",217 to: "/$threadId",
243 params: { threadId: bootstrapThreadId },218 params: { threadId: payload.bootstrapThreadId },
244 replace: true,219 replace: true,
245 });220 });
246 handledBootstrapThreadIdRef.current = bootstrapThreadId;221 handledBootstrapThreadIdRef.current = payload.bootstrapThreadId;
247 })().catch(() => undefined);222 })().catch(() => undefined);
248 });223 });
249 const unsubServerConfigUpdated = onServerConfigUpdated((payload) => {224 const unsubServerConfigUpdated = onServerConfigUpdated((payload) => {