Files
hapi/cli/src/agent/loopBase.ts
T
weishu c8325b921a refactor: extract session lifecycle management and mode switching to shared module
Consolidates duplicate cleanup, signal handling, and state management logic from
runClaude and runCodex into a reusable createRunnerLifecycle factory function.
Extracts mode switching handler and controlled user state updates into utilities.
Adds runLocalRemoteSession wrapper to handle session ready callbacks in loop base.
2026-01-04 20:50:33 +08:00

62 lines
1.7 KiB
TypeScript

import { logger } from '@/ui/logger';
import type { AgentSessionBase } from './sessionBase';
export type LoopLauncher<TSession> = (session: TSession) => Promise<'switch' | 'exit'>;
export async function runLocalRemoteSession<TSession extends AgentSessionBase<any>>(opts: {
session: TSession;
startingMode?: 'local' | 'remote';
logTag: string;
runLocal: LoopLauncher<TSession>;
runRemote: LoopLauncher<TSession>;
onSessionReady?: (session: TSession) => void;
}): Promise<void> {
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<TSession extends AgentSessionBase<any>>(opts: {
session: TSession;
startingMode?: 'local' | 'remote';
logTag: string;
runLocal: LoopLauncher<TSession>;
runRemote: LoopLauncher<TSession>;
}): Promise<void> {
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;
}
}
}