fix(sessions): recover home-scoped list after fresh connect

* fix(sessions): use active connection client directly, remove roots filter

Root cause A: loadSessions was calling clientForDirectory(serverHome) which
scoped the session list to /home/azureuser — a different project than the
server's active CWD. Sessions in the current project (e.g. opencode-mobile)
were never returned.

Root cause B: roots:true filtered out sessions that have a parentID (sub-task /
AUTO-REVIEW sessions), hiding valid sessions from the list.

Fix: use connState.client directly (the connection's active directory) and drop
the roots filter so all sessions for that project are visible.

Also adds a verify_session_list CUA smoke scenario that navigates back to the
sessions tab after creating a session and asserts the list is non-empty —
covering the regression path that was previously untested.

* fix(sessions): fetch serverHome in addConnection so loadSessions shows correct sessions

Root cause: addConnection() built the HTTP client but never fetched serverHome
(only loadConnections and setActiveConnection did). When the user adds a new
connection (fresh install / first sign-in), serverHome = null, so loadSessions
fell through to connState.client (the server's CWD). On this dev server the CWD
is the deploy directory — 11 old May-19 sessions that are not the user's recent
work sessions.

Fix: addConnection now fetches currentProject + serverHome via the same
Promise.all as setActiveConnection, before calling set(). This ensures
loadSessions immediately uses clientForDirectory(serverHome) → the global
project → the user's actual recent parent sessions.

Also adds --opencode-url flag to the CUA smoke script, which appends a
connect_and_verify_sessions scenario that reproduces the regression:
  python scripts/android-cua-smoke.py --opencode-url http://100.108.64.76:4096

* fix(sessions): recover home scope after fresh connect

Resolve stale deploy-only session list by recovering server home during first load and keeping regression coverage in default Android CUA smoke and CI.

* chore(release): bump version to 0.4.0
This commit is contained in:
Den
2026-05-26 19:50:17 -07:00
committed by GitHub
parent 64aa4a3bce
commit 32f7af4e11
14 changed files with 431 additions and 15 deletions

View File

@@ -142,15 +142,31 @@ export const useConnections = create<ConnectionsState>((set, get) => ({
let base = get().clientBase
let activeConnection = get().activeConnection
let project = get().currentProject
let serverHome = get().serverHome
if (newConnection.active) {
activeConnection = newConnection
const auth = newConnection.username && password ? { username: newConnection.username, password } : undefined
const built = buildClient(newConnection.url, newConnection.directory, auth)
client = built.client
base = built.base
// Fetch server metadata so loadSessions can use clientForDirectory(serverHome)
// immediately after the connection is added (same as setActiveConnection does).
try {
const [proj, paths] = await Promise.all([
client.project.current().catch(() => null),
client.path.get().catch(() => null),
])
project = proj
serverHome = paths?.home || null
} catch {
// Server might be unreachable; proceed without metadata
}
}
set({ connections, activeConnection, client, clientBase: base })
set({ connections, activeConnection, client, clientBase: base, currentProject: project, serverHome })
},
removeConnection: async (id) => {

View File

@@ -79,15 +79,32 @@ export const useSessions = create<SessionsState>((set, get) => ({
return
}
// When no project directory is explicitly selected, use the server home path so the
// session list shows all recent sessions across all projects — not just the server's CWD.
const listClient =
!connState.activeConnection?.directory && connState.serverHome
? connState.clientForDirectory(connState.serverHome)
: connState.client
try {
set({ isLoading: true, error: null })
const initialConnectionID = connState.activeConnection?.id || null
const hasExplicitDirectory = Boolean(connState.activeConnection?.directory)
let home = connState.serverHome
if (!hasExplicitDirectory && !home) {
const paths = await connState.client.path.get().catch(() => null)
home = paths?.home || null
if (home) {
useConnections.setState({ serverHome: home })
}
}
const latestConnState = useConnections.getState()
const latestConnectionID = latestConnState.activeConnection?.id || null
if (latestConnectionID !== initialConnectionID) {
set({ isLoading: false })
return
}
const listClient =
!latestConnState.activeConnection?.directory && home
? latestConnState.clientForDirectory(home)
: latestConnState.client
const sessions = await (listClient || connState.client).session.list({ roots: true, limit: 50 })
set({ sessions, isLoading: false })
} catch (error) {