@maestroai/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -0
- package/dist/bin/maestro.d.ts +1 -0
- package/dist/bin/maestro.js +9 -0
- package/dist/bin/maestro.js.map +1 -0
- package/dist/chunk-5ZDNPLKN.js +1172 -0
- package/dist/chunk-5ZDNPLKN.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/tui/App.d.ts +5 -0
- package/dist/src/tui/App.js +2393 -0
- package/dist/src/tui/App.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tui/App.tsx","../../../src/tui/components/Header.tsx","../../../src/tui/components/Dashboard.tsx","../../../src/tui/components/AgentPanel.tsx","../../../src/tui/hooks/useAgentPool.ts","../../../src/tui/components/LogViewer.tsx","../../../src/tui/components/OrchestratorPanel.tsx","../../../src/tui/components/AgentDetailView.tsx","../../../src/tui/components/TaskList.tsx","../../../src/tui/components/TaskDetailView.tsx","../../../src/tui/components/InstructionsPanel.tsx","../../../src/tui/components/StatusBar.tsx","../../../src/tui/hooks/useTaskManager.ts","../../../src/tui/hooks/useKeyboard.ts","../../../src/tui/hooks/useFeedback.ts","../../../src/tui/hooks/useOrchestratorActivity.ts","../../../src/tui/components/PlanReview.tsx","../../../src/tui/components/QuestionPrompt.tsx","../../../src/tui/components/ProgressSummary.tsx"],"sourcesContent":["import React from 'react';\nimport path from 'node:path';\nimport { render, Box, Text, useInput, useApp, useStdout } from 'ink';\nimport type { Orchestrator, ProjectConfig, Task, ProjectCompletionSummary } from '@maestroai/core';\nimport { Header } from './components/Header.js';\nimport { Dashboard } from './components/Dashboard.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport { useAgentPool } from './hooks/useAgentPool.js';\nimport { useTaskManager } from './hooks/useTaskManager.js';\nimport { useKeyboard, type ViewMode } from './hooks/useKeyboard.js';\nimport { useFeedback } from './hooks/useFeedback.js';\nimport { useOrchestratorActivity } from './hooks/useOrchestratorActivity.js';\nimport { PlanReview } from './components/PlanReview.js';\nimport { QuestionPrompt } from './components/QuestionPrompt.js';\nimport { ProgressSummary } from './components/ProgressSummary.js';\n\ninterface AppProps {\n orchestrator: Orchestrator;\n projectConfig: ProjectConfig;\n}\n\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n if (hours > 0) return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n}\n\nfunction useTerminalHeight(): number {\n const { stdout } = useStdout();\n const [height, setHeight] = React.useState(stdout?.rows ?? 24);\n\n React.useEffect(() => {\n if (!stdout) return;\n const onResize = () => setHeight(stdout.rows);\n stdout.on('resize', onResize);\n return () => { stdout.off('resize', onResize); };\n }, [stdout]);\n\n return height;\n}\n\nfunction App({ orchestrator, projectConfig }: AppProps): React.ReactElement {\n const { exit } = useApp();\n const termHeight = useTerminalHeight();\n const agents = useAgentPool(orchestrator);\n const tasks = useTaskManager(orchestrator);\n const orchestratorActivities = useOrchestratorActivity(orchestrator);\n\n // Total selectable items = 1 (orchestrator) + agents.length\n const selectableCount = 1 + agents.length;\n const { selectedAgentIndex, selectedTaskIndex, viewMode, setSelectedAgentIndex, setSelectedTaskIndex, setViewMode } =\n useKeyboard(selectableCount, tasks.length);\n const feedback = useFeedback(orchestrator);\n\n const [totalCost, setTotalCost] = React.useState(0);\n const [startTime] = React.useState(Date.now());\n const [uptime, setUptime] = React.useState(0);\n const [phase, setPhase] = React.useState<string>('planning');\n const [archReady, setArchReady] = React.useState<Task[] | null>(null);\n const [completionSummary, setCompletionSummary] = React.useState<ProjectCompletionSummary | null>(null);\n const [isPaused, setIsPaused] = React.useState(false);\n const [isDecomposing, setIsDecomposing] = React.useState(false);\n const [quitConfirm, setQuitConfirm] = React.useState(false);\n\n // Update uptime every 5 seconds (reduce flicker from frequent re-renders)\n React.useEffect(() => {\n const timer = setInterval(() => {\n setUptime(Date.now() - startTime);\n }, 5000);\n return () => clearInterval(timer);\n }, [startTime]);\n\n // Track total cost from orchestrator cycles\n React.useEffect(() => {\n const handler = (stats: { totalCostUsd: number }) => {\n setTotalCost(stats.totalCostUsd);\n };\n orchestrator.on('orchestrator:cycle', handler);\n return () => {\n orchestrator.off('orchestrator:cycle', handler);\n };\n }, [orchestrator]);\n\n // Track phase changes\n React.useEffect(() => {\n const handlePhase = (p: string) => setPhase(p);\n const handleArchReady = (archTasks: Task[]) => setArchReady(archTasks);\n const handleCompleted = (summary: ProjectCompletionSummary) => setCompletionSummary(summary);\n\n orchestrator.on('phase:changed', handlePhase);\n orchestrator.on('architecture:ready', handleArchReady);\n orchestrator.on('project:completed', handleCompleted);\n return () => {\n orchestrator.off('phase:changed', handlePhase);\n orchestrator.off('architecture:ready', handleArchReady);\n orchestrator.off('project:completed', handleCompleted);\n };\n }, [orchestrator]);\n\n // Track pause/resume events\n React.useEffect(() => {\n const handlePaused = () => setIsPaused(true);\n const handleResumed = () => setIsPaused(false);\n orchestrator.on('orchestrator:paused', handlePaused);\n orchestrator.on('orchestrator:resumed', handleResumed);\n return () => {\n orchestrator.off('orchestrator:paused', handlePaused);\n orchestrator.off('orchestrator:resumed', handleResumed);\n };\n }, [orchestrator]);\n\n const handlePause = React.useCallback(() => {\n orchestrator.pause();\n }, [orchestrator]);\n\n const handleResume = React.useCallback(() => {\n orchestrator.resume();\n }, [orchestrator]);\n\n const handleSubmitInstructions = React.useCallback((instructions: string) => {\n setIsDecomposing(true);\n orchestrator.addInstructions(instructions)\n .catch(() => {\n // Error is logged by orchestrator internally\n })\n .finally(() => {\n setIsDecomposing(false);\n });\n }, [orchestrator]);\n\n // Handle quit, architecture approval, and pause toggle\n useInput((input, key) => {\n // Quit confirmation: waiting for y/n\n if (quitConfirm) {\n if (input === 'y' || input === 'Y') {\n // Force exit after 15s if graceful stop hangs\n const forceExit = setTimeout(() => exit(), 15000);\n orchestrator.stop().then(() => { clearTimeout(forceExit); exit(); }).catch(() => exit());\n } else {\n setQuitConfirm(false);\n }\n return;\n }\n\n // Don't process global shortcuts while in instructions mode\n if (viewMode === 'instructions') {\n return;\n }\n if (input === 'q') {\n setQuitConfirm(true);\n return;\n }\n if (input === 'p' && viewMode !== 'agent-detail' && viewMode !== 'task-detail') {\n if (isPaused) {\n handleResume();\n } else {\n handlePause();\n }\n }\n if (input === 'a' && archReady && viewMode !== 'agent-detail' && viewMode !== 'task-detail') {\n orchestrator.approveArchitecture();\n setArchReady(null);\n }\n });\n\n const completedTasks = tasks.filter((t) => t.status === 'done').length;\n const logsDir = path.resolve(projectConfig.settings.workingDirectory, projectConfig.settings.logsDirectory);\n\n // Fixed height: header(3) + statusbar(3) = 6 chrome lines, rest for dashboard\n // Account for overlay panels (plan review, arch ready, etc.)\n let overlayLines = 0;\n if (completionSummary) {\n const activeAgentCount = completionSummary.agentSummaries.filter(a => a.tasksCompleted > 0).length;\n // border(2) + header(2) + tasks(2-3) + usage(3-5) + agents(2+count) + next steps(6) + spacing(4)\n overlayLines += 18 + activeAgentCount;\n }\n if (archReady && !completionSummary) overlayLines += 4 + archReady.length;\n if (feedback.pendingPlan) overlayLines += 12;\n if (feedback.questions.length > 0 && !feedback.pendingPlan) overlayLines += 6;\n if (feedback.milestone && !feedback.pendingPlan && feedback.questions.length === 0) overlayLines += 6;\n\n const chromeHeight = 6 + overlayLines;\n const dashboardHeight = Math.max(8, termHeight - chromeHeight);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height={termHeight}>\n {completionSummary && (() => {\n const totalTokens = completionSummary.totalInputTokens + completionSummary.totalOutputTokens + completionSummary.totalCacheReadTokens + completionSummary.totalCacheCreationTokens;\n const activeAgents = completionSummary.agentSummaries.filter(a => a.tasksCompleted > 0);\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} borderStyle=\"bold\" borderColor=\"green\">\n <Text bold color=\"green\">{'\\u2605'} PROJECT COMPLETED {'\\u2605'}</Text>\n <Text> </Text>\n <Text bold>Tasks</Text>\n <Text> Completed: <Text color=\"green\">{completionSummary.doneTasks}</Text> / {completionSummary.totalTasks}</Text>\n {completionSummary.cancelledTasks > 0 && (\n <Text> Cancelled: <Text color=\"yellow\">{completionSummary.cancelledTasks}</Text></Text>\n )}\n <Text> </Text>\n <Text bold>Usage</Text>\n <Text> Cost: <Text color=\"cyan\">${completionSummary.totalCostUsd.toFixed(4)}</Text></Text>\n {totalTokens > 0 && (\n <>\n <Text> Tokens: {totalTokens.toLocaleString()} total</Text>\n <Text dimColor> in: {completionSummary.totalInputTokens.toLocaleString()} | out: {completionSummary.totalOutputTokens.toLocaleString()} | cache-r: {completionSummary.totalCacheReadTokens.toLocaleString()} | cache-w: {completionSummary.totalCacheCreationTokens.toLocaleString()}</Text>\n </>\n )}\n <Text> Duration: {formatDuration(completionSummary.uptimeMs)}</Text>\n {activeAgents.length > 0 && (\n <>\n <Text> </Text>\n <Text bold>Agent Breakdown</Text>\n {activeAgents.map((a) => {\n const agentTokens = a.inputTokens + a.outputTokens;\n const tokenInfo = agentTokens > 0 ? `, ${agentTokens.toLocaleString()} tokens` : '';\n return (\n <Text key={a.agentId} dimColor> {a.name} ({a.role}): {a.tasksCompleted} tasks, ${a.costUsd.toFixed(4)}{tokenInfo}</Text>\n );\n })}\n </>\n )}\n <Text> </Text>\n <Text bold>Next Steps</Text>\n <Text dimColor> {'\\u2192'} Review the completed work in your project directory</Text>\n <Text dimColor> {'\\u2192'} Run your test suite to verify the changes</Text>\n <Text dimColor> {'\\u2192'} Check git diff to review all modifications</Text>\n <Text dimColor> {'\\u2192'} Commit and push when ready</Text>\n </Box>\n );\n })()}\n {archReady && !completionSummary && (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} borderStyle=\"round\" borderColor=\"cyan\">\n <Text bold color=\"cyan\">Architecture Phase Complete</Text>\n <Text dimColor>Review ARCHITECTURE.md and architecture-related files.</Text>\n {archReady.map((t) => (\n <Text key={t.id} dimColor> - {t.title}</Text>\n ))}\n <Text color=\"yellow\">Press 'a' to approve and advance to development</Text>\n </Box>\n )}\n {feedback.pendingPlan && (\n <PlanReview\n proposal={feedback.pendingPlan}\n onDecide={feedback.decidePlan}\n />\n )}\n {feedback.questions.length > 0 && !feedback.pendingPlan && (\n <QuestionPrompt\n question={feedback.questions[0]}\n onAnswer={feedback.answerQuestion}\n onSkip={(qId) => feedback.answerQuestion(qId, '')}\n />\n )}\n {feedback.milestone && !feedback.pendingPlan && feedback.questions.length === 0 && (\n <ProgressSummary\n report={feedback.latestReport}\n milestone={feedback.milestone}\n onAcknowledge={feedback.acknowledgeMilestone}\n />\n )}\n <Header\n projectName={projectConfig.name}\n completedTasks={completedTasks}\n totalTasks={tasks.length}\n totalCost={totalCost}\n uptimeMs={uptime}\n />\n <Box height={dashboardHeight}>\n <Dashboard\n agents={agents}\n tasks={tasks}\n selectedAgentIndex={selectedAgentIndex}\n selectedTaskIndex={selectedTaskIndex}\n viewMode={viewMode}\n onSelectAgent={setSelectedAgentIndex}\n orchestratorActivities={orchestratorActivities}\n orchestrator={orchestrator}\n phase={phase}\n logsDir={logsDir}\n isPaused={isPaused}\n isDecomposing={isDecomposing}\n onSubmitInstructions={handleSubmitInstructions}\n onPause={handlePause}\n onResume={handleResume}\n />\n </Box>\n {quitConfirm && (\n <Box paddingX={1} justifyContent=\"center\">\n <Text bold color=\"yellow\">Quit Maestro? </Text>\n <Text bold color=\"white\">y</Text>\n <Text dimColor>/</Text>\n <Text bold color=\"white\">n</Text>\n </Box>\n )}\n <StatusBar viewMode={viewMode} onChangeView={setViewMode} isPaused={isPaused} />\n </Box>\n );\n}\n\nexport function renderApp(\n orchestrator: Orchestrator,\n projectConfig: ProjectConfig\n): void {\n render(\n <App orchestrator={orchestrator} projectConfig={projectConfig} />\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface HeaderProps {\n projectName: string;\n completedTasks: number;\n totalTasks: number;\n totalCost: number;\n uptimeMs: number;\n}\n\nfunction formatUptime(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n const parts: string[] = [];\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0 || hours > 0) parts.push(`${minutes}m`);\n parts.push(`${seconds}s`);\n\n return parts.join(' ');\n}\n\nexport function Header({\n projectName,\n completedTasks,\n totalTasks,\n totalCost,\n uptimeMs,\n}: HeaderProps): React.ReactElement {\n const progress =\n totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;\n\n return (\n <Box\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n paddingX={1}\n borderStyle=\"single\"\n borderColor=\"cyan\"\n >\n <Box gap={2}>\n <Text bold color=\"cyan\">\n MAESTRO\n </Text>\n <Text dimColor>|</Text>\n <Text>{projectName}</Text>\n </Box>\n <Box gap={2}>\n <Text>\n Tasks: <Text color=\"green\">{completedTasks}</Text>\n <Text dimColor>/{totalTasks}</Text>{' '}\n <Text color={progress === 100 ? 'green' : 'yellow'}>\n ({progress}%)\n </Text>\n </Text>\n <Text dimColor>|</Text>\n <Text>\n Cost: <Text color=\"yellow\">${totalCost.toFixed(4)}</Text>\n </Text>\n <Text dimColor>|</Text>\n <Text>\n Uptime: <Text dimColor>{formatUptime(uptimeMs)}</Text>\n </Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box } from 'ink';\nimport type { AgentState, Task, OrchestratorActivity, Orchestrator } from '@maestroai/core';\nimport { AgentPanel } from './AgentPanel.js';\nimport { OrchestratorPanel } from './OrchestratorPanel.js';\nimport { AgentDetailView } from './AgentDetailView.js';\nimport { TaskList } from './TaskList.js';\nimport { TaskDetailView } from './TaskDetailView.js';\nimport { LogViewer } from './LogViewer.js';\nimport { InstructionsPanel } from './InstructionsPanel.js';\nimport type { ViewMode } from '../hooks/useKeyboard.js';\n\ninterface DashboardProps {\n agents: AgentState[];\n tasks: Task[];\n selectedAgentIndex: number;\n selectedTaskIndex: number;\n viewMode: ViewMode;\n onSelectAgent: (index: number) => void;\n orchestratorActivities: OrchestratorActivity[];\n orchestrator: Orchestrator;\n phase: string;\n logsDir: string;\n isPaused: boolean;\n isDecomposing: boolean;\n onSubmitInstructions: (instructions: string) => void;\n onPause: () => void;\n onResume: () => void;\n}\n\nexport function Dashboard({\n agents,\n tasks,\n selectedAgentIndex,\n selectedTaskIndex,\n viewMode,\n onSelectAgent,\n orchestratorActivities,\n orchestrator,\n phase,\n logsDir,\n isPaused,\n isDecomposing,\n onSubmitInstructions,\n onPause,\n onResume,\n}: DashboardProps): React.ReactElement {\n // Index 0 is always the orchestrator.\n // Agent indices are offset by 1 (index 1 = agents[0], etc.)\n const isOrchestratorSelected = selectedAgentIndex === 0;\n const actualAgentIndex = selectedAgentIndex - 1;\n const selectedAgent = actualAgentIndex >= 0 ? (agents[actualAgentIndex] ?? null) : null;\n\n const activeAgentCount = agents.filter(\n (a) => a.status === 'running' || a.status === 'starting',\n ).length;\n const completedTasks = tasks.filter((t) => t.status === 'done').length;\n\n // Sort tasks same way as TaskList for consistent indexing\n const sortedTasks = [...tasks].sort((a, b) => {\n const statusOrder: Record<string, number> = {\n 'in-progress': 0, pending: 1, blocked: 2, done: 3, cancelled: 4,\n };\n const sa = statusOrder[a.status] ?? 5;\n const sb = statusOrder[b.status] ?? 5;\n if (sa !== sb) return sa - sb;\n const priorityOrder: Record<string, number> = {\n critical: 0, high: 1, medium: 2, low: 3,\n };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n\n if (viewMode === 'instructions') {\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <InstructionsPanel\n isPaused={isPaused}\n isDecomposing={isDecomposing}\n onSubmit={onSubmitInstructions}\n onPause={onPause}\n onResume={onResume}\n />\n </Box>\n );\n }\n\n if (viewMode === 'tasks') {\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <TaskList tasks={tasks} selectedIndex={selectedTaskIndex} />\n </Box>\n );\n }\n\n if (viewMode === 'task-detail') {\n const selectedTask = sortedTasks[selectedTaskIndex] ?? null;\n if (!selectedTask) {\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <TaskList tasks={tasks} selectedIndex={selectedTaskIndex} />\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <TaskDetailView task={selectedTask} orchestrator={orchestrator} />\n </Box>\n );\n }\n\n if (viewMode === 'logs') {\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <LogViewer agent={selectedAgent} />\n </Box>\n );\n }\n\n // Agent detail view — full-screen view of a single agent or orchestrator\n if (viewMode === 'agent-detail') {\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <AgentDetailView\n agent={selectedAgent}\n orchestratorActivities={orchestratorActivities}\n isOrchestrator={isOrchestratorSelected}\n phase={phase}\n logsDir={logsDir}\n />\n </Box>\n );\n }\n\n // Default: agents view — orchestrator panel on top, then agent panels\n const sortedAgents = [...agents].sort((a, b) => {\n const rank = (s: string) => {\n if (s === 'running' || s === 'starting') return 0;\n if (s === 'idle') return 1;\n if (s === 'error') return 2;\n return 3; // stopped, stopping\n };\n return rank(a.status) - rank(b.status);\n });\n\n // Map sorted back to original indices for selection tracking.\n // Remember: orchestrator is index 0, so agents start at index 1.\n const sortedWithOrigIndex = sortedAgents.map((agent) => ({\n agent,\n originalIndex: agents.indexOf(agent) + 1, // +1 because orchestrator is index 0\n }));\n\n return (\n <Box flexDirection=\"row\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {/* Orchestrator always on top */}\n <OrchestratorPanel\n activities={orchestratorActivities}\n isSelected={isOrchestratorSelected}\n phase={phase}\n activeAgents={activeAgentCount}\n totalTasks={tasks.length}\n completedTasks={completedTasks}\n />\n\n {/* Agent panels */}\n {sortedWithOrigIndex.length === 0 ? (\n <Box paddingY={1} paddingX={1}>\n <AgentPanel agent={null} isSelected={false} />\n </Box>\n ) : (\n sortedWithOrigIndex.map(({ agent, originalIndex }) => (\n <AgentPanel\n key={agent.config.id}\n agent={agent}\n isSelected={originalIndex === selectedAgentIndex}\n />\n ))\n )}\n </Box>\n {/* Side log panel — show orchestrator activities or agent logs */}\n <Box\n flexDirection=\"column\"\n width=\"40%\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n overflow=\"hidden\"\n >\n {isOrchestratorSelected ? (\n <LogViewer agent={null} orchestratorActivities={orchestratorActivities} />\n ) : selectedAgent ? (\n <LogViewer agent={selectedAgent} />\n ) : (\n <LogViewer agent={null} />\n )}\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport figures from 'figures';\nimport type { AgentState, AgentStatus } from '@maestroai/core';\nimport { getAgentTokenUsage } from '../hooks/useAgentPool.js';\n\ninterface AgentPanelProps {\n agent: AgentState | null;\n isSelected: boolean;\n}\n\nconst ROLE_ICONS: Record<string, string> = {\n orchestrator: figures.star,\n 'project-manager': figures.bullet,\n architect: figures.hamburger,\n developer: figures.pointer,\n designer: figures.heart,\n 'qa-engineer': figures.tick,\n devops: figures.arrowRight,\n 'technical-writer': figures.info,\n 'code-reviewer': figures.warning,\n};\n\nfunction getStatusColor(status: AgentStatus): string {\n switch (status) {\n case 'running':\n return 'green';\n case 'idle':\n case 'starting':\n return 'yellow';\n case 'error':\n return 'red';\n case 'stopped':\n case 'stopping':\n return 'gray';\n default:\n return 'white';\n }\n}\n\nfunction getStatusIcon(status: AgentStatus): string {\n switch (status) {\n case 'running':\n case 'starting':\n return figures.play;\n case 'idle':\n return figures.bullet;\n case 'error':\n return figures.cross;\n case 'stopped':\n case 'stopping':\n return figures.circleFilled;\n default:\n return figures.bullet;\n }\n}\n\nfunction formatTokenCount(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\nexport function AgentPanel({\n agent,\n isSelected,\n}: AgentPanelProps): React.ReactElement {\n if (!agent) {\n return (\n <Box paddingY={1}>\n <Text dimColor>No agents running. Waiting for orchestrator...</Text>\n </Box>\n );\n }\n\n const roleIcon = ROLE_ICONS[agent.config.role] ?? figures.bullet;\n const borderColor = isSelected ? 'cyan' : 'gray';\n const tokens = getAgentTokenUsage(agent.config.id);\n const hasTokens = tokens.inputTokens > 0 || tokens.outputTokens > 0;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle={isSelected ? 'bold' : 'single'}\n borderColor={borderColor}\n paddingX={1}\n marginBottom={0}\n >\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Box gap={1}>\n <Text>{roleIcon}</Text>\n <Text bold>{agent.config.name}</Text>\n <Text dimColor>({agent.config.role})</Text>\n </Box>\n <Box gap={1}>\n <Text color={getStatusColor(agent.status)}>{getStatusIcon(agent.status)}</Text>\n <Text color={getStatusColor(agent.status)}>{agent.status}</Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginTop={0}>\n <Box flexShrink={1}>\n {agent.currentTask ? (\n <Text>\n <Text dimColor>Task: </Text>\n <Text wrap=\"truncate-end\">{agent.currentTask}</Text>\n </Text>\n ) : (\n <Text dimColor>No active task</Text>\n )}\n </Box>\n <Box gap={2} flexShrink={0}>\n <Text>\n <Text dimColor>Cost: </Text>\n <Text color=\"yellow\">${agent.totalCostUsd.toFixed(4)}</Text>\n </Text>\n {hasTokens && (\n <Text>\n <Text dimColor>Tokens: </Text>\n <Text color=\"cyan\">{formatTokenCount(tokens.inputTokens)}</Text>\n <Text dimColor>/</Text>\n <Text color=\"green\">{formatTokenCount(tokens.outputTokens)}</Text>\n {tokens.cacheReadTokens > 0 && (\n <>\n <Text dimColor> cache:</Text>\n <Text dimColor>{formatTokenCount(tokens.cacheReadTokens)}</Text>\n </>\n )}\n </Text>\n )}\n </Box>\n </Box>\n\n {agent.error && (\n <Box marginTop={0}>\n <Text color=\"red\">\n {figures.cross} {agent.error}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport type { Orchestrator, AgentState, AgentStatus } from '@maestroai/core';\nimport { addLogLine } from '../components/LogViewer.js';\n\n/**\n * Per-agent accumulated token usage, tracked from result events.\n */\nexport interface AgentTokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n}\n\nconst agentTokens = new Map<string, AgentTokenUsage>();\n\nexport function getAgentTokenUsage(agentId: string): AgentTokenUsage {\n return agentTokens.get(agentId) ?? { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0 };\n}\n\nfunction accumulateTokens(agentId: string, data: Record<string, unknown>): void {\n const usage = data?.usage as any;\n if (!usage || typeof usage !== 'object') return;\n const current = agentTokens.get(agentId) ?? { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0 };\n if (typeof usage.input_tokens === 'number') current.inputTokens += usage.input_tokens;\n if (typeof usage.output_tokens === 'number') current.outputTokens += usage.output_tokens;\n if (typeof usage.cache_read_input_tokens === 'number') current.cacheReadTokens += usage.cache_read_input_tokens;\n agentTokens.set(agentId, current);\n}\n\n/**\n * Extract human-readable strings from tool_result content blocks\n * inside a \"user\" stream-json event.\n */\nfunction extractToolResults(data: Record<string, unknown>): string[] {\n const results: string[] = [];\n const message = data?.message as any;\n if (!message || typeof message !== 'object' || !Array.isArray(message.content)) {\n return results;\n }\n for (const block of message.content) {\n if (block.type !== 'tool_result') continue;\n if (typeof block.content === 'string' && block.content.trim()) {\n results.push(block.content.trim());\n } else if (Array.isArray(block.content)) {\n for (const sub of block.content) {\n if (sub.type === 'text' && typeof sub.text === 'string' && sub.text.trim()) {\n results.push(sub.text.trim());\n }\n }\n }\n }\n return results;\n}\n\nfunction formatUsage(data: Record<string, unknown>): string {\n const usage = data?.usage as any;\n if (!usage || typeof usage !== 'object') return '';\n const parts: string[] = [];\n if (typeof usage.input_tokens === 'number') parts.push(`in:${usage.input_tokens}`);\n if (typeof usage.output_tokens === 'number') parts.push(`out:${usage.output_tokens}`);\n if (typeof usage.cache_read_input_tokens === 'number' && usage.cache_read_input_tokens > 0) {\n parts.push(`cache:${usage.cache_read_input_tokens}`);\n }\n return parts.length > 0 ? parts.join(' ') : '';\n}\n\nexport function useAgentPool(orchestrator: Orchestrator): AgentState[] {\n const [agents, setAgents] = React.useState<AgentState[]>([]);\n\n React.useEffect(() => {\n const handleSpawned = (state: AgentState) => {\n setAgents((prev) => {\n const existing = prev.findIndex((a) => a.config.id === state.config.id);\n if (existing >= 0) {\n const next = [...prev];\n next[existing] = state;\n return next;\n }\n return [...prev, state];\n });\n addLogLine(state.config.id, `[system] Agent spawned: ${state.config.name}`);\n };\n\n const handleStatusChanged = (\n agentId: string,\n _oldStatus: AgentStatus,\n newStatus: AgentStatus\n ) => {\n setAgents((prev) =>\n prev.map((a) =>\n a.config.id === agentId ? { ...a, status: newStatus } : a\n )\n );\n addLogLine(agentId, `[system] Status changed to: ${newStatus}`);\n };\n\n const handleOutput = (event: { agentId: string; type: string; data: Record<string, unknown> }) => {\n if (event.type === 'user') {\n // Extract tool_result content from user events (e.g. \"File created successfully at: ...\")\n const toolResults = extractToolResults(event.data);\n for (const result of toolResults) {\n const truncated = result.length > 200 ? result.slice(0, 200) + '...' : result;\n const firstLine = truncated.split('\\n')[0];\n addLogLine(event.agentId, `[tool] ${firstLine}`);\n }\n return;\n }\n\n let text = '';\n\n if (event.type === 'assistant') {\n const message = event.data?.message as any;\n if (message && typeof message === 'object' && Array.isArray(message.content)) {\n text = message.content\n .filter((block: any) => block.type === 'text' && typeof block.text === 'string')\n .map((block: any) => block.text)\n .join('');\n } else if (typeof event.data?.content === 'string') {\n text = event.data.content;\n } else if (typeof message === 'string') {\n text = message;\n }\n } else if (event.type === 'result') {\n // Accumulate token usage for this agent\n accumulateTokens(event.agentId, event.data);\n\n const cost = typeof event.data?.cost_usd === 'number' ? `$${event.data.cost_usd.toFixed(4)}` : '';\n const turns = typeof event.data?.num_turns === 'number' ? `${event.data.num_turns} turns` : '';\n const usage = formatUsage(event.data);\n text = `done ${[cost, turns, usage].filter(Boolean).join(' | ')}`;\n\n // Trigger a re-render so panels pick up updated token counts\n setAgents((prev) => [...prev]);\n } else if (event.type === 'error') {\n text = (event.data?.error as string) ?? JSON.stringify(event.data);\n } else if (event.type === 'tool_use') {\n const toolName = (event.data?.tool as string) ?? (event.data?.name as string) ?? 'tool';\n text = `[${toolName}]`;\n } else {\n text = (event.data?.message as string) ?? '';\n }\n\n if (!text) return;\n\n const truncated = text.length > 200 ? text.slice(0, 200) + '...' : text;\n addLogLine(event.agentId, `[${event.type}] ${truncated}`);\n };\n\n const handleError = (agentId: string, error: Error) => {\n setAgents((prev) =>\n prev.map((a) =>\n a.config.id === agentId\n ? { ...a, status: 'error' as AgentStatus, error: error.message }\n : a\n )\n );\n addLogLine(agentId, `[error] ${error.message}`);\n };\n\n const handleStopped = (agentId: string, exitCode: number | null) => {\n setAgents((prev) =>\n prev.map((a) =>\n a.config.id === agentId\n ? { ...a, status: 'stopped' as AgentStatus, currentTask: null }\n : a\n )\n );\n addLogLine(agentId, `[system] Agent stopped (exit code: ${exitCode})`);\n };\n\n const handleTaskAssigned = (task: { id: string; title: string }, agentId: string) => {\n setAgents((prev) =>\n prev.map((a) =>\n a.config.id === agentId\n ? { ...a, currentTask: `${task.id}: ${task.title}` }\n : a\n )\n );\n };\n\n const handleTaskCompleted = (task: { id: string; assignee: string | null }) => {\n if (task.assignee) {\n setAgents((prev) =>\n prev.map((a) =>\n a.config.id === task.assignee\n ? { ...a, currentTask: null }\n : a\n )\n );\n }\n };\n\n orchestrator.on('agent:spawned', handleSpawned);\n orchestrator.on('agent:status-changed', handleStatusChanged);\n orchestrator.on('agent:output', handleOutput);\n orchestrator.on('agent:error', handleError);\n orchestrator.on('agent:stopped', handleStopped);\n orchestrator.on('task:assigned', handleTaskAssigned);\n orchestrator.on('task:completed', handleTaskCompleted);\n\n return () => {\n orchestrator.off('agent:spawned', handleSpawned);\n orchestrator.off('agent:status-changed', handleStatusChanged);\n orchestrator.off('agent:output', handleOutput);\n orchestrator.off('agent:error', handleError);\n orchestrator.off('agent:stopped', handleStopped);\n orchestrator.off('task:assigned', handleTaskAssigned);\n orchestrator.off('task:completed', handleTaskCompleted);\n };\n }, [orchestrator]);\n\n return agents;\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { AgentState, OrchestratorActivity } from '@maestroai/core';\n\ninterface LogViewerProps {\n agent: AgentState | null;\n orchestratorActivities?: OrchestratorActivity[];\n}\n\nconst MAX_LOG_LINES = 20;\n\n// Store log lines keyed by agent id\nconst agentLogs = new Map<string, string[]>();\n\nexport function addLogLine(agentId: string, line: string): void {\n let logs = agentLogs.get(agentId);\n if (!logs) {\n logs = [];\n agentLogs.set(agentId, logs);\n }\n logs.push(line);\n // Keep only the last N lines\n if (logs.length > MAX_LOG_LINES * 2) {\n agentLogs.set(agentId, logs.slice(-MAX_LOG_LINES));\n }\n}\n\nexport function getLogLines(agentId: string): string[] {\n return (agentLogs.get(agentId) ?? []).slice(-MAX_LOG_LINES);\n}\n\nconst KIND_COLORS: Record<string, string> = {\n 'task-delegated': 'cyan',\n 'task-completed': 'green',\n 'task-blocked': 'red',\n 'task-failed': 'red',\n 'agent-spawned': 'green',\n 'agent-stopped': 'gray',\n 'agent-error': 'red',\n 'phase-changed': 'magenta',\n 'pipeline-handoff': 'yellow',\n 'plan-created': 'blue',\n 'plan-approved': 'green',\n 'plan-rejected': 'red',\n 'budget-warning': 'yellow',\n 'rate-limit': 'red',\n 'project-completed': 'green',\n 'cycle-summary': 'gray',\n 'gap-detected': 'yellow',\n 'pm-scan': 'cyan',\n 'info': 'blue',\n};\n\nfunction formatTime(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\nexport function LogViewer({ agent, orchestratorActivities }: LogViewerProps): React.ReactElement {\n // Orchestrator activities view\n if (orchestratorActivities) {\n const recent = orchestratorActivities.slice(-MAX_LOG_LINES);\n return (\n <Box flexDirection=\"column\">\n <Text bold underline color=\"yellow\">\n Orchestrator Log\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {recent.length === 0 ? (\n <Text dimColor>No activity yet...</Text>\n ) : (\n recent.map((activity) => {\n const color = KIND_COLORS[activity.kind] ?? 'white';\n return (\n <Box key={activity.id} flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(activity.timestamp)}</Text>\n <Text color={color} wrap=\"truncate\">\n {activity.message}\n </Text>\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n );\n }\n\n if (!agent) {\n return (\n <Box paddingY={1}>\n <Text dimColor>Select an agent to view logs.</Text>\n </Box>\n );\n }\n\n const lines = getLogLines(agent.config.id);\n\n return (\n <Box flexDirection=\"column\">\n <Text bold underline>\n Logs: {agent.config.name}\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {lines.length === 0 ? (\n <Text dimColor>No output yet...</Text>\n ) : (\n lines.map((line, i) => (\n <Text key={i} wrap=\"truncate\">\n {line}\n </Text>\n ))\n )}\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport figures from 'figures';\nimport type { OrchestratorActivity } from '@maestroai/core';\n\ninterface OrchestratorPanelProps {\n activities: OrchestratorActivity[];\n isSelected: boolean;\n phase: string;\n activeAgents: number;\n totalTasks: number;\n completedTasks: number;\n}\n\nconst KIND_ICONS: Record<string, { icon: string; color: string }> = {\n 'task-delegated': { icon: figures.arrowRight, color: 'cyan' },\n 'task-completed': { icon: figures.tick, color: 'green' },\n 'task-blocked': { icon: figures.cross, color: 'red' },\n 'task-failed': { icon: figures.cross, color: 'red' },\n 'agent-spawned': { icon: figures.play, color: 'green' },\n 'agent-stopped': { icon: figures.circleFilled, color: 'gray' },\n 'agent-error': { icon: figures.warning, color: 'red' },\n 'phase-changed': { icon: figures.pointer, color: 'magenta' },\n 'pipeline-handoff': { icon: figures.arrowRight, color: 'yellow' },\n 'plan-created': { icon: figures.info, color: 'blue' },\n 'plan-approved': { icon: figures.tick, color: 'green' },\n 'plan-rejected': { icon: figures.cross, color: 'red' },\n 'budget-warning': { icon: figures.warning, color: 'yellow' },\n 'rate-limit': { icon: figures.warning, color: 'red' },\n 'project-completed': { icon: figures.star, color: 'green' },\n 'cycle-summary': { icon: figures.bullet, color: 'gray' },\n 'gap-detected': { icon: figures.warning, color: 'yellow' },\n 'pm-scan': { icon: figures.pointer, color: 'cyan' },\n 'info': { icon: figures.info, color: 'blue' },\n};\n\nconst MAX_VISIBLE_ACTIVITIES = 6;\n\nfunction formatTime(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\nexport function OrchestratorPanel({\n activities,\n isSelected,\n phase,\n activeAgents,\n totalTasks,\n completedTasks,\n}: OrchestratorPanelProps): React.ReactElement {\n const borderColor = isSelected ? 'cyan' : 'yellow';\n const recentActivities = activities.slice(-MAX_VISIBLE_ACTIVITIES);\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle={isSelected ? 'bold' : 'double'}\n borderColor={borderColor}\n paddingX={1}\n marginBottom={0}\n >\n {/* Header */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Box gap={1}>\n <Text color=\"yellow\">{figures.star}</Text>\n <Text bold color=\"yellow\">Orchestrator</Text>\n </Box>\n <Box gap={1}>\n <Text color=\"green\">{figures.play} active</Text>\n </Box>\n </Box>\n\n {/* Status row */}\n <Box flexDirection=\"row\" gap={2} marginTop={0}>\n <Text>\n <Text dimColor>Phase: </Text>\n <Text color=\"magenta\" bold>{phase}</Text>\n </Text>\n <Text>\n <Text dimColor>Agents: </Text>\n <Text color=\"cyan\">{activeAgents}</Text>\n </Text>\n <Text>\n <Text dimColor>Tasks: </Text>\n <Text color=\"green\">{completedTasks}</Text>\n <Text dimColor>/{totalTasks}</Text>\n </Text>\n </Box>\n\n {/* Activity log */}\n <Box flexDirection=\"column\" marginTop={1}>\n {recentActivities.length === 0 ? (\n <Text dimColor>Waiting for activity...</Text>\n ) : (\n recentActivities.map((activity) => {\n const kindStyle = KIND_ICONS[activity.kind] ?? KIND_ICONS['info'];\n return (\n <Box key={activity.id} flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(activity.timestamp)}</Text>\n <Text color={kindStyle.color}>{kindStyle.icon}</Text>\n <Text wrap=\"truncate-end\">{activity.message}</Text>\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Box, Text } from 'ink';\nimport figures from 'figures';\nimport type { AgentState, AgentStatus, OrchestratorActivity } from '@maestroai/core';\nimport { getAgentTokenUsage } from '../hooks/useAgentPool.js';\n\nfunction formatTokenCount(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\ninterface AgentDetailViewProps {\n agent: AgentState | null;\n orchestratorActivities?: OrchestratorActivity[];\n isOrchestrator?: boolean;\n phase?: string;\n logsDir: string;\n}\n\n// --- Log file parsing ---\n\ninterface ParsedLogEntry {\n timestamp: string;\n type: string;\n content: string;\n json: Record<string, unknown> | null;\n}\n\nfunction parseLogLine(line: string): ParsedLogEntry | null {\n if (!line.trim()) return null;\n\n const match = line.match(/^(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z)\\s+\\[(\\w+)\\]\\s+([\\s\\S]*)$/);\n if (!match) {\n return { timestamp: '', type: 'raw', content: line, json: null };\n }\n\n const [, timestamp, type, content] = match;\n let json: Record<string, unknown> | null = null;\n\n if (content.startsWith('{')) {\n try {\n json = JSON.parse(content);\n } catch {\n // not valid JSON\n }\n }\n\n return { timestamp, type, content, json };\n}\n\nfunction useFileLog(logPath: string): ParsedLogEntry[] {\n const [entries, setEntries] = React.useState<ParsedLogEntry[]>([]);\n const lastSizeRef = React.useRef(0);\n\n React.useEffect(() => {\n let cancelled = false;\n\n const readLog = () => {\n try {\n const stat = fs.statSync(logPath);\n if (stat.size === lastSizeRef.current) return;\n lastSizeRef.current = stat.size;\n\n const content = fs.readFileSync(logPath, 'utf-8');\n if (cancelled) return;\n\n const parsed = content\n .split('\\n')\n .map(parseLogLine)\n .filter((e): e is ParsedLogEntry => e !== null);\n\n setEntries(parsed);\n } catch {\n // file doesn't exist yet\n }\n };\n\n readLog();\n const interval = setInterval(readLog, 2000);\n return () => {\n cancelled = true;\n clearInterval(interval);\n };\n }, [logPath]);\n\n return entries;\n}\n\n// --- Display helpers ---\n\n/** Extract text content from an assistant message JSON blob */\nfunction extractAssistantText(json: Record<string, unknown>): string[] {\n const msg = json.message as Record<string, unknown> | undefined;\n const contentBlocks = msg?.content as Array<Record<string, unknown>> | undefined;\n if (!Array.isArray(contentBlocks)) return [];\n\n const texts: string[] = [];\n for (const block of contentBlocks) {\n if (block.type === 'text' && typeof block.text === 'string') {\n texts.push(block.text);\n }\n }\n return texts;\n}\n\n/** Extract tool_use calls from an assistant message JSON blob */\nfunction extractToolUses(json: Record<string, unknown>): Array<{ name: string; filePath?: string; input?: Record<string, unknown> }> {\n const msg = json.message as Record<string, unknown> | undefined;\n const contentBlocks = msg?.content as Array<Record<string, unknown>> | undefined;\n if (!Array.isArray(contentBlocks)) return [];\n\n const tools: Array<{ name: string; filePath?: string; input?: Record<string, unknown> }> = [];\n for (const block of contentBlocks) {\n if (block.type === 'tool_use' && typeof block.name === 'string') {\n const input = block.input as Record<string, unknown> | undefined;\n const filePath =\n (input?.file_path as string) ??\n (input?.path as string) ??\n (input?.command as string);\n tools.push({ name: block.name, filePath: filePath ?? undefined, input: input ?? undefined });\n }\n }\n return tools;\n}\n\n/** Extract tool info from a standalone tool_use event */\nfunction extractStandaloneToolUse(json: Record<string, unknown>): { name: string; filePath?: string } | null {\n const tool = json.tool as Record<string, unknown> | undefined;\n const name = (tool?.name as string) ?? (json.name as string);\n if (!name) return null;\n\n const input = (tool?.input as Record<string, unknown>) ?? (json.input as Record<string, unknown>);\n const filePath =\n (input?.file_path as string) ??\n (input?.path as string) ??\n (input?.command as string);\n\n return { name, filePath: filePath ?? undefined };\n}\n\n/** Format a tool call as a compact one-liner for display */\nfunction formatToolCall(name: string, filePath?: string): string {\n const FILE_TOOLS = ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'NotebookEdit'];\n if (FILE_TOOLS.includes(name) && filePath) {\n return `${name} ${filePath}`;\n }\n if (name === 'Bash' && filePath) {\n const cmd = filePath.length > 80 ? filePath.slice(0, 77) + '...' : filePath;\n return `Bash: ${cmd}`;\n }\n if (name === 'TodoWrite') return 'TodoWrite';\n if (name === 'Task') return 'Task (subagent)';\n if (filePath) return `${name} ${filePath}`;\n return name;\n}\n\nfunction formatTime(iso: string): string {\n if (!iso) return ' ';\n const d = new Date(iso);\n return d.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\n// --- Rendered entry components ---\n\nfunction SystemEntry({ entry }: { entry: ParsedLogEntry }): React.ReactElement {\n const msg = entry.json\n ? (entry.json.message as string) ?? (entry.json.session_id ? `Session: ${entry.json.session_id}` : entry.content)\n : entry.content;\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text dimColor>{msg}</Text>\n </Box>\n );\n}\n\nfunction AssistantEntry({ entry }: { entry: ParsedLogEntry }): React.ReactElement {\n if (!entry.json) {\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"blue\" bold>{figures.pointer} Assistant</Text>\n </Box>\n <Box paddingLeft={10}>\n <Text wrap=\"truncate-end\">{entry.content}</Text>\n </Box>\n </Box>\n );\n }\n\n const texts = extractAssistantText(entry.json);\n const toolUses = extractToolUses(entry.json);\n\n const elements: React.ReactElement[] = [];\n\n // Show text content\n if (texts.length > 0) {\n const combined = texts.join('\\n');\n // Show first few lines, truncate if very long\n const displayLines = combined.split('\\n');\n const maxLines = 6;\n const truncated = displayLines.length > maxLines;\n const shown = displayLines.slice(0, maxLines).join('\\n');\n\n elements.push(\n <Box key=\"text\" flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"blue\" bold>{figures.pointer} Assistant</Text>\n </Box>\n <Box paddingLeft={10}>\n <Text wrap=\"truncate-end\">{shown}</Text>\n {truncated && <Text dimColor> ... ({displayLines.length - maxLines} more lines)</Text>}\n </Box>\n </Box>,\n );\n }\n\n // Show tool calls from assistant message\n for (const tool of toolUses) {\n elements.push(\n <Box key={`tool-${tool.name}-${tool.filePath}`} flexDirection=\"row\" gap={1}>\n <Text dimColor>{texts.length > 0 ? ' ' : formatTime(entry.timestamp)}</Text>\n <Text color=\"cyan\">{figures.arrowRight} {formatToolCall(tool.name, tool.filePath)}</Text>\n </Box>,\n );\n }\n\n if (elements.length === 0) {\n // Fallback: show raw content\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"blue\">[assistant] </Text>\n <Text wrap=\"truncate-end\">{entry.content.slice(0, 120)}</Text>\n </Box>\n );\n }\n\n return <Box flexDirection=\"column\">{elements}</Box>;\n}\n\nfunction ToolUseEntry({ entry }: { entry: ParsedLogEntry }): React.ReactElement {\n if (entry.json) {\n const tool = extractStandaloneToolUse(entry.json);\n if (tool) {\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"cyan\">{figures.arrowRight} {formatToolCall(tool.name, tool.filePath)}</Text>\n </Box>\n );\n }\n }\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"cyan\">{figures.arrowRight} {entry.content.slice(0, 120)}</Text>\n </Box>\n );\n}\n\nfunction ToolResultEntry({ entry }: { entry: ParsedLogEntry }): React.ReactElement {\n let content = entry.content;\n\n if (entry.json) {\n const resultContent =\n (entry.json.content as string) ??\n (entry.json.tool_result as Record<string, unknown>)?.content;\n if (typeof resultContent === 'string') {\n content = resultContent;\n }\n }\n\n // Truncate long results\n const lines = content.split('\\n');\n const lineCount = lines.length;\n const truncated = lineCount > 3 ? lines.slice(0, 3).join('\\n') + `\\n... (${lineCount - 3} more lines)` : content;\n const display = truncated.length > 200 ? truncated.slice(0, 200) + '...' : truncated;\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text dimColor>{figures.ellipsis} {display}</Text>\n </Box>\n );\n}\n\nfunction ResultEntry({ entry }: { entry: ParsedLogEntry }): React.ReactElement {\n if (entry.json) {\n const costUsd = entry.json.cost_usd as number | undefined;\n const numTurns = entry.json.num_turns as number | undefined;\n const parts: string[] = [];\n if (costUsd !== undefined) parts.push(`$${costUsd.toFixed(4)}`);\n if (numTurns !== undefined) parts.push(`${numTurns} turns`);\n const detail = parts.length > 0 ? ` (${parts.join(', ')})` : '';\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"green\" bold>{figures.tick} Task complete{detail}</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"green\" bold>{figures.tick} {entry.content}</Text>\n </Box>\n );\n}\n\nfunction ErrorEntry({ entry }: { entry: ParsedLogEntry }): React.ReactElement {\n let msg = entry.content;\n if (entry.json) {\n msg = (entry.json.error as string) ?? (entry.json.message as string) ?? entry.content;\n }\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text color=\"red\">{figures.cross} {msg}</Text>\n </Box>\n );\n}\n\nfunction LogEntry({ entry }: { entry: ParsedLogEntry }): React.ReactElement {\n switch (entry.type) {\n case 'system':\n return <SystemEntry entry={entry} />;\n case 'assistant':\n return <AssistantEntry entry={entry} />;\n case 'tool_use':\n return <ToolUseEntry entry={entry} />;\n case 'tool_result':\n return <ToolResultEntry entry={entry} />;\n case 'result':\n return <ResultEntry entry={entry} />;\n case 'error':\n return <ErrorEntry entry={entry} />;\n default:\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(entry.timestamp)}</Text>\n <Text wrap=\"truncate-end\">{entry.content}</Text>\n </Box>\n );\n }\n}\n\n// --- Main component ---\n\nconst MAX_DETAIL_LOG_LINES = 80;\n\nfunction getStatusColor(status: AgentStatus): string {\n switch (status) {\n case 'running':\n return 'green';\n case 'idle':\n case 'starting':\n return 'yellow';\n case 'error':\n return 'red';\n case 'stopped':\n case 'stopping':\n return 'gray';\n default:\n return 'white';\n }\n}\n\nconst KIND_COLORS: Record<string, string> = {\n 'task-delegated': 'cyan',\n 'task-completed': 'green',\n 'task-blocked': 'red',\n 'task-failed': 'red',\n 'agent-spawned': 'green',\n 'agent-stopped': 'gray',\n 'agent-error': 'red',\n 'phase-changed': 'magenta',\n 'pipeline-handoff': 'yellow',\n 'plan-created': 'blue',\n 'plan-approved': 'green',\n 'plan-rejected': 'red',\n 'budget-warning': 'yellow',\n 'rate-limit': 'red',\n 'project-completed': 'green',\n 'cycle-summary': 'gray',\n 'gap-detected': 'yellow',\n 'pm-scan': 'cyan',\n 'info': 'blue',\n};\n\nexport function AgentDetailView({\n agent,\n orchestratorActivities,\n isOrchestrator,\n phase,\n logsDir,\n}: AgentDetailViewProps): React.ReactElement {\n if (isOrchestrator && orchestratorActivities) {\n const logPath = path.join(logsDir, 'orchestrator.log');\n const entries = useFileLog(logPath);\n const displayEntries = entries.slice(-MAX_DETAIL_LOG_LINES);\n\n // Fallback to in-memory activities if no log file yet\n if (displayEntries.length === 0) {\n const activities = orchestratorActivities.slice(-MAX_DETAIL_LOG_LINES);\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1}>\n <Box gap={1}>\n <Text color=\"yellow\" bold>{figures.star} Orchestrator Detail View</Text>\n <Text dimColor>| Phase: </Text>\n <Text color=\"magenta\" bold>{phase ?? 'unknown'}</Text>\n </Box>\n <Text dimColor>Press ESC to return to agents list</Text>\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"yellow\" paddingX={1} flexGrow={1}>\n <Text bold underline color=\"yellow\">Activity Log</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {activities.length === 0 ? (\n <Text dimColor>No activity yet...</Text>\n ) : (\n activities.map((activity) => {\n const color = KIND_COLORS[activity.kind] ?? 'white';\n return (\n <Box key={activity.id} flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(activity.timestamp)}</Text>\n <Text color={color} bold>[{activity.kind}]</Text>\n <Text wrap=\"truncate-end\">{activity.message}</Text>\n </Box>\n );\n })\n )}\n </Box>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1}>\n <Box gap={1}>\n <Text color=\"yellow\" bold>{figures.star} Orchestrator Detail View</Text>\n <Text dimColor>| Phase: </Text>\n <Text color=\"magenta\" bold>{phase ?? 'unknown'}</Text>\n </Box>\n <Text dimColor>Press ESC to return to agents list</Text>\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"yellow\" paddingX={1} flexGrow={1}>\n <Text bold underline color=\"yellow\">Developer Log</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {displayEntries.map((entry, i) => (\n <LogEntry key={i} entry={entry} />\n ))}\n </Box>\n </Box>\n </Box>\n );\n }\n\n if (!agent) {\n return (\n <Box paddingY={1} paddingX={1}>\n <Text dimColor>No agent selected. Press ESC to return.</Text>\n </Box>\n );\n }\n\n // Regular agent detail view — read from log file on disk\n const logPath = path.join(logsDir, `${agent.config.id}.log`);\n const entries = useFileLog(logPath);\n const displayEntries = entries.slice(-MAX_DETAIL_LOG_LINES);\n\n const statusColor = getStatusColor(agent.status);\n const tokens = getAgentTokenUsage(agent.config.id);\n const hasTokens = tokens.inputTokens > 0 || tokens.outputTokens > 0;\n\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n {/* Header */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1}>\n <Box gap={1}>\n <Text bold>{agent.config.name}</Text>\n <Text dimColor>({agent.config.role})</Text>\n <Text color={statusColor}>\n {(agent.status === 'running' || agent.status === 'starting') ? `${figures.play} ` : ''}{agent.status}\n </Text>\n </Box>\n <Text dimColor>Press ESC to return to agents list</Text>\n </Box>\n\n {/* Info bar */}\n <Box flexDirection=\"row\" gap={3} marginBottom={1}>\n {agent.currentTask && (\n <Text>\n <Text dimColor>Task: </Text>\n <Text>{agent.currentTask}</Text>\n </Text>\n )}\n <Text>\n <Text dimColor>Cost: </Text>\n <Text color=\"yellow\">${agent.totalCostUsd.toFixed(4)}</Text>\n </Text>\n <Text>\n <Text dimColor>Turns: </Text>\n <Text>{agent.turnCount}</Text>\n </Text>\n {hasTokens && (\n <Text>\n <Text dimColor>In: </Text>\n <Text color=\"cyan\">{formatTokenCount(tokens.inputTokens)}</Text>\n <Text dimColor> Out: </Text>\n <Text color=\"green\">{formatTokenCount(tokens.outputTokens)}</Text>\n {tokens.cacheReadTokens > 0 && (\n <>\n <Text dimColor> Cache: </Text>\n <Text>{formatTokenCount(tokens.cacheReadTokens)}</Text>\n </>\n )}\n </Text>\n )}\n {agent.sessionId && (\n <Text>\n <Text dimColor>Session: </Text>\n <Text dimColor>{agent.sessionId.slice(0, 12)}...</Text>\n </Text>\n )}\n </Box>\n\n {agent.error && (\n <Box marginBottom={1}>\n <Text color=\"red\">{figures.cross} {agent.error}</Text>\n </Box>\n )}\n\n {/* Log from disk */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n flexGrow={1}\n >\n <Text bold underline>Developer Log <Text dimColor>({logPath})</Text></Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {displayEntries.length === 0 ? (\n <Text dimColor>No log entries yet...</Text>\n ) : (\n displayEntries.map((entry, i) => (\n <LogEntry key={i} entry={entry} />\n ))\n )}\n </Box>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport figures from 'figures';\nimport type { Task, TaskStatus, TaskPriority } from '@maestroai/core';\n\ninterface TaskListProps {\n tasks: Task[];\n selectedIndex: number;\n}\n\nfunction getStatusIcon(status: TaskStatus): string {\n switch (status) {\n case 'done':\n return figures.tick;\n case 'in-progress':\n return figures.play;\n case 'blocked':\n return figures.cross;\n case 'cancelled':\n return figures.line;\n case 'pending':\n default:\n return figures.circle;\n }\n}\n\nfunction getStatusColor(status: TaskStatus): string {\n switch (status) {\n case 'done':\n return 'green';\n case 'in-progress':\n return 'cyan';\n case 'blocked':\n return 'red';\n case 'cancelled':\n return 'gray';\n case 'pending':\n default:\n return 'white';\n }\n}\n\nfunction getPriorityIndicator(priority: TaskPriority): { text: string; color: string } {\n switch (priority) {\n case 'critical':\n return { text: '!!!', color: 'red' };\n case 'high':\n return { text: '!! ', color: 'yellow' };\n case 'medium':\n return { text: '! ', color: 'white' };\n case 'low':\n return { text: ' ', color: 'gray' };\n }\n}\n\nfunction TaskRow({ task, isSelected }: { task: Task; isSelected: boolean }): React.ReactElement {\n const icon = getStatusIcon(task.status);\n const color = getStatusColor(task.status);\n const priority = getPriorityIndicator(task.priority);\n const isDone = task.status === 'done' || task.status === 'cancelled';\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text color={isSelected ? 'cyan' : undefined}>{isSelected ? figures.pointer : ' '}</Text>\n <Text color={color}>{icon}</Text>\n <Text color={priority.color}>{priority.text}</Text>\n <Text color={isSelected ? 'cyan' : color} dimColor={isDone} bold={isSelected}>\n {task.id}\n </Text>\n <Text color={isSelected ? 'cyan' : color} dimColor={isDone} bold={isSelected} wrap=\"truncate\">\n {task.title}\n </Text>\n {task.assignee && (\n <Text dimColor={isDone} color={task.status === 'in-progress' ? 'green' : undefined}>\n @{task.assignee}\n </Text>\n )}\n </Box>\n );\n}\n\n// Sort tasks: in-progress first, then pending, then done\nfunction sortTasks(tasks: Task[]): Task[] {\n const statusOrder: Record<TaskStatus, number> = {\n 'in-progress': 0,\n 'pending': 1,\n 'blocked': 2,\n 'done': 3,\n 'cancelled': 4,\n };\n return [...tasks].sort((a, b) => {\n const sa = statusOrder[a.status] ?? 5;\n const sb = statusOrder[b.status] ?? 5;\n if (sa !== sb) return sa - sb;\n // Within same status, sort by priority\n const priorityOrder: Record<TaskPriority, number> = {\n critical: 0, high: 1, medium: 2, low: 3,\n };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n}\n\nexport function TaskList({ tasks, selectedIndex }: TaskListProps): React.ReactElement {\n if (tasks.length === 0) {\n return (\n <Box paddingY={1}>\n <Text dimColor>No tasks found.</Text>\n </Box>\n );\n }\n\n const sorted = sortTasks(tasks);\n const inProgress = sorted.filter((t) => t.status === 'in-progress').length;\n const pending = sorted.filter((t) => t.status === 'pending').length;\n const done = sorted.filter((t) => t.status === 'done').length;\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" gap={2}>\n <Text bold underline>Tasks ({tasks.length})</Text>\n <Text>\n <Text color=\"cyan\">{inProgress} active</Text>\n <Text dimColor> | </Text>\n <Text>{pending} pending</Text>\n <Text dimColor> | </Text>\n <Text color=\"green\">{done} done</Text>\n </Text>\n </Box>\n <Text dimColor>Use arrows to select, Enter for details, Esc to go back</Text>\n <Box marginTop={1} flexDirection=\"column\">\n {sorted.map((task, i) => (\n <TaskRow\n key={task.id}\n task={task}\n isSelected={i === selectedIndex}\n />\n ))}\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport figures from 'figures';\nimport type { Task, Orchestrator, MessageEnvelope } from '@maestroai/core';\n\ninterface TaskDetailViewProps {\n task: Task;\n orchestrator: Orchestrator;\n}\n\nfunction getStatusColor(status: string): string {\n switch (status) {\n case 'done':\n return 'green';\n case 'in-progress':\n return 'cyan';\n case 'blocked':\n return 'red';\n case 'cancelled':\n return 'gray';\n case 'pending':\n default:\n return 'white';\n }\n}\n\nfunction getStatusIcon(status: string): string {\n switch (status) {\n case 'done':\n return figures.tick;\n case 'in-progress':\n return figures.play;\n case 'blocked':\n return figures.cross;\n case 'cancelled':\n return figures.line;\n default:\n return figures.circle;\n }\n}\n\nfunction formatTime(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n}\n\nfunction getTypeIcon(type: string): { icon: string; color: string } {\n switch (type) {\n case 'task-assignment':\n return { icon: figures.arrowRight, color: 'cyan' };\n case 'task-result':\n return { icon: figures.tick, color: 'green' };\n case 'feedback-request':\n return { icon: figures.warning, color: 'yellow' };\n case 'feedback-response':\n return { icon: figures.info, color: 'blue' };\n default:\n return { icon: figures.bullet, color: 'white' };\n }\n}\n\nfunction MessageRow({ envelope }: { envelope: MessageEnvelope }): React.ReactElement {\n const msg = envelope.message;\n const { icon, color } = getTypeIcon(msg.type);\n\n // Show body preview — first few meaningful lines\n const bodyLines = msg.body\n ? msg.body.split('\\n').filter((l) => l.trim()).slice(0, 4)\n : [];\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box flexDirection=\"row\" gap={1}>\n <Text dimColor>{formatTime(msg.timestamp)}</Text>\n <Text color={color}>{icon}</Text>\n <Text color={color} bold>{msg.type}</Text>\n <Text dimColor>{msg.from} {figures.arrowRight} {msg.to}</Text>\n </Box>\n {msg.subject && (\n <Box paddingLeft={2}>\n <Text wrap=\"truncate-end\">{msg.subject}</Text>\n </Box>\n )}\n {bodyLines.length > 0 && (\n <Box paddingLeft={2} flexDirection=\"column\">\n {bodyLines.map((line, i) => (\n <Text key={i} wrap=\"truncate-end\" dimColor>\n {line}\n </Text>\n ))}\n {msg.body && msg.body.split('\\n').filter((l) => l.trim()).length > 4 && (\n <Text dimColor> ...</Text>\n )}\n </Box>\n )}\n </Box>\n );\n}\n\nexport function TaskDetailView({ task, orchestrator }: TaskDetailViewProps): React.ReactElement {\n const [messages, setMessages] = React.useState<MessageEnvelope[]>([]);\n const [loading, setLoading] = React.useState(true);\n\n React.useEffect(() => {\n setLoading(true);\n orchestrator.getTaskMessages(task.id).then((msgs) => {\n setMessages(msgs);\n setLoading(false);\n }).catch(() => {\n setLoading(false);\n });\n }, [task.id, orchestrator]);\n\n const statusColor = getStatusColor(task.status);\n const statusIcon = getStatusIcon(task.status);\n\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n {/* Header */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1}>\n <Box gap={1}>\n <Text color={statusColor}>{statusIcon}</Text>\n <Text bold>{task.id}</Text>\n <Text bold>{task.title}</Text>\n </Box>\n <Text dimColor>ESC: back | arrows: navigate</Text>\n </Box>\n\n {/* Task info */}\n <Box flexDirection=\"row\" gap={3} marginBottom={1}>\n <Text>\n <Text dimColor>Status: </Text>\n <Text color={statusColor} bold>{task.status}</Text>\n </Text>\n <Text>\n <Text dimColor>Priority: </Text>\n <Text>{task.priority}</Text>\n </Text>\n <Text>\n <Text dimColor>Assignee: </Text>\n <Text color={task.assignee ? 'green' : 'gray'}>\n {task.assignee ?? 'unassigned'}\n </Text>\n </Text>\n {task.dependencies.length > 0 && (\n <Text>\n <Text dimColor>Deps: </Text>\n <Text>{task.dependencies.join(', ')}</Text>\n </Text>\n )}\n {task.tags.length > 0 && (\n <Text>\n <Text dimColor>Tags: </Text>\n <Text>{task.tags.join(', ')}</Text>\n </Text>\n )}\n </Box>\n\n {task.description && (\n <Box marginBottom={1}>\n <Text dimColor wrap=\"truncate-end\">{task.description}</Text>\n </Box>\n )}\n\n {/* Messages section */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n flexGrow={1}\n overflow=\"hidden\"\n >\n <Text bold>Messages ({messages.length})</Text>\n <Box flexDirection=\"column\" marginTop={1} overflow=\"hidden\">\n {loading ? (\n <Text dimColor>Loading messages...</Text>\n ) : messages.length === 0 ? (\n <Text dimColor>No messages for this task.</Text>\n ) : (\n messages.map((envelope) => (\n <MessageRow key={envelope.message.id} envelope={envelope} />\n ))\n )}\n </Box>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useInput } from 'ink';\n\ninterface InstructionsPanelProps {\n isPaused: boolean;\n isDecomposing: boolean;\n onSubmit: (instructions: string) => void;\n onPause: () => void;\n onResume: () => void;\n}\n\nexport function InstructionsPanel({\n isPaused,\n isDecomposing,\n onSubmit,\n onPause,\n onResume,\n}: InstructionsPanelProps): React.ReactElement {\n const [lines, setLines] = React.useState<string[]>(['']);\n const [cursorLine, setCursorLine] = React.useState(0);\n const [cursorCol, setCursorCol] = React.useState(0);\n const [submitted, setSubmitted] = React.useState(false);\n\n useInput((input, key) => {\n if (isDecomposing) return;\n\n // Ctrl+S submits the instructions\n if (input === 's' && key.ctrl) {\n const text = lines.join('\\n').trim();\n if (text.length > 0) {\n setSubmitted(true);\n onSubmit(text);\n // Reset after a brief delay\n setTimeout(() => {\n setLines(['']);\n setCursorLine(0);\n setCursorCol(0);\n setSubmitted(false);\n }, 500);\n }\n return;\n }\n\n // Ctrl+X clears the buffer\n if (input === 'x' && key.ctrl) {\n setLines(['']);\n setCursorLine(0);\n setCursorCol(0);\n return;\n }\n\n // Ctrl+P toggles pause/resume\n if (input === 'p' && key.ctrl) {\n if (isPaused) {\n onResume();\n } else {\n onPause();\n }\n return;\n }\n\n // Enter adds a new line\n if (key.return) {\n const currentLine = lines[cursorLine] ?? '';\n const before = currentLine.slice(0, cursorCol);\n const after = currentLine.slice(cursorCol);\n const newLines = [...lines];\n newLines[cursorLine] = before;\n newLines.splice(cursorLine + 1, 0, after);\n setLines(newLines);\n setCursorLine(cursorLine + 1);\n setCursorCol(0);\n return;\n }\n\n // Backspace\n if (key.backspace || key.delete) {\n if (cursorCol > 0) {\n const currentLine = lines[cursorLine] ?? '';\n const newLine = currentLine.slice(0, cursorCol - 1) + currentLine.slice(cursorCol);\n const newLines = [...lines];\n newLines[cursorLine] = newLine;\n setLines(newLines);\n setCursorCol(cursorCol - 1);\n } else if (cursorLine > 0) {\n // Merge with previous line\n const prevLine = lines[cursorLine - 1] ?? '';\n const currentLine = lines[cursorLine] ?? '';\n const newLines = [...lines];\n newLines[cursorLine - 1] = prevLine + currentLine;\n newLines.splice(cursorLine, 1);\n setLines(newLines);\n setCursorLine(cursorLine - 1);\n setCursorCol(prevLine.length);\n }\n return;\n }\n\n // Arrow keys for cursor movement\n if (key.leftArrow) {\n if (cursorCol > 0) {\n setCursorCol(cursorCol - 1);\n } else if (cursorLine > 0) {\n setCursorLine(cursorLine - 1);\n setCursorCol((lines[cursorLine - 1] ?? '').length);\n }\n return;\n }\n if (key.rightArrow) {\n const currentLine = lines[cursorLine] ?? '';\n if (cursorCol < currentLine.length) {\n setCursorCol(cursorCol + 1);\n } else if (cursorLine < lines.length - 1) {\n setCursorLine(cursorLine + 1);\n setCursorCol(0);\n }\n return;\n }\n if (key.upArrow) {\n if (cursorLine > 0) {\n setCursorLine(cursorLine - 1);\n const prevLen = (lines[cursorLine - 1] ?? '').length;\n setCursorCol(Math.min(cursorCol, prevLen));\n }\n return;\n }\n if (key.downArrow) {\n if (cursorLine < lines.length - 1) {\n setCursorLine(cursorLine + 1);\n const nextLen = (lines[cursorLine + 1] ?? '').length;\n setCursorCol(Math.min(cursorCol, nextLen));\n }\n return;\n }\n\n // Ignore other control sequences\n if (key.ctrl || key.meta) return;\n // Escape is handled by useKeyboard (exits instructions view)\n if (key.escape) return;\n if (key.tab) {\n // Insert two spaces for tab\n const currentLine = lines[cursorLine] ?? '';\n const newLine = currentLine.slice(0, cursorCol) + ' ' + currentLine.slice(cursorCol);\n const newLines = [...lines];\n newLines[cursorLine] = newLine;\n setLines(newLines);\n setCursorCol(cursorCol + 2);\n return;\n }\n\n // Regular character input\n if (input && input.length > 0) {\n const currentLine = lines[cursorLine] ?? '';\n const newLine = currentLine.slice(0, cursorCol) + input + currentLine.slice(cursorCol);\n const newLines = [...lines];\n newLines[cursorLine] = newLine;\n setLines(newLines);\n setCursorCol(cursorCol + input.length);\n }\n });\n\n const hasContent = lines.some((l) => l.trim().length > 0);\n\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1} overflow=\"hidden\">\n {/* Header */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\" marginBottom={1}>\n <Text bold color=\"cyan\">New Instructions</Text>\n <Box gap={2}>\n <Text dimColor>\n {isPaused ? (\n <Text color=\"yellow\" bold>PAUSED</Text>\n ) : (\n <Text color=\"green\">RUNNING</Text>\n )}\n </Text>\n </Box>\n </Box>\n\n {/* Pause/Resume control */}\n <Box marginBottom={1}>\n <Text dimColor>\n Orchestrator: {isPaused ? (\n <Text color=\"yellow\">Paused — agents stopped. </Text>\n ) : (\n <Text color=\"green\">Running. </Text>\n )}\n Press <Text bold>ctrl+p</Text> to {isPaused ? 'resume' : 'pause'}.\n </Text>\n </Box>\n\n {/* Instructions area */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={isDecomposing ? 'yellow' : submitted ? 'green' : 'gray'}\n paddingX={1}\n paddingY={0}\n flexGrow={1}\n overflow=\"hidden\"\n >\n <Text dimColor>\n {isDecomposing\n ? 'Decomposing instructions into tasks...'\n : 'Type or paste instructions below. Press ctrl+s to submit, ctrl+x to clear.'}\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {lines.map((line, idx) => {\n if (idx === cursorLine && !isDecomposing) {\n // Render line with cursor indicator\n const before = line.slice(0, cursorCol);\n const cursorChar = line[cursorCol] ?? ' ';\n const after = line.slice(cursorCol + 1);\n return (\n <Box key={idx}>\n <Text>{before}</Text>\n <Text inverse>{cursorChar}</Text>\n <Text>{after}</Text>\n </Box>\n );\n }\n return <Text key={idx}>{line || ' '}</Text>;\n })}\n </Box>\n </Box>\n\n {/* Status line */}\n <Box marginTop={1} gap={3}>\n <Text dimColor>\n {lines.length} line{lines.length !== 1 ? 's' : ''} | col {cursorCol + 1}\n </Text>\n {hasContent && !isDecomposing && (\n <Text color=\"cyan\">ctrl+s: Submit</Text>\n )}\n {hasContent && !isDecomposing && (\n <Text dimColor>ctrl+x: Clear</Text>\n )}\n <Text dimColor>esc: Back</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { ViewMode } from '../hooks/useKeyboard.js';\n\ninterface StatusBarProps {\n viewMode: ViewMode;\n onChangeView: (mode: ViewMode) => void;\n isPaused?: boolean;\n}\n\ninterface KeyHint {\n key: string;\n label: string;\n active?: boolean;\n}\n\nexport function StatusBar({ viewMode, isPaused }: StatusBarProps): React.ReactElement {\n const isDetail = viewMode === 'agent-detail' || viewMode === 'task-detail';\n\n const hints: KeyHint[] = viewMode === 'instructions'\n ? [\n { key: 'esc', label: 'Back', active: true },\n { key: 'ctrl+s', label: 'Submit' },\n { key: 'ctrl+p', label: isPaused ? 'Resume' : 'Pause' },\n { key: 'ctrl+x', label: 'Clear' },\n ]\n : isDetail\n ? [\n { key: 'esc', label: 'Back to list', active: true },\n ...(viewMode === 'agent-detail' ? [{ key: 'tab', label: 'Switch agent' }] : []),\n ...(viewMode === 'task-detail' ? [{ key: 'arrows', label: 'Navigate tasks' }] : []),\n { key: 'q', label: 'Quit' },\n ]\n : [\n { key: 'q', label: 'Quit' },\n { key: 'enter', label: 'View detail' },\n ...(viewMode === 'agents' ? [{ key: 'tab', label: 'Switch agent' }] : []),\n ...(viewMode === 'tasks' ? [{ key: 'arrows', label: 'Navigate' }] : []),\n { key: 'a', label: 'Agents', active: viewMode === 'agents' },\n { key: 't', label: 'Tasks', active: viewMode === 'tasks' },\n { key: 'l', label: 'Logs', active: viewMode === 'logs' },\n { key: 'i', label: 'Instructions' },\n { key: 'p', label: isPaused ? 'Resume' : 'Pause' },\n ];\n\n return (\n <Box\n flexDirection=\"row\"\n paddingX={1}\n borderStyle=\"single\"\n borderColor=\"gray\"\n justifyContent=\"center\"\n gap={2}\n >\n {hints.map((hint) => (\n <Box key={hint.key} gap={0}>\n <Text bold color={hint.active ? 'cyan' : 'white'}>\n {hint.key}\n </Text>\n <Text dimColor={!hint.active}>\n : {hint.label}\n </Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import React from 'react';\nimport type { Orchestrator, Task, TaskUpdate } from '@maestroai/core';\n\nexport function useTaskManager(orchestrator: Orchestrator): Task[] {\n const [tasks, setTasks] = React.useState<Task[]>([]);\n\n React.useEffect(() => {\n const handleLoaded = (loadedTasks: Task[]) => {\n setTasks(loadedTasks);\n };\n\n const handleCreated = (task: Task) => {\n setTasks((prev) => {\n const existing = prev.findIndex((t) => t.id === task.id);\n if (existing >= 0) {\n const next = [...prev];\n next[existing] = task;\n return next;\n }\n return [...prev, task];\n });\n };\n\n const handleUpdated = (task: Task, _changes: TaskUpdate) => {\n setTasks((prev) =>\n prev.map((t) => (t.id === task.id ? task : t))\n );\n };\n\n const handleCompleted = (task: Task) => {\n setTasks((prev) =>\n prev.map((t) => (t.id === task.id ? { ...task, status: 'done' as const } : t))\n );\n };\n\n const handleAssigned = (task: Task, agentId: string) => {\n setTasks((prev) =>\n prev.map((t) => (t.id === task.id ? { ...task, status: 'in-progress' as const, assignee: agentId } : t))\n );\n };\n\n orchestrator.on('tasks:loaded', handleLoaded);\n orchestrator.on('task:created', handleCreated);\n orchestrator.on('task:updated', handleUpdated);\n orchestrator.on('task:completed', handleCompleted);\n orchestrator.on('task:assigned', handleAssigned);\n\n // Also try to load existing tasks (in case orchestrator already started)\n orchestrator.getTasks().then((existing) => {\n if (existing.length > 0) {\n setTasks(existing);\n }\n }).catch(() => {\n // Orchestrator may not be started yet — tasks:loaded event will fire later\n });\n\n return () => {\n orchestrator.off('tasks:loaded', handleLoaded);\n orchestrator.off('task:created', handleCreated);\n orchestrator.off('task:updated', handleUpdated);\n orchestrator.off('task:completed', handleCompleted);\n orchestrator.off('task:assigned', handleAssigned);\n };\n }, [orchestrator]);\n\n return tasks;\n}\n","import React from 'react';\nimport { useInput } from 'ink';\n\nexport type ViewMode = 'agents' | 'tasks' | 'task-detail' | 'logs' | 'agent-detail' | 'instructions';\n\ninterface KeyboardState {\n selectedAgentIndex: number;\n selectedTaskIndex: number;\n viewMode: ViewMode;\n setSelectedAgentIndex: (index: number) => void;\n setSelectedTaskIndex: (index: number) => void;\n setViewMode: (mode: ViewMode) => void;\n}\n\n/**\n * @param agentCount - Total number of items in the agents list\n * (orchestrator + actual agents). The orchestrator is always index 0.\n * @param taskCount - Total number of tasks in the task list\n */\nexport function useKeyboard(agentCount: number, taskCount = 0): KeyboardState {\n const [selectedAgentIndex, setSelectedAgentIndex] = React.useState(0);\n const [selectedTaskIndex, setSelectedTaskIndex] = React.useState(0);\n const [viewMode, setViewMode] = React.useState<ViewMode>('agents');\n\n useInput((input, key) => {\n // When in instructions view, only escape leaves — all other input\n // is handled by the InstructionsPanel text area.\n if (viewMode === 'instructions') {\n if (key.escape) {\n setViewMode('agents');\n }\n return;\n }\n\n // Enter opens detail view for the selected agent or task\n if (key.return) {\n if (viewMode === 'agents') {\n setViewMode('agent-detail');\n return;\n }\n if (viewMode === 'tasks' && taskCount > 0) {\n setViewMode('task-detail');\n return;\n }\n }\n\n // Escape returns from detail views\n if (key.escape) {\n if (viewMode === 'agent-detail') {\n setViewMode('agents');\n return;\n }\n if (viewMode === 'task-detail') {\n setViewMode('tasks');\n return;\n }\n }\n\n // Tab to cycle through agents (only in agents/agent-detail views)\n if (key.tab && (viewMode === 'agents' || viewMode === 'agent-detail')) {\n setSelectedAgentIndex((prev) => {\n if (agentCount === 0) return 0;\n return (prev + 1) % agentCount;\n });\n }\n\n // Arrow keys for selection\n if (key.upArrow) {\n if (viewMode === 'agents' || viewMode === 'agent-detail') {\n setSelectedAgentIndex((prev) => {\n if (agentCount === 0) return 0;\n return prev > 0 ? prev - 1 : agentCount - 1;\n });\n }\n if (viewMode === 'tasks' || viewMode === 'task-detail') {\n setSelectedTaskIndex((prev) => {\n if (taskCount === 0) return 0;\n return prev > 0 ? prev - 1 : taskCount - 1;\n });\n }\n }\n\n if (key.downArrow) {\n if (viewMode === 'agents' || viewMode === 'agent-detail') {\n setSelectedAgentIndex((prev) => {\n if (agentCount === 0) return 0;\n return (prev + 1) % agentCount;\n });\n }\n if (viewMode === 'tasks' || viewMode === 'task-detail') {\n setSelectedTaskIndex((prev) => {\n if (taskCount === 0) return 0;\n return (prev + 1) % taskCount;\n });\n }\n }\n\n // View mode shortcuts (only when not in detail views)\n if (viewMode !== 'agent-detail' && viewMode !== 'task-detail') {\n if (input === 'a') {\n setViewMode('agents');\n }\n\n if (input === 't') {\n setViewMode('tasks');\n }\n\n if (input === 'l') {\n setViewMode('logs');\n }\n\n if (input === 'i') {\n setViewMode('instructions');\n }\n }\n });\n\n // Clamp selected indices if items are removed\n React.useEffect(() => {\n if (agentCount > 0 && selectedAgentIndex >= agentCount) {\n setSelectedAgentIndex(agentCount - 1);\n }\n }, [agentCount, selectedAgentIndex]);\n\n React.useEffect(() => {\n if (taskCount > 0 && selectedTaskIndex >= taskCount) {\n setSelectedTaskIndex(taskCount - 1);\n }\n }, [taskCount, selectedTaskIndex]);\n\n return {\n selectedAgentIndex,\n selectedTaskIndex,\n viewMode,\n setSelectedAgentIndex,\n setSelectedTaskIndex,\n setViewMode,\n };\n}\n","import { useState, useEffect } from 'react';\nimport type { Orchestrator } from '@maestroai/core';\nimport type { PlanProposal, UserQuestion, ProgressReport, MilestoneEvent } from '@maestroai/core';\n\nexport interface FeedbackState {\n pendingPlan: PlanProposal | null;\n questions: UserQuestion[];\n latestReport: ProgressReport | null;\n milestone: MilestoneEvent | null;\n interactionMode: string;\n}\n\nexport function useFeedback(orchestrator: Orchestrator): FeedbackState & {\n decidePlan: (proposalId: string, decision: 'approved' | 'rejected') => void;\n answerQuestion: (questionId: string, answer: string) => void;\n acknowledgeMilestone: (milestoneId: string) => void;\n} {\n const [pendingPlan, setPendingPlan] = useState<PlanProposal | null>(null);\n const [questions, setQuestions] = useState<UserQuestion[]>([]);\n const [latestReport, setLatestReport] = useState<ProgressReport | null>(null);\n const [milestone, setMilestone] = useState<MilestoneEvent | null>(null);\n const [interactionMode, setInteractionMode] = useState('supervised');\n\n useEffect(() => {\n const onPlan = (proposal: PlanProposal) => setPendingPlan(proposal);\n const onPlanDecided = () => setPendingPlan(null);\n const onQuestion = (q: UserQuestion) => setQuestions((prev) => [...prev, q]);\n const onQuestionAnswered = (qId: string) => setQuestions((prev) => prev.filter((q) => q.id !== qId));\n const onProgress = (report: ProgressReport) => setLatestReport(report);\n const onMilestone = (m: MilestoneEvent) => setMilestone(m);\n const onMilestoneAck = () => setMilestone(null);\n const onModeChanged = (mode: string) => setInteractionMode(mode);\n\n orchestrator.on('plan:proposed', onPlan);\n orchestrator.on('plan:decided', onPlanDecided);\n orchestrator.on('question:asked', onQuestion);\n orchestrator.on('question:answered', onQuestionAnswered);\n orchestrator.on('progress:report', onProgress);\n orchestrator.on('milestone:reached', onMilestone);\n orchestrator.on('milestone:acknowledged', onMilestoneAck);\n orchestrator.on('interaction-mode:changed', onModeChanged);\n\n // Check for already-pending plan/questions in case events fired\n // before this hook subscribed (e.g. TUI rendered after start())\n const existingPlan = orchestrator.getPendingPlan();\n if (existingPlan) setPendingPlan(existingPlan);\n const existingQuestions = orchestrator.getPendingQuestions();\n if (existingQuestions.length > 0) setQuestions(existingQuestions);\n\n return () => {\n orchestrator.off('plan:proposed', onPlan);\n orchestrator.off('plan:decided', onPlanDecided);\n orchestrator.off('question:asked', onQuestion);\n orchestrator.off('question:answered', onQuestionAnswered);\n orchestrator.off('progress:report', onProgress);\n orchestrator.off('milestone:reached', onMilestone);\n orchestrator.off('milestone:acknowledged', onMilestoneAck);\n orchestrator.off('interaction-mode:changed', onModeChanged);\n };\n }, [orchestrator]);\n\n const decidePlan = (proposalId: string, decision: 'approved' | 'rejected') => {\n orchestrator.decidePlan(proposalId, decision);\n };\n\n const answerQuestion = (questionId: string, answer: string) => {\n orchestrator.answerQuestion(questionId, answer);\n };\n\n const ackMilestone = (milestoneId: string) => {\n orchestrator.acknowledgeMilestone(milestoneId);\n setMilestone(null);\n };\n\n return {\n pendingPlan,\n questions,\n latestReport,\n milestone,\n interactionMode,\n decidePlan,\n answerQuestion,\n acknowledgeMilestone: ackMilestone,\n };\n}\n","import React from 'react';\nimport type { Orchestrator, OrchestratorActivity } from '@maestroai/core';\n\nconst MAX_ACTIVITIES = 200;\n\nexport function useOrchestratorActivity(orchestrator: Orchestrator): OrchestratorActivity[] {\n const [activities, setActivities] = React.useState<OrchestratorActivity[]>([]);\n\n React.useEffect(() => {\n const handleActivity = (activity: OrchestratorActivity) => {\n setActivities((prev) => {\n const next = [...prev, activity];\n // Keep a rolling window to prevent memory growth\n if (next.length > MAX_ACTIVITIES) {\n return next.slice(-MAX_ACTIVITIES);\n }\n return next;\n });\n };\n\n orchestrator.on('orchestrator:activity', handleActivity);\n return () => {\n orchestrator.off('orchestrator:activity', handleActivity);\n };\n }, [orchestrator]);\n\n return activities;\n}\n","import React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { PlanProposal } from '@maestroai/core';\n\ninterface PlanReviewProps {\n proposal: PlanProposal;\n onDecide: (proposalId: string, decision: 'approved' | 'rejected') => void;\n}\n\nexport function PlanReview({ proposal, onDecide }: PlanReviewProps): React.ReactElement {\n useInput((input) => {\n if (input === 'y' || input === 'Y') {\n onDecide(proposal.id, 'approved');\n } else if (input === 'n' || input === 'N') {\n onDecide(proposal.id, 'rejected');\n }\n });\n\n const priorityColor = (p: string) => {\n switch (p) {\n case 'critical': return 'red';\n case 'high': return 'yellow';\n case 'medium': return 'cyan';\n default: return 'gray';\n }\n };\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"double\" borderColor=\"cyan\" paddingX={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">Plan Review</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>Goal: </Text>\n <Text>{proposal.projectGoal.slice(0, 80)}{proposal.projectGoal.length > 80 ? '...' : ''}</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text bold>Proposed Tasks ({proposal.tasks.length}):</Text>\n </Box>\n\n {proposal.tasks.map((task, i) => (\n <Box key={i} paddingLeft={1}>\n <Text dimColor>{String(i + 1).padStart(2, ' ')}. </Text>\n <Text color={priorityColor(task.priority)}>[{task.priority.slice(0, 4).toUpperCase()}] </Text>\n <Text>{task.title}</Text>\n {task.tags.length > 0 && <Text dimColor> ({task.tags.join(', ')})</Text>}\n </Box>\n ))}\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text>\n Press <Text bold color=\"green\">y</Text> to approve, <Text bold color=\"red\">n</Text> to reject\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { UserQuestion } from '@maestroai/core';\n\ninterface QuestionPromptProps {\n question: UserQuestion;\n onAnswer: (questionId: string, answer: string) => void;\n onSkip: (questionId: string) => void;\n}\n\nexport function QuestionPrompt({ question, onAnswer, onSkip }: QuestionPromptProps): React.ReactElement {\n const [selectedOption, setSelectedOption] = useState(0);\n const [freeText, setFreeText] = useState('');\n const [mode, setMode] = useState<'options' | 'freetext'>(\n question.options && question.options.length > 0 ? 'options' : 'freetext'\n );\n\n useInput((input, key) => {\n if (mode === 'options' && question.options) {\n if (key.upArrow) {\n setSelectedOption((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedOption((prev) => Math.min(question.options!.length - 1, prev + 1));\n } else if (key.return) {\n onAnswer(question.id, question.options![selectedOption]);\n } else if (input === 't' || input === 'T') {\n setMode('freetext');\n } else if (input === 's' || input === 'S') {\n onSkip(question.id);\n }\n } else if (mode === 'freetext') {\n if (key.return && freeText.trim()) {\n onAnswer(question.id, freeText.trim());\n } else if (key.escape) {\n if (question.options && question.options.length > 0) {\n setMode('options');\n }\n } else if (key.backspace || key.delete) {\n setFreeText((prev) => prev.slice(0, -1));\n } else if (input && !key.ctrl && !key.meta) {\n setFreeText((prev) => prev + input);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"yellow\" paddingX={1}>\n <Box marginBottom={1}>\n <Text bold color=\"yellow\">Question from {question.fromAgent}</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text>{question.question}</Text>\n </Box>\n\n {question.context && (\n <Box marginBottom={1}>\n <Text dimColor>Context: {question.context}</Text>\n </Box>\n )}\n\n {mode === 'options' && question.options && (\n <>\n {question.options.map((opt, i) => (\n <Box key={i} paddingLeft={1}>\n <Text color={i === selectedOption ? 'cyan' : undefined}>\n {i === selectedOption ? '> ' : ' '}{opt}\n </Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text dimColor>Up/Down to select, Enter to confirm, t for free text, s to skip</Text>\n </Box>\n </>\n )}\n\n {mode === 'freetext' && (\n <Box marginTop={1}>\n <Text dimColor>{'> '}</Text>\n <Text>{freeText}<Text dimColor>_</Text></Text>\n <Box marginLeft={2}>\n <Text dimColor>Enter to submit{question.options ? ', Esc for options' : ''}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ProgressReport, MilestoneEvent } from '@maestroai/core';\n\ninterface ProgressSummaryProps {\n report: ProgressReport | null;\n milestone: MilestoneEvent | null;\n onAcknowledge: (milestoneId: string) => void;\n}\n\nexport function ProgressSummary({ report, milestone, onAcknowledge }: ProgressSummaryProps): React.ReactElement {\n useInput((input) => {\n if (milestone && milestone.requiresAck && (input === 'c' || input === 'C' || input === ' ')) {\n onAcknowledge(milestone.id);\n }\n });\n\n if (!report && !milestone) {\n return <Box />;\n }\n\n // Build a simple progress bar\n const percent = report?.percentComplete ?? 0;\n const barWidth = 30;\n const filled = Math.round((percent / 100) * barWidth);\n const bar = '\\u2588'.repeat(filled) + '\\u2591'.repeat(barWidth - filled);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={milestone ? 'green' : 'blue'} paddingX={1}>\n {milestone && (\n <Box marginBottom={1}>\n <Text bold color=\"green\">{milestone.name}</Text>\n <Text> -- </Text>\n <Text>{milestone.message}</Text>\n </Box>\n )}\n\n {report && (\n <>\n <Box>\n <Text dimColor>Phase: </Text>\n <Text bold>{report.phase}</Text>\n <Text dimColor> | </Text>\n <Text>{report.completedTasks}/{report.totalTasks} tasks</Text>\n <Text dimColor> | </Text>\n <Text>${report.totalCostUsd.toFixed(4)}</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"cyan\">{bar}</Text>\n <Text> {percent.toFixed(0)}%</Text>\n </Box>\n\n {report.blockers.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"red\" bold>Blockers:</Text>\n {report.blockers.map((b, i) => (\n <Text key={i} color=\"red\"> * {b}</Text>\n ))}\n </Box>\n )}\n </>\n )}\n\n {milestone && milestone.requiresAck && (\n <Box marginTop={1}>\n <Text dimColor>Press <Text bold>c</Text> or <Text bold>space</Text> to continue</Text>\n </Box>\n )}\n </Box>\n );\n}\n"],"mappings":"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","names":["React","path","Box","Text","useInput","Box","Box","Text","Box","Text","jsx","jsxs","truncated","jsx","jsxs","Box","Text","Box","Text","figures","jsx","jsxs","formatTime","React","Box","Text","figures","Fragment","jsx","jsxs","formatTokenCount","React","formatTime","Box","Text","figures","getStatusColor","KIND_COLORS","logPath","entries","displayEntries","Box","Text","figures","jsx","jsxs","getStatusIcon","getStatusColor","React","Box","Text","figures","jsx","jsxs","getStatusColor","getStatusIcon","formatTime","React","Box","Text","jsx","jsxs","jsx","jsxs","Box","Box","Text","jsx","jsxs","React","React","useInput","React","Box","Text","useInput","jsx","jsxs","useState","Box","Text","useInput","Fragment","jsx","jsxs","Box","Text","useInput","Fragment","jsx","jsxs","Fragment","jsx","jsxs","React","useInput","path","Box","Text","agentTokens"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@maestroai/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "CLI for Maestro - orchestrate multiple Claude Code agents working as a team",
|
|
6
|
+
"bin": {
|
|
7
|
+
"maestro": "./dist/bin/maestro.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"chalk": "^5.4.0",
|
|
15
|
+
"commander": "^13.1.0",
|
|
16
|
+
"figures": "^6.1.0",
|
|
17
|
+
"ink": "^5.1.0",
|
|
18
|
+
"ink-spinner": "^5.0.0",
|
|
19
|
+
"react": "^18.3.0",
|
|
20
|
+
"@maestroai/core": "0.1.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/react": "^18.3.0",
|
|
24
|
+
"tsup": "^8.5.1",
|
|
25
|
+
"typescript": "^5.7.0"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=20.0.0"
|
|
32
|
+
},
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/maestroai/maestro.git",
|
|
36
|
+
"directory": "packages/cli"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"maestro",
|
|
40
|
+
"cli",
|
|
41
|
+
"agents",
|
|
42
|
+
"orchestration",
|
|
43
|
+
"claude",
|
|
44
|
+
"ai"
|
|
45
|
+
],
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsup",
|
|
48
|
+
"dev": "tsup --watch",
|
|
49
|
+
"typecheck": "tsc --noEmit"
|
|
50
|
+
}
|
|
51
|
+
}
|