import type { AgentAnimStatus, Session } from '../types/kanban' export const TERMINAL_SESSION_STATUSES = new Set(['done', 'failed', 'cancelled']) const COMPANY_EXEC_MODES = new Set(['company', 'org', 'custom']) const BOARD_STATUS_IDLE = new Set(['idle', 'done', 'failed', 'cancelled']) export function getSessionRuntimeStatus( session: Pick, ): AgentAnimStatus { if (TERMINAL_SESSION_STATUSES.has(session.status)) return 'idle' if (session.agentStatus === 'reflecting' || session.agentStatus === 'tool_active') { return session.agentStatus } if ( session.runtimeControlState && session.runtimeControlState !== 'running' && session.runtimeControlState !== 'suspending' && session.runtimeControlState !== 'resuming' ) { return 'idle' } if (session.status === 'running') return 'reflecting' return 'idle' } export function isSessionWorking( session: Pick, ): boolean { return getSessionRuntimeStatus(session) !== 'idle' } export function isCompanyRuntimeSession(session?: Partial | null): boolean { if (!session) return false const mode = String(session.execMode ?? '').trim().toLowerCase() const hasExplicitTaskMode = mode === 'task' return COMPANY_EXEC_MODES.has(mode) || !!session.isCompanyRuntime || !!session.parentSessionId || !!session.orgId || !!session.workItemProjectionId || !!session.roleWorkItems || !!session.executorRoleWorkItems || (!!session.companyProfile && !hasExplicitTaskMode) } export function companyRuntimeControlPatchForBoardStatus( session: Partial | undefined | null, status: string, ): Partial> { if (!isCompanyRuntimeSession(session)) return {} const normalizedStatus = String(status ?? '').trim().toLowerCase() if (normalizedStatus === 'running') { return { runtimeControlState: 'running', canStop: true, canResume: false, } } if (BOARD_STATUS_IDLE.has(normalizedStatus)) { const existingState = session?.runtimeControlState if (existingState === 'suspending' || existingState === 'suspended') { return {} } return { runtimeControlState: 'idle', canStop: false, canResume: false, } } return {} }