browser relay: multi-session override, stale session recovery, better error feedback

- relay accepts new extension connections by closing old one (last wins, code 4000)
- extension recognizes code 4000 and stops auto-reconnect (shows "replaced" badge)
- fix ping interval race where old WS close handler killed new connection's pings
- retry CDP commands on "Session with given id not found" by re-attaching debugger
- describeError() maps known errors to user-friendly badge tooltips
- persisted relay tokens restored on server start
- user-scoped token salts, token regeneration/deletion endpoints
- extension download endpoint, integrations UI for browser relay setup
- browser relay env vars passed to pi-bridge sandboxes
- browser screen layout with chat panel and prompt prefix

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 15:22:15 +00:00
co-authored by Claude Opus 4.6
parent 8f1963fedb
commit 4d30672adb
16 changed files with 696 additions and 89 deletions
+1
View File
@@ -29,6 +29,7 @@ export {
deleteServerIntegration,
getUserIntegrations,
getUserIntegration,
getIntegrationsByProvider,
upsertUserIntegration,
deleteUserIntegration,
findUserByIntegrationConfig,
@@ -38,6 +38,10 @@ export async function getUserIntegrations(userId: number): Promise<UserIntegrati
return db.select().from(userIntegrations).where(eq(userIntegrations.userId, userId));
}
export async function getIntegrationsByProvider(provider: string): Promise<UserIntegrationSelect[]> {
return db.select().from(userIntegrations).where(eq(userIntegrations.provider, provider));
}
export async function getUserIntegration(userId: number, provider: string): Promise<UserIntegrationSelect | undefined> {
const [row] = await db
.select()