/** * SubagentManager component - displays available subagents */ import { Box, Text, useInput } from "ink"; import { useEffect, useState } from "react"; import { AGENTS_DIR, clearSubagentConfigCache, GLOBAL_AGENTS_DIR, getAllSubagentConfigs, getBuiltinSubagentNames, type SubagentConfig, } from "../../agent/subagents"; import { colors } from "./colors"; interface SubagentManagerProps { onClose: () => void; } interface SubagentItem { name: string; config: SubagentConfig; } export function SubagentManager({ onClose }: SubagentManagerProps) { const [builtinSubagents, setBuiltinSubagents] = useState([]); const [customSubagents, setCustomSubagents] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { async function loadSubagents() { setLoading(true); setError(null); try { clearSubagentConfigCache(); const configs = await getAllSubagentConfigs(); const builtinNames = getBuiltinSubagentNames(); const builtin: SubagentItem[] = []; const custom: SubagentItem[] = []; for (const [name, config] of Object.entries(configs)) { const item = { name, config }; if (builtinNames.has(name)) { builtin.push(item); } else { custom.push(item); } } builtin.sort((a, b) => a.name.localeCompare(b.name)); custom.sort((a, b) => a.name.localeCompare(b.name)); setBuiltinSubagents(builtin); setCustomSubagents(custom); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setLoading(false); } } loadSubagents(); }, []); useInput((input, key) => { // CTRL-C: immediately close if (key.ctrl && input === "c") { onClose(); return; } if (key.escape || key.return) { onClose(); } }); if (loading) { return ( Loading subagents... ); } const renderSubagentList = (items: SubagentItem[]) => items.map((item, index) => ( {item.name} ({item.config.recommendedModel}) {item.config.description} )); const hasNoSubagents = builtinSubagents.length === 0 && customSubagents.length === 0; return ( Available Subagents {error && Error: {error}} {hasNoSubagents ? ( No subagents found ) : ( <> {builtinSubagents.length > 0 && ( Built-in {renderSubagentList(builtinSubagents)} )} {customSubagents.length > 0 && ( Custom {renderSubagentList(customSubagents)} )} )} To add custom subagents, create .md files in {AGENTS_DIR}/ (project) or{" "} {GLOBAL_AGENTS_DIR}/ (global) Press ESC or Enter to close ); }