fix(tui): show /browser connect progress like CLI

Return CLI-style browser connect status messages from the gateway and render them in the TUI so local Chrome launch attempts are visible instead of ending in a silent delayed failure.
This commit is contained in:
Brooklyn Nicholson 2026-04-28 22:22:32 -05:00 committed by Teknium
parent 69ff114ee2
commit 7d39a45749
5 changed files with 85 additions and 14 deletions

View file

@ -207,6 +207,33 @@ describe('createSlashHandler', () => {
expect(ctx.gateway.gw.request).not.toHaveBeenCalled()
})
it('renders browser connect progress messages from the gateway', async () => {
const rpc = vi.fn(() =>
Promise.resolve({
connected: false,
messages: [
"Chrome isn't running with remote debugging — attempting to launch...",
'Browser not connected — start Chrome with remote debugging and retry /browser connect'
],
url: 'http://127.0.0.1:9222'
})
)
const ctx = buildCtx({ gateway: { ...buildGateway(), rpc } })
expect(createSlashHandler(ctx)('/browser connect')).toBe(true)
expect(ctx.transcript.sys).toHaveBeenCalledWith('checking Chrome remote debugging at http://127.0.0.1:9222...')
await vi.waitFor(() => {
expect(ctx.transcript.sys).toHaveBeenCalledWith(
"Chrome isn't running with remote debugging — attempting to launch..."
)
expect(ctx.transcript.sys).toHaveBeenCalledWith(
'Browser not connected — start Chrome with remote debugging and retry /browser connect'
)
expect(ctx.transcript.sys).not.toHaveBeenCalledWith('browser connect failed')
})
})
it('routes /rollback through native RPC when a session is active', () => {
patchUiState({ sid: 'sid-abc' })
const rpc = vi.fn(() => Promise.resolve({}))

View file

@ -108,12 +108,15 @@ export const opsCommands: SlashCommand[] = [
if (action === 'connect') {
payload.url = requested || 'http://127.0.0.1:9222'
ctx.transcript.sys(`checking Chrome remote debugging at ${payload.url}...`)
}
ctx.gateway
.rpc<BrowserManageResponse>('browser.manage', payload)
.then(
ctx.guarded<BrowserManageResponse>(r => {
r.messages?.forEach(message => ctx.transcript.sys(message))
if (action === 'status') {
return ctx.transcript.sys(
r.connected
@ -124,13 +127,14 @@ export const opsCommands: SlashCommand[] = [
if (action === 'connect') {
if (r.connected) {
ctx.transcript.sys(`browser connected: ${r.url || '(url unavailable)'}`)
ctx.transcript.sys(`Browser connected to live Chrome via CDP`)
ctx.transcript.sys(`Endpoint: ${r.url || '(url unavailable)'}`)
ctx.transcript.sys('next browser tool call will use this CDP endpoint')
return
}
return ctx.transcript.sys('browser connect failed')
return
}
ctx.transcript.sys('browser disconnected')

View file

@ -314,6 +314,7 @@ export interface ProcessStopResponse {
export interface BrowserManageResponse {
connected?: boolean
messages?: string[]
url?: string
}