Problem
Sessions created through opencode web (or any API client) on Windows are invisible in the desktop TUI /sessions picker when the target directory is on a different drive than the server process's cwd — as long as the directory has no git repo (so the session lands in the global project).
Concrete case (v1.18.32, single shared opencode.db):
opencode web runs with cwd on C:.
- Phone app creates a session with
directory=D:\Work\ForAI\dsh-plugin-TTS, sends messages. The session is fully readable via GET /session and GET /session?directory=....
- Desktop TUI opened in
D:\Work\ForAI\dsh-plugin-TTS shows only an older session in its picker, never the new ones.
Root cause
packages/opencode/src/session/session.ts:
sessionPath(worktree, cwd) = relative(resolve(worktree), cwd). For global-project sessions the worktree is /, and on Windows resolve("/") is the server process's drive root. Same directory string therefore stores a different path depending on who created it:
- web on
C: → path = "D:/Work/ForAI/dsh-plugin-TTS" (absolute, cross-drive fallback)
- TUI on
D: → path = "Work/ForAI/dsh-plugin-TTS" (relative)
- The TUI picker (
packages/tui/src/context/sync.tsx → sessionListQuery()) queries session.list({ path }) with its own drive-relative spelling, and listByProject matches path verbatim (eq / LIKE path/%). The two spellings never match, so each side only ever sees sessions minted on its own drive.
Verified locally: GET /session?path=Work/ForAI/dsh-plugin-TTS&roots=true returns exactly the 1 old session; the same query with the absolute spelling returns exactly the 2 missing ones.
Side note explaining a related asymmetry: a phone app that lists sessions globally (no project_id/path filter) sees desktop-created sessions fine — the filtering only bites in the desktop picker direction. Also note git init does NOT help here: it moves the TUI query to a new project id while existing sessions stay global, hiding even more.
Suggested fix
In sessionPath, when the worktree is the global root ("/") and the session directory is a Windows drive-absolute path, anchor the relative computation at the session directory's own drive root (D:/) instead of the server process drive. That makes the stored path identical no matter which drive the server runs on, and identical to what a same-drive TUI queries. It is a no-op for same-drive sessions and for real (git) worktrees.
I can put up a PR for this if the approach sounds right.
Problem
Sessions created through
opencode web(or any API client) on Windows are invisible in the desktop TUI/sessionspicker when the target directory is on a different drive than the server process's cwd — as long as the directory has no git repo (so the session lands in theglobalproject).Concrete case (v1.18.32, single shared
opencode.db):opencode webruns with cwd onC:.directory=D:\Work\ForAI\dsh-plugin-TTS, sends messages. The session is fully readable viaGET /sessionandGET /session?directory=....D:\Work\ForAI\dsh-plugin-TTSshows only an older session in its picker, never the new ones.Root cause
packages/opencode/src/session/session.ts:sessionPath(worktree, cwd)=relative(resolve(worktree), cwd). Forglobal-project sessions the worktree is/, and on Windowsresolve("/")is the server process's drive root. Same directory string therefore stores a differentpathdepending on who created it:C:→path = "D:/Work/ForAI/dsh-plugin-TTS"(absolute, cross-drive fallback)D:→path = "Work/ForAI/dsh-plugin-TTS"(relative)packages/tui/src/context/sync.tsx→sessionListQuery()) queriessession.list({ path })with its own drive-relative spelling, andlistByProjectmatchespathverbatim (eq/LIKE path/%). The two spellings never match, so each side only ever sees sessions minted on its own drive.Verified locally:
GET /session?path=Work/ForAI/dsh-plugin-TTS&roots=truereturns exactly the 1 old session; the same query with the absolute spelling returns exactly the 2 missing ones.Side note explaining a related asymmetry: a phone app that lists sessions globally (no
project_id/pathfilter) sees desktop-created sessions fine — the filtering only bites in the desktop picker direction. Also notegit initdoes NOT help here: it moves the TUI query to a new project id while existing sessions stayglobal, hiding even more.Suggested fix
In
sessionPath, when the worktree is the global root ("/") and the session directory is a Windows drive-absolute path, anchor the relative computation at the session directory's own drive root (D:/) instead of the server process drive. That makes the storedpathidentical no matter which drive the server runs on, and identical to what a same-drive TUI queries. It is a no-op for same-drive sessions and for real (git) worktrees.I can put up a PR for this if the approach sounds right.