import { logger } from '@/ui/logger'; import type { AgentSessionBase } from './sessionBase'; export type LoopLauncher = (session: TSession) => Promise<'switch' | 'exit'>; export async function runLocalRemoteSession>(opts: { session: TSession; startingMode?: 'local' | 'remote'; logTag: string; runLocal: LoopLauncher; runRemote: LoopLauncher; onSessionReady?: (session: TSession) => void; }): Promise { if (opts.onSessionReady) { opts.onSessionReady(opts.session); } await runLocalRemoteLoop({ session: opts.session, startingMode: opts.startingMode, logTag: opts.logTag, runLocal: opts.runLocal, runRemote: opts.runRemote }); } export async function runLocalRemoteLoop>(opts: { session: TSession; startingMode?: 'local' | 'remote'; logTag: string; runLocal: LoopLauncher; runRemote: LoopLauncher; }): Promise { let mode: 'local' | 'remote' = opts.startingMode ?? 'local'; while (true) { logger.debug(`[${opts.logTag}] Iteration with mode: ${mode}`); if (mode === 'local') { const reason = await opts.runLocal(opts.session); if (reason === 'exit') { return; } mode = 'remote'; opts.session.onModeChange(mode); continue; } if (mode === 'remote') { const reason = await opts.runRemote(opts.session); if (reason === 'exit') { return; } mode = 'local'; opts.session.onModeChange(mode); continue; } } }