YeonGyu-Kim f8b5771443 refactor(tmux-subagent): split manager and decision-engine into focused modules
Extract session lifecycle, polling, grid planning, and event handling:
- polling.ts: session polling controller with stability detection
- event-handlers.ts: session created/deleted handlers
- grid-planning.ts, spawn-action-decider.ts, spawn-target-finder.ts
- session-status-parser.ts, session-message-count.ts
- cleanup.ts, polling-constants.ts, tmux-grid-constants.ts
2026-02-08 16:21:04 +09:00

43 lines
1.3 KiB
TypeScript

import type { TmuxConfig } from "../../config/schema"
import { log } from "../../shared"
import type { TrackedSession } from "./types"
import { queryWindowState } from "./pane-state-querier"
import { executeAction } from "./action-executor"
export async function cleanupTmuxSessions(params: {
tmuxConfig: TmuxConfig
serverUrl: string
sourcePaneId: string | undefined
sessions: Map<string, TrackedSession>
stopPolling: () => void
}): Promise<void> {
params.stopPolling()
if (params.sessions.size === 0) {
log("[tmux-session-manager] cleanup complete")
return
}
log("[tmux-session-manager] closing all panes", { count: params.sessions.size })
const state = params.sourcePaneId ? await queryWindowState(params.sourcePaneId) : null
if (state) {
const closePromises = Array.from(params.sessions.values()).map((tracked) =>
executeAction(
{ type: "close", paneId: tracked.paneId, sessionId: tracked.sessionId },
{ config: params.tmuxConfig, serverUrl: params.serverUrl, windowState: state },
).catch((error) =>
log("[tmux-session-manager] cleanup error for pane", {
paneId: tracked.paneId,
error: String(error),
}),
),
)
await Promise.all(closePromises)
}
params.sessions.clear()
log("[tmux-session-manager] cleanup complete")
}