/** * Team Discovery - Utilities for discovering teams and teammate status * * Scans ~/.claude/teams/ to find teams where the current session is the leader. * Used by the Teams UI in the footer to show team status. */ import { isPaneBackend, type PaneBackendType } from './swarm/backends/types.js' import { readTeamFile } from './swarm/teamHelpers.js' export type TeamSummary = { name: string memberCount: number runningCount: number idleCount: number } export type TeammateStatus = { name: string agentId: string agentType?: string model?: string prompt?: string status: 'running' | 'idle' | 'unknown' color?: string idleSince?: string // ISO timestamp from idle notification tmuxPaneId: string cwd: string worktreePath?: string isHidden?: boolean // Whether the pane is currently hidden from the swarm view backendType?: PaneBackendType // The backend type used for this teammate mode?: string // Current permission mode for this teammate } /** * Get detailed teammate statuses for a team * Reads isActive from config to determine status */ export function getTeammateStatuses(teamName: string): TeammateStatus[] { const teamFile = readTeamFile(teamName) if (!teamFile) { return [] } const hiddenPaneIds = new Set(teamFile.hiddenPaneIds ?? []) const statuses: TeammateStatus[] = [] for (const member of teamFile.members) { // Exclude team-lead from the list if (member.name === 'team-lead') { continue } // Read isActive from config, defaulting to true (active) if undefined const isActive = member.isActive !== false const status: 'running' | 'idle' = isActive ? 'running' : 'idle' statuses.push({ name: member.name, agentId: member.agentId, agentType: member.agentType, model: member.model, prompt: member.prompt, status, color: member.color, tmuxPaneId: member.tmuxPaneId, cwd: member.cwd, worktreePath: member.worktreePath, isHidden: hiddenPaneIds.has(member.tmuxPaneId), backendType: member.backendType && isPaneBackend(member.backendType) ? member.backendType : undefined, mode: member.mode, }) } return statuses } // Note: For time formatting, use formatRelativeTimeAgo from '../utils/format.js'