sisyphi 0.1.21 → 0.1.23

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.
Files changed (60) hide show
  1. package/dist/chunk-KQBSC5KY.js +31 -0
  2. package/dist/chunk-KQBSC5KY.js.map +1 -0
  3. package/dist/{chunk-LTAW6OWS.js → chunk-YGBGKMTF.js} +31 -6
  4. package/dist/chunk-YGBGKMTF.js.map +1 -0
  5. package/dist/chunk-ZE2SKB4B.js +35 -0
  6. package/dist/chunk-ZE2SKB4B.js.map +1 -0
  7. package/dist/cli.js +638 -51
  8. package/dist/cli.js.map +1 -1
  9. package/dist/daemon.js +915 -289
  10. package/dist/daemon.js.map +1 -1
  11. package/dist/paths-FYYSBD27.js +58 -0
  12. package/dist/paths-FYYSBD27.js.map +1 -0
  13. package/dist/templates/CLAUDE.md +21 -20
  14. package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -0
  15. package/dist/templates/agent-plugin/agents/debug.md +1 -0
  16. package/dist/templates/agent-plugin/agents/operator.md +1 -2
  17. package/dist/templates/agent-plugin/agents/plan.md +86 -55
  18. package/dist/templates/agent-plugin/agents/review-plan.md +1 -0
  19. package/dist/templates/agent-plugin/agents/spec-draft.md +1 -0
  20. package/dist/templates/agent-plugin/hooks/hooks.json +19 -1
  21. package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  22. package/dist/templates/agent-plugin/hooks/require-submit.sh +24 -0
  23. package/dist/templates/agent-suffix.md +18 -0
  24. package/dist/templates/dashboard-claude.md +38 -0
  25. package/dist/templates/orchestrator-base.md +270 -0
  26. package/dist/templates/orchestrator-impl.md +116 -0
  27. package/dist/templates/orchestrator-planning.md +131 -0
  28. package/dist/templates/orchestrator-plugin/hooks/hooks.json +1 -15
  29. package/dist/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
  30. package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
  31. package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
  32. package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
  33. package/dist/tui.js +3236 -0
  34. package/dist/tui.js.map +1 -0
  35. package/package.json +5 -1
  36. package/templates/CLAUDE.md +21 -20
  37. package/templates/agent-plugin/agents/CLAUDE.md +2 -0
  38. package/templates/agent-plugin/agents/debug.md +1 -0
  39. package/templates/agent-plugin/agents/operator.md +1 -2
  40. package/templates/agent-plugin/agents/plan.md +86 -55
  41. package/templates/agent-plugin/agents/review-plan.md +1 -0
  42. package/templates/agent-plugin/agents/spec-draft.md +1 -0
  43. package/templates/agent-plugin/hooks/hooks.json +19 -1
  44. package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  45. package/templates/agent-plugin/hooks/require-submit.sh +24 -0
  46. package/templates/agent-suffix.md +18 -0
  47. package/templates/dashboard-claude.md +38 -0
  48. package/templates/orchestrator-base.md +270 -0
  49. package/templates/orchestrator-impl.md +116 -0
  50. package/templates/orchestrator-planning.md +131 -0
  51. package/templates/orchestrator-plugin/hooks/hooks.json +1 -15
  52. package/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
  53. package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
  54. package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
  55. package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
  56. package/dist/chunk-LTAW6OWS.js.map +0 -1
  57. package/dist/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
  58. package/dist/templates/orchestrator.md +0 -173
  59. package/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
  60. package/templates/orchestrator.md +0 -173
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tui/index.tsx","../src/tui/App.tsx","../src/tui/components/SessionTree.tsx","../src/tui/lib/tree-render.ts","../src/tui/lib/format.ts","../src/tui/components/SessionDetail.tsx","../src/tui/components/PlanView.tsx","../src/tui/components/LogsPanel.tsx","../src/tui/components/CycleDetail.tsx","../src/tui/components/AgentDetail.tsx","../src/tui/components/ReportView.tsx","../src/tui/components/MessageLog.tsx","../src/tui/components/InputBar.tsx","../src/tui/components/StatusLine.tsx","../src/tui/components/LeaderOverlay.tsx","../src/tui/components/HelpOverlay.tsx","../src/tui/hooks/usePolling.ts","../src/tui/lib/client.ts","../src/tui/lib/tmux.ts","../src/tui/hooks/useKeybindings.ts","../src/tui/hooks/useLeaderKey.ts","../src/tui/lib/reports.ts","../src/tui/lib/clipboard.ts","../src/tui/lib/context.ts","../src/tui/lib/tree.ts"],"sourcesContent":["import React from 'react';\nimport { render } from 'ink';\nimport { App } from './App.js';\n\nconst args = process.argv.slice(2);\n\nfunction getArg(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n if (idx !== -1 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n return undefined;\n}\n\nconst cwd = getArg('cwd') ?? process.cwd();\n\nrender(<App cwd={cwd} />);\n","import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { Box, Text, useApp, useStdout } from 'ink';\nimport { SessionTree } from './components/SessionTree.js';\nimport { SessionDetail } from './components/SessionDetail.js';\nimport { LogsPanel } from './components/LogsPanel.js';\nimport { CycleDetail } from './components/CycleDetail.js';\nimport { AgentDetail } from './components/AgentDetail.js';\nimport { ReportView } from './components/ReportView.js';\nimport { MessageLog } from './components/MessageLog.js';\nimport { InputBar, type InputMode } from './components/InputBar.js';\nimport { StatusLine } from './components/StatusLine.js';\nimport { LeaderOverlay } from './components/LeaderOverlay.js';\nimport { HelpOverlay } from './components/HelpOverlay.js';\nimport { usePolling } from './hooks/usePolling.js';\nimport { useKeybindings } from './hooks/useKeybindings.js';\nimport { useLeaderKey } from './hooks/useLeaderKey.js';\nimport { send } from './lib/client.js';\nimport { resolveReports } from './lib/reports.js';\nimport { copyToClipboard } from './lib/clipboard.js';\nimport { buildSessionContext } from './lib/context.js';\nimport { buildTree, findParentIndex } from './lib/tree.js';\nimport {\n openCompanionPopup,\n openEditorPopup,\n editInPopup,\n selectWindow,\n selectPane,\n switchToSession,\n openLogPopup,\n openShellPopup,\n openInFileManager,\n} from './lib/tmux.js';\nimport { wrapText, formatTime } from './lib/format.js';\nimport { goalPath, roadmapPath, sessionDir } from '../shared/paths.js';\nimport { loadConfig } from '../shared/config.js';\nimport type { Request } from '../shared/protocol.js';\nimport type { TreeNode } from './types/tree.js';\n\ninterface Props {\n cwd: string;\n}\n\nfunction resolveEditor(configEditor: string | undefined): string {\n if (configEditor) return configEditor;\n if (process.env.EDITOR) return process.env.EDITOR;\n return 'nvim';\n}\n\nexport function App({ cwd }: Props) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const rows = stdout.rows || 24;\n const cols = stdout.columns || 80;\n const config = loadConfig(cwd);\n\n // Tree state\n const [cursorIndex, setCursorIndex] = useState(0);\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const [mode, setMode] = useState<InputMode>('navigate');\n const [notification, setNotification] = useState<string | null>(null);\n const [selectedSessionId, setSelectedSessionId] = useState<string | null>(null);\n const [detailScrollOffset, setDetailScrollOffset] = useState(0);\n const [logsScrollOffset, setLogsScrollOffset] = useState(0);\n const [showLogs, setShowLogs] = useState(true);\n const [focusPane, setFocusPane] = useState<'tree' | 'detail' | 'logs'>('tree');\n const [searchFilter, setSearchFilter] = useState<string | null>(null);\n const [targetAgentId, setTargetAgentId] = useState<string | null>(null);\n const cursorNodeIdRef = useRef<string | null>(null);\n const prevNodesRef = useRef<TreeNode[]>([]);\n\n // Polling\n const { sessions, selectedSession, planContent, goalContent, logsContent, logsCycles, paneAlive, error } = usePolling(cwd, selectedSessionId);\n\n // Filter sessions for search\n const filteredSessions = useMemo(() => {\n if (!searchFilter) return sessions;\n const q = searchFilter.toLowerCase();\n return sessions.filter(\n (s) => s.task.toLowerCase().includes(q) || s.id.toLowerCase().includes(q),\n );\n }, [sessions, searchFilter]);\n\n // Build tree from current state\n const nodes = useMemo(\n () => buildTree(filteredSessions, selectedSession, expanded),\n [filteredSessions, selectedSession, expanded],\n );\n\n // Track cursor node identity: update ref only when cursor moved (nodes stable),\n // not when tree rebuilt (nodes changed underneath)\n if (nodes === prevNodesRef.current) {\n const node = nodes[cursorIndex];\n if (node) cursorNodeIdRef.current = node.id;\n } else if (cursorNodeIdRef.current === null && nodes.length > 0) {\n cursorNodeIdRef.current = nodes[0]?.id ?? null;\n }\n prevNodesRef.current = nodes;\n\n // Derive selectedSessionId from cursor position\n useEffect(() => {\n const node = nodes[cursorIndex];\n const id = node?.sessionId ?? null;\n if (id !== selectedSessionId) {\n setSelectedSessionId(id);\n }\n }, [nodes, cursorIndex, selectedSessionId]);\n\n // Reset scroll offsets when cursor changes\n useEffect(() => {\n setDetailScrollOffset(0);\n setLogsScrollOffset(0);\n }, [cursorIndex]);\n\n // Stabilize cursor position when tree structure changes\n useEffect(() => {\n if (nodes.length === 0) {\n setCursorIndex(0);\n return;\n }\n const targetId = cursorNodeIdRef.current;\n if (!targetId) {\n cursorNodeIdRef.current = nodes[0]?.id ?? null;\n return;\n }\n // If current index already points to the right node, no adjustment needed\n if (nodes[cursorIndex]?.id === targetId) return;\n\n // Find the tracked node in the new tree\n const newIndex = nodes.findIndex((n) => n.id === targetId);\n if (newIndex !== -1) {\n setCursorIndex(newIndex);\n } else {\n // Node is gone (parent collapsed, session removed, etc.) — clamp\n const clamped = Math.min(cursorIndex, nodes.length - 1);\n setCursorIndex(clamped);\n cursorNodeIdRef.current = nodes[clamped]?.id ?? null;\n }\n }, [nodes]);\n\n // Auto-expand latest cycle when session data loads (only if session already expanded)\n const prevCycleCountRef = useRef<number>(0);\n useEffect(() => {\n if (!selectedSession) return;\n const sessionNodeId = `session:${selectedSession.id}`;\n const cycles = selectedSession.orchestratorCycles;\n\n setExpanded((prev) => {\n // Only auto-manage cycle expansion if the session is already expanded by user\n if (!prev.has(sessionNodeId)) {\n prevCycleCountRef.current = cycles.length;\n return prev;\n }\n if (cycles.length === 0) {\n prevCycleCountRef.current = 0;\n return prev;\n }\n\n const latest = cycles[cycles.length - 1]!;\n const latestId = `cycle:${selectedSession.id}:${latest.cycle}`;\n\n let next = prev;\n if (cycles.length > prevCycleCountRef.current && prevCycleCountRef.current > 0) {\n // New cycle appeared — collapse previous, expand latest\n const prevCycle = cycles[cycles.length - 2];\n if (prevCycle) {\n const prevId = `cycle:${selectedSession.id}:${prevCycle.cycle}`;\n next = new Set(prev);\n next.delete(prevId);\n next.add(latestId);\n }\n } else if (!prev.has(latestId)) {\n // Ensure latest is expanded\n next = new Set(prev);\n next.add(latestId);\n }\n\n prevCycleCountRef.current = cycles.length;\n return next;\n });\n }, [selectedSession?.orchestratorCycles.length, selectedSession?.id]);\n\n // Clear notification\n useEffect(() => {\n if (!notification) return;\n const t = setTimeout(() => setNotification(null), 3000);\n return () => clearTimeout(t);\n }, [notification]);\n\n const notify = useCallback((msg: string) => setNotification(msg), []);\n\n const session = selectedSession;\n const agents = session?.agents ?? [];\n\n // Helper: get the current cursor node\n const cursorNode: TreeNode | undefined = nodes[cursorIndex];\n\n // Helper: find agent object for agent/report nodes\n const getAgentForNode = useCallback(\n (node: TreeNode | undefined) => {\n if (!node || !session) return null;\n if (node.type === 'agent') return agents.find((a) => a.id === node.agentId) ?? null;\n if (node.type === 'report') return agents.find((a) => a.id === node.agentId) ?? null;\n return null;\n },\n [session, agents],\n );\n\n // Send request and notify result\n const sendAndNotify = useCallback(\n async (request: Request, successMsg: string) => {\n try {\n const res = await send(request);\n notify(res.ok ? successMsg : `Error: ${res.error}`);\n } catch (err) {\n notify(`Error: ${(err as Error).message}`);\n }\n },\n [notify],\n );\n\n // Expand/collapse helpers\n const toggleExpand = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n return next;\n });\n },\n [],\n );\n\n const expandNode = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n if (prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.add(nodeId);\n return next;\n });\n },\n [],\n );\n\n const collapseNode = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n if (!prev.has(nodeId)) return prev;\n const next = new Set(prev);\n next.delete(nodeId);\n return next;\n });\n },\n [],\n );\n\n // Layout — fixed-width tree panel (computed early for keybinding handlers)\n const treeWidth = 36;\n const remainingWidth = cols - treeWidth;\n const detailWidth = showLogs ? Math.floor(remainingWidth * 0.6) : remainingWidth;\n const logsWidth = showLogs ? remainingWidth - detailWidth : 0;\n const contentHeight = rows - 3;\n\n // Keybindings (only active in navigate mode)\n useKeybindings(\n {\n onMoveUp: () => {\n if (focusPane === 'detail') {\n setDetailScrollOffset((o) => Math.max(0, o - 1));\n } else if (focusPane === 'logs') {\n setLogsScrollOffset((o) => Math.max(0, o - 1));\n } else {\n setCursorIndex((i) => Math.max(0, i - 1));\n }\n },\n onMoveDown: () => {\n if (focusPane === 'detail') {\n setDetailScrollOffset((o) => o + 1);\n } else if (focusPane === 'logs') {\n setLogsScrollOffset((o) => o + 1);\n } else {\n setCursorIndex((i) => Math.min(nodes.length - 1, i + 1));\n }\n },\n onLeft: () => {\n if (focusPane === 'logs') {\n setFocusPane('detail');\n return;\n }\n if (focusPane === 'detail') {\n setFocusPane('tree');\n return;\n }\n const node = nodes[cursorIndex];\n if (!node) return;\n if (node.expanded) {\n collapseNode(node.id);\n } else {\n // Jump to parent\n const parentIdx = findParentIndex(nodes, cursorIndex);\n if (parentIdx !== cursorIndex) setCursorIndex(parentIdx);\n }\n },\n onRight: () => {\n const node = nodes[cursorIndex];\n if (!node) return;\n if (node.expandable && !node.expanded) {\n expandNode(node.id);\n // Convenience: expanding a session also expands its latest cycle\n if (node.type === 'session' && selectedSession?.id === node.sessionId) {\n const cycles = selectedSession.orchestratorCycles;\n if (cycles.length > 0) {\n const latest = cycles[cycles.length - 1]!;\n expandNode(`cycle:${node.sessionId}:${latest.cycle}`);\n }\n }\n } else if (node.expandable && node.expanded) {\n // Move cursor to first child\n if (cursorIndex + 1 < nodes.length && nodes[cursorIndex + 1]!.depth > node.depth) {\n setCursorIndex(cursorIndex + 1);\n }\n }\n },\n onTab: () => {\n setFocusPane((f) => {\n if (f === 'tree') return 'detail';\n if (f === 'detail') return showLogs ? 'logs' : 'tree';\n return 'tree';\n });\n },\n onToggleLogs: () => {\n setShowLogs((prev) => {\n if (prev) {\n // Hiding: move focus away from logs if needed\n setFocusPane((f) => (f === 'logs' ? 'detail' : f));\n setLogsScrollOffset(0);\n }\n return !prev;\n });\n },\n onSpace: () => {\n setMode('leader');\n },\n onEnter: () => {\n const node = nodes[cursorIndex];\n if (!node) return;\n if (node.expandable && !node.expanded) {\n expandNode(node.id);\n // Convenience: expanding a session also expands its latest cycle\n if (node.type === 'session' && selectedSession?.id === node.sessionId) {\n const cycles = selectedSession.orchestratorCycles;\n if (cycles.length > 0) {\n const latest = cycles[cycles.length - 1]!;\n expandNode(`cycle:${node.sessionId}:${latest.cycle}`);\n }\n }\n } else if (node.type === 'report') {\n setMode('report-detail');\n }\n },\n onMessage: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n const editor = resolveEditor(config.editor);\n try {\n const content = editInPopup(cwd, editor);\n if (content) {\n void sendAndNotify(\n { type: 'message', sessionId: selectedSessionId, content },\n 'Message queued',\n );\n }\n } catch {\n notify('Failed to open editor');\n }\n },\n onKill: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n const node = nodes[cursorIndex];\n if (node && (node.type === 'agent' || node.type === 'report')) {\n const agentId = node.agentId;\n const agent = agents.find(a => a.id === agentId);\n if (agent?.status !== 'running') { notify(`Agent ${agentId} is not running`); return; }\n sendAndNotify({ type: 'kill-agent', sessionId: selectedSessionId, agentId }, `Killed ${agentId}`);\n } else {\n sendAndNotify({ type: 'kill', sessionId: selectedSessionId }, 'Session killed');\n }\n },\n onGoToWindow: () => {\n if (!session?.tmuxWindowId) { notify('No tmux window'); return; }\n if (session.tmuxSessionName) switchToSession(session.tmuxSessionName);\n selectWindow(session.tmuxWindowId);\n },\n onEditGoal: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n const gp = goalPath(cwd, selectedSessionId);\n const editor = resolveEditor(config.editor);\n try {\n openEditorPopup(cwd, editor, gp, { w: '80', h: '50%' });\n } catch {\n notify(`Failed to open goal in ${editor}`);\n }\n },\n onNewSession: () => {\n const editor = resolveEditor(config.editor);\n try {\n const content = editInPopup(cwd, editor);\n if (content) {\n void sendAndNotify(\n { type: 'start', task: content, cwd },\n 'Session created',\n );\n }\n } catch {\n notify('Failed to open editor');\n }\n },\n onClaude: () => {\n try {\n openCompanionPopup(cwd);\n } catch {\n notify('Failed to open companion popup');\n }\n },\n onOpenPlan: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n const pp = roadmapPath(cwd, selectedSessionId);\n const editor = resolveEditor(config.editor);\n try {\n openEditorPopup(cwd, editor, pp);\n } catch {\n notify(`Failed to open roadmap in ${editor}`);\n }\n },\n onQuit: () => exit(),\n onReRun: () => {\n const agent = getAgentForNode(cursorNode);\n if (!agent || !selectedSessionId) { notify('Select an agent to re-run'); return; }\n sendAndNotify({\n type: 'spawn',\n sessionId: selectedSessionId,\n agentType: agent.agentType,\n name: `${agent.name}-retry`,\n instruction: agent.instruction,\n }, `Re-spawned ${agent.name}`);\n },\n onJumpToPane: () => {\n const agent = getAgentForNode(cursorNode);\n if (!agent?.paneId) { notify('Select an agent with an active pane'); return; }\n if (session?.tmuxSessionName) switchToSession(session.tmuxSessionName);\n if (session?.tmuxWindowId) selectWindow(session.tmuxWindowId);\n selectPane(agent.paneId);\n },\n onResume: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n if (session?.status === 'active' && paneAlive) { notify('Session already active'); return; }\n setMode('resume');\n },\n onContinue: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n if (session?.status !== 'completed') { notify('Session not completed'); return; }\n setMode('continue');\n },\n onRestartAgent: () => {\n const agent = getAgentForNode(cursorNode);\n if (!agent || !selectedSessionId) { notify('Select an agent to restart'); return; }\n sendAndNotify(\n { type: 'restart-agent', sessionId: selectedSessionId, agentId: agent.id },\n `Restarted ${agent.id}`,\n );\n },\n onRollback: () => {\n if (!selectedSessionId) { notify('No session selected'); return; }\n setMode('rollback');\n },\n },\n mode === 'navigate',\n );\n\n // Leader key state machine\n useLeaderKey(mode, (action) => {\n switch (action.type) {\n case 'enter-copy-menu':\n setMode('copy-menu');\n break;\n\n case 'copy-path': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n const path = sessionDir(cwd, selectedSessionId);\n try {\n copyToClipboard(path);\n notify(`Copied path (${path})`);\n } catch {\n notify('Failed to copy to clipboard');\n }\n setMode('navigate');\n break;\n }\n\n case 'copy-context': {\n if (!selectedSessionId || !session) { notify('No session selected'); setMode('navigate'); break; }\n try {\n const xml = buildSessionContext(session, cwd);\n copyToClipboard(xml);\n notify(`Copied context (${xml.length} chars)`);\n } catch {\n notify('Failed to copy context');\n }\n setMode('navigate');\n break;\n }\n\n case 'copy-logs': {\n if (!logsContent) { notify('No logs content'); setMode('navigate'); break; }\n try {\n copyToClipboard(logsContent);\n notify(`Copied logs (${logsContent.length} chars)`);\n } catch {\n notify('Failed to copy to clipboard');\n }\n setMode('navigate');\n break;\n }\n\n case 'copy-session-id': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n try {\n copyToClipboard(selectedSessionId);\n notify(`Copied session ID (${selectedSessionId})`);\n } catch {\n notify('Failed to copy to clipboard');\n }\n setMode('navigate');\n break;\n }\n\n case 'delete-session': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n setMode('delete-confirm');\n break;\n }\n\n case 'open-logs': {\n try {\n openLogPopup();\n } catch {\n notify('Failed to open log popup');\n }\n setMode('navigate');\n break;\n }\n\n case 'open-session-dir': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n try {\n openInFileManager(sessionDir(cwd, selectedSessionId));\n } catch {\n notify('Failed to open session directory');\n }\n setMode('navigate');\n break;\n }\n\n case 'search':\n setMode('search');\n break;\n\n case 'jump-to-session': {\n // Find the Nth session-type node (1-indexed)\n let count = 0;\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i]?.type === 'session') {\n count++;\n if (count === action.index) {\n setCursorIndex(i);\n break;\n }\n }\n }\n setMode('navigate');\n break;\n }\n\n case 'spawn-agent': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n setMode('spawn-agent');\n break;\n }\n\n case 'message-agent': {\n const agent = getAgentForNode(cursorNode);\n if (!agent) { notify('Cursor must be on an agent'); setMode('navigate'); break; }\n setTargetAgentId(agent.id);\n setMode('message-agent');\n break;\n }\n\n case 'help':\n setMode('help');\n break;\n\n case 'shell-command': {\n if (!selectedSessionId) { notify('No session selected'); setMode('navigate'); break; }\n setMode('shell-command');\n break;\n }\n\n case 'dismiss':\n setMode('navigate');\n break;\n }\n });\n\n // Submit handler — dispatches by input mode\n const handleSubmit = useCallback(\n async (text: string) => {\n switch (mode) {\n case 'resume': {\n if (!selectedSessionId) break;\n await sendAndNotify(\n { type: 'resume', sessionId: selectedSessionId, cwd, message: text || undefined },\n 'Session resumed',\n );\n break;\n }\n case 'continue': {\n if (!selectedSessionId) break;\n try {\n const contRes = await send({ type: 'continue', sessionId: selectedSessionId });\n if (!contRes.ok) { notify(`Error: ${contRes.error}`); break; }\n await sendAndNotify(\n { type: 'resume', sessionId: selectedSessionId, cwd, message: text || undefined },\n 'Session continued',\n );\n } catch (err) {\n notify(`Error: ${(err as Error).message}`);\n }\n break;\n }\n case 'rollback': {\n if (!selectedSessionId) break;\n const toCycle = parseInt(text, 10);\n if (isNaN(toCycle) || toCycle < 1) { notify('Invalid cycle number'); break; }\n await sendAndNotify(\n { type: 'rollback', sessionId: selectedSessionId, cwd, toCycle },\n `Rolled back to cycle ${toCycle} — use [R]esume to respawn`,\n );\n break;\n }\n case 'delete-confirm': {\n if (!selectedSessionId) break;\n if (text !== 'yes') { notify('Delete cancelled (type \"yes\" to confirm)'); break; }\n await sendAndNotify(\n { type: 'delete', sessionId: selectedSessionId, cwd },\n 'Session deleted',\n );\n break;\n }\n case 'spawn-agent': {\n if (!selectedSessionId) break;\n if (!text.trim()) { notify('Instruction required'); break; }\n await sendAndNotify(\n {\n type: 'spawn',\n sessionId: selectedSessionId,\n agentType: 'default',\n name: 'agent',\n instruction: text,\n },\n 'Agent spawned',\n );\n break;\n }\n case 'search': {\n setSearchFilter(text.trim() || null);\n break;\n }\n case 'message-agent': {\n if (!selectedSessionId || !targetAgentId) break;\n await sendAndNotify(\n { type: 'message', sessionId: selectedSessionId, content: text, source: { type: 'agent', agentId: targetAgentId } },\n `Message sent to ${targetAgentId}`,\n );\n setTargetAgentId(null);\n break;\n }\n case 'shell-command': {\n if (!text.trim()) break;\n try {\n openShellPopup(cwd, text);\n } catch {\n notify('Failed to run shell command');\n }\n break;\n }\n }\n setMode('navigate');\n },\n [mode, selectedSessionId, targetAgentId, cwd, notify, sendAndNotify],\n );\n\n const handleCancel = useCallback(() => {\n setMode('navigate');\n setFocusPane('tree');\n setTargetAgentId(null);\n }, []);\n\n // Resolve report content for ReportView and AgentDetail\n const reportAgent = useMemo(() => {\n if (mode === 'report-detail') return getAgentForNode(cursorNode);\n return null;\n }, [mode, cursorNode, getAgentForNode]);\n\n const reportBlocks = useMemo(\n () => (reportAgent ? resolveReports(reportAgent.reports) : []),\n [reportAgent],\n );\n\n // Resolve reports for agent/report detail panels\n const detailAgent = useMemo(() => {\n if (!cursorNode) return null;\n if (cursorNode.type === 'agent' || cursorNode.type === 'report') {\n return getAgentForNode(cursorNode);\n }\n return null;\n }, [cursorNode, getAgentForNode]);\n\n const detailReportBlocks = useMemo(\n () => (detailAgent ? resolveReports(detailAgent.reports) : []),\n [detailAgent],\n );\n\n // Right panel content — determined by cursor node type\n const renderDetailPanel = useCallback(\n (detailWidth: number, contentHeight: number) => {\n // Report detail mode takes full panel\n if (mode === 'report-detail' && reportAgent) {\n return (\n <ReportView\n agent={reportAgent}\n reportBlocks={reportBlocks}\n width={detailWidth}\n height={contentHeight}\n onClose={handleCancel}\n />\n );\n }\n\n if (!cursorNode || !session) {\n return (\n <SessionDetail\n session={null}\n planContent=\"\"\n goalContent=\"\"\n logsContent=\"\"\n width={detailWidth}\n height={contentHeight}\n paneAlive={true}\n />\n );\n }\n\n switch (cursorNode.type) {\n case 'session':\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n goalContent={goalContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n scrollOffset={detailScrollOffset}\n focused={focusPane === 'detail'}\n />\n );\n\n case 'cycle': {\n const cycle = session.orchestratorCycles.find(\n (c) => c.cycle === cursorNode.cycleNumber,\n );\n if (!cycle) {\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n />\n );\n }\n return (\n <CycleDetail\n cycle={cycle}\n agents={session.agents}\n width={detailWidth}\n height={contentHeight}\n />\n );\n }\n\n case 'agent': {\n const agent = agents.find((a) => a.id === cursorNode.agentId);\n if (!agent) {\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n />\n );\n }\n return (\n <AgentDetail\n agent={agent}\n reportBlocks={detailReportBlocks}\n width={detailWidth}\n height={contentHeight}\n />\n );\n }\n\n case 'report': {\n const agent = agents.find((a) => a.id === cursorNode.agentId);\n if (!agent) {\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n logsContent={logsContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n />\n );\n }\n // Find the specific report for this node and show it inline\n const reportIdx = cursorNode.reportIndex;\n const specificBlock = detailReportBlocks.find((_b, i) => {\n // detailReportBlocks is reversed (newest first), match by index from original reports\n const originalIdx = agent.reports.length - 1 - i;\n return originalIdx === reportIdx;\n });\n if (specificBlock) {\n const badge = specificBlock.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = specificBlock.type === 'final' ? 'cyan' : 'yellow';\n const reportLines = wrapText(specificBlock.content.trim(), detailWidth - 8);\n const viewableLines = contentHeight - 7;\n return (\n <Box\n flexDirection=\"column\"\n width={detailWidth}\n borderStyle=\"round\"\n borderColor={badgeColor}\n paddingX={1}\n >\n <Text bold>\n {' '}\n <Text color={badgeColor}>{badge}</Text>\n {' '}\n {agent.id} · {agent.name !== agent.id ? agent.name : agent.agentType}\n </Text>\n <Text dimColor>{' '}{formatTime(specificBlock.timestamp)}</Text>\n <Text>{' '}</Text>\n <Text color={badgeColor} bold>{' '}▎ CONTENT</Text>\n {reportLines.slice(0, viewableLines).map((line, i) => (\n <Text key={i}>{' '}{line}</Text>\n ))}\n {reportLines.length > viewableLines && (\n <Text dimColor>{' '}… {reportLines.length - viewableLines} more lines [enter] full view</Text>\n )}\n </Box>\n );\n }\n return (\n <AgentDetail\n agent={agent}\n reportBlocks={detailReportBlocks}\n width={detailWidth}\n height={contentHeight}\n />\n );\n }\n\n case 'messages':\n return (\n <Box\n flexDirection=\"column\"\n width={detailWidth}\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n >\n <Text bold> Messages ({session.messages.length})</Text>\n <MessageLog\n messages={session.messages}\n maxMessages={contentHeight - 4}\n width={detailWidth - 4}\n />\n </Box>\n );\n\n case 'message': {\n const msg = session.messages.find((m) => m.id === cursorNode.messageId);\n return (\n <Box\n flexDirection=\"column\"\n width={detailWidth}\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n >\n <Text bold> Message</Text>\n {msg ? (\n <>\n <Text dimColor>\n {' '}\n {cursorNode.source} · {cursorNode.timestamp}\n </Text>\n <Text>{' '}{msg.content}</Text>\n </>\n ) : (\n <Text dimColor>Message not found</Text>\n )}\n </Box>\n );\n }\n\n default:\n return (\n <SessionDetail\n session={session}\n planContent={planContent}\n goalContent={goalContent}\n width={detailWidth}\n height={contentHeight}\n paneAlive={paneAlive}\n />\n );\n }\n },\n [cursorNode, session, planContent, goalContent, logsContent, paneAlive, agents, mode, reportAgent, reportBlocks, detailReportBlocks, handleCancel, detailScrollOffset, focusPane],\n );\n\n return (\n <Box flexDirection=\"column\" width={cols} height={rows}>\n <Box flexDirection=\"row\" height={contentHeight}>\n <SessionTree\n nodes={nodes}\n cursorIndex={cursorIndex}\n width={treeWidth}\n height={contentHeight}\n focused={mode === 'navigate' && focusPane === 'tree'}\n />\n\n {renderDetailPanel(detailWidth, contentHeight)}\n {showLogs && (\n <LogsPanel\n cycleLogs={selectedSession ? logsCycles : []}\n width={logsWidth}\n height={contentHeight}\n scrollOffset={logsScrollOffset}\n focused={mode === 'navigate' && focusPane === 'logs'}\n />\n )}\n </Box>\n\n {notification && (\n <Box paddingX={1}>\n <Text color=\"yellow\" bold>\n {/error|failed/i.test(notification)\n ? `✕ ${notification}`\n : /success|created|killed|sent|copied|deleted/i.test(notification)\n ? `✓ ${notification}`\n : `ℹ ${notification}`}\n </Text>\n </Box>\n )}\n\n {error && !notification && (\n <Box paddingX={1}>\n <Text color=\"red\">⚠ {error}</Text>\n </Box>\n )}\n\n <InputBar\n mode={mode}\n defaultText={mode === 'rollback' && cursorNode?.type === 'cycle' ? String(cursorNode.cycleNumber) : undefined}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n />\n\n <StatusLine\n mode={mode}\n detailFocused={focusPane === 'detail'}\n logsFocused={focusPane === 'logs'}\n showLogs={showLogs}\n />\n\n <LeaderOverlay mode={mode} rows={rows} cols={cols} />\n <HelpOverlay mode={mode} rows={rows} cols={cols} />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { TreeNode } from '../types/tree.js';\nimport { renderTreePrefix } from '../lib/tree-render.js';\nimport {\n statusColor,\n statusIndicator,\n agentStatusIcon,\n truncate,\n formatDuration,\n formatTime,\n formatTimeAgo,\n durationColor,\n} from '../lib/format.js';\n\ninterface Props {\n nodes: TreeNode[];\n cursorIndex: number;\n width: number;\n height: number;\n focused: boolean;\n}\n\nexport function SessionTree({ nodes, cursorIndex, width, height, focused }: Props) {\n if (nodes.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'yellow' : 'gray'}\n paddingX={1}\n >\n <Text bold> Sessions </Text>\n <Text dimColor>No sessions found.</Text>\n <Text dimColor>Press [n] to create one.</Text>\n </Box>\n );\n }\n\n const maxVisible = Math.max(1, height - 3);\n const halfVisible = Math.floor(maxVisible / 2);\n const scrollOffset = Math.max(\n 0,\n Math.min(cursorIndex - halfVisible, nodes.length - maxVisible),\n );\n const visible = nodes.slice(scrollOffset, scrollOffset + maxVisible);\n const contentWidth = width - 4; // border + padding\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'yellow' : 'gray'}\n paddingX={1}\n >\n {scrollOffset > 0 && <Text dimColor> ↑ {scrollOffset} more</Text>}\n\n {visible.map((node, i) => {\n const realIdx = scrollOffset + i;\n const isSelected = realIdx === cursorIndex;\n const prefix = renderTreePrefix(node, nodes, realIdx);\n const { icon, label, meta, color, dim, metaColor } = renderNodeContent(\n node,\n contentWidth - prefix.length,\n );\n\n return (\n <Text key={node.id} inverse={isSelected && focused} bold={isSelected}>\n {prefix}\n <Text color={color} dimColor={dim}>\n {icon}\n </Text>\n {icon ? ' ' : ''}\n <Text dimColor={dim}>{label}</Text>\n {meta ? <Text color={metaColor} dimColor={!metaColor}> {meta}</Text> : null}\n </Text>\n );\n })}\n\n {scrollOffset + maxVisible < nodes.length && (\n <Text dimColor> ↓ {nodes.length - scrollOffset - maxVisible} more</Text>\n )}\n </Box>\n );\n}\n\nfunction renderNodeContent(\n node: TreeNode,\n maxWidth: number,\n): { icon: string; label: string; meta: string; color: string; dim: boolean; metaColor?: string } {\n switch (node.type) {\n case 'session': {\n const icon = statusIndicator(node.status);\n const color = statusColor(node.status);\n const dim = node.status === 'completed';\n const cyclePart = node.cycleCount > 0 ? `C${node.cycleCount}` : '';\n const dur = formatDuration(node.createdAt, node.completedAt);\n const agopart = node.status === 'completed' && node.completedAt ? formatTimeAgo(node.completedAt) : '';\n const meta = [cyclePart, dur, agopart].filter(Boolean).join(' ');\n const maxTask = Math.max(8, maxWidth - meta.length - 4);\n return { icon, label: truncate(node.task, maxTask), meta, color, dim };\n }\n case 'cycle': {\n const isRunning = !node.completedAt;\n const dur = node.completedAt\n ? formatDuration(node.timestamp, node.completedAt)\n : 'running';\n const agents = `${node.agentCount} agent${node.agentCount !== 1 ? 's' : ''}`;\n const mode = node.mode ? ` · ${node.mode}` : '';\n return {\n icon: isRunning ? '●' : '○',\n label: `C${node.cycleNumber}`,\n meta: `${dur} · ${agents}${mode}`,\n color: isRunning ? 'green' : 'gray',\n dim: !isRunning,\n };\n }\n case 'agent': {\n const icon = agentStatusIcon(node.status);\n const color = statusColor(node.status);\n const dur = formatDuration(node.spawnedAt, node.completedAt);\n const durClr = durationColor(node.spawnedAt, node.completedAt) || undefined;\n const dim = node.status === 'completed';\n const displayName = node.name !== node.agentId ? node.name : node.agentType;\n const maxLabel = Math.max(8, maxWidth - dur.length - 4);\n return {\n icon,\n label: truncate(displayName, maxLabel),\n meta: dur,\n color,\n dim,\n metaColor: durClr,\n };\n }\n case 'report': {\n const badge = node.reportType === 'final' ? 'FINAL' : 'UPDATE';\n const time = formatTime(node.timestamp);\n return {\n icon: node.reportType === 'final' ? '◆' : '◇',\n label: `${badge} ${time}`,\n meta: '',\n color: node.reportType === 'final' ? 'cyan' : 'yellow',\n dim: false,\n };\n }\n case 'messages':\n return {\n icon: '✉',\n label: `Messages (${node.count})`,\n meta: '',\n color: 'yellow',\n dim: false,\n };\n case 'message': {\n const maxLabel = Math.max(8, maxWidth - 8);\n return {\n icon: '·',\n label: truncate(`${node.source}: ${node.summary}`, maxLabel),\n meta: formatTime(node.timestamp),\n color: 'gray',\n dim: true,\n };\n }\n }\n}\n","import type { TreeNode } from '../types/tree.js';\n\n/**\n * Render box-drawing prefix for a tree node.\n * Produces connectors like: │ ├─ ▸ or └─ ▼\n */\nexport function renderTreePrefix(node: TreeNode, nodes: TreeNode[], index: number): string {\n if (node.depth === 0) {\n return node.expandable ? (node.expanded ? '▼ ' : '▸ ') : ' ';\n }\n\n const parts: string[] = [];\n\n // For each ancestor depth level (1..depth-1), draw │ or space\n for (let d = 1; d < node.depth; d++) {\n parts.push(isAncestorLastSibling(nodes, index, d) ? ' ' : '│ ');\n }\n\n // Connector for this node\n parts.push(isLastSibling(nodes, index) ? '└─' : '├─');\n\n // Expand indicator\n if (node.expandable) {\n parts.push(node.expanded ? '▼ ' : '▸ ');\n } else {\n parts.push(' ');\n }\n\n return parts.join('');\n}\n\n/** Check if the node at `index` is the last among its siblings (same depth, same parent) */\nfunction isLastSibling(nodes: TreeNode[], index: number): boolean {\n const depth = nodes[index]!.depth;\n for (let i = index + 1; i < nodes.length; i++) {\n if (nodes[i]!.depth === depth) return false;\n if (nodes[i]!.depth < depth) return true;\n }\n return true;\n}\n\n/** Check if the ancestor at `depth` for the node at `index` is the last among its siblings */\nfunction isAncestorLastSibling(nodes: TreeNode[], index: number, depth: number): boolean {\n // Find the ancestor at this depth by scanning backward\n for (let i = index - 1; i >= 0; i--) {\n if (nodes[i]!.depth === depth) {\n return isLastSibling(nodes, i);\n }\n if (nodes[i]!.depth < depth) return true;\n }\n return true;\n}\n","export function formatDuration(startOrMs: string | number, endIso?: string | null): string {\n let totalMs: number;\n if (typeof startOrMs === 'number') {\n totalMs = startOrMs;\n } else {\n const start = new Date(startOrMs).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n totalMs = end - start;\n }\n const totalSeconds = Math.floor(totalMs / 1000);\n if (totalSeconds < 0) return '0s';\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) return `${hours}h${minutes}m`;\n if (minutes > 0) return `${minutes}m${seconds}s`;\n return `${seconds}s`;\n}\n\nexport function formatTimeAgo(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n}\n\nexport function formatTime(iso: string): string {\n const d = new Date(iso);\n return `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`;\n}\n\nexport function truncate(text: string, max: number): string {\n if (max < 4) return text.slice(0, max);\n if (text.length <= max) return text;\n // Try to break at a word boundary\n const cut = text.lastIndexOf(' ', max - 1);\n const breakAt = cut > max * 0.6 ? cut : max - 1;\n return text.slice(0, breakAt) + '…';\n}\n\n/** Strip markdown syntax to plain text */\nexport function stripMarkdown(text: string): string {\n return text\n .replace(/^#{1,6}\\s+/gm, '')\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/`{1,3}[^`]*`{1,3}/g, '')\n .replace(/^[-*+]\\s+/gm, '')\n .replace(/^\\d+[.)]\\s+/gm, '')\n .replace(/\\[(.+?)\\]\\(.+?\\)/g, '$1')\n .replace(/^>\\s+/gm, '')\n .replace(/---+/g, '')\n .replace(/\\n+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract the first meaningful sentence from markdown-heavy text.\n * Much better than blind truncation — finds actual content.\n */\nexport function extractFirstSentence(text: string, maxLen: number): string {\n const lines = text.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('#')) continue;\n if (trimmed.startsWith('---')) continue;\n if (trimmed.startsWith('```')) continue;\n if (trimmed.startsWith('|')) continue;\n if (trimmed.length < 5) continue;\n\n const cleaned = stripMarkdown(trimmed);\n if (cleaned.length < 5) continue;\n\n // Try to end at a sentence boundary\n const periodIdx = cleaned.indexOf('. ');\n if (periodIdx > 10 && periodIdx < maxLen) {\n return cleaned.slice(0, periodIdx + 1);\n }\n return truncate(cleaned, maxLen);\n }\n const fallback = stripMarkdown(text);\n return truncate(fallback, maxLen);\n}\n\nexport function durationColor(startOrMs: string | number, endIso?: string | null): string {\n let totalMs: number;\n if (typeof startOrMs === 'number') {\n totalMs = startOrMs;\n } else {\n const start = new Date(startOrMs).getTime();\n const end = endIso ? new Date(endIso).getTime() : Date.now();\n totalMs = end - start;\n }\n if (totalMs < 10 * 60 * 1000) return '';\n if (totalMs < 30 * 60 * 1000) return 'yellow';\n return 'red';\n}\n\nexport function statusColor(status: string): string {\n switch (status) {\n case 'active':\n case 'running':\n return 'green';\n case 'completed':\n return 'cyan';\n case 'paused':\n return 'yellow';\n case 'killed':\n case 'crashed':\n return 'red';\n case 'lost':\n return 'gray';\n default:\n return 'white';\n }\n}\n\nexport function statusIndicator(status: string): string {\n switch (status) {\n case 'active':\n return '▶';\n case 'completed':\n return '✓';\n case 'paused':\n return '⏸';\n default:\n return '·';\n }\n}\n\nexport function agentStatusIcon(status: string): string {\n switch (status) {\n case 'running':\n return '▶';\n case 'completed':\n return '✓';\n case 'killed':\n return '✕';\n case 'crashed':\n return '!';\n case 'lost':\n return '?';\n default:\n return '·';\n }\n}\n\nexport function agentTypeColor(agentType: string | undefined): string | undefined {\n if (!agentType) return undefined;\n const t = agentType.toLowerCase();\n if (t.includes('research')) return 'blue';\n if (t.includes('implement') || t.includes('code')) return 'green';\n if (t.includes('review') || t.includes('test')) return 'magenta';\n if (t.includes('plan')) return 'yellow';\n return undefined;\n}\n\nexport function divider(width: number, char: string = '─'): string {\n return char.repeat(Math.max(0, width));\n}\n\n/** Strip YAML frontmatter (--- ... ---) from markdown content */\nexport function stripFrontmatter(content: string): string {\n if (!content.startsWith('---')) return content;\n const end = content.indexOf('\\n---', 3);\n if (end === -1) return content;\n return content.slice(end + 4).trimStart();\n}\n\n/** Clean inline markdown syntax for terminal display */\nexport function cleanMarkdown(line: string): string {\n return line\n .replace(/\\*\\*(.+?)\\*\\*/g, '$1')\n .replace(/\\*(.+?)\\*/g, '$1')\n .replace(/~~(.+?)~~/g, '$1')\n .replace(/`(.+?)`/g, '$1')\n .replace(/\\[(.+?)\\]\\(.+?\\)/g, '$1');\n}\n\nexport function wrapText(text: string, width: number): string[] {\n if (width <= 0) return text.split('\\n');\n const result: string[] = [];\n for (const rawLine of text.split('\\n')) {\n if (rawLine.length <= width) {\n result.push(rawLine);\n continue;\n }\n let remaining = rawLine;\n while (remaining.length > width) {\n let breakAt = remaining.lastIndexOf(' ', width);\n if (breakAt <= 0) breakAt = width;\n result.push(remaining.slice(0, breakAt));\n remaining = remaining.slice(breakAt).trimStart();\n }\n if (remaining) result.push(remaining);\n }\n return result;\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { Session } from '../../shared/types.js';\nimport { computeActiveTimeMs } from '../../shared/utils.js';\nimport { buildPlanLines } from './PlanView.js';\nimport {\n statusColor,\n formatDuration,\n formatTime,\n truncate,\n wrapText,\n stripFrontmatter,\n cleanMarkdown,\n} from '../lib/format.js';\n\ninterface Props {\n session: Session | null;\n planContent: string;\n goalContent?: string;\n logsContent?: string;\n width: number;\n height: number;\n paneAlive: boolean;\n scrollOffset?: number;\n focused?: boolean;\n}\n\ntype Seg = {\n text: string;\n color?: string;\n bold?: boolean;\n dim?: boolean;\n italic?: boolean;\n};\n\ntype DetailLine = Seg[];\n\nfunction seg(text: string, opts?: Partial<Omit<Seg, 'text'>>): Seg {\n return { text, ...opts };\n}\n\nfunction simple(text: string, opts?: Partial<Omit<Seg, 'text'>>): DetailLine {\n return [seg(text, opts)];\n}\n\nfunction buildLines(\n session: Session,\n planContent: string,\n goalContent: string | undefined,\n logsContent: string | undefined,\n width: number,\n paneAlive: boolean,\n): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n const agents = session.agents ?? [];\n const cycles = session.orchestratorCycles ?? [];\n const messages = session.messages ?? [];\n const isDead = session.status === 'active' && !paneAlive;\n const conflicts = agents.filter((a) => a.mergeStatus === 'conflict');\n\n // Goal text\n const goalText = goalContent\n ? cleanMarkdown(stripFrontmatter(goalContent).trim())\n : session.task;\n goalText\n .split('\\n')\n .flatMap((l) => wrapText(l, contentWidth - 2))\n .forEach((line, i) => {\n lines.push(simple(`${i === 0 ? ' ' : ' '}${line}`, { bold: true }));\n });\n\n // Status bar (mixed colors)\n const lastCycle = cycles.length > 0 ? cycles[cycles.length - 1]! : null;\n const cycleNum = lastCycle?.cycle ?? 0;\n const mode = lastCycle?.mode ?? '';\n const runningAgents = agents.filter((a) => a.status === 'running').length;\n const completedAgents = agents.filter((a) => a.status === 'completed').length;\n const elapsed = formatDuration(session.createdAt, session.completedAt);\n const activeMs = computeActiveTimeMs(session);\n const activeTime = formatDuration(activeMs);\n const modeColor = mode === 'planning' ? 'blue' : mode === 'implementation' ? 'green' : 'cyan';\n lines.push([\n seg(' '),\n seg(isDead ? '✕ dead' : session.status, {\n color: statusColor(isDead ? 'crashed' : session.status),\n }),\n seg(` · cycle ${cycleNum}`, { dim: true }),\n ...(mode ? [seg(' (', { dim: true }), seg(mode, { color: modeColor }), seg(')', { dim: true })] : []),\n seg(` · ${elapsed} · `, { dim: true }),\n seg(`${runningAgents} running`, { color: 'green' }),\n seg(' · ', { dim: true }),\n seg(`${completedAgents} done`, { color: 'cyan' }),\n seg(` · ${activeTime} active`, { dim: true }),\n ]);\n\n // Dead session warning\n if (isDead) {\n lines.push([\n seg(' '),\n seg(' ✕ DEAD ', { color: 'red', bold: true }),\n seg(' tmux window closed — kill or resume', { color: 'red' }),\n ]);\n }\n\n // Conflict banner\n if (conflicts.length > 0) {\n lines.push(\n simple(\n ` ⚠ ${conflicts.length} merge conflict${conflicts.length > 1 ? 's' : ''}`,\n { color: 'red', bold: true },\n ),\n );\n }\n\n // Plan section\n lines.push(simple(' '));\n lines.push([\n seg(' ▎ ◈ PLAN', { color: 'yellow', bold: true }),\n ]);\n const planLines = buildPlanLines(planContent, 99999, width);\n if (planLines.length === 0) {\n lines.push(simple(' orchestrator will create one', { dim: true, italic: true }));\n } else {\n for (const pl of planLines) {\n lines.push(simple(pl.text, { bold: pl.bold, dim: pl.dim, color: pl.color }));\n }\n }\n\n // Completion report\n if (session.status === 'completed' && session.completionReport) {\n lines.push(simple(' '));\n lines.push([seg(' ▎ ✓ COMPLETION', { color: 'cyan', bold: true })]);\n wrapText(cleanMarkdown(session.completionReport), contentWidth - 6).forEach(\n (l) => {\n lines.push(simple(` ${l}`, { dim: true }));\n },\n );\n }\n\n // Cycles section — newest first, messages nested below the cycle they fed into\n lines.push(simple(' '));\n lines.push([\n seg(' ▎ ⟳ CYCLES', { color: 'blue', bold: true }),\n seg(` (${cycles.length})`, { dim: true }),\n ]);\n\n // Render one message as an indented sub-row under its cycle\n const pushMsgLine = (msg: (typeof messages)[number], connector: '└▸' | '├▸') => {\n const time = formatTime(msg.timestamp);\n const label =\n msg.source.type === 'user'\n ? 'You'\n : msg.source.type === 'agent'\n ? msg.source.agentId\n : '⚙ system';\n const labelColor =\n msg.source.type === 'user' ? 'yellow' : msg.source.type === 'agent' ? 'cyan' : 'gray';\n const maxContent = Math.max(10, contentWidth - label.length - 18);\n lines.push([\n seg(` ${connector} `, { dim: true }),\n seg(`[${time}] `, { dim: true }),\n seg(`${label} `, { color: labelColor, bold: true }),\n seg(truncate(msg.summary || msg.content, maxContent), { dim: true }),\n ]);\n };\n\n if (cycles.length === 0) {\n lines.push(simple(' waiting for orchestrator…', { dim: true, italic: true }));\n } else {\n const sortedMsgs = [...messages].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n const reversedCycles = [...cycles].reverse(); // newest first in display\n\n for (let i = 0; i < reversedCycles.length; i++) {\n const cycle = reversedCycles[i]!;\n const olderCycle = reversedCycles[i + 1]; // chronologically prior\n\n const isRunning = !cycle.completedAt;\n // Visual recency: newest completed = white, second = gray, rest = dim gray\n const isNewest = i === 0;\n const isSecond = i === 1;\n const dot = isRunning ? '●' : '○';\n const dotColor = isRunning ? 'green' : isNewest ? 'white' : 'gray';\n const rowDim = !isRunning && !isNewest && !isSecond;\n const duration = isRunning ? 'running' : formatDuration(cycle.timestamp, cycle.completedAt);\n const n = cycle.agentsSpawned.length;\n const startTime = formatTime(cycle.timestamp);\n\n // For cycles with 1–2 agents, show agent type inline instead of just \"N agents\"\n const cycleAgents = agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n const agentDetail =\n cycleAgents.length === 1\n ? truncate(cycleAgents[0]!.agentType || cycleAgents[0]!.name, 14)\n : cycleAgents.length === 2\n ? cycleAgents.map((a) => truncate(a.agentType || a.name, 10)).join(' + ')\n : `${n} agent${n !== 1 ? 's' : ''}`;\n\n const row: DetailLine = [\n seg(` ${dot} `, { color: dotColor }),\n seg(`C${cycle.cycle}`, { bold: isRunning || isNewest, dim: rowDim }),\n seg(' ', {}),\n ...(isRunning\n ? [seg('running', { color: 'green', bold: true })]\n : [seg(duration, { dim: rowDim })]),\n seg(' · ', { dim: true }),\n seg(agentDetail, { dim: rowDim }),\n ...(cycle.mode ? [seg(' · ', { dim: true }), seg(cycle.mode, { color: cycle.mode === 'planning' ? 'blue' : cycle.mode === 'implementation' ? 'green' : 'cyan' })] : []),\n seg(` ${startTime}`, { dim: true }),\n ];\n lines.push(row);\n\n // Messages that fed into this cycle: sent after the prior cycle started, before this one\n const cycleTime = new Date(cycle.timestamp).getTime();\n const olderCycleTime = olderCycle ? new Date(olderCycle.timestamp).getTime() : 0;\n const cycleMsgs = sortedMsgs.filter((m) => {\n const t = new Date(m.timestamp).getTime();\n return t < cycleTime && t >= olderCycleTime;\n });\n cycleMsgs.forEach((msg, mi) => {\n pushMsgLine(msg, mi < cycleMsgs.length - 1 ? '├▸' : '└▸');\n });\n }\n\n // Messages predating all cycles (before the first cycle started)\n const firstCycleTime = new Date(reversedCycles[reversedCycles.length - 1]!.timestamp).getTime();\n const preMsgs = sortedMsgs.filter((m) => new Date(m.timestamp).getTime() < firstCycleTime);\n preMsgs.forEach((msg, mi) => {\n pushMsgLine(msg, mi < preMsgs.length - 1 ? '├▸' : '└▸');\n });\n }\n\n return lines;\n}\n\nexport function SessionDetail({\n session,\n planContent,\n goalContent,\n logsContent,\n width,\n height,\n paneAlive,\n scrollOffset = 0,\n focused = false,\n}: Props) {\n if (!session) {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Text dimColor>Select a session to view details</Text>\n </Box>\n );\n }\n\n const allLines = useMemo(\n () => buildLines(session, planContent, goalContent, logsContent, width, paneAlive),\n [session, planContent, goalContent, logsContent, width, paneAlive],\n );\n\n const innerHeight = height - 2; // borders only\n const hasOverflow = allLines.length > innerHeight;\n const viewableHeight = hasOverflow ? innerHeight - 1 : innerHeight;\n const maxScroll = Math.max(0, allLines.length - viewableHeight);\n const effectiveOffset = Math.min(scrollOffset, maxScroll);\n const visible = allLines.slice(effectiveOffset, effectiveOffset + viewableHeight);\n const padCount = viewableHeight - visible.length;\n const scrollPct =\n maxScroll > 0 ? Math.round((effectiveOffset / maxScroll) * 100) : 100;\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'blue' : 'gray'}\n paddingX={1}\n >\n {visible.map((line, i) => (\n <Text key={effectiveOffset + i}>\n {line.map((s, j) => (\n <Text\n key={j}\n color={s.color}\n bold={s.bold}\n dimColor={s.dim}\n italic={s.italic}\n >\n {s.text}\n </Text>\n ))}\n </Text>\n ))}\n {padCount > 0 &&\n Array.from({ length: padCount }, (_, i) => (\n <Text key={`pad-${i}`}>{' '}</Text>\n ))}\n {hasOverflow && (\n <Text dimColor>\n {' '}[tab] scroll · {scrollPct}% · {allLines.length} lines\n </Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { truncate, wrapText, stripFrontmatter, cleanMarkdown } from '../lib/format.js';\n\ninterface Props {\n content: string;\n maxLines: number;\n width: number;\n}\n\nexport interface PlanLine {\n text: string;\n bold?: boolean;\n dim?: boolean;\n color?: string;\n}\n\nexport function buildPlanLines(content: string, maxLines: number, width: number): PlanLine[] {\n const clean = stripFrontmatter(content);\n if (!clean.trim()) return [];\n\n const contentWidth = width - 4;\n const lines: PlanLine[] = [];\n const rawLines = clean.split('\\n');\n\n for (const rawLine of rawLines) {\n if (lines.length >= maxLines) break;\n\n const trimmed = rawLine.trim();\n\n // Skip frontmatter artifacts\n if (trimmed === '---') continue;\n\n // Headers — bold, with level-based indentation\n const headerMatch = rawLine.match(/^(#{1,6})\\s+(.+)/);\n if (headerMatch) {\n const level = headerMatch[1]!.length;\n const headerText = cleanMarkdown(headerMatch[2]!);\n const indent = ' '.repeat(Math.max(0, level - 1));\n if (lines.length > 0) lines.push({ text: ' ' }); // breathing room before headers\n lines.push({\n text: ` ${indent}${headerText}`,\n bold: true,\n color: level <= 2 ? 'white' : undefined,\n });\n continue;\n }\n\n // Empty lines — pass through (but collapse multiples)\n if (!trimmed) {\n if (lines.length > 0 && lines[lines.length - 1]!.text !== '') {\n lines.push({ text: ' ' });\n }\n continue;\n }\n\n // Numbered list items — clean markdown, preserve numbering\n const listMatch = trimmed.match(/^(\\d+)[.)]\\s+(.+)/);\n if (listMatch) {\n const cleaned = `${listMatch[1]}. ${cleanMarkdown(listMatch[2]!)}`;\n const wrapped = wrapText(cleaned, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n continue;\n }\n\n // Checkbox items — must come before bullet match\n const checkboxMatch = trimmed.match(/^- \\[( |x|X)\\] (.+)/);\n if (checkboxMatch) {\n const checked = checkboxMatch[1] !== ' ';\n const checkboxText = cleanMarkdown(checkboxMatch[2]!);\n const icon = checked ? '☑' : '☐';\n const wrapped = wrapText(`${icon} ${checkboxText}`, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true, color: checked ? 'green' : undefined });\n }\n continue;\n }\n\n // Bullet items\n const bulletMatch = trimmed.match(/^[-*+]\\s+(.+)/);\n if (bulletMatch) {\n const cleaned = `· ${cleanMarkdown(bulletMatch[1]!)}`;\n const wrapped = wrapText(cleaned, contentWidth - 6);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n continue;\n }\n\n // Regular content — clean and wrap\n const cleaned = cleanMarkdown(trimmed);\n const wrapped = wrapText(cleaned, contentWidth - 4);\n for (const wl of wrapped) {\n if (lines.length >= maxLines) break;\n lines.push({ text: ` ${wl}`, dim: true });\n }\n }\n\n // Truncation indicator\n const totalContentLines = rawLines.filter((l) => l.trim()).length;\n if (lines.length >= maxLines && totalContentLines > maxLines) {\n lines[lines.length - 1] = { text: ' … [p] open in editor', dim: true };\n }\n\n return lines;\n}\n\nexport function PlanView({ content, maxLines, width }: Props) {\n const lines = buildPlanLines(content, maxLines, width);\n\n if (lines.length === 0) {\n return (\n <Box>\n <Text dimColor italic> No roadmap yet</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i} bold={line.bold} dimColor={line.dim} color={line.color}>\n {line.text}\n </Text>\n ))}\n </Box>\n );\n}\n","import React, { useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { CycleLog } from '../hooks/usePolling.js';\nimport { stripFrontmatter, cleanMarkdown, wrapText } from '../lib/format.js';\n\ninterface Props {\n cycleLogs: CycleLog[];\n width: number;\n height: number;\n scrollOffset?: number;\n focused?: boolean;\n}\n\ntype Seg = {\n text: string;\n color?: string;\n bold?: boolean;\n dim?: boolean;\n};\n\ntype DetailLine = Seg[];\n\nfunction seg(text: string, opts?: Partial<Omit<Seg, 'text'>>): Seg {\n return { text, ...opts };\n}\n\nfunction buildLines(cycleLogs: CycleLog[], width: number): DetailLine[] {\n const lines: DetailLine[] = [];\n const contentWidth = width - 4;\n\n if (cycleLogs.length === 0) {\n return lines;\n }\n\n // Most recent first\n const sorted = [...cycleLogs].sort((a, b) => b.cycle - a.cycle);\n\n for (const { cycle, content } of sorted) {\n lines.push([seg(` Cycle ${cycle}`, { color: 'blue', bold: true })]);\n\n const cleaned = cleanMarkdown(stripFrontmatter(content)).trim();\n if (cleaned) {\n for (const rawLine of cleaned.split('\\n')) {\n const wrapped = wrapText(rawLine, contentWidth - 2);\n for (const wl of wrapped) {\n lines.push([seg(` ${wl}`, { dim: true })]);\n }\n }\n }\n\n lines.push([seg(' ')]);\n }\n\n return lines;\n}\n\nexport function LogsPanel({\n cycleLogs,\n width,\n height,\n scrollOffset = 0,\n focused = false,\n}: Props) {\n if (cycleLogs.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'blue' : 'gray'}\n paddingX={1}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Text dimColor>No logs</Text>\n </Box>\n );\n }\n\n const allLines = useMemo(\n () => buildLines(cycleLogs, width),\n [cycleLogs, width],\n );\n\n const innerHeight = height - 2;\n const hasOverflow = allLines.length > innerHeight;\n const viewableHeight = hasOverflow ? innerHeight - 1 : innerHeight;\n const maxScroll = Math.max(0, allLines.length - viewableHeight);\n const effectiveOffset = Math.min(scrollOffset, maxScroll);\n const visible = allLines.slice(effectiveOffset, effectiveOffset + viewableHeight);\n const padCount = viewableHeight - visible.length;\n const scrollPct =\n maxScroll > 0 ? Math.round((effectiveOffset / maxScroll) * 100) : 100;\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor={focused ? 'blue' : 'gray'}\n paddingX={1}\n >\n {visible.map((line, i) => (\n <Text key={effectiveOffset + i}>\n {line.map((s, j) => (\n <Text key={j} color={s.color} bold={s.bold} dimColor={s.dim}>\n {s.text}\n </Text>\n ))}\n </Text>\n ))}\n {padCount > 0 &&\n Array.from({ length: padCount }, (_, i) => (\n <Text key={`pad-${i}`}>{' '}</Text>\n ))}\n {hasOverflow && (\n <Text dimColor>\n {' '}[tab] scroll · {scrollPct}% · {allLines.length} lines\n </Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { OrchestratorCycle, Agent } from '../../shared/types.js';\nimport {\n formatDuration,\n formatTime,\n statusColor,\n agentStatusIcon,\n truncate,\n extractFirstSentence,\n wrapText,\n durationColor,\n agentTypeColor,\n} from '../lib/format.js';\n\ninterface Props {\n cycle: OrchestratorCycle;\n agents: Agent[];\n width: number;\n height: number;\n}\n\nexport function CycleDetail({ cycle, agents, width, height }: Props) {\n const contentWidth = width - 4;\n const dur = cycle.completedAt\n ? formatDuration(cycle.timestamp, cycle.completedAt)\n : 'running';\n const isRunning = !cycle.completedAt;\n const cycleAgents = agents.filter((a) => cycle.agentsSpawned.includes(a.id));\n\n // Space budget for nextPrompt\n const headerLines = 4;\n // Each agent takes 1-3 lines (header + optional instruction + optional report)\n const agentLinesBudget = cycleAgents.reduce((sum, a) => {\n let n = 1;\n if (a.instruction) n++;\n if (a.status === 'completed' && a.reports.length > 0) n++;\n return sum + n;\n }, 0);\n const agentSectionLines = Math.max(1, agentLinesBudget) + 2; // +header +blank\n const promptAvailable = height - headerLines - agentSectionLines - 6;\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n >\n {/* Title */}\n <Text bold> Cycle {cycle.cycle}</Text>\n <Box>\n <Text dimColor>{' '}</Text>\n <Text color={isRunning ? 'green' : 'gray'}>\n {isRunning ? 'running' : 'completed'}\n </Text>\n <Text dimColor>\n {' · '}{dur}\n {' · '}{cycleAgents.length} agent{cycleAgents.length !== 1 ? 's' : ''}\n {cycle.mode ? ' · ' : ''}\n </Text>\n {cycle.mode && (\n <Text color={cycle.mode === 'planning' ? 'blue' : cycle.mode === 'implementation' ? 'green' : 'cyan'}>\n {cycle.mode}\n </Text>\n )}\n </Box>\n <Text dimColor>{' '}{formatTime(cycle.timestamp)}{cycle.completedAt ? ` → ${formatTime(cycle.completedAt)}` : ''}</Text>\n\n {/* Agents */}\n <Text>{' '}</Text>\n <Text color=\"green\" bold>{' '}▎ ⊞ AGENTS</Text>\n {cycleAgents.length === 0 ? (\n <Text dimColor italic>{' '}orchestrator spawning agents…</Text>\n ) : (\n cycleAgents.map((agent) => {\n const nameLabel = agent.name !== agent.id ? agent.name : agent.agentType;\n const instrPreview = agent.instruction.split('\\n')[0] || '';\n const latestReport = agent.reports.length > 0\n ? agent.reports[agent.reports.length - 1]!\n : null;\n const reportSummary = latestReport && agent.status === 'completed'\n ? extractFirstSentence(latestReport.summary, contentWidth - 14)\n : null;\n\n return (\n <Box key={agent.id} flexDirection=\"column\">\n <Box>\n <Text>{' '}</Text>\n <Text color={statusColor(agent.status)}>{agentStatusIcon(agent.status)}</Text>\n <Text bold> {agent.id}</Text>\n <Text color={agentTypeColor(agent.agentType)} dimColor={!agentTypeColor(agent.agentType)}> {truncate(nameLabel, contentWidth - 30)}</Text>\n {(() => {\n const dur = formatDuration(agent.spawnedAt, agent.completedAt);\n const durColor = durationColor(agent.spawnedAt, agent.completedAt) || undefined;\n return <Text dimColor> · {agent.status} · <Text color={durColor}>{dur}</Text></Text>;\n })()}\n </Box>\n {instrPreview && (\n <Text dimColor>{' '}{truncate(instrPreview, contentWidth - 10)}</Text>\n )}\n {reportSummary && (\n <Text dimColor>{' '}<Text color=\"cyan\">↳</Text> {reportSummary}</Text>\n )}\n </Box>\n );\n })\n )}\n\n {/* Next Prompt */}\n {cycle.nextPrompt && (\n <>\n <Text>{' '}</Text>\n <Text color=\"yellow\" bold>{' '}▎ ▷ NEXT PROMPT</Text>\n {wrapText(cycle.nextPrompt, contentWidth - 6)\n .slice(0, Math.max(3, promptAvailable))\n .map((line, i) => (\n <Text key={i} dimColor>{' '}{line}</Text>\n ))}\n </>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Agent } from '../../shared/types.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport {\n formatDuration,\n formatTime,\n statusColor,\n agentStatusIcon,\n wrapText,\n cleanMarkdown,\n} from '../lib/format.js';\n\ninterface Props {\n agent: Agent;\n reportBlocks?: ReportBlock[];\n width: number;\n height: number;\n}\n\nexport function AgentDetail({ agent, reportBlocks, width, height }: Props) {\n const contentWidth = width - 4;\n const dur = formatDuration(agent.spawnedAt, agent.completedAt);\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const nameLabel = agent.name !== agent.id ? agent.name : agent.agentType;\n\n // Dynamic line budget\n const metaLines = 3; // header + status + blank\n const alertLines = (agent.killedReason ? 1 : 0) + (agent.mergeStatus === 'conflict' && agent.mergeDetails ? 2 : 0);\n const timestampLines = 1 + (agent.completedAt ? 1 : 0) + (agent.paneId ? 1 : 0) + (agent.worktreePath ? 1 : 0) + (agent.branchName ? 1 : 0) + 2; // +header +blank\n const reportHeader = agent.reports.length > 0 ? 2 : 0; // header + blank\n const fixedLines = metaLines + alertLines + timestampLines + reportHeader + 4; // borders\n\n const hasResolvedReports = reportBlocks && reportBlocks.length > 0;\n const availableForContent = Math.max(6, height - fixedLines);\n\n // Split: instruction gets 40% when reports exist, otherwise most of it\n let instrMaxLines: number;\n let reportMaxLines: number;\n if (hasResolvedReports) {\n instrMaxLines = Math.max(4, Math.floor(availableForContent * 0.35));\n reportMaxLines = Math.max(4, availableForContent - instrMaxLines);\n } else {\n const summaryLines = agent.reports.length;\n instrMaxLines = Math.max(4, availableForContent - summaryLines - 1);\n reportMaxLines = summaryLines;\n }\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n >\n {/* Header */}\n <Text bold>\n {' '}<Text color={color}>{icon}</Text> {agent.id} · {nameLabel}\n </Text>\n <Box>\n <Text dimColor>{' '}</Text>\n <Text color={color}>{agent.status}</Text>\n <Text dimColor>\n {' · '}{dur} · {agent.agentType}\n </Text>\n {agent.mergeStatus && (\n <>\n <Text dimColor> · </Text>\n {agent.mergeStatus === 'merged' && <Text color=\"green\">⊕ merged</Text>}\n {agent.mergeStatus === 'pending' && <Text color=\"yellow\">◌ pending</Text>}\n {agent.mergeStatus === 'no-changes' && <Text color=\"gray\">∅ no changes</Text>}\n {agent.mergeStatus === 'conflict' && <Text color=\"red\">⚠ conflict</Text>}\n {!['merged', 'pending', 'no-changes', 'conflict'].includes(agent.mergeStatus) && (\n <Text dimColor>{agent.mergeStatus}</Text>\n )}\n </>\n )}\n </Box>\n\n {/* Alerts */}\n {agent.killedReason && (\n <Text color=\"red\">{' '}⚠ {agent.killedReason}</Text>\n )}\n {agent.mergeStatus === 'conflict' && agent.mergeDetails && (\n <Box flexDirection=\"column\">\n {wrapText(agent.mergeDetails, contentWidth - 6).map((line, i) => (\n <Text key={i} color=\"red\">{' '}⚠ {line}</Text>\n ))}\n </Box>\n )}\n\n {/* Instruction */}\n <Text>{' '}</Text>\n <Text color=\"white\" bold>{' '}▎ ▷ INSTRUCTION</Text>\n {wrapText(agent.instruction, contentWidth - 6)\n .slice(0, instrMaxLines)\n .map((line, i) => (\n <Text key={i} dimColor>{' '}{line}</Text>\n ))}\n\n {/* Reports */}\n {agent.reports.length > 0 && (\n <>\n <Text>{' '}</Text>\n <Text color=\"cyan\" bold>{' '}▎ ◇ REPORTS ({agent.reports.length})</Text>\n {hasResolvedReports ? (\n <Box flexDirection=\"column\">\n {reportBlocks.slice(0, Math.min(reportBlocks.length, 3)).map((block, i) => {\n const badge = block.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = block.type === 'final' ? 'cyan' : 'yellow';\n const linesPerReport = Math.max(2, Math.floor(reportMaxLines / Math.min(reportBlocks.length, 3)) - 2);\n return (\n <Box key={i} flexDirection=\"column\">\n {i > 0 && <Text>{' '}</Text>}\n <Box>\n <Text>{' '}</Text>\n <Text color={badgeColor} bold={block.type === 'final'}>{badge}</Text>\n <Text dimColor> {formatTime(block.timestamp)}</Text>\n </Box>\n {wrapText(cleanMarkdown(block.content.trim()), contentWidth - 10)\n .slice(0, linesPerReport)\n .map((line, j) => (\n <Text key={j} dimColor>{' '}{line}</Text>\n ))}\n </Box>\n );\n })}\n </Box>\n ) : (\n agent.reports.slice(0, reportMaxLines).map((report, i) => {\n const badge = report.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = report.type === 'final' ? 'cyan' : 'yellow';\n return (\n <Box key={i}>\n <Text>{' '}</Text>\n <Text color={badgeColor} bold={report.type === 'final'}>{badge}</Text>\n <Text dimColor> {formatTime(report.timestamp)} {report.summary.split('\\n')[0]}</Text>\n </Box>\n );\n })\n )}\n </>\n )}\n\n {/* Metadata */}\n <Text>{' '}</Text>\n <Text color=\"gray\" bold>{' '}▎ ◦ META</Text>\n <Text dimColor>{' '}Spawned: {formatTime(agent.spawnedAt)}</Text>\n {agent.completedAt && (\n <Text dimColor>{' '}Completed: {formatTime(agent.completedAt)}</Text>\n )}\n {agent.paneId && <Text dimColor>{' '}Pane: {agent.paneId}</Text>}\n {agent.worktreePath && <Text dimColor>{' '}Worktree: {agent.worktreePath}</Text>}\n {agent.branchName && <Text dimColor>{' '}Branch: {agent.branchName}</Text>}\n </Box>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { Agent } from '../../shared/types.js';\nimport type { ReportBlock } from '../lib/reports.js';\nimport { formatDuration, formatTime, divider, statusColor, agentStatusIcon, wrapText } from '../lib/format.js';\n\ninterface Props {\n agent: Agent;\n reportBlocks: ReportBlock[];\n width: number;\n height: number;\n onClose: () => void;\n}\n\nexport function ReportView({ agent, reportBlocks, width, height, onClose }: Props) {\n const [scrollOffset, setScrollOffset] = useState(0);\n\n const contentWidth = width - 6; // border + padding + gutter\n\n // Build the rendered lines (memoized since report content is static)\n const lines = useMemo(() => {\n const lines: Array<{ text: string; color?: string; bold?: boolean; dim?: boolean }> = [];\n\n if (reportBlocks.length === 0) {\n lines.push({ text: '', dim: true });\n lines.push({ text: ' No reports submitted yet.', dim: true });\n lines.push({ text: '', dim: true });\n return lines;\n }\n\n for (let i = 0; i < reportBlocks.length; i++) {\n const report = reportBlocks[i]!;\n const time = formatTime(report.timestamp);\n\n if (i > 0) {\n lines.push({ text: '' });\n lines.push({ text: ` ${divider(contentWidth - 2, '·')}`, dim: true });\n lines.push({ text: '' });\n }\n\n // Report header\n const badge = report.type === 'final' ? 'FINAL' : 'UPDATE';\n const badgeColor = report.type === 'final' ? 'cyan' : 'yellow';\n lines.push({\n text: ` ${badge} ${time}`,\n color: badgeColor,\n bold: report.type === 'final',\n });\n lines.push({ text: '' });\n\n // Report content — wrapped to fit\n const wrapped = wrapText(report.content.trim(), contentWidth - 4);\n for (const line of wrapped) {\n lines.push({ text: ` ${line}` });\n }\n }\n\n lines.push({ text: '' });\n return lines;\n }, [reportBlocks, contentWidth]);\n\n // Scroll bounds\n const viewableHeight = height - 7; // header (4) + footer (2) + border\n const maxScroll = Math.max(0, lines.length - viewableHeight);\n\n useInput((input, key) => {\n if (key.escape || key.return) {\n onClose();\n return;\n }\n if (key.upArrow) {\n setScrollOffset((o) => Math.max(0, o - 1));\n return;\n }\n if (key.downArrow) {\n setScrollOffset((o) => Math.min(maxScroll, o + 1));\n return;\n }\n // Page up/down with shift or brackets\n if (input === '[' || (key.upArrow && key.shift)) {\n setScrollOffset((o) => Math.max(0, o - Math.floor(viewableHeight / 2)));\n return;\n }\n if (input === ']' || (key.downArrow && key.shift)) {\n setScrollOffset((o) => Math.min(maxScroll, o + Math.floor(viewableHeight / 2)));\n return;\n }\n });\n\n // Visible slice\n const visible = lines.slice(scrollOffset, scrollOffset + viewableHeight);\n\n // Scroll position indicator\n const scrollPct = maxScroll > 0 ? Math.round((scrollOffset / maxScroll) * 100) : 100;\n const totalReports = agent.reports.length;\n const icon = agentStatusIcon(agent.status);\n const color = statusColor(agent.status);\n const dur = formatDuration(agent.spawnedAt, agent.completedAt);\n\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n height={height}\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n >\n {/* Header */}\n <Text bold>\n {' '}\n <Text color={color}>{icon}</Text>\n {' '}\n {agent.id}\n {' '}\n <Text dimColor>·</Text>\n {' '}\n {agent.name !== agent.id ? agent.name : agent.agentType}\n </Text>\n <Text dimColor>\n {' '}{agent.status} · {dur} · {agent.agentType} · {totalReports} report{totalReports !== 1 ? 's' : ''}\n </Text>\n <Text dimColor>{' ' + divider(contentWidth - 2)}</Text>\n\n {/* Scrollable content */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {visible.map((line, i) => (\n <Text\n key={scrollOffset + i}\n color={line.color}\n bold={line.bold}\n dimColor={line.dim}\n >\n {line.text}\n </Text>\n ))}\n </Box>\n\n {/* Footer */}\n <Text dimColor>{' ' + divider(contentWidth - 2)}</Text>\n <Text dimColor>\n {' '}[esc] back [↑↓] scroll [{ }] page\n {' '}\n <Text>{scrollPct}%</Text>\n {maxScroll > 0 && <Text dimColor> · {lines.length} lines</Text>}\n </Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Message } from '../../shared/types.js';\nimport { formatTime, truncate } from '../lib/format.js';\n\ninterface Props {\n messages: Message[];\n maxMessages: number;\n width: number;\n}\n\nfunction sourceLabel(msg: Message): string {\n if (msg.source.type === 'user') return 'You';\n if (msg.source.type === 'agent') return msg.source.agentId;\n return 'system';\n}\n\nfunction sourceColor(msg: Message): string {\n if (msg.source.type === 'user') return 'yellow';\n if (msg.source.type === 'agent') return 'cyan';\n return 'gray';\n}\n\nexport function MessageLog({ messages, maxMessages, width }: Props) {\n if (messages.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text bold dimColor>Messages</Text>\n <Text dimColor italic> No messages</Text>\n </Box>\n );\n }\n\n const recent = messages.slice(-maxMessages);\n const contentWidth = Math.max(10, width - 20);\n\n return (\n <Box flexDirection=\"column\">\n <Text bold dimColor>Messages</Text>\n {recent.map((msg) => {\n const time = formatTime(msg.timestamp);\n const label = sourceLabel(msg);\n const color = sourceColor(msg);\n const content = truncate(msg.summary || msg.content, contentWidth);\n\n return (\n <Text key={msg.id}>\n {' '}\n <Text dimColor>[{time}]</Text>\n {' '}\n <Text color={color} bold>{label}:</Text>\n {' '}\n {content}\n </Text>\n );\n })}\n </Box>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport type InputMode =\n | 'navigate'\n | 'message'\n | 'new-session'\n | 'report-detail'\n | 'resume'\n | 'continue'\n | 'rollback'\n | 'leader'\n | 'copy-menu'\n | 'delete-confirm'\n | 'spawn-agent'\n | 'search'\n | 'message-agent'\n | 'shell-command'\n | 'help';\n\ninterface Props {\n mode: InputMode;\n defaultText?: string;\n onSubmit: (text: string) => void;\n onCancel: () => void;\n}\n\nconst INPUT_MODES = new Set<InputMode>([\n 'resume',\n 'continue',\n 'rollback',\n 'delete-confirm',\n 'spawn-agent',\n 'search',\n 'message-agent',\n 'shell-command',\n]);\n\nconst PROMPTS: Partial<Record<InputMode, string>> = {\n resume: 'resume instructions (optional)',\n continue: 'new direction (optional)',\n rollback: 'cycle number',\n 'delete-confirm': \"type 'yes' to confirm delete:\",\n 'spawn-agent': 'agent instruction:',\n search: 'filter:',\n 'message-agent': 'message:',\n 'shell-command': '$ ',\n};\n\nconst OPTIONAL_INPUT = new Set<InputMode>(['resume', 'continue', 'search']);\n\nexport function InputBar({ mode, defaultText, onSubmit, onCancel }: Props) {\n const [text, setText] = useState('');\n const [cursorPos, setCursorPos] = useState(0);\n const prevMode = useRef(mode);\n\n // Pre-fill text when entering a mode with defaultText; reset cursor on mode change\n useEffect(() => {\n if (mode !== prevMode.current) {\n if (INPUT_MODES.has(mode) && defaultText) {\n setText(defaultText);\n setCursorPos(defaultText.length);\n } else {\n setText('');\n setCursorPos(0);\n }\n }\n prevMode.current = mode;\n }, [mode, defaultText]);\n\n useInput(\n (input, key) => {\n if (key.return) {\n if (OPTIONAL_INPUT.has(mode) || text.trim()) {\n onSubmit(text.trim());\n setText('');\n setCursorPos(0);\n }\n return;\n }\n if (key.escape) {\n setText('');\n setCursorPos(0);\n onCancel();\n return;\n }\n if (key.leftArrow) {\n setCursorPos((p) => Math.max(0, p - 1));\n return;\n }\n if (key.rightArrow) {\n setCursorPos((p) => Math.min(text.length, p + 1));\n return;\n }\n if (key.ctrl && input === 'a') {\n setCursorPos(0);\n return;\n }\n if (key.ctrl && input === 'e') {\n setCursorPos(text.length);\n return;\n }\n if (key.ctrl && input === 'k') {\n setText((t) => t.slice(0, cursorPos));\n // cursorPos stays the same (now at end)\n return;\n }\n if (key.ctrl && input === 'u') {\n setText((t) => t.slice(cursorPos));\n setCursorPos(0);\n return;\n }\n if (key.backspace || key.delete) {\n if (cursorPos > 0) {\n setText((t) => t.slice(0, cursorPos - 1) + t.slice(cursorPos));\n setCursorPos((p) => p - 1);\n }\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setText((t) => t.slice(0, cursorPos) + input + t.slice(cursorPos));\n setCursorPos((p) => p + input.length);\n }\n },\n { isActive: INPUT_MODES.has(mode) },\n );\n\n if (mode === 'navigate') {\n return (\n <Box paddingX={1}>\n <Text dimColor>Press [m] to message orchestrator, [n] for new session</Text>\n </Box>\n );\n }\n\n if (mode === 'report-detail' || mode === 'leader' || mode === 'copy-menu' || mode === 'help' || !INPUT_MODES.has(mode)) {\n return null;\n }\n\n const prompt = PROMPTS[mode] ?? mode;\n\n return (\n <Box paddingX={1}>\n <Text color=\"yellow\">{prompt} &gt; </Text>\n <Text>{text.slice(0, cursorPos)}</Text>\n <Text inverse>{cursorPos < text.length ? text[cursorPos] : ' '}</Text>\n <Text>{text.slice(cursorPos + 1)}</Text>\n <Text dimColor> (enter to send, esc to cancel)</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { InputMode } from './InputBar.js';\n\ninterface Props {\n mode: InputMode;\n detailFocused?: boolean;\n logsFocused?: boolean;\n showLogs?: boolean;\n}\n\nexport function StatusLine({ mode, detailFocused = false, logsFocused = false, showLogs = false }: Props) {\n if (mode === 'report-detail') {\n return null;\n }\n\n if (mode === 'leader') {\n return (\n <Box paddingX={1}>\n <Text color=\"magenta\" bold>LEADER</Text>\n <Text dimColor> press a command key or [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'copy-menu') {\n return (\n <Box paddingX={1}>\n <Text color=\"cyan\" bold>COPY</Text>\n <Text dimColor> [p] path [C] context [l] logs [s] session ID [esc] cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'help') {\n return (\n <Box paddingX={1}>\n <Text color=\"yellow\" bold>HELP</Text>\n <Text dimColor> [esc] or [?] to dismiss</Text>\n </Box>\n );\n }\n\n if (mode === 'delete-confirm') {\n return (\n <Box paddingX={1}>\n <Text color=\"red\" bold>DELETE</Text>\n <Text dimColor> type &apos;yes&apos; to confirm, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'spawn-agent') {\n return (\n <Box paddingX={1}>\n <Text color=\"green\" bold>SPAWN</Text>\n <Text dimColor> enter agent instruction, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'search') {\n return (\n <Box paddingX={1}>\n <Text color=\"blue\" bold>SEARCH</Text>\n <Text dimColor> type to filter, enter to apply, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'message-agent') {\n return (\n <Box paddingX={1}>\n <Text color=\"cyan\" bold>MESSAGE</Text>\n <Text dimColor> enter message for agent, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode === 'shell-command') {\n return (\n <Box paddingX={1}>\n <Text color=\"magenta\" bold>SHELL</Text>\n <Text dimColor> enter command, [esc] to cancel</Text>\n </Box>\n );\n }\n\n if (mode !== 'navigate') {\n return (\n <Box paddingX={1}>\n <Text dimColor>[enter] send [esc] cancel</Text>\n </Box>\n );\n }\n\n if (logsFocused) {\n return (\n <Box paddingX={1}>\n <Text bold>[↑↓]</Text><Text dimColor> scroll </Text>\n <Text bold>[←/tab]</Text><Text dimColor> back </Text>\n <Text bold>[l]</Text><Text dimColor>ogs hide </Text>\n <Text dimColor>│ </Text>\n <Text bold>[m]</Text><Text dimColor>sg </Text>\n <Text bold>[k]</Text><Text dimColor>ill </Text>\n <Text bold>[g]</Text><Text dimColor>oal </Text>\n <Text bold>[n]</Text><Text dimColor>ew </Text>\n <Text bold>[p]</Text><Text dimColor>lan </Text>\n <Text bold>[w]</Text><Text dimColor>indow </Text>\n <Text bold>[R]</Text><Text dimColor>esume </Text>\n <Text bold>[q]</Text><Text dimColor>uit</Text>\n </Box>\n );\n }\n\n if (detailFocused) {\n return (\n <Box paddingX={1}>\n <Text bold>[↑↓]</Text><Text dimColor> scroll </Text>\n <Text bold>[←/tab]</Text><Text dimColor> back </Text>\n <Text bold>[l]</Text><Text dimColor>{showLogs ? 'ogs hide' : 'ogs show'} </Text>\n <Text dimColor>│ </Text>\n <Text bold>[m]</Text><Text dimColor>sg </Text>\n <Text bold>[k]</Text><Text dimColor>ill </Text>\n <Text bold>[g]</Text><Text dimColor>oal </Text>\n <Text bold>[n]</Text><Text dimColor>ew </Text>\n <Text bold>[p]</Text><Text dimColor>lan </Text>\n <Text bold>[w]</Text><Text dimColor>indow </Text>\n <Text bold>[R]</Text><Text dimColor>esume </Text>\n <Text bold>[q]</Text><Text dimColor>uit</Text>\n </Box>\n );\n }\n\n return (\n <Box paddingX={1}>\n <Text bold>[↑↓]</Text><Text dimColor> navigate </Text>\n <Text bold>[←→]</Text><Text dimColor> collapse/expand </Text>\n <Text dimColor>│ </Text>\n <Text bold>[space]</Text><Text dimColor> leader </Text>\n <Text bold>[tab]</Text><Text dimColor> detail </Text>\n <Text bold>[l]</Text><Text dimColor>{showLogs ? 'ogs hide' : 'ogs show'} </Text>\n <Text dimColor>│ </Text>\n <Text bold>[m]</Text><Text dimColor>sg </Text>\n <Text bold>[k]</Text><Text dimColor>ill </Text>\n <Text bold>[n]</Text><Text dimColor>ew </Text>\n <Text bold>[R]</Text><Text dimColor>esume </Text>\n <Text bold>[q]</Text><Text dimColor>uit</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { InputMode } from './InputBar.js';\n\ninterface Props {\n mode: InputMode;\n rows: number;\n cols: number;\n}\n\nconst LEADER_WIDTH = 26;\nconst LEADER_HEIGHT = 16; // 14 lines + 2 border\nconst COPY_HEIGHT = 9; // 7 lines + 2 border\n// Full inner width between left and right border chars\nconst INNER = LEADER_WIDTH - 2;\n\n/** Pad a string to fill the full width between borders so no background chars leak. */\nfunction pad(s: string): string {\n return s.padEnd(INNER);\n}\n\nexport function LeaderOverlay({ mode, rows, cols }: Props) {\n if (mode === 'leader') {\n return (\n <Box\n position=\"absolute\"\n marginTop={rows - LEADER_HEIGHT - 2}\n marginLeft={cols - LEADER_WIDTH - 1}\n width={LEADER_WIDTH}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"magenta\"\n >\n <Text bold color=\"magenta\">{pad(' LEADER')}</Text>\n <Text>{pad(' ')}</Text>\n <Text>{pad(' y copy menu')}</Text>\n <Text>{pad(' d delete session')}</Text>\n <Text>{pad(' l daemon logs')}</Text>\n <Text>{pad(' o open session dir')}</Text>\n <Text>{pad(' a spawn agent')}</Text>\n <Text>{pad(' m message agent')}</Text>\n <Text>{pad(' / search')}</Text>\n <Text>{pad(' ! shell command')}</Text>\n <Text>{pad(' ? help')}</Text>\n <Text>{pad(' 1-9 jump to session')}</Text>\n <Text>{pad(' ')}</Text>\n <Text dimColor>{pad(' esc dismiss')}</Text>\n </Box>\n );\n }\n\n if (mode === 'copy-menu') {\n return (\n <Box\n position=\"absolute\"\n marginTop={rows - COPY_HEIGHT - 2}\n marginLeft={cols - LEADER_WIDTH - 1}\n width={LEADER_WIDTH}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n >\n <Text bold color=\"cyan\">{pad(' COPY')}</Text>\n <Text>{pad(' ')}</Text>\n <Text>{pad(' p session path')}</Text>\n <Text>{pad(' C LLM context')}</Text>\n <Text>{pad(' l logs content')}</Text>\n <Text>{pad(' s session ID')}</Text>\n <Text dimColor>{pad(' esc cancel')}</Text>\n </Box>\n );\n }\n\n return null;\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { InputMode } from './InputBar.js';\n\ninterface Props {\n mode: InputMode;\n rows: number;\n cols: number;\n}\n\nconst HELP_WIDTH = 62;\nconst INNER = HELP_WIDTH - 2;\n\nfunction pad(s: string): string {\n return s.padEnd(INNER);\n}\n\nfunction header(label: string): string {\n return pad(` ── ${label} ──`);\n}\n\nfunction row(left: string, right: string): string {\n const col = Math.floor(INNER / 2);\n return (left.padEnd(col) + right).padEnd(INNER);\n}\n\nexport function HelpOverlay({ mode, rows, cols }: Props) {\n if (mode !== 'help') return null;\n\n const marginLeft = Math.max(0, Math.floor((cols - HELP_WIDTH) / 2));\n const lines = [\n row(' ↑↓ move cursor', ' ←→ collapse/expand'),\n row(' tab switch pane', ' enter expand/open report'),\n '',\n row(' n new session', ' k kill session/agent'),\n row(' R resume session', ' C continue session'),\n row(' b rollback cycle', ' x restart agent'),\n row(' r re-run agent', ' j jump to pane'),\n row(' m message orch.', ' g edit goal'),\n row(' p open roadmap', ' w go to window'),\n row(' l toggle logs', ' q quit'),\n '',\n row(' space → y copy submenu', ' space → d delete session'),\n row(' space → l tail logs', ' space → o open dir'),\n row(' space → / search', ' space → a spawn agent'),\n row(' space → m msg agent', ' space → ! shell'),\n row(' space → ? help', ' space → 1-9 jump'),\n '',\n row(' y → p session path', ' y → C LLM context'),\n row(' y → l logs content', ' y → s session ID'),\n ];\n\n // Clamp overlay height to terminal height\n const overlayHeight = Math.min(lines.length + 4, rows - 2);\n\n return (\n <Box\n position=\"absolute\"\n marginTop={Math.max(0, Math.floor((rows - overlayHeight) / 2))}\n marginLeft={marginLeft}\n width={HELP_WIDTH}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n >\n <Text bold color=\"yellow\">{pad(' KEYBINDINGS (esc or ? to close)')}</Text>\n <Text>{pad(' ')}</Text>\n {lines.map((line, i) => {\n if (line === '') return <Text key={i}>{pad(' ')}</Text>;\n return <Text key={i}>{pad(line)}</Text>;\n })}\n <Text>{pad(' ')}</Text>\n </Box>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { send } from '../lib/client.js';\nimport { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { goalPath, logsDir, roadmapPath } from '../../shared/paths.js';\nimport { windowExists } from '../lib/tmux.js';\nimport type { Session } from '../../shared/types.js';\n\nexport interface SessionSummary {\n id: string;\n task: string;\n status: string;\n agentCount: number;\n createdAt: string;\n tmuxWindowId?: string;\n}\n\nexport interface CycleLog {\n cycle: number;\n content: string;\n}\n\nexport interface PollingState {\n sessions: SessionSummary[];\n selectedSession: Session | null;\n planContent: string;\n goalContent: string;\n logsContent: string;\n logsCycles: CycleLog[];\n paneAlive: boolean;\n error: string | null;\n}\n\nexport function usePolling(\n cwd: string,\n selectedSessionId: string | null,\n intervalMs: number = 2500,\n): PollingState {\n const [state, setState] = useState<PollingState>({\n sessions: [],\n selectedSession: null,\n planContent: '',\n goalContent: '',\n logsContent: '',\n logsCycles: [],\n paneAlive: true,\n error: null,\n });\n\n const selectedIdRef = useRef(selectedSessionId);\n selectedIdRef.current = selectedSessionId;\n const mountedRef = useRef(true);\n\n const poll = useCallback(async () => {\n try {\n const listRes = await send({ type: 'list', cwd });\n if (!mountedRef.current) return;\n\n const sessions = listRes.ok\n ? ((listRes.data?.sessions as SessionSummary[] | undefined) ?? [])\n : [];\n\n let selectedSession: Session | null = null;\n let planContent = '';\n let goalContent = '';\n let logsContent = '';\n let logsCycles: CycleLog[] = [];\n let paneAlive = true;\n\n if (selectedIdRef.current) {\n const statusRes = await send({ type: 'status', sessionId: selectedIdRef.current, cwd });\n if (mountedRef.current && statusRes.ok) {\n selectedSession = (statusRes.data?.session as Session | undefined) ?? null;\n }\n\n // Check if the session's tmux window is still alive\n if (selectedSession?.tmuxWindowId) {\n try {\n paneAlive = windowExists(selectedSession.tmuxWindowId);\n } catch {\n paneAlive = false;\n }\n }\n\n try {\n const pp = roadmapPath(cwd, selectedIdRef.current);\n if (existsSync(pp)) {\n planContent = readFileSync(pp, 'utf-8');\n }\n } catch {\n // roadmap.md may not exist yet\n }\n\n try {\n const gp = goalPath(cwd, selectedIdRef.current);\n if (existsSync(gp)) {\n goalContent = readFileSync(gp, 'utf-8');\n }\n } catch {\n // goal.md may not exist yet\n }\n\n try {\n const ld = logsDir(cwd, selectedIdRef.current);\n if (existsSync(ld)) {\n const files = readdirSync(ld).filter(f => f.startsWith('cycle-')).sort();\n logsCycles = files.map(f => {\n const match = f.match(/cycle-(\\d+)\\.md$/);\n const cycle = match ? parseInt(match[1]!, 10) : 0;\n const content = readFileSync(join(ld, f), 'utf-8');\n return { cycle, content };\n });\n logsContent = logsCycles.map(c => c.content).join('\\n');\n }\n } catch {\n // logs may not exist yet\n }\n }\n\n if (mountedRef.current) {\n setState({ sessions, selectedSession, planContent, goalContent, logsContent, logsCycles, paneAlive, error: null });\n }\n } catch (err) {\n if (mountedRef.current) {\n setState((prev) => ({ ...prev, error: (err as Error).message }));\n }\n }\n }, [cwd]);\n\n // Regular polling interval\n useEffect(() => {\n mountedRef.current = true;\n poll();\n const interval = setInterval(poll, intervalMs);\n return () => {\n mountedRef.current = false;\n clearInterval(interval);\n };\n }, [cwd, intervalMs, poll]);\n\n // Immediate fetch when selected session changes\n useEffect(() => {\n if (selectedSessionId != null) {\n poll();\n }\n }, [selectedSessionId, poll]);\n\n return state;\n}\n","import { connect } from 'node:net';\nimport { socketPath } from '../../shared/paths.js';\nimport type { Request, Response } from '../../shared/protocol.js';\n\nexport function send(request: Request): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error('Request timed out'));\n }, 5_000);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const idx = data.indexOf('\\n');\n if (idx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, idx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON from daemon`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n","import { execSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport { readFileSync, writeFileSync, mkdtempSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { globalDir } from '../../shared/paths.js';\n\nconst EXEC_ENV = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env['PATH'] ?? '/usr/bin:/bin'}`,\n};\n\nfunction exec(cmd: string): string {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV }).trim();\n}\n\nfunction execSafe(cmd: string): string | null {\n try {\n return execSync(cmd, { encoding: 'utf-8', env: EXEC_ENV, stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nfunction shellQuote(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport function getWindowId(): string {\n return exec('tmux display-message -p \"#{window_id}\"');\n}\n\nexport function selectWindow(windowId: string): void {\n execSafe(`tmux select-window -t \"${windowId}\"`);\n}\n\nexport function selectPane(paneId: string): void {\n execSafe(`tmux select-pane -t \"${paneId}\"`);\n}\n\nexport function windowExists(windowId: string): boolean {\n return execSafe(`tmux display-message -t \"${windowId}\" -p \"#{window_id}\"`) !== null;\n}\n\nexport function openCompanionPopup(cwd: string): void {\n const templatePath = join(import.meta.dirname, 'templates', 'dashboard-claude.md');\n let template: string;\n try {\n template = readFileSync(templatePath, 'utf-8');\n } catch {\n template = `You are a Sisyphus dashboard companion. Help the user manage multi-agent sessions.\\nProject: ${cwd}\\nRun \\`sisyphus list\\` and \\`sisyphus status\\` to see current state.`;\n }\n\n const rendered = template.replace(/\\{\\{CWD\\}\\}/g, cwd);\n const promptPath = join(globalDir(), 'dashboard-companion-prompt.md');\n writeFileSync(promptPath, rendered, 'utf-8');\n\n execSync(\n `tmux display-popup -E -w 80% -h 80% -d ${shellQuote(cwd)} ${shellQuote(`claude --dangerously-skip-permissions --system-prompt \"$(cat ${shellQuote(promptPath)})\"`)}` ,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nconst TERMINAL_EDITORS = new Set(['nvim', 'vim', 'vi', 'nano', 'emacs', 'micro', 'helix', 'hx', 'joe', 'ne', 'kak']);\n\nexport function switchToSession(sessionName: string): void {\n execSafe(`tmux switch-client -t \"${sessionName}\"`);\n}\n\nexport function editInPopup(cwd: string, editor: string, opts?: { content?: string; size?: { w: string; h: string } }): string | null {\n const tmpDir = mkdtempSync(join(tmpdir(), 'sisyphus-'));\n const filePath = join(tmpDir, 'input.md');\n try {\n writeFileSync(filePath, opts?.content ? opts.content : '', 'utf-8');\n openEditorPopup(cwd, editor, filePath, opts?.size);\n const result = readFileSync(filePath, 'utf-8').trim();\n return result || null;\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\nexport function openLogPopup(): void {\n execSync(\n `tmux display-popup -E -w 90% -h 80% ${shellQuote('tail -f ~/.sisyphus/daemon.log')}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openShellPopup(cwd: string, command: string): void {\n execSync(\n `tmux display-popup -E -w 90% -h 80% -d ${shellQuote(cwd)} ${shellQuote(`sh -c '${command.replace(/'/g, \"'\\\\''\")}; echo; echo \"Press enter to close\"; read'`)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n}\n\nexport function openInFileManager(path: string): void {\n execSync(`open ${shellQuote(path)}`, { stdio: 'inherit', env: EXEC_ENV });\n}\n\nexport function openEditorPopup(cwd: string, editor: string, filePath: string, size?: { w: string; h: string }): void {\n const { w = '90%', h = '90%' } = size ?? {};\n const editorBin = editor.split(/\\s+/)[0]!.split('/').pop()!;\n if (TERMINAL_EDITORS.has(editorBin)) {\n execSync(\n `tmux display-popup -E -w ${w} -h ${h} -d ${shellQuote(cwd)} ${shellQuote(`${editor} ${shellQuote(filePath)}`)}`,\n { stdio: 'inherit', env: EXEC_ENV },\n );\n } else {\n execSync(`${editor} ${shellQuote(filePath)}`, { stdio: 'inherit', cwd, env: EXEC_ENV });\n }\n}\n","import { useInput } from 'ink';\n\nexport interface KeybindingHandlers {\n onMoveUp: () => void;\n onMoveDown: () => void;\n onEnter: () => void;\n onLeft: () => void;\n onRight: () => void;\n onSpace: () => void;\n onTab: () => void;\n onMessage: () => void;\n onKill: () => void;\n onGoToWindow: () => void;\n onEditGoal: () => void;\n onNewSession: () => void;\n onClaude: () => void;\n onOpenPlan: () => void;\n onQuit: () => void;\n onReRun: () => void;\n onJumpToPane: () => void;\n onResume: () => void;\n onContinue: () => void;\n onRestartAgent: () => void;\n onRollback: () => void;\n onToggleLogs: () => void;\n}\n\nexport function useKeybindings(handlers: KeybindingHandlers, isActive: boolean): void {\n useInput(\n (input, key) => {\n if (key.upArrow) { handlers.onMoveUp(); return; }\n if (key.downArrow) { handlers.onMoveDown(); return; }\n if (key.leftArrow) { handlers.onLeft(); return; }\n if (key.rightArrow) { handlers.onRight(); return; }\n if (key.return) { handlers.onEnter(); return; }\n if (key.tab) { handlers.onTab(); return; }\n if (input === ' ') { handlers.onSpace(); return; }\n if (input === 'm') { handlers.onMessage(); return; }\n if (input === 'k') { handlers.onKill(); return; }\n if (input === 'w') { handlers.onGoToWindow(); return; }\n if (input === 'g') { handlers.onEditGoal(); return; }\n if (input === 'n') { handlers.onNewSession(); return; }\n if (input === 'c') { handlers.onClaude(); return; }\n if (input === 'p') { handlers.onOpenPlan(); return; }\n if (input === 'q') { handlers.onQuit(); return; }\n if (input === 'r') { handlers.onReRun(); return; }\n if (input === 'j') { handlers.onJumpToPane(); return; }\n if (input === 'R') { handlers.onResume(); return; }\n if (input === 'C') { handlers.onContinue(); return; }\n if (input === 'x') { handlers.onRestartAgent(); return; }\n if (input === 'b') { handlers.onRollback(); return; }\n if (input === 'l') { handlers.onToggleLogs(); return; }\n },\n { isActive },\n );\n}\n","import { useInput } from 'ink';\nimport type { InputMode } from '../components/InputBar.js';\n\nexport type LeaderAction =\n | { type: 'enter-copy-menu' }\n | { type: 'copy-path' }\n | { type: 'copy-context' }\n | { type: 'copy-logs' }\n | { type: 'copy-session-id' }\n | { type: 'delete-session' }\n | { type: 'open-logs' }\n | { type: 'open-session-dir' }\n | { type: 'search' }\n | { type: 'jump-to-session'; index: number }\n | { type: 'spawn-agent' }\n | { type: 'message-agent' }\n | { type: 'help' }\n | { type: 'shell-command' }\n | { type: 'dismiss' };\n\nexport function useLeaderKey(mode: InputMode, onAction: (action: LeaderAction) => void): void {\n useInput(\n (input, key) => {\n if (key.escape) { onAction({ type: 'dismiss' }); return; }\n if (input === 'y') { onAction({ type: 'enter-copy-menu' }); return; }\n if (input === 'd') { onAction({ type: 'delete-session' }); return; }\n if (input === 'l') { onAction({ type: 'open-logs' }); return; }\n if (input === 'o') { onAction({ type: 'open-session-dir' }); return; }\n if (input === '/') { onAction({ type: 'search' }); return; }\n if (input === 'a') { onAction({ type: 'spawn-agent' }); return; }\n if (input === 'm') { onAction({ type: 'message-agent' }); return; }\n if (input === '?') { onAction({ type: 'help' }); return; }\n if (input === '!') { onAction({ type: 'shell-command' }); return; }\n const digit = parseInt(input, 10);\n if (!isNaN(digit) && digit >= 1 && digit <= 9) {\n onAction({ type: 'jump-to-session', index: digit });\n return;\n }\n onAction({ type: 'dismiss' });\n },\n { isActive: mode === 'leader' },\n );\n\n useInput(\n (input, key) => {\n if (key.escape) { onAction({ type: 'dismiss' }); return; }\n if (input === 'p') { onAction({ type: 'copy-path' }); return; }\n if (input === 'C') { onAction({ type: 'copy-context' }); return; }\n if (input === 'l') { onAction({ type: 'copy-logs' }); return; }\n if (input === 's') { onAction({ type: 'copy-session-id' }); return; }\n onAction({ type: 'dismiss' });\n },\n { isActive: mode === 'copy-menu' },\n );\n\n useInput(\n (input, key) => {\n if (key.escape || input === '?') { onAction({ type: 'dismiss' }); return; }\n },\n { isActive: mode === 'help' },\n );\n}\n","import { readFileSync } from 'node:fs';\nimport type { AgentReport } from '../../shared/types.js';\n\nexport interface ReportBlock {\n type: 'update' | 'final';\n timestamp: string;\n content: string;\n summary: string;\n}\n\nfunction loadReportContent(report: AgentReport): string {\n try {\n return readFileSync(report.filePath, 'utf-8');\n } catch {\n return report.summary;\n }\n}\n\nexport function resolveReports(reports: AgentReport[]): ReportBlock[] {\n return [...reports].reverse().map((r) => ({\n type: r.type as 'update' | 'final',\n timestamp: r.timestamp,\n content: loadReportContent(r),\n summary: r.summary,\n }));\n}\n","import { execSync } from 'node:child_process';\n\nexport function copyToClipboard(text: string): void {\n execSync('pbcopy', { input: text });\n}\n","import { readFileSync } from 'node:fs';\nimport { goalPath, roadmapPath } from '../../shared/paths.js';\nimport { resolveReports } from './reports.js';\nimport type { Session } from '../../shared/types.js';\n\nfunction readFileSafe(filePath: string): string | null {\n try {\n return readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nexport function buildSessionContext(session: Session, cwd: string): string {\n const goal = readFileSafe(goalPath(cwd, session.id));\n const roadmap = readFileSafe(roadmapPath(cwd, session.id));\n\n const agentsXml = session.agents.map((agent) => {\n const reportBlocks = resolveReports(agent.reports);\n // resolveReports returns newest-first; reverse to chronological for context\n const reportsXml = [...reportBlocks].reverse().map((block) => {\n return ` <report type=\"${block.type}\" time=\"${escapeXml(block.timestamp)}\">${escapeXml(block.content)}</report>`;\n }).join('\\n');\n\n return [\n ` <agent id=\"${escapeXml(agent.id)}\" name=\"${escapeXml(agent.name)}\" type=\"${escapeXml(agent.agentType)}\" status=\"${escapeXml(agent.status)}\">`,\n ` <instruction>${escapeXml(agent.instruction)}</instruction>`,\n ...(reportsXml ? [reportsXml] : []),\n ` </agent>`,\n ].join('\\n');\n }).join('\\n');\n\n const cyclesXml = session.orchestratorCycles.map((cycle) => {\n const agents = cycle.agentsSpawned.join(', ');\n const mode = cycle.mode ? ` mode=\"${escapeXml(cycle.mode)}\"` : '';\n return ` <cycle number=\"${cycle.cycle}\"${mode} agents=\"${escapeXml(agents)}\" />`;\n }).join('\\n');\n\n const lines: string[] = [\n '<context>',\n `<session id=\"${escapeXml(session.id)}\" status=\"${escapeXml(session.status)}\">`,\n ` <task>${escapeXml(session.task)}</task>`,\n ` <cwd>${escapeXml(session.cwd)}</cwd>`,\n ];\n\n if (goal) lines.push(` <goal>${escapeXml(goal)}</goal>`);\n if (roadmap) lines.push(` <roadmap>${escapeXml(roadmap)}</roadmap>`);\n\n if (session.agents.length > 0) {\n lines.push(' <agents>');\n lines.push(agentsXml);\n lines.push(' </agents>');\n }\n\n if (session.orchestratorCycles.length > 0) {\n lines.push(' <cycles>');\n lines.push(cyclesXml);\n lines.push(' </cycles>');\n }\n\n if (session.completionReport) {\n lines.push(` <completion-report>${escapeXml(session.completionReport)}</completion-report>`);\n }\n\n lines.push('</session>');\n lines.push('</context>');\n\n return lines.join('\\n');\n}\n","import type {\n TreeNode,\n SessionTreeNode,\n CycleTreeNode,\n AgentTreeNode,\n ReportTreeNode,\n MessagesTreeNode,\n MessageTreeNode,\n} from '../types/tree.js';\nimport type { Session } from '../../shared/types.js';\nimport type { SessionSummary } from '../hooks/usePolling.js';\nimport { windowExists } from './tmux.js';\n\n/** Sort priority: active+open=0, active+closed=1, paused+open=2, paused+closed=3, completed=4 */\nfunction sessionSortKey(s: SessionSummary): number {\n if (s.status === 'completed') return 4;\n const open = s.tmuxWindowId ? windowExists(s.tmuxWindowId) : false;\n if (s.status === 'active') return open ? 0 : 1;\n // paused\n return open ? 2 : 3;\n}\n\nexport function buildTree(\n sessions: SessionSummary[],\n selectedSession: Session | null,\n expanded: Set<string>,\n): TreeNode[] {\n const nodes: TreeNode[] = [];\n\n const sorted = [...sessions].sort((a, b) => {\n const keyDiff = sessionSortKey(a) - sessionSortKey(b);\n if (keyDiff !== 0) return keyDiff;\n // Most recent first within each group\n return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n });\n\n for (const s of sorted) {\n const sessionNodeId = `session:${s.id}`;\n const isSelected = selectedSession?.id === s.id;\n const isExpanded = expanded.has(sessionNodeId);\n\n nodes.push({\n id: sessionNodeId,\n type: 'session',\n depth: 0,\n expandable: true,\n expanded: isExpanded && isSelected,\n sessionId: s.id,\n task: s.task,\n status: s.status,\n cycleCount: isSelected ? (selectedSession?.orchestratorCycles.length ?? 0) : 0,\n agentCount: s.agentCount,\n createdAt: s.createdAt,\n completedAt: isSelected ? selectedSession?.completedAt : undefined,\n } satisfies SessionTreeNode);\n\n // Only emit children for the selected+expanded session\n if (!isExpanded || !isSelected || !selectedSession) continue;\n\n const cycles = [...selectedSession.orchestratorCycles].reverse();\n const allSpawnedIds = new Set(\n selectedSession.orchestratorCycles.flatMap((c) => c.agentsSpawned),\n );\n\n for (const cycle of cycles) {\n const cycleNodeId = `cycle:${s.id}:${cycle.cycle}`;\n const cycleExpanded = expanded.has(cycleNodeId);\n\n // Agents belonging to this cycle\n const cycleAgents = selectedSession.agents.filter((a) =>\n cycle.agentsSpawned.includes(a.id),\n );\n\n // For the latest cycle, include unassigned agents\n const isLatest = cycle === cycles[0];\n const unassigned = isLatest\n ? selectedSession.agents.filter((a) => !allSpawnedIds.has(a.id))\n : [];\n const allCycleAgents = [...cycleAgents, ...unassigned];\n\n nodes.push({\n id: cycleNodeId,\n type: 'cycle',\n depth: 1,\n expandable: allCycleAgents.length > 0,\n expanded: cycleExpanded,\n sessionId: s.id,\n cycleNumber: cycle.cycle,\n timestamp: cycle.timestamp,\n completedAt: cycle.completedAt,\n agentCount: allCycleAgents.length,\n mode: cycle.mode,\n } satisfies CycleTreeNode);\n\n if (!cycleExpanded) continue;\n\n for (const agent of allCycleAgents) {\n const agentNodeId = `agent:${s.id}:${agent.id}`;\n const hasReports = agent.reports.length > 0;\n const agentExpanded = expanded.has(agentNodeId);\n\n nodes.push({\n id: agentNodeId,\n type: 'agent',\n depth: 2,\n expandable: hasReports,\n expanded: agentExpanded && hasReports,\n sessionId: s.id,\n agentId: agent.id,\n name: agent.name,\n agentType: agent.agentType,\n status: agent.status,\n spawnedAt: agent.spawnedAt,\n completedAt: agent.completedAt,\n reportCount: agent.reports.length,\n } satisfies AgentTreeNode);\n\n if (!agentExpanded || !hasReports) continue;\n\n for (let ri = 0; ri < agent.reports.length; ri++) {\n const report = agent.reports[ri]!;\n nodes.push({\n id: `report:${s.id}:${agent.id}:${ri}`,\n type: 'report',\n depth: 3,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n reportIndex: ri,\n reportType: report.type,\n timestamp: report.timestamp,\n agentId: agent.id,\n } satisfies ReportTreeNode);\n }\n }\n }\n\n // Messages group\n const messages = selectedSession.messages ?? [];\n if (messages.length > 0) {\n const msgsNodeId = `messages:${s.id}`;\n const msgsExpanded = expanded.has(msgsNodeId);\n\n nodes.push({\n id: msgsNodeId,\n type: 'messages',\n depth: 1,\n expandable: true,\n expanded: msgsExpanded,\n sessionId: s.id,\n count: messages.length,\n } satisfies MessagesTreeNode);\n\n if (msgsExpanded) {\n for (const msg of messages) {\n const sourceLabel =\n msg.source.type === 'user'\n ? 'You'\n : msg.source.type === 'agent'\n ? msg.source.agentId\n : 'system';\n\n nodes.push({\n id: `message:${s.id}:${msg.id}`,\n type: 'message',\n depth: 2,\n expandable: false,\n expanded: false,\n sessionId: s.id,\n messageId: msg.id,\n source: sourceLabel,\n summary: msg.summary || msg.content,\n timestamp: msg.timestamp,\n } satisfies MessageTreeNode);\n }\n }\n }\n }\n\n return nodes;\n}\n\n/** Find the parent node index for a given node index */\nexport function findParentIndex(nodes: TreeNode[], index: number): number {\n const node = nodes[index];\n if (!node || node.depth === 0) return index;\n const targetDepth = node.depth - 1;\n for (let i = index - 1; i >= 0; i--) {\n if (nodes[i]!.depth === targetDepth) return i;\n if (nodes[i]!.depth < targetDepth) return i;\n }\n return 0;\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useMemo","useRef","Box","Text","Box","Text","Box","Text","jsx","cleaned","wrapped","jsx","jsxs","row","Box","Text","useMemo","Box","Text","jsx","jsxs","seg","buildLines","Box","Text","useMemo","Box","Text","jsx","jsxs","Box","Text","dur","Box","Text","Fragment","jsx","jsxs","Box","Text","useMemo","Box","Text","jsx","jsxs","useMemo","lines","Box","Text","Box","Text","jsx","jsxs","Box","Text","useState","Box","Text","useInput","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","INNER","pad","INNER","jsxs","Box","jsx","Text","pad","useState","useEffect","useRef","readFileSync","join","cwd","cwd","useState","useRef","readFileSync","join","useEffect","useInput","useInput","readFileSync","execSync","readFileSync","readFileSync","cwd","sourceLabel","Fragment","jsx","jsxs","cwd","useState","useRef","useMemo","useEffect","useCallback","detailWidth","contentHeight","Box","Text","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sisyphi",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "description": "tmux-integrated orchestration daemon for Claude Code multi-agent workflows",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,11 +36,15 @@
36
36
  "prepublishOnly": "npm run build && npm test"
37
37
  },
38
38
  "dependencies": {
39
+ "@r-cli/sdk": "^1.2.0",
39
40
  "commander": "^13.1.0",
41
+ "ink": "^4.4.1",
42
+ "react": "^18.3.1",
40
43
  "uuid": "^11.1.0"
41
44
  },
42
45
  "devDependencies": {
43
46
  "@types/node": "^22.13.4",
47
+ "@types/react": "^18.3.28",
44
48
  "@types/uuid": "^10.0.0",
45
49
  "tsup": "^8.4.0",
46
50
  "tsx": "^4.21.0",
@@ -4,9 +4,11 @@ System prompt templates for orchestrator and agent initialization.
4
4
 
5
5
  ## Core Templates
6
6
 
7
- - **orchestrator.md** — Orchestrator system prompt. Defines orchestrator role (coordinator, not implementer), cycle workflow, phase-based thinking (explore → spec → plan → implement → review → test), context persistence via plan.md/logs.md, work right-sizing (~30 tool calls per item), and validation patterns. Rendered with `<state>` block injected containing agent reports, cycle history, plan/logs references.
8
- - **agent-suffix.md** — Agent system prompt suffix. Contains `{{SESSION_ID}}` and `{{INSTRUCTION}}` placeholders. Rendered once per agent spawn.
9
- - **banner.txt** — ASCII banner (cosmetic, displayed on daemon startup or CLI output).
7
+ - **orchestrator-base.md** — Core orchestrator system prompt. Defines orchestrator role (coordinator, not implementer), cycle workflow, context persistence via roadmap.md/logs.md, and validation patterns. Rendered as foundation for all orchestrator prompts.
8
+ - **orchestrator-planning.md** — Planning-phase orchestrator guidance. Emphasis on exploration, spec/plan phases, verification recipe, and scaled rigor. Appended when `--mode planning` (default).
9
+ - **orchestrator-impl.md** — Implementation-phase orchestrator guidance. Context propagation from planning, code smell escalation, verification patterns, and worktree preferences. Appended when `--mode implementation`.
10
+ - **agent-suffix.md** — Agent system prompt suffix. Contains `{{SESSION_ID}}`, `{{INSTRUCTION}}`, and `{{WORKTREE_CONTEXT}}` placeholders. Rendered once per agent spawn.
11
+ - **banner.txt** — ASCII banner (cosmetic).
10
12
 
11
13
  ## Configuration Files
12
14
 
@@ -21,30 +23,29 @@ System prompt templates for orchestrator and agent initialization.
21
23
  ## Rendering Rules
22
24
 
23
25
  **Orchestrator prompt**:
24
- 1. Read `orchestrator.md` (or project override `.sisyphus/orchestrator.md`)
25
- 2. Load settings from `orchestrator-settings.json` (or project override)
26
- 3. Append `<state>` block with: agent reports, cycle count, history, plan.md and logs.md references
27
- 4. Pass to Claude via `--append-system-prompt` flag
28
- 5. User prompt: concise cycle instruction ("review reports, delegate next phase")
26
+ 1. Load orchestrator-base.md
27
+ 2. Append phase-specific guidance: orchestrator-planning.md (default) or orchestrator-impl.md (when `--mode implementation`)
28
+ 3. Inject session state with agent reports, cycle count, roadmap.md/logs.md references
29
+ 4. Load settings from `orchestrator-settings.json` (or project override)
30
+ 5. Pass via `--append-system-prompt` flag
29
31
 
30
32
  **Agent prompt**:
31
33
  1. Read `agent-suffix.md`
32
- 2. Load settings from `agent-settings.json` (or project override)
33
- 3. Replace `{{SESSION_ID}}` with session UUID
34
- 4. Replace `{{INSTRUCTION}}` with task instruction (e.g., "implement login feature")
35
- 5. Pass via `--append-system-prompt` flag
36
- 6. User prompt: instruction again (for clarity)
34
+ 2. Replace `{{SESSION_ID}}` with session UUID
35
+ 3. Replace `{{INSTRUCTION}}` with task instruction
36
+ 4. Replace `{{WORKTREE_CONTEXT}}` with branch/worktree info (if `--worktree` used)
37
+ 5. Load settings from `agent-settings.json` (or project override)
38
+ 6. Pass via `--append-system-prompt` flag
37
39
 
38
40
  **Plugin prompts** (`agent-plugin/*.md`):
39
41
  - Used only when agent spawned with `--agent-type sisyphus:{type}`
40
42
  - Replaces default agent-suffix.md rendering
41
43
  - Same placeholder substitution rules apply
42
44
 
43
- ## Important Boundaries
45
+ ## Key Patterns
44
46
 
45
- - Do **not** hardcode session IDs or agent names—use placeholders
46
- - Do **not** include raw JSON in prompts—use human-readable `<state>` formatting
47
- - Do **not** reference external files (only relative paths in `.sisyphus/`)
48
- - Do **keep prompts concise**—Claude reads full state separately
49
- - Settings files must be valid JSON; use project overrides to customize behavior per-workspace
50
- - Orchestrator template should emphasize phase-based methodology and context preservation, not encourage autonomous rushing
47
+ - **Phase modes**: `--mode planning` (default) uses orchestrator-base.md + orchestrator-planning.md; `--mode implementation` uses orchestrator-base.md + orchestrator-impl.md
48
+ - **Context files**: agents save findings to `.sisyphus/sessions/$SISYPHUS_SESSION_ID/context/` and pass references to downstream agents
49
+ - **Worktree context**: `{{WORKTREE_CONTEXT}}` is auto-populated with isolated branch/worktree info when agent spawned with `--worktree`
50
+ - **Placeholders**: always use `{{SESSION_ID}}`, `{{INSTRUCTION}}`, `{{WORKTREE_CONTEXT}}`—never hardcode values
51
+ - Settings files are valid JSON; use project overrides to customize per-workspace