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() {
198198 return;
199199 }
200200
201 const fallbackSnapshot =
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) {
201 if (!payload.bootstrapProjectId || !payload.bootstrapThreadId) {
215202 return;
216203 }
217204 dispatch({
218205 type: "SET_PROJECT_EXPANDED",
219 projectId: bootstrapProjectId,
206 projectId: payload.bootstrapProjectId,
220207 expanded: true,
221208 });
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 }
235210 if (pathnameRef.current !== "/") {
236211 return;
237212 }
238 if (handledBootstrapThreadIdRef.current === bootstrapThreadId) {
213 if (handledBootstrapThreadIdRef.current === payload.bootstrapThreadId) {
239214 return;
240215 }
241216 await navigate({
242217 to: "/$threadId",
243 params: { threadId: bootstrapThreadId },
218 params: { threadId: payload.bootstrapThreadId },
244219 replace: true,
245220 });
246 handledBootstrapThreadIdRef.current = bootstrapThreadId;
221 handledBootstrapThreadIdRef.current = payload.bootstrapThreadId;
247222 })().catch(() => undefined);
248223 });
249224 const unsubServerConfigUpdated = onServerConfigUpdated((payload) => {