diff --git a/packages/ui/src/stores/useDirectoryStore.ts b/packages/ui/src/stores/useDirectoryStore.ts index 77ab79b8..372cc6a0 100644 --- a/packages/ui/src/stores/useDirectoryStore.ts +++ b/packages/ui/src/stores/useDirectoryStore.ts @@ -45,7 +45,9 @@ const normalizeDirectoryPath = (value: string): string => { if (!trimmed) { return trimmed; } - const normalized = trimmed.replace(/\\/g, '/'); + const normalized = trimmed + .replace(/\\/g, '/') + .replace(/^([a-z]):/, (_, letter: string) => letter.toUpperCase() + ':'); if (normalized.length > 1) { return normalized.replace(/\/+$/, ''); } diff --git a/packages/ui/src/sync/sync-context.tsx b/packages/ui/src/sync/sync-context.tsx index afeb34c8..8bf50c4f 100644 --- a/packages/ui/src/sync/sync-context.tsx +++ b/packages/ui/src/sync/sync-context.tsx @@ -108,10 +108,16 @@ function isRecentBoot() { } function handleEvent( - directory: string, + rawDirectory: string, payload: Event, childStores: ChildStoreManager, ) { + // Normalize directory path: SSE events from OpenCode use native OS separators + // (backslashes on Windows) and may differ in drive-letter case. + // Child stores are keyed with forward slashes and uppercase drive letters. + const directory = rawDirectory && rawDirectory !== "global" + ? rawDirectory.replace(/\\/g, "/").replace(/^([a-z]):/, (_, l: string) => l.toUpperCase() + ":") + : rawDirectory // Global events if (directory === "global" || !directory) { const recent = isRecentBoot()