π File detail
utils/teamDiscovery.ts
π― Use case
This file lives under βutils/β, which covers cross-cutting helpers (shell, tempfiles, settings, messages, process input, β¦). On the API surface it exposes TeamSummary, TeammateStatus, and getTeammateStatuses β mainly types, interfaces, or factory objects. It composes internal code from swarm and utils (relative imports). What the file header says: 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.
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
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.
π€ Exports (heuristic)
TeamSummaryTeammateStatusgetTeammateStatuses
π₯οΈ Source preview
/**
* 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'