feat: remote browser login persistence + balance display + UI consistency
- Retain login state in remote browser profiles (don't delete on disconnect)
- Add GET /api/browser-sessions/{id}/clipboard for clipboard sync
- Add POST /api/browser-sessions/{id}/autofill-login for manual credential fill
- Add DELETE /api/browser-sessions/profiles/{custom_page_id} for login clear
- Add balance tracking with configurable divisor (balance_divisor)
- Health check on session reuse, idle TTL eviction, background cleanup
- Add first-frame watchdog (10s timeout) to prevent infinite loading
- Reconnect browser on active=true when session was closed
- UI: uniform text-only inline buttons (websites + upstreams pages)
- Fix page switch race with closingRemoteSessionPromise
This commit is contained in:
@@ -59,6 +59,11 @@ export interface UpstreamData {
|
||||
last_status: string
|
||||
last_checked_at: string | null
|
||||
last_error: string | null
|
||||
balance: number | null
|
||||
balance_updated_at: string | null
|
||||
balance_endpoint: string
|
||||
balance_response_path: string
|
||||
balance_divisor: number
|
||||
created_at: string
|
||||
updated_at: string
|
||||
}
|
||||
@@ -74,6 +79,9 @@ export interface UpstreamForm {
|
||||
enabled: boolean
|
||||
check_interval_seconds: number
|
||||
timeout_seconds: number
|
||||
balance_endpoint: string
|
||||
balance_response_path: string
|
||||
balance_divisor: number
|
||||
}
|
||||
|
||||
export const upstreamsApi = {
|
||||
@@ -315,7 +323,10 @@ export const browserSessionsApi = {
|
||||
event: (id: string, data: BrowserEventPayload) =>
|
||||
api.post<BrowserSessionData>(`/api/browser-sessions/${id}/events`, data),
|
||||
selection: (id: string) => api.get<{ text: string }>(`/api/browser-sessions/${id}/selection`),
|
||||
clipboard: (id: string) => api.get<{ text?: string; error?: string }>(`/api/browser-sessions/${id}/clipboard`),
|
||||
close: (id: string) => api.delete(`/api/browser-sessions/${id}`),
|
||||
autofillLogin: (id: string) => api.post<{ success: boolean; message: string }>(`/api/browser-sessions/${id}/autofill-login`),
|
||||
clearProfile: (customPageId: number) => api.delete(`/api/browser-sessions/profiles/${customPageId}`),
|
||||
screenshotUrl: (id: string, token?: string) => {
|
||||
const params = new URLSearchParams({ t: String(Date.now()) })
|
||||
if (token) params.set('token', token)
|
||||
|
||||
Reference in New Issue
Block a user