copilot-agent 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/session.ts","../src/lib/process.ts","../src/lib/logger.ts","../src/lib/colors.ts","../src/commands/status.ts","../src/lib/provider.ts","../src/commands/watch.ts","../src/lib/detect.ts","../src/lib/tasks.ts","../src/lib/lock.ts","../src/lib/git.ts","../src/commands/run.ts","../src/commands/overnight.ts","../src/commands/research.ts","../src/commands/report.ts","../src/tui/widgets.ts","../src/commands/dashboard.ts","../src/commands/web.ts","../src/web/layout.ts","../src/web/views.ts","../src/commands/config.ts","../src/lib/config.ts","../src/commands/proxy.ts","../src/commands/diff.ts","../src/commands/quota.ts","../src/lib/quota.ts","../src/commands/compact.ts","../src/lib/compact.ts","../src/commands/hooks.ts","../src/lib/hooks.ts","../src/commands/pr.ts","../src/commands/template.ts","../src/commands/log.ts","../src/commands/multi.ts","../src/commands/review.ts","../src/commands/schedule.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStatusCommand } from './commands/status.js';\nimport { registerWatchCommand } from './commands/watch.js';\nimport { registerRunCommand } from './commands/run.js';\nimport { registerOvernightCommand } from './commands/overnight.js';\nimport { registerResearchCommand } from './commands/research.js';\nimport { registerReportCommand } from './commands/report.js';\nimport { registerDashboardCommand } from './commands/dashboard.js';\nimport { registerWebCommand } from './commands/web.js';\nimport { registerConfigCommand } from './commands/config.js';\nimport { registerProxyCommand } from './commands/proxy.js';\nimport { registerDiffCommand } from './commands/diff.js';\nimport { registerQuotaCommand } from './commands/quota.js';\nimport { registerCompactCommand } from './commands/compact.js';\nimport { registerHooksCommand } from './commands/hooks.js';\nimport { registerPrCommand } from './commands/pr.js';\nimport { registerTemplateCommand } from './commands/template.js';\nimport { registerLogCommand } from './commands/log.js';\nimport { registerMultiCommand } from './commands/multi.js';\nimport { registerReviewCommand } from './commands/review.js';\nimport { registerScheduleCommand } from './commands/schedule.js';\n\nconst program = new Command();\n\nprogram\n .name('copilot-agent')\n .version('1.0.0')\n .description('Autonomous AI agent manager — auto-resume, task discovery, overnight runs. Supports GitHub Copilot CLI + Claude Code.');\n\nregisterStatusCommand(program);\nregisterWatchCommand(program);\nregisterRunCommand(program);\nregisterOvernightCommand(program);\nregisterResearchCommand(program);\nregisterReportCommand(program);\nregisterDashboardCommand(program);\nregisterWebCommand(program);\nregisterConfigCommand(program);\nregisterProxyCommand(program);\nregisterDiffCommand(program);\nregisterQuotaCommand(program);\nregisterCompactCommand(program);\nregisterHooksCommand(program);\nregisterPrCommand(program);\nregisterLogCommand(program);\nregisterTemplateCommand(program);\nregisterMultiCommand(program);\nregisterReviewCommand(program);\nregisterScheduleCommand(program);\n\nprogram.parse();\n","import {\n existsSync,\n readdirSync,\n readFileSync,\n statSync,\n} from 'node:fs';\nimport { join, resolve, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { AgentType } from './provider.js';\n\nexport interface Session {\n id: string;\n dir: string;\n mtime: number;\n lastEvent: string;\n premiumRequests: number;\n summary: string;\n cwd: string;\n complete: boolean;\n agent: AgentType;\n}\n\nexport interface SessionReport {\n id: string;\n cwd: string;\n summary: string;\n startTime: string;\n endTime: string;\n durationMs: number;\n complete: boolean;\n userMessages: number;\n assistantTurns: number;\n outputTokens: number;\n premiumRequests: number;\n toolUsage: Record<string, number>;\n gitCommits: string[];\n filesCreated: string[];\n filesEdited: string[];\n errors: string[];\n taskCompletions: string[];\n agent: AgentType;\n}\n\nconst SESSION_DIR = join(homedir(), '.copilot', 'session-state');\nconst CLAUDE_DIR = join(homedir(), '.claude');\nconst CLAUDE_PROJECTS_DIR = join(CLAUDE_DIR, 'projects');\n\nexport function getSessionDir(): string {\n return SESSION_DIR;\n}\n\nexport function validateSession(sid: string): boolean {\n const events = join(SESSION_DIR, sid, 'events.jsonl');\n try {\n return existsSync(events) && statSync(events).size > 0;\n } catch {\n return false;\n }\n}\n\nexport function listSessions(limit = 20): Session[] {\n if (!existsSync(SESSION_DIR)) return [];\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n const dirs: { id: string; dir: string; mtime: number }[] = [];\n for (const entry of entries) {\n const dirPath = join(SESSION_DIR, entry.name);\n if (!existsSync(join(dirPath, 'events.jsonl'))) continue;\n try {\n const stat = statSync(dirPath);\n dirs.push({ id: entry.name, dir: dirPath, mtime: stat.mtimeMs });\n } catch { /* skip */ }\n }\n\n dirs.sort((a, b) => b.mtime - a.mtime);\n\n return dirs.slice(0, limit).map(s => ({\n id: s.id,\n dir: s.dir,\n mtime: s.mtime,\n lastEvent: getLastEvent(s.id),\n premiumRequests: getSessionPremium(s.id),\n summary: getSessionSummary(s.id),\n cwd: getSessionCwd(s.id),\n complete: hasTaskComplete(s.id),\n agent: 'copilot' as AgentType,\n }));\n}\n\nexport function getLatestSessionId(): string | null {\n if (!existsSync(SESSION_DIR)) return null;\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n let latest: { id: string; mtime: number } | null = null;\n for (const entry of entries) {\n try {\n const stat = statSync(join(SESSION_DIR, entry.name));\n if (!latest || stat.mtimeMs > latest.mtime) {\n latest = { id: entry.name, mtime: stat.mtimeMs };\n }\n } catch { /* skip */ }\n }\n return latest?.id ?? null;\n}\n\nexport function hasTaskComplete(sid: string): boolean {\n if (!validateSession(sid)) return false;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n return content.includes('\"session.task_complete\"');\n } catch {\n return false;\n }\n}\n\nexport function getLastEvent(sid: string): string {\n if (!validateSession(sid)) return 'invalid';\n try {\n const lines = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8')\n .trimEnd()\n .split('\\n');\n const last = JSON.parse(lines[lines.length - 1]);\n return last.type ?? 'unknown';\n } catch {\n return 'corrupted';\n }\n}\n\nexport function getSessionPremium(sid: string): number {\n if (!validateSession(sid)) return 0;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n const lines = content.trimEnd().split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const event = JSON.parse(lines[i]);\n if (event.type === 'session.shutdown' && event.data?.totalPremiumRequests != null) {\n return event.data.totalPremiumRequests;\n }\n } catch { /* skip malformed line */ }\n }\n return 0;\n } catch {\n return 0;\n }\n}\n\nfunction parseSimpleYaml(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const idx = line.indexOf(': ');\n if (idx === -1) continue;\n const key = line.substring(0, idx).trim();\n const value = line.substring(idx + 2).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nfunction readWorkspace(sid: string): Record<string, string> {\n const wsPath = join(SESSION_DIR, sid, 'workspace.yaml');\n if (!existsSync(wsPath)) return {};\n try {\n return parseSimpleYaml(readFileSync(wsPath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function getSessionSummary(sid: string): string {\n return readWorkspace(sid).summary ?? '';\n}\n\nexport function getSessionCwd(sid: string): string {\n return readWorkspace(sid).cwd ?? '';\n}\n\nexport function findSessionForProject(projectPath: string): string | null {\n const resolved = resolve(projectPath);\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (s.cwd && resolve(s.cwd) === resolved) return s.id;\n }\n return null;\n}\n\nexport function findLatestIncomplete(): string | null {\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (!s.complete) return s.id;\n }\n return null;\n}\n\nexport function getSessionReport(sid: string): SessionReport | null {\n if (!validateSession(sid)) return null;\n\n const ws = readWorkspace(sid);\n let lines: string[];\n try {\n lines = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8')\n .trimEnd()\n .split('\\n');\n } catch {\n return null;\n }\n\n const report: SessionReport = {\n id: sid,\n cwd: ws.cwd ?? '',\n summary: ws.summary ?? '',\n startTime: '',\n endTime: '',\n durationMs: 0,\n complete: false,\n userMessages: 0,\n assistantTurns: 0,\n outputTokens: 0,\n premiumRequests: 0,\n toolUsage: {},\n gitCommits: [],\n filesCreated: [],\n filesEdited: [],\n errors: [],\n taskCompletions: [],\n agent: 'copilot',\n };\n\n for (const line of lines) {\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n\n const type = event.type as string;\n const ts = event.timestamp as string | undefined;\n const data = (event.data ?? {}) as Record<string, unknown>;\n\n if (ts && !report.startTime) report.startTime = ts;\n if (ts) report.endTime = ts;\n\n switch (type) {\n case 'user.message':\n report.userMessages++;\n break;\n\n case 'assistant.message':\n report.assistantTurns++;\n report.outputTokens += (data.outputTokens as number) ?? 0;\n break;\n\n case 'tool.execution_start': {\n const toolName = data.toolName as string;\n if (toolName) {\n report.toolUsage[toolName] = (report.toolUsage[toolName] ?? 0) + 1;\n }\n // Track git commits\n if (toolName === 'bash') {\n const args = data.arguments as Record<string, string> | undefined;\n const cmd = args?.command ?? '';\n if (cmd.includes('git') && cmd.includes('commit') && cmd.includes('-m')) {\n const msgMatch = cmd.match(/-m\\s+\"([^\"]{1,120})/);\n if (msgMatch) report.gitCommits.push(msgMatch[1]);\n }\n }\n // Track file creates/edits\n if (toolName === 'create') {\n const args = data.arguments as Record<string, string> | undefined;\n if (args?.path) report.filesCreated.push(args.path);\n }\n if (toolName === 'edit') {\n const args = data.arguments as Record<string, string> | undefined;\n if (args?.path && !report.filesEdited.includes(args.path)) {\n report.filesEdited.push(args.path);\n }\n }\n break;\n }\n\n case 'session.task_complete': {\n const summary = data.summary as string | undefined;\n report.taskCompletions.push(summary ?? '(task completed)');\n report.complete = true;\n break;\n }\n\n case 'session.error': {\n const msg = data.message as string | undefined;\n if (msg) report.errors.push(msg);\n break;\n }\n\n case 'session.shutdown': {\n const premium = data.totalPremiumRequests as number | undefined;\n if (premium != null) report.premiumRequests = premium;\n break;\n }\n }\n }\n\n if (report.startTime && report.endTime) {\n report.durationMs = new Date(report.endTime).getTime() - new Date(report.startTime).getTime();\n }\n\n return report;\n}\n\n// ─── Claude Code session support ───\n\n/**\n * Decode Claude's encoded project path back to filesystem path.\n * Claude encodes `/Users/foo/project` as `-Users-foo-project`.\n */\nfunction decodeClaudePath(encoded: string): string {\n return encoded.replace(/^-/, '/').replace(/-/g, '/');\n}\n\nfunction encodeClaudePath(fsPath: string): string {\n return fsPath.replace(/\\//g, '-');\n}\n\n/**\n * List all Claude Code sessions across all projects.\n */\nexport function listClaudeSessions(limit = 20): Session[] {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return [];\n\n const sessions: Session[] = [];\n try {\n const projectDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n for (const projDir of projectDirs) {\n const projPath = join(CLAUDE_PROJECTS_DIR, projDir.name);\n const cwd = decodeClaudePath(projDir.name);\n\n const files = readdirSync(projPath).filter(f => f.endsWith('.jsonl'));\n for (const file of files) {\n const filePath = join(projPath, file);\n const sid = basename(file, '.jsonl');\n try {\n const stat = statSync(filePath);\n const { lastEvent, complete, summary } = parseClaudeSessionMeta(filePath);\n sessions.push({\n id: sid,\n dir: projPath,\n mtime: stat.mtimeMs,\n lastEvent,\n premiumRequests: 0,\n summary,\n cwd,\n complete,\n agent: 'claude',\n });\n } catch { /* skip */ }\n }\n }\n } catch { /* skip */ }\n\n sessions.sort((a, b) => b.mtime - a.mtime);\n return sessions.slice(0, limit);\n}\n\nfunction parseClaudeSessionMeta(filePath: string): { lastEvent: string; complete: boolean; summary: string } {\n try {\n const content = readFileSync(filePath, 'utf-8').trimEnd();\n const lines = content.split('\\n');\n let lastEvent = 'unknown';\n let complete = false;\n let summary = '';\n\n // Read last few lines for metadata\n for (let i = lines.length - 1; i >= Math.max(0, lines.length - 5); i--) {\n try {\n const event = JSON.parse(lines[i]);\n if (i === lines.length - 1) {\n lastEvent = event.type ?? event.role ?? 'unknown';\n }\n // Claude marks completion with result type or specific message patterns\n if (event.type === 'result' || (event.type === 'assistant' && event.stop_reason === 'end_turn')) {\n complete = true;\n }\n } catch { /* skip */ }\n }\n\n // Get summary from first assistant message\n for (const line of lines.slice(0, 10)) {\n try {\n const event = JSON.parse(line);\n if ((event.type === 'human' || event.role === 'human') && event.message) {\n summary = typeof event.message === 'string'\n ? event.message.slice(0, 100)\n : JSON.stringify(event.message).slice(0, 100);\n break;\n }\n } catch { /* skip */ }\n }\n\n return { lastEvent, complete, summary };\n } catch {\n return { lastEvent: 'error', complete: false, summary: '' };\n }\n}\n\nexport function getLatestClaudeSessionId(projectDir?: string): string | null {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return null;\n\n let searchDirs: string[];\n if (projectDir) {\n const encoded = encodeClaudePath(resolve(projectDir));\n const projPath = join(CLAUDE_PROJECTS_DIR, encoded);\n searchDirs = existsSync(projPath) ? [projPath] : [];\n } else {\n try {\n searchDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => join(CLAUDE_PROJECTS_DIR, d.name));\n } catch {\n return null;\n }\n }\n\n let latest: { id: string; mtime: number } | null = null;\n for (const dir of searchDirs) {\n try {\n const files = readdirSync(dir).filter(f => f.endsWith('.jsonl'));\n for (const file of files) {\n const stat = statSync(join(dir, file));\n if (!latest || stat.mtimeMs > latest.mtime) {\n latest = { id: basename(file, '.jsonl'), mtime: stat.mtimeMs };\n }\n }\n } catch { /* skip */ }\n }\n return latest?.id ?? null;\n}\n\nexport function getClaudeSessionCwd(sid: string): string {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return '';\n try {\n const projectDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n for (const projDir of projectDirs) {\n const filePath = join(CLAUDE_PROJECTS_DIR, projDir.name, `${sid}.jsonl`);\n if (existsSync(filePath)) {\n return decodeClaudePath(projDir.name);\n }\n }\n } catch { /* skip */ }\n return '';\n}\n\nexport function getClaudeSessionReport(sid: string): SessionReport | null {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return null;\n\n // Find session file\n let filePath: string | null = null;\n let cwd = '';\n try {\n const projectDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n for (const projDir of projectDirs) {\n const candidate = join(CLAUDE_PROJECTS_DIR, projDir.name, `${sid}.jsonl`);\n if (existsSync(candidate)) {\n filePath = candidate;\n cwd = decodeClaudePath(projDir.name);\n break;\n }\n }\n } catch { /* skip */ }\n\n if (!filePath) return null;\n\n let lines: string[];\n try {\n lines = readFileSync(filePath, 'utf-8').trimEnd().split('\\n');\n } catch {\n return null;\n }\n\n const report: SessionReport = {\n id: sid, cwd, summary: '', startTime: '', endTime: '',\n durationMs: 0, complete: false, userMessages: 0, assistantTurns: 0,\n outputTokens: 0, premiumRequests: 0, toolUsage: {}, gitCommits: [],\n filesCreated: [], filesEdited: [], errors: [], taskCompletions: [],\n agent: 'claude',\n };\n\n for (const line of lines) {\n let event: Record<string, unknown>;\n try { event = JSON.parse(line); } catch { continue; }\n\n const type = (event.type ?? event.role ?? '') as string;\n const ts = event.timestamp as string | undefined;\n\n if (ts && !report.startTime) report.startTime = ts;\n if (ts) report.endTime = ts;\n\n // Claude JSONL uses 'human'/'assistant'/'tool_use'/'tool_result' types\n if (type === 'human' || type === 'user') {\n report.userMessages++;\n if (!report.summary) {\n const msg = event.message ?? event.content;\n report.summary = (typeof msg === 'string' ? msg : JSON.stringify(msg ?? '')).slice(0, 100);\n }\n }\n\n if (type === 'assistant') {\n report.assistantTurns++;\n const usage = event.usage as Record<string, number> | undefined;\n if (usage?.output_tokens) report.outputTokens += usage.output_tokens;\n if (event.stop_reason === 'end_turn') report.complete = true;\n }\n\n if (type === 'tool_use') {\n const toolName = (event.name ?? event.tool ?? 'unknown') as string;\n report.toolUsage[toolName] = (report.toolUsage[toolName] ?? 0) + 1;\n\n // Track git commits from Bash tool\n if (toolName === 'Bash' || toolName === 'bash') {\n const input = (event.input ?? '') as string;\n const cmd = typeof input === 'string' ? input : (input as Record<string, string>)?.command ?? '';\n if (cmd.includes('git') && cmd.includes('commit') && cmd.includes('-m')) {\n const msgMatch = cmd.match(/-m\\s+\"([^\"]{1,120})/);\n if (msgMatch) report.gitCommits.push(msgMatch[1]);\n }\n }\n // Track file operations\n if (toolName === 'Write' || toolName === 'Create') {\n const path = (event.input as Record<string, string>)?.file_path\n ?? (event.input as Record<string, string>)?.path;\n if (path) report.filesCreated.push(path);\n }\n if (toolName === 'Edit') {\n const path = (event.input as Record<string, string>)?.file_path\n ?? (event.input as Record<string, string>)?.path;\n if (path && !report.filesEdited.includes(path)) report.filesEdited.push(path);\n }\n }\n\n if (type === 'result') {\n report.complete = true;\n const result = (event.result ?? event.content ?? '') as string;\n if (result) report.taskCompletions.push(typeof result === 'string' ? result.slice(0, 200) : '(completed)');\n }\n\n if (type === 'error') {\n const msg = (event.error ?? event.message ?? 'unknown error') as string;\n report.errors.push(typeof msg === 'string' ? msg : JSON.stringify(msg));\n }\n }\n\n if (report.startTime && report.endTime) {\n report.durationMs = new Date(report.endTime).getTime() - new Date(report.startTime).getTime();\n }\n\n return report;\n}\n\n// ─── Unified session functions ───\n\n/**\n * List sessions from both Copilot and Claude Code, merged and sorted by time.\n */\nexport function listAllSessions(limit = 20, agentFilter?: AgentType): Session[] {\n const copilot = agentFilter === 'claude' ? [] : listSessions(limit);\n const claude = agentFilter === 'copilot' ? [] : listClaudeSessions(limit);\n const all = [...copilot, ...claude];\n all.sort((a, b) => b.mtime - a.mtime);\n return all.slice(0, limit);\n}\n\nexport function getAgentSessionReport(sid: string, agent?: AgentType): SessionReport | null {\n if (agent === 'claude') return getClaudeSessionReport(sid);\n if (agent === 'copilot') return getSessionReport(sid);\n // Auto-detect: try copilot first, then claude\n return getSessionReport(sid) ?? getClaudeSessionReport(sid);\n}\n\nexport function findLatestIncompleteForAgent(agent?: AgentType): { id: string; agent: AgentType } | null {\n const sessions = listAllSessions(50, agent);\n for (const s of sessions) {\n if (!s.complete) return { id: s.id, agent: s.agent };\n }\n return null;\n}\n","import { execSync, spawn } from 'node:child_process';\nimport { resolve } from 'node:path';\nimport { getLatestSessionId, getSessionPremium, getSessionCwd, getLatestClaudeSessionId, getClaudeSessionCwd } from './session.js';\nimport { log, warn, fail } from './logger.js';\nimport type { AgentType, AgentProcess, AgentResult } from './provider.js';\n\n// Re-export for backward compatibility\nexport type CopilotProcess = AgentProcess;\nexport type CopilotResult = AgentResult;\n\nexport function isCopilotInstalled(): boolean {\n try {\n execSync('which copilot', { stdio: 'pipe', encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function assertCopilot(): void {\n if (!isCopilotInstalled()) {\n fail('copilot CLI not found. Install with: npm i -g @githubnext/copilot');\n process.exit(1);\n }\n}\n\n/**\n * Find running agent processes (copilot, claude, or both).\n */\nexport function findAgentProcesses(agentFilter?: AgentType): AgentProcess[] {\n try {\n const output = execSync('ps -eo pid,command', { encoding: 'utf-8' });\n const results: AgentProcess[] = [];\n const myPid = process.pid;\n const parentPid = process.ppid;\n\n for (const line of output.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const isCopilot = (trimmed.includes('copilot') || trimmed.includes('@githubnext/copilot'))\n && !trimmed.includes('copilot-agent') && !trimmed.includes('copilot-api');\n const isClaude = trimmed.includes('claude') && !trimmed.includes('claude-code')\n && !trimmed.includes('copilot-agent');\n\n if (!isCopilot && !isClaude) continue;\n if (trimmed.includes('ps -eo') || trimmed.includes('grep')) continue;\n\n const agent: AgentType = isClaude ? 'claude' : 'copilot';\n if (agentFilter && agent !== agentFilter) continue;\n\n const match = trimmed.match(/^(\\d+)\\s+(.+)$/);\n if (!match) continue;\n\n const pid = parseInt(match[1], 10);\n if (pid === myPid || pid === parentPid) continue;\n const cmd = match[2];\n\n // Extract session ID from command args\n const sidMatch = agent === 'copilot'\n ? cmd.match(/resume[= ]+([a-f0-9-]{36})/)\n : cmd.match(/(?:--resume|--session-id)[= ]+([a-f0-9-]{36})/);\n\n let cwd: string | undefined;\n try {\n cwd = execSync(`lsof -p ${pid} -Fn 2>/dev/null | grep '^n/' | head -1`, {\n encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim().slice(1) || undefined;\n } catch { /* best effort */ }\n\n const sid = sidMatch?.[1];\n if (!cwd && sid) {\n cwd = (agent === 'copilot' ? getSessionCwd(sid) : getClaudeSessionCwd(sid)) || undefined;\n }\n\n results.push({ pid, command: cmd, sessionId: sid, cwd, agent });\n }\n return results;\n } catch {\n return [];\n }\n}\n\n/** @deprecated Use findAgentProcesses('copilot') */\nexport function findCopilotProcesses(): AgentProcess[] {\n return findAgentProcesses('copilot');\n}\n\nexport function findPidForSession(sid: string, agent?: AgentType): number | null {\n const procs = findAgentProcesses(agent);\n const matching = procs\n .filter(p => p.command.includes(sid))\n .sort((a, b) => b.pid - a.pid);\n return matching[0]?.pid ?? null;\n}\n\n/**\n * SAFETY: Wait until no agent is running in the SAME directory.\n */\nexport async function waitForAgentInDir(\n dir: string,\n agent?: AgentType,\n timeoutMs = 14_400_000,\n pollMs = 10_000,\n): Promise<void> {\n const targetDir = resolve(dir);\n const start = Date.now();\n let warned = false;\n const label = agent ?? 'agent';\n while (Date.now() - start < timeoutMs) {\n const procs = findAgentProcesses(agent);\n const conflicting = procs.filter(p => {\n if (!p.cwd) return false;\n return resolve(p.cwd) === targetDir;\n });\n if (conflicting.length === 0) return;\n if (!warned) {\n warn(`Waiting for ${label} in ${targetDir} to finish...`);\n for (const p of conflicting) {\n log(` PID ${p.pid}: ${p.command.slice(0, 80)}`);\n }\n warned = true;\n }\n await sleep(pollMs);\n }\n warn(`Timeout waiting for ${label} to finish in directory`);\n}\n\n/** @deprecated Use waitForAgentInDir */\nexport function waitForCopilotInDir(dir: string, timeoutMs?: number, pollMs?: number) {\n return waitForAgentInDir(dir, 'copilot', timeoutMs, pollMs);\n}\n\nexport function assertSessionNotRunning(sid: string, agent?: AgentType): void {\n const pid = findPidForSession(sid, agent);\n if (pid) {\n const label = agent ?? 'agent';\n fail(`Session ${sid.slice(0, 8)}… already has ${label} running (PID ${pid}). Cannot resume.`);\n process.exit(1);\n }\n}\n\nexport async function waitForExit(pid: number, timeoutMs = 14_400_000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n process.kill(pid, 0);\n await sleep(5000);\n } catch {\n return true;\n }\n }\n return false;\n}\n\n// ─── Copilot-specific runners ───\n\nexport async function runCopilot(\n args: string[],\n options?: { cwd?: string; useWorktree?: boolean },\n): Promise<AgentResult> {\n const dir = options?.cwd ?? process.cwd();\n\n if (!options?.useWorktree) {\n await waitForAgentInDir(dir, 'copilot');\n }\n\n return new Promise((resolve) => {\n const child = spawn('copilot', args, {\n cwd: options?.cwd,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n child.on('close', async (code) => {\n await sleep(3000);\n const sid = getLatestSessionId();\n const premium = sid ? getSessionPremium(sid) : 0;\n resolve({ exitCode: code ?? 1, sessionId: sid, premium });\n });\n\n child.on('error', () => {\n resolve({ exitCode: 1, sessionId: null, premium: 0 });\n });\n });\n}\n\nexport function runCopilotResume(\n sid: string, steps: number, message?: string, cwd?: string,\n): Promise<AgentResult> {\n assertSessionNotRunning(sid, 'copilot');\n const args = [\n `--resume=${sid}`, '--autopilot', '--allow-all',\n '--max-autopilot-continues', String(steps), '--no-ask-user',\n ];\n if (message) args.push('-p', message);\n return runCopilot(args, { cwd });\n}\n\nexport function runCopilotTask(\n prompt: string, steps: number, cwd?: string, useWorktree?: boolean,\n): Promise<AgentResult> {\n return runCopilot([\n '-p', prompt, '--autopilot', '--allow-all',\n '--max-autopilot-continues', String(steps), '--no-ask-user',\n ], { cwd, useWorktree });\n}\n\n// ─── Claude Code runners ───\n\nexport async function runClaude(\n args: string[],\n options?: { cwd?: string; useWorktree?: boolean },\n): Promise<AgentResult> {\n const dir = options?.cwd ?? process.cwd();\n\n if (!options?.useWorktree) {\n await waitForAgentInDir(dir, 'claude');\n }\n\n return new Promise((resolve) => {\n const child = spawn('claude', args, {\n cwd: options?.cwd,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n child.on('close', async (code) => {\n await sleep(2000);\n const sid = getLatestClaudeSessionId(options?.cwd);\n resolve({ exitCode: code ?? 1, sessionId: sid, premium: 0 });\n });\n\n child.on('error', () => {\n resolve({ exitCode: 1, sessionId: null, premium: 0 });\n });\n });\n}\n\nexport function runClaudeResume(\n sid: string, _steps: number, message?: string, cwd?: string,\n): Promise<AgentResult> {\n assertSessionNotRunning(sid, 'claude');\n const args = ['--resume', sid, '--dangerously-skip-permissions'];\n if (message) args.push(message);\n return runClaude(args, { cwd });\n}\n\nexport function runClaudeTask(\n prompt: string, _steps: number, cwd?: string, useWorktree?: boolean,\n): Promise<AgentResult> {\n return runClaude([\n '--print', '--dangerously-skip-permissions',\n '--output-format', 'text',\n prompt,\n ], { cwd, useWorktree });\n}\n\n// ─── Unified runners ───\n\nexport function runAgentTask(\n agent: AgentType, prompt: string, steps: number, cwd?: string, useWorktree?: boolean,\n): Promise<AgentResult> {\n return agent === 'claude'\n ? runClaudeTask(prompt, steps, cwd, useWorktree)\n : runCopilotTask(prompt, steps, cwd, useWorktree);\n}\n\nexport function runAgentResume(\n agent: AgentType, sid: string, steps: number, message?: string, cwd?: string,\n): Promise<AgentResult> {\n return agent === 'claude'\n ? runClaudeResume(sid, steps, message, cwd)\n : runCopilotResume(sid, steps, message, cwd);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { RED, GREEN, YELLOW, CYAN, DIM, RESET } from './colors.js';\n\nlet logFilePath: string | null = null;\n\nconst ANSI_RE =\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;\n\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '');\n}\n\nfunction writeToFile(msg: string): void {\n if (!logFilePath) return;\n try {\n appendFileSync(logFilePath, stripAnsi(msg) + '\\n');\n } catch { /* ignore file write errors */ }\n}\n\nexport function setLogFile(path: string): void {\n mkdirSync(dirname(path), { recursive: true });\n logFilePath = path;\n}\n\nexport function log(msg: string): void {\n console.log(msg);\n writeToFile(msg);\n}\n\nexport function warn(msg: string): void {\n const out = `${YELLOW}⚠ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`⚠ ${msg}`);\n}\n\nexport function ok(msg: string): void {\n const out = `${GREEN}✔ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`✔ ${msg}`);\n}\n\nexport function fail(msg: string): void {\n const out = `${RED}✖ ${msg}${RESET}`;\n console.error(out);\n writeToFile(`✖ ${msg}`);\n}\n\nexport function info(msg: string): void {\n const out = `${CYAN}ℹ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`ℹ ${msg}`);\n}\n\nexport function dim(msg: string): void {\n const out = `${DIM}${msg}${RESET}`;\n console.log(out);\n writeToFile(msg);\n}\n\nexport function notify(message: string, title = 'copilot-agent'): void {\n try {\n if (process.platform === 'darwin') {\n execSync(\n `osascript -e 'display notification \"${message.replace(/\"/g, '\\\\\"')}\" with title \"${title.replace(/\"/g, '\\\\\"')}\"'`,\n { stdio: 'ignore' },\n );\n } else {\n try {\n execSync('which notify-send', { stdio: 'pipe' });\n execSync(\n `notify-send \"${title}\" \"${message.replace(/\"/g, '\\\\\"')}\"`,\n { stdio: 'ignore' },\n );\n } catch { /* notify-send not available */ }\n }\n } catch { /* notification not available */ }\n}\n","export const RED = '\\x1b[31m';\nexport const GREEN = '\\x1b[32m';\nexport const YELLOW = '\\x1b[33m';\nexport const BLUE = '\\x1b[34m';\nexport const CYAN = '\\x1b[36m';\nexport const DIM = '\\x1b[2m';\nexport const BOLD = '\\x1b[1m';\nexport const RESET = '\\x1b[0m';\n","import type { Command } from 'commander';\nimport {\n listAllSessions,\n} from '../lib/session.js';\nimport { findAgentProcesses } from '../lib/process.js';\nimport { resolveAgent, type AgentType } from '../lib/provider.js';\nimport { log } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, GREEN, YELLOW, RESET } from '../lib/colors.js';\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show agent session status (copilot + claude)')\n .option('-l, --limit <n>', 'Number of sessions to show', '10')\n .option('-a, --active', 'Show only active (running) processes')\n .option('-i, --incomplete', 'Only show incomplete sessions')\n .option('--agent <type>', 'Filter by agent: copilot or claude')\n .action((opts) => {\n const agentFilter = opts.agent as AgentType | undefined;\n if (opts.active) {\n showActive(agentFilter);\n } else {\n showRecent(parseInt(opts.limit, 10), opts.incomplete ?? false, agentFilter);\n }\n });\n}\n\nfunction showActive(agentFilter?: AgentType): void {\n const procs = findAgentProcesses(agentFilter);\n if (procs.length === 0) {\n log(`${DIM}No active agent processes.${RESET}`);\n return;\n }\n\n log(`\\n${BOLD}${'Agent'.padEnd(9)} ${'PID'.padEnd(8)} ${'Session'.padEnd(40)} Command${RESET}`);\n log('─'.repeat(118));\n\n for (const p of procs) {\n const agentLabel = p.agent === 'claude' ? `${CYAN}claude${RESET} ` : `${GREEN}copilot${RESET}`;\n log(\n `${agentLabel.padEnd(9 + 9)} ${String(p.pid).padEnd(8)} ${(p.sessionId ?? '—').padEnd(40)} ${truncate(p.command, 50)}`,\n );\n }\n log('');\n}\n\nfunction showRecent(limit: number, incompleteOnly: boolean, agentFilter?: AgentType): void {\n let sessions = listAllSessions(limit, agentFilter);\n if (incompleteOnly) {\n sessions = sessions.filter(s => !s.complete);\n }\n\n if (sessions.length === 0) {\n log(`${DIM}No sessions found.${RESET}`);\n return;\n }\n\n log(\n `\\n${BOLD}${'Agent'.padEnd(9)} ${'Status'.padEnd(10)} ${'Premium'.padEnd(10)} ${'Last Event'.padEnd(22)} ${'Summary'.padEnd(35)} ID${RESET}`,\n );\n log('─'.repeat(130));\n\n for (const s of sessions) {\n const agentLabel = s.agent === 'claude' ? `${CYAN}claude${RESET} ` : `${GREEN}copilot${RESET}`;\n const status = s.complete\n ? `${GREEN}✔ done${RESET}`\n : `${YELLOW}⏸ stop${RESET}`;\n const premium = s.agent === 'claude' ? '—' : String(s.premiumRequests);\n const summary = truncate(s.summary || '—', 33);\n\n log(\n `${agentLabel.padEnd(9 + 9)} ${status.padEnd(10 + 9)} ${premium.padEnd(10)} ${s.lastEvent.padEnd(22)} ${summary.padEnd(35)} ${DIM}${s.id.slice(0, 12)}…${RESET}`,\n );\n }\n log(`\\n${DIM}Total: ${sessions.length} session(s)${RESET}`);\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.substring(0, max - 1) + '…';\n}\n","import { execSync } from 'node:child_process';\n\nexport type AgentType = 'copilot' | 'claude';\n\nexport interface AgentProcess {\n pid: number;\n command: string;\n sessionId?: string;\n cwd?: string;\n agent: AgentType;\n}\n\nexport interface AgentResult {\n exitCode: number;\n sessionId: string | null;\n premium: number;\n}\n\n/**\n * Detect which agent CLIs are available.\n */\nexport function detectAvailableAgents(): AgentType[] {\n const agents: AgentType[] = [];\n try {\n execSync('which copilot', { stdio: 'pipe' });\n agents.push('copilot');\n } catch { /* not installed */ }\n try {\n execSync('which claude', { stdio: 'pipe' });\n agents.push('claude');\n } catch { /* not installed */ }\n return agents;\n}\n\n/**\n * Resolve agent type: explicit choice > auto-detect (copilot first for backward compat).\n */\nexport function resolveAgent(explicit?: string): AgentType {\n if (explicit === 'copilot' || explicit === 'claude') return explicit;\n const available = detectAvailableAgents();\n if (available.includes('copilot')) return 'copilot';\n if (available.includes('claude')) return 'claude';\n return 'copilot'; // will fail with helpful message later\n}\n\nexport function isAgentInstalled(agent: AgentType): boolean {\n try {\n execSync(`which ${agent}`, { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function assertAgent(agent: AgentType): void {\n if (!isAgentInstalled(agent)) {\n const installHint = agent === 'copilot'\n ? 'npm i -g @githubnext/copilot'\n : 'npm i -g @anthropic-ai/claude-code';\n console.error(`✖ ${agent} CLI not found. Install with: ${installHint}`);\n process.exit(1);\n }\n}\n","import type { Command } from 'commander';\nimport {\n validateSession,\n hasTaskComplete,\n getSessionSummary,\n getLastEvent,\n findLatestIncomplete,\n getSessionCwd,\n findLatestIncompleteForAgent,\n} from '../lib/session.js';\nimport {\n findPidForSession,\n waitForExit,\n runAgentResume,\n} from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { log, ok, warn, fail, info, notify } from '../lib/logger.js';\nimport { CYAN, RESET } from '../lib/colors.js';\n\nexport function registerWatchCommand(program: Command): void {\n program\n .command('watch [session-id]')\n .description('Watch a session and auto-resume when it stops')\n .option('-s, --steps <n>', 'Max autopilot continues per resume', '30')\n .option('-r, --max-resumes <n>', 'Max number of resumes', '10')\n .option('-c, --cooldown <n>', 'Seconds between resumes', '10')\n .option('-m, --message <msg>', 'Message to send on resume')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (sid: string | undefined, opts) => {\n try {\n await watchCommand(sid, {\n steps: parseInt(opts.steps, 10),\n maxResumes: parseInt(opts.maxResumes, 10),\n cooldown: parseInt(opts.cooldown, 10),\n message: opts.message,\n agent: resolveAgent(opts.agent),\n });\n } catch (err) {\n fail(`Watch error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface WatchOptions {\n steps: number;\n maxResumes: number;\n cooldown: number;\n message?: string;\n agent: AgentType;\n}\n\nasync function watchCommand(sid: string | undefined, opts: WatchOptions): Promise<void> {\n assertAgent(opts.agent);\n\n if (!sid) {\n const result = findLatestIncompleteForAgent(opts.agent);\n sid = result?.id;\n if (!sid) {\n fail('No incomplete session found.');\n process.exit(1);\n }\n info(`Auto-detected incomplete ${opts.agent} session: ${CYAN}${sid}${RESET}`);\n }\n\n if (!validateSession(sid)) {\n fail(`Invalid session: ${sid}`);\n process.exit(1);\n }\n\n if (hasTaskComplete(sid)) {\n ok(`Session ${sid} already completed.`);\n return;\n }\n\n let resumes = 0;\n\n while (resumes < opts.maxResumes) {\n const pid = findPidForSession(sid, opts.agent);\n\n if (pid) {\n info(`Watching PID ${pid} for ${opts.agent} session ${CYAN}${sid.slice(0, 8)}${RESET}…`);\n const exited = await waitForExit(pid);\n\n if (!exited) {\n warn('Timeout waiting for process exit.');\n break;\n }\n }\n\n // Small delay for events to flush\n await sleep(3000);\n\n if (hasTaskComplete(sid)) {\n ok(`Task complete! Summary: ${getSessionSummary(sid) || 'none'}`);\n notify('Task completed!', `Session ${sid.slice(0, 8)}`);\n return;\n }\n\n // Interrupted — resume\n resumes++;\n log(`Session interrupted (${getLastEvent(sid)}). Resume ${resumes}/${opts.maxResumes}…`);\n\n if (opts.cooldown > 0 && resumes > 1) {\n info(`Cooldown ${opts.cooldown}s...`);\n await sleep(opts.cooldown * 1000);\n }\n\n const cwd = getSessionCwd(sid) || undefined;\n const result = await runAgentResume(\n opts.agent,\n sid,\n opts.steps,\n opts.message ?? 'Continue remaining work. Pick up where you left off and complete the task.',\n cwd,\n );\n\n if (result.sessionId && result.sessionId !== sid) {\n info(`New session created: ${CYAN}${result.sessionId}${RESET}`);\n sid = result.sessionId;\n }\n }\n\n warn(`Max resumes (${opts.maxResumes}) reached.`);\n notify('Max resumes reached', `Session ${sid.slice(0, 8)}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport type ProjectType =\n | 'kmp' | 'kotlin' | 'java'\n | 'node' | 'typescript' | 'react' | 'next'\n | 'python' | 'rust' | 'swift' | 'go' | 'flutter'\n | 'unknown';\n\nexport function detectProjectType(dir: string): ProjectType {\n const exists = (f: string) => existsSync(join(dir, f));\n\n if (exists('build.gradle.kts') || exists('build.gradle')) {\n if (exists('composeApp') || exists('gradle.properties')) {\n try {\n const gradle = readFileSync(join(dir, 'build.gradle.kts'), 'utf-8');\n if (gradle.includes('multiplatform') || gradle.includes('KotlinMultiplatform')) return 'kmp';\n } catch { /* ignore */ }\n }\n if (exists('pom.xml')) return 'java';\n return 'kotlin';\n }\n if (exists('pubspec.yaml')) return 'flutter';\n if (exists('Package.swift')) return 'swift';\n try {\n const entries = readdirSync(dir);\n if (entries.some(e => e.endsWith('.xcodeproj'))) return 'swift';\n } catch { /* ignore */ }\n if (exists('Cargo.toml')) return 'rust';\n if (exists('go.mod')) return 'go';\n if (exists('pyproject.toml') || exists('setup.py') || exists('requirements.txt')) return 'python';\n if (exists('package.json')) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (allDeps['next']) return 'next';\n if (allDeps['react']) return 'react';\n if (allDeps['typescript'] || exists('tsconfig.json')) return 'typescript';\n } catch { /* ignore */ }\n return 'node';\n }\n if (exists('pom.xml')) return 'java';\n return 'unknown';\n}\n\nexport function detectProjectName(dir: string): string {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n if (pkg.name) return pkg.name;\n } catch { /* ignore */ }\n return basename(resolve(dir));\n}\n\nexport function detectMainBranch(dir: string): string {\n try {\n const ref = execSync('git symbolic-ref refs/remotes/origin/HEAD', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return ref.split('/').pop() ?? 'main';\n } catch { /* ignore */ }\n\n try {\n const branch = execSync('git branch --show-current', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (branch) return branch;\n } catch { /* ignore */ }\n\n return 'main';\n}\n","import type { ProjectType } from \"./detect.js\";\n\ninterface TaskPrompt {\n title: string;\n prompt: string;\n priority: number;\n}\n\nconst COMMON_TASKS: TaskPrompt[] = [\n {\n title: \"Fix TODOs\",\n prompt:\n \"Scan for TODO, FIXME, HACK comments. Fix the most impactful ones. Run tests to verify.\",\n priority: 1,\n },\n {\n title: \"Update dependencies\",\n prompt:\n \"Check for outdated dependencies. Update patch/minor versions that are safe. Run tests after updating.\",\n priority: 2,\n },\n {\n title: \"Improve test coverage\",\n prompt:\n \"Find untested public functions. Write tests for the most critical ones. Target 80%+ coverage.\",\n priority: 3,\n },\n {\n title: \"Fix lint warnings\",\n prompt:\n \"Run the project linter. Fix all warnings without changing behavior. Run tests.\",\n priority: 4,\n },\n {\n title: \"Improve documentation\",\n prompt:\n \"Review README and code docs. Add missing JSDoc/KDoc for public APIs. Update outdated sections.\",\n priority: 5,\n },\n {\n title: \"Security audit\",\n prompt:\n \"Check for common security issues: hardcoded secrets, SQL injection, XSS, insecure defaults. Fix any found.\",\n priority: 6,\n },\n];\n\nconst TYPE_TASKS: Partial<Record<ProjectType, TaskPrompt[]>> = {\n kmp: [\n {\n title: \"KMP: Optimize Compose\",\n prompt:\n \"Review Compose UI code for recomposition issues. Add @Stable/@Immutable where needed. Check remember usage.\",\n priority: 2,\n },\n {\n title: \"KMP: Check expect/actual\",\n prompt:\n \"Review expect/actual declarations. Ensure all platforms have proper implementations. Check for missing iOS/Desktop actuals.\",\n priority: 3,\n },\n {\n title: \"KMP: Room migrations\",\n prompt:\n \"Check Room database schema. Ensure migrations are defined for schema changes. Add missing migration tests.\",\n priority: 4,\n },\n ],\n typescript: [\n {\n title: \"TS: Strict type safety\",\n prompt:\n \"Find `any` types and loose assertions. Replace with proper types. Enable stricter tsconfig options if safe.\",\n priority: 2,\n },\n ],\n react: [\n {\n title: \"React: Performance\",\n prompt:\n \"Find unnecessary re-renders. Add React.memo, useMemo, useCallback where beneficial. Check bundle size.\",\n priority: 2,\n },\n ],\n python: [\n {\n title: \"Python: Type hints\",\n prompt:\n \"Add type hints to public functions. Run mypy to check type safety. Fix any type errors.\",\n priority: 2,\n },\n ],\n node: [\n {\n title: \"Node: Error handling\",\n prompt:\n \"Review async error handling. Add try/catch for unhandled promises. Check for missing error middleware.\",\n priority: 2,\n },\n ],\n};\n\nexport function getTasksForProject(type: ProjectType): TaskPrompt[] {\n const specific = TYPE_TASKS[type] ?? [];\n return [...specific, ...COMMON_TASKS].sort(\n (a, b) => a.priority - b.priority,\n );\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst LOCK_BASE = join(homedir(), '.copilot', 'locks');\n\nfunction lockDir(name: string): string {\n return join(LOCK_BASE, `${name}.lock`);\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function acquireLock(name: string, timeoutMs = 30_000): boolean {\n mkdirSync(LOCK_BASE, { recursive: true });\n const dir = lockDir(name);\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n mkdirSync(dir);\n // Lock acquired — write metadata\n writeFileSync(join(dir, 'pid'), String(process.pid));\n writeFileSync(join(dir, 'acquired'), new Date().toISOString());\n return true;\n } catch {\n // Lock dir exists — check if holder is still alive\n try {\n const holderPid = parseInt(readFileSync(join(dir, 'pid'), 'utf-8').trim(), 10);\n if (!isPidAlive(holderPid)) {\n // Stale lock — break it\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n } catch {\n // Can't read pid file — try breaking\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n // Holder is alive — wait and retry\n const waitMs = Math.min(500, deadline - Date.now());\n if (waitMs > 0) {\n const start = Date.now();\n while (Date.now() - start < waitMs) { /* spin wait */ }\n }\n }\n }\n return false;\n}\n\nexport function releaseLock(name: string): void {\n const dir = lockDir(name);\n try {\n rmSync(dir, { recursive: true, force: true });\n } catch { /* already released */ }\n}\n\nexport async function withLock<T>(name: string, fn: () => T | Promise<T>): Promise<T> {\n if (!acquireLock(name)) {\n throw new Error(`Failed to acquire lock: ${name}`);\n }\n try {\n return await fn();\n } finally {\n releaseLock(name);\n }\n}\n","import { existsSync, rmSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\nfunction gitExec(dir: string, cmd: string): string | null {\n try {\n return execSync(cmd, {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n}\n\nexport function isGitRepo(dir: string): boolean {\n return existsSync(join(dir, '.git'));\n}\n\nexport function gitCurrentBranch(dir: string): string | null {\n return gitExec(dir, 'git branch --show-current');\n}\n\nexport function gitStash(dir: string): boolean {\n return gitExec(dir, 'git stash -q') !== null;\n}\n\nexport function gitStashPop(dir: string): boolean {\n return gitExec(dir, 'git stash pop -q') !== null;\n}\n\nexport function gitCheckout(dir: string, branch: string): boolean {\n return gitExec(dir, `git checkout ${branch} -q`) !== null;\n}\n\nexport function gitCreateBranch(dir: string, branch: string): boolean {\n return gitExec(dir, `git checkout -b ${branch}`) !== null;\n}\n\nexport function gitCountCommits(dir: string, from: string, to: string): number {\n const result = gitExec(dir, `git log ${from}..${to} --oneline`);\n if (!result) return 0;\n return result.split('\\n').filter(l => l.trim()).length;\n}\n\nexport function gitStatus(dir: string): string {\n return gitExec(dir, 'git status --porcelain') ?? '';\n}\n\nexport function gitRoot(dir: string): string | null {\n return gitExec(dir, 'git rev-parse --show-toplevel');\n}\n\n// ── Worktree support ──\n\nexport function listWorktrees(dir: string): { path: string; branch: string; bare: boolean }[] {\n const raw = gitExec(dir, 'git worktree list --porcelain');\n if (!raw) return [];\n const trees: { path: string; branch: string; bare: boolean }[] = [];\n let current: { path: string; branch: string; bare: boolean } = { path: '', branch: '', bare: false };\n for (const line of raw.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (current.path) trees.push(current);\n current = { path: line.slice(9), branch: '', bare: false };\n } else if (line.startsWith('branch ')) {\n current.branch = line.slice(7).replace('refs/heads/', '');\n } else if (line === 'bare') {\n current.bare = true;\n }\n }\n if (current.path) trees.push(current);\n return trees;\n}\n\n/**\n * Create a git worktree for parallel copilot work.\n * Returns the worktree path or null on failure.\n */\nexport function createWorktree(repoDir: string, branch: string): string | null {\n const safeBranch = branch.replace(/[^a-zA-Z0-9._/-]/g, '-');\n const worktreePath = resolve(repoDir, '..', `${resolve(repoDir).split('/').pop()}-wt-${safeBranch}`);\n\n if (existsSync(worktreePath)) {\n return worktreePath; // already exists\n }\n\n // Create branch if it doesn't exist, then add worktree\n const branchExists = gitExec(repoDir, `git rev-parse --verify ${safeBranch}`) !== null;\n const cmd = branchExists\n ? `git worktree add \"${worktreePath}\" ${safeBranch}`\n : `git worktree add -b ${safeBranch} \"${worktreePath}\"`;\n\n if (gitExec(repoDir, cmd) !== null) {\n return worktreePath;\n }\n return null;\n}\n\n/**\n * Remove a worktree (prune).\n */\nexport function removeWorktree(repoDir: string, worktreePath: string): boolean {\n const result = gitExec(repoDir, `git worktree remove \"${worktreePath}\" --force`);\n return result !== null;\n}\n\n/**\n * Clean up all copilot-agent worktrees.\n */\nexport function cleanupWorktrees(repoDir: string): number {\n const trees = listWorktrees(repoDir);\n let cleaned = 0;\n for (const t of trees) {\n if (t.path.includes('-wt-')) {\n if (removeWorktree(repoDir, t.path)) cleaned++;\n }\n }\n gitExec(repoDir, 'git worktree prune');\n return cleaned;\n}\n","import type { Command } from 'commander';\nimport { detectProjectType, detectProjectName, detectMainBranch } from '../lib/detect.js';\nimport { getTasksForProject } from '../lib/tasks.js';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { isGitRepo, gitCurrentBranch, gitStatus, gitStash, gitCheckout, gitCreateBranch, gitCountCommits, createWorktree, removeWorktree } from '../lib/git.js';\nimport { log, ok, warn, fail, info, notify } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, GREEN, RESET, YELLOW } from '../lib/colors.js';\n\nexport function registerRunCommand(program: Command): void {\n program\n .command('run [dir]')\n .description('Discover and fix issues in a project')\n .option('-s, --steps <n>', 'Max autopilot continues per task', '30')\n .option('-t, --max-tasks <n>', 'Max number of tasks to run', '5')\n .option('-p, --max-premium <n>', 'Max total premium requests', '50')\n .option('--dry-run', 'Show tasks without executing')\n .option('--worktree', 'Use git worktree for parallel execution (default: wait for idle)')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (dir: string | undefined, opts) => {\n try {\n await runCommand(dir ?? process.cwd(), {\n steps: parseInt(opts.steps, 10),\n maxTasks: parseInt(opts.maxTasks, 10),\n maxPremium: parseInt(opts.maxPremium, 10),\n dryRun: opts.dryRun ?? false,\n useWorktree: opts.worktree ?? false,\n agent: resolveAgent(opts.agent),\n });\n } catch (err) {\n fail(`Run error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface RunOptions {\n steps: number;\n maxTasks: number;\n maxPremium: number;\n dryRun: boolean;\n useWorktree: boolean;\n agent: AgentType;\n}\n\nasync function runCommand(dir: string, opts: RunOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const projectType = detectProjectType(dir);\n const name = detectProjectName(dir);\n const mainBranch = isGitRepo(dir) ? detectMainBranch(dir) : null;\n\n info(`Project: ${CYAN}${name}${RESET} (${projectType}) — agent: ${opts.agent}`);\n if (mainBranch) info(`Main branch: ${mainBranch}`);\n\n const tasks = getTasksForProject(projectType).slice(0, opts.maxTasks);\n\n if (tasks.length === 0) {\n warn('No tasks found for this project type.');\n return;\n }\n\n log(`Found ${tasks.length} tasks:`);\n for (const t of tasks) {\n log(` ${DIM}•${RESET} ${t.title}`);\n }\n\n if (opts.dryRun) {\n log(`${DIM}(dry-run — not executing)${RESET}`);\n return;\n }\n\n const originalBranch = isGitRepo(dir) ? gitCurrentBranch(dir) : null;\n let completed = 0;\n let premiumTotal = 0;\n\n for (const task of tasks) {\n if (premiumTotal >= opts.maxPremium) {\n warn(`Premium request limit reached (${premiumTotal}/${opts.maxPremium}).`);\n break;\n }\n\n log(`\\n${'═'.repeat(60)}`);\n log(`${BOLD}${CYAN}Task: ${task.title}${RESET}`);\n log(`${'═'.repeat(60)}`);\n\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n const branchName = `agent/fix-${completed + 1}-${timestamp}-${random}`;\n\n if (mainBranch && isGitRepo(dir)) {\n if (gitStatus(dir)) gitStash(dir);\n gitCheckout(dir, mainBranch);\n if (!gitCreateBranch(dir, branchName)) {\n warn(`Could not create branch ${branchName}, continuing on current.`);\n }\n }\n\n info(`Running: ${task.title}…`);\n\n let taskDir = dir;\n let worktreeCreated = false;\n\n if (opts.useWorktree && isGitRepo(dir)) {\n try {\n const wt = createWorktree(dir, branchName);\n if (wt) {\n taskDir = wt;\n worktreeCreated = true;\n info(`Created worktree: ${taskDir}`);\n } else {\n warn('Worktree creation returned null, falling back to main dir');\n }\n } catch (err) {\n warn(`Worktree creation failed, falling back to main dir: ${err}`);\n taskDir = dir;\n }\n }\n\n const result = await withLock('copilot-run', () =>\n runAgentTask(opts.agent, task.prompt, opts.steps, taskDir, opts.useWorktree),\n );\n\n const commitRef = worktreeCreated ? taskDir : dir;\n const commits = mainBranch ? gitCountCommits(commitRef, mainBranch, 'HEAD') : 0;\n premiumTotal += result.premium;\n completed++;\n ok(`${task.title} — ${commits} commit(s), ${result.premium} premium`);\n\n if (worktreeCreated) {\n try {\n removeWorktree(dir, taskDir);\n } catch (err) {\n warn(`Worktree cleanup failed: ${err}`);\n }\n }\n\n if (!worktreeCreated && originalBranch && isGitRepo(dir)) {\n gitCheckout(dir, mainBranch ?? originalBranch);\n }\n }\n\n log(`\\n${BOLD}═══ Run Summary ═══${RESET}`);\n log(`Completed ${completed}/${tasks.length} tasks. Total premium: ${premiumTotal}`);\n notify(`Completed ${completed} tasks`, name);\n}\n","import type { Command } from 'commander';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { detectProjectType, detectProjectName, detectMainBranch } from '../lib/detect.js';\nimport { getTasksForProject } from '../lib/tasks.js';\nimport { runAgentTask, runAgentResume, findPidForSession, findAgentProcesses, waitForExit, waitForAgentInDir } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { isGitRepo, gitCurrentBranch, gitStash, gitCheckout, gitCreateBranch, gitCountCommits, createWorktree, removeWorktree } from '../lib/git.js';\nimport { findLatestIncomplete, validateSession, hasTaskComplete, getSessionCwd, findLatestIncompleteForAgent } from '../lib/session.js';\nimport { log, ok, warn, fail, info, setLogFile, notify } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, RESET } from '../lib/colors.js';\n\nexport function registerOvernightCommand(program: Command): void {\n program\n .command('overnight [dir]')\n .description('Run tasks continuously until a deadline')\n .option('-u, --until <HH>', 'Stop at this hour (24h format)', '07')\n .option('-s, --steps <n>', 'Max autopilot continues per task', '50')\n .option('-c, --cooldown <n>', 'Seconds between tasks', '15')\n .option('-p, --max-premium <n>', 'Max premium requests budget', '300')\n .option('--dry-run', 'Show plan without executing')\n .option('--worktree', 'Use git worktree for parallel execution (default: wait for idle)')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (dir: string | undefined, opts) => {\n try {\n await overnightCommand(dir ?? process.cwd(), {\n until: parseInt(opts.until, 10),\n steps: parseInt(opts.steps, 10),\n cooldown: parseInt(opts.cooldown, 10),\n maxPremium: parseInt(opts.maxPremium, 10),\n dryRun: opts.dryRun ?? false,\n useWorktree: opts.worktree ?? false,\n agent: resolveAgent(opts.agent),\n });\n } catch (err) {\n fail(`Overnight error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface OvernightOptions {\n until: number;\n steps: number;\n cooldown: number;\n maxPremium: number;\n dryRun: boolean;\n useWorktree: boolean;\n agent: AgentType;\n}\n\nfunction isPastDeadline(untilHour: number): boolean {\n const hour = new Date().getHours();\n return hour >= untilHour && hour < 20;\n}\n\nasync function overnightCommand(dir: string, opts: OvernightOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const ts = new Date().toISOString().replace(/[:.]/g, '').slice(0, 15);\n const logPath = join(homedir(), '.copilot', 'auto-resume-logs', `overnight-${ts}.log`);\n setLogFile(logPath);\n\n const name = detectProjectName(dir);\n const projectType = detectProjectType(dir);\n const mainBranch = isGitRepo(dir) ? detectMainBranch(dir) : null;\n\n info(`Overnight runner for ${CYAN}${name}${RESET} (${projectType}) — agent: ${opts.agent}`); info(`Deadline: ${String(opts.until).padStart(2, '0')}:00`);\n info(`Max premium: ${opts.maxPremium}, Steps: ${opts.steps}`);\n info(`Log: ${logPath}`);\n\n const tasks = getTasksForProject(projectType);\n\n if (opts.dryRun) {\n log(`\\nWould run ${tasks.length} tasks:`);\n for (const t of tasks) log(` ${DIM}•${RESET} ${t.title}`);\n return;\n }\n\n // Phase 1: Resume existing incomplete session\n const existingResult = findLatestIncompleteForAgent(opts.agent);\n const existingSession = existingResult?.id;\n if (existingSession && validateSession(existingSession)) {\n info(`Found incomplete session: ${existingSession}`);\n const pid = findPidForSession(existingSession, opts.agent);\n if (pid) {\n info(`Waiting for running ${opts.agent} (PID ${pid})...`);\n await waitForExit(pid);\n }\n\n if (!hasTaskComplete(existingSession) && !isPastDeadline(opts.until)) {\n info('Resuming incomplete session...');\n const cwd = getSessionCwd(existingSession) || dir;\n await runAgentResume(\n opts.agent,\n existingSession,\n opts.steps,\n 'Continue remaining work. Complete the task.',\n cwd,\n );\n }\n }\n\n // Phase 2: Loop tasks until deadline\n const originalBranch = isGitRepo(dir) ? gitCurrentBranch(dir) : null;\n let taskIdx = 0;\n let totalPremium = 0;\n let totalCommits = 0;\n\n while (!isPastDeadline(opts.until) && taskIdx < tasks.length) {\n if (totalPremium >= opts.maxPremium) {\n warn(`Premium budget exhausted: ${totalPremium}/${opts.maxPremium}`);\n break;\n }\n\n const task = tasks[taskIdx % tasks.length];\n taskIdx++;\n\n log(`\\n${'═'.repeat(60)}`);\n log(`${BOLD}${CYAN}[${new Date().toLocaleTimeString()}] Task ${taskIdx}: ${task.title}${RESET}`);\n log(`${DIM}Premium: ${totalPremium}/${opts.maxPremium}${RESET}`);\n log(`${'═'.repeat(60)}`);\n\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n const branchName = `agent/overnight-${taskIdx}-${timestamp}-${random}`;\n\n if (mainBranch && isGitRepo(dir)) {\n gitStash(dir);\n gitCheckout(dir, mainBranch);\n gitCreateBranch(dir, branchName);\n }\n\n info(`Running: ${task.title}…`);\n\n let taskDir = dir;\n let worktreeCreated = false;\n\n if (opts.useWorktree && isGitRepo(dir)) {\n try {\n const wt = createWorktree(dir, branchName);\n if (wt) {\n taskDir = wt;\n worktreeCreated = true;\n info(`Created worktree: ${taskDir}`);\n } else {\n warn('Worktree creation returned null, falling back to main dir');\n }\n } catch (err) {\n warn(`Worktree creation failed, falling back to main dir: ${err}`);\n taskDir = dir;\n }\n }\n\n try {\n const result = await withLock('copilot-overnight', () =>\n runAgentTask(opts.agent, task.prompt, opts.steps, taskDir, opts.useWorktree),\n );\n\n const commitRef = worktreeCreated ? taskDir : dir;\n const commits = mainBranch ? gitCountCommits(commitRef, mainBranch, 'HEAD') : 0;\n totalPremium += result.premium;\n totalCommits += commits;\n\n if (commits > 0) {\n ok(`${commits} commit(s) on ${branchName}`);\n } else {\n log(`${DIM}No commits on ${branchName}${RESET}`);\n }\n } catch (err) {\n fail(`Task failed: ${err}`);\n }\n\n // Cleanup worktree if we created one\n if (worktreeCreated) {\n try {\n removeWorktree(dir, taskDir);\n info(`Removed worktree: ${taskDir}`);\n } catch (err) {\n warn(`Worktree cleanup failed: ${err}`);\n }\n }\n\n if (!worktreeCreated && mainBranch && isGitRepo(dir)) {\n gitCheckout(dir, mainBranch);\n }\n\n if (!isPastDeadline(opts.until)) {\n info(`Cooldown ${opts.cooldown}s…`);\n await sleep(opts.cooldown * 1000);\n }\n }\n\n if (originalBranch && isGitRepo(dir)) {\n gitCheckout(dir, originalBranch);\n }\n\n const summary = `Overnight done — ${taskIdx} tasks, ${totalCommits} commits, ${totalPremium} premium.`;\n ok(summary);\n notify(summary, name);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import type { Command } from 'commander';\nimport { existsSync, copyFileSync, mkdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { detectProjectType, detectProjectName } from '../lib/detect.js';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent, assertAgent } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { log, ok, warn, fail, info, notify } from '../lib/logger.js';\nimport { CYAN, RESET } from '../lib/colors.js';\n\nexport function registerResearchCommand(program: Command): void {\n program\n .command('research [project]')\n .description('Research improvements or a specific topic')\n .option('-s, --steps <n>', 'Max autopilot continues', '50')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (project: string | undefined, opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n await researchCommand(project ?? process.cwd(), {\n steps: parseInt(opts.steps, 10),\n agent,\n });\n } catch (err) {\n fail(`Research error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface ResearchOptions {\n steps: number;\n agent: ReturnType<typeof resolveAgent>;\n}\n\nfunction buildResearchPrompt(projectType: string, projectName: string): string {\n return `You are a senior software architect. Analyze this ${projectType} project \"${projectName}\" thoroughly.\n\nResearch and produce a file called RESEARCH-PROPOSALS.md with:\n\n1. **Architecture Assessment** — Current architecture, patterns used, strengths and weaknesses\n2. **Code Quality Report** — Common issues, anti-patterns, technical debt areas\n3. **Security Audit** — Potential vulnerabilities, dependency risks, configuration issues\n4. **Performance Analysis** — Bottlenecks, optimization opportunities, resource usage\n5. **Testing Gap Analysis** — Untested areas, test quality, coverage recommendations\n6. **Improvement Proposals** — Prioritized list of actionable improvements with effort estimates\n\nFor each proposal, include:\n- Priority (P0/P1/P2)\n- Estimated effort (hours)\n- Impact description\n- Suggested implementation approach\n\nWrite RESEARCH-PROPOSALS.md in the project root.`;\n}\n\nasync function researchCommand(dir: string, opts: ResearchOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const projectDir = resolve(dir);\n const projectType = detectProjectType(projectDir);\n const projectName = detectProjectName(projectDir);\n\n info(`Researching: ${CYAN}${projectName}${RESET} (${projectType}) — agent: ${opts.agent}`);\n\n const prompt = buildResearchPrompt(projectType, projectName);\n\n const result = await withLock('copilot-research', () =>\n runAgentTask(opts.agent, prompt, opts.steps, projectDir),\n );\n\n log(`Copilot exited with code ${result.exitCode}`);\n\n // Check for output file\n const proposalsFile = join(projectDir, 'RESEARCH-PROPOSALS.md');\n if (existsSync(proposalsFile)) {\n ok('RESEARCH-PROPOSALS.md generated.');\n\n // Backup to ~/.copilot/research-reports/\n const backupDir = join(homedir(), '.copilot', 'research-reports');\n mkdirSync(backupDir, { recursive: true });\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupFile = join(backupDir, `${projectName}-${timestamp}.md`);\n copyFileSync(proposalsFile, backupFile);\n ok(`Backup saved: ${backupFile}`);\n } else {\n warn('RESEARCH-PROPOSALS.md was not generated. Check copilot output.');\n }\n\n notify('Research complete', projectName);\n}\n","import type { Command } from 'commander';\nimport { resolve } from 'node:path';\nimport {\n listAllSessions,\n getAgentSessionReport,\n type SessionReport,\n} from '../lib/session.js';\nimport { log, warn, fail } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, GREEN, YELLOW, RED, RESET } from '../lib/colors.js';\n\nexport function registerReportCommand(program: Command): void {\n program\n .command('report [session-id]')\n .description('Show what an agent did — timeline, tools, commits, files changed')\n .option('-l, --limit <n>', 'Number of recent sessions to report (when no ID given)', '1')\n .option('--project <dir>', 'Filter sessions by project directory')\n .option('--json', 'Output raw JSON')\n .option('-a, --agent <type>', 'Filter by agent: copilot or claude')\n .action((sessionId: string | undefined, opts) => {\n try {\n if (sessionId) {\n reportSingle(sessionId, opts.json ?? false, opts.agent);\n } else {\n reportRecent(parseInt(opts.limit, 10), opts.project, opts.json ?? false, opts.agent);\n }\n } catch (err) {\n fail(`Report error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\nfunction reportRecent(limit: number, projectDir?: string, json = false, agentFilter?: string): void {\n let sessions = listAllSessions(limit * 3, agentFilter as any);\n if (projectDir) {\n const target = resolve(projectDir);\n sessions = sessions.filter(s => s.cwd && resolve(s.cwd) === target);\n }\n sessions = sessions.slice(0, limit);\n\n if (sessions.length === 0) {\n warn('No sessions found.');\n return;\n }\n\n for (const s of sessions) {\n reportSingle(s.id, json, s.agent);\n }\n}\n\nfunction reportSingle(sid: string, json = false, agent?: string): void {\n const report = getAgentSessionReport(sid, agent as any);\n if (!report) {\n warn(`Session ${sid} not found or invalid.`);\n return;\n }\n\n if (json) {\n log(JSON.stringify(report, null, 2));\n return;\n }\n\n renderReport(report);\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n\nfunction formatTime(iso: string): string {\n if (!iso) return '—';\n const d = new Date(iso);\n return d.toLocaleString('en-GB', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction bar(value: number, max: number, width = 20): string {\n const filled = Math.round((value / Math.max(max, 1)) * width);\n return '█'.repeat(filled) + '░'.repeat(width - filled);\n}\n\nfunction renderReport(r: SessionReport): void {\n const status = r.complete\n ? `${GREEN}✔ Completed${RESET}`\n : `${YELLOW}⏸ Interrupted${RESET}`;\n\n const projectName = r.cwd.split('/').pop() ?? r.cwd;\n\n log('');\n log(`${BOLD}╔${'═'.repeat(62)}╗${RESET}`);\n log(`${BOLD}║${RESET} 📋 Session Report: ${CYAN}${r.id.slice(0, 8)}…${RESET} (${r.agent})${' '.repeat(Math.max(0, 62 - 32 - r.id.slice(0, 8).length - r.agent.length))}${BOLD}║${RESET}`);\n log(`${BOLD}╚${'═'.repeat(62)}╝${RESET}`);\n\n // Overview\n log('');\n log(`${BOLD} Overview${RESET}`);\n log(` ${'─'.repeat(58)}`);\n log(` Project: ${CYAN}${projectName}${RESET} ${DIM}${r.cwd}${RESET}`);\n log(` Status: ${status}`);\n log(` Duration: ${BOLD}${formatDuration(r.durationMs)}${RESET} ${DIM}(${formatTime(r.startTime)} → ${formatTime(r.endTime)})${RESET}`);\n log(` Summary: ${r.summary || DIM + '(none)' + RESET}`);\n\n // Stats\n log('');\n log(`${BOLD} Activity${RESET}`);\n log(` ${'─'.repeat(58)}`);\n log(` User messages: ${BOLD}${r.userMessages}${RESET}`);\n log(` Assistant turns: ${BOLD}${r.assistantTurns}${RESET}`);\n log(` Output tokens: ${BOLD}${r.outputTokens.toLocaleString()}${RESET}`);\n log(` Premium requests: ${BOLD}${r.premiumRequests}${RESET}`);\n log(` Tool calls: ${BOLD}${Object.values(r.toolUsage).reduce((a, b) => a + b, 0)}${RESET}`);\n\n // Tools breakdown\n const toolEntries = Object.entries(r.toolUsage).sort((a, b) => b[1] - a[1]);\n if (toolEntries.length > 0) {\n const maxCount = toolEntries[0][1];\n log('');\n log(`${BOLD} Tools Used${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const [tool, count] of toolEntries.slice(0, 10)) {\n const barStr = bar(count, maxCount, 15);\n log(` ${DIM}${barStr}${RESET} ${String(count).padStart(5)} ${tool}`);\n }\n if (toolEntries.length > 10) {\n log(` ${DIM} … and ${toolEntries.length - 10} more tools${RESET}`);\n }\n }\n\n // Git commits\n if (r.gitCommits.length > 0) {\n log('');\n log(`${BOLD} Git Commits (${r.gitCommits.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const msg of r.gitCommits) {\n log(` ${GREEN}●${RESET} ${msg.slice(0, 70)}${msg.length > 70 ? '…' : ''}`);\n }\n }\n\n // Files created\n if (r.filesCreated.length > 0) {\n log('');\n log(`${BOLD} Files Created (${r.filesCreated.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const f of r.filesCreated.slice(0, 15)) {\n const short = f.includes(projectName) ? f.split(projectName + '/')[1] ?? f : f;\n log(` ${GREEN}+${RESET} ${short}`);\n }\n if (r.filesCreated.length > 15) {\n log(` ${DIM} … and ${r.filesCreated.length - 15} more${RESET}`);\n }\n }\n\n // Files edited\n if (r.filesEdited.length > 0) {\n log('');\n log(`${BOLD} Files Edited (${r.filesEdited.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const f of r.filesEdited.slice(0, 15)) {\n const short = f.includes(projectName) ? f.split(projectName + '/')[1] ?? f : f;\n log(` ${YELLOW}~${RESET} ${short}`);\n }\n if (r.filesEdited.length > 15) {\n log(` ${DIM} … and ${r.filesEdited.length - 15} more${RESET}`);\n }\n }\n\n // Task completions\n if (r.taskCompletions.length > 0) {\n log('');\n log(`${BOLD} Tasks Completed (${r.taskCompletions.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const t of r.taskCompletions) {\n const lines = t.split('\\n');\n const first = lines[0].slice(0, 70);\n log(` ${GREEN}✔${RESET} ${first}${first.length < lines[0].length ? '…' : ''}`);\n }\n }\n\n // Errors\n if (r.errors.length > 0) {\n log('');\n log(`${BOLD} Errors (${r.errors.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const e of r.errors.slice(0, 5)) {\n log(` ${RED}✖${RESET} ${e.slice(0, 70)}`);\n }\n if (r.errors.length > 5) {\n log(` ${DIM} … and ${r.errors.length - 5} more${RESET}`);\n }\n }\n\n log('');\n}\n","import type { AgentType } from '../lib/provider.js';\nimport type { Session, SessionReport } from '../lib/session.js';\n\n// ── Color Theme (matches web dashboard) ──────────────────────────\nexport const THEME = {\n bg: '#0d1117',\n fg: '#e6edf3',\n border: '#30363d',\n borderFocus: '#58a6ff',\n muted: '#8b949e',\n accent: '#58a6ff',\n green: '#3fb950',\n yellow: '#d29922',\n red: '#f85149',\n purple: '#bc8cff',\n cyan: '#58a6ff',\n claude: '#f59e0b',\n copilot: '#58a6ff',\n} as const;\n\nexport function agentColor(agent: AgentType): string {\n return agent === 'claude' ? THEME.claude : THEME.copilot;\n}\n\nexport function agentLabel(agent: AgentType): string {\n return agent === 'claude' ? '{yellow-fg}claude{/}' : '{cyan-fg}copilot{/}';\n}\n\nexport function statusIcon(complete: boolean): string {\n return complete ? '{green-fg}✔{/}' : '{yellow-fg}⏳{/}';\n}\n\n// ── Duration formatting ──────────────────────────────────────────\nexport function fmtDuration(ms: number): string {\n if (ms < 0) return '—';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\nexport function fmtTimeAgo(mtimeMs: number): string {\n const diff = Date.now() - mtimeMs;\n if (diff < 60_000) return 'just now';\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nexport function fmtNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\n// ── Bar chart (text-based) ───────────────────────────────────────\nexport function textBar(value: number, max: number, width: number): string {\n if (max <= 0) return '░'.repeat(width);\n const filled = Math.round((value / max) * width);\n return '█'.repeat(Math.min(filled, width)) + '░'.repeat(Math.max(width - filled, 0));\n}\n\n// ── Build session list rows for blessed list ─────────────────────\nexport function sessionRow(s: Session): string {\n const icon = statusIcon(s.complete);\n const agent = agentLabel(s.agent);\n const name = (s.cwd?.split('/').pop() || s.id.slice(0, 8)).slice(0, 16).padEnd(16);\n const summary = (s.summary || '—').slice(0, 30).padEnd(30);\n const time = fmtTimeAgo(s.mtime).padStart(8);\n const prem = s.premiumRequests > 0 ? `{yellow-fg}⬡${s.premiumRequests}{/}` : '';\n return ` ${icon} ${agent} ${name} ${summary} ${time} ${prem}`;\n}\n\n// ── Build tool usage bars for detail panel ───────────────────────\nexport function toolBars(toolUsage: Record<string, number>, maxWidth: number = 20): string[] {\n const entries = Object.entries(toolUsage).sort((a, b) => b[1] - a[1]).slice(0, 10);\n if (entries.length === 0) return [' {gray-fg}No tools used{/}'];\n const maxVal = entries[0][1];\n return entries.map(([name, count]) => {\n const label = name.slice(0, 12).padEnd(12);\n const bar = textBar(count, maxVal, maxWidth);\n return ` ${label} {cyan-fg}${bar}{/} ${count}`;\n });\n}\n\n// ── Process table rows ───────────────────────────────────────────\nexport interface ProcessInfo {\n pid: number;\n command: string;\n sessionId?: string;\n cwd?: string;\n agent: AgentType;\n}\n\nexport function processRow(p: ProcessInfo): string {\n const pid = String(p.pid).padEnd(7);\n const agent = agentLabel(p.agent);\n const sid = (p.sessionId || '—').slice(0, 20).padEnd(20);\n const cwd = (p.cwd || '—').replace(/^\\/Users\\/\\w+/, '~').slice(0, 30).padEnd(30);\n return ` ${pid} ${agent} ${sid} ${cwd} {green-fg}running{/}`;\n}\n\n// ── Detail panel content ─────────────────────────────────────────\nexport function detailContent(r: SessionReport): string {\n const lines: string[] = [];\n\n // Header\n const project = r.cwd?.split('/').pop() || 'unknown';\n lines.push(`{bold}${project}{/} ${agentLabel(r.agent)}`);\n lines.push(`{gray-fg}${r.id}{/}`);\n lines.push('');\n\n // Stats\n lines.push('{bold}─── Stats ──────────────────────{/}');\n lines.push(` Duration ${fmtDuration(r.durationMs)}`);\n lines.push(` Messages ${r.userMessages}`);\n lines.push(` Turns ${r.assistantTurns}`);\n lines.push(` Tokens ${fmtNumber(r.outputTokens)}`);\n lines.push(` Premium {yellow-fg}${r.premiumRequests}{/}`);\n lines.push(` Status ${r.complete ? '{green-fg}complete{/}' : '{yellow-fg}incomplete{/}'}`);\n lines.push('');\n\n // Tools\n if (Object.keys(r.toolUsage).length > 0) {\n lines.push('{bold}─── Tools ──────────────────────{/}');\n lines.push(...toolBars(r.toolUsage, 16));\n lines.push('');\n }\n\n // Commits\n if (r.gitCommits.length > 0) {\n lines.push('{bold}─── Commits ────────────────────{/}');\n for (const c of r.gitCommits.slice(0, 8)) {\n lines.push(` {green-fg}●{/} ${c.slice(0, 50)}`);\n }\n if (r.gitCommits.length > 8) lines.push(` {gray-fg}... +${r.gitCommits.length - 8} more{/}`);\n lines.push('');\n }\n\n // Files\n const allFiles = [...r.filesCreated.map(f => `{green-fg}+{/} ${f}`), ...r.filesEdited.map(f => `{yellow-fg}~{/} ${f}`)];\n if (allFiles.length > 0) {\n lines.push('{bold}─── Files ──────────────────────{/}');\n for (const f of allFiles.slice(0, 10)) {\n lines.push(` ${f.length > 50 ? f.slice(0, 50) + '…' : f}`);\n }\n if (allFiles.length > 10) lines.push(` {gray-fg}... +${allFiles.length - 10} more{/}`);\n lines.push('');\n }\n\n // Tasks\n if (r.taskCompletions.length > 0) {\n lines.push('{bold}─── Tasks ──────────────────────{/}');\n for (const t of r.taskCompletions.slice(0, 5)) {\n lines.push(` {green-fg}✔{/} ${t.slice(0, 50)}`);\n }\n lines.push('');\n }\n\n // Errors\n if (r.errors.length > 0) {\n lines.push('{bold}{red-fg}─── Errors ─────────────────────{/}');\n for (const e of r.errors.slice(0, 3)) {\n lines.push(` {red-fg}✗{/} ${e.slice(0, 60)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n// ── Header stats line ────────────────────────────────────────────\nexport function headerStats(processCount: number, sessionCount: number, totalPremium: number, completedCount: number): string {\n return ` {bold}Processes:{/} {green-fg}${processCount}{/} {bold}Sessions:{/} ${sessionCount} {bold}Premium:{/} {yellow-fg}⬡${totalPremium}{/} {bold}Done:{/} {green-fg}${completedCount}{/}/${sessionCount}`;\n}\n","import type { Command } from 'commander';\nimport { listAllSessions, getAgentSessionReport, type SessionReport, type Session } from '../lib/session.js';\nimport { findAgentProcesses } from '../lib/process.js';\nimport {\n agentLabel, statusIcon, fmtDuration, fmtTimeAgo, fmtNumber,\n textBar, sessionRow, processRow, detailContent, headerStats,\n toolBars,\n type ProcessInfo,\n} from '../tui/widgets.js';\n\n// ── blessed dynamic import (CJS module) ──────────────────────────\nlet blessed: any;\nasync function loadBlessed() {\n const mod = await import('blessed');\n blessed = mod.default || mod;\n}\n\nexport function registerDashboardCommand(program: Command): void {\n program\n .command('dashboard')\n .alias('tui')\n .description('Real-time terminal dashboard for copilot sessions (htop-style)')\n .option('-r, --refresh <n>', 'Refresh interval in seconds', '5')\n .option('-l, --limit <n>', 'Number of sessions to show', '20')\n .action(async (opts) => {\n await loadBlessed();\n runBlessedDashboard(parseInt(opts.refresh, 10), parseInt(opts.limit, 10));\n });\n}\n\n// ══════════════════════════════════════════════════════════════════\n// PERFORMANCE CACHE — avoid re-parsing files on every render\n// ══════════════════════════════════════════════════════════════════\n\ninterface DataCache {\n sessions: Session[];\n sessionsTs: number;\n procs: ProcessInfo[];\n procsTs: number;\n details: Map<string, { report: SessionReport | null; ts: number }>;\n}\n\nfunction createCache(): DataCache {\n return { sessions: [], sessionsTs: 0, procs: [], procsTs: 0, details: new Map() };\n}\n\n/** Refresh session list (min 2s between refreshes) */\nfunction cacheSessions(cache: DataCache, limit: number): Session[] {\n const now = Date.now();\n if (now - cache.sessionsTs > 2000) {\n try { cache.sessions = listAllSessions(limit); } catch { /* keep stale */ }\n cache.sessionsTs = now;\n }\n return cache.sessions;\n}\n\n/** Refresh process list (min 3s between refreshes — ps+lsof is expensive) */\nfunction cacheProcs(cache: DataCache): ProcessInfo[] {\n const now = Date.now();\n if (now - cache.procsTs > 3000) {\n try { cache.procs = findAgentProcesses() as ProcessInfo[]; } catch { /* keep stale */ }\n cache.procsTs = now;\n }\n return cache.procs;\n}\n\n/** Get session detail report (cached 10s, only parsed on demand) */\nfunction cacheDetail(cache: DataCache, s: Session): SessionReport | null {\n const entry = cache.details.get(s.id);\n if (entry && Date.now() - entry.ts < 10_000) return entry.report;\n let report: SessionReport | null = null;\n try { report = getAgentSessionReport(s.id, s.agent); } catch { /* null */ }\n cache.details.set(s.id, { report, ts: Date.now() });\n // Evict old entries\n if (cache.details.size > 15) {\n const oldest = [...cache.details.entries()].sort((a, b) => a[1].ts - b[1].ts)[0];\n if (oldest) cache.details.delete(oldest[0]);\n }\n return report;\n}\n\n// ══════════════════════════════════════════════════════════════════\n// BLESSED HTOP-STYLE DASHBOARD\n// ══════════════════════════════════════════════════════════════════\n\nfunction runBlessedDashboard(refreshSec: number, limit: number): void {\n const cache = createCache();\n\n // Workaround: blessed can't parse Setulc capability in xterm-256color terminfo.\n // Downgrade TERM temporarily so blessed doesn't crash on screen init.\n const origTerm = process.env.TERM;\n if (origTerm?.includes('256color')) {\n process.env.TERM = 'xterm';\n }\n\n const screen = blessed.screen({\n smartCSR: true,\n title: 'copilot-agent dashboard',\n fullUnicode: true,\n });\n\n // Restore original TERM after screen init\n if (origTerm) process.env.TERM = origTerm;\n\n // ── Color constants ────────────────────────────────────────────\n const BG = '#0d1117';\n const FG = '#e6edf3';\n const BORDER_COLOR = '#30363d';\n const ACCENT = '#58a6ff';\n const MUTED = '#8b949e';\n\n // ── Header bar ─────────────────────────────────────────────────\n const headerBox = blessed.box({\n parent: screen,\n top: 0,\n left: 0,\n width: '100%',\n height: 3,\n tags: true,\n style: { fg: FG, bg: '#161b22', border: { fg: BORDER_COLOR } },\n border: { type: 'line' },\n content: '',\n });\n\n // ── Process panel (top) ────────────────────────────────────────\n const processBox = blessed.box({\n parent: screen,\n top: 3,\n left: 0,\n width: '100%',\n height: 7,\n tags: true,\n label: ' {cyan-fg}{bold}Active Processes{/} ',\n scrollable: true,\n style: { fg: FG, bg: BG, border: { fg: BORDER_COLOR }, label: { fg: ACCENT } },\n border: { type: 'line' },\n content: '',\n });\n\n // ── Session list (left panel) ──────────────────────────────────\n const sessionList = blessed.list({\n parent: screen,\n top: 10,\n left: 0,\n width: '45%',\n bottom: 3,\n tags: true,\n label: ' {cyan-fg}{bold}Sessions{/} ',\n scrollable: true,\n keys: true,\n vi: true,\n mouse: true,\n style: {\n fg: FG,\n bg: BG,\n border: { fg: BORDER_COLOR },\n label: { fg: ACCENT },\n selected: { fg: '#ffffff', bg: '#1f6feb', bold: true },\n item: { fg: FG },\n },\n border: { type: 'line' },\n scrollbar: { ch: '│', style: { fg: ACCENT } },\n });\n\n // ── Detail panel (right) ───────────────────────────────────────\n const detailBox = blessed.box({\n parent: screen,\n top: 10,\n left: '45%',\n width: '55%',\n bottom: 3,\n tags: true,\n label: ' {cyan-fg}{bold}Detail{/} ',\n scrollable: true,\n keys: true,\n vi: true,\n mouse: true,\n style: { fg: FG, bg: BG, border: { fg: BORDER_COLOR }, label: { fg: ACCENT } },\n border: { type: 'line' },\n scrollbar: { ch: '│', style: { fg: ACCENT } },\n content: '{gray-fg}Select a session with ↑↓ keys{/}',\n });\n\n // ── Footer ─────────────────────────────────────────────────────\n const footer = blessed.box({\n parent: screen,\n bottom: 0,\n left: 0,\n width: '100%',\n height: 3,\n tags: true,\n style: { fg: MUTED, bg: '#161b22', border: { fg: BORDER_COLOR } },\n border: { type: 'line' },\n content: ' {bold}↑↓{/} Navigate {bold}Enter{/} Detail {bold}Tab{/} Switch panel {bold}r{/} Refresh {bold}q{/} Quit',\n });\n\n // ── State ──────────────────────────────────────────────────────\n let sessions: Session[] = [];\n let procs: ProcessInfo[] = [];\n let selectedIdx = 0;\n let focusedPanel: 'sessions' | 'detail' = 'sessions';\n let lastDetailId = '';\n\n // ── Render header (cheap — only string formatting) ─────────────\n function renderHeader(): void {\n const time = new Date().toLocaleTimeString('en-GB');\n const totalPremium = sessions.reduce((s, x) => s + x.premiumRequests, 0);\n const completedCount = sessions.filter(s => s.complete).length;\n const stats = headerStats(procs.length, sessions.length, totalPremium, completedCount);\n headerBox.setContent(` {bold}{cyan-fg}⚡ copilot-agent{/} ${stats} {gray-fg}${time}{/}`);\n }\n\n // ── Render processes (cheap — just formatting cached data) ─────\n function renderProcesses(): void {\n if (procs.length === 0) {\n processBox.setContent(' {gray-fg}No agent processes running{/}');\n return;\n }\n const header = ` ${'PID'.padEnd(7)} ${'Agent'.padEnd(10)} ${'Session'.padEnd(20)} ${'Directory'.padEnd(30)} Status`;\n const rows = procs.map(p => processRow(p));\n processBox.setContent(`{gray-fg}${header}{/}\\n${rows.join('\\n')}`);\n }\n\n // ── Render session list (cheap — just formatting cached data) ──\n function renderSessions(): void {\n const items = sessions.map(s => sessionRow(s));\n sessionList.setItems(items);\n if (selectedIdx >= 0 && selectedIdx < items.length) {\n sessionList.select(selectedIdx);\n }\n sessionList.setLabel(` {cyan-fg}{bold}Sessions (${sessions.length}){/} `);\n }\n\n // ── Render detail (LAZY — only re-parse when selection changes) ─\n function renderDetail(force = false): void {\n if (sessions.length === 0 || selectedIdx < 0 || selectedIdx >= sessions.length) {\n detailBox.setContent('{gray-fg}No session selected{/}');\n lastDetailId = '';\n return;\n }\n const s = sessions[selectedIdx];\n // Skip if same session and not forced\n if (!force && s.id === lastDetailId) return;\n lastDetailId = s.id;\n\n const report = cacheDetail(cache, s);\n if (report) {\n detailBox.setContent(detailContent(report));\n detailBox.setLabel(` {cyan-fg}{bold}Detail — ${s.id.slice(0, 12)}…{/} `);\n } else {\n detailBox.setContent(`{gray-fg}Could not load report for ${s.id.slice(0, 8)}…{/}`);\n }\n }\n\n // ── Full render (uses cache — fast!) ───────────────────────────\n function render(): void {\n sessions = cacheSessions(cache, limit);\n procs = cacheProcs(cache);\n renderHeader();\n renderProcesses();\n renderSessions();\n renderDetail();\n screen.render();\n }\n\n // ── Force refresh (invalidate cache) ───────────────────────────\n function forceRefresh(): void {\n cache.sessionsTs = 0;\n cache.procsTs = 0;\n cache.details.clear();\n lastDetailId = '';\n render();\n }\n\n // ── Keyboard ───────────────────────────────────────────────────\n screen.key(['q', 'C-c'], () => {\n screen.destroy();\n process.exit(0);\n });\n\n screen.key(['r'], () => forceRefresh());\n\n screen.key(['tab'], () => {\n if (focusedPanel === 'sessions') {\n focusedPanel = 'detail';\n detailBox.focus();\n sessionList.style.border.fg = BORDER_COLOR;\n detailBox.style.border.fg = ACCENT;\n } else {\n focusedPanel = 'sessions';\n sessionList.focus();\n sessionList.style.border.fg = ACCENT;\n detailBox.style.border.fg = BORDER_COLOR;\n }\n screen.render();\n });\n\n sessionList.on('select item', (_item: any, index: number) => {\n selectedIdx = index;\n renderDetail();\n screen.render();\n });\n\n sessionList.key(['up', 'k'], () => {\n if (selectedIdx > 0) {\n selectedIdx--;\n sessionList.select(selectedIdx);\n renderDetail();\n screen.render();\n }\n });\n\n sessionList.key(['down', 'j'], () => {\n if (selectedIdx < sessions.length - 1) {\n selectedIdx++;\n sessionList.select(selectedIdx);\n renderDetail();\n screen.render();\n }\n });\n\n sessionList.key(['enter'], () => {\n renderDetail(true); // force re-parse for fresh data\n focusedPanel = 'detail';\n detailBox.focus();\n sessionList.style.border.fg = BORDER_COLOR;\n detailBox.style.border.fg = ACCENT;\n screen.render();\n });\n\n // ── Start ──────────────────────────────────────────────────────\n sessionList.focus();\n sessionList.style.border.fg = ACCENT;\n render();\n\n // Auto-refresh timer\n const timer = setInterval(render, refreshSec * 1000);\n screen.on('destroy', () => clearInterval(timer));\n}\n","import type { Command } from 'commander';\nimport { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { serve } from '@hono/node-server';\nimport { spawn } from 'node:child_process';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport { findAgentProcesses } from '../lib/process.js';\nimport { ok, info, fail } from '../lib/logger.js';\nimport { layoutHead, layoutFoot } from '../web/layout.js';\nimport { renderStats, renderProcesses, renderSessionList, renderDetail } from '../web/views.js';\n\nexport function registerWebCommand(program: Command): void {\n program\n .command('web')\n .description('Launch web dashboard in browser')\n .option('-p, --port <n>', 'Port number', '3847')\n .option('--no-open', 'Do not auto-open browser')\n .action((opts) => {\n startWebServer(parseInt(opts.port, 10), opts.open !== false);\n });\n}\n\nfunction getData() {\n const sessions = listAllSessions(20);\n const reports = sessions.map(s => getAgentSessionReport(s.id, s.agent)).filter(r => r !== null);\n const processes = findAgentProcesses();\n return { sessions: reports, processes };\n}\n\nfunction simpleHash(s: string): string {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n }\n return h.toString(36);\n}\n\nfunction startWebServer(port: number, autoOpen: boolean): void {\n const app = new Hono();\n\n // ─── JSON API ────────────────────────────────────────\n app.get('/api/sessions', (c) => c.json(getData()));\n\n app.get('/api/session/:id', (c) => {\n const report = getAgentSessionReport(c.req.param('id'));\n if (!report) return c.json({ error: 'Not found' }, 404);\n return c.json(report);\n });\n\n // ─── SSE for live updates (only push when data changes) ──\n app.get('/events', (c) => {\n return streamSSE(c, async (stream) => {\n let prevStatsHash = '';\n let prevProcsHash = '';\n\n while (true) {\n const { sessions, processes } = getData();\n\n const statsHtml = renderStats(sessions);\n const procsHtml = renderProcesses(processes);\n const statsHash = simpleHash(statsHtml);\n const procsHash = simpleHash(procsHtml);\n\n if (statsHash !== prevStatsHash) {\n await stream.writeSSE({ event: 'stats', data: statsHtml });\n prevStatsHash = statsHash;\n }\n if (procsHash !== prevProcsHash) {\n await stream.writeSSE({ event: 'procs', data: procsHtml });\n await stream.writeSSE({ event: 'proc-count', data: String(processes.length) });\n prevProcsHash = procsHash;\n }\n\n await stream.sleep(5000);\n }\n });\n });\n\n // ─── htmx Partials ──────────────────────────────────\n app.get('/partial/detail/:id', (c) => {\n const report = getAgentSessionReport(c.req.param('id'));\n if (!report) return c.html('<div class=\"empty-detail\">Session not found</div>');\n return c.html(renderDetail(report));\n });\n\n // ─── Main page ──────────────────────────────────────\n app.get('/', (c) => {\n const { sessions, processes } = getData();\n const firstId = sessions[0]?.id;\n\n return c.html(`${layoutHead}\n<body>\n <div class=\"header\">\n <div class=\"header-left\">\n <h1>🤖 <span>Copilot Agent</span></h1>\n <div class=\"live-badge\"><div class=\"live-dot\"></div> Live</div>\n </div>\n <div class=\"clock\" id=\"clock\"></div>\n </div>\n\n <div class=\"container\"\n hx-ext=\"sse\"\n sse-connect=\"/events\">\n\n <div class=\"stats\"\n sse-swap=\"stats\"\n hx-swap=\"innerHTML settle:0s swap:0s\">\n ${renderStats(sessions)}\n </div>\n\n <div class=\"procs\">\n <div class=\"procs-header\">\n ⬤ Active Processes <span class=\"count\" sse-swap=\"proc-count\" hx-swap=\"innerHTML settle:0s swap:0s\">${processes.length}</span>\n </div>\n <div class=\"procs-body\"\n sse-swap=\"procs\"\n hx-swap=\"innerHTML settle:0s swap:0s\">\n ${renderProcesses(processes)}\n </div>\n </div>\n\n <div class=\"main\">\n <div class=\"sidebar\">\n <div class=\"sidebar-header\">\n 📋 Sessions <span class=\"count\">${sessions.length}</span>\n </div>\n ${renderSessionList(sessions, firstId)}\n </div>\n <div class=\"detail\" id=\"detail\">\n ${firstId ? renderDetail(sessions[0]) : '<div class=\"empty-detail\">No sessions</div>'}\n </div>\n </div>\n </div>\n\n <script>\n setInterval(() => {\n document.getElementById('clock').textContent = new Date().toLocaleTimeString('en-GB');\n }, 1000);\n document.getElementById('clock').textContent = new Date().toLocaleTimeString('en-GB');\n </script>\n</body>\n${layoutFoot}`);\n });\n\n // ─── Start server ───────────────────────────────────\n try {\n serve({ fetch: app.fetch, port }, () => {\n const url = `http://localhost:${port}`;\n ok(`Web dashboard → ${url}`);\n info('Press Ctrl+C to stop');\n if (autoOpen) {\n spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();\n }\n });\n } catch (err) {\n fail(`Server error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","const cssStyles = `\n*{margin:0;padding:0;box-sizing:border-box}\n:root{\n --bg:#0d1117;--bg2:#161b22;--bg3:#21262d;--bg4:#292e36;\n --border:#30363d;--border2:#3d444d;\n --text:#e6edf3;--text2:#8b949e;--text3:#484f58;\n --cyan:#58a6ff;--green:#3fb950;--yellow:#d29922;--red:#f85149;--purple:#bc8cff;--orange:#f0883e;\n --font-sans:'Inter',system-ui,sans-serif;\n --font-mono:'JetBrains Mono','SF Mono',monospace;\n --radius:8px;\n}\nbody{background:var(--bg);color:var(--text);font-family:var(--font-sans);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}\n.header{background:var(--bg2);border-bottom:1px solid var(--border);padding:12px 24px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10;backdrop-filter:blur(12px)}\n.header-left{display:flex;align-items:center;gap:10px}\n.header-left h1{font-size:16px;font-weight:600}\n.header-left h1 span{color:var(--cyan)}\n.live-badge{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--green);background:rgba(63,185,80,.1);padding:3px 10px;border-radius:12px;font-weight:500}\n.live-dot{width:6px;height:6px;border-radius:50%;background:var(--green);animation:pulse 2s infinite}\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}\n.clock{font-family:var(--font-mono);font-size:13px;color:var(--text2)}\n.container{max-width:1280px;margin:0 auto;padding:16px 20px}\n.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;margin-bottom:16px}\n.stat{background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;transition:border-color .2s}\n.stat:hover{border-color:var(--border2)}\n.stat-label{font-size:11px;font-weight:500;color:var(--text2);text-transform:uppercase;letter-spacing:.4px}\n.stat-value{font-size:22px;font-weight:700;font-family:var(--font-mono);margin-top:2px}\n.stat-value.green{color:var(--green)}.stat-value.cyan{color:var(--cyan)}\n.stat-value.yellow{color:var(--yellow)}.stat-value.purple{color:var(--purple)}\n.procs{background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:16px;overflow:hidden}\n.procs-header{padding:10px 16px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}\n.procs-body{padding:4px 0}\n.proc{padding:6px 16px;display:flex;align-items:center;gap:10px;font-size:13px}\n.proc-dot{width:6px;height:6px;border-radius:50%;background:var(--green);flex-shrink:0}\n.proc-pid{font-family:var(--font-mono);color:var(--cyan);font-weight:500;min-width:70px}\n.proc-sid{color:var(--text2);font-family:var(--font-mono);font-size:12px}\n.proc-cwd{color:var(--text3);font-size:12px}\n.empty{padding:14px 16px;color:var(--text3);font-size:13px}\n.main{display:grid;grid-template-columns:360px 1fr;gap:0;background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;min-height:calc(100vh - 260px)}\n.sidebar{border-right:1px solid var(--border);overflow-y:auto}\n.sidebar-header{padding:10px 16px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;position:sticky;top:0;background:var(--bg2);z-index:2}\n.count{background:var(--bg3);color:var(--text2);font-size:11px;padding:1px 7px;border-radius:10px;font-weight:500}\n.s-item{padding:10px 16px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .15s}\n.s-item:last-child{border-bottom:none}\n.s-item:hover{background:var(--bg3)}\n.s-item.active{background:rgba(88,166,255,.06);border-left:3px solid var(--cyan);padding-left:13px}\n.s-row{display:flex;align-items:center;gap:10px}\n.s-icon{font-size:14px;flex-shrink:0}\n.s-info{flex:1;min-width:0}\n.s-title{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.s-meta{font-size:11px;color:var(--text2);display:flex;gap:10px;margin-top:2px;flex-wrap:wrap}\n.badge{font-size:10px;padding:1px 6px;border-radius:4px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase}\n.badge-done{background:rgba(63,185,80,.12);color:var(--green)}\n.badge-stop{background:rgba(210,153,34,.12);color:var(--yellow)}\n.badge-claude{background:rgba(217,119,6,.15);color:#f59e0b}\n.badge-copilot{background:rgba(56,189,248,.12);color:#38bdf8}\n.detail{padding:20px;overflow-y:auto}\n.detail-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}\n.detail-title{font-size:18px;font-weight:700}\n.detail-id{font-family:var(--font-mono);font-size:11px;color:var(--text3);background:var(--bg);padding:3px 8px;border-radius:4px}\n.detail-time{font-size:12px;color:var(--text2);margin-bottom:16px}\n.detail-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px;margin-bottom:20px}\n.d-stat{background:var(--bg);border-radius:6px;padding:10px}\n.d-stat-label{font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:.3px}\n.d-stat-val{font-size:16px;font-weight:700;font-family:var(--font-mono);margin-top:1px}\n.sub{margin-top:20px}\n.sub-title{font-size:12px;font-weight:600;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;display:flex;align-items:center;gap:6px}\n.tool-row{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:12px}\n.tool-name{color:var(--text2);min-width:110px;text-align:right;font-family:var(--font-mono);font-size:11px}\n.tool-bar-bg{flex:1;background:var(--bg);border-radius:3px;height:14px;overflow:hidden}\n.tool-bar{height:100%;border-radius:3px;background:linear-gradient(90deg,var(--cyan),var(--purple));opacity:.7;transition:width .4s ease}\n.tool-count{font-family:var(--font-mono);color:var(--text2);min-width:40px;font-size:11px}\n.commit-list,.task-list,.file-list,.error-list{list-style:none}\n.commit-list li,.task-list li{padding:5px 0;font-size:13px;display:flex;align-items:flex-start;gap:6px;border-bottom:1px solid var(--border)}\n.commit-list li:last-child,.task-list li:last-child{border-bottom:none}\n.c-dot{color:var(--green);flex-shrink:0;margin-top:2px}\n.t-check{color:var(--green);flex-shrink:0;margin-top:2px}\n.file-list li{padding:2px 0;font-size:11px;font-family:var(--font-mono)}\n.file-created{color:var(--green)}\n.file-edited{color:var(--yellow)}\n.error-list li{padding:5px 0;font-size:12px;color:var(--red)}\n.more{font-size:11px;color:var(--text3);padding:4px 0}\n.empty-detail{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text3)}\n@media(max-width:768px){.main{grid-template-columns:1fr}.stats{grid-template-columns:repeat(2,1fr)}}\n`;\n\nexport const layoutHead = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Copilot Agent Dashboard</title>\n<script src=\"https://unpkg.com/htmx.org@2.0.4\" integrity=\"sha384-HGfztofotfshcF7+8n44JQL2oJmowVChPTg48S+jvZoztPfvwD79OC/LTtG6dMp+\" crossorigin=\"anonymous\"></script>\n<script src=\"https://unpkg.com/htmx-ext-sse@2.2.2/sse.js\"></script>\n<script defer src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js\"></script>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n<style>\n${cssStyles}\n</style>\n</head>`;\n\nexport const layoutFoot = `</html>`;\n","import type { SessionReport } from '../lib/session.js';\nimport type { CopilotProcess } from '../lib/process.js';\n\n// ─── Helpers ───────────────────────────────────────────────\nfunction esc(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction fmt(n: number): string {\n return n.toLocaleString();\n}\n\nfunction fmtDur(ms: number): string {\n if (!ms) return '—';\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n\nfunction fmtTime(iso: string): string {\n if (!iso) return '—';\n return new Date(iso).toLocaleString('en-GB', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });\n}\n\nfunction fmtAgo(iso: string): string {\n if (!iso) return '—';\n const diff = Date.now() - new Date(iso).getTime();\n if (diff < 60_000) return 'just now';\n if (diff < 3_600_000) return `${Math.round(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.round(diff / 3_600_000)}h ago`;\n return `${Math.round(diff / 86_400_000)}d ago`;\n}\n\nfunction shortPath(p: string, proj: string): string {\n if (proj && p.includes(proj + '/')) return p.split(proj + '/').pop() ?? p;\n return p.split('/').slice(-3).join('/');\n}\n\n// ─── Stats Bar ─────────────────────────────────────────────\nexport function renderStats(sessions: SessionReport[]): string {\n const totalPremium = sessions.reduce((a, s) => a + (s.premiumRequests ?? 0), 0);\n const totalTokens = sessions.reduce((a, s) => a + (s.outputTokens ?? 0), 0);\n const totalCommits = sessions.reduce((a, s) => a + (s.gitCommits?.length ?? 0), 0);\n const totalTasks = sessions.reduce((a, s) => a + (s.taskCompletions?.length ?? 0), 0);\n const completed = sessions.filter(s => s.complete).length;\n\n const items = [\n { label: 'Sessions', value: String(sessions.length), cls: 'cyan' },\n { label: 'Completed', value: `${completed}/${sessions.length}`, cls: 'green' },\n { label: 'Premium', value: fmt(totalPremium), cls: 'yellow' },\n { label: 'Tokens', value: fmt(totalTokens), cls: 'purple' },\n { label: 'Commits', value: String(totalCommits), cls: 'green' },\n { label: 'Tasks Done', value: String(totalTasks), cls: 'cyan' },\n ];\n\n return items.map(i =>\n `<div class=\"stat\"><div class=\"stat-label\">${i.label}</div><div class=\"stat-value ${i.cls}\">${i.value}</div></div>`\n ).join('');\n}\n\n// ─── Process List ──────────────────────────────────────────\nexport function renderProcesses(procs: CopilotProcess[]): string {\n if (procs.length === 0) return '<div class=\"empty\">No active agent processes</div>';\n return procs.map(p => {\n const sid = p.sessionId ? p.sessionId.slice(0, 8) + '…' : '—';\n const agentBadge = p.agent === 'claude'\n ? '<span class=\"badge badge-claude\">claude</span>'\n : '<span class=\"badge badge-copilot\">copilot</span>';\n return `<div class=\"proc\">\n <div class=\"proc-dot\"></div>\n ${agentBadge}\n <span class=\"proc-pid\">PID ${p.pid}</span>\n <span class=\"proc-sid\">${esc(sid)}</span>\n <span class=\"proc-cwd\">${esc(p.cwd ?? '')}</span>\n </div>`;\n }).join('');\n}\n\n// ─── Session List ──────────────────────────────────────────\nexport function renderSessionList(sessions: SessionReport[], selectedId?: string): string {\n return sessions.map(s => {\n const proj = (s.cwd ?? '').split('/').pop() ?? '—';\n const isActive = s.id === selectedId;\n const agentBadge = s.agent === 'claude'\n ? '<span class=\"badge badge-claude\">claude</span>'\n : '<span class=\"badge badge-copilot\">copilot</span>';\n return `<div class=\"s-item${isActive ? ' active' : ''}\"\n hx-get=\"/partial/detail/${s.id}\" hx-target=\"#detail\" hx-swap=\"innerHTML\"\n onclick=\"document.querySelectorAll('.s-item').forEach(e=>e.classList.remove('active'));this.classList.add('active')\">\n <div class=\"s-row\">\n <span class=\"s-icon\">${s.complete ? '✅' : '⏸️'}</span>\n <div class=\"s-info\">\n <div class=\"s-title\">${agentBadge} ${esc(proj)} — ${esc(s.summary || '(no summary)')}</div>\n <div class=\"s-meta\">\n <span>${fmtDur(s.durationMs)}</span>\n <span>${s.agent === 'claude' ? '' : fmt(s.premiumRequests) + ' premium'}</span>\n <span>${fmtAgo(s.endTime)}</span>\n <span class=\"badge ${s.complete ? 'badge-done' : 'badge-stop'}\">${s.complete ? 'done' : 'stopped'}</span>\n </div>\n </div>\n </div>\n </div>`;\n }).join('');\n}\n\n// ─── Session Detail ────────────────────────────────────────\nexport function renderDetail(s: SessionReport): string {\n const proj = (s.cwd ?? '').split('/').pop() ?? '—';\n const totalTools = Object.values(s.toolUsage ?? {}).reduce((a, b) => a + b, 0);\n const toolEntries = Object.entries(s.toolUsage ?? {}).sort((a, b) => b[1] - a[1]);\n const maxTool = toolEntries[0]?.[1] ?? 1;\n\n let html = '';\n\n const agentBadge = s.agent === 'claude'\n ? '<span class=\"badge badge-claude\" style=\"margin-left:8px\">claude</span>'\n : '<span class=\"badge badge-copilot\" style=\"margin-left:8px\">copilot</span>';\n\n // Header\n html += `<div class=\"detail-head\">\n <div class=\"detail-title\">${esc(proj)}${agentBadge}</div>\n <div class=\"detail-id\">${s.id}</div>\n </div>`;\n\n html += `<div class=\"detail-time\">${fmtTime(s.startTime)} → ${fmtTime(s.endTime)}</div>`;\n\n // Stats grid\n html += `<div class=\"detail-stats\">\n <div class=\"d-stat\"><div class=\"d-stat-label\">Duration</div><div class=\"d-stat-val\">${fmtDur(s.durationMs)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">User Msgs</div><div class=\"d-stat-val\">${s.userMessages}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Turns</div><div class=\"d-stat-val\">${fmt(s.assistantTurns)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Tokens</div><div class=\"d-stat-val\">${fmt(s.outputTokens)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Premium</div><div class=\"d-stat-val\">${fmt(s.premiumRequests)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Tool Calls</div><div class=\"d-stat-val\">${fmt(totalTools)}</div></div>\n </div>`;\n\n // Tools chart\n if (toolEntries.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">🔧 Tools Used</div>`;\n for (const [tool, count] of toolEntries.slice(0, 12)) {\n const pct = Math.round((count / maxTool) * 100);\n html += `<div class=\"tool-row\">\n <span class=\"tool-name\">${esc(tool)}</span>\n <div class=\"tool-bar-bg\"><div class=\"tool-bar\" style=\"width:${pct}%\"></div></div>\n <span class=\"tool-count\">${count}</span>\n </div>`;\n }\n if (toolEntries.length > 12) html += `<div class=\"more\">… +${toolEntries.length - 12} more</div>`;\n html += `</div>`;\n }\n\n // Git commits\n if (s.gitCommits.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">🔀 Git Commits <span class=\"count\">${s.gitCommits.length}</span></div><ul class=\"commit-list\">`;\n for (const msg of s.gitCommits.slice(0, 12)) {\n const first = msg.split('\\n')[0].slice(0, 80);\n html += `<li><span class=\"c-dot\">●</span><span>${esc(first)}</span></li>`;\n }\n if (s.gitCommits.length > 12) html += `<li class=\"more\">… +${s.gitCommits.length - 12} more</li>`;\n html += `</ul></div>`;\n }\n\n // Files\n const files = [\n ...s.filesCreated.map(f => ({ path: f, type: 'created' as const })),\n ...s.filesEdited.map(f => ({ path: f, type: 'edited' as const })),\n ];\n if (files.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">📁 Files Changed <span class=\"count\">${files.length}</span></div><ul class=\"file-list\">`;\n for (const f of files.slice(0, 25)) {\n const cls = f.type === 'created' ? 'file-created' : 'file-edited';\n const icon = f.type === 'created' ? '+' : '~';\n html += `<li><span class=\"${cls}\">${icon}</span> ${esc(shortPath(f.path, proj))}</li>`;\n }\n if (files.length > 25) html += `<li class=\"more\">… +${files.length - 25} more</li>`;\n html += `</ul></div>`;\n }\n\n // Task completions\n if (s.taskCompletions.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">✅ Tasks Completed <span class=\"count\">${s.taskCompletions.length}</span></div><ul class=\"task-list\">`;\n for (const t of s.taskCompletions.slice(0, 10)) {\n const first = t.split('\\n')[0].slice(0, 80);\n html += `<li><span class=\"t-check\">✔</span><span>${esc(first)}</span></li>`;\n }\n if (s.taskCompletions.length > 10) html += `<li class=\"more\">… +${s.taskCompletions.length - 10} more</li>`;\n html += `</ul></div>`;\n }\n\n // Errors\n if (s.errors.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\" style=\"color:var(--red)\">⚠️ Errors <span class=\"count\">${s.errors.length}</span></div><ul class=\"error-list\">`;\n for (const e of s.errors.slice(0, 5)) {\n html += `<li>${esc(e.slice(0, 100))}</li>`;\n }\n if (s.errors.length > 5) html += `<li class=\"more\">… +${s.errors.length - 5} more</li>`;\n html += `</ul></div>`;\n }\n\n return html;\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { loadGlobalConfig, setConfigValue, deleteConfigValue, resetConfig, resolveConfig } from '../lib/config.js';\n\nexport function registerConfigCommand(program: Command): void {\n const cmd = program\n .command('config')\n .description('Manage persistent configuration defaults');\n\n cmd\n .command('list')\n .description('Show all configuration values')\n .action(() => {\n const global = loadGlobalConfig();\n const resolved = resolveConfig();\n console.log(chalk.bold.cyan('\\n Global Config') + chalk.dim(' (~/.copilot-agent/config.yaml)\\n'));\n const entries = Object.entries(global);\n if (entries.length === 0) {\n console.log(chalk.dim(' (empty — using defaults)\\n'));\n } else {\n for (const [k, v] of entries) {\n console.log(` ${chalk.bold(k.padEnd(16))} ${chalk.green(String(v))}`);\n }\n console.log();\n }\n console.log(chalk.bold.cyan(' Resolved Config') + chalk.dim(' (defaults + global + project)\\n'));\n for (const [k, v] of Object.entries(resolved)) {\n if (v !== undefined) {\n const isOverride = (global as any)[k] !== undefined;\n const marker = isOverride ? chalk.yellow('●') : chalk.dim('○');\n console.log(` ${marker} ${chalk.bold(k.padEnd(16))} ${String(v)}`);\n }\n }\n console.log();\n });\n\n cmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n setConfigValue(key, value);\n console.log(chalk.green(` ✔ Set ${chalk.bold(key)} = ${value}`));\n });\n\n cmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const resolved = resolveConfig();\n const val = (resolved as any)[key];\n if (val !== undefined) {\n console.log(` ${chalk.bold(key)} = ${chalk.green(String(val))}`);\n } else {\n console.log(chalk.dim(` ${key} is not set`));\n }\n });\n\n cmd\n .command('unset <key>')\n .description('Remove a configuration value')\n .action((key: string) => {\n deleteConfigValue(key);\n console.log(chalk.yellow(` ✔ Removed ${chalk.bold(key)}`));\n });\n\n cmd\n .command('reset')\n .description('Reset all configuration to defaults')\n .action(() => {\n resetConfig();\n console.log(chalk.yellow(' ✔ Configuration reset to defaults'));\n });\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { findUpSync } from 'find-up';\n\nexport interface AgentConfig {\n agent?: 'copilot' | 'claude';\n steps?: number;\n worktree?: boolean;\n cooldown?: number;\n maxPremium?: number;\n maxTasks?: number;\n autopr?: boolean;\n until?: string;\n refreshInterval?: number;\n}\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst GLOBAL_CONFIG = join(CONFIG_DIR, 'config.yaml');\nconst PROJECT_CONFIG_NAME = '.copilot-agent.yaml';\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n}\n\nexport function loadGlobalConfig(): AgentConfig {\n if (!existsSync(GLOBAL_CONFIG)) return {};\n try {\n return parseYaml(readFileSync(GLOBAL_CONFIG, 'utf-8')) || {};\n } catch {\n return {};\n }\n}\n\nexport function saveGlobalConfig(config: AgentConfig): void {\n ensureConfigDir();\n writeFileSync(GLOBAL_CONFIG, stringifyYaml(config), 'utf-8');\n}\n\nexport function loadProjectConfig(cwd?: string): AgentConfig {\n const configPath = findUpSync(PROJECT_CONFIG_NAME, { cwd: cwd || process.cwd() });\n if (!configPath) return {};\n try {\n return parseYaml(readFileSync(configPath, 'utf-8')) || {};\n } catch {\n return {};\n }\n}\n\nexport function resolveConfig(cliOpts: Partial<AgentConfig> = {}, cwd?: string): AgentConfig {\n const defaults: AgentConfig = { steps: 30, cooldown: 10, maxPremium: 50, maxTasks: 5, refreshInterval: 5 };\n const global = loadGlobalConfig();\n const project = loadProjectConfig(cwd);\n // Merge: defaults → global → project → CLI (later wins, undefined skipped)\n const merged = { ...defaults };\n for (const src of [global, project, cliOpts]) {\n for (const [k, v] of Object.entries(src)) {\n if (v !== undefined) (merged as any)[k] = v;\n }\n }\n return merged;\n}\n\nexport function getConfigValue(key: string): unknown {\n const config = loadGlobalConfig();\n return (config as any)[key];\n}\n\nexport function setConfigValue(key: string, value: string): void {\n const config = loadGlobalConfig();\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (/^\\d+$/.test(value)) parsed = parseInt(value, 10);\n (config as any)[key] = parsed;\n saveGlobalConfig(config);\n}\n\nexport function deleteConfigValue(key: string): void {\n const config = loadGlobalConfig();\n delete (config as any)[key];\n saveGlobalConfig(config);\n}\n\nexport function resetConfig(): void {\n if (existsSync(GLOBAL_CONFIG)) {\n writeFileSync(GLOBAL_CONFIG, '', 'utf-8');\n }\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst PID_FILE = join(homedir(), '.copilot-agent', 'proxy.pid');\nconst DEFAULT_PORT = 4141;\n\nfunction ensureDir(): void {\n const dir = join(homedir(), '.copilot-agent');\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nfunction findCopilotToken(): string | null {\n const appsPath = join(homedir(), '.config', 'github-copilot', 'apps.json');\n if (!existsSync(appsPath)) return null;\n try {\n const apps = JSON.parse(readFileSync(appsPath, 'utf-8'));\n for (const key of Object.keys(apps)) {\n const token = apps[key]?.oauth_token;\n if (token && token.startsWith('ghu_')) return token;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction readPid(): number | null {\n if (!existsSync(PID_FILE)) return null;\n try {\n const pid = parseInt(readFileSync(PID_FILE, 'utf-8').trim(), 10);\n return isNaN(pid) ? null : pid;\n } catch {\n return null;\n }\n}\n\nfunction isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isPortOpen(port: number): Promise<boolean> {\n try {\n const resp = await fetch(`http://localhost:${port}/v1/models`);\n return resp.ok;\n } catch {\n return false;\n }\n}\n\nexport function registerProxyCommand(program: Command): void {\n const cmd = program\n .command('proxy')\n .description('Manage copilot-api proxy for Claude Code');\n\n cmd\n .command('start')\n .description('Start copilot-api proxy')\n .option('-p, --port <n>', 'Port number', String(DEFAULT_PORT))\n .option('--rate-limit <n>', 'Rate limit in seconds', '30')\n .action(async (opts) => {\n const port = parseInt(opts.port, 10);\n const rateLimit = parseInt(opts.rateLimit, 10);\n\n // Check if already running\n const existingPid = readPid();\n if (existingPid && isProcessRunning(existingPid)) {\n const open = await isPortOpen(port);\n if (open) {\n console.log(chalk.yellow(` ⚠ Proxy already running (PID ${existingPid}) on port ${port}`));\n return;\n }\n }\n\n // Find token\n const token = findCopilotToken();\n if (!token) {\n console.log(chalk.red(' ✗ No Copilot token found'));\n console.log(chalk.dim(' Expected: ~/.config/github-copilot/apps.json with ghu_* token'));\n console.log(chalk.dim(' Run: copilot-api auth to authenticate'));\n return;\n }\n\n console.log(chalk.cyan(' Starting copilot-api proxy...'));\n console.log(chalk.dim(` Token: ${token.slice(0, 8)}...${token.slice(-4)}`));\n console.log(chalk.dim(` Port: ${port} | Rate limit: ${rateLimit}s`));\n\n try {\n const child = execa('copilot-api', [\n 'start',\n '--github-token', token,\n '--rate-limit', String(rateLimit),\n '--wait',\n '--port', String(port),\n ], {\n detached: true,\n stdio: 'ignore',\n });\n\n if (child.pid) {\n child.unref();\n ensureDir();\n writeFileSync(PID_FILE, String(child.pid), 'utf-8');\n\n // Wait a moment for startup\n await new Promise(r => setTimeout(r, 2000));\n\n const open = await isPortOpen(port);\n if (open) {\n console.log(chalk.green(` ✔ Proxy started (PID ${child.pid}) on http://localhost:${port}`));\n } else {\n console.log(chalk.yellow(` ⚠ Proxy started (PID ${child.pid}) but port not yet responsive`));\n console.log(chalk.dim(' It may take a few seconds to initialize'));\n }\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(chalk.red(` ✗ Failed to start proxy: ${message}`));\n console.log(chalk.dim(' Make sure copilot-api is installed: npm install -g copilot-api'));\n }\n });\n\n cmd\n .command('stop')\n .description('Stop copilot-api proxy')\n .action(() => {\n const pid = readPid();\n if (!pid) {\n console.log(chalk.dim(' No proxy PID found'));\n return;\n }\n if (!isProcessRunning(pid)) {\n console.log(chalk.dim(` Proxy (PID ${pid}) is not running`));\n if (existsSync(PID_FILE)) unlinkSync(PID_FILE);\n return;\n }\n try {\n process.kill(pid, 'SIGTERM');\n if (existsSync(PID_FILE)) unlinkSync(PID_FILE);\n console.log(chalk.green(` ✔ Proxy stopped (PID ${pid})`));\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(chalk.red(` ✗ Failed to stop: ${message}`));\n }\n });\n\n cmd\n .command('status')\n .description('Check proxy status')\n .option('-p, --port <n>', 'Port number', String(DEFAULT_PORT))\n .action(async (opts) => {\n const port = parseInt(opts.port, 10);\n const pid = readPid();\n const running = pid ? isProcessRunning(pid) : false;\n const open = await isPortOpen(port);\n\n console.log(chalk.bold.cyan('\\n Copilot API Proxy Status\\n'));\n console.log(` PID: ${running ? chalk.green(String(pid)) : chalk.dim('not running')}`);\n console.log(` Port: ${open ? chalk.green(`localhost:${port} ✔`) : chalk.red(`localhost:${port} ✗`)}`);\n\n const token = findCopilotToken();\n console.log(` Token: ${token ? chalk.green(token.slice(0, 8) + '...' + token.slice(-4)) : chalk.red('not found')}`);\n\n if (open) {\n try {\n const resp = await fetch(`http://localhost:${port}/v1/models`);\n const data = await resp.json() as { data?: unknown[] };\n const modelCount = data?.data?.length || 0;\n console.log(` Models: ${chalk.green(String(modelCount) + ' available')}`);\n } catch {\n console.log(` Models: ${chalk.dim('unknown')}`);\n }\n }\n console.log();\n });\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execaCommandSync } from 'execa';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport type { AgentType } from '../lib/provider.js';\n\nexport function registerDiffCommand(program: Command): void {\n program\n .command('diff [session-id]')\n .description('Show git changes made by an agent session')\n .option('--stat', 'Show diffstat summary only')\n .option('-n, --num-commits <n>', 'Number of recent commits to diff', '0')\n .option('--project <dir>', 'Filter sessions by project directory')\n .action((sessionId: string | undefined, opts) => {\n try {\n showDiff(sessionId, opts);\n } catch (err: any) {\n console.error(chalk.red(` ✗ ${err.message}`));\n }\n });\n}\n\nfunction showDiff(sessionId: string | undefined, opts: { stat?: boolean; numCommits?: string; project?: string }): void {\n let sessions = listAllSessions(50);\n if (opts.project) {\n sessions = sessions.filter(s => s.cwd.includes(opts.project!));\n }\n\n let targetId = sessionId;\n let targetAgent: AgentType | undefined;\n\n if (!targetId) {\n if (sessions.length === 0) {\n console.log(chalk.dim(' No sessions found'));\n return;\n }\n targetId = sessions[0].id;\n targetAgent = sessions[0].agent;\n console.log(chalk.dim(` Using latest session: ${targetId.slice(0, 8)}…\\n`));\n } else {\n const match = sessions.find(s => s.id.startsWith(targetId!));\n if (match) targetAgent = match.agent;\n }\n\n const report = getAgentSessionReport(targetId, targetAgent);\n if (!report) {\n console.log(chalk.red(` ✗ Session not found: ${targetId}`));\n return;\n }\n\n // Header\n const project = report.cwd?.split('/').pop() || 'unknown';\n const agentTag = report.agent === 'claude' ? chalk.yellow('[claude]') : chalk.cyan('[copilot]');\n console.log(chalk.bold(` ${agentTag} ${project}`) + chalk.dim(` — ${report.id.slice(0, 8)}…`));\n console.log(chalk.dim(` ${report.summary || 'No summary'}`));\n console.log();\n\n // Created files\n if (report.filesCreated.length > 0) {\n console.log(chalk.bold.green(' Created files:'));\n for (const f of report.filesCreated) {\n console.log(chalk.green(` + ${f}`));\n }\n console.log();\n }\n\n // Edited files\n if (report.filesEdited.length > 0) {\n console.log(chalk.bold.yellow(' Edited files:'));\n for (const f of report.filesEdited) {\n console.log(chalk.yellow(` ~ ${f}`));\n }\n console.log();\n }\n\n // Commits\n if (report.gitCommits.length > 0) {\n console.log(chalk.bold.cyan(' Commits:'));\n for (const c of report.gitCommits) {\n const first = c.split('\\n')[0];\n console.log(chalk.cyan(` ● ${first}`));\n }\n console.log();\n }\n\n // Git diff\n if (report.cwd) {\n const numCommits = parseInt(opts.numCommits || '0', 10);\n if (numCommits > 0) {\n try {\n const diffArgs = opts.stat\n ? ['git', '--no-pager', 'diff', '--stat', `HEAD~${numCommits}`]\n : ['git', '--no-pager', 'diff', '--color=always', `HEAD~${numCommits}`];\n\n const result = execaCommandSync(diffArgs.join(' '), { cwd: report.cwd });\n if (result.stdout) {\n console.log(chalk.bold(' Git Diff:\\n'));\n console.log(result.stdout);\n } else {\n console.log(chalk.dim(' No diff (working tree clean)'));\n }\n } catch (err: any) {\n console.log(chalk.dim(` Could not run git diff: ${err.message}`));\n }\n } else if (report.gitCommits.length > 0) {\n try {\n const n = report.gitCommits.length;\n const result = execaCommandSync(`git --no-pager diff --stat HEAD~${n}`, { cwd: report.cwd });\n if (result.stdout) {\n console.log(chalk.bold(' Diffstat:\\n'));\n console.log(result.stdout);\n }\n } catch {\n // Silently ignore — commits may be on different branch\n }\n }\n }\n\n // Summary stats\n console.log();\n console.log(chalk.dim(' ─────────────────────────────────'));\n console.log(` ${chalk.bold('Files:')} ${chalk.green(`+${report.filesCreated.length}`)} created, ${chalk.yellow(`~${report.filesEdited.length}`)} edited`);\n console.log(` ${chalk.bold('Commits:')} ${report.gitCommits.length}`);\n console.log(` ${chalk.bold('Premium:')} ${chalk.yellow(`⬡${report.premiumRequests}`)}`);\n console.log();\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { buildUsageSummary, formatTokens, formatDurationShort } from '../lib/quota.js';\n\nexport function registerQuotaCommand(program: Command): void {\n program\n .command('quota')\n .description('Track premium requests, tokens, and usage over time')\n .option('-d, --days <n>', 'Number of days to show', '7')\n .option('--all', 'Show all-time usage')\n .action((opts) => {\n const days = opts.all ? undefined : parseInt(opts.days, 10);\n const label = days ? `Last ${days} days` : 'All time';\n const summary = buildUsageSummary(days);\n\n console.log();\n console.log(chalk.bold.cyan(` ⬡ Usage Summary — ${label}`));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n console.log();\n\n // Total stats\n const t = summary.total;\n console.log(` ${chalk.bold('Sessions')} ${chalk.white(String(t.sessions))}`);\n console.log(` ${chalk.bold('Premium')} ${chalk.yellow('⬡ ' + String(t.premium))}`);\n console.log(` ${chalk.bold('Tokens')} ${chalk.green(formatTokens(t.tokens))}`);\n console.log(` ${chalk.bold('Turns')} ${chalk.white(String(t.turns))}`);\n console.log(` ${chalk.bold('Total time')} ${chalk.white(formatDurationShort(t.durationMs))}`);\n console.log();\n\n // Per-agent breakdown\n if (summary.copilot.sessions > 0 || summary.claude.sessions > 0) {\n console.log(chalk.bold.cyan(' Per Agent'));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n\n if (summary.copilot.sessions > 0) {\n const c = summary.copilot;\n console.log(` ${chalk.cyan('copilot')} ${String(c.sessions).padStart(4)} sessions ${chalk.yellow('⬡' + String(c.premium).padStart(5))} ${chalk.green(formatTokens(c.tokens).padStart(7))} tokens`);\n }\n if (summary.claude.sessions > 0) {\n const c = summary.claude;\n console.log(` ${chalk.yellow('claude ')} ${String(c.sessions).padStart(4)} sessions ${chalk.yellow('⬡' + String(c.premium).padStart(5))} ${chalk.green(formatTokens(c.tokens).padStart(7))} tokens`);\n }\n console.log();\n }\n\n // Daily chart\n const dayEntries = Object.entries(summary.byDay).sort((a, b) => a[0].localeCompare(b[0]));\n if (dayEntries.length > 0) {\n console.log(chalk.bold.cyan(' Daily Usage'));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n\n const maxPremium = Math.max(...dayEntries.map(([, d]) => d.premium), 1);\n const barWidth = 24;\n\n for (const [day, data] of dayEntries.slice(-14)) {\n const shortDay = day.slice(5);\n const filled = Math.round((data.premium / maxPremium) * barWidth);\n const bar = chalk.cyan('█'.repeat(filled)) + chalk.dim('░'.repeat(barWidth - filled));\n console.log(` ${chalk.dim(shortDay)} ${bar} ${chalk.yellow('⬡' + String(data.premium).padStart(4))} ${chalk.dim(String(data.sessions) + ' sess')}`);\n }\n console.log();\n }\n });\n}\n","import { readFileSync, writeFileSync, appendFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { listAllSessions, getAgentSessionReport } from './session.js';\nimport type { AgentType } from './provider.js';\n\nconst DATA_DIR = join(homedir(), '.copilot-agent');\nconst USAGE_FILE = join(DATA_DIR, 'usage.jsonl');\n\ninterface UsageEntry {\n timestamp: string;\n sessionId: string;\n agent: AgentType;\n premium: number;\n tokens: number;\n turns: number;\n duration: number;\n project: string;\n}\n\ninterface UsageSummary {\n total: { sessions: number; premium: number; tokens: number; turns: number; durationMs: number };\n copilot: { sessions: number; premium: number; tokens: number };\n claude: { sessions: number; premium: number; tokens: number };\n byDay: Record<string, { premium: number; tokens: number; sessions: number }>;\n}\n\nfunction ensureDir(): void {\n if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });\n}\n\nexport function recordUsage(entry: UsageEntry): void {\n ensureDir();\n appendFileSync(USAGE_FILE, JSON.stringify(entry) + '\\n', 'utf-8');\n}\n\nexport function loadUsageHistory(): UsageEntry[] {\n if (!existsSync(USAGE_FILE)) return [];\n try {\n return readFileSync(USAGE_FILE, 'utf-8')\n .split('\\n')\n .filter(Boolean)\n .map(line => JSON.parse(line));\n } catch {\n return [];\n }\n}\n\nexport function buildUsageSummary(days?: number): UsageSummary {\n const sessions = listAllSessions(500);\n\n const cutoff = days ? Date.now() - days * 86_400_000 : 0;\n const filtered = sessions.filter(s => s.mtime >= cutoff);\n\n const summary: UsageSummary = {\n total: { sessions: 0, premium: 0, tokens: 0, turns: 0, durationMs: 0 },\n copilot: { sessions: 0, premium: 0, tokens: 0 },\n claude: { sessions: 0, premium: 0, tokens: 0 },\n byDay: {},\n };\n\n for (const s of filtered) {\n const report = getAgentSessionReport(s.id, s.agent);\n if (!report) continue;\n\n summary.total.sessions++;\n summary.total.premium += report.premiumRequests;\n summary.total.tokens += report.outputTokens;\n summary.total.turns += report.assistantTurns;\n summary.total.durationMs += report.durationMs;\n\n const bucket = s.agent === 'claude' ? summary.claude : summary.copilot;\n bucket.sessions++;\n bucket.premium += report.premiumRequests;\n bucket.tokens += report.outputTokens;\n\n const day = new Date(s.mtime).toISOString().slice(0, 10);\n if (!summary.byDay[day]) summary.byDay[day] = { premium: 0, tokens: 0, sessions: 0 };\n summary.byDay[day].premium += report.premiumRequests;\n summary.byDay[day].tokens += report.outputTokens;\n summary.byDay[day].sessions++;\n }\n\n return summary;\n}\n\nexport function formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\nexport function formatDurationShort(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { listAllSessions } from '../lib/session.js';\nimport { compactSession, saveCompact, buildResumePrompt } from '../lib/compact.js';\n\nexport function registerCompactCommand(program: Command): void {\n program\n .command('compact [session-id]')\n .description('Generate context summary from a session for handoff/resume')\n .option('--save', 'Save compact to ~/.copilot-agent/compacts/')\n .option('--resume-prompt', 'Output a resume prompt for the next session')\n .option('-a, --agent <type>', 'Agent type: copilot | claude')\n .action((sessionId: string | undefined, opts) => {\n try {\n showCompact(sessionId, opts);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(` ✗ ${msg}`));\n }\n });\n}\n\nfunction showCompact(sessionId: string | undefined, opts: { save?: boolean; resumePrompt?: boolean; agent?: string }): void {\n // Find session\n if (!sessionId) {\n const sessions = listAllSessions(10);\n if (sessions.length === 0) {\n console.log(chalk.dim(' No sessions found'));\n return;\n }\n sessionId = sessions[0].id;\n console.log(chalk.dim(` Using latest session: ${sessionId.slice(0, 12)}…\\n`));\n }\n\n const compact = compactSession(sessionId, opts.agent as any);\n if (!compact) {\n console.log(chalk.red(` ✗ Session not found: ${sessionId}`));\n return;\n }\n\n // Show resume prompt mode\n if (opts.resumePrompt) {\n console.log(buildResumePrompt(compact));\n return;\n }\n\n // Display compact summary\n const agentTag = compact.agent === 'claude' ? chalk.yellow('[claude]') : chalk.cyan('[copilot]');\n console.log(chalk.bold.cyan(` 📋 Session Compact — ${compact.project}`) + ` ${agentTag}`);\n console.log(chalk.dim(` ${compact.sessionId}`));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n console.log();\n\n // Stats\n console.log(` ${chalk.bold('Duration')} ${compact.stats.duration} ${chalk.bold('Turns')} ${compact.stats.turns} ${chalk.bold('Tokens')} ${compact.stats.tokens.toLocaleString()} ${chalk.bold('Premium')} ${chalk.yellow('⬡' + compact.stats.premium)}`);\n console.log();\n\n if (compact.summary) {\n console.log(chalk.bold(' Task:') + ` ${compact.summary}`);\n console.log();\n }\n\n // Done\n if (compact.done.length > 0) {\n console.log(chalk.bold.green(' ✅ Completed:'));\n for (const d of compact.done.slice(0, 15)) {\n console.log(chalk.green(` ● ${d}`));\n }\n if (compact.done.length > 15) console.log(chalk.dim(` ... +${compact.done.length - 15} more`));\n console.log();\n }\n\n // Remaining\n if (compact.remaining.length > 0) {\n console.log(chalk.bold.yellow(' ⏳ Remaining:'));\n for (const r of compact.remaining) {\n console.log(chalk.yellow(` ○ ${r}`));\n }\n console.log();\n }\n\n // Commits\n if (compact.commits.length > 0) {\n console.log(chalk.bold.cyan(' Commits:'));\n for (const c of compact.commits.slice(0, 8)) {\n console.log(chalk.cyan(` ● ${c}`));\n }\n console.log();\n }\n\n // Errors\n if (compact.errors.length > 0) {\n console.log(chalk.bold.red(' ⚠️ Errors:'));\n for (const e of compact.errors.slice(0, 5)) {\n console.log(chalk.red(` ✗ ${e}`));\n }\n console.log();\n }\n\n // Save\n if (opts.save) {\n const path = saveCompact(compact);\n console.log(chalk.green(` ✔ Saved to ${path}`));\n console.log();\n }\n}\n","import { writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { getAgentSessionReport, type SessionReport } from './session.js';\nimport type { AgentType } from './provider.js';\n\nconst COMPACT_DIR = join(homedir(), '.copilot-agent', 'compacts');\n\nfunction ensureDir(): void {\n if (!existsSync(COMPACT_DIR)) mkdirSync(COMPACT_DIR, { recursive: true });\n}\n\nexport interface CompactSummary {\n sessionId: string;\n agent: AgentType;\n project: string;\n summary: string;\n done: string[];\n remaining: string[];\n filesChanged: string[];\n commits: string[];\n errors: string[];\n stats: {\n turns: number;\n tokens: number;\n premium: number;\n duration: string;\n };\n markdown: string;\n}\n\nexport function compactSession(sessionId: string, agent?: AgentType): CompactSummary | null {\n const report = getAgentSessionReport(sessionId, agent);\n if (!report) return null;\n\n const project = report.cwd?.split('/').pop() || 'unknown';\n\n // Determine done items from task completions and commits\n const done: string[] = [];\n for (const task of report.taskCompletions) {\n done.push(task.split('\\n')[0].slice(0, 100));\n }\n for (const file of report.filesCreated) {\n done.push(`Created ${file}`);\n }\n for (const file of report.filesEdited) {\n done.push(`Edited ${file}`);\n }\n\n // Determine remaining work from errors and incomplete status\n const remaining: string[] = [];\n if (!report.complete) {\n remaining.push('Session was interrupted before completion');\n }\n for (const err of report.errors) {\n remaining.push(`Fix: ${err.split('\\n')[0].slice(0, 100)}`);\n }\n\n const filesChanged = [\n ...report.filesCreated.map(f => `+ ${f}`),\n ...report.filesEdited.map(f => `~ ${f}`),\n ];\n\n const commits = report.gitCommits.map(c => c.split('\\n')[0].slice(0, 100));\n\n const durationMs = report.durationMs;\n const durationStr = durationMs < 60_000\n ? `${Math.round(durationMs / 1000)}s`\n : durationMs < 3_600_000\n ? `${Math.round(durationMs / 60_000)}m`\n : `${Math.floor(durationMs / 3_600_000)}h ${Math.round((durationMs % 3_600_000) / 60_000)}m`;\n\n // Build markdown\n const lines: string[] = [];\n lines.push(`## Session Context (auto-generated)`);\n lines.push(`**Project:** ${project} | **Agent:** ${report.agent} | **Duration:** ${durationStr}`);\n lines.push(`**Turns:** ${report.assistantTurns} | **Tokens:** ${report.outputTokens.toLocaleString()} | **Premium:** ${report.premiumRequests}`);\n lines.push('');\n\n if (report.summary) {\n lines.push(`**Task:** ${report.summary}`);\n lines.push('');\n }\n\n if (done.length > 0) {\n lines.push('### ✅ Completed');\n for (const d of done) lines.push(`- ${d}`);\n lines.push('');\n }\n\n if (remaining.length > 0) {\n lines.push('### ⏳ Remaining');\n for (const r of remaining) lines.push(`- ${r}`);\n lines.push('');\n }\n\n if (commits.length > 0) {\n lines.push('### Git Commits');\n for (const c of commits) lines.push(`- ${c}`);\n lines.push('');\n }\n\n if (filesChanged.length > 0) {\n lines.push('### Files Changed');\n for (const f of filesChanged) lines.push(`- ${f}`);\n lines.push('');\n }\n\n if (report.errors.length > 0) {\n lines.push('### ⚠️ Errors Encountered');\n for (const e of report.errors.slice(0, 5)) lines.push(`- ${e.split('\\n')[0]}`);\n lines.push('');\n }\n\n // Key tools used\n const topTools = Object.entries(report.toolUsage).sort((a, b) => b[1] - a[1]).slice(0, 5);\n if (topTools.length > 0) {\n lines.push('### Tools Used');\n for (const [tool, count] of topTools) lines.push(`- ${tool}: ${count}x`);\n lines.push('');\n }\n\n const markdown = lines.join('\\n');\n\n return {\n sessionId,\n agent: report.agent,\n project,\n summary: report.summary || '',\n done,\n remaining,\n filesChanged,\n commits,\n errors: report.errors.map(e => e.split('\\n')[0]),\n stats: {\n turns: report.assistantTurns,\n tokens: report.outputTokens,\n premium: report.premiumRequests,\n duration: durationStr,\n },\n markdown,\n };\n}\n\nexport function saveCompact(compact: CompactSummary): string {\n ensureDir();\n const filename = `${compact.sessionId.slice(0, 12)}.md`;\n const filepath = join(COMPACT_DIR, filename);\n writeFileSync(filepath, compact.markdown, 'utf-8');\n return filepath;\n}\n\nexport function buildResumePrompt(compact: CompactSummary): string {\n const parts: string[] = [];\n parts.push('Continue the previous task. Here is the context from the interrupted session:');\n parts.push('');\n if (compact.summary) parts.push(`Task: ${compact.summary}`);\n if (compact.done.length > 0) {\n parts.push('Already completed:');\n for (const d of compact.done.slice(0, 10)) parts.push(`- ${d}`);\n }\n if (compact.remaining.length > 0) {\n parts.push('Still needs to be done:');\n for (const r of compact.remaining) parts.push(`- ${r}`);\n }\n if (compact.errors.length > 0) {\n parts.push('Errors to address:');\n for (const e of compact.errors.slice(0, 3)) parts.push(`- ${e}`);\n }\n parts.push('');\n parts.push('Please continue where the previous session left off.');\n return parts.join('\\n');\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { loadHooksConfig, runHooks, getHooksSummary, type HookEvent } from '../lib/hooks.js';\n\nexport function registerHooksCommand(program: Command): void {\n const cmd = program\n .command('hooks')\n .description('Manage event-driven automation hooks');\n\n cmd\n .command('list')\n .description('Show all configured hooks')\n .action(() => {\n const config = loadHooksConfig();\n const summary = getHooksSummary(config);\n\n console.log(chalk.bold.cyan('\\n ⚡ Hooks Configuration\\n'));\n\n if (summary.length === 0) {\n console.log(chalk.dim(' No hooks configured'));\n console.log(chalk.dim('\\n Create ~/.copilot-agent/hooks.yaml or .copilot-agent/hooks.yaml:'));\n console.log(chalk.dim(' on_task_complete:'));\n console.log(chalk.dim(' - command: \"npm test\"'));\n console.log(chalk.dim(' name: \"Run tests\"'));\n console.log();\n return;\n }\n\n const events: HookEvent[] = ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'];\n for (const event of events) {\n const hooks = config[event];\n if (!hooks || hooks.length === 0) continue;\n\n console.log(chalk.bold(` ${event}`) + chalk.dim(` (${hooks.length})`));\n for (const h of hooks) {\n const name = h.name ? chalk.white(h.name) : chalk.dim('unnamed');\n const timeout = h.timeout ? chalk.dim(` (${h.timeout}s)`) : '';\n console.log(` ${chalk.green('●')} ${name}: ${chalk.cyan(h.command)}${timeout}`);\n }\n console.log();\n }\n });\n\n cmd\n .command('test <event>')\n .description('Test-run hooks for a specific event')\n .action(async (event: string) => {\n const validEvents: HookEvent[] = ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'];\n if (!validEvents.includes(event as HookEvent)) {\n console.log(chalk.red(` ✗ Invalid event: ${event}`));\n console.log(chalk.dim(` Valid events: ${validEvents.join(', ')}`));\n return;\n }\n\n console.log(chalk.cyan(`\\n Running hooks for ${chalk.bold(event)}...\\n`));\n\n const results = await runHooks(event as HookEvent);\n\n if (results.length === 0) {\n console.log(chalk.dim(` No hooks configured for ${event}`));\n return;\n }\n\n for (const r of results) {\n const icon = r.success ? chalk.green('✔') : chalk.red('✗');\n const name = r.hook.name || r.hook.command;\n const time = chalk.dim(`${r.durationMs}ms`);\n console.log(` ${icon} ${name} ${time}`);\n if (r.output) console.log(chalk.dim(` ${r.output.split('\\n')[0]}`));\n if (r.error) console.log(chalk.red(` ${r.error.split('\\n')[0]}`));\n }\n console.log();\n });\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml } from 'yaml';\nimport { findUpSync } from 'find-up';\nimport { execaCommand } from 'execa';\n\nexport type HookEvent = 'on_session_start' | 'on_task_complete' | 'on_session_end' | 'on_error' | 'on_resume';\n\nexport interface HookDef {\n command: string;\n name?: string;\n timeout?: number; // seconds, default 30\n}\n\nexport interface HooksConfig {\n on_session_start?: HookDef[];\n on_task_complete?: HookDef[];\n on_session_end?: HookDef[];\n on_error?: HookDef[];\n on_resume?: HookDef[];\n}\n\nexport interface HookResult {\n hook: HookDef;\n event: HookEvent;\n success: boolean;\n output?: string;\n error?: string;\n durationMs: number;\n}\n\nconst GLOBAL_HOOKS = join(homedir(), '.copilot-agent', 'hooks.yaml');\nconst PROJECT_HOOKS = '.copilot-agent/hooks.yaml';\n\nexport function loadHooksConfig(cwd?: string): HooksConfig {\n const configs: HooksConfig[] = [];\n\n // Global hooks\n if (existsSync(GLOBAL_HOOKS)) {\n try {\n const parsed = parseYaml(readFileSync(GLOBAL_HOOKS, 'utf-8'));\n if (parsed) configs.push(parsed);\n } catch { /* ignore */ }\n }\n\n // Project hooks (find-up from cwd)\n const projectPath = findUpSync(PROJECT_HOOKS, { cwd: cwd || process.cwd(), type: 'file' });\n if (projectPath) {\n try {\n const parsed = parseYaml(readFileSync(projectPath, 'utf-8'));\n if (parsed) configs.push(parsed);\n } catch { /* ignore */ }\n }\n\n // Merge: global first, then project\n const merged: HooksConfig = {};\n for (const cfg of configs) {\n for (const event of ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'] as HookEvent[]) {\n const hooks = cfg[event];\n if (hooks && Array.isArray(hooks)) {\n if (!merged[event]) merged[event] = [];\n merged[event]!.push(...hooks);\n }\n }\n }\n return merged;\n}\n\nexport async function runHooks(event: HookEvent, cwd?: string, env?: Record<string, string>): Promise<HookResult[]> {\n const config = loadHooksConfig(cwd);\n const hooks = config[event];\n if (!hooks || hooks.length === 0) return [];\n\n const results: HookResult[] = [];\n for (const hook of hooks) {\n const start = Date.now();\n try {\n const result = await execaCommand(hook.command, {\n cwd: cwd || process.cwd(),\n timeout: (hook.timeout || 30) * 1000,\n env: { ...process.env, ...env },\n reject: false,\n });\n results.push({\n hook,\n event,\n success: result.exitCode === 0,\n output: result.stdout?.slice(0, 500),\n error: result.exitCode !== 0 ? result.stderr?.slice(0, 500) : undefined,\n durationMs: Date.now() - start,\n });\n } catch (err: unknown) {\n results.push({\n hook,\n event,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n });\n }\n }\n return results;\n}\n\nexport function getHooksSummary(config: HooksConfig): { event: string; count: number }[] {\n const events: HookEvent[] = ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'];\n return events\n .map(e => ({ event: e, count: config[e]?.length || 0 }))\n .filter(e => e.count > 0);\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execaCommandSync } from 'execa';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport { gitCurrentBranch, isGitRepo } from '../lib/git.js';\nimport type { AgentType } from '../lib/provider.js';\n\nexport function registerPrCommand(program: Command): void {\n program\n .command('pr [session-id]')\n .description('Create a GitHub Pull Request from agent session changes')\n .option('--draft', 'Create as draft PR (default: true)', true)\n .option('--no-draft', 'Create as ready PR')\n .option('-b, --base <branch>', 'Base branch (default: main)')\n .option('-a, --agent <type>', 'Agent type: copilot | claude')\n .option('--dry-run', 'Show PR details without creating')\n .action((sessionId: string | undefined, opts) => {\n try {\n createPr(sessionId, opts);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(` ✗ ${msg}`));\n }\n });\n}\n\nfunction createPr(\n sessionId: string | undefined,\n opts: { draft?: boolean; base?: string; agent?: string; dryRun?: boolean },\n): void {\n const sessions = listAllSessions(50);\n let targetSession;\n\n if (sessionId) {\n targetSession = sessions.find(s => s.id.startsWith(sessionId));\n } else {\n targetSession = sessions[0];\n if (targetSession) {\n console.log(chalk.dim(` Using latest session: ${targetSession.id.slice(0, 12)}…\\n`));\n }\n }\n\n if (!targetSession) {\n console.log(chalk.red(' ✗ No session found'));\n return;\n }\n\n const agentType = (opts.agent || targetSession.agent) as AgentType | undefined;\n const report = getAgentSessionReport(targetSession.id, agentType);\n if (!report) {\n console.log(chalk.red(' ✗ Could not load session report'));\n return;\n }\n\n const cwd = report.cwd;\n if (!cwd || !isGitRepo(cwd)) {\n console.log(chalk.red(' ✗ Not a git repository'));\n return;\n }\n\n const currentBranch = gitCurrentBranch(cwd);\n const baseBranch = opts.base || 'main';\n\n if (!currentBranch || currentBranch === baseBranch) {\n console.log(chalk.yellow(` ⚠ Currently on ${baseBranch} — switch to a feature branch first`));\n return;\n }\n\n // Build PR title from session\n const agentName = report.agent === 'claude' ? 'Claude' : 'Copilot';\n const title = report.summary\n ? report.summary.slice(0, 72)\n : `[${agentName}] ${currentBranch.replace('agent/', '').replace(/-/g, ' ').slice(0, 60)}`;\n\n // Build PR body\n const bodyParts: string[] = [];\n bodyParts.push(`## 🤖 Auto-generated by copilot-agent (${report.agent})\\n`);\n\n if (report.summary) {\n bodyParts.push(`**Task:** ${report.summary}\\n`);\n }\n\n bodyParts.push('### Stats');\n bodyParts.push(`- **Duration:** ${formatDur(report.durationMs)}`);\n bodyParts.push(`- **Turns:** ${report.assistantTurns}`);\n bodyParts.push(`- **Tokens:** ${report.outputTokens.toLocaleString()}`);\n bodyParts.push(`- **Premium requests:** ${report.premiumRequests}`);\n bodyParts.push('');\n\n if (report.gitCommits.length > 0) {\n bodyParts.push('### Commits');\n for (const c of report.gitCommits.slice(0, 20)) {\n bodyParts.push(`- ${c.split('\\n')[0]}`);\n }\n bodyParts.push('');\n }\n\n if (report.filesCreated.length > 0 || report.filesEdited.length > 0) {\n bodyParts.push('### Files Changed');\n for (const f of report.filesCreated.slice(0, 15)) bodyParts.push(`- ➕ ${f}`);\n for (const f of report.filesEdited.slice(0, 15)) bodyParts.push(`- ✏️ ${f}`);\n bodyParts.push('');\n }\n\n if (report.taskCompletions.length > 0) {\n bodyParts.push('### Tasks Completed');\n for (const t of report.taskCompletions.slice(0, 10)) {\n bodyParts.push(`- ✅ ${t.split('\\n')[0]}`);\n }\n bodyParts.push('');\n }\n\n bodyParts.push(`---\\n*Session: \\`${report.id.slice(0, 12)}…\\`*`);\n\n const body = bodyParts.join('\\n');\n\n // Display preview\n console.log(chalk.bold.cyan(' 📝 Pull Request Preview\\n'));\n console.log(` ${chalk.bold('Title:')} ${title}`);\n console.log(` ${chalk.bold('Branch:')} ${chalk.cyan(currentBranch)} → ${chalk.green(baseBranch)}`);\n console.log(` ${chalk.bold('Draft:')} ${opts.draft ? 'yes' : 'no'}`);\n console.log(` ${chalk.bold('Agent:')} ${report.agent}`);\n console.log(` ${chalk.bold('Files:')} ${chalk.green(`+${report.filesCreated.length}`)} created, ${chalk.yellow(`~${report.filesEdited.length}`)} edited`);\n console.log(` ${chalk.bold('Commits:')} ${report.gitCommits.length}`);\n console.log();\n\n if (opts.dryRun) {\n console.log(chalk.dim(' (dry run — PR not created)'));\n console.log(chalk.dim('\\n Body preview:'));\n console.log(chalk.dim(body.split('\\n').map(l => ` ${l}`).join('\\n')));\n return;\n }\n\n // Push branch\n try {\n console.log(chalk.dim(' Pushing branch...'));\n execaCommandSync(`git push -u origin ${currentBranch}`, { cwd });\n } catch {\n // May already be pushed\n }\n\n // Create PR with gh CLI\n try {\n const ghArgs = [\n 'gh', 'pr', 'create',\n '--title', title,\n '--body', body,\n '--base', baseBranch,\n '--label', 'automated',\n ];\n if (opts.draft) ghArgs.push('--draft');\n\n const result = execaCommandSync(\n ghArgs.map(a => (a.includes(' ') ? `\"${a}\"` : a)).join(' '),\n { cwd },\n );\n const prUrl = result.stdout.trim();\n console.log(chalk.green(` ✔ PR created: ${prUrl}`));\n } catch (err: unknown) {\n const msg =\n err instanceof Error ? ((err as any).stderr as string) || err.message : String(err);\n console.log(chalk.red(` ✗ Failed to create PR: ${msg}`));\n console.log(chalk.dim(' Make sure gh CLI is installed and authenticated'));\n }\n}\n\nfunction formatDur(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\n\ninterface Template {\n name: string;\n prompt: string;\n priority?: number;\n}\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst TEMPLATES_FILE = join(CONFIG_DIR, 'templates.yaml');\n\nfunction ensureDir(): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n}\n\nfunction loadTemplates(): Template[] {\n if (!existsSync(TEMPLATES_FILE)) return [];\n try {\n const data = parseYaml(readFileSync(TEMPLATES_FILE, 'utf-8'));\n return Array.isArray(data) ? data : [];\n } catch {\n return [];\n }\n}\n\nfunction saveTemplates(templates: Template[]): void {\n ensureDir();\n writeFileSync(TEMPLATES_FILE, stringifyYaml(templates), 'utf-8');\n}\n\nexport function registerTemplateCommand(program: Command): void {\n const cmd = program\n .command('template')\n .description('Manage custom task templates');\n\n cmd\n .command('list')\n .description('Show all custom templates')\n .action(() => {\n const templates = loadTemplates();\n console.log(chalk.bold.cyan('\\n 📋 Task Templates') + chalk.dim(` (${templates.length})\\n`));\n\n if (templates.length === 0) {\n console.log(chalk.dim(' No custom templates'));\n console.log(chalk.dim('\\n Add one: copilot-agent template add <name> --prompt \"...\"'));\n console.log();\n return;\n }\n\n for (const t of templates) {\n const prio = t.priority !== undefined ? chalk.dim(` [priority: ${t.priority}]`) : '';\n console.log(` ${chalk.green('●')} ${chalk.bold(t.name)}${prio}`);\n console.log(chalk.dim(` ${t.prompt.slice(0, 80)}${t.prompt.length > 80 ? '…' : ''}`));\n }\n console.log();\n });\n\n cmd\n .command('add <name>')\n .description('Add a custom template')\n .requiredOption('-p, --prompt <text>', 'Task prompt')\n .option('--priority <n>', 'Priority (lower = higher priority)')\n .action((name: string, opts) => {\n const templates = loadTemplates();\n const existing = templates.findIndex(t => t.name === name);\n const entry: Template = {\n name,\n prompt: opts.prompt,\n priority: opts.priority ? parseInt(opts.priority, 10) : undefined,\n };\n\n if (existing >= 0) {\n templates[existing] = entry;\n console.log(chalk.yellow(` ✔ Updated template: ${chalk.bold(name)}`));\n } else {\n templates.push(entry);\n console.log(chalk.green(` ✔ Added template: ${chalk.bold(name)}`));\n }\n saveTemplates(templates);\n });\n\n cmd\n .command('remove <name>')\n .description('Remove a custom template')\n .action((name: string) => {\n const templates = loadTemplates();\n const idx = templates.findIndex(t => t.name === name);\n if (idx < 0) {\n console.log(chalk.red(` ✗ Template not found: ${name}`));\n return;\n }\n templates.splice(idx, 1);\n saveTemplates(templates);\n console.log(chalk.green(` ✔ Removed template: ${chalk.bold(name)}`));\n });\n\n cmd\n .command('export')\n .description('Export templates to stdout (YAML)')\n .action(() => {\n const templates = loadTemplates();\n if (templates.length === 0) {\n console.log(chalk.dim(' No templates to export'));\n return;\n }\n console.log(stringifyYaml(templates));\n });\n\n cmd\n .command('import <file>')\n .description('Import templates from a YAML file')\n .action((file: string) => {\n try {\n const data = parseYaml(readFileSync(file, 'utf-8'));\n if (!Array.isArray(data)) {\n console.log(chalk.red(' ✗ Invalid format: expected YAML array'));\n return;\n }\n const current = loadTemplates();\n let added = 0;\n for (const entry of data) {\n if (!entry.name || !entry.prompt) continue;\n const idx = current.findIndex(t => t.name === entry.name);\n if (idx >= 0) {\n current[idx] = entry;\n } else {\n current.push(entry);\n added++;\n }\n }\n saveTemplates(current);\n console.log(chalk.green(` ✔ Imported ${added} new templates (${data.length} total processed)`));\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(chalk.red(` ✗ ${msg}`));\n }\n });\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { writeFileSync } from 'fs';\nimport { listAllSessions, getAgentSessionReport, type Session, type SessionReport } from '../lib/session.js';\n\nexport function registerLogCommand(program: Command): void {\n const cmd = program\n .command('log')\n .description('Search, browse, and export session history');\n\n cmd\n .command('search <query>')\n .description('Search across all sessions')\n .option('-a, --agent <type>', 'Filter: copilot | claude')\n .option('-l, --limit <n>', 'Max results', '20')\n .option('--after <date>', 'After date (YYYY-MM-DD)')\n .option('--before <date>', 'Before date (YYYY-MM-DD)')\n .action((query: string, opts) => {\n const limit = parseInt(opts.limit, 10);\n const sessions = listAllSessions(200);\n const q = query.toLowerCase();\n\n let filtered = sessions;\n if (opts.agent) filtered = filtered.filter(s => s.agent === opts.agent);\n if (opts.after) {\n const after = new Date(opts.after).getTime();\n filtered = filtered.filter(s => s.mtime >= after);\n }\n if (opts.before) {\n const before = new Date(opts.before).getTime();\n filtered = filtered.filter(s => s.mtime <= before);\n }\n\n // Search in summary, cwd, lastEvent and report details\n const matches = filtered.filter(s => {\n if (s.summary?.toLowerCase().includes(q)) return true;\n if (s.cwd?.toLowerCase().includes(q)) return true;\n if (s.lastEvent?.toLowerCase().includes(q)) return true;\n const report = getAgentSessionReport(s.id, s.agent);\n if (!report) return false;\n if (report.gitCommits.some(c => c.toLowerCase().includes(q))) return true;\n if (report.filesCreated.some(f => f.toLowerCase().includes(q))) return true;\n if (report.filesEdited.some(f => f.toLowerCase().includes(q))) return true;\n if (report.taskCompletions.some(t => t.toLowerCase().includes(q))) return true;\n return false;\n }).slice(0, limit);\n\n console.log(chalk.bold.cyan(`\\n 🔍 Search: \"${query}\"`) + chalk.dim(` (${matches.length} results)\\n`));\n\n if (matches.length === 0) {\n console.log(chalk.dim(' No matches found'));\n return;\n }\n\n for (const s of matches) {\n const agentTag = s.agent === 'claude' ? chalk.yellow('claude ') : chalk.cyan('copilot');\n const icon = s.complete ? chalk.green('✔') : chalk.yellow('⏳');\n const date = new Date(s.mtime).toLocaleDateString('en-CA');\n const time = new Date(s.mtime).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' });\n const project = s.cwd?.split('/').pop() || '—';\n const summary = (s.summary || '—').slice(0, 50);\n console.log(` ${icon} ${agentTag} ${chalk.dim(date + ' ' + time)} ${chalk.bold(project.padEnd(16))} ${summary}`);\n console.log(chalk.dim(` ${s.id}`));\n }\n console.log();\n });\n\n cmd\n .command('timeline [session-id]')\n .description('Show chronological timeline of a session')\n .option('-a, --agent <type>', 'Agent type')\n .action((sessionId: string | undefined, opts) => {\n if (!sessionId) {\n const sessions = listAllSessions(1);\n if (sessions.length === 0) { console.log(chalk.dim(' No sessions')); return; }\n sessionId = sessions[0].id;\n opts.agent = opts.agent || sessions[0].agent;\n console.log(chalk.dim(` Using latest: ${sessionId.slice(0, 12)}…\\n`));\n }\n\n const report = getAgentSessionReport(sessionId, opts.agent as any);\n if (!report) { console.log(chalk.red(` ✗ Session not found`)); return; }\n\n const project = report.cwd?.split('/').pop() || 'unknown';\n const agentTag = report.agent === 'claude' ? chalk.yellow('[claude]') : chalk.cyan('[copilot]');\n console.log(chalk.bold.cyan(` 📅 Timeline — ${project}`) + ` ${agentTag}\\n`);\n\n const entries: string[] = [];\n\n if (report.startTime) entries.push(`${chalk.dim(fmtTime(report.startTime))} ${chalk.green('▶')} Session started`);\n\n for (const f of report.filesCreated) entries.push(`${chalk.dim(' ')} ${chalk.green('+')} Created ${f}`);\n for (const f of report.filesEdited) entries.push(`${chalk.dim(' ')} ${chalk.yellow('~')} Edited ${f}`);\n for (const c of report.gitCommits) entries.push(`${chalk.dim(' ')} ${chalk.cyan('●')} Commit: ${c.split('\\n')[0].slice(0, 60)}`);\n for (const t of report.taskCompletions) entries.push(`${chalk.dim(' ')} ${chalk.green('✔')} ${t.split('\\n')[0].slice(0, 60)}`);\n for (const e of report.errors.slice(0, 5)) entries.push(`${chalk.dim(' ')} ${chalk.red('✗')} ${e.split('\\n')[0].slice(0, 60)}`);\n\n const statusIcon = report.complete ? chalk.green('■') : chalk.yellow('⏸');\n if (report.endTime) entries.push(`${chalk.dim(fmtTime(report.endTime))} ${statusIcon} Session ${report.complete ? 'completed' : 'stopped'}`);\n\n for (const e of entries) console.log(` ${e}`);\n\n console.log(chalk.dim(`\\n Duration: ${fmtDur(report.durationMs)} | Turns: ${report.assistantTurns} | Premium: ⬡${report.premiumRequests}\\n`));\n });\n\n cmd\n .command('export')\n .description('Export session history')\n .option('-f, --format <fmt>', 'Format: json | csv', 'json')\n .option('-l, --limit <n>', 'Max sessions', '50')\n .option('-o, --output <file>', 'Output file')\n .action((opts) => {\n const sessions = listAllSessions(parseInt(opts.limit, 10));\n const data = sessions.map(s => {\n const r = getAgentSessionReport(s.id, s.agent);\n return {\n id: s.id,\n agent: s.agent,\n project: s.cwd?.split('/').pop() || '',\n complete: s.complete,\n premium: s.premiumRequests,\n tokens: r?.outputTokens || 0,\n turns: r?.assistantTurns || 0,\n commits: r?.gitCommits.length || 0,\n filesCreated: r?.filesCreated.length || 0,\n filesEdited: r?.filesEdited.length || 0,\n durationMs: r?.durationMs || 0,\n summary: s.summary || '',\n date: new Date(s.mtime).toISOString(),\n };\n });\n\n let output: string;\n if (opts.format === 'csv') {\n const headers = Object.keys(data[0] || {}).join(',');\n const rows = data.map(d => Object.values(d).map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','));\n output = [headers, ...rows].join('\\n');\n } else {\n output = JSON.stringify(data, null, 2);\n }\n\n if (opts.output) {\n writeFileSync(opts.output, output, 'utf-8');\n console.log(chalk.green(` ✔ Exported ${data.length} sessions to ${opts.output}`));\n } else {\n console.log(output);\n }\n });\n}\n\nfunction fmtTime(iso: string): string {\n try {\n return new Date(iso).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' });\n } catch { return ' '; }\n}\n\nfunction fmtDur(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n return `${Math.floor(ms / 3_600_000)}h ${Math.round((ms % 3_600_000) / 60_000)}m`;\n}\n","import type { Command } from 'commander';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, resolve, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport chalk from 'chalk';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { detectProjectType, detectProjectName } from '../lib/detect.js';\nimport { getTasksForProject } from '../lib/tasks.js';\nimport { runAgentTask, findAgentProcesses } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { log, ok, warn, fail, notify, setLogFile } from '../lib/logger.js';\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst PROJECTS_FILE = join(CONFIG_DIR, 'multi-projects.txt');\nconst STATUS_FILE = join(CONFIG_DIR, 'multi-status.yaml');\nconst LOG_DIR = join(CONFIG_DIR, 'multi-logs');\n\nconst MAX_CONCURRENCY = 3;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MultiOptions {\n agent: AgentType;\n parallel: boolean;\n cooldown: number;\n steps: number;\n maxPremium: number;\n dryRun: boolean;\n}\n\ninterface ProjectStatus {\n project: string;\n lastRun: string;\n status: 'success' | 'failed' | 'running';\n agent: AgentType;\n tasks: number;\n duration: string;\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerMultiCommand(program: Command): void {\n program\n .command('multi <action> [args...]')\n .description('Multi-project orchestration — add/remove/list/run/status/research')\n .option('-a, --agent <type>', 'Agent to use (copilot or claude)', 'copilot')\n .option('--parallel', 'Run projects in parallel (max 3 concurrent)')\n .option('--cooldown <n>', 'Cooldown between projects in seconds', '30')\n .option('-s, --steps <n>', 'Max steps per task', '10')\n .option('--max-premium <n>', 'Premium budget per project', '50')\n .option('--dry-run', 'Preview without executing')\n .action(async (action: string, args: string[], opts) => {\n try {\n await multiCommand(action, args, {\n agent: resolveAgent(opts.agent),\n parallel: opts.parallel ?? false,\n cooldown: parseInt(opts.cooldown, 10),\n steps: parseInt(opts.steps, 10),\n maxPremium: parseInt(opts.maxPremium, 10),\n dryRun: opts.dryRun ?? false,\n });\n } catch (err) {\n fail(`Multi error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Main dispatcher\n// ---------------------------------------------------------------------------\n\nexport async function multiCommand(\n action: string,\n args: string[],\n opts: MultiOptions,\n): Promise<void> {\n ensureFiles();\n\n switch (action) {\n case 'add':\n return addProject(args[0]);\n case 'remove':\n return removeProject(args[0]);\n case 'list':\n return listProjects();\n case 'status':\n return showStatus();\n case 'run':\n case 'health':\n return runAll('health', opts);\n case 'research':\n return runAll('research', opts);\n default:\n fail(`Unknown action: ${action}. Use: add, remove, list, run, status, research`);\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// File helpers\n// ---------------------------------------------------------------------------\n\nfunction ensureFiles(): void {\n mkdirSync(LOG_DIR, { recursive: true });\n mkdirSync(CONFIG_DIR, { recursive: true });\n if (!existsSync(PROJECTS_FILE)) writeFileSync(PROJECTS_FILE, '');\n}\n\nfunction readProjects(): string[] {\n return readFileSync(PROJECTS_FILE, 'utf-8')\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n}\n\nfunction writeProjects(projects: string[]): void {\n writeFileSync(PROJECTS_FILE, projects.join('\\n') + '\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Status persistence\n// ---------------------------------------------------------------------------\n\nfunction readStatusFile(): ProjectStatus[] {\n if (!existsSync(STATUS_FILE)) return [];\n try {\n const raw = readFileSync(STATUS_FILE, 'utf-8');\n const parsed: unknown = parseYaml(raw);\n return Array.isArray(parsed) ? (parsed as ProjectStatus[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction writeStatusFile(statuses: ProjectStatus[]): void {\n writeFileSync(STATUS_FILE, stringifyYaml(statuses));\n}\n\nfunction upsertStatus(entry: ProjectStatus): void {\n const statuses = readStatusFile();\n const idx = statuses.findIndex((s) => s.project === entry.project);\n if (idx >= 0) {\n statuses[idx] = entry;\n } else {\n statuses.push(entry);\n }\n writeStatusFile(statuses);\n}\n\nfunction formatDuration(ms: number): string {\n const totalSec = Math.round(ms / 1000);\n const min = Math.floor(totalSec / 60);\n const sec = totalSec % 60;\n return min > 0 ? `${min}m ${sec}s` : `${sec}s`;\n}\n\n// ---------------------------------------------------------------------------\n// Actions: add / remove / list / status\n// ---------------------------------------------------------------------------\n\nasync function addProject(path: string | undefined): Promise<void> {\n if (!path) {\n fail('Usage: copilot-agent multi add <path>');\n process.exit(1);\n }\n\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n fail(`Not found: ${resolved}`);\n process.exit(1);\n }\n\n await withLock('projects-file', async () => {\n const projects = readProjects();\n if (projects.includes(resolved)) {\n warn(`Already registered: ${resolved}`);\n return;\n }\n projects.push(resolved);\n writeProjects(projects);\n ok(`Added: ${resolved}`);\n });\n}\n\nasync function removeProject(path: string | undefined): Promise<void> {\n if (!path) {\n fail('Usage: copilot-agent multi remove <path>');\n process.exit(1);\n }\n\n const resolved = resolve(path);\n\n await withLock('projects-file', async () => {\n const projects = readProjects();\n const filtered = projects.filter((p) => p !== resolved);\n if (filtered.length === projects.length) {\n warn(`Not registered: ${resolved}`);\n return;\n }\n writeProjects(filtered);\n ok(`Removed: ${resolved}`);\n });\n}\n\nfunction listProjects(): void {\n const projects = readProjects();\n if (projects.length === 0) {\n log('No projects registered. Add: copilot-agent multi add <path>');\n return;\n }\n\n const statuses = readStatusFile();\n\n console.log(chalk.bold('\\nRegistered projects:'));\n for (let i = 0; i < projects.length; i++) {\n const p = projects[i];\n const exists = existsSync(p);\n const icon = exists ? chalk.green('✅') : chalk.red('❌');\n const type = exists ? detectProjectType(p) : '?';\n const st = statuses.find((s) => s.project === p);\n const statusTag = st\n ? chalk.dim(` [${st.status} — ${st.agent} — ${st.duration}]`)\n : '';\n console.log(` ${i + 1}. ${icon} ${p} ${chalk.dim(`(${type})`)}${statusTag}`);\n }\n console.log();\n}\n\nfunction showStatus(): void {\n const statuses = readStatusFile();\n if (statuses.length === 0) {\n log('No run history. Execute: copilot-agent multi run');\n return;\n }\n\n console.log(chalk.bold('\\nMulti-project status:'));\n for (const s of statuses) {\n const icon =\n s.status === 'success' ? chalk.green('✅') :\n s.status === 'failed' ? chalk.red('❌') :\n chalk.yellow('🔄');\n console.log(\n ` ${icon} ${chalk.bold(basename(s.project))} — ${s.agent} — ${s.tasks} tasks — ${s.duration} — ${chalk.dim(s.lastRun)}`,\n );\n }\n console.log();\n}\n\n// ---------------------------------------------------------------------------\n// Parallel concurrency limiter\n// ---------------------------------------------------------------------------\n\nfunction createSemaphore(max: number) {\n let running = 0;\n const queue: Array<() => void> = [];\n\n async function acquire(): Promise<void> {\n if (running < max) {\n running++;\n return;\n }\n return new Promise<void>((resolve) => {\n queue.push(() => { running++; resolve(); });\n });\n }\n\n function release(): void {\n running--;\n const next = queue.shift();\n if (next) next();\n }\n\n return { acquire, release };\n}\n\n// ---------------------------------------------------------------------------\n// Core: run all projects\n// ---------------------------------------------------------------------------\n\nasync function runAll(mode: string, opts: MultiOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const ts = new Date().toISOString().replace(/[:.]/g, '').slice(0, 15);\n setLogFile(join(LOG_DIR, `multi-${mode}-${ts}.log`));\n\n const projects = readProjects();\n if (projects.length === 0) {\n fail('No projects registered. Add: copilot-agent multi add <path>');\n process.exit(1);\n }\n\n log(`🏭 Multi-project ${mode} — ${projects.length} projects — agent: ${opts.agent}${opts.parallel ? ' (parallel)' : ''}`);\n\n if (opts.dryRun) {\n for (const p of projects) {\n const type = existsSync(p) ? detectProjectType(p) : 'unknown';\n const tasks = getTasksForProject(type);\n console.log(`\\n${chalk.bold(basename(p))} (${type})`);\n for (const t of tasks.slice(0, 3)) {\n console.log(` ${chalk.dim('•')} ${t.title}`);\n }\n }\n log(chalk.dim('\\n(dry-run — not executing)'));\n return;\n }\n\n const results: Array<{ name: string; success: boolean; skipped: boolean }> = [];\n\n if (opts.parallel) {\n const sem = createSemaphore(MAX_CONCURRENCY);\n const promises = projects.map(async (project) => {\n await sem.acquire();\n try {\n const res = await runSingleProject(project, mode, opts);\n results.push(res);\n } finally {\n sem.release();\n }\n });\n await Promise.all(promises);\n } else {\n for (let i = 0; i < projects.length; i++) {\n const res = await runSingleProject(projects[i], mode, opts);\n results.push(res);\n\n if (i < projects.length - 1 && !res.skipped) {\n log(`Cooldown ${opts.cooldown}s…`);\n await new Promise((r) => setTimeout(r, opts.cooldown * 1000));\n }\n }\n }\n\n const success = results.filter((r) => r.success && !r.skipped).length;\n const failed = results.filter((r) => !r.success && !r.skipped).length;\n const skipped = results.filter((r) => r.skipped).length;\n const total = results.length;\n\n console.log(`\\n${'═'.repeat(50)}`);\n log(`📊 Summary: ${success}/${total} succeeded, ${failed} failed, ${skipped} skipped`);\n for (const r of results) {\n const icon = r.skipped ? '⏭ ' : r.success ? '✅' : '❌';\n console.log(` ${icon} ${r.name}`);\n }\n console.log();\n\n notify(`Multi-${mode}: ${success}/${total} succeeded`, 'copilot-agent');\n}\n\nasync function runSingleProject(\n project: string,\n mode: string,\n opts: MultiOptions,\n): Promise<{ name: string; success: boolean; skipped: boolean }> {\n const name = existsSync(project) ? detectProjectName(project) : basename(project);\n\n if (!existsSync(project)) {\n warn(`Skipping (not found): ${project}`);\n return { name, success: false, skipped: true };\n }\n\n const type = detectProjectType(project);\n log(`\\n${'═'.repeat(50)}`);\n log(`${chalk.bold(name)} (${type}) — agent: ${opts.agent}`);\n log(`${'═'.repeat(50)}`);\n\n const tasks =\n mode === 'research'\n ? [{ title: 'Research', prompt: 'Research latest best practices, dependency updates, and architecture improvements. Create a report.', priority: 1 }]\n : getTasksForProject(type).slice(0, 3);\n\n const startTime = Date.now();\n let projectSuccess = true;\n\n upsertStatus({\n project,\n lastRun: new Date().toISOString(),\n status: 'running',\n agent: opts.agent,\n tasks: tasks.length,\n duration: '—',\n });\n\n for (const task of tasks) {\n try {\n const result = await withLock('agent-multi', () =>\n runAgentTask(opts.agent, `Project: ${project}\\n\\n${task.prompt}`, opts.steps, project),\n );\n ok(`${task.title} — exit ${result.exitCode}, premium: ${result.premium}`);\n } catch (err) {\n fail(`${task.title} failed: ${err}`);\n projectSuccess = false;\n }\n }\n\n const duration = formatDuration(Date.now() - startTime);\n\n upsertStatus({\n project,\n lastRun: new Date().toISOString(),\n status: projectSuccess ? 'success' : 'failed',\n agent: opts.agent,\n tasks: tasks.length,\n duration,\n });\n\n return { name, success: projectSuccess, skipped: false };\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execSync } from 'node:child_process';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent } from '../lib/provider.js';\nimport type { AgentType } from '../lib/provider.js';\nimport { log, ok, fail, info } from '../lib/logger.js';\n\nconst MAX_DIFF_LENGTH = 15_000;\nconst MAX_BUFFER = 1024 * 1024;\n\nfunction getSessionDiff(sessionId: string): string {\n const report =\n getAgentSessionReport(sessionId, 'copilot') ??\n getAgentSessionReport(sessionId, 'claude');\n\n if (!report || report.gitCommits.length === 0) {\n return execSync('git --no-pager diff HEAD~3', {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n }\n\n return execSync('git --no-pager diff HEAD~' + report.gitCommits.length, {\n encoding: 'utf-8',\n cwd: report.cwd || process.cwd(),\n maxBuffer: MAX_BUFFER,\n });\n}\n\nfunction getWorkingDiff(): string {\n const staged = execSync('git --no-pager diff --cached', {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n const unstaged = execSync('git --no-pager diff', {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n return staged + unstaged;\n}\n\nfunction getPrDiff(prNumber: string): string {\n return execSync(`gh pr diff ${prNumber} --color=never`, {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n}\n\nconst focusInstructions: Record<string, string> = {\n all: 'Review for bugs, security issues, performance problems, and code quality.',\n security:\n 'Focus exclusively on security vulnerabilities, injection risks, auth issues, and data exposure.',\n performance:\n 'Focus exclusively on performance issues: N+1 queries, memory leaks, unnecessary allocations, slow algorithms.',\n bugs: 'Focus exclusively on logic bugs, edge cases, null/undefined issues, race conditions.',\n style: 'Focus exclusively on code style, naming, readability, and consistency.',\n};\n\nfunction buildReviewPrompt(diff: string, focus: string): string {\n const instruction = focusInstructions[focus] ?? focusInstructions.all;\n const truncatedDiff =\n diff.length > MAX_DIFF_LENGTH\n ? diff.slice(0, MAX_DIFF_LENGTH) + '\\n... (truncated)'\n : diff;\n\n return `You are a senior code reviewer. ${instruction}\n\nReview this diff and provide:\n1. **Critical Issues** (bugs, security) — must fix\n2. **Suggestions** — should fix for quality\n3. **Positive Notes** — good patterns observed\n4. **Summary** — one paragraph overall assessment\n\nBe concise. Only flag real issues, not style nitpicks (unless focus is style).\n\n\\`\\`\\`diff\n${truncatedDiff}\n\\`\\`\\``;\n}\n\nasync function runReview(\n label: string,\n diff: string,\n agent: AgentType,\n focus: string,\n steps: number,\n): Promise<void> {\n if (!diff.trim()) {\n fail('No changes found to review.');\n process.exit(1);\n }\n\n info(`Reviewing: ${chalk.cyan(label)}`);\n log(`Focus: ${chalk.yellow(focus)} | Agent: ${chalk.yellow(agent)} | Steps: ${steps}`);\n\n const prompt = buildReviewPrompt(diff, focus);\n const result = await runAgentTask(agent, prompt, steps, process.cwd());\n\n if (result.exitCode === 0) {\n ok('Review complete.');\n } else {\n fail(`Agent exited with code ${result.exitCode}`);\n }\n}\n\nexport function registerReviewCommand(program: Command): void {\n const cmd = program\n .command('review [session-id]')\n .description('AI-powered code review of agent changes or git diffs')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude', 'copilot')\n .option(\n '-f, --focus <area>',\n 'Focus area: all, security, performance, bugs, style',\n 'all',\n )\n .option('-s, --steps <n>', 'Max agent steps', '5')\n .action(async (sessionId: string | undefined, opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n const steps = parseInt(opts.steps, 10);\n\n let sid = sessionId;\n if (!sid) {\n const sessions = listAllSessions(1);\n if (sessions.length === 0) {\n fail('No sessions found. Use \"review diff\" to review working tree changes.');\n process.exit(1);\n }\n sid = sessions[0].id;\n log(`Using latest session: ${chalk.dim(sid)}`);\n }\n\n const diff = getSessionDiff(sid);\n await runReview(`session ${sid.slice(0, 8)}…`, diff, agent, opts.focus, steps);\n } catch (err) {\n fail(`Review error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n\n cmd\n .command('diff')\n .description('Review current working tree changes')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude', 'copilot')\n .option(\n '-f, --focus <area>',\n 'Focus area: all, security, performance, bugs, style',\n 'all',\n )\n .option('-s, --steps <n>', 'Max agent steps', '5')\n .action(async (opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n const steps = parseInt(opts.steps, 10);\n const diff = getWorkingDiff();\n await runReview('working tree changes', diff, agent, opts.focus, steps);\n } catch (err) {\n fail(`Review error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n\n cmd\n .command('pr <number>')\n .description('Review a GitHub Pull Request')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude', 'copilot')\n .option(\n '-f, --focus <area>',\n 'Focus area: all, security, performance, bugs, style',\n 'all',\n )\n .option('-s, --steps <n>', 'Max agent steps', '5')\n .action(async (number: string, opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n const steps = parseInt(opts.steps, 10);\n const diff = getPrDiff(number);\n await runReview(`PR #${number}`, diff, agent, opts.focus, steps);\n } catch (err) {\n fail(`Review error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { log, ok, warn, fail, info } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, RESET, YELLOW, GREEN } from '../lib/colors.js';\n\n// ─── Types ───\n\ninterface Schedule {\n name: string;\n cron: string;\n prompt: string;\n project: string;\n agent: AgentType;\n enabled: boolean;\n maxSteps?: number;\n}\n\n// ─── Paths ───\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst SCHEDULES_FILE = join(CONFIG_DIR, 'schedules.yaml');\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n}\n\n// ─── Schedule persistence ───\n\nfunction loadSchedules(): Schedule[] {\n if (!existsSync(SCHEDULES_FILE)) return [];\n try {\n const raw = parseYaml(readFileSync(SCHEDULES_FILE, 'utf-8'));\n return Array.isArray(raw) ? raw : [];\n } catch {\n return [];\n }\n}\n\nfunction saveSchedules(schedules: Schedule[]): void {\n ensureConfigDir();\n writeFileSync(SCHEDULES_FILE, stringifyYaml(schedules), 'utf-8');\n}\n\n// ─── Cron matching ───\n\nexport function matchesCron(cron: string, date: Date): boolean {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return false;\n\n const [minPart, hourPart, , , dowPart] = parts;\n const minute = date.getMinutes();\n const hour = date.getHours();\n const dow = date.getDay(); // 0=Sun\n\n if (!matchField(minPart, minute)) return false;\n if (!matchField(hourPart, hour)) return false;\n if (!matchField(dowPart, dow)) return false;\n\n return true;\n}\n\nfunction matchField(pattern: string, value: number): boolean {\n if (pattern === '*') return true;\n\n // */N — every N\n const stepMatch = pattern.match(/^\\*\\/(\\d+)$/);\n if (stepMatch) {\n const step = parseInt(stepMatch[1], 10);\n return step > 0 && value % step === 0;\n }\n\n // Exact number\n const num = parseInt(pattern, 10);\n if (!isNaN(num)) return value === num;\n\n return false;\n}\n\n// ─── Next run calculation ───\n\nfunction nextRunTime(cron: string): Date | null {\n const now = new Date();\n // Check each minute in the next 7 days\n const limit = 7 * 24 * 60;\n const candidate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes());\n for (let i = 1; i <= limit; i++) {\n candidate.setMinutes(candidate.getMinutes() + 1);\n if (matchesCron(cron, candidate)) return new Date(candidate);\n }\n return null;\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });\n}\n\nfunction formatDateTime(date: Date): string {\n const day = date.toLocaleDateString([], { weekday: 'short', month: 'short', day: 'numeric' });\n return `${day} ${formatTime(date)}`;\n}\n\nfunction timestamp(): string {\n return `${DIM}[${formatTime(new Date())}]${RESET}`;\n}\n\n// ─── Commands ───\n\nfunction listCommand(): void {\n const schedules = loadSchedules();\n if (schedules.length === 0) {\n info('No schedules configured.');\n info(`Add one with: ${CYAN}copilot-agent schedule add <name> --cron \"...\" --prompt \"...\"${RESET}`);\n return;\n }\n\n log(`\\n${BOLD}Schedules${RESET} ${DIM}(${SCHEDULES_FILE})${RESET}\\n`);\n\n for (const s of schedules) {\n const status = s.enabled ? `${GREEN}●${RESET}` : `${DIM}○${RESET}`;\n const next = s.enabled ? nextRunTime(s.cron) : null;\n const nextStr = next ? `${DIM}next: ${formatDateTime(next)}${RESET}` : '';\n log(` ${status} ${BOLD}${s.name}${RESET} ${DIM}${s.cron}${RESET} ${nextStr}`);\n log(` ${DIM}prompt:${RESET} ${s.prompt.length > 60 ? s.prompt.slice(0, 57) + '...' : s.prompt}`);\n log(` ${DIM}project:${RESET} ${s.project} ${DIM}agent:${RESET} ${s.agent} ${DIM}steps:${RESET} ${s.maxSteps ?? 30}`);\n log('');\n }\n}\n\ninterface AddOptions {\n cron: string;\n prompt: string;\n project: string;\n agent?: string;\n steps: string;\n disabled: boolean;\n}\n\nfunction addCommand(name: string, opts: AddOptions): void {\n const schedules = loadSchedules();\n\n if (schedules.some(s => s.name === name)) {\n fail(`Schedule \"${name}\" already exists. Remove it first or use a different name.`);\n process.exit(1);\n }\n\n // Validate cron by testing it\n if (!opts.cron || opts.cron.trim().split(/\\s+/).length !== 5) {\n fail('Invalid cron expression. Expected 5 fields: minute hour day month weekday');\n process.exit(1);\n }\n\n const schedule: Schedule = {\n name,\n cron: opts.cron,\n prompt: opts.prompt,\n project: opts.project || process.cwd(),\n agent: resolveAgent(opts.agent),\n enabled: !opts.disabled,\n maxSteps: parseInt(opts.steps, 10) || 30,\n };\n\n schedules.push(schedule);\n saveSchedules(schedules);\n\n ok(`Added schedule \"${name}\"`);\n const next = nextRunTime(schedule.cron);\n if (next) {\n info(`Next run: ${formatDateTime(next)}`);\n }\n}\n\nfunction removeCommand(name: string): void {\n const schedules = loadSchedules();\n const idx = schedules.findIndex(s => s.name === name);\n\n if (idx === -1) {\n fail(`Schedule \"${name}\" not found.`);\n process.exit(1);\n }\n\n schedules.splice(idx, 1);\n saveSchedules(schedules);\n ok(`Removed schedule \"${name}\"`);\n}\n\nfunction dryRunCommand(): void {\n const schedules = loadSchedules().filter(s => s.enabled);\n\n if (schedules.length === 0) {\n info('No enabled schedules.');\n return;\n }\n\n log(`\\n${BOLD}Dry run — what would run next${RESET}\\n`);\n\n for (const s of schedules) {\n const next = nextRunTime(s.cron);\n if (next) {\n log(` ${CYAN}${s.name}${RESET} → ${formatDateTime(next)}`);\n log(` ${DIM}${s.agent}${RESET} in ${s.project}`);\n log(` ${DIM}prompt:${RESET} ${s.prompt.length > 70 ? s.prompt.slice(0, 67) + '...' : s.prompt}`);\n log('');\n }\n }\n}\n\nasync function runDaemon(): Promise<void> {\n const schedules = loadSchedules();\n const enabled = schedules.filter(s => s.enabled);\n\n if (enabled.length === 0) {\n fail('No enabled schedules. Add one first.');\n process.exit(1);\n }\n\n for (const s of enabled) {\n assertAgent(s.agent);\n }\n\n log(`\\n${BOLD}${CYAN}Scheduler daemon started${RESET}`);\n info(`${enabled.length} schedule(s) active. Press Ctrl+C to stop.\\n`);\n\n const lastRun = new Map<string, number>();\n\n const showStatus = () => {\n const now = new Date();\n let soonestName = '';\n let soonestTime: Date | null = null;\n\n for (const s of enabled) {\n const next = nextRunTime(s.cron);\n if (next && (!soonestTime || next < soonestTime)) {\n soonestTime = next;\n soonestName = s.name;\n }\n }\n\n const nextStr = soonestTime\n ? `next: ${CYAN}${soonestName}${RESET} at ${formatTime(soonestTime)}`\n : 'no upcoming runs';\n log(`${timestamp()} ${DIM}Scheduler running — ${enabled.length} schedules, ${nextStr}${RESET}`);\n };\n\n showStatus();\n\n const check = async () => {\n const now = new Date();\n // Normalize to the start of the current minute\n const minuteKey = `${now.getFullYear()}-${now.getMonth()}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}`;\n\n for (const s of enabled) {\n if (!matchesCron(s.cron, now)) continue;\n\n const runKey = `${s.name}:${minuteKey}`;\n if (lastRun.has(runKey)) continue;\n lastRun.set(runKey, Date.now());\n\n // Prune old entries\n const cutoff = Date.now() - 2 * 60 * 1000;\n for (const [k, v] of lastRun) {\n if (v < cutoff) lastRun.delete(k);\n }\n\n log(`\\n${timestamp()} ${BOLD}${YELLOW}▶ Running: ${s.name}${RESET}`);\n log(` ${DIM}cron:${RESET} ${s.cron} ${DIM}agent:${RESET} ${s.agent} ${DIM}project:${RESET} ${s.project}`);\n log(` ${DIM}prompt:${RESET} ${s.prompt}`);\n\n try {\n const result = await runAgentTask(\n s.agent,\n s.prompt,\n s.maxSteps ?? 30,\n s.project,\n );\n if (result.exitCode === 0) {\n ok(`${timestamp()} ✓ ${s.name} completed (session: ${result.sessionId?.slice(0, 8) ?? 'n/a'})`);\n } else {\n warn(`${timestamp()} ${s.name} exited with code ${result.exitCode}`);\n }\n } catch (err) {\n fail(`${timestamp()} ${s.name} failed: ${err instanceof Error ? err.message : err}`);\n }\n\n showStatus();\n }\n };\n\n // Initial check\n await check();\n\n // Check every 60 seconds\n const interval = setInterval(() => {\n check().catch(err => {\n fail(`Scheduler error: ${err instanceof Error ? err.message : err}`);\n });\n }, 60_000);\n\n // Graceful shutdown\n const shutdown = () => {\n log(`\\n${timestamp()} ${DIM}Scheduler stopped.${RESET}`);\n clearInterval(interval);\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n // Keep alive\n await new Promise(() => {});\n}\n\n// ─── Registration ───\n\nexport function registerScheduleCommand(program: Command): void {\n const cmd = program\n .command('schedule')\n .description('Cron-like recurring task scheduler');\n\n cmd\n .command('list')\n .description('Show all configured schedules')\n .action(() => {\n listCommand();\n });\n\n cmd\n .command('add <name>')\n .description('Add a recurring schedule')\n .requiredOption('--cron <expression>', 'Cron expression (e.g. \"0 */6 * * *\")')\n .requiredOption('--prompt <text>', 'Agent prompt to execute')\n .option('--project <path>', 'Project directory', process.cwd())\n .option('-a, --agent <type>', 'Agent: copilot or claude')\n .option('-s, --steps <n>', 'Max autopilot steps', '30')\n .option('--disabled', 'Add as disabled')\n .action((name: string, opts: AddOptions) => {\n addCommand(name, opts);\n });\n\n cmd\n .command('remove <name>')\n .description('Remove a schedule')\n .action((name: string) => {\n removeCommand(name);\n });\n\n cmd\n .command('run')\n .description('Start the scheduler daemon (foreground)')\n .action(async () => {\n try {\n await runDaemon();\n } catch (err) {\n fail(`Scheduler error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n\n cmd\n .command('dry-run')\n .description('Show what would run next for each schedule')\n .action(() => {\n dryRunCommand();\n });\n}\n"],"mappings":"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","names":["execSync","resolve","execSync","resolve","resolve","program","agentLabel","execSync","program","sleep","existsSync","readFileSync","readdirSync","join","basename","resolve","execSync","mkdirSync","readFileSync","join","homedir","existsSync","join","resolve","execSync","resolve","existsSync","program","timestamp","join","homedir","program","join","homedir","timestamp","sleep","existsSync","mkdirSync","join","resolve","homedir","program","resolve","join","existsSync","homedir","mkdirSync","timestamp","resolve","program","resolve","bar","program","renderProcesses","renderDetail","spawn","program","spawn","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","existsSync","writeFileSync","program","chalk","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","program","chalk","program","chalk","chalk","join","homedir","join","homedir","program","chalk","bar","chalk","writeFileSync","existsSync","mkdirSync","join","homedir","join","homedir","ensureDir","existsSync","mkdirSync","writeFileSync","program","chalk","chalk","readFileSync","existsSync","join","homedir","parseYaml","findUpSync","program","chalk","chalk","execaCommandSync","program","chalk","execaCommandSync","chalk","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","parseYaml","stringifyYaml","CONFIG_DIR","ensureDir","program","chalk","writeFileSync","program","chalk","fmtTime","statusIcon","fmtDur","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","basename","homedir","chalk","parseYaml","stringifyYaml","CONFIG_DIR","join","homedir","program","mkdirSync","existsSync","writeFileSync","readFileSync","parseYaml","stringifyYaml","formatDuration","resolve","chalk","basename","chalk","execSync","execSync","chalk","program","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","parseYaml","stringifyYaml","CONFIG_DIR","join","homedir","ensureConfigDir","existsSync","mkdirSync","parseYaml","readFileSync","writeFileSync","stringifyYaml","formatTime","showStatus","program"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/session.ts","../src/lib/process.ts","../src/lib/logger.ts","../src/lib/colors.ts","../src/commands/status.ts","../src/lib/provider.ts","../src/commands/watch.ts","../src/lib/detect.ts","../src/lib/tasks.ts","../src/lib/lock.ts","../src/lib/git.ts","../src/commands/run.ts","../src/commands/overnight.ts","../src/commands/research.ts","../src/commands/report.ts","../src/lib/reactive.ts","../src/tui/widgets.ts","../src/commands/dashboard.ts","../src/commands/web.ts","../src/web/layout.ts","../src/web/views.ts","../src/commands/config.ts","../src/lib/config.ts","../src/commands/proxy.ts","../src/commands/diff.ts","../src/commands/quota.ts","../src/lib/quota.ts","../src/commands/compact.ts","../src/lib/compact.ts","../src/commands/hooks.ts","../src/lib/hooks.ts","../src/commands/pr.ts","../src/commands/template.ts","../src/commands/log.ts","../src/commands/multi.ts","../src/commands/review.ts","../src/commands/schedule.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { registerStatusCommand } from './commands/status.js';\nimport { registerWatchCommand } from './commands/watch.js';\nimport { registerRunCommand } from './commands/run.js';\nimport { registerOvernightCommand } from './commands/overnight.js';\nimport { registerResearchCommand } from './commands/research.js';\nimport { registerReportCommand } from './commands/report.js';\nimport { registerDashboardCommand } from './commands/dashboard.js';\nimport { registerWebCommand } from './commands/web.js';\nimport { registerConfigCommand } from './commands/config.js';\nimport { registerProxyCommand } from './commands/proxy.js';\nimport { registerDiffCommand } from './commands/diff.js';\nimport { registerQuotaCommand } from './commands/quota.js';\nimport { registerCompactCommand } from './commands/compact.js';\nimport { registerHooksCommand } from './commands/hooks.js';\nimport { registerPrCommand } from './commands/pr.js';\nimport { registerTemplateCommand } from './commands/template.js';\nimport { registerLogCommand } from './commands/log.js';\nimport { registerMultiCommand } from './commands/multi.js';\nimport { registerReviewCommand } from './commands/review.js';\nimport { registerScheduleCommand } from './commands/schedule.js';\n\nconst program = new Command();\n\nprogram\n .name('copilot-agent')\n .version('1.1.0')\n .description('Autonomous AI agent manager — auto-resume, task discovery, overnight runs. Supports GitHub Copilot CLI + Claude Code.');\n\nregisterStatusCommand(program);\nregisterWatchCommand(program);\nregisterRunCommand(program);\nregisterOvernightCommand(program);\nregisterResearchCommand(program);\nregisterReportCommand(program);\nregisterDashboardCommand(program);\nregisterWebCommand(program);\nregisterConfigCommand(program);\nregisterProxyCommand(program);\nregisterDiffCommand(program);\nregisterQuotaCommand(program);\nregisterCompactCommand(program);\nregisterHooksCommand(program);\nregisterPrCommand(program);\nregisterLogCommand(program);\nregisterTemplateCommand(program);\nregisterMultiCommand(program);\nregisterReviewCommand(program);\nregisterScheduleCommand(program);\n\nprogram.parse();\n","import {\n existsSync,\n readdirSync,\n readFileSync,\n statSync,\n} from 'node:fs';\nimport { join, resolve, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { AgentType } from './provider.js';\n\nexport interface Session {\n id: string;\n dir: string;\n mtime: number;\n lastEvent: string;\n premiumRequests: number;\n summary: string;\n cwd: string;\n complete: boolean;\n agent: AgentType;\n}\n\nexport interface SessionReport {\n id: string;\n cwd: string;\n summary: string;\n startTime: string;\n endTime: string;\n durationMs: number;\n complete: boolean;\n userMessages: number;\n assistantTurns: number;\n outputTokens: number;\n premiumRequests: number;\n toolUsage: Record<string, number>;\n gitCommits: string[];\n filesCreated: string[];\n filesEdited: string[];\n errors: string[];\n taskCompletions: string[];\n agent: AgentType;\n}\n\nconst SESSION_DIR = join(homedir(), '.copilot', 'session-state');\nconst CLAUDE_DIR = join(homedir(), '.claude');\nconst CLAUDE_PROJECTS_DIR = join(CLAUDE_DIR, 'projects');\n\nexport function getSessionDir(): string {\n return SESSION_DIR;\n}\n\nexport function validateSession(sid: string): boolean {\n const events = join(SESSION_DIR, sid, 'events.jsonl');\n try {\n return existsSync(events) && statSync(events).size > 0;\n } catch {\n return false;\n }\n}\n\nexport function listSessions(limit = 20): Session[] {\n if (!existsSync(SESSION_DIR)) return [];\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n const dirs: { id: string; dir: string; mtime: number }[] = [];\n for (const entry of entries) {\n const dirPath = join(SESSION_DIR, entry.name);\n if (!existsSync(join(dirPath, 'events.jsonl'))) continue;\n try {\n const stat = statSync(dirPath);\n dirs.push({ id: entry.name, dir: dirPath, mtime: stat.mtimeMs });\n } catch { /* skip */ }\n }\n\n dirs.sort((a, b) => b.mtime - a.mtime);\n\n return dirs.slice(0, limit).map(s => ({\n id: s.id,\n dir: s.dir,\n mtime: s.mtime,\n lastEvent: getLastEvent(s.id),\n premiumRequests: getSessionPremium(s.id),\n summary: getSessionSummary(s.id),\n cwd: getSessionCwd(s.id),\n complete: hasTaskComplete(s.id),\n agent: 'copilot' as AgentType,\n }));\n}\n\nexport function getLatestSessionId(): string | null {\n if (!existsSync(SESSION_DIR)) return null;\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n let latest: { id: string; mtime: number } | null = null;\n for (const entry of entries) {\n try {\n const stat = statSync(join(SESSION_DIR, entry.name));\n if (!latest || stat.mtimeMs > latest.mtime) {\n latest = { id: entry.name, mtime: stat.mtimeMs };\n }\n } catch { /* skip */ }\n }\n return latest?.id ?? null;\n}\n\nexport function hasTaskComplete(sid: string): boolean {\n if (!validateSession(sid)) return false;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n return content.includes('\"session.task_complete\"');\n } catch {\n return false;\n }\n}\n\nexport function getLastEvent(sid: string): string {\n if (!validateSession(sid)) return 'invalid';\n try {\n const lines = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8')\n .trimEnd()\n .split('\\n');\n const last = JSON.parse(lines[lines.length - 1]);\n return last.type ?? 'unknown';\n } catch {\n return 'corrupted';\n }\n}\n\nexport function getSessionPremium(sid: string): number {\n if (!validateSession(sid)) return 0;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n const lines = content.trimEnd().split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const event = JSON.parse(lines[i]);\n if (event.type === 'session.shutdown' && event.data?.totalPremiumRequests != null) {\n return event.data.totalPremiumRequests;\n }\n } catch { /* skip malformed line */ }\n }\n return 0;\n } catch {\n return 0;\n }\n}\n\nfunction parseSimpleYaml(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const idx = line.indexOf(': ');\n if (idx === -1) continue;\n const key = line.substring(0, idx).trim();\n const value = line.substring(idx + 2).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nfunction readWorkspace(sid: string): Record<string, string> {\n const wsPath = join(SESSION_DIR, sid, 'workspace.yaml');\n if (!existsSync(wsPath)) return {};\n try {\n return parseSimpleYaml(readFileSync(wsPath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function getSessionSummary(sid: string): string {\n return readWorkspace(sid).summary ?? '';\n}\n\nexport function getSessionCwd(sid: string): string {\n return readWorkspace(sid).cwd ?? '';\n}\n\nexport function findSessionForProject(projectPath: string): string | null {\n const resolved = resolve(projectPath);\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (s.cwd && resolve(s.cwd) === resolved) return s.id;\n }\n return null;\n}\n\nexport function findLatestIncomplete(): string | null {\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (!s.complete) return s.id;\n }\n return null;\n}\n\nexport function getSessionReport(sid: string): SessionReport | null {\n if (!validateSession(sid)) return null;\n\n const ws = readWorkspace(sid);\n let lines: string[];\n try {\n lines = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8')\n .trimEnd()\n .split('\\n');\n } catch {\n return null;\n }\n\n const report: SessionReport = {\n id: sid,\n cwd: ws.cwd ?? '',\n summary: ws.summary ?? '',\n startTime: '',\n endTime: '',\n durationMs: 0,\n complete: false,\n userMessages: 0,\n assistantTurns: 0,\n outputTokens: 0,\n premiumRequests: 0,\n toolUsage: {},\n gitCommits: [],\n filesCreated: [],\n filesEdited: [],\n errors: [],\n taskCompletions: [],\n agent: 'copilot',\n };\n\n for (const line of lines) {\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n\n const type = event.type as string;\n const ts = event.timestamp as string | undefined;\n const data = (event.data ?? {}) as Record<string, unknown>;\n\n if (ts && !report.startTime) report.startTime = ts;\n if (ts) report.endTime = ts;\n\n switch (type) {\n case 'user.message':\n report.userMessages++;\n break;\n\n case 'assistant.message':\n report.assistantTurns++;\n report.outputTokens += (data.outputTokens as number) ?? 0;\n break;\n\n case 'tool.execution_start': {\n const toolName = data.toolName as string;\n if (toolName) {\n report.toolUsage[toolName] = (report.toolUsage[toolName] ?? 0) + 1;\n }\n // Track git commits\n if (toolName === 'bash') {\n const args = data.arguments as Record<string, string> | undefined;\n const cmd = args?.command ?? '';\n if (cmd.includes('git') && cmd.includes('commit') && cmd.includes('-m')) {\n const msgMatch = cmd.match(/-m\\s+\"([^\"]{1,120})/);\n if (msgMatch) report.gitCommits.push(msgMatch[1]);\n }\n }\n // Track file creates/edits\n if (toolName === 'create') {\n const args = data.arguments as Record<string, string> | undefined;\n if (args?.path) report.filesCreated.push(args.path);\n }\n if (toolName === 'edit') {\n const args = data.arguments as Record<string, string> | undefined;\n if (args?.path && !report.filesEdited.includes(args.path)) {\n report.filesEdited.push(args.path);\n }\n }\n break;\n }\n\n case 'session.task_complete': {\n const summary = data.summary as string | undefined;\n report.taskCompletions.push(summary ?? '(task completed)');\n report.complete = true;\n break;\n }\n\n case 'session.error': {\n const msg = data.message as string | undefined;\n if (msg) report.errors.push(msg);\n break;\n }\n\n case 'session.shutdown': {\n const premium = data.totalPremiumRequests as number | undefined;\n if (premium != null) report.premiumRequests = premium;\n break;\n }\n }\n }\n\n if (report.startTime && report.endTime) {\n report.durationMs = new Date(report.endTime).getTime() - new Date(report.startTime).getTime();\n }\n\n return report;\n}\n\n// ─── Claude Code session support ───\n\n/**\n * Decode Claude's encoded project path back to filesystem path.\n * Claude encodes `/Users/foo/project` as `-Users-foo-project`.\n */\nfunction decodeClaudePath(encoded: string): string {\n return encoded.replace(/^-/, '/').replace(/-/g, '/');\n}\n\nfunction encodeClaudePath(fsPath: string): string {\n return fsPath.replace(/\\//g, '-');\n}\n\n/**\n * List all Claude Code sessions across all projects.\n */\nexport function listClaudeSessions(limit = 20): Session[] {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return [];\n\n const sessions: Session[] = [];\n try {\n const projectDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n for (const projDir of projectDirs) {\n const projPath = join(CLAUDE_PROJECTS_DIR, projDir.name);\n const cwd = decodeClaudePath(projDir.name);\n\n const files = readdirSync(projPath).filter(f => f.endsWith('.jsonl'));\n for (const file of files) {\n const filePath = join(projPath, file);\n const sid = basename(file, '.jsonl');\n try {\n const stat = statSync(filePath);\n const { lastEvent, complete, summary } = parseClaudeSessionMeta(filePath);\n sessions.push({\n id: sid,\n dir: projPath,\n mtime: stat.mtimeMs,\n lastEvent,\n premiumRequests: 0,\n summary,\n cwd,\n complete,\n agent: 'claude',\n });\n } catch { /* skip */ }\n }\n }\n } catch { /* skip */ }\n\n sessions.sort((a, b) => b.mtime - a.mtime);\n return sessions.slice(0, limit);\n}\n\nfunction parseClaudeSessionMeta(filePath: string): { lastEvent: string; complete: boolean; summary: string } {\n try {\n const content = readFileSync(filePath, 'utf-8').trimEnd();\n const lines = content.split('\\n');\n let lastEvent = 'unknown';\n let complete = false;\n let summary = '';\n\n // Read last few lines for metadata\n for (let i = lines.length - 1; i >= Math.max(0, lines.length - 5); i--) {\n try {\n const event = JSON.parse(lines[i]);\n if (i === lines.length - 1) {\n lastEvent = event.type ?? event.role ?? 'unknown';\n }\n // Claude marks completion with result type or specific message patterns\n if (event.type === 'result' || (event.type === 'assistant' && event.stop_reason === 'end_turn')) {\n complete = true;\n }\n } catch { /* skip */ }\n }\n\n // Get summary from first assistant message\n for (const line of lines.slice(0, 10)) {\n try {\n const event = JSON.parse(line);\n if ((event.type === 'human' || event.role === 'human') && event.message) {\n summary = typeof event.message === 'string'\n ? event.message.slice(0, 100)\n : JSON.stringify(event.message).slice(0, 100);\n break;\n }\n } catch { /* skip */ }\n }\n\n return { lastEvent, complete, summary };\n } catch {\n return { lastEvent: 'error', complete: false, summary: '' };\n }\n}\n\nexport function getLatestClaudeSessionId(projectDir?: string): string | null {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return null;\n\n let searchDirs: string[];\n if (projectDir) {\n const encoded = encodeClaudePath(resolve(projectDir));\n const projPath = join(CLAUDE_PROJECTS_DIR, encoded);\n searchDirs = existsSync(projPath) ? [projPath] : [];\n } else {\n try {\n searchDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => join(CLAUDE_PROJECTS_DIR, d.name));\n } catch {\n return null;\n }\n }\n\n let latest: { id: string; mtime: number } | null = null;\n for (const dir of searchDirs) {\n try {\n const files = readdirSync(dir).filter(f => f.endsWith('.jsonl'));\n for (const file of files) {\n const stat = statSync(join(dir, file));\n if (!latest || stat.mtimeMs > latest.mtime) {\n latest = { id: basename(file, '.jsonl'), mtime: stat.mtimeMs };\n }\n }\n } catch { /* skip */ }\n }\n return latest?.id ?? null;\n}\n\nexport function getClaudeSessionCwd(sid: string): string {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return '';\n try {\n const projectDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n for (const projDir of projectDirs) {\n const filePath = join(CLAUDE_PROJECTS_DIR, projDir.name, `${sid}.jsonl`);\n if (existsSync(filePath)) {\n return decodeClaudePath(projDir.name);\n }\n }\n } catch { /* skip */ }\n return '';\n}\n\nexport function getClaudeSessionReport(sid: string): SessionReport | null {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return null;\n\n // Find session file\n let filePath: string | null = null;\n let cwd = '';\n try {\n const projectDirs = readdirSync(CLAUDE_PROJECTS_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n for (const projDir of projectDirs) {\n const candidate = join(CLAUDE_PROJECTS_DIR, projDir.name, `${sid}.jsonl`);\n if (existsSync(candidate)) {\n filePath = candidate;\n cwd = decodeClaudePath(projDir.name);\n break;\n }\n }\n } catch { /* skip */ }\n\n if (!filePath) return null;\n\n let lines: string[];\n try {\n lines = readFileSync(filePath, 'utf-8').trimEnd().split('\\n');\n } catch {\n return null;\n }\n\n const report: SessionReport = {\n id: sid, cwd, summary: '', startTime: '', endTime: '',\n durationMs: 0, complete: false, userMessages: 0, assistantTurns: 0,\n outputTokens: 0, premiumRequests: 0, toolUsage: {}, gitCommits: [],\n filesCreated: [], filesEdited: [], errors: [], taskCompletions: [],\n agent: 'claude',\n };\n\n for (const line of lines) {\n let event: Record<string, unknown>;\n try { event = JSON.parse(line); } catch { continue; }\n\n const type = (event.type ?? event.role ?? '') as string;\n const ts = event.timestamp as string | undefined;\n\n if (ts && !report.startTime) report.startTime = ts;\n if (ts) report.endTime = ts;\n\n // Claude JSONL uses 'human'/'assistant'/'tool_use'/'tool_result' types\n if (type === 'human' || type === 'user') {\n report.userMessages++;\n if (!report.summary) {\n const msg = event.message ?? event.content;\n report.summary = (typeof msg === 'string' ? msg : JSON.stringify(msg ?? '')).slice(0, 100);\n }\n }\n\n if (type === 'assistant') {\n report.assistantTurns++;\n const usage = event.usage as Record<string, number> | undefined;\n if (usage?.output_tokens) report.outputTokens += usage.output_tokens;\n if (event.stop_reason === 'end_turn') report.complete = true;\n }\n\n if (type === 'tool_use') {\n const toolName = (event.name ?? event.tool ?? 'unknown') as string;\n report.toolUsage[toolName] = (report.toolUsage[toolName] ?? 0) + 1;\n\n // Track git commits from Bash tool\n if (toolName === 'Bash' || toolName === 'bash') {\n const input = (event.input ?? '') as string;\n const cmd = typeof input === 'string' ? input : (input as Record<string, string>)?.command ?? '';\n if (cmd.includes('git') && cmd.includes('commit') && cmd.includes('-m')) {\n const msgMatch = cmd.match(/-m\\s+\"([^\"]{1,120})/);\n if (msgMatch) report.gitCommits.push(msgMatch[1]);\n }\n }\n // Track file operations\n if (toolName === 'Write' || toolName === 'Create') {\n const path = (event.input as Record<string, string>)?.file_path\n ?? (event.input as Record<string, string>)?.path;\n if (path) report.filesCreated.push(path);\n }\n if (toolName === 'Edit') {\n const path = (event.input as Record<string, string>)?.file_path\n ?? (event.input as Record<string, string>)?.path;\n if (path && !report.filesEdited.includes(path)) report.filesEdited.push(path);\n }\n }\n\n if (type === 'result') {\n report.complete = true;\n const result = (event.result ?? event.content ?? '') as string;\n if (result) report.taskCompletions.push(typeof result === 'string' ? result.slice(0, 200) : '(completed)');\n }\n\n if (type === 'error') {\n const msg = (event.error ?? event.message ?? 'unknown error') as string;\n report.errors.push(typeof msg === 'string' ? msg : JSON.stringify(msg));\n }\n }\n\n if (report.startTime && report.endTime) {\n report.durationMs = new Date(report.endTime).getTime() - new Date(report.startTime).getTime();\n }\n\n return report;\n}\n\n// ─── Unified session functions ───\n\n/**\n * List sessions from both Copilot and Claude Code, merged and sorted by time.\n */\nexport function listAllSessions(limit = 20, agentFilter?: AgentType): Session[] {\n const copilot = agentFilter === 'claude' ? [] : listSessions(limit);\n const claude = agentFilter === 'copilot' ? [] : listClaudeSessions(limit);\n const all = [...copilot, ...claude];\n all.sort((a, b) => b.mtime - a.mtime);\n return all.slice(0, limit);\n}\n\nexport function getAgentSessionReport(sid: string, agent?: AgentType): SessionReport | null {\n if (agent === 'claude') return getClaudeSessionReport(sid);\n if (agent === 'copilot') return getSessionReport(sid);\n // Auto-detect: try copilot first, then claude\n return getSessionReport(sid) ?? getClaudeSessionReport(sid);\n}\n\nexport function findLatestIncompleteForAgent(agent?: AgentType): { id: string; agent: AgentType } | null {\n const sessions = listAllSessions(50, agent);\n for (const s of sessions) {\n if (!s.complete) return { id: s.id, agent: s.agent };\n }\n return null;\n}\n","import { execSync, spawn } from 'node:child_process';\nimport { resolve } from 'node:path';\nimport { getLatestSessionId, getSessionPremium, getSessionCwd, getLatestClaudeSessionId, getClaudeSessionCwd } from './session.js';\nimport { log, warn, fail } from './logger.js';\nimport type { AgentType, AgentProcess, AgentResult } from './provider.js';\n\n// Re-export for backward compatibility\nexport type CopilotProcess = AgentProcess;\nexport type CopilotResult = AgentResult;\n\nexport function isCopilotInstalled(): boolean {\n try {\n execSync('which copilot', { stdio: 'pipe', encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function assertCopilot(): void {\n if (!isCopilotInstalled()) {\n fail('copilot CLI not found. Install with: npm i -g @githubnext/copilot');\n process.exit(1);\n }\n}\n\n/**\n * Find running agent processes (copilot, claude, or both).\n */\nexport function findAgentProcesses(agentFilter?: AgentType): AgentProcess[] {\n try {\n const output = execSync('ps -eo pid,command', { encoding: 'utf-8' });\n const results: AgentProcess[] = [];\n const myPid = process.pid;\n const parentPid = process.ppid;\n\n for (const line of output.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const isCopilot = (trimmed.includes('copilot') || trimmed.includes('@githubnext/copilot'))\n && !trimmed.includes('copilot-agent') && !trimmed.includes('copilot-api');\n const isClaude = trimmed.includes('claude') && !trimmed.includes('claude-code')\n && !trimmed.includes('copilot-agent');\n\n if (!isCopilot && !isClaude) continue;\n if (trimmed.includes('ps -eo') || trimmed.includes('grep')) continue;\n\n const agent: AgentType = isClaude ? 'claude' : 'copilot';\n if (agentFilter && agent !== agentFilter) continue;\n\n const match = trimmed.match(/^(\\d+)\\s+(.+)$/);\n if (!match) continue;\n\n const pid = parseInt(match[1], 10);\n if (pid === myPid || pid === parentPid) continue;\n const cmd = match[2];\n\n // Extract session ID from command args\n const sidMatch = agent === 'copilot'\n ? cmd.match(/resume[= ]+([a-f0-9-]{36})/)\n : cmd.match(/(?:--resume|--session-id)[= ]+([a-f0-9-]{36})/);\n\n let cwd: string | undefined;\n try {\n cwd = execSync(`lsof -p ${pid} -Fn 2>/dev/null | grep '^n/' | head -1`, {\n encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],\n }).trim().slice(1) || undefined;\n } catch { /* best effort */ }\n\n const sid = sidMatch?.[1];\n if (!cwd && sid) {\n cwd = (agent === 'copilot' ? getSessionCwd(sid) : getClaudeSessionCwd(sid)) || undefined;\n }\n\n results.push({ pid, command: cmd, sessionId: sid, cwd, agent });\n }\n return results;\n } catch {\n return [];\n }\n}\n\n/** @deprecated Use findAgentProcesses('copilot') */\nexport function findCopilotProcesses(): AgentProcess[] {\n return findAgentProcesses('copilot');\n}\n\nexport function findPidForSession(sid: string, agent?: AgentType): number | null {\n const procs = findAgentProcesses(agent);\n const matching = procs\n .filter(p => p.command.includes(sid))\n .sort((a, b) => b.pid - a.pid);\n return matching[0]?.pid ?? null;\n}\n\n/**\n * SAFETY: Wait until no agent is running in the SAME directory.\n */\nexport async function waitForAgentInDir(\n dir: string,\n agent?: AgentType,\n timeoutMs = 14_400_000,\n pollMs = 10_000,\n): Promise<void> {\n const targetDir = resolve(dir);\n const start = Date.now();\n let warned = false;\n const label = agent ?? 'agent';\n while (Date.now() - start < timeoutMs) {\n const procs = findAgentProcesses(agent);\n const conflicting = procs.filter(p => {\n if (!p.cwd) return false;\n return resolve(p.cwd) === targetDir;\n });\n if (conflicting.length === 0) return;\n if (!warned) {\n warn(`Waiting for ${label} in ${targetDir} to finish...`);\n for (const p of conflicting) {\n log(` PID ${p.pid}: ${p.command.slice(0, 80)}`);\n }\n warned = true;\n }\n await sleep(pollMs);\n }\n warn(`Timeout waiting for ${label} to finish in directory`);\n}\n\n/** @deprecated Use waitForAgentInDir */\nexport function waitForCopilotInDir(dir: string, timeoutMs?: number, pollMs?: number) {\n return waitForAgentInDir(dir, 'copilot', timeoutMs, pollMs);\n}\n\nexport function assertSessionNotRunning(sid: string, agent?: AgentType): void {\n const pid = findPidForSession(sid, agent);\n if (pid) {\n const label = agent ?? 'agent';\n fail(`Session ${sid.slice(0, 8)}… already has ${label} running (PID ${pid}). Cannot resume.`);\n process.exit(1);\n }\n}\n\nexport async function waitForExit(pid: number, timeoutMs = 14_400_000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n process.kill(pid, 0);\n await sleep(5000);\n } catch {\n return true;\n }\n }\n return false;\n}\n\n// ─── Copilot-specific runners ───\n\nexport async function runCopilot(\n args: string[],\n options?: { cwd?: string; useWorktree?: boolean },\n): Promise<AgentResult> {\n const dir = options?.cwd ?? process.cwd();\n\n if (!options?.useWorktree) {\n await waitForAgentInDir(dir, 'copilot');\n }\n\n return new Promise((resolve) => {\n const child = spawn('copilot', args, {\n cwd: options?.cwd,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n child.on('close', async (code) => {\n await sleep(3000);\n const sid = getLatestSessionId();\n const premium = sid ? getSessionPremium(sid) : 0;\n resolve({ exitCode: code ?? 1, sessionId: sid, premium });\n });\n\n child.on('error', () => {\n resolve({ exitCode: 1, sessionId: null, premium: 0 });\n });\n });\n}\n\nexport function runCopilotResume(\n sid: string, steps: number, message?: string, cwd?: string,\n): Promise<AgentResult> {\n assertSessionNotRunning(sid, 'copilot');\n const args = [\n `--resume=${sid}`, '--autopilot', '--allow-all',\n '--max-autopilot-continues', String(steps), '--no-ask-user',\n ];\n if (message) args.push('-p', message);\n return runCopilot(args, { cwd });\n}\n\nexport function runCopilotTask(\n prompt: string, steps: number, cwd?: string, useWorktree?: boolean,\n): Promise<AgentResult> {\n return runCopilot([\n '-p', prompt, '--autopilot', '--allow-all',\n '--max-autopilot-continues', String(steps), '--no-ask-user',\n ], { cwd, useWorktree });\n}\n\n// ─── Claude Code runners ───\n\nexport async function runClaude(\n args: string[],\n options?: { cwd?: string; useWorktree?: boolean },\n): Promise<AgentResult> {\n const dir = options?.cwd ?? process.cwd();\n\n if (!options?.useWorktree) {\n await waitForAgentInDir(dir, 'claude');\n }\n\n return new Promise((resolve) => {\n const child = spawn('claude', args, {\n cwd: options?.cwd,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n child.on('close', async (code) => {\n await sleep(2000);\n const sid = getLatestClaudeSessionId(options?.cwd);\n resolve({ exitCode: code ?? 1, sessionId: sid, premium: 0 });\n });\n\n child.on('error', () => {\n resolve({ exitCode: 1, sessionId: null, premium: 0 });\n });\n });\n}\n\nexport function runClaudeResume(\n sid: string, _steps: number, message?: string, cwd?: string,\n): Promise<AgentResult> {\n assertSessionNotRunning(sid, 'claude');\n const args = ['--resume', sid, '--dangerously-skip-permissions'];\n if (message) args.push(message);\n return runClaude(args, { cwd });\n}\n\nexport function runClaudeTask(\n prompt: string, _steps: number, cwd?: string, useWorktree?: boolean,\n): Promise<AgentResult> {\n return runClaude([\n '--print', '--dangerously-skip-permissions',\n '--output-format', 'text',\n prompt,\n ], { cwd, useWorktree });\n}\n\n// ─── Unified runners ───\n\nexport function runAgentTask(\n agent: AgentType, prompt: string, steps: number, cwd?: string, useWorktree?: boolean,\n): Promise<AgentResult> {\n return agent === 'claude'\n ? runClaudeTask(prompt, steps, cwd, useWorktree)\n : runCopilotTask(prompt, steps, cwd, useWorktree);\n}\n\nexport function runAgentResume(\n agent: AgentType, sid: string, steps: number, message?: string, cwd?: string,\n): Promise<AgentResult> {\n return agent === 'claude'\n ? runClaudeResume(sid, steps, message, cwd)\n : runCopilotResume(sid, steps, message, cwd);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { RED, GREEN, YELLOW, CYAN, DIM, RESET } from './colors.js';\n\nlet logFilePath: string | null = null;\n\nconst ANSI_RE =\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;\n\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '');\n}\n\nfunction writeToFile(msg: string): void {\n if (!logFilePath) return;\n try {\n appendFileSync(logFilePath, stripAnsi(msg) + '\\n');\n } catch { /* ignore file write errors */ }\n}\n\nexport function setLogFile(path: string): void {\n mkdirSync(dirname(path), { recursive: true });\n logFilePath = path;\n}\n\nexport function log(msg: string): void {\n console.log(msg);\n writeToFile(msg);\n}\n\nexport function warn(msg: string): void {\n const out = `${YELLOW}⚠ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`⚠ ${msg}`);\n}\n\nexport function ok(msg: string): void {\n const out = `${GREEN}✔ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`✔ ${msg}`);\n}\n\nexport function fail(msg: string): void {\n const out = `${RED}✖ ${msg}${RESET}`;\n console.error(out);\n writeToFile(`✖ ${msg}`);\n}\n\nexport function info(msg: string): void {\n const out = `${CYAN}ℹ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`ℹ ${msg}`);\n}\n\nexport function dim(msg: string): void {\n const out = `${DIM}${msg}${RESET}`;\n console.log(out);\n writeToFile(msg);\n}\n\nexport function notify(message: string, title = 'copilot-agent'): void {\n try {\n if (process.platform === 'darwin') {\n execSync(\n `osascript -e 'display notification \"${message.replace(/\"/g, '\\\\\"')}\" with title \"${title.replace(/\"/g, '\\\\\"')}\"'`,\n { stdio: 'ignore' },\n );\n } else {\n try {\n execSync('which notify-send', { stdio: 'pipe' });\n execSync(\n `notify-send \"${title}\" \"${message.replace(/\"/g, '\\\\\"')}\"`,\n { stdio: 'ignore' },\n );\n } catch { /* notify-send not available */ }\n }\n } catch { /* notification not available */ }\n}\n","export const RED = '\\x1b[31m';\nexport const GREEN = '\\x1b[32m';\nexport const YELLOW = '\\x1b[33m';\nexport const BLUE = '\\x1b[34m';\nexport const CYAN = '\\x1b[36m';\nexport const DIM = '\\x1b[2m';\nexport const BOLD = '\\x1b[1m';\nexport const RESET = '\\x1b[0m';\n","import type { Command } from 'commander';\nimport {\n listAllSessions,\n} from '../lib/session.js';\nimport { findAgentProcesses } from '../lib/process.js';\nimport { resolveAgent, type AgentType } from '../lib/provider.js';\nimport { log } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, GREEN, YELLOW, RESET } from '../lib/colors.js';\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show agent session status (copilot + claude)')\n .option('-l, --limit <n>', 'Number of sessions to show', '10')\n .option('-a, --active', 'Show only active (running) processes')\n .option('-i, --incomplete', 'Only show incomplete sessions')\n .option('--agent <type>', 'Filter by agent: copilot or claude')\n .action((opts) => {\n const agentFilter = opts.agent as AgentType | undefined;\n if (opts.active) {\n showActive(agentFilter);\n } else {\n showRecent(parseInt(opts.limit, 10), opts.incomplete ?? false, agentFilter);\n }\n });\n}\n\nfunction showActive(agentFilter?: AgentType): void {\n const procs = findAgentProcesses(agentFilter);\n if (procs.length === 0) {\n log(`${DIM}No active agent processes.${RESET}`);\n return;\n }\n\n log(`\\n${BOLD}${'Agent'.padEnd(9)} ${'PID'.padEnd(8)} ${'Session'.padEnd(40)} Command${RESET}`);\n log('─'.repeat(118));\n\n for (const p of procs) {\n const agentLabel = p.agent === 'claude' ? `${CYAN}claude${RESET} ` : `${GREEN}copilot${RESET}`;\n log(\n `${agentLabel.padEnd(9 + 9)} ${String(p.pid).padEnd(8)} ${(p.sessionId ?? '—').padEnd(40)} ${truncate(p.command, 50)}`,\n );\n }\n log('');\n}\n\nfunction showRecent(limit: number, incompleteOnly: boolean, agentFilter?: AgentType): void {\n let sessions = listAllSessions(limit, agentFilter);\n if (incompleteOnly) {\n sessions = sessions.filter(s => !s.complete);\n }\n\n if (sessions.length === 0) {\n log(`${DIM}No sessions found.${RESET}`);\n return;\n }\n\n log(\n `\\n${BOLD}${'Agent'.padEnd(9)} ${'Status'.padEnd(10)} ${'Premium'.padEnd(10)} ${'Last Event'.padEnd(22)} ${'Summary'.padEnd(35)} ID${RESET}`,\n );\n log('─'.repeat(130));\n\n for (const s of sessions) {\n const agentLabel = s.agent === 'claude' ? `${CYAN}claude${RESET} ` : `${GREEN}copilot${RESET}`;\n const status = s.complete\n ? `${GREEN}✔ done${RESET}`\n : `${YELLOW}⏸ stop${RESET}`;\n const premium = s.agent === 'claude' ? '—' : String(s.premiumRequests);\n const summary = truncate(s.summary || '—', 33);\n\n log(\n `${agentLabel.padEnd(9 + 9)} ${status.padEnd(10 + 9)} ${premium.padEnd(10)} ${s.lastEvent.padEnd(22)} ${summary.padEnd(35)} ${DIM}${s.id.slice(0, 12)}…${RESET}`,\n );\n }\n log(`\\n${DIM}Total: ${sessions.length} session(s)${RESET}`);\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.substring(0, max - 1) + '…';\n}\n","import { execSync } from 'node:child_process';\n\nexport type AgentType = 'copilot' | 'claude';\n\nexport interface AgentProcess {\n pid: number;\n command: string;\n sessionId?: string;\n cwd?: string;\n agent: AgentType;\n}\n\nexport interface AgentResult {\n exitCode: number;\n sessionId: string | null;\n premium: number;\n}\n\n/**\n * Detect which agent CLIs are available.\n */\nexport function detectAvailableAgents(): AgentType[] {\n const agents: AgentType[] = [];\n try {\n execSync('which copilot', { stdio: 'pipe' });\n agents.push('copilot');\n } catch { /* not installed */ }\n try {\n execSync('which claude', { stdio: 'pipe' });\n agents.push('claude');\n } catch { /* not installed */ }\n return agents;\n}\n\n/**\n * Resolve agent type: explicit choice > auto-detect (copilot first for backward compat).\n */\nexport function resolveAgent(explicit?: string): AgentType {\n if (explicit === 'copilot' || explicit === 'claude') return explicit;\n const available = detectAvailableAgents();\n if (available.includes('copilot')) return 'copilot';\n if (available.includes('claude')) return 'claude';\n return 'copilot'; // will fail with helpful message later\n}\n\nexport function isAgentInstalled(agent: AgentType): boolean {\n try {\n execSync(`which ${agent}`, { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function assertAgent(agent: AgentType): void {\n if (!isAgentInstalled(agent)) {\n const installHint = agent === 'copilot'\n ? 'npm i -g @githubnext/copilot'\n : 'npm i -g @anthropic-ai/claude-code';\n console.error(`✖ ${agent} CLI not found. Install with: ${installHint}`);\n process.exit(1);\n }\n}\n","import type { Command } from 'commander';\nimport {\n validateSession,\n hasTaskComplete,\n getSessionSummary,\n getLastEvent,\n findLatestIncomplete,\n getSessionCwd,\n findLatestIncompleteForAgent,\n} from '../lib/session.js';\nimport {\n findPidForSession,\n waitForExit,\n runAgentResume,\n} from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { log, ok, warn, fail, info, notify } from '../lib/logger.js';\nimport { CYAN, RESET } from '../lib/colors.js';\n\nexport function registerWatchCommand(program: Command): void {\n program\n .command('watch [session-id]')\n .description('Watch a session and auto-resume when it stops')\n .option('-s, --steps <n>', 'Max autopilot continues per resume', '30')\n .option('-r, --max-resumes <n>', 'Max number of resumes', '10')\n .option('-c, --cooldown <n>', 'Seconds between resumes', '10')\n .option('-m, --message <msg>', 'Message to send on resume')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (sid: string | undefined, opts) => {\n try {\n await watchCommand(sid, {\n steps: parseInt(opts.steps, 10),\n maxResumes: parseInt(opts.maxResumes, 10),\n cooldown: parseInt(opts.cooldown, 10),\n message: opts.message,\n agent: resolveAgent(opts.agent),\n });\n } catch (err) {\n fail(`Watch error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface WatchOptions {\n steps: number;\n maxResumes: number;\n cooldown: number;\n message?: string;\n agent: AgentType;\n}\n\nasync function watchCommand(sid: string | undefined, opts: WatchOptions): Promise<void> {\n assertAgent(opts.agent);\n\n if (!sid) {\n const result = findLatestIncompleteForAgent(opts.agent);\n sid = result?.id;\n if (!sid) {\n fail('No incomplete session found.');\n process.exit(1);\n }\n info(`Auto-detected incomplete ${opts.agent} session: ${CYAN}${sid}${RESET}`);\n }\n\n if (!validateSession(sid)) {\n fail(`Invalid session: ${sid}`);\n process.exit(1);\n }\n\n if (hasTaskComplete(sid)) {\n ok(`Session ${sid} already completed.`);\n return;\n }\n\n let resumes = 0;\n\n while (resumes < opts.maxResumes) {\n const pid = findPidForSession(sid, opts.agent);\n\n if (pid) {\n info(`Watching PID ${pid} for ${opts.agent} session ${CYAN}${sid.slice(0, 8)}${RESET}…`);\n const exited = await waitForExit(pid);\n\n if (!exited) {\n warn('Timeout waiting for process exit.');\n break;\n }\n }\n\n // Small delay for events to flush\n await sleep(3000);\n\n if (hasTaskComplete(sid)) {\n ok(`Task complete! Summary: ${getSessionSummary(sid) || 'none'}`);\n notify('Task completed!', `Session ${sid.slice(0, 8)}`);\n return;\n }\n\n // Interrupted — resume\n resumes++;\n log(`Session interrupted (${getLastEvent(sid)}). Resume ${resumes}/${opts.maxResumes}…`);\n\n if (opts.cooldown > 0 && resumes > 1) {\n info(`Cooldown ${opts.cooldown}s...`);\n await sleep(opts.cooldown * 1000);\n }\n\n const cwd = getSessionCwd(sid) || undefined;\n const result = await runAgentResume(\n opts.agent,\n sid,\n opts.steps,\n opts.message ?? 'Continue remaining work. Pick up where you left off and complete the task.',\n cwd,\n );\n\n if (result.sessionId && result.sessionId !== sid) {\n info(`New session created: ${CYAN}${result.sessionId}${RESET}`);\n sid = result.sessionId;\n }\n }\n\n warn(`Max resumes (${opts.maxResumes}) reached.`);\n notify('Max resumes reached', `Session ${sid.slice(0, 8)}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport type ProjectType =\n | 'kmp' | 'kotlin' | 'java'\n | 'node' | 'typescript' | 'react' | 'next'\n | 'python' | 'rust' | 'swift' | 'go' | 'flutter'\n | 'unknown';\n\nexport function detectProjectType(dir: string): ProjectType {\n const exists = (f: string) => existsSync(join(dir, f));\n\n if (exists('build.gradle.kts') || exists('build.gradle')) {\n if (exists('composeApp') || exists('gradle.properties')) {\n try {\n const gradle = readFileSync(join(dir, 'build.gradle.kts'), 'utf-8');\n if (gradle.includes('multiplatform') || gradle.includes('KotlinMultiplatform')) return 'kmp';\n } catch { /* ignore */ }\n }\n if (exists('pom.xml')) return 'java';\n return 'kotlin';\n }\n if (exists('pubspec.yaml')) return 'flutter';\n if (exists('Package.swift')) return 'swift';\n try {\n const entries = readdirSync(dir);\n if (entries.some(e => e.endsWith('.xcodeproj'))) return 'swift';\n } catch { /* ignore */ }\n if (exists('Cargo.toml')) return 'rust';\n if (exists('go.mod')) return 'go';\n if (exists('pyproject.toml') || exists('setup.py') || exists('requirements.txt')) return 'python';\n if (exists('package.json')) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (allDeps['next']) return 'next';\n if (allDeps['react']) return 'react';\n if (allDeps['typescript'] || exists('tsconfig.json')) return 'typescript';\n } catch { /* ignore */ }\n return 'node';\n }\n if (exists('pom.xml')) return 'java';\n return 'unknown';\n}\n\nexport function detectProjectName(dir: string): string {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n if (pkg.name) return pkg.name;\n } catch { /* ignore */ }\n return basename(resolve(dir));\n}\n\nexport function detectMainBranch(dir: string): string {\n try {\n const ref = execSync('git symbolic-ref refs/remotes/origin/HEAD', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return ref.split('/').pop() ?? 'main';\n } catch { /* ignore */ }\n\n try {\n const branch = execSync('git branch --show-current', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (branch) return branch;\n } catch { /* ignore */ }\n\n return 'main';\n}\n","import type { ProjectType } from \"./detect.js\";\n\ninterface TaskPrompt {\n title: string;\n prompt: string;\n priority: number;\n}\n\nconst COMMON_TASKS: TaskPrompt[] = [\n {\n title: \"Fix TODOs\",\n prompt:\n \"Scan for TODO, FIXME, HACK comments. Fix the most impactful ones. Run tests to verify.\",\n priority: 1,\n },\n {\n title: \"Update dependencies\",\n prompt:\n \"Check for outdated dependencies. Update patch/minor versions that are safe. Run tests after updating.\",\n priority: 2,\n },\n {\n title: \"Improve test coverage\",\n prompt:\n \"Find untested public functions. Write tests for the most critical ones. Target 80%+ coverage.\",\n priority: 3,\n },\n {\n title: \"Fix lint warnings\",\n prompt:\n \"Run the project linter. Fix all warnings without changing behavior. Run tests.\",\n priority: 4,\n },\n {\n title: \"Improve documentation\",\n prompt:\n \"Review README and code docs. Add missing JSDoc/KDoc for public APIs. Update outdated sections.\",\n priority: 5,\n },\n {\n title: \"Security audit\",\n prompt:\n \"Check for common security issues: hardcoded secrets, SQL injection, XSS, insecure defaults. Fix any found.\",\n priority: 6,\n },\n];\n\nconst TYPE_TASKS: Partial<Record<ProjectType, TaskPrompt[]>> = {\n kmp: [\n {\n title: \"KMP: Optimize Compose\",\n prompt:\n \"Review Compose UI code for recomposition issues. Add @Stable/@Immutable where needed. Check remember usage.\",\n priority: 2,\n },\n {\n title: \"KMP: Check expect/actual\",\n prompt:\n \"Review expect/actual declarations. Ensure all platforms have proper implementations. Check for missing iOS/Desktop actuals.\",\n priority: 3,\n },\n {\n title: \"KMP: Room migrations\",\n prompt:\n \"Check Room database schema. Ensure migrations are defined for schema changes. Add missing migration tests.\",\n priority: 4,\n },\n ],\n typescript: [\n {\n title: \"TS: Strict type safety\",\n prompt:\n \"Find `any` types and loose assertions. Replace with proper types. Enable stricter tsconfig options if safe.\",\n priority: 2,\n },\n ],\n react: [\n {\n title: \"React: Performance\",\n prompt:\n \"Find unnecessary re-renders. Add React.memo, useMemo, useCallback where beneficial. Check bundle size.\",\n priority: 2,\n },\n ],\n python: [\n {\n title: \"Python: Type hints\",\n prompt:\n \"Add type hints to public functions. Run mypy to check type safety. Fix any type errors.\",\n priority: 2,\n },\n ],\n node: [\n {\n title: \"Node: Error handling\",\n prompt:\n \"Review async error handling. Add try/catch for unhandled promises. Check for missing error middleware.\",\n priority: 2,\n },\n ],\n};\n\nexport function getTasksForProject(type: ProjectType): TaskPrompt[] {\n const specific = TYPE_TASKS[type] ?? [];\n return [...specific, ...COMMON_TASKS].sort(\n (a, b) => a.priority - b.priority,\n );\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst LOCK_BASE = join(homedir(), '.copilot', 'locks');\n\nfunction lockDir(name: string): string {\n return join(LOCK_BASE, `${name}.lock`);\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function acquireLock(name: string, timeoutMs = 30_000): boolean {\n mkdirSync(LOCK_BASE, { recursive: true });\n const dir = lockDir(name);\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n mkdirSync(dir);\n // Lock acquired — write metadata\n writeFileSync(join(dir, 'pid'), String(process.pid));\n writeFileSync(join(dir, 'acquired'), new Date().toISOString());\n return true;\n } catch {\n // Lock dir exists — check if holder is still alive\n try {\n const holderPid = parseInt(readFileSync(join(dir, 'pid'), 'utf-8').trim(), 10);\n if (!isPidAlive(holderPid)) {\n // Stale lock — break it\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n } catch {\n // Can't read pid file — try breaking\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n // Holder is alive — wait and retry\n const waitMs = Math.min(500, deadline - Date.now());\n if (waitMs > 0) {\n const start = Date.now();\n while (Date.now() - start < waitMs) { /* spin wait */ }\n }\n }\n }\n return false;\n}\n\nexport function releaseLock(name: string): void {\n const dir = lockDir(name);\n try {\n rmSync(dir, { recursive: true, force: true });\n } catch { /* already released */ }\n}\n\nexport async function withLock<T>(name: string, fn: () => T | Promise<T>): Promise<T> {\n if (!acquireLock(name)) {\n throw new Error(`Failed to acquire lock: ${name}`);\n }\n try {\n return await fn();\n } finally {\n releaseLock(name);\n }\n}\n","import { existsSync, rmSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\nfunction gitExec(dir: string, cmd: string): string | null {\n try {\n return execSync(cmd, {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n}\n\nexport function isGitRepo(dir: string): boolean {\n return existsSync(join(dir, '.git'));\n}\n\nexport function gitCurrentBranch(dir: string): string | null {\n return gitExec(dir, 'git branch --show-current');\n}\n\nexport function gitStash(dir: string): boolean {\n return gitExec(dir, 'git stash -q') !== null;\n}\n\nexport function gitStashPop(dir: string): boolean {\n return gitExec(dir, 'git stash pop -q') !== null;\n}\n\nexport function gitCheckout(dir: string, branch: string): boolean {\n return gitExec(dir, `git checkout ${branch} -q`) !== null;\n}\n\nexport function gitCreateBranch(dir: string, branch: string): boolean {\n return gitExec(dir, `git checkout -b ${branch}`) !== null;\n}\n\nexport function gitCountCommits(dir: string, from: string, to: string): number {\n const result = gitExec(dir, `git log ${from}..${to} --oneline`);\n if (!result) return 0;\n return result.split('\\n').filter(l => l.trim()).length;\n}\n\nexport function gitStatus(dir: string): string {\n return gitExec(dir, 'git status --porcelain') ?? '';\n}\n\nexport function gitRoot(dir: string): string | null {\n return gitExec(dir, 'git rev-parse --show-toplevel');\n}\n\n// ── Worktree support ──\n\nexport function listWorktrees(dir: string): { path: string; branch: string; bare: boolean }[] {\n const raw = gitExec(dir, 'git worktree list --porcelain');\n if (!raw) return [];\n const trees: { path: string; branch: string; bare: boolean }[] = [];\n let current: { path: string; branch: string; bare: boolean } = { path: '', branch: '', bare: false };\n for (const line of raw.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (current.path) trees.push(current);\n current = { path: line.slice(9), branch: '', bare: false };\n } else if (line.startsWith('branch ')) {\n current.branch = line.slice(7).replace('refs/heads/', '');\n } else if (line === 'bare') {\n current.bare = true;\n }\n }\n if (current.path) trees.push(current);\n return trees;\n}\n\n/**\n * Create a git worktree for parallel copilot work.\n * Returns the worktree path or null on failure.\n */\nexport function createWorktree(repoDir: string, branch: string): string | null {\n const safeBranch = branch.replace(/[^a-zA-Z0-9._/-]/g, '-');\n const worktreePath = resolve(repoDir, '..', `${resolve(repoDir).split('/').pop()}-wt-${safeBranch}`);\n\n if (existsSync(worktreePath)) {\n return worktreePath; // already exists\n }\n\n // Create branch if it doesn't exist, then add worktree\n const branchExists = gitExec(repoDir, `git rev-parse --verify ${safeBranch}`) !== null;\n const cmd = branchExists\n ? `git worktree add \"${worktreePath}\" ${safeBranch}`\n : `git worktree add -b ${safeBranch} \"${worktreePath}\"`;\n\n if (gitExec(repoDir, cmd) !== null) {\n return worktreePath;\n }\n return null;\n}\n\n/**\n * Remove a worktree (prune).\n */\nexport function removeWorktree(repoDir: string, worktreePath: string): boolean {\n const result = gitExec(repoDir, `git worktree remove \"${worktreePath}\" --force`);\n return result !== null;\n}\n\n/**\n * Clean up all copilot-agent worktrees.\n */\nexport function cleanupWorktrees(repoDir: string): number {\n const trees = listWorktrees(repoDir);\n let cleaned = 0;\n for (const t of trees) {\n if (t.path.includes('-wt-')) {\n if (removeWorktree(repoDir, t.path)) cleaned++;\n }\n }\n gitExec(repoDir, 'git worktree prune');\n return cleaned;\n}\n","import type { Command } from 'commander';\nimport { detectProjectType, detectProjectName, detectMainBranch } from '../lib/detect.js';\nimport { getTasksForProject } from '../lib/tasks.js';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { isGitRepo, gitCurrentBranch, gitStatus, gitStash, gitCheckout, gitCreateBranch, gitCountCommits, createWorktree, removeWorktree } from '../lib/git.js';\nimport { log, ok, warn, fail, info, notify } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, GREEN, RESET, YELLOW } from '../lib/colors.js';\n\nexport function registerRunCommand(program: Command): void {\n program\n .command('run [dir]')\n .description('Discover and fix issues in a project')\n .option('-s, --steps <n>', 'Max autopilot continues per task', '30')\n .option('-t, --max-tasks <n>', 'Max number of tasks to run', '5')\n .option('-p, --max-premium <n>', 'Max total premium requests', '50')\n .option('--dry-run', 'Show tasks without executing')\n .option('--worktree', 'Use git worktree for parallel execution (default: wait for idle)')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (dir: string | undefined, opts) => {\n try {\n await runCommand(dir ?? process.cwd(), {\n steps: parseInt(opts.steps, 10),\n maxTasks: parseInt(opts.maxTasks, 10),\n maxPremium: parseInt(opts.maxPremium, 10),\n dryRun: opts.dryRun ?? false,\n useWorktree: opts.worktree ?? false,\n agent: resolveAgent(opts.agent),\n });\n } catch (err) {\n fail(`Run error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface RunOptions {\n steps: number;\n maxTasks: number;\n maxPremium: number;\n dryRun: boolean;\n useWorktree: boolean;\n agent: AgentType;\n}\n\nasync function runCommand(dir: string, opts: RunOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const projectType = detectProjectType(dir);\n const name = detectProjectName(dir);\n const mainBranch = isGitRepo(dir) ? detectMainBranch(dir) : null;\n\n info(`Project: ${CYAN}${name}${RESET} (${projectType}) — agent: ${opts.agent}`);\n if (mainBranch) info(`Main branch: ${mainBranch}`);\n\n const tasks = getTasksForProject(projectType).slice(0, opts.maxTasks);\n\n if (tasks.length === 0) {\n warn('No tasks found for this project type.');\n return;\n }\n\n log(`Found ${tasks.length} tasks:`);\n for (const t of tasks) {\n log(` ${DIM}•${RESET} ${t.title}`);\n }\n\n if (opts.dryRun) {\n log(`${DIM}(dry-run — not executing)${RESET}`);\n return;\n }\n\n const originalBranch = isGitRepo(dir) ? gitCurrentBranch(dir) : null;\n let completed = 0;\n let premiumTotal = 0;\n\n for (const task of tasks) {\n if (premiumTotal >= opts.maxPremium) {\n warn(`Premium request limit reached (${premiumTotal}/${opts.maxPremium}).`);\n break;\n }\n\n log(`\\n${'═'.repeat(60)}`);\n log(`${BOLD}${CYAN}Task: ${task.title}${RESET}`);\n log(`${'═'.repeat(60)}`);\n\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n const branchName = `agent/fix-${completed + 1}-${timestamp}-${random}`;\n\n if (mainBranch && isGitRepo(dir)) {\n if (gitStatus(dir)) gitStash(dir);\n gitCheckout(dir, mainBranch);\n if (!gitCreateBranch(dir, branchName)) {\n warn(`Could not create branch ${branchName}, continuing on current.`);\n }\n }\n\n info(`Running: ${task.title}…`);\n\n let taskDir = dir;\n let worktreeCreated = false;\n\n if (opts.useWorktree && isGitRepo(dir)) {\n try {\n const wt = createWorktree(dir, branchName);\n if (wt) {\n taskDir = wt;\n worktreeCreated = true;\n info(`Created worktree: ${taskDir}`);\n } else {\n warn('Worktree creation returned null, falling back to main dir');\n }\n } catch (err) {\n warn(`Worktree creation failed, falling back to main dir: ${err}`);\n taskDir = dir;\n }\n }\n\n const result = await withLock('copilot-run', () =>\n runAgentTask(opts.agent, task.prompt, opts.steps, taskDir, opts.useWorktree),\n );\n\n const commitRef = worktreeCreated ? taskDir : dir;\n const commits = mainBranch ? gitCountCommits(commitRef, mainBranch, 'HEAD') : 0;\n premiumTotal += result.premium;\n completed++;\n ok(`${task.title} — ${commits} commit(s), ${result.premium} premium`);\n\n if (worktreeCreated) {\n try {\n removeWorktree(dir, taskDir);\n } catch (err) {\n warn(`Worktree cleanup failed: ${err}`);\n }\n }\n\n if (!worktreeCreated && originalBranch && isGitRepo(dir)) {\n gitCheckout(dir, mainBranch ?? originalBranch);\n }\n }\n\n log(`\\n${BOLD}═══ Run Summary ═══${RESET}`);\n log(`Completed ${completed}/${tasks.length} tasks. Total premium: ${premiumTotal}`);\n notify(`Completed ${completed} tasks`, name);\n}\n","import type { Command } from 'commander';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { detectProjectType, detectProjectName, detectMainBranch } from '../lib/detect.js';\nimport { getTasksForProject } from '../lib/tasks.js';\nimport { runAgentTask, runAgentResume, findPidForSession, findAgentProcesses, waitForExit, waitForAgentInDir } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { isGitRepo, gitCurrentBranch, gitStash, gitCheckout, gitCreateBranch, gitCountCommits, createWorktree, removeWorktree } from '../lib/git.js';\nimport { findLatestIncomplete, validateSession, hasTaskComplete, getSessionCwd, findLatestIncompleteForAgent } from '../lib/session.js';\nimport { log, ok, warn, fail, info, setLogFile, notify } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, RESET } from '../lib/colors.js';\n\nexport function registerOvernightCommand(program: Command): void {\n program\n .command('overnight [dir]')\n .description('Run tasks continuously until a deadline')\n .option('-u, --until <HH>', 'Stop at this hour (24h format)', '07')\n .option('-s, --steps <n>', 'Max autopilot continues per task', '50')\n .option('-c, --cooldown <n>', 'Seconds between tasks', '15')\n .option('-p, --max-premium <n>', 'Max premium requests budget', '300')\n .option('--dry-run', 'Show plan without executing')\n .option('--worktree', 'Use git worktree for parallel execution (default: wait for idle)')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (dir: string | undefined, opts) => {\n try {\n await overnightCommand(dir ?? process.cwd(), {\n until: parseInt(opts.until, 10),\n steps: parseInt(opts.steps, 10),\n cooldown: parseInt(opts.cooldown, 10),\n maxPremium: parseInt(opts.maxPremium, 10),\n dryRun: opts.dryRun ?? false,\n useWorktree: opts.worktree ?? false,\n agent: resolveAgent(opts.agent),\n });\n } catch (err) {\n fail(`Overnight error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface OvernightOptions {\n until: number;\n steps: number;\n cooldown: number;\n maxPremium: number;\n dryRun: boolean;\n useWorktree: boolean;\n agent: AgentType;\n}\n\nfunction isPastDeadline(untilHour: number): boolean {\n const hour = new Date().getHours();\n return hour >= untilHour && hour < 20;\n}\n\nasync function overnightCommand(dir: string, opts: OvernightOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const ts = new Date().toISOString().replace(/[:.]/g, '').slice(0, 15);\n const logPath = join(homedir(), '.copilot', 'auto-resume-logs', `overnight-${ts}.log`);\n setLogFile(logPath);\n\n const name = detectProjectName(dir);\n const projectType = detectProjectType(dir);\n const mainBranch = isGitRepo(dir) ? detectMainBranch(dir) : null;\n\n info(`Overnight runner for ${CYAN}${name}${RESET} (${projectType}) — agent: ${opts.agent}`); info(`Deadline: ${String(opts.until).padStart(2, '0')}:00`);\n info(`Max premium: ${opts.maxPremium}, Steps: ${opts.steps}`);\n info(`Log: ${logPath}`);\n\n const tasks = getTasksForProject(projectType);\n\n if (opts.dryRun) {\n log(`\\nWould run ${tasks.length} tasks:`);\n for (const t of tasks) log(` ${DIM}•${RESET} ${t.title}`);\n return;\n }\n\n // Phase 1: Resume existing incomplete session\n const existingResult = findLatestIncompleteForAgent(opts.agent);\n const existingSession = existingResult?.id;\n if (existingSession && validateSession(existingSession)) {\n info(`Found incomplete session: ${existingSession}`);\n const pid = findPidForSession(existingSession, opts.agent);\n if (pid) {\n info(`Waiting for running ${opts.agent} (PID ${pid})...`);\n await waitForExit(pid);\n }\n\n if (!hasTaskComplete(existingSession) && !isPastDeadline(opts.until)) {\n info('Resuming incomplete session...');\n const cwd = getSessionCwd(existingSession) || dir;\n await runAgentResume(\n opts.agent,\n existingSession,\n opts.steps,\n 'Continue remaining work. Complete the task.',\n cwd,\n );\n }\n }\n\n // Phase 2: Loop tasks until deadline\n const originalBranch = isGitRepo(dir) ? gitCurrentBranch(dir) : null;\n let taskIdx = 0;\n let totalPremium = 0;\n let totalCommits = 0;\n\n while (!isPastDeadline(opts.until) && taskIdx < tasks.length) {\n if (totalPremium >= opts.maxPremium) {\n warn(`Premium budget exhausted: ${totalPremium}/${opts.maxPremium}`);\n break;\n }\n\n const task = tasks[taskIdx % tasks.length];\n taskIdx++;\n\n log(`\\n${'═'.repeat(60)}`);\n log(`${BOLD}${CYAN}[${new Date().toLocaleTimeString()}] Task ${taskIdx}: ${task.title}${RESET}`);\n log(`${DIM}Premium: ${totalPremium}/${opts.maxPremium}${RESET}`);\n log(`${'═'.repeat(60)}`);\n\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n const branchName = `agent/overnight-${taskIdx}-${timestamp}-${random}`;\n\n if (mainBranch && isGitRepo(dir)) {\n gitStash(dir);\n gitCheckout(dir, mainBranch);\n gitCreateBranch(dir, branchName);\n }\n\n info(`Running: ${task.title}…`);\n\n let taskDir = dir;\n let worktreeCreated = false;\n\n if (opts.useWorktree && isGitRepo(dir)) {\n try {\n const wt = createWorktree(dir, branchName);\n if (wt) {\n taskDir = wt;\n worktreeCreated = true;\n info(`Created worktree: ${taskDir}`);\n } else {\n warn('Worktree creation returned null, falling back to main dir');\n }\n } catch (err) {\n warn(`Worktree creation failed, falling back to main dir: ${err}`);\n taskDir = dir;\n }\n }\n\n try {\n const result = await withLock('copilot-overnight', () =>\n runAgentTask(opts.agent, task.prompt, opts.steps, taskDir, opts.useWorktree),\n );\n\n const commitRef = worktreeCreated ? taskDir : dir;\n const commits = mainBranch ? gitCountCommits(commitRef, mainBranch, 'HEAD') : 0;\n totalPremium += result.premium;\n totalCommits += commits;\n\n if (commits > 0) {\n ok(`${commits} commit(s) on ${branchName}`);\n } else {\n log(`${DIM}No commits on ${branchName}${RESET}`);\n }\n } catch (err) {\n fail(`Task failed: ${err}`);\n }\n\n // Cleanup worktree if we created one\n if (worktreeCreated) {\n try {\n removeWorktree(dir, taskDir);\n info(`Removed worktree: ${taskDir}`);\n } catch (err) {\n warn(`Worktree cleanup failed: ${err}`);\n }\n }\n\n if (!worktreeCreated && mainBranch && isGitRepo(dir)) {\n gitCheckout(dir, mainBranch);\n }\n\n if (!isPastDeadline(opts.until)) {\n info(`Cooldown ${opts.cooldown}s…`);\n await sleep(opts.cooldown * 1000);\n }\n }\n\n if (originalBranch && isGitRepo(dir)) {\n gitCheckout(dir, originalBranch);\n }\n\n const summary = `Overnight done — ${taskIdx} tasks, ${totalCommits} commits, ${totalPremium} premium.`;\n ok(summary);\n notify(summary, name);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import type { Command } from 'commander';\nimport { existsSync, copyFileSync, mkdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { detectProjectType, detectProjectName } from '../lib/detect.js';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent, assertAgent } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { log, ok, warn, fail, info, notify } from '../lib/logger.js';\nimport { CYAN, RESET } from '../lib/colors.js';\n\nexport function registerResearchCommand(program: Command): void {\n program\n .command('research [project]')\n .description('Research improvements or a specific topic')\n .option('-s, --steps <n>', 'Max autopilot continues', '50')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude')\n .action(async (project: string | undefined, opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n await researchCommand(project ?? process.cwd(), {\n steps: parseInt(opts.steps, 10),\n agent,\n });\n } catch (err) {\n fail(`Research error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\ninterface ResearchOptions {\n steps: number;\n agent: ReturnType<typeof resolveAgent>;\n}\n\nfunction buildResearchPrompt(projectType: string, projectName: string): string {\n return `You are a senior software architect. Analyze this ${projectType} project \"${projectName}\" thoroughly.\n\nResearch and produce a file called RESEARCH-PROPOSALS.md with:\n\n1. **Architecture Assessment** — Current architecture, patterns used, strengths and weaknesses\n2. **Code Quality Report** — Common issues, anti-patterns, technical debt areas\n3. **Security Audit** — Potential vulnerabilities, dependency risks, configuration issues\n4. **Performance Analysis** — Bottlenecks, optimization opportunities, resource usage\n5. **Testing Gap Analysis** — Untested areas, test quality, coverage recommendations\n6. **Improvement Proposals** — Prioritized list of actionable improvements with effort estimates\n\nFor each proposal, include:\n- Priority (P0/P1/P2)\n- Estimated effort (hours)\n- Impact description\n- Suggested implementation approach\n\nWrite RESEARCH-PROPOSALS.md in the project root.`;\n}\n\nasync function researchCommand(dir: string, opts: ResearchOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const projectDir = resolve(dir);\n const projectType = detectProjectType(projectDir);\n const projectName = detectProjectName(projectDir);\n\n info(`Researching: ${CYAN}${projectName}${RESET} (${projectType}) — agent: ${opts.agent}`);\n\n const prompt = buildResearchPrompt(projectType, projectName);\n\n const result = await withLock('copilot-research', () =>\n runAgentTask(opts.agent, prompt, opts.steps, projectDir),\n );\n\n log(`Copilot exited with code ${result.exitCode}`);\n\n // Check for output file\n const proposalsFile = join(projectDir, 'RESEARCH-PROPOSALS.md');\n if (existsSync(proposalsFile)) {\n ok('RESEARCH-PROPOSALS.md generated.');\n\n // Backup to ~/.copilot/research-reports/\n const backupDir = join(homedir(), '.copilot', 'research-reports');\n mkdirSync(backupDir, { recursive: true });\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupFile = join(backupDir, `${projectName}-${timestamp}.md`);\n copyFileSync(proposalsFile, backupFile);\n ok(`Backup saved: ${backupFile}`);\n } else {\n warn('RESEARCH-PROPOSALS.md was not generated. Check copilot output.');\n }\n\n notify('Research complete', projectName);\n}\n","import type { Command } from 'commander';\nimport { resolve } from 'node:path';\nimport {\n listAllSessions,\n getAgentSessionReport,\n type SessionReport,\n} from '../lib/session.js';\nimport { log, warn, fail } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, GREEN, YELLOW, RED, RESET } from '../lib/colors.js';\n\nexport function registerReportCommand(program: Command): void {\n program\n .command('report [session-id]')\n .description('Show what an agent did — timeline, tools, commits, files changed')\n .option('-l, --limit <n>', 'Number of recent sessions to report (when no ID given)', '1')\n .option('--project <dir>', 'Filter sessions by project directory')\n .option('--json', 'Output raw JSON')\n .option('-a, --agent <type>', 'Filter by agent: copilot or claude')\n .action((sessionId: string | undefined, opts) => {\n try {\n if (sessionId) {\n reportSingle(sessionId, opts.json ?? false, opts.agent);\n } else {\n reportRecent(parseInt(opts.limit, 10), opts.project, opts.json ?? false, opts.agent);\n }\n } catch (err) {\n fail(`Report error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\nfunction reportRecent(limit: number, projectDir?: string, json = false, agentFilter?: string): void {\n let sessions = listAllSessions(limit * 3, agentFilter as any);\n if (projectDir) {\n const target = resolve(projectDir);\n sessions = sessions.filter(s => s.cwd && resolve(s.cwd) === target);\n }\n sessions = sessions.slice(0, limit);\n\n if (sessions.length === 0) {\n warn('No sessions found.');\n return;\n }\n\n for (const s of sessions) {\n reportSingle(s.id, json, s.agent);\n }\n}\n\nfunction reportSingle(sid: string, json = false, agent?: string): void {\n const report = getAgentSessionReport(sid, agent as any);\n if (!report) {\n warn(`Session ${sid} not found or invalid.`);\n return;\n }\n\n if (json) {\n log(JSON.stringify(report, null, 2));\n return;\n }\n\n renderReport(report);\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n\nfunction formatTime(iso: string): string {\n if (!iso) return '—';\n const d = new Date(iso);\n return d.toLocaleString('en-GB', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction bar(value: number, max: number, width = 20): string {\n const filled = Math.round((value / Math.max(max, 1)) * width);\n return '█'.repeat(filled) + '░'.repeat(width - filled);\n}\n\nfunction renderReport(r: SessionReport): void {\n const status = r.complete\n ? `${GREEN}✔ Completed${RESET}`\n : `${YELLOW}⏸ Interrupted${RESET}`;\n\n const projectName = r.cwd.split('/').pop() ?? r.cwd;\n\n log('');\n log(`${BOLD}╔${'═'.repeat(62)}╗${RESET}`);\n log(`${BOLD}║${RESET} 📋 Session Report: ${CYAN}${r.id.slice(0, 8)}…${RESET} (${r.agent})${' '.repeat(Math.max(0, 62 - 32 - r.id.slice(0, 8).length - r.agent.length))}${BOLD}║${RESET}`);\n log(`${BOLD}╚${'═'.repeat(62)}╝${RESET}`);\n\n // Overview\n log('');\n log(`${BOLD} Overview${RESET}`);\n log(` ${'─'.repeat(58)}`);\n log(` Project: ${CYAN}${projectName}${RESET} ${DIM}${r.cwd}${RESET}`);\n log(` Status: ${status}`);\n log(` Duration: ${BOLD}${formatDuration(r.durationMs)}${RESET} ${DIM}(${formatTime(r.startTime)} → ${formatTime(r.endTime)})${RESET}`);\n log(` Summary: ${r.summary || DIM + '(none)' + RESET}`);\n\n // Stats\n log('');\n log(`${BOLD} Activity${RESET}`);\n log(` ${'─'.repeat(58)}`);\n log(` User messages: ${BOLD}${r.userMessages}${RESET}`);\n log(` Assistant turns: ${BOLD}${r.assistantTurns}${RESET}`);\n log(` Output tokens: ${BOLD}${r.outputTokens.toLocaleString()}${RESET}`);\n log(` Premium requests: ${BOLD}${r.premiumRequests}${RESET}`);\n log(` Tool calls: ${BOLD}${Object.values(r.toolUsage).reduce((a, b) => a + b, 0)}${RESET}`);\n\n // Tools breakdown\n const toolEntries = Object.entries(r.toolUsage).sort((a, b) => b[1] - a[1]);\n if (toolEntries.length > 0) {\n const maxCount = toolEntries[0][1];\n log('');\n log(`${BOLD} Tools Used${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const [tool, count] of toolEntries.slice(0, 10)) {\n const barStr = bar(count, maxCount, 15);\n log(` ${DIM}${barStr}${RESET} ${String(count).padStart(5)} ${tool}`);\n }\n if (toolEntries.length > 10) {\n log(` ${DIM} … and ${toolEntries.length - 10} more tools${RESET}`);\n }\n }\n\n // Git commits\n if (r.gitCommits.length > 0) {\n log('');\n log(`${BOLD} Git Commits (${r.gitCommits.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const msg of r.gitCommits) {\n log(` ${GREEN}●${RESET} ${msg.slice(0, 70)}${msg.length > 70 ? '…' : ''}`);\n }\n }\n\n // Files created\n if (r.filesCreated.length > 0) {\n log('');\n log(`${BOLD} Files Created (${r.filesCreated.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const f of r.filesCreated.slice(0, 15)) {\n const short = f.includes(projectName) ? f.split(projectName + '/')[1] ?? f : f;\n log(` ${GREEN}+${RESET} ${short}`);\n }\n if (r.filesCreated.length > 15) {\n log(` ${DIM} … and ${r.filesCreated.length - 15} more${RESET}`);\n }\n }\n\n // Files edited\n if (r.filesEdited.length > 0) {\n log('');\n log(`${BOLD} Files Edited (${r.filesEdited.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const f of r.filesEdited.slice(0, 15)) {\n const short = f.includes(projectName) ? f.split(projectName + '/')[1] ?? f : f;\n log(` ${YELLOW}~${RESET} ${short}`);\n }\n if (r.filesEdited.length > 15) {\n log(` ${DIM} … and ${r.filesEdited.length - 15} more${RESET}`);\n }\n }\n\n // Task completions\n if (r.taskCompletions.length > 0) {\n log('');\n log(`${BOLD} Tasks Completed (${r.taskCompletions.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const t of r.taskCompletions) {\n const lines = t.split('\\n');\n const first = lines[0].slice(0, 70);\n log(` ${GREEN}✔${RESET} ${first}${first.length < lines[0].length ? '…' : ''}`);\n }\n }\n\n // Errors\n if (r.errors.length > 0) {\n log('');\n log(`${BOLD} Errors (${r.errors.length})${RESET}`);\n log(` ${'─'.repeat(58)}`);\n for (const e of r.errors.slice(0, 5)) {\n log(` ${RED}✖${RESET} ${e.slice(0, 70)}`);\n }\n if (r.errors.length > 5) {\n log(` ${DIM} … and ${r.errors.length - 5} more${RESET}`);\n }\n }\n\n log('');\n}\n","/**\n * Reactive data store for the TUI dashboard.\n *\n * All I/O is async (fs.promises, child_process.exec). Data changes emit events\n * so the UI only re-renders the affected panel. Heavy JSONL parsing is chunked\n * via setImmediate to yield the event loop between lines.\n */\nimport { EventEmitter } from 'node:events';\nimport { readFile, readdir, stat } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { exec } from 'node:child_process';\nimport { join, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { AgentType } from './provider.js';\nimport type { Session, SessionReport } from './session.js';\n\nconst SESSION_DIR = join(homedir(), '.copilot', 'session-state');\nconst CLAUDE_PROJECTS_DIR = join(homedir(), '.claude', 'projects');\n\n// ── Async helpers ────────────────────────────────────────────────\n\nfunction execAsync(cmd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n exec(cmd, { encoding: 'utf-8', maxBuffer: 512 * 1024 }, (err, stdout) => {\n if (err) reject(err); else resolve(stdout);\n });\n });\n}\n\nfunction parseSimpleYaml(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const idx = line.indexOf(': ');\n if (idx === -1) continue;\n const key = line.substring(0, idx).trim();\n const value = line.substring(idx + 2).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\n// ── Chunked JSONL parser (yields event loop every 200 lines) ─────\n\nasync function parseJsonlChunked(\n content: string,\n handler: (event: Record<string, unknown>) => void,\n): Promise<void> {\n const lines = content.trimEnd().split('\\n');\n const CHUNK = 200;\n for (let i = 0; i < lines.length; i++) {\n try {\n handler(JSON.parse(lines[i]));\n } catch { /* skip malformed */ }\n // Yield every CHUNK lines so blessed can process key events\n if (i % CHUNK === 0 && i > 0) {\n await new Promise<void>(r => setImmediate(r));\n }\n }\n}\n\n// ── Async session listing ────────────────────────────────────────\n\nasync function readWorkspaceAsync(sid: string): Promise<Record<string, string>> {\n const wsPath = join(SESSION_DIR, sid, 'workspace.yaml');\n try {\n const content = await readFile(wsPath, 'utf-8');\n return parseSimpleYaml(content);\n } catch {\n return {};\n }\n}\n\nasync function listCopilotSessionsAsync(limit: number): Promise<Session[]> {\n if (!existsSync(SESSION_DIR)) return [];\n try {\n const entries = await readdir(SESSION_DIR, { withFileTypes: true });\n const dirs: { id: string; dir: string; mtime: number }[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const dirPath = join(SESSION_DIR, entry.name);\n const eventsPath = join(dirPath, 'events.jsonl');\n if (!existsSync(eventsPath)) continue;\n try {\n const s = await stat(dirPath);\n dirs.push({ id: entry.name, dir: dirPath, mtime: s.mtimeMs });\n } catch { /* skip */ }\n }\n\n dirs.sort((a, b) => b.mtime - a.mtime);\n const top = dirs.slice(0, limit);\n\n return Promise.all(top.map(async (s) => {\n const ws = await readWorkspaceAsync(s.id);\n let premiumRequests = 0;\n let complete = false;\n let lastEvent = 'unknown';\n\n // Only read last 4KB of events.jsonl for metadata (fast!)\n try {\n const evPath = join(SESSION_DIR, s.id, 'events.jsonl');\n const fileStat = await stat(evPath);\n const fullContent = await readFile(evPath, 'utf-8');\n const lines = fullContent.trimEnd().split('\\n');\n\n // Scan last few lines for shutdown/completion\n for (let i = lines.length - 1; i >= Math.max(0, lines.length - 10); i--) {\n try {\n const ev = JSON.parse(lines[i]);\n if (i === lines.length - 1) lastEvent = ev.type ?? 'unknown';\n if (ev.type === 'session.shutdown' && ev.data?.totalPremiumRequests != null) {\n premiumRequests = ev.data.totalPremiumRequests;\n }\n if (ev.type === 'session.task_complete') complete = true;\n } catch { /* skip */ }\n }\n // Fast complete check if not found in tail\n if (!complete && fullContent.includes('\"session.task_complete\"')) complete = true;\n } catch { /* skip */ }\n\n return {\n id: s.id,\n dir: s.dir,\n mtime: s.mtime,\n lastEvent,\n premiumRequests,\n summary: ws.summary ?? '',\n cwd: ws.cwd ?? '',\n complete,\n agent: 'copilot' as AgentType,\n };\n }));\n } catch {\n return [];\n }\n}\n\nasync function listClaudeSessionsAsync(limit: number): Promise<Session[]> {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return [];\n const sessions: Session[] = [];\n try {\n const projectDirs = await readdir(CLAUDE_PROJECTS_DIR, { withFileTypes: true });\n for (const projDir of projectDirs.filter(d => d.isDirectory())) {\n const projPath = join(CLAUDE_PROJECTS_DIR, projDir.name);\n const cwd = projDir.name.replace(/^-/, '/').replace(/-/g, '/');\n const files = (await readdir(projPath)).filter(f => f.endsWith('.jsonl'));\n\n for (const file of files) {\n const filePath = join(projPath, file);\n const sid = basename(file, '.jsonl');\n try {\n const s = await stat(filePath);\n sessions.push({\n id: sid, dir: projPath, mtime: s.mtimeMs,\n lastEvent: 'unknown', premiumRequests: 0,\n summary: '', cwd, complete: false, agent: 'claude',\n });\n } catch { /* skip */ }\n }\n }\n } catch { /* skip */ }\n sessions.sort((a, b) => b.mtime - a.mtime);\n return sessions.slice(0, limit);\n}\n\n// ── Async process listing ────────────────────────────────────────\n\nexport interface ProcessInfo {\n pid: number;\n command: string;\n sessionId?: string;\n cwd?: string;\n agent: AgentType;\n}\n\nasync function findProcessesAsync(): Promise<ProcessInfo[]> {\n try {\n const output = await execAsync('ps -eo pid,command');\n const results: ProcessInfo[] = [];\n const myPid = process.pid;\n const parentPid = process.ppid;\n\n for (const line of output.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const isCopilot = (trimmed.includes('copilot') || trimmed.includes('@githubnext/copilot'))\n && !trimmed.includes('copilot-agent') && !trimmed.includes('copilot-api');\n const isClaude = trimmed.includes('claude') && !trimmed.includes('claude-code')\n && !trimmed.includes('copilot-agent');\n if (!isCopilot && !isClaude) continue;\n if (trimmed.includes('ps -eo') || trimmed.includes('grep')) continue;\n\n const agent: AgentType = isClaude ? 'claude' : 'copilot';\n const match = trimmed.match(/^(\\d+)\\s+(.+)$/);\n if (!match) continue;\n const pid = parseInt(match[1], 10);\n if (pid === myPid || pid === parentPid) continue;\n const cmd = match[2];\n\n const sidMatch = agent === 'copilot'\n ? cmd.match(/resume[= ]+([a-f0-9-]{36})/)\n : cmd.match(/(?:--resume|--session-id)[= ]+([a-f0-9-]{36})/);\n\n results.push({ pid, command: cmd, sessionId: sidMatch?.[1], agent });\n }\n return results;\n } catch {\n return [];\n }\n}\n\n// ── Async session report ─────────────────────────────────────────\n\nasync function loadReportAsync(sid: string, agent: AgentType): Promise<SessionReport | null> {\n if (agent === 'claude') return loadClaudeReportAsync(sid);\n return loadCopilotReportAsync(sid);\n}\n\nasync function loadCopilotReportAsync(sid: string): Promise<SessionReport | null> {\n const eventsPath = join(SESSION_DIR, sid, 'events.jsonl');\n if (!existsSync(eventsPath)) return null;\n\n const ws = await readWorkspaceAsync(sid);\n let content: string;\n try { content = await readFile(eventsPath, 'utf-8'); } catch { return null; }\n\n const report: SessionReport = {\n id: sid, cwd: ws.cwd ?? '', summary: ws.summary ?? '',\n startTime: '', endTime: '', durationMs: 0, complete: false,\n userMessages: 0, assistantTurns: 0, outputTokens: 0, premiumRequests: 0,\n toolUsage: {}, gitCommits: [], filesCreated: [], filesEdited: [],\n errors: [], taskCompletions: [], agent: 'copilot',\n };\n\n await parseJsonlChunked(content, (event) => {\n const type = event.type as string;\n const ts = event.timestamp as string | undefined;\n const data = (event.data ?? {}) as Record<string, unknown>;\n if (ts && !report.startTime) report.startTime = ts;\n if (ts) report.endTime = ts;\n\n switch (type) {\n case 'user.message': report.userMessages++; break;\n case 'assistant.message':\n report.assistantTurns++;\n report.outputTokens += (data.outputTokens as number) ?? 0;\n break;\n case 'tool.execution_start': {\n const toolName = data.toolName as string;\n if (toolName) report.toolUsage[toolName] = (report.toolUsage[toolName] ?? 0) + 1;\n if (toolName === 'bash') {\n const args = data.arguments as Record<string, string> | undefined;\n const cmd = args?.command ?? '';\n if (cmd.includes('git') && cmd.includes('commit') && cmd.includes('-m')) {\n const msgMatch = cmd.match(/-m\\s+\"([^\"]{1,120})/);\n if (msgMatch) report.gitCommits.push(msgMatch[1]);\n }\n }\n if (toolName === 'create') {\n const args = data.arguments as Record<string, string> | undefined;\n if (args?.path) report.filesCreated.push(args.path);\n }\n if (toolName === 'edit') {\n const args = data.arguments as Record<string, string> | undefined;\n if (args?.path && !report.filesEdited.includes(args.path)) report.filesEdited.push(args.path);\n }\n break;\n }\n case 'session.task_complete': {\n report.taskCompletions.push((data.summary as string) ?? '(task completed)');\n report.complete = true;\n break;\n }\n case 'session.error': {\n const msg = data.message as string;\n if (msg) report.errors.push(msg);\n break;\n }\n case 'session.shutdown': {\n const prem = data.totalPremiumRequests as number | undefined;\n if (prem != null) report.premiumRequests = prem;\n break;\n }\n }\n });\n\n if (report.startTime && report.endTime) {\n report.durationMs = new Date(report.endTime).getTime() - new Date(report.startTime).getTime();\n }\n return report;\n}\n\nasync function loadClaudeReportAsync(sid: string): Promise<SessionReport | null> {\n if (!existsSync(CLAUDE_PROJECTS_DIR)) return null;\n let filePath: string | null = null;\n let cwd = '';\n try {\n const projectDirs = await readdir(CLAUDE_PROJECTS_DIR, { withFileTypes: true });\n for (const projDir of projectDirs.filter(d => d.isDirectory())) {\n const candidate = join(CLAUDE_PROJECTS_DIR, projDir.name, `${sid}.jsonl`);\n if (existsSync(candidate)) {\n filePath = candidate;\n cwd = projDir.name.replace(/^-/, '/').replace(/-/g, '/');\n break;\n }\n }\n } catch { /* skip */ }\n if (!filePath) return null;\n\n let content: string;\n try { content = await readFile(filePath, 'utf-8'); } catch { return null; }\n\n const report: SessionReport = {\n id: sid, cwd, summary: '', startTime: '', endTime: '',\n durationMs: 0, complete: false, userMessages: 0, assistantTurns: 0,\n outputTokens: 0, premiumRequests: 0, toolUsage: {}, gitCommits: [],\n filesCreated: [], filesEdited: [], errors: [], taskCompletions: [],\n agent: 'claude',\n };\n\n await parseJsonlChunked(content, (event) => {\n const type = (event.type ?? event.role ?? '') as string;\n const ts = event.timestamp as string | undefined;\n if (ts && !report.startTime) report.startTime = ts;\n if (ts) report.endTime = ts;\n if (type === 'human' || type === 'user') report.userMessages++;\n if (type === 'assistant') {\n report.assistantTurns++;\n if (event.stop_reason === 'end_turn') report.complete = true;\n }\n if (type === 'result') report.complete = true;\n if (type === 'tool_use' || type === 'tool_result') {\n const name = (event.name ?? 'tool') as string;\n report.toolUsage[name] = (report.toolUsage[name] ?? 0) + 1;\n }\n });\n\n if (report.startTime && report.endTime) {\n report.durationMs = new Date(report.endTime).getTime() - new Date(report.startTime).getTime();\n }\n return report;\n}\n\n// ══════════════════════════════════════════════════════════════════\n// REACTIVE DATA STORE\n// ══════════════════════════════════════════════════════════════════\n\nexport type StoreEvent =\n | 'sessions' // session list updated\n | 'processes' // process list updated\n | 'detail'; // detail report ready for a session\n\nexport class DashboardStore extends EventEmitter {\n sessions: Session[] = [];\n processes: ProcessInfo[] = [];\n details = new Map<string, SessionReport | null>();\n\n private limit: number;\n private sessionsTimer: ReturnType<typeof setInterval> | null = null;\n private procsTimer: ReturnType<typeof setInterval> | null = null;\n private detailPending: string | null = null;\n private detailDebounce: ReturnType<typeof setTimeout> | null = null;\n private refreshing = { sessions: false, procs: false, detail: false };\n\n constructor(limit = 20) {\n super();\n this.limit = limit;\n }\n\n // ── Start auto-refresh loops ───────────────────────────────────\n start(sessionIntervalMs = 2000, procsIntervalMs = 3000): void {\n // Initial fetch\n this.refreshSessions();\n this.refreshProcesses();\n\n this.sessionsTimer = setInterval(() => this.refreshSessions(), sessionIntervalMs);\n this.procsTimer = setInterval(() => this.refreshProcesses(), procsIntervalMs);\n }\n\n stop(): void {\n if (this.sessionsTimer) clearInterval(this.sessionsTimer);\n if (this.procsTimer) clearInterval(this.procsTimer);\n if (this.detailDebounce) clearTimeout(this.detailDebounce);\n }\n\n // ── Async session refresh (non-blocking) ───────────────────────\n private async refreshSessions(): Promise<void> {\n if (this.refreshing.sessions) return; // skip if previous still running\n this.refreshing.sessions = true;\n try {\n const [copilot, claude] = await Promise.all([\n listCopilotSessionsAsync(this.limit),\n listClaudeSessionsAsync(this.limit),\n ]);\n const merged = [...copilot, ...claude]\n .sort((a, b) => b.mtime - a.mtime)\n .slice(0, this.limit);\n this.sessions = merged;\n this.emit('sessions');\n } catch { /* keep stale */ }\n this.refreshing.sessions = false;\n }\n\n // ── Async process refresh (non-blocking) ───────────────────────\n private async refreshProcesses(): Promise<void> {\n if (this.refreshing.procs) return;\n this.refreshing.procs = true;\n try {\n this.processes = await findProcessesAsync();\n this.emit('processes');\n } catch { /* keep stale */ }\n this.refreshing.procs = false;\n }\n\n // ── Request detail for a session (debounced 150ms) ─────────────\n requestDetail(sessionId: string, agent: AgentType, force = false): void {\n // If cached and not forced, emit immediately\n if (!force && this.details.has(sessionId)) {\n this.emit('detail', sessionId);\n return;\n }\n\n this.detailPending = sessionId;\n if (this.detailDebounce) clearTimeout(this.detailDebounce);\n this.detailDebounce = setTimeout(() => {\n this.detailDebounce = null;\n // Check if still the same request (user might have moved)\n if (this.detailPending !== sessionId) return;\n this.loadDetail(sessionId, agent);\n }, 150);\n }\n\n // ── Force-load detail immediately (Enter key) ──────────────────\n requestDetailNow(sessionId: string, agent: AgentType): void {\n if (this.detailDebounce) clearTimeout(this.detailDebounce);\n this.detailPending = sessionId;\n this.loadDetail(sessionId, agent);\n }\n\n // ── Async detail loading (non-blocking JSONL parse) ────────────\n private async loadDetail(sessionId: string, agent: AgentType): Promise<void> {\n if (this.refreshing.detail) return;\n this.refreshing.detail = true;\n try {\n const report = await loadReportAsync(sessionId, agent);\n this.details.set(sessionId, report);\n // Evict old entries\n if (this.details.size > 15) {\n const first = this.details.keys().next().value;\n if (first && first !== sessionId) this.details.delete(first);\n }\n this.emit('detail', sessionId);\n } catch { /* skip */ }\n this.refreshing.detail = false;\n }\n\n // ── Force full refresh (r key) ─────────────────────────────────\n forceRefresh(): void {\n this.details.clear();\n this.refreshSessions();\n this.refreshProcesses();\n }\n}\n","import type { AgentType } from '../lib/provider.js';\nimport type { Session, SessionReport } from '../lib/session.js';\n\n// ── Color Theme (matches web dashboard) ──────────────────────────\nexport const THEME = {\n bg: '#0d1117',\n fg: '#e6edf3',\n border: '#30363d',\n borderFocus: '#58a6ff',\n muted: '#8b949e',\n accent: '#58a6ff',\n green: '#3fb950',\n yellow: '#d29922',\n red: '#f85149',\n purple: '#bc8cff',\n cyan: '#58a6ff',\n claude: '#f59e0b',\n copilot: '#58a6ff',\n} as const;\n\nexport function agentColor(agent: AgentType): string {\n return agent === 'claude' ? THEME.claude : THEME.copilot;\n}\n\nexport function agentLabel(agent: AgentType): string {\n return agent === 'claude' ? '{yellow-fg}claude{/}' : '{cyan-fg}copilot{/}';\n}\n\nexport function statusIcon(complete: boolean): string {\n return complete ? '{green-fg}✔{/}' : '{yellow-fg}⏳{/}';\n}\n\n// ── Duration formatting ──────────────────────────────────────────\nexport function fmtDuration(ms: number): string {\n if (ms < 0) return '—';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\nexport function fmtTimeAgo(mtimeMs: number): string {\n const diff = Date.now() - mtimeMs;\n if (diff < 60_000) return 'just now';\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;\n return `${Math.floor(diff / 86_400_000)}d ago`;\n}\n\nexport function fmtNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\n// ── Bar chart (text-based) ───────────────────────────────────────\nexport function textBar(value: number, max: number, width: number): string {\n if (max <= 0) return '░'.repeat(width);\n const filled = Math.round((value / max) * width);\n return '█'.repeat(Math.min(filled, width)) + '░'.repeat(Math.max(width - filled, 0));\n}\n\n// ── Build session list rows for blessed list ─────────────────────\nexport function sessionRow(s: Session): string {\n const icon = statusIcon(s.complete);\n const agent = agentLabel(s.agent);\n const name = (s.cwd?.split('/').pop() || s.id.slice(0, 8)).slice(0, 16).padEnd(16);\n const summary = (s.summary || '—').slice(0, 30).padEnd(30);\n const time = fmtTimeAgo(s.mtime).padStart(8);\n const prem = s.premiumRequests > 0 ? `{yellow-fg}⬡${s.premiumRequests}{/}` : '';\n return ` ${icon} ${agent} ${name} ${summary} ${time} ${prem}`;\n}\n\n// ── Build tool usage bars for detail panel ───────────────────────\nexport function toolBars(toolUsage: Record<string, number>, maxWidth: number = 20): string[] {\n const entries = Object.entries(toolUsage).sort((a, b) => b[1] - a[1]).slice(0, 10);\n if (entries.length === 0) return [' {gray-fg}No tools used{/}'];\n const maxVal = entries[0][1];\n return entries.map(([name, count]) => {\n const label = name.slice(0, 12).padEnd(12);\n const bar = textBar(count, maxVal, maxWidth);\n return ` ${label} {cyan-fg}${bar}{/} ${count}`;\n });\n}\n\n// ── Process table rows ───────────────────────────────────────────\nexport interface ProcessInfo {\n pid: number;\n command: string;\n sessionId?: string;\n cwd?: string;\n agent: AgentType;\n}\n\nexport function processRow(p: ProcessInfo): string {\n const pid = String(p.pid).padEnd(7);\n const agent = agentLabel(p.agent);\n const sid = (p.sessionId || '—').slice(0, 20).padEnd(20);\n const cwd = (p.cwd || '—').replace(/^\\/Users\\/\\w+/, '~').slice(0, 30).padEnd(30);\n return ` ${pid} ${agent} ${sid} ${cwd} {green-fg}running{/}`;\n}\n\n// ── Detail panel content ─────────────────────────────────────────\nexport function detailContent(r: SessionReport): string {\n const lines: string[] = [];\n\n // Header\n const project = r.cwd?.split('/').pop() || 'unknown';\n lines.push(`{bold}${project}{/} ${agentLabel(r.agent)}`);\n lines.push(`{gray-fg}${r.id}{/}`);\n lines.push('');\n\n // Stats\n lines.push('{bold}─── Stats ──────────────────────{/}');\n lines.push(` Duration ${fmtDuration(r.durationMs)}`);\n lines.push(` Messages ${r.userMessages}`);\n lines.push(` Turns ${r.assistantTurns}`);\n lines.push(` Tokens ${fmtNumber(r.outputTokens)}`);\n lines.push(` Premium {yellow-fg}${r.premiumRequests}{/}`);\n lines.push(` Status ${r.complete ? '{green-fg}complete{/}' : '{yellow-fg}incomplete{/}'}`);\n lines.push('');\n\n // Tools\n if (Object.keys(r.toolUsage).length > 0) {\n lines.push('{bold}─── Tools ──────────────────────{/}');\n lines.push(...toolBars(r.toolUsage, 16));\n lines.push('');\n }\n\n // Commits\n if (r.gitCommits.length > 0) {\n lines.push('{bold}─── Commits ────────────────────{/}');\n for (const c of r.gitCommits.slice(0, 8)) {\n lines.push(` {green-fg}●{/} ${c.slice(0, 50)}`);\n }\n if (r.gitCommits.length > 8) lines.push(` {gray-fg}... +${r.gitCommits.length - 8} more{/}`);\n lines.push('');\n }\n\n // Files\n const allFiles = [...r.filesCreated.map(f => `{green-fg}+{/} ${f}`), ...r.filesEdited.map(f => `{yellow-fg}~{/} ${f}`)];\n if (allFiles.length > 0) {\n lines.push('{bold}─── Files ──────────────────────{/}');\n for (const f of allFiles.slice(0, 10)) {\n lines.push(` ${f.length > 50 ? f.slice(0, 50) + '…' : f}`);\n }\n if (allFiles.length > 10) lines.push(` {gray-fg}... +${allFiles.length - 10} more{/}`);\n lines.push('');\n }\n\n // Tasks\n if (r.taskCompletions.length > 0) {\n lines.push('{bold}─── Tasks ──────────────────────{/}');\n for (const t of r.taskCompletions.slice(0, 5)) {\n lines.push(` {green-fg}✔{/} ${t.slice(0, 50)}`);\n }\n lines.push('');\n }\n\n // Errors\n if (r.errors.length > 0) {\n lines.push('{bold}{red-fg}─── Errors ─────────────────────{/}');\n for (const e of r.errors.slice(0, 3)) {\n lines.push(` {red-fg}✗{/} ${e.slice(0, 60)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n// ── Header stats line ────────────────────────────────────────────\nexport function headerStats(processCount: number, sessionCount: number, totalPremium: number, completedCount: number): string {\n return ` {bold}Processes:{/} {green-fg}${processCount}{/} {bold}Sessions:{/} ${sessionCount} {bold}Premium:{/} {yellow-fg}⬡${totalPremium}{/} {bold}Done:{/} {green-fg}${completedCount}{/}/${sessionCount}`;\n}\n","import type { Command } from 'commander';\nimport type { Session, SessionReport } from '../lib/session.js';\nimport { DashboardStore, type ProcessInfo } from '../lib/reactive.js';\nimport {\n agentLabel, statusIcon, fmtDuration, fmtTimeAgo, fmtNumber,\n textBar, sessionRow, processRow, detailContent, headerStats,\n toolBars,\n} from '../tui/widgets.js';\n\n// ── blessed dynamic import (CJS module) ──────────────────────────\nlet blessed: any;\nasync function loadBlessed() {\n const mod = await import('blessed');\n blessed = mod.default || mod;\n}\n\nexport function registerDashboardCommand(program: Command): void {\n program\n .command('dashboard')\n .alias('tui')\n .description('Real-time terminal dashboard for copilot sessions (htop-style)')\n .option('-r, --refresh <n>', 'Session refresh interval in seconds', '2')\n .option('-l, --limit <n>', 'Number of sessions to show', '20')\n .action(async (opts) => {\n await loadBlessed();\n runReactiveDashboard(parseInt(opts.refresh, 10), parseInt(opts.limit, 10));\n });\n}\n\n// ══════════════════════════════════════════════════════════════════\n// REACTIVE BLESSED DASHBOARD\n// ══════════════════════════════════════════════════════════════════\n\nfunction runReactiveDashboard(refreshSec: number, limit: number): void {\n // ── Reactive data store (all I/O is async) ─────────────────────\n const store = new DashboardStore(limit);\n\n // Workaround: blessed can't parse Setulc capability in xterm-256color terminfo.\n const origTerm = process.env.TERM;\n if (origTerm?.includes('256color')) {\n process.env.TERM = 'xterm';\n }\n\n const screen = blessed.screen({\n smartCSR: true,\n title: 'copilot-agent dashboard',\n fullUnicode: true,\n });\n\n if (origTerm) process.env.TERM = origTerm;\n\n // ── Color constants ────────────────────────────────────────────\n const BG = '#0d1117';\n const FG = '#e6edf3';\n const BORDER_COLOR = '#30363d';\n const ACCENT = '#58a6ff';\n const MUTED = '#8b949e';\n\n // ── Header bar ─────────────────────────────────────────────────\n const headerBox = blessed.box({\n parent: screen,\n top: 0, left: 0, width: '100%', height: 3,\n tags: true,\n style: { fg: FG, bg: '#161b22', border: { fg: BORDER_COLOR } },\n border: { type: 'line' },\n });\n\n // ── Process panel ──────────────────────────────────────────────\n const processBox = blessed.box({\n parent: screen,\n top: 3, left: 0, width: '100%', height: 7,\n tags: true,\n label: ' {cyan-fg}{bold}Active Processes{/} ',\n scrollable: true,\n style: { fg: FG, bg: BG, border: { fg: BORDER_COLOR }, label: { fg: ACCENT } },\n border: { type: 'line' },\n });\n\n // ── Session list (left) ────────────────────────────────────────\n const sessionList = blessed.list({\n parent: screen,\n top: 10, left: 0, width: '45%', bottom: 3,\n tags: true,\n label: ' {cyan-fg}{bold}Sessions{/} ',\n scrollable: true, keys: true, vi: true, mouse: true,\n style: {\n fg: FG, bg: BG,\n border: { fg: BORDER_COLOR }, label: { fg: ACCENT },\n selected: { fg: '#ffffff', bg: '#1f6feb', bold: true },\n item: { fg: FG },\n },\n border: { type: 'line' },\n scrollbar: { ch: '│', style: { fg: ACCENT } },\n });\n\n // ── Detail panel (right) ───────────────────────────────────────\n const detailBox = blessed.box({\n parent: screen,\n top: 10, left: '45%', width: '55%', bottom: 3,\n tags: true,\n label: ' {cyan-fg}{bold}Detail{/} ',\n scrollable: true, keys: true, vi: true, mouse: true,\n style: { fg: FG, bg: BG, border: { fg: BORDER_COLOR }, label: { fg: ACCENT } },\n border: { type: 'line' },\n scrollbar: { ch: '│', style: { fg: ACCENT } },\n content: '{gray-fg}Select a session with ↑↓ keys{/}',\n });\n\n // ── Footer ─────────────────────────────────────────────────────\n blessed.box({\n parent: screen,\n bottom: 0, left: 0, width: '100%', height: 3,\n tags: true,\n style: { fg: MUTED, bg: '#161b22', border: { fg: BORDER_COLOR } },\n border: { type: 'line' },\n content: ' {bold}↑↓{/} Navigate {bold}Enter{/} Detail {bold}Tab{/} Switch panel {bold}r{/} Refresh {bold}q{/} Quit',\n });\n\n // ── UI State ───────────────────────────────────────────────────\n let selectedIdx = 0;\n let focusedPanel: 'sessions' | 'detail' = 'sessions';\n\n // ── Render helpers (pure formatting, no I/O) ───────────────────\n\n function renderHeader(): void {\n const time = new Date().toLocaleTimeString('en-GB');\n const sessions = store.sessions;\n const totalPremium = sessions.reduce((s, x) => s + x.premiumRequests, 0);\n const completedCount = sessions.filter(s => s.complete).length;\n const stats = headerStats(store.processes.length, sessions.length, totalPremium, completedCount);\n headerBox.setContent(` {bold}{cyan-fg}⚡ copilot-agent{/} ${stats} {gray-fg}${time}{/}`);\n }\n\n function renderProcesses(): void {\n const procs = store.processes;\n if (procs.length === 0) {\n processBox.setContent(' {gray-fg}No agent processes running{/}');\n return;\n }\n const header = ` ${'PID'.padEnd(7)} ${'Agent'.padEnd(10)} ${'Session'.padEnd(20)} ${'Directory'.padEnd(30)} Status`;\n const rows = procs.map(p => processRow(p as any));\n processBox.setContent(`{gray-fg}${header}{/}\\n${rows.join('\\n')}`);\n }\n\n function renderSessions(): void {\n const items = store.sessions.map(s => sessionRow(s));\n sessionList.setItems(items);\n if (selectedIdx >= 0 && selectedIdx < items.length) {\n sessionList.select(selectedIdx);\n }\n sessionList.setLabel(` {cyan-fg}{bold}Sessions (${store.sessions.length}){/} `);\n }\n\n function showQuickPreview(s: Session): void {\n const project = s.cwd?.split('/').pop() || s.id.slice(0, 12);\n const agent = s.agent === 'claude' ? '{yellow-fg}claude{/}' : '{cyan-fg}copilot{/}';\n const status = s.complete ? '{green-fg}✔ complete{/}' : '{yellow-fg}⏳ incomplete{/}';\n detailBox.setContent([\n `{bold}${project}{/} ${agent}`,\n `{gray-fg}${s.id}{/}`,\n '',\n ` Status ${status}`,\n ` Premium {yellow-fg}${s.premiumRequests}{/}`,\n ` Activity ${fmtTimeAgo(s.mtime)}`,\n ` Directory {gray-fg}${s.cwd || '—'}{/}`,\n '',\n '{gray-fg}Loading…{/}',\n ].join('\\n'));\n detailBox.setLabel(` {cyan-fg}{bold}Detail — ${s.id.slice(0, 12)}…{/} `);\n }\n\n // ── Subscribe to store events (reactive rendering) ─────────────\n\n store.on('sessions', () => {\n renderHeader();\n renderSessions();\n // Request detail for currently selected session\n const s = store.sessions[selectedIdx];\n if (s) store.requestDetail(s.id, s.agent);\n screen.render();\n });\n\n store.on('processes', () => {\n renderHeader();\n renderProcesses();\n screen.render();\n });\n\n store.on('detail', (sessionId: string) => {\n // Only update detail panel if it's still the selected session\n const currentSession = store.sessions[selectedIdx];\n if (!currentSession || currentSession.id !== sessionId) return;\n const report = store.details.get(sessionId);\n if (report) {\n detailBox.setContent(detailContent(report));\n detailBox.setLabel(` {cyan-fg}{bold}Detail — ${sessionId.slice(0, 12)}…{/} `);\n } else {\n detailBox.setContent(`{gray-fg}No report data for ${sessionId.slice(0, 8)}…{/}`);\n }\n screen.render();\n });\n\n // Clock update (header only — very cheap)\n const clockTimer = setInterval(() => {\n renderHeader();\n screen.render();\n }, 5000);\n\n // ── Keyboard (only UI state changes, no I/O) ──────────────────\n\n screen.key(['q', 'C-c'], () => {\n store.stop();\n clearInterval(clockTimer);\n screen.destroy();\n process.exit(0);\n });\n\n screen.key(['r'], () => store.forceRefresh());\n\n screen.key(['tab'], () => {\n if (focusedPanel === 'sessions') {\n focusedPanel = 'detail';\n detailBox.focus();\n sessionList.style.border.fg = BORDER_COLOR;\n detailBox.style.border.fg = ACCENT;\n } else {\n focusedPanel = 'sessions';\n sessionList.focus();\n sessionList.style.border.fg = ACCENT;\n detailBox.style.border.fg = BORDER_COLOR;\n }\n screen.render();\n });\n\n // Arrow keys: instant list update + async detail request\n function onNavigate(): void {\n sessionList.select(selectedIdx);\n const s = store.sessions[selectedIdx];\n if (s) {\n // Show cached report instantly, or quick preview + async load\n const cached = store.details.get(s.id);\n if (cached) {\n detailBox.setContent(detailContent(cached));\n detailBox.setLabel(` {cyan-fg}{bold}Detail — ${s.id.slice(0, 12)}…{/} `);\n } else {\n showQuickPreview(s);\n }\n store.requestDetail(s.id, s.agent);\n }\n screen.render();\n }\n\n sessionList.on('select item', (_item: any, index: number) => {\n selectedIdx = index;\n onNavigate();\n });\n\n sessionList.key(['up', 'k'], () => {\n if (selectedIdx > 0) { selectedIdx--; onNavigate(); }\n });\n\n sessionList.key(['down', 'j'], () => {\n if (selectedIdx < store.sessions.length - 1) { selectedIdx++; onNavigate(); }\n });\n\n sessionList.key(['enter'], () => {\n const s = store.sessions[selectedIdx];\n if (s) store.requestDetailNow(s.id, s.agent);\n focusedPanel = 'detail';\n detailBox.focus();\n sessionList.style.border.fg = BORDER_COLOR;\n detailBox.style.border.fg = ACCENT;\n screen.render();\n });\n\n // ── Start reactive data loops ──────────────────────────────────\n sessionList.focus();\n sessionList.style.border.fg = ACCENT;\n store.start(refreshSec * 1000, 3000);\n}\n","import type { Command } from 'commander';\nimport { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { serve } from '@hono/node-server';\nimport { spawn } from 'node:child_process';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport { findAgentProcesses } from '../lib/process.js';\nimport { ok, info, fail } from '../lib/logger.js';\nimport { layoutHead, layoutFoot } from '../web/layout.js';\nimport { renderStats, renderProcesses, renderSessionList, renderDetail } from '../web/views.js';\n\nexport function registerWebCommand(program: Command): void {\n program\n .command('web')\n .description('Launch web dashboard in browser')\n .option('-p, --port <n>', 'Port number', '3847')\n .option('--no-open', 'Do not auto-open browser')\n .action((opts) => {\n startWebServer(parseInt(opts.port, 10), opts.open !== false);\n });\n}\n\nfunction getData() {\n const sessions = listAllSessions(20);\n const reports = sessions.map(s => getAgentSessionReport(s.id, s.agent)).filter(r => r !== null);\n const processes = findAgentProcesses();\n return { sessions: reports, processes };\n}\n\nfunction simpleHash(s: string): string {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = ((h << 5) - h + s.charCodeAt(i)) | 0;\n }\n return h.toString(36);\n}\n\nfunction startWebServer(port: number, autoOpen: boolean): void {\n const app = new Hono();\n\n // ─── JSON API ────────────────────────────────────────\n app.get('/api/sessions', (c) => c.json(getData()));\n\n app.get('/api/session/:id', (c) => {\n const report = getAgentSessionReport(c.req.param('id'));\n if (!report) return c.json({ error: 'Not found' }, 404);\n return c.json(report);\n });\n\n // ─── SSE for live updates (only push when data changes) ──\n app.get('/events', (c) => {\n return streamSSE(c, async (stream) => {\n let prevStatsHash = '';\n let prevProcsHash = '';\n\n while (true) {\n const { sessions, processes } = getData();\n\n const statsHtml = renderStats(sessions);\n const procsHtml = renderProcesses(processes);\n const statsHash = simpleHash(statsHtml);\n const procsHash = simpleHash(procsHtml);\n\n if (statsHash !== prevStatsHash) {\n await stream.writeSSE({ event: 'stats', data: statsHtml });\n prevStatsHash = statsHash;\n }\n if (procsHash !== prevProcsHash) {\n await stream.writeSSE({ event: 'procs', data: procsHtml });\n await stream.writeSSE({ event: 'proc-count', data: String(processes.length) });\n prevProcsHash = procsHash;\n }\n\n await stream.sleep(5000);\n }\n });\n });\n\n // ─── htmx Partials ──────────────────────────────────\n app.get('/partial/detail/:id', (c) => {\n const report = getAgentSessionReport(c.req.param('id'));\n if (!report) return c.html('<div class=\"empty-detail\">Session not found</div>');\n return c.html(renderDetail(report));\n });\n\n // ─── Main page ──────────────────────────────────────\n app.get('/', (c) => {\n const { sessions, processes } = getData();\n const firstId = sessions[0]?.id;\n\n return c.html(`${layoutHead}\n<body>\n <div class=\"header\">\n <div class=\"header-left\">\n <h1>🤖 <span>Copilot Agent</span></h1>\n <div class=\"live-badge\"><div class=\"live-dot\"></div> Live</div>\n </div>\n <div class=\"clock\" id=\"clock\"></div>\n </div>\n\n <div class=\"container\"\n hx-ext=\"sse\"\n sse-connect=\"/events\">\n\n <div class=\"stats\"\n sse-swap=\"stats\"\n hx-swap=\"innerHTML settle:0s swap:0s\">\n ${renderStats(sessions)}\n </div>\n\n <div class=\"procs\">\n <div class=\"procs-header\">\n ⬤ Active Processes <span class=\"count\" sse-swap=\"proc-count\" hx-swap=\"innerHTML settle:0s swap:0s\">${processes.length}</span>\n </div>\n <div class=\"procs-body\"\n sse-swap=\"procs\"\n hx-swap=\"innerHTML settle:0s swap:0s\">\n ${renderProcesses(processes)}\n </div>\n </div>\n\n <div class=\"main\">\n <div class=\"sidebar\">\n <div class=\"sidebar-header\">\n 📋 Sessions <span class=\"count\">${sessions.length}</span>\n </div>\n ${renderSessionList(sessions, firstId)}\n </div>\n <div class=\"detail\" id=\"detail\">\n ${firstId ? renderDetail(sessions[0]) : '<div class=\"empty-detail\">No sessions</div>'}\n </div>\n </div>\n </div>\n\n <script>\n setInterval(() => {\n document.getElementById('clock').textContent = new Date().toLocaleTimeString('en-GB');\n }, 1000);\n document.getElementById('clock').textContent = new Date().toLocaleTimeString('en-GB');\n </script>\n</body>\n${layoutFoot}`);\n });\n\n // ─── Start server ───────────────────────────────────\n try {\n serve({ fetch: app.fetch, port }, () => {\n const url = `http://localhost:${port}`;\n ok(`Web dashboard → ${url}`);\n info('Press Ctrl+C to stop');\n if (autoOpen) {\n spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();\n }\n });\n } catch (err) {\n fail(`Server error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n}\n","const cssStyles = `\n*{margin:0;padding:0;box-sizing:border-box}\n:root{\n --bg:#0d1117;--bg2:#161b22;--bg3:#21262d;--bg4:#292e36;\n --border:#30363d;--border2:#3d444d;\n --text:#e6edf3;--text2:#8b949e;--text3:#484f58;\n --cyan:#58a6ff;--green:#3fb950;--yellow:#d29922;--red:#f85149;--purple:#bc8cff;--orange:#f0883e;\n --font-sans:'Inter',system-ui,sans-serif;\n --font-mono:'JetBrains Mono','SF Mono',monospace;\n --radius:8px;\n}\nbody{background:var(--bg);color:var(--text);font-family:var(--font-sans);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}\n.header{background:var(--bg2);border-bottom:1px solid var(--border);padding:12px 24px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:10;backdrop-filter:blur(12px)}\n.header-left{display:flex;align-items:center;gap:10px}\n.header-left h1{font-size:16px;font-weight:600}\n.header-left h1 span{color:var(--cyan)}\n.live-badge{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--green);background:rgba(63,185,80,.1);padding:3px 10px;border-radius:12px;font-weight:500}\n.live-dot{width:6px;height:6px;border-radius:50%;background:var(--green);animation:pulse 2s infinite}\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}\n.clock{font-family:var(--font-mono);font-size:13px;color:var(--text2)}\n.container{max-width:1280px;margin:0 auto;padding:16px 20px}\n.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;margin-bottom:16px}\n.stat{background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;transition:border-color .2s}\n.stat:hover{border-color:var(--border2)}\n.stat-label{font-size:11px;font-weight:500;color:var(--text2);text-transform:uppercase;letter-spacing:.4px}\n.stat-value{font-size:22px;font-weight:700;font-family:var(--font-mono);margin-top:2px}\n.stat-value.green{color:var(--green)}.stat-value.cyan{color:var(--cyan)}\n.stat-value.yellow{color:var(--yellow)}.stat-value.purple{color:var(--purple)}\n.procs{background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:16px;overflow:hidden}\n.procs-header{padding:10px 16px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}\n.procs-body{padding:4px 0}\n.proc{padding:6px 16px;display:flex;align-items:center;gap:10px;font-size:13px}\n.proc-dot{width:6px;height:6px;border-radius:50%;background:var(--green);flex-shrink:0}\n.proc-pid{font-family:var(--font-mono);color:var(--cyan);font-weight:500;min-width:70px}\n.proc-sid{color:var(--text2);font-family:var(--font-mono);font-size:12px}\n.proc-cwd{color:var(--text3);font-size:12px}\n.empty{padding:14px 16px;color:var(--text3);font-size:13px}\n.main{display:grid;grid-template-columns:360px 1fr;gap:0;background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;min-height:calc(100vh - 260px)}\n.sidebar{border-right:1px solid var(--border);overflow-y:auto}\n.sidebar-header{padding:10px 16px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;position:sticky;top:0;background:var(--bg2);z-index:2}\n.count{background:var(--bg3);color:var(--text2);font-size:11px;padding:1px 7px;border-radius:10px;font-weight:500}\n.s-item{padding:10px 16px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .15s}\n.s-item:last-child{border-bottom:none}\n.s-item:hover{background:var(--bg3)}\n.s-item.active{background:rgba(88,166,255,.06);border-left:3px solid var(--cyan);padding-left:13px}\n.s-row{display:flex;align-items:center;gap:10px}\n.s-icon{font-size:14px;flex-shrink:0}\n.s-info{flex:1;min-width:0}\n.s-title{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.s-meta{font-size:11px;color:var(--text2);display:flex;gap:10px;margin-top:2px;flex-wrap:wrap}\n.badge{font-size:10px;padding:1px 6px;border-radius:4px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase}\n.badge-done{background:rgba(63,185,80,.12);color:var(--green)}\n.badge-stop{background:rgba(210,153,34,.12);color:var(--yellow)}\n.badge-claude{background:rgba(217,119,6,.15);color:#f59e0b}\n.badge-copilot{background:rgba(56,189,248,.12);color:#38bdf8}\n.detail{padding:20px;overflow-y:auto}\n.detail-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}\n.detail-title{font-size:18px;font-weight:700}\n.detail-id{font-family:var(--font-mono);font-size:11px;color:var(--text3);background:var(--bg);padding:3px 8px;border-radius:4px}\n.detail-time{font-size:12px;color:var(--text2);margin-bottom:16px}\n.detail-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px;margin-bottom:20px}\n.d-stat{background:var(--bg);border-radius:6px;padding:10px}\n.d-stat-label{font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:.3px}\n.d-stat-val{font-size:16px;font-weight:700;font-family:var(--font-mono);margin-top:1px}\n.sub{margin-top:20px}\n.sub-title{font-size:12px;font-weight:600;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;display:flex;align-items:center;gap:6px}\n.tool-row{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:12px}\n.tool-name{color:var(--text2);min-width:110px;text-align:right;font-family:var(--font-mono);font-size:11px}\n.tool-bar-bg{flex:1;background:var(--bg);border-radius:3px;height:14px;overflow:hidden}\n.tool-bar{height:100%;border-radius:3px;background:linear-gradient(90deg,var(--cyan),var(--purple));opacity:.7;transition:width .4s ease}\n.tool-count{font-family:var(--font-mono);color:var(--text2);min-width:40px;font-size:11px}\n.commit-list,.task-list,.file-list,.error-list{list-style:none}\n.commit-list li,.task-list li{padding:5px 0;font-size:13px;display:flex;align-items:flex-start;gap:6px;border-bottom:1px solid var(--border)}\n.commit-list li:last-child,.task-list li:last-child{border-bottom:none}\n.c-dot{color:var(--green);flex-shrink:0;margin-top:2px}\n.t-check{color:var(--green);flex-shrink:0;margin-top:2px}\n.file-list li{padding:2px 0;font-size:11px;font-family:var(--font-mono)}\n.file-created{color:var(--green)}\n.file-edited{color:var(--yellow)}\n.error-list li{padding:5px 0;font-size:12px;color:var(--red)}\n.more{font-size:11px;color:var(--text3);padding:4px 0}\n.empty-detail{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text3)}\n@media(max-width:768px){.main{grid-template-columns:1fr}.stats{grid-template-columns:repeat(2,1fr)}}\n`;\n\nexport const layoutHead = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Copilot Agent Dashboard</title>\n<script src=\"https://unpkg.com/htmx.org@2.0.4\" integrity=\"sha384-HGfztofotfshcF7+8n44JQL2oJmowVChPTg48S+jvZoztPfvwD79OC/LTtG6dMp+\" crossorigin=\"anonymous\"></script>\n<script src=\"https://unpkg.com/htmx-ext-sse@2.2.2/sse.js\"></script>\n<script defer src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js\"></script>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n<style>\n${cssStyles}\n</style>\n</head>`;\n\nexport const layoutFoot = `</html>`;\n","import type { SessionReport } from '../lib/session.js';\nimport type { CopilotProcess } from '../lib/process.js';\n\n// ─── Helpers ───────────────────────────────────────────────\nfunction esc(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction fmt(n: number): string {\n return n.toLocaleString();\n}\n\nfunction fmtDur(ms: number): string {\n if (!ms) return '—';\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n\nfunction fmtTime(iso: string): string {\n if (!iso) return '—';\n return new Date(iso).toLocaleString('en-GB', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });\n}\n\nfunction fmtAgo(iso: string): string {\n if (!iso) return '—';\n const diff = Date.now() - new Date(iso).getTime();\n if (diff < 60_000) return 'just now';\n if (diff < 3_600_000) return `${Math.round(diff / 60_000)}m ago`;\n if (diff < 86_400_000) return `${Math.round(diff / 3_600_000)}h ago`;\n return `${Math.round(diff / 86_400_000)}d ago`;\n}\n\nfunction shortPath(p: string, proj: string): string {\n if (proj && p.includes(proj + '/')) return p.split(proj + '/').pop() ?? p;\n return p.split('/').slice(-3).join('/');\n}\n\n// ─── Stats Bar ─────────────────────────────────────────────\nexport function renderStats(sessions: SessionReport[]): string {\n const totalPremium = sessions.reduce((a, s) => a + (s.premiumRequests ?? 0), 0);\n const totalTokens = sessions.reduce((a, s) => a + (s.outputTokens ?? 0), 0);\n const totalCommits = sessions.reduce((a, s) => a + (s.gitCommits?.length ?? 0), 0);\n const totalTasks = sessions.reduce((a, s) => a + (s.taskCompletions?.length ?? 0), 0);\n const completed = sessions.filter(s => s.complete).length;\n\n const items = [\n { label: 'Sessions', value: String(sessions.length), cls: 'cyan' },\n { label: 'Completed', value: `${completed}/${sessions.length}`, cls: 'green' },\n { label: 'Premium', value: fmt(totalPremium), cls: 'yellow' },\n { label: 'Tokens', value: fmt(totalTokens), cls: 'purple' },\n { label: 'Commits', value: String(totalCommits), cls: 'green' },\n { label: 'Tasks Done', value: String(totalTasks), cls: 'cyan' },\n ];\n\n return items.map(i =>\n `<div class=\"stat\"><div class=\"stat-label\">${i.label}</div><div class=\"stat-value ${i.cls}\">${i.value}</div></div>`\n ).join('');\n}\n\n// ─── Process List ──────────────────────────────────────────\nexport function renderProcesses(procs: CopilotProcess[]): string {\n if (procs.length === 0) return '<div class=\"empty\">No active agent processes</div>';\n return procs.map(p => {\n const sid = p.sessionId ? p.sessionId.slice(0, 8) + '…' : '—';\n const agentBadge = p.agent === 'claude'\n ? '<span class=\"badge badge-claude\">claude</span>'\n : '<span class=\"badge badge-copilot\">copilot</span>';\n return `<div class=\"proc\">\n <div class=\"proc-dot\"></div>\n ${agentBadge}\n <span class=\"proc-pid\">PID ${p.pid}</span>\n <span class=\"proc-sid\">${esc(sid)}</span>\n <span class=\"proc-cwd\">${esc(p.cwd ?? '')}</span>\n </div>`;\n }).join('');\n}\n\n// ─── Session List ──────────────────────────────────────────\nexport function renderSessionList(sessions: SessionReport[], selectedId?: string): string {\n return sessions.map(s => {\n const proj = (s.cwd ?? '').split('/').pop() ?? '—';\n const isActive = s.id === selectedId;\n const agentBadge = s.agent === 'claude'\n ? '<span class=\"badge badge-claude\">claude</span>'\n : '<span class=\"badge badge-copilot\">copilot</span>';\n return `<div class=\"s-item${isActive ? ' active' : ''}\"\n hx-get=\"/partial/detail/${s.id}\" hx-target=\"#detail\" hx-swap=\"innerHTML\"\n onclick=\"document.querySelectorAll('.s-item').forEach(e=>e.classList.remove('active'));this.classList.add('active')\">\n <div class=\"s-row\">\n <span class=\"s-icon\">${s.complete ? '✅' : '⏸️'}</span>\n <div class=\"s-info\">\n <div class=\"s-title\">${agentBadge} ${esc(proj)} — ${esc(s.summary || '(no summary)')}</div>\n <div class=\"s-meta\">\n <span>${fmtDur(s.durationMs)}</span>\n <span>${s.agent === 'claude' ? '' : fmt(s.premiumRequests) + ' premium'}</span>\n <span>${fmtAgo(s.endTime)}</span>\n <span class=\"badge ${s.complete ? 'badge-done' : 'badge-stop'}\">${s.complete ? 'done' : 'stopped'}</span>\n </div>\n </div>\n </div>\n </div>`;\n }).join('');\n}\n\n// ─── Session Detail ────────────────────────────────────────\nexport function renderDetail(s: SessionReport): string {\n const proj = (s.cwd ?? '').split('/').pop() ?? '—';\n const totalTools = Object.values(s.toolUsage ?? {}).reduce((a, b) => a + b, 0);\n const toolEntries = Object.entries(s.toolUsage ?? {}).sort((a, b) => b[1] - a[1]);\n const maxTool = toolEntries[0]?.[1] ?? 1;\n\n let html = '';\n\n const agentBadge = s.agent === 'claude'\n ? '<span class=\"badge badge-claude\" style=\"margin-left:8px\">claude</span>'\n : '<span class=\"badge badge-copilot\" style=\"margin-left:8px\">copilot</span>';\n\n // Header\n html += `<div class=\"detail-head\">\n <div class=\"detail-title\">${esc(proj)}${agentBadge}</div>\n <div class=\"detail-id\">${s.id}</div>\n </div>`;\n\n html += `<div class=\"detail-time\">${fmtTime(s.startTime)} → ${fmtTime(s.endTime)}</div>`;\n\n // Stats grid\n html += `<div class=\"detail-stats\">\n <div class=\"d-stat\"><div class=\"d-stat-label\">Duration</div><div class=\"d-stat-val\">${fmtDur(s.durationMs)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">User Msgs</div><div class=\"d-stat-val\">${s.userMessages}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Turns</div><div class=\"d-stat-val\">${fmt(s.assistantTurns)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Tokens</div><div class=\"d-stat-val\">${fmt(s.outputTokens)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Premium</div><div class=\"d-stat-val\">${fmt(s.premiumRequests)}</div></div>\n <div class=\"d-stat\"><div class=\"d-stat-label\">Tool Calls</div><div class=\"d-stat-val\">${fmt(totalTools)}</div></div>\n </div>`;\n\n // Tools chart\n if (toolEntries.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">🔧 Tools Used</div>`;\n for (const [tool, count] of toolEntries.slice(0, 12)) {\n const pct = Math.round((count / maxTool) * 100);\n html += `<div class=\"tool-row\">\n <span class=\"tool-name\">${esc(tool)}</span>\n <div class=\"tool-bar-bg\"><div class=\"tool-bar\" style=\"width:${pct}%\"></div></div>\n <span class=\"tool-count\">${count}</span>\n </div>`;\n }\n if (toolEntries.length > 12) html += `<div class=\"more\">… +${toolEntries.length - 12} more</div>`;\n html += `</div>`;\n }\n\n // Git commits\n if (s.gitCommits.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">🔀 Git Commits <span class=\"count\">${s.gitCommits.length}</span></div><ul class=\"commit-list\">`;\n for (const msg of s.gitCommits.slice(0, 12)) {\n const first = msg.split('\\n')[0].slice(0, 80);\n html += `<li><span class=\"c-dot\">●</span><span>${esc(first)}</span></li>`;\n }\n if (s.gitCommits.length > 12) html += `<li class=\"more\">… +${s.gitCommits.length - 12} more</li>`;\n html += `</ul></div>`;\n }\n\n // Files\n const files = [\n ...s.filesCreated.map(f => ({ path: f, type: 'created' as const })),\n ...s.filesEdited.map(f => ({ path: f, type: 'edited' as const })),\n ];\n if (files.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">📁 Files Changed <span class=\"count\">${files.length}</span></div><ul class=\"file-list\">`;\n for (const f of files.slice(0, 25)) {\n const cls = f.type === 'created' ? 'file-created' : 'file-edited';\n const icon = f.type === 'created' ? '+' : '~';\n html += `<li><span class=\"${cls}\">${icon}</span> ${esc(shortPath(f.path, proj))}</li>`;\n }\n if (files.length > 25) html += `<li class=\"more\">… +${files.length - 25} more</li>`;\n html += `</ul></div>`;\n }\n\n // Task completions\n if (s.taskCompletions.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\">✅ Tasks Completed <span class=\"count\">${s.taskCompletions.length}</span></div><ul class=\"task-list\">`;\n for (const t of s.taskCompletions.slice(0, 10)) {\n const first = t.split('\\n')[0].slice(0, 80);\n html += `<li><span class=\"t-check\">✔</span><span>${esc(first)}</span></li>`;\n }\n if (s.taskCompletions.length > 10) html += `<li class=\"more\">… +${s.taskCompletions.length - 10} more</li>`;\n html += `</ul></div>`;\n }\n\n // Errors\n if (s.errors.length > 0) {\n html += `<div class=\"sub\"><div class=\"sub-title\" style=\"color:var(--red)\">⚠️ Errors <span class=\"count\">${s.errors.length}</span></div><ul class=\"error-list\">`;\n for (const e of s.errors.slice(0, 5)) {\n html += `<li>${esc(e.slice(0, 100))}</li>`;\n }\n if (s.errors.length > 5) html += `<li class=\"more\">… +${s.errors.length - 5} more</li>`;\n html += `</ul></div>`;\n }\n\n return html;\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { loadGlobalConfig, setConfigValue, deleteConfigValue, resetConfig, resolveConfig } from '../lib/config.js';\n\nexport function registerConfigCommand(program: Command): void {\n const cmd = program\n .command('config')\n .description('Manage persistent configuration defaults');\n\n cmd\n .command('list')\n .description('Show all configuration values')\n .action(() => {\n const global = loadGlobalConfig();\n const resolved = resolveConfig();\n console.log(chalk.bold.cyan('\\n Global Config') + chalk.dim(' (~/.copilot-agent/config.yaml)\\n'));\n const entries = Object.entries(global);\n if (entries.length === 0) {\n console.log(chalk.dim(' (empty — using defaults)\\n'));\n } else {\n for (const [k, v] of entries) {\n console.log(` ${chalk.bold(k.padEnd(16))} ${chalk.green(String(v))}`);\n }\n console.log();\n }\n console.log(chalk.bold.cyan(' Resolved Config') + chalk.dim(' (defaults + global + project)\\n'));\n for (const [k, v] of Object.entries(resolved)) {\n if (v !== undefined) {\n const isOverride = (global as any)[k] !== undefined;\n const marker = isOverride ? chalk.yellow('●') : chalk.dim('○');\n console.log(` ${marker} ${chalk.bold(k.padEnd(16))} ${String(v)}`);\n }\n }\n console.log();\n });\n\n cmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n setConfigValue(key, value);\n console.log(chalk.green(` ✔ Set ${chalk.bold(key)} = ${value}`));\n });\n\n cmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const resolved = resolveConfig();\n const val = (resolved as any)[key];\n if (val !== undefined) {\n console.log(` ${chalk.bold(key)} = ${chalk.green(String(val))}`);\n } else {\n console.log(chalk.dim(` ${key} is not set`));\n }\n });\n\n cmd\n .command('unset <key>')\n .description('Remove a configuration value')\n .action((key: string) => {\n deleteConfigValue(key);\n console.log(chalk.yellow(` ✔ Removed ${chalk.bold(key)}`));\n });\n\n cmd\n .command('reset')\n .description('Reset all configuration to defaults')\n .action(() => {\n resetConfig();\n console.log(chalk.yellow(' ✔ Configuration reset to defaults'));\n });\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { findUpSync } from 'find-up';\n\nexport interface AgentConfig {\n agent?: 'copilot' | 'claude';\n steps?: number;\n worktree?: boolean;\n cooldown?: number;\n maxPremium?: number;\n maxTasks?: number;\n autopr?: boolean;\n until?: string;\n refreshInterval?: number;\n}\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst GLOBAL_CONFIG = join(CONFIG_DIR, 'config.yaml');\nconst PROJECT_CONFIG_NAME = '.copilot-agent.yaml';\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n}\n\nexport function loadGlobalConfig(): AgentConfig {\n if (!existsSync(GLOBAL_CONFIG)) return {};\n try {\n return parseYaml(readFileSync(GLOBAL_CONFIG, 'utf-8')) || {};\n } catch {\n return {};\n }\n}\n\nexport function saveGlobalConfig(config: AgentConfig): void {\n ensureConfigDir();\n writeFileSync(GLOBAL_CONFIG, stringifyYaml(config), 'utf-8');\n}\n\nexport function loadProjectConfig(cwd?: string): AgentConfig {\n const configPath = findUpSync(PROJECT_CONFIG_NAME, { cwd: cwd || process.cwd() });\n if (!configPath) return {};\n try {\n return parseYaml(readFileSync(configPath, 'utf-8')) || {};\n } catch {\n return {};\n }\n}\n\nexport function resolveConfig(cliOpts: Partial<AgentConfig> = {}, cwd?: string): AgentConfig {\n const defaults: AgentConfig = { steps: 30, cooldown: 10, maxPremium: 50, maxTasks: 5, refreshInterval: 5 };\n const global = loadGlobalConfig();\n const project = loadProjectConfig(cwd);\n // Merge: defaults → global → project → CLI (later wins, undefined skipped)\n const merged = { ...defaults };\n for (const src of [global, project, cliOpts]) {\n for (const [k, v] of Object.entries(src)) {\n if (v !== undefined) (merged as any)[k] = v;\n }\n }\n return merged;\n}\n\nexport function getConfigValue(key: string): unknown {\n const config = loadGlobalConfig();\n return (config as any)[key];\n}\n\nexport function setConfigValue(key: string, value: string): void {\n const config = loadGlobalConfig();\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (/^\\d+$/.test(value)) parsed = parseInt(value, 10);\n (config as any)[key] = parsed;\n saveGlobalConfig(config);\n}\n\nexport function deleteConfigValue(key: string): void {\n const config = loadGlobalConfig();\n delete (config as any)[key];\n saveGlobalConfig(config);\n}\n\nexport function resetConfig(): void {\n if (existsSync(GLOBAL_CONFIG)) {\n writeFileSync(GLOBAL_CONFIG, '', 'utf-8');\n }\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst PID_FILE = join(homedir(), '.copilot-agent', 'proxy.pid');\nconst DEFAULT_PORT = 4141;\n\nfunction ensureDir(): void {\n const dir = join(homedir(), '.copilot-agent');\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nfunction findCopilotToken(): string | null {\n const appsPath = join(homedir(), '.config', 'github-copilot', 'apps.json');\n if (!existsSync(appsPath)) return null;\n try {\n const apps = JSON.parse(readFileSync(appsPath, 'utf-8'));\n for (const key of Object.keys(apps)) {\n const token = apps[key]?.oauth_token;\n if (token && token.startsWith('ghu_')) return token;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction readPid(): number | null {\n if (!existsSync(PID_FILE)) return null;\n try {\n const pid = parseInt(readFileSync(PID_FILE, 'utf-8').trim(), 10);\n return isNaN(pid) ? null : pid;\n } catch {\n return null;\n }\n}\n\nfunction isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isPortOpen(port: number): Promise<boolean> {\n try {\n const resp = await fetch(`http://localhost:${port}/v1/models`);\n return resp.ok;\n } catch {\n return false;\n }\n}\n\nexport function registerProxyCommand(program: Command): void {\n const cmd = program\n .command('proxy')\n .description('Manage copilot-api proxy for Claude Code');\n\n cmd\n .command('start')\n .description('Start copilot-api proxy')\n .option('-p, --port <n>', 'Port number', String(DEFAULT_PORT))\n .option('--rate-limit <n>', 'Rate limit in seconds', '30')\n .action(async (opts) => {\n const port = parseInt(opts.port, 10);\n const rateLimit = parseInt(opts.rateLimit, 10);\n\n // Check if already running\n const existingPid = readPid();\n if (existingPid && isProcessRunning(existingPid)) {\n const open = await isPortOpen(port);\n if (open) {\n console.log(chalk.yellow(` ⚠ Proxy already running (PID ${existingPid}) on port ${port}`));\n return;\n }\n }\n\n // Find token\n const token = findCopilotToken();\n if (!token) {\n console.log(chalk.red(' ✗ No Copilot token found'));\n console.log(chalk.dim(' Expected: ~/.config/github-copilot/apps.json with ghu_* token'));\n console.log(chalk.dim(' Run: copilot-api auth to authenticate'));\n return;\n }\n\n console.log(chalk.cyan(' Starting copilot-api proxy...'));\n console.log(chalk.dim(` Token: ${token.slice(0, 8)}...${token.slice(-4)}`));\n console.log(chalk.dim(` Port: ${port} | Rate limit: ${rateLimit}s`));\n\n try {\n const child = execa('copilot-api', [\n 'start',\n '--github-token', token,\n '--rate-limit', String(rateLimit),\n '--wait',\n '--port', String(port),\n ], {\n detached: true,\n stdio: 'ignore',\n });\n\n if (child.pid) {\n child.unref();\n ensureDir();\n writeFileSync(PID_FILE, String(child.pid), 'utf-8');\n\n // Wait a moment for startup\n await new Promise(r => setTimeout(r, 2000));\n\n const open = await isPortOpen(port);\n if (open) {\n console.log(chalk.green(` ✔ Proxy started (PID ${child.pid}) on http://localhost:${port}`));\n } else {\n console.log(chalk.yellow(` ⚠ Proxy started (PID ${child.pid}) but port not yet responsive`));\n console.log(chalk.dim(' It may take a few seconds to initialize'));\n }\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(chalk.red(` ✗ Failed to start proxy: ${message}`));\n console.log(chalk.dim(' Make sure copilot-api is installed: npm install -g copilot-api'));\n }\n });\n\n cmd\n .command('stop')\n .description('Stop copilot-api proxy')\n .action(() => {\n const pid = readPid();\n if (!pid) {\n console.log(chalk.dim(' No proxy PID found'));\n return;\n }\n if (!isProcessRunning(pid)) {\n console.log(chalk.dim(` Proxy (PID ${pid}) is not running`));\n if (existsSync(PID_FILE)) unlinkSync(PID_FILE);\n return;\n }\n try {\n process.kill(pid, 'SIGTERM');\n if (existsSync(PID_FILE)) unlinkSync(PID_FILE);\n console.log(chalk.green(` ✔ Proxy stopped (PID ${pid})`));\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.log(chalk.red(` ✗ Failed to stop: ${message}`));\n }\n });\n\n cmd\n .command('status')\n .description('Check proxy status')\n .option('-p, --port <n>', 'Port number', String(DEFAULT_PORT))\n .action(async (opts) => {\n const port = parseInt(opts.port, 10);\n const pid = readPid();\n const running = pid ? isProcessRunning(pid) : false;\n const open = await isPortOpen(port);\n\n console.log(chalk.bold.cyan('\\n Copilot API Proxy Status\\n'));\n console.log(` PID: ${running ? chalk.green(String(pid)) : chalk.dim('not running')}`);\n console.log(` Port: ${open ? chalk.green(`localhost:${port} ✔`) : chalk.red(`localhost:${port} ✗`)}`);\n\n const token = findCopilotToken();\n console.log(` Token: ${token ? chalk.green(token.slice(0, 8) + '...' + token.slice(-4)) : chalk.red('not found')}`);\n\n if (open) {\n try {\n const resp = await fetch(`http://localhost:${port}/v1/models`);\n const data = await resp.json() as { data?: unknown[] };\n const modelCount = data?.data?.length || 0;\n console.log(` Models: ${chalk.green(String(modelCount) + ' available')}`);\n } catch {\n console.log(` Models: ${chalk.dim('unknown')}`);\n }\n }\n console.log();\n });\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execaCommandSync } from 'execa';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport type { AgentType } from '../lib/provider.js';\n\nexport function registerDiffCommand(program: Command): void {\n program\n .command('diff [session-id]')\n .description('Show git changes made by an agent session')\n .option('--stat', 'Show diffstat summary only')\n .option('-n, --num-commits <n>', 'Number of recent commits to diff', '0')\n .option('--project <dir>', 'Filter sessions by project directory')\n .action((sessionId: string | undefined, opts) => {\n try {\n showDiff(sessionId, opts);\n } catch (err: any) {\n console.error(chalk.red(` ✗ ${err.message}`));\n }\n });\n}\n\nfunction showDiff(sessionId: string | undefined, opts: { stat?: boolean; numCommits?: string; project?: string }): void {\n let sessions = listAllSessions(50);\n if (opts.project) {\n sessions = sessions.filter(s => s.cwd.includes(opts.project!));\n }\n\n let targetId = sessionId;\n let targetAgent: AgentType | undefined;\n\n if (!targetId) {\n if (sessions.length === 0) {\n console.log(chalk.dim(' No sessions found'));\n return;\n }\n targetId = sessions[0].id;\n targetAgent = sessions[0].agent;\n console.log(chalk.dim(` Using latest session: ${targetId.slice(0, 8)}…\\n`));\n } else {\n const match = sessions.find(s => s.id.startsWith(targetId!));\n if (match) targetAgent = match.agent;\n }\n\n const report = getAgentSessionReport(targetId, targetAgent);\n if (!report) {\n console.log(chalk.red(` ✗ Session not found: ${targetId}`));\n return;\n }\n\n // Header\n const project = report.cwd?.split('/').pop() || 'unknown';\n const agentTag = report.agent === 'claude' ? chalk.yellow('[claude]') : chalk.cyan('[copilot]');\n console.log(chalk.bold(` ${agentTag} ${project}`) + chalk.dim(` — ${report.id.slice(0, 8)}…`));\n console.log(chalk.dim(` ${report.summary || 'No summary'}`));\n console.log();\n\n // Created files\n if (report.filesCreated.length > 0) {\n console.log(chalk.bold.green(' Created files:'));\n for (const f of report.filesCreated) {\n console.log(chalk.green(` + ${f}`));\n }\n console.log();\n }\n\n // Edited files\n if (report.filesEdited.length > 0) {\n console.log(chalk.bold.yellow(' Edited files:'));\n for (const f of report.filesEdited) {\n console.log(chalk.yellow(` ~ ${f}`));\n }\n console.log();\n }\n\n // Commits\n if (report.gitCommits.length > 0) {\n console.log(chalk.bold.cyan(' Commits:'));\n for (const c of report.gitCommits) {\n const first = c.split('\\n')[0];\n console.log(chalk.cyan(` ● ${first}`));\n }\n console.log();\n }\n\n // Git diff\n if (report.cwd) {\n const numCommits = parseInt(opts.numCommits || '0', 10);\n if (numCommits > 0) {\n try {\n const diffArgs = opts.stat\n ? ['git', '--no-pager', 'diff', '--stat', `HEAD~${numCommits}`]\n : ['git', '--no-pager', 'diff', '--color=always', `HEAD~${numCommits}`];\n\n const result = execaCommandSync(diffArgs.join(' '), { cwd: report.cwd });\n if (result.stdout) {\n console.log(chalk.bold(' Git Diff:\\n'));\n console.log(result.stdout);\n } else {\n console.log(chalk.dim(' No diff (working tree clean)'));\n }\n } catch (err: any) {\n console.log(chalk.dim(` Could not run git diff: ${err.message}`));\n }\n } else if (report.gitCommits.length > 0) {\n try {\n const n = report.gitCommits.length;\n const result = execaCommandSync(`git --no-pager diff --stat HEAD~${n}`, { cwd: report.cwd });\n if (result.stdout) {\n console.log(chalk.bold(' Diffstat:\\n'));\n console.log(result.stdout);\n }\n } catch {\n // Silently ignore — commits may be on different branch\n }\n }\n }\n\n // Summary stats\n console.log();\n console.log(chalk.dim(' ─────────────────────────────────'));\n console.log(` ${chalk.bold('Files:')} ${chalk.green(`+${report.filesCreated.length}`)} created, ${chalk.yellow(`~${report.filesEdited.length}`)} edited`);\n console.log(` ${chalk.bold('Commits:')} ${report.gitCommits.length}`);\n console.log(` ${chalk.bold('Premium:')} ${chalk.yellow(`⬡${report.premiumRequests}`)}`);\n console.log();\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { buildUsageSummary, formatTokens, formatDurationShort } from '../lib/quota.js';\n\nexport function registerQuotaCommand(program: Command): void {\n program\n .command('quota')\n .description('Track premium requests, tokens, and usage over time')\n .option('-d, --days <n>', 'Number of days to show', '7')\n .option('--all', 'Show all-time usage')\n .action((opts) => {\n const days = opts.all ? undefined : parseInt(opts.days, 10);\n const label = days ? `Last ${days} days` : 'All time';\n const summary = buildUsageSummary(days);\n\n console.log();\n console.log(chalk.bold.cyan(` ⬡ Usage Summary — ${label}`));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n console.log();\n\n // Total stats\n const t = summary.total;\n console.log(` ${chalk.bold('Sessions')} ${chalk.white(String(t.sessions))}`);\n console.log(` ${chalk.bold('Premium')} ${chalk.yellow('⬡ ' + String(t.premium))}`);\n console.log(` ${chalk.bold('Tokens')} ${chalk.green(formatTokens(t.tokens))}`);\n console.log(` ${chalk.bold('Turns')} ${chalk.white(String(t.turns))}`);\n console.log(` ${chalk.bold('Total time')} ${chalk.white(formatDurationShort(t.durationMs))}`);\n console.log();\n\n // Per-agent breakdown\n if (summary.copilot.sessions > 0 || summary.claude.sessions > 0) {\n console.log(chalk.bold.cyan(' Per Agent'));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n\n if (summary.copilot.sessions > 0) {\n const c = summary.copilot;\n console.log(` ${chalk.cyan('copilot')} ${String(c.sessions).padStart(4)} sessions ${chalk.yellow('⬡' + String(c.premium).padStart(5))} ${chalk.green(formatTokens(c.tokens).padStart(7))} tokens`);\n }\n if (summary.claude.sessions > 0) {\n const c = summary.claude;\n console.log(` ${chalk.yellow('claude ')} ${String(c.sessions).padStart(4)} sessions ${chalk.yellow('⬡' + String(c.premium).padStart(5))} ${chalk.green(formatTokens(c.tokens).padStart(7))} tokens`);\n }\n console.log();\n }\n\n // Daily chart\n const dayEntries = Object.entries(summary.byDay).sort((a, b) => a[0].localeCompare(b[0]));\n if (dayEntries.length > 0) {\n console.log(chalk.bold.cyan(' Daily Usage'));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n\n const maxPremium = Math.max(...dayEntries.map(([, d]) => d.premium), 1);\n const barWidth = 24;\n\n for (const [day, data] of dayEntries.slice(-14)) {\n const shortDay = day.slice(5);\n const filled = Math.round((data.premium / maxPremium) * barWidth);\n const bar = chalk.cyan('█'.repeat(filled)) + chalk.dim('░'.repeat(barWidth - filled));\n console.log(` ${chalk.dim(shortDay)} ${bar} ${chalk.yellow('⬡' + String(data.premium).padStart(4))} ${chalk.dim(String(data.sessions) + ' sess')}`);\n }\n console.log();\n }\n });\n}\n","import { readFileSync, writeFileSync, appendFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { listAllSessions, getAgentSessionReport } from './session.js';\nimport type { AgentType } from './provider.js';\n\nconst DATA_DIR = join(homedir(), '.copilot-agent');\nconst USAGE_FILE = join(DATA_DIR, 'usage.jsonl');\n\ninterface UsageEntry {\n timestamp: string;\n sessionId: string;\n agent: AgentType;\n premium: number;\n tokens: number;\n turns: number;\n duration: number;\n project: string;\n}\n\ninterface UsageSummary {\n total: { sessions: number; premium: number; tokens: number; turns: number; durationMs: number };\n copilot: { sessions: number; premium: number; tokens: number };\n claude: { sessions: number; premium: number; tokens: number };\n byDay: Record<string, { premium: number; tokens: number; sessions: number }>;\n}\n\nfunction ensureDir(): void {\n if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });\n}\n\nexport function recordUsage(entry: UsageEntry): void {\n ensureDir();\n appendFileSync(USAGE_FILE, JSON.stringify(entry) + '\\n', 'utf-8');\n}\n\nexport function loadUsageHistory(): UsageEntry[] {\n if (!existsSync(USAGE_FILE)) return [];\n try {\n return readFileSync(USAGE_FILE, 'utf-8')\n .split('\\n')\n .filter(Boolean)\n .map(line => JSON.parse(line));\n } catch {\n return [];\n }\n}\n\nexport function buildUsageSummary(days?: number): UsageSummary {\n const sessions = listAllSessions(500);\n\n const cutoff = days ? Date.now() - days * 86_400_000 : 0;\n const filtered = sessions.filter(s => s.mtime >= cutoff);\n\n const summary: UsageSummary = {\n total: { sessions: 0, premium: 0, tokens: 0, turns: 0, durationMs: 0 },\n copilot: { sessions: 0, premium: 0, tokens: 0 },\n claude: { sessions: 0, premium: 0, tokens: 0 },\n byDay: {},\n };\n\n for (const s of filtered) {\n const report = getAgentSessionReport(s.id, s.agent);\n if (!report) continue;\n\n summary.total.sessions++;\n summary.total.premium += report.premiumRequests;\n summary.total.tokens += report.outputTokens;\n summary.total.turns += report.assistantTurns;\n summary.total.durationMs += report.durationMs;\n\n const bucket = s.agent === 'claude' ? summary.claude : summary.copilot;\n bucket.sessions++;\n bucket.premium += report.premiumRequests;\n bucket.tokens += report.outputTokens;\n\n const day = new Date(s.mtime).toISOString().slice(0, 10);\n if (!summary.byDay[day]) summary.byDay[day] = { premium: 0, tokens: 0, sessions: 0 };\n summary.byDay[day].premium += report.premiumRequests;\n summary.byDay[day].tokens += report.outputTokens;\n summary.byDay[day].sessions++;\n }\n\n return summary;\n}\n\nexport function formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\nexport function formatDurationShort(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { listAllSessions } from '../lib/session.js';\nimport { compactSession, saveCompact, buildResumePrompt } from '../lib/compact.js';\n\nexport function registerCompactCommand(program: Command): void {\n program\n .command('compact [session-id]')\n .description('Generate context summary from a session for handoff/resume')\n .option('--save', 'Save compact to ~/.copilot-agent/compacts/')\n .option('--resume-prompt', 'Output a resume prompt for the next session')\n .option('-a, --agent <type>', 'Agent type: copilot | claude')\n .action((sessionId: string | undefined, opts) => {\n try {\n showCompact(sessionId, opts);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(` ✗ ${msg}`));\n }\n });\n}\n\nfunction showCompact(sessionId: string | undefined, opts: { save?: boolean; resumePrompt?: boolean; agent?: string }): void {\n // Find session\n if (!sessionId) {\n const sessions = listAllSessions(10);\n if (sessions.length === 0) {\n console.log(chalk.dim(' No sessions found'));\n return;\n }\n sessionId = sessions[0].id;\n console.log(chalk.dim(` Using latest session: ${sessionId.slice(0, 12)}…\\n`));\n }\n\n const compact = compactSession(sessionId, opts.agent as any);\n if (!compact) {\n console.log(chalk.red(` ✗ Session not found: ${sessionId}`));\n return;\n }\n\n // Show resume prompt mode\n if (opts.resumePrompt) {\n console.log(buildResumePrompt(compact));\n return;\n }\n\n // Display compact summary\n const agentTag = compact.agent === 'claude' ? chalk.yellow('[claude]') : chalk.cyan('[copilot]');\n console.log(chalk.bold.cyan(` 📋 Session Compact — ${compact.project}`) + ` ${agentTag}`);\n console.log(chalk.dim(` ${compact.sessionId}`));\n console.log(chalk.dim(` ${'─'.repeat(50)}`));\n console.log();\n\n // Stats\n console.log(` ${chalk.bold('Duration')} ${compact.stats.duration} ${chalk.bold('Turns')} ${compact.stats.turns} ${chalk.bold('Tokens')} ${compact.stats.tokens.toLocaleString()} ${chalk.bold('Premium')} ${chalk.yellow('⬡' + compact.stats.premium)}`);\n console.log();\n\n if (compact.summary) {\n console.log(chalk.bold(' Task:') + ` ${compact.summary}`);\n console.log();\n }\n\n // Done\n if (compact.done.length > 0) {\n console.log(chalk.bold.green(' ✅ Completed:'));\n for (const d of compact.done.slice(0, 15)) {\n console.log(chalk.green(` ● ${d}`));\n }\n if (compact.done.length > 15) console.log(chalk.dim(` ... +${compact.done.length - 15} more`));\n console.log();\n }\n\n // Remaining\n if (compact.remaining.length > 0) {\n console.log(chalk.bold.yellow(' ⏳ Remaining:'));\n for (const r of compact.remaining) {\n console.log(chalk.yellow(` ○ ${r}`));\n }\n console.log();\n }\n\n // Commits\n if (compact.commits.length > 0) {\n console.log(chalk.bold.cyan(' Commits:'));\n for (const c of compact.commits.slice(0, 8)) {\n console.log(chalk.cyan(` ● ${c}`));\n }\n console.log();\n }\n\n // Errors\n if (compact.errors.length > 0) {\n console.log(chalk.bold.red(' ⚠️ Errors:'));\n for (const e of compact.errors.slice(0, 5)) {\n console.log(chalk.red(` ✗ ${e}`));\n }\n console.log();\n }\n\n // Save\n if (opts.save) {\n const path = saveCompact(compact);\n console.log(chalk.green(` ✔ Saved to ${path}`));\n console.log();\n }\n}\n","import { writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { getAgentSessionReport, type SessionReport } from './session.js';\nimport type { AgentType } from './provider.js';\n\nconst COMPACT_DIR = join(homedir(), '.copilot-agent', 'compacts');\n\nfunction ensureDir(): void {\n if (!existsSync(COMPACT_DIR)) mkdirSync(COMPACT_DIR, { recursive: true });\n}\n\nexport interface CompactSummary {\n sessionId: string;\n agent: AgentType;\n project: string;\n summary: string;\n done: string[];\n remaining: string[];\n filesChanged: string[];\n commits: string[];\n errors: string[];\n stats: {\n turns: number;\n tokens: number;\n premium: number;\n duration: string;\n };\n markdown: string;\n}\n\nexport function compactSession(sessionId: string, agent?: AgentType): CompactSummary | null {\n const report = getAgentSessionReport(sessionId, agent);\n if (!report) return null;\n\n const project = report.cwd?.split('/').pop() || 'unknown';\n\n // Determine done items from task completions and commits\n const done: string[] = [];\n for (const task of report.taskCompletions) {\n done.push(task.split('\\n')[0].slice(0, 100));\n }\n for (const file of report.filesCreated) {\n done.push(`Created ${file}`);\n }\n for (const file of report.filesEdited) {\n done.push(`Edited ${file}`);\n }\n\n // Determine remaining work from errors and incomplete status\n const remaining: string[] = [];\n if (!report.complete) {\n remaining.push('Session was interrupted before completion');\n }\n for (const err of report.errors) {\n remaining.push(`Fix: ${err.split('\\n')[0].slice(0, 100)}`);\n }\n\n const filesChanged = [\n ...report.filesCreated.map(f => `+ ${f}`),\n ...report.filesEdited.map(f => `~ ${f}`),\n ];\n\n const commits = report.gitCommits.map(c => c.split('\\n')[0].slice(0, 100));\n\n const durationMs = report.durationMs;\n const durationStr = durationMs < 60_000\n ? `${Math.round(durationMs / 1000)}s`\n : durationMs < 3_600_000\n ? `${Math.round(durationMs / 60_000)}m`\n : `${Math.floor(durationMs / 3_600_000)}h ${Math.round((durationMs % 3_600_000) / 60_000)}m`;\n\n // Build markdown\n const lines: string[] = [];\n lines.push(`## Session Context (auto-generated)`);\n lines.push(`**Project:** ${project} | **Agent:** ${report.agent} | **Duration:** ${durationStr}`);\n lines.push(`**Turns:** ${report.assistantTurns} | **Tokens:** ${report.outputTokens.toLocaleString()} | **Premium:** ${report.premiumRequests}`);\n lines.push('');\n\n if (report.summary) {\n lines.push(`**Task:** ${report.summary}`);\n lines.push('');\n }\n\n if (done.length > 0) {\n lines.push('### ✅ Completed');\n for (const d of done) lines.push(`- ${d}`);\n lines.push('');\n }\n\n if (remaining.length > 0) {\n lines.push('### ⏳ Remaining');\n for (const r of remaining) lines.push(`- ${r}`);\n lines.push('');\n }\n\n if (commits.length > 0) {\n lines.push('### Git Commits');\n for (const c of commits) lines.push(`- ${c}`);\n lines.push('');\n }\n\n if (filesChanged.length > 0) {\n lines.push('### Files Changed');\n for (const f of filesChanged) lines.push(`- ${f}`);\n lines.push('');\n }\n\n if (report.errors.length > 0) {\n lines.push('### ⚠️ Errors Encountered');\n for (const e of report.errors.slice(0, 5)) lines.push(`- ${e.split('\\n')[0]}`);\n lines.push('');\n }\n\n // Key tools used\n const topTools = Object.entries(report.toolUsage).sort((a, b) => b[1] - a[1]).slice(0, 5);\n if (topTools.length > 0) {\n lines.push('### Tools Used');\n for (const [tool, count] of topTools) lines.push(`- ${tool}: ${count}x`);\n lines.push('');\n }\n\n const markdown = lines.join('\\n');\n\n return {\n sessionId,\n agent: report.agent,\n project,\n summary: report.summary || '',\n done,\n remaining,\n filesChanged,\n commits,\n errors: report.errors.map(e => e.split('\\n')[0]),\n stats: {\n turns: report.assistantTurns,\n tokens: report.outputTokens,\n premium: report.premiumRequests,\n duration: durationStr,\n },\n markdown,\n };\n}\n\nexport function saveCompact(compact: CompactSummary): string {\n ensureDir();\n const filename = `${compact.sessionId.slice(0, 12)}.md`;\n const filepath = join(COMPACT_DIR, filename);\n writeFileSync(filepath, compact.markdown, 'utf-8');\n return filepath;\n}\n\nexport function buildResumePrompt(compact: CompactSummary): string {\n const parts: string[] = [];\n parts.push('Continue the previous task. Here is the context from the interrupted session:');\n parts.push('');\n if (compact.summary) parts.push(`Task: ${compact.summary}`);\n if (compact.done.length > 0) {\n parts.push('Already completed:');\n for (const d of compact.done.slice(0, 10)) parts.push(`- ${d}`);\n }\n if (compact.remaining.length > 0) {\n parts.push('Still needs to be done:');\n for (const r of compact.remaining) parts.push(`- ${r}`);\n }\n if (compact.errors.length > 0) {\n parts.push('Errors to address:');\n for (const e of compact.errors.slice(0, 3)) parts.push(`- ${e}`);\n }\n parts.push('');\n parts.push('Please continue where the previous session left off.');\n return parts.join('\\n');\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { loadHooksConfig, runHooks, getHooksSummary, type HookEvent } from '../lib/hooks.js';\n\nexport function registerHooksCommand(program: Command): void {\n const cmd = program\n .command('hooks')\n .description('Manage event-driven automation hooks');\n\n cmd\n .command('list')\n .description('Show all configured hooks')\n .action(() => {\n const config = loadHooksConfig();\n const summary = getHooksSummary(config);\n\n console.log(chalk.bold.cyan('\\n ⚡ Hooks Configuration\\n'));\n\n if (summary.length === 0) {\n console.log(chalk.dim(' No hooks configured'));\n console.log(chalk.dim('\\n Create ~/.copilot-agent/hooks.yaml or .copilot-agent/hooks.yaml:'));\n console.log(chalk.dim(' on_task_complete:'));\n console.log(chalk.dim(' - command: \"npm test\"'));\n console.log(chalk.dim(' name: \"Run tests\"'));\n console.log();\n return;\n }\n\n const events: HookEvent[] = ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'];\n for (const event of events) {\n const hooks = config[event];\n if (!hooks || hooks.length === 0) continue;\n\n console.log(chalk.bold(` ${event}`) + chalk.dim(` (${hooks.length})`));\n for (const h of hooks) {\n const name = h.name ? chalk.white(h.name) : chalk.dim('unnamed');\n const timeout = h.timeout ? chalk.dim(` (${h.timeout}s)`) : '';\n console.log(` ${chalk.green('●')} ${name}: ${chalk.cyan(h.command)}${timeout}`);\n }\n console.log();\n }\n });\n\n cmd\n .command('test <event>')\n .description('Test-run hooks for a specific event')\n .action(async (event: string) => {\n const validEvents: HookEvent[] = ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'];\n if (!validEvents.includes(event as HookEvent)) {\n console.log(chalk.red(` ✗ Invalid event: ${event}`));\n console.log(chalk.dim(` Valid events: ${validEvents.join(', ')}`));\n return;\n }\n\n console.log(chalk.cyan(`\\n Running hooks for ${chalk.bold(event)}...\\n`));\n\n const results = await runHooks(event as HookEvent);\n\n if (results.length === 0) {\n console.log(chalk.dim(` No hooks configured for ${event}`));\n return;\n }\n\n for (const r of results) {\n const icon = r.success ? chalk.green('✔') : chalk.red('✗');\n const name = r.hook.name || r.hook.command;\n const time = chalk.dim(`${r.durationMs}ms`);\n console.log(` ${icon} ${name} ${time}`);\n if (r.output) console.log(chalk.dim(` ${r.output.split('\\n')[0]}`));\n if (r.error) console.log(chalk.red(` ${r.error.split('\\n')[0]}`));\n }\n console.log();\n });\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml } from 'yaml';\nimport { findUpSync } from 'find-up';\nimport { execaCommand } from 'execa';\n\nexport type HookEvent = 'on_session_start' | 'on_task_complete' | 'on_session_end' | 'on_error' | 'on_resume';\n\nexport interface HookDef {\n command: string;\n name?: string;\n timeout?: number; // seconds, default 30\n}\n\nexport interface HooksConfig {\n on_session_start?: HookDef[];\n on_task_complete?: HookDef[];\n on_session_end?: HookDef[];\n on_error?: HookDef[];\n on_resume?: HookDef[];\n}\n\nexport interface HookResult {\n hook: HookDef;\n event: HookEvent;\n success: boolean;\n output?: string;\n error?: string;\n durationMs: number;\n}\n\nconst GLOBAL_HOOKS = join(homedir(), '.copilot-agent', 'hooks.yaml');\nconst PROJECT_HOOKS = '.copilot-agent/hooks.yaml';\n\nexport function loadHooksConfig(cwd?: string): HooksConfig {\n const configs: HooksConfig[] = [];\n\n // Global hooks\n if (existsSync(GLOBAL_HOOKS)) {\n try {\n const parsed = parseYaml(readFileSync(GLOBAL_HOOKS, 'utf-8'));\n if (parsed) configs.push(parsed);\n } catch { /* ignore */ }\n }\n\n // Project hooks (find-up from cwd)\n const projectPath = findUpSync(PROJECT_HOOKS, { cwd: cwd || process.cwd(), type: 'file' });\n if (projectPath) {\n try {\n const parsed = parseYaml(readFileSync(projectPath, 'utf-8'));\n if (parsed) configs.push(parsed);\n } catch { /* ignore */ }\n }\n\n // Merge: global first, then project\n const merged: HooksConfig = {};\n for (const cfg of configs) {\n for (const event of ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'] as HookEvent[]) {\n const hooks = cfg[event];\n if (hooks && Array.isArray(hooks)) {\n if (!merged[event]) merged[event] = [];\n merged[event]!.push(...hooks);\n }\n }\n }\n return merged;\n}\n\nexport async function runHooks(event: HookEvent, cwd?: string, env?: Record<string, string>): Promise<HookResult[]> {\n const config = loadHooksConfig(cwd);\n const hooks = config[event];\n if (!hooks || hooks.length === 0) return [];\n\n const results: HookResult[] = [];\n for (const hook of hooks) {\n const start = Date.now();\n try {\n const result = await execaCommand(hook.command, {\n cwd: cwd || process.cwd(),\n timeout: (hook.timeout || 30) * 1000,\n env: { ...process.env, ...env },\n reject: false,\n });\n results.push({\n hook,\n event,\n success: result.exitCode === 0,\n output: result.stdout?.slice(0, 500),\n error: result.exitCode !== 0 ? result.stderr?.slice(0, 500) : undefined,\n durationMs: Date.now() - start,\n });\n } catch (err: unknown) {\n results.push({\n hook,\n event,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n });\n }\n }\n return results;\n}\n\nexport function getHooksSummary(config: HooksConfig): { event: string; count: number }[] {\n const events: HookEvent[] = ['on_session_start', 'on_task_complete', 'on_session_end', 'on_error', 'on_resume'];\n return events\n .map(e => ({ event: e, count: config[e]?.length || 0 }))\n .filter(e => e.count > 0);\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execaCommandSync } from 'execa';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport { gitCurrentBranch, isGitRepo } from '../lib/git.js';\nimport type { AgentType } from '../lib/provider.js';\n\nexport function registerPrCommand(program: Command): void {\n program\n .command('pr [session-id]')\n .description('Create a GitHub Pull Request from agent session changes')\n .option('--draft', 'Create as draft PR (default: true)', true)\n .option('--no-draft', 'Create as ready PR')\n .option('-b, --base <branch>', 'Base branch (default: main)')\n .option('-a, --agent <type>', 'Agent type: copilot | claude')\n .option('--dry-run', 'Show PR details without creating')\n .action((sessionId: string | undefined, opts) => {\n try {\n createPr(sessionId, opts);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(` ✗ ${msg}`));\n }\n });\n}\n\nfunction createPr(\n sessionId: string | undefined,\n opts: { draft?: boolean; base?: string; agent?: string; dryRun?: boolean },\n): void {\n const sessions = listAllSessions(50);\n let targetSession;\n\n if (sessionId) {\n targetSession = sessions.find(s => s.id.startsWith(sessionId));\n } else {\n targetSession = sessions[0];\n if (targetSession) {\n console.log(chalk.dim(` Using latest session: ${targetSession.id.slice(0, 12)}…\\n`));\n }\n }\n\n if (!targetSession) {\n console.log(chalk.red(' ✗ No session found'));\n return;\n }\n\n const agentType = (opts.agent || targetSession.agent) as AgentType | undefined;\n const report = getAgentSessionReport(targetSession.id, agentType);\n if (!report) {\n console.log(chalk.red(' ✗ Could not load session report'));\n return;\n }\n\n const cwd = report.cwd;\n if (!cwd || !isGitRepo(cwd)) {\n console.log(chalk.red(' ✗ Not a git repository'));\n return;\n }\n\n const currentBranch = gitCurrentBranch(cwd);\n const baseBranch = opts.base || 'main';\n\n if (!currentBranch || currentBranch === baseBranch) {\n console.log(chalk.yellow(` ⚠ Currently on ${baseBranch} — switch to a feature branch first`));\n return;\n }\n\n // Build PR title from session\n const agentName = report.agent === 'claude' ? 'Claude' : 'Copilot';\n const title = report.summary\n ? report.summary.slice(0, 72)\n : `[${agentName}] ${currentBranch.replace('agent/', '').replace(/-/g, ' ').slice(0, 60)}`;\n\n // Build PR body\n const bodyParts: string[] = [];\n bodyParts.push(`## 🤖 Auto-generated by copilot-agent (${report.agent})\\n`);\n\n if (report.summary) {\n bodyParts.push(`**Task:** ${report.summary}\\n`);\n }\n\n bodyParts.push('### Stats');\n bodyParts.push(`- **Duration:** ${formatDur(report.durationMs)}`);\n bodyParts.push(`- **Turns:** ${report.assistantTurns}`);\n bodyParts.push(`- **Tokens:** ${report.outputTokens.toLocaleString()}`);\n bodyParts.push(`- **Premium requests:** ${report.premiumRequests}`);\n bodyParts.push('');\n\n if (report.gitCommits.length > 0) {\n bodyParts.push('### Commits');\n for (const c of report.gitCommits.slice(0, 20)) {\n bodyParts.push(`- ${c.split('\\n')[0]}`);\n }\n bodyParts.push('');\n }\n\n if (report.filesCreated.length > 0 || report.filesEdited.length > 0) {\n bodyParts.push('### Files Changed');\n for (const f of report.filesCreated.slice(0, 15)) bodyParts.push(`- ➕ ${f}`);\n for (const f of report.filesEdited.slice(0, 15)) bodyParts.push(`- ✏️ ${f}`);\n bodyParts.push('');\n }\n\n if (report.taskCompletions.length > 0) {\n bodyParts.push('### Tasks Completed');\n for (const t of report.taskCompletions.slice(0, 10)) {\n bodyParts.push(`- ✅ ${t.split('\\n')[0]}`);\n }\n bodyParts.push('');\n }\n\n bodyParts.push(`---\\n*Session: \\`${report.id.slice(0, 12)}…\\`*`);\n\n const body = bodyParts.join('\\n');\n\n // Display preview\n console.log(chalk.bold.cyan(' 📝 Pull Request Preview\\n'));\n console.log(` ${chalk.bold('Title:')} ${title}`);\n console.log(` ${chalk.bold('Branch:')} ${chalk.cyan(currentBranch)} → ${chalk.green(baseBranch)}`);\n console.log(` ${chalk.bold('Draft:')} ${opts.draft ? 'yes' : 'no'}`);\n console.log(` ${chalk.bold('Agent:')} ${report.agent}`);\n console.log(` ${chalk.bold('Files:')} ${chalk.green(`+${report.filesCreated.length}`)} created, ${chalk.yellow(`~${report.filesEdited.length}`)} edited`);\n console.log(` ${chalk.bold('Commits:')} ${report.gitCommits.length}`);\n console.log();\n\n if (opts.dryRun) {\n console.log(chalk.dim(' (dry run — PR not created)'));\n console.log(chalk.dim('\\n Body preview:'));\n console.log(chalk.dim(body.split('\\n').map(l => ` ${l}`).join('\\n')));\n return;\n }\n\n // Push branch\n try {\n console.log(chalk.dim(' Pushing branch...'));\n execaCommandSync(`git push -u origin ${currentBranch}`, { cwd });\n } catch {\n // May already be pushed\n }\n\n // Create PR with gh CLI\n try {\n const ghArgs = [\n 'gh', 'pr', 'create',\n '--title', title,\n '--body', body,\n '--base', baseBranch,\n '--label', 'automated',\n ];\n if (opts.draft) ghArgs.push('--draft');\n\n const result = execaCommandSync(\n ghArgs.map(a => (a.includes(' ') ? `\"${a}\"` : a)).join(' '),\n { cwd },\n );\n const prUrl = result.stdout.trim();\n console.log(chalk.green(` ✔ PR created: ${prUrl}`));\n } catch (err: unknown) {\n const msg =\n err instanceof Error ? ((err as any).stderr as string) || err.message : String(err);\n console.log(chalk.red(` ✗ Failed to create PR: ${msg}`));\n console.log(chalk.dim(' Make sure gh CLI is installed and authenticated'));\n }\n}\n\nfunction formatDur(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n const h = Math.floor(ms / 3_600_000);\n const m = Math.round((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\n\ninterface Template {\n name: string;\n prompt: string;\n priority?: number;\n}\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst TEMPLATES_FILE = join(CONFIG_DIR, 'templates.yaml');\n\nfunction ensureDir(): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n}\n\nfunction loadTemplates(): Template[] {\n if (!existsSync(TEMPLATES_FILE)) return [];\n try {\n const data = parseYaml(readFileSync(TEMPLATES_FILE, 'utf-8'));\n return Array.isArray(data) ? data : [];\n } catch {\n return [];\n }\n}\n\nfunction saveTemplates(templates: Template[]): void {\n ensureDir();\n writeFileSync(TEMPLATES_FILE, stringifyYaml(templates), 'utf-8');\n}\n\nexport function registerTemplateCommand(program: Command): void {\n const cmd = program\n .command('template')\n .description('Manage custom task templates');\n\n cmd\n .command('list')\n .description('Show all custom templates')\n .action(() => {\n const templates = loadTemplates();\n console.log(chalk.bold.cyan('\\n 📋 Task Templates') + chalk.dim(` (${templates.length})\\n`));\n\n if (templates.length === 0) {\n console.log(chalk.dim(' No custom templates'));\n console.log(chalk.dim('\\n Add one: copilot-agent template add <name> --prompt \"...\"'));\n console.log();\n return;\n }\n\n for (const t of templates) {\n const prio = t.priority !== undefined ? chalk.dim(` [priority: ${t.priority}]`) : '';\n console.log(` ${chalk.green('●')} ${chalk.bold(t.name)}${prio}`);\n console.log(chalk.dim(` ${t.prompt.slice(0, 80)}${t.prompt.length > 80 ? '…' : ''}`));\n }\n console.log();\n });\n\n cmd\n .command('add <name>')\n .description('Add a custom template')\n .requiredOption('-p, --prompt <text>', 'Task prompt')\n .option('--priority <n>', 'Priority (lower = higher priority)')\n .action((name: string, opts) => {\n const templates = loadTemplates();\n const existing = templates.findIndex(t => t.name === name);\n const entry: Template = {\n name,\n prompt: opts.prompt,\n priority: opts.priority ? parseInt(opts.priority, 10) : undefined,\n };\n\n if (existing >= 0) {\n templates[existing] = entry;\n console.log(chalk.yellow(` ✔ Updated template: ${chalk.bold(name)}`));\n } else {\n templates.push(entry);\n console.log(chalk.green(` ✔ Added template: ${chalk.bold(name)}`));\n }\n saveTemplates(templates);\n });\n\n cmd\n .command('remove <name>')\n .description('Remove a custom template')\n .action((name: string) => {\n const templates = loadTemplates();\n const idx = templates.findIndex(t => t.name === name);\n if (idx < 0) {\n console.log(chalk.red(` ✗ Template not found: ${name}`));\n return;\n }\n templates.splice(idx, 1);\n saveTemplates(templates);\n console.log(chalk.green(` ✔ Removed template: ${chalk.bold(name)}`));\n });\n\n cmd\n .command('export')\n .description('Export templates to stdout (YAML)')\n .action(() => {\n const templates = loadTemplates();\n if (templates.length === 0) {\n console.log(chalk.dim(' No templates to export'));\n return;\n }\n console.log(stringifyYaml(templates));\n });\n\n cmd\n .command('import <file>')\n .description('Import templates from a YAML file')\n .action((file: string) => {\n try {\n const data = parseYaml(readFileSync(file, 'utf-8'));\n if (!Array.isArray(data)) {\n console.log(chalk.red(' ✗ Invalid format: expected YAML array'));\n return;\n }\n const current = loadTemplates();\n let added = 0;\n for (const entry of data) {\n if (!entry.name || !entry.prompt) continue;\n const idx = current.findIndex(t => t.name === entry.name);\n if (idx >= 0) {\n current[idx] = entry;\n } else {\n current.push(entry);\n added++;\n }\n }\n saveTemplates(current);\n console.log(chalk.green(` ✔ Imported ${added} new templates (${data.length} total processed)`));\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(chalk.red(` ✗ ${msg}`));\n }\n });\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { writeFileSync } from 'fs';\nimport { listAllSessions, getAgentSessionReport, type Session, type SessionReport } from '../lib/session.js';\n\nexport function registerLogCommand(program: Command): void {\n const cmd = program\n .command('log')\n .description('Search, browse, and export session history');\n\n cmd\n .command('search <query>')\n .description('Search across all sessions')\n .option('-a, --agent <type>', 'Filter: copilot | claude')\n .option('-l, --limit <n>', 'Max results', '20')\n .option('--after <date>', 'After date (YYYY-MM-DD)')\n .option('--before <date>', 'Before date (YYYY-MM-DD)')\n .action((query: string, opts) => {\n const limit = parseInt(opts.limit, 10);\n const sessions = listAllSessions(200);\n const q = query.toLowerCase();\n\n let filtered = sessions;\n if (opts.agent) filtered = filtered.filter(s => s.agent === opts.agent);\n if (opts.after) {\n const after = new Date(opts.after).getTime();\n filtered = filtered.filter(s => s.mtime >= after);\n }\n if (opts.before) {\n const before = new Date(opts.before).getTime();\n filtered = filtered.filter(s => s.mtime <= before);\n }\n\n // Search in summary, cwd, lastEvent and report details\n const matches = filtered.filter(s => {\n if (s.summary?.toLowerCase().includes(q)) return true;\n if (s.cwd?.toLowerCase().includes(q)) return true;\n if (s.lastEvent?.toLowerCase().includes(q)) return true;\n const report = getAgentSessionReport(s.id, s.agent);\n if (!report) return false;\n if (report.gitCommits.some(c => c.toLowerCase().includes(q))) return true;\n if (report.filesCreated.some(f => f.toLowerCase().includes(q))) return true;\n if (report.filesEdited.some(f => f.toLowerCase().includes(q))) return true;\n if (report.taskCompletions.some(t => t.toLowerCase().includes(q))) return true;\n return false;\n }).slice(0, limit);\n\n console.log(chalk.bold.cyan(`\\n 🔍 Search: \"${query}\"`) + chalk.dim(` (${matches.length} results)\\n`));\n\n if (matches.length === 0) {\n console.log(chalk.dim(' No matches found'));\n return;\n }\n\n for (const s of matches) {\n const agentTag = s.agent === 'claude' ? chalk.yellow('claude ') : chalk.cyan('copilot');\n const icon = s.complete ? chalk.green('✔') : chalk.yellow('⏳');\n const date = new Date(s.mtime).toLocaleDateString('en-CA');\n const time = new Date(s.mtime).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' });\n const project = s.cwd?.split('/').pop() || '—';\n const summary = (s.summary || '—').slice(0, 50);\n console.log(` ${icon} ${agentTag} ${chalk.dim(date + ' ' + time)} ${chalk.bold(project.padEnd(16))} ${summary}`);\n console.log(chalk.dim(` ${s.id}`));\n }\n console.log();\n });\n\n cmd\n .command('timeline [session-id]')\n .description('Show chronological timeline of a session')\n .option('-a, --agent <type>', 'Agent type')\n .action((sessionId: string | undefined, opts) => {\n if (!sessionId) {\n const sessions = listAllSessions(1);\n if (sessions.length === 0) { console.log(chalk.dim(' No sessions')); return; }\n sessionId = sessions[0].id;\n opts.agent = opts.agent || sessions[0].agent;\n console.log(chalk.dim(` Using latest: ${sessionId.slice(0, 12)}…\\n`));\n }\n\n const report = getAgentSessionReport(sessionId, opts.agent as any);\n if (!report) { console.log(chalk.red(` ✗ Session not found`)); return; }\n\n const project = report.cwd?.split('/').pop() || 'unknown';\n const agentTag = report.agent === 'claude' ? chalk.yellow('[claude]') : chalk.cyan('[copilot]');\n console.log(chalk.bold.cyan(` 📅 Timeline — ${project}`) + ` ${agentTag}\\n`);\n\n const entries: string[] = [];\n\n if (report.startTime) entries.push(`${chalk.dim(fmtTime(report.startTime))} ${chalk.green('▶')} Session started`);\n\n for (const f of report.filesCreated) entries.push(`${chalk.dim(' ')} ${chalk.green('+')} Created ${f}`);\n for (const f of report.filesEdited) entries.push(`${chalk.dim(' ')} ${chalk.yellow('~')} Edited ${f}`);\n for (const c of report.gitCommits) entries.push(`${chalk.dim(' ')} ${chalk.cyan('●')} Commit: ${c.split('\\n')[0].slice(0, 60)}`);\n for (const t of report.taskCompletions) entries.push(`${chalk.dim(' ')} ${chalk.green('✔')} ${t.split('\\n')[0].slice(0, 60)}`);\n for (const e of report.errors.slice(0, 5)) entries.push(`${chalk.dim(' ')} ${chalk.red('✗')} ${e.split('\\n')[0].slice(0, 60)}`);\n\n const statusIcon = report.complete ? chalk.green('■') : chalk.yellow('⏸');\n if (report.endTime) entries.push(`${chalk.dim(fmtTime(report.endTime))} ${statusIcon} Session ${report.complete ? 'completed' : 'stopped'}`);\n\n for (const e of entries) console.log(` ${e}`);\n\n console.log(chalk.dim(`\\n Duration: ${fmtDur(report.durationMs)} | Turns: ${report.assistantTurns} | Premium: ⬡${report.premiumRequests}\\n`));\n });\n\n cmd\n .command('export')\n .description('Export session history')\n .option('-f, --format <fmt>', 'Format: json | csv', 'json')\n .option('-l, --limit <n>', 'Max sessions', '50')\n .option('-o, --output <file>', 'Output file')\n .action((opts) => {\n const sessions = listAllSessions(parseInt(opts.limit, 10));\n const data = sessions.map(s => {\n const r = getAgentSessionReport(s.id, s.agent);\n return {\n id: s.id,\n agent: s.agent,\n project: s.cwd?.split('/').pop() || '',\n complete: s.complete,\n premium: s.premiumRequests,\n tokens: r?.outputTokens || 0,\n turns: r?.assistantTurns || 0,\n commits: r?.gitCommits.length || 0,\n filesCreated: r?.filesCreated.length || 0,\n filesEdited: r?.filesEdited.length || 0,\n durationMs: r?.durationMs || 0,\n summary: s.summary || '',\n date: new Date(s.mtime).toISOString(),\n };\n });\n\n let output: string;\n if (opts.format === 'csv') {\n const headers = Object.keys(data[0] || {}).join(',');\n const rows = data.map(d => Object.values(d).map(v => `\"${String(v).replace(/\"/g, '\"\"')}\"`).join(','));\n output = [headers, ...rows].join('\\n');\n } else {\n output = JSON.stringify(data, null, 2);\n }\n\n if (opts.output) {\n writeFileSync(opts.output, output, 'utf-8');\n console.log(chalk.green(` ✔ Exported ${data.length} sessions to ${opts.output}`));\n } else {\n console.log(output);\n }\n });\n}\n\nfunction fmtTime(iso: string): string {\n try {\n return new Date(iso).toLocaleTimeString('en-GB', { hour: '2-digit', minute: '2-digit' });\n } catch { return ' '; }\n}\n\nfunction fmtDur(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n return `${Math.floor(ms / 3_600_000)}h ${Math.round((ms % 3_600_000) / 60_000)}m`;\n}\n","import type { Command } from 'commander';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, resolve, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport chalk from 'chalk';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { detectProjectType, detectProjectName } from '../lib/detect.js';\nimport { getTasksForProject } from '../lib/tasks.js';\nimport { runAgentTask, findAgentProcesses } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { withLock } from '../lib/lock.js';\nimport { log, ok, warn, fail, notify, setLogFile } from '../lib/logger.js';\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst PROJECTS_FILE = join(CONFIG_DIR, 'multi-projects.txt');\nconst STATUS_FILE = join(CONFIG_DIR, 'multi-status.yaml');\nconst LOG_DIR = join(CONFIG_DIR, 'multi-logs');\n\nconst MAX_CONCURRENCY = 3;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MultiOptions {\n agent: AgentType;\n parallel: boolean;\n cooldown: number;\n steps: number;\n maxPremium: number;\n dryRun: boolean;\n}\n\ninterface ProjectStatus {\n project: string;\n lastRun: string;\n status: 'success' | 'failed' | 'running';\n agent: AgentType;\n tasks: number;\n duration: string;\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerMultiCommand(program: Command): void {\n program\n .command('multi <action> [args...]')\n .description('Multi-project orchestration — add/remove/list/run/status/research')\n .option('-a, --agent <type>', 'Agent to use (copilot or claude)', 'copilot')\n .option('--parallel', 'Run projects in parallel (max 3 concurrent)')\n .option('--cooldown <n>', 'Cooldown between projects in seconds', '30')\n .option('-s, --steps <n>', 'Max steps per task', '10')\n .option('--max-premium <n>', 'Premium budget per project', '50')\n .option('--dry-run', 'Preview without executing')\n .action(async (action: string, args: string[], opts) => {\n try {\n await multiCommand(action, args, {\n agent: resolveAgent(opts.agent),\n parallel: opts.parallel ?? false,\n cooldown: parseInt(opts.cooldown, 10),\n steps: parseInt(opts.steps, 10),\n maxPremium: parseInt(opts.maxPremium, 10),\n dryRun: opts.dryRun ?? false,\n });\n } catch (err) {\n fail(`Multi error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Main dispatcher\n// ---------------------------------------------------------------------------\n\nexport async function multiCommand(\n action: string,\n args: string[],\n opts: MultiOptions,\n): Promise<void> {\n ensureFiles();\n\n switch (action) {\n case 'add':\n return addProject(args[0]);\n case 'remove':\n return removeProject(args[0]);\n case 'list':\n return listProjects();\n case 'status':\n return showStatus();\n case 'run':\n case 'health':\n return runAll('health', opts);\n case 'research':\n return runAll('research', opts);\n default:\n fail(`Unknown action: ${action}. Use: add, remove, list, run, status, research`);\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// File helpers\n// ---------------------------------------------------------------------------\n\nfunction ensureFiles(): void {\n mkdirSync(LOG_DIR, { recursive: true });\n mkdirSync(CONFIG_DIR, { recursive: true });\n if (!existsSync(PROJECTS_FILE)) writeFileSync(PROJECTS_FILE, '');\n}\n\nfunction readProjects(): string[] {\n return readFileSync(PROJECTS_FILE, 'utf-8')\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n}\n\nfunction writeProjects(projects: string[]): void {\n writeFileSync(PROJECTS_FILE, projects.join('\\n') + '\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Status persistence\n// ---------------------------------------------------------------------------\n\nfunction readStatusFile(): ProjectStatus[] {\n if (!existsSync(STATUS_FILE)) return [];\n try {\n const raw = readFileSync(STATUS_FILE, 'utf-8');\n const parsed: unknown = parseYaml(raw);\n return Array.isArray(parsed) ? (parsed as ProjectStatus[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction writeStatusFile(statuses: ProjectStatus[]): void {\n writeFileSync(STATUS_FILE, stringifyYaml(statuses));\n}\n\nfunction upsertStatus(entry: ProjectStatus): void {\n const statuses = readStatusFile();\n const idx = statuses.findIndex((s) => s.project === entry.project);\n if (idx >= 0) {\n statuses[idx] = entry;\n } else {\n statuses.push(entry);\n }\n writeStatusFile(statuses);\n}\n\nfunction formatDuration(ms: number): string {\n const totalSec = Math.round(ms / 1000);\n const min = Math.floor(totalSec / 60);\n const sec = totalSec % 60;\n return min > 0 ? `${min}m ${sec}s` : `${sec}s`;\n}\n\n// ---------------------------------------------------------------------------\n// Actions: add / remove / list / status\n// ---------------------------------------------------------------------------\n\nasync function addProject(path: string | undefined): Promise<void> {\n if (!path) {\n fail('Usage: copilot-agent multi add <path>');\n process.exit(1);\n }\n\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n fail(`Not found: ${resolved}`);\n process.exit(1);\n }\n\n await withLock('projects-file', async () => {\n const projects = readProjects();\n if (projects.includes(resolved)) {\n warn(`Already registered: ${resolved}`);\n return;\n }\n projects.push(resolved);\n writeProjects(projects);\n ok(`Added: ${resolved}`);\n });\n}\n\nasync function removeProject(path: string | undefined): Promise<void> {\n if (!path) {\n fail('Usage: copilot-agent multi remove <path>');\n process.exit(1);\n }\n\n const resolved = resolve(path);\n\n await withLock('projects-file', async () => {\n const projects = readProjects();\n const filtered = projects.filter((p) => p !== resolved);\n if (filtered.length === projects.length) {\n warn(`Not registered: ${resolved}`);\n return;\n }\n writeProjects(filtered);\n ok(`Removed: ${resolved}`);\n });\n}\n\nfunction listProjects(): void {\n const projects = readProjects();\n if (projects.length === 0) {\n log('No projects registered. Add: copilot-agent multi add <path>');\n return;\n }\n\n const statuses = readStatusFile();\n\n console.log(chalk.bold('\\nRegistered projects:'));\n for (let i = 0; i < projects.length; i++) {\n const p = projects[i];\n const exists = existsSync(p);\n const icon = exists ? chalk.green('✅') : chalk.red('❌');\n const type = exists ? detectProjectType(p) : '?';\n const st = statuses.find((s) => s.project === p);\n const statusTag = st\n ? chalk.dim(` [${st.status} — ${st.agent} — ${st.duration}]`)\n : '';\n console.log(` ${i + 1}. ${icon} ${p} ${chalk.dim(`(${type})`)}${statusTag}`);\n }\n console.log();\n}\n\nfunction showStatus(): void {\n const statuses = readStatusFile();\n if (statuses.length === 0) {\n log('No run history. Execute: copilot-agent multi run');\n return;\n }\n\n console.log(chalk.bold('\\nMulti-project status:'));\n for (const s of statuses) {\n const icon =\n s.status === 'success' ? chalk.green('✅') :\n s.status === 'failed' ? chalk.red('❌') :\n chalk.yellow('🔄');\n console.log(\n ` ${icon} ${chalk.bold(basename(s.project))} — ${s.agent} — ${s.tasks} tasks — ${s.duration} — ${chalk.dim(s.lastRun)}`,\n );\n }\n console.log();\n}\n\n// ---------------------------------------------------------------------------\n// Parallel concurrency limiter\n// ---------------------------------------------------------------------------\n\nfunction createSemaphore(max: number) {\n let running = 0;\n const queue: Array<() => void> = [];\n\n async function acquire(): Promise<void> {\n if (running < max) {\n running++;\n return;\n }\n return new Promise<void>((resolve) => {\n queue.push(() => { running++; resolve(); });\n });\n }\n\n function release(): void {\n running--;\n const next = queue.shift();\n if (next) next();\n }\n\n return { acquire, release };\n}\n\n// ---------------------------------------------------------------------------\n// Core: run all projects\n// ---------------------------------------------------------------------------\n\nasync function runAll(mode: string, opts: MultiOptions): Promise<void> {\n assertAgent(opts.agent);\n\n const ts = new Date().toISOString().replace(/[:.]/g, '').slice(0, 15);\n setLogFile(join(LOG_DIR, `multi-${mode}-${ts}.log`));\n\n const projects = readProjects();\n if (projects.length === 0) {\n fail('No projects registered. Add: copilot-agent multi add <path>');\n process.exit(1);\n }\n\n log(`🏭 Multi-project ${mode} — ${projects.length} projects — agent: ${opts.agent}${opts.parallel ? ' (parallel)' : ''}`);\n\n if (opts.dryRun) {\n for (const p of projects) {\n const type = existsSync(p) ? detectProjectType(p) : 'unknown';\n const tasks = getTasksForProject(type);\n console.log(`\\n${chalk.bold(basename(p))} (${type})`);\n for (const t of tasks.slice(0, 3)) {\n console.log(` ${chalk.dim('•')} ${t.title}`);\n }\n }\n log(chalk.dim('\\n(dry-run — not executing)'));\n return;\n }\n\n const results: Array<{ name: string; success: boolean; skipped: boolean }> = [];\n\n if (opts.parallel) {\n const sem = createSemaphore(MAX_CONCURRENCY);\n const promises = projects.map(async (project) => {\n await sem.acquire();\n try {\n const res = await runSingleProject(project, mode, opts);\n results.push(res);\n } finally {\n sem.release();\n }\n });\n await Promise.all(promises);\n } else {\n for (let i = 0; i < projects.length; i++) {\n const res = await runSingleProject(projects[i], mode, opts);\n results.push(res);\n\n if (i < projects.length - 1 && !res.skipped) {\n log(`Cooldown ${opts.cooldown}s…`);\n await new Promise((r) => setTimeout(r, opts.cooldown * 1000));\n }\n }\n }\n\n const success = results.filter((r) => r.success && !r.skipped).length;\n const failed = results.filter((r) => !r.success && !r.skipped).length;\n const skipped = results.filter((r) => r.skipped).length;\n const total = results.length;\n\n console.log(`\\n${'═'.repeat(50)}`);\n log(`📊 Summary: ${success}/${total} succeeded, ${failed} failed, ${skipped} skipped`);\n for (const r of results) {\n const icon = r.skipped ? '⏭ ' : r.success ? '✅' : '❌';\n console.log(` ${icon} ${r.name}`);\n }\n console.log();\n\n notify(`Multi-${mode}: ${success}/${total} succeeded`, 'copilot-agent');\n}\n\nasync function runSingleProject(\n project: string,\n mode: string,\n opts: MultiOptions,\n): Promise<{ name: string; success: boolean; skipped: boolean }> {\n const name = existsSync(project) ? detectProjectName(project) : basename(project);\n\n if (!existsSync(project)) {\n warn(`Skipping (not found): ${project}`);\n return { name, success: false, skipped: true };\n }\n\n const type = detectProjectType(project);\n log(`\\n${'═'.repeat(50)}`);\n log(`${chalk.bold(name)} (${type}) — agent: ${opts.agent}`);\n log(`${'═'.repeat(50)}`);\n\n const tasks =\n mode === 'research'\n ? [{ title: 'Research', prompt: 'Research latest best practices, dependency updates, and architecture improvements. Create a report.', priority: 1 }]\n : getTasksForProject(type).slice(0, 3);\n\n const startTime = Date.now();\n let projectSuccess = true;\n\n upsertStatus({\n project,\n lastRun: new Date().toISOString(),\n status: 'running',\n agent: opts.agent,\n tasks: tasks.length,\n duration: '—',\n });\n\n for (const task of tasks) {\n try {\n const result = await withLock('agent-multi', () =>\n runAgentTask(opts.agent, `Project: ${project}\\n\\n${task.prompt}`, opts.steps, project),\n );\n ok(`${task.title} — exit ${result.exitCode}, premium: ${result.premium}`);\n } catch (err) {\n fail(`${task.title} failed: ${err}`);\n projectSuccess = false;\n }\n }\n\n const duration = formatDuration(Date.now() - startTime);\n\n upsertStatus({\n project,\n lastRun: new Date().toISOString(),\n status: projectSuccess ? 'success' : 'failed',\n agent: opts.agent,\n tasks: tasks.length,\n duration,\n });\n\n return { name, success: projectSuccess, skipped: false };\n}\n","import type { Command } from 'commander';\nimport chalk from 'chalk';\nimport { execSync } from 'node:child_process';\nimport { listAllSessions, getAgentSessionReport } from '../lib/session.js';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent } from '../lib/provider.js';\nimport type { AgentType } from '../lib/provider.js';\nimport { log, ok, fail, info } from '../lib/logger.js';\n\nconst MAX_DIFF_LENGTH = 15_000;\nconst MAX_BUFFER = 1024 * 1024;\n\nfunction getSessionDiff(sessionId: string): string {\n const report =\n getAgentSessionReport(sessionId, 'copilot') ??\n getAgentSessionReport(sessionId, 'claude');\n\n if (!report || report.gitCommits.length === 0) {\n return execSync('git --no-pager diff HEAD~3', {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n }\n\n return execSync('git --no-pager diff HEAD~' + report.gitCommits.length, {\n encoding: 'utf-8',\n cwd: report.cwd || process.cwd(),\n maxBuffer: MAX_BUFFER,\n });\n}\n\nfunction getWorkingDiff(): string {\n const staged = execSync('git --no-pager diff --cached', {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n const unstaged = execSync('git --no-pager diff', {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n return staged + unstaged;\n}\n\nfunction getPrDiff(prNumber: string): string {\n return execSync(`gh pr diff ${prNumber} --color=never`, {\n encoding: 'utf-8',\n maxBuffer: MAX_BUFFER,\n });\n}\n\nconst focusInstructions: Record<string, string> = {\n all: 'Review for bugs, security issues, performance problems, and code quality.',\n security:\n 'Focus exclusively on security vulnerabilities, injection risks, auth issues, and data exposure.',\n performance:\n 'Focus exclusively on performance issues: N+1 queries, memory leaks, unnecessary allocations, slow algorithms.',\n bugs: 'Focus exclusively on logic bugs, edge cases, null/undefined issues, race conditions.',\n style: 'Focus exclusively on code style, naming, readability, and consistency.',\n};\n\nfunction buildReviewPrompt(diff: string, focus: string): string {\n const instruction = focusInstructions[focus] ?? focusInstructions.all;\n const truncatedDiff =\n diff.length > MAX_DIFF_LENGTH\n ? diff.slice(0, MAX_DIFF_LENGTH) + '\\n... (truncated)'\n : diff;\n\n return `You are a senior code reviewer. ${instruction}\n\nReview this diff and provide:\n1. **Critical Issues** (bugs, security) — must fix\n2. **Suggestions** — should fix for quality\n3. **Positive Notes** — good patterns observed\n4. **Summary** — one paragraph overall assessment\n\nBe concise. Only flag real issues, not style nitpicks (unless focus is style).\n\n\\`\\`\\`diff\n${truncatedDiff}\n\\`\\`\\``;\n}\n\nasync function runReview(\n label: string,\n diff: string,\n agent: AgentType,\n focus: string,\n steps: number,\n): Promise<void> {\n if (!diff.trim()) {\n fail('No changes found to review.');\n process.exit(1);\n }\n\n info(`Reviewing: ${chalk.cyan(label)}`);\n log(`Focus: ${chalk.yellow(focus)} | Agent: ${chalk.yellow(agent)} | Steps: ${steps}`);\n\n const prompt = buildReviewPrompt(diff, focus);\n const result = await runAgentTask(agent, prompt, steps, process.cwd());\n\n if (result.exitCode === 0) {\n ok('Review complete.');\n } else {\n fail(`Agent exited with code ${result.exitCode}`);\n }\n}\n\nexport function registerReviewCommand(program: Command): void {\n const cmd = program\n .command('review [session-id]')\n .description('AI-powered code review of agent changes or git diffs')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude', 'copilot')\n .option(\n '-f, --focus <area>',\n 'Focus area: all, security, performance, bugs, style',\n 'all',\n )\n .option('-s, --steps <n>', 'Max agent steps', '5')\n .action(async (sessionId: string | undefined, opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n const steps = parseInt(opts.steps, 10);\n\n let sid = sessionId;\n if (!sid) {\n const sessions = listAllSessions(1);\n if (sessions.length === 0) {\n fail('No sessions found. Use \"review diff\" to review working tree changes.');\n process.exit(1);\n }\n sid = sessions[0].id;\n log(`Using latest session: ${chalk.dim(sid)}`);\n }\n\n const diff = getSessionDiff(sid);\n await runReview(`session ${sid.slice(0, 8)}…`, diff, agent, opts.focus, steps);\n } catch (err) {\n fail(`Review error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n\n cmd\n .command('diff')\n .description('Review current working tree changes')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude', 'copilot')\n .option(\n '-f, --focus <area>',\n 'Focus area: all, security, performance, bugs, style',\n 'all',\n )\n .option('-s, --steps <n>', 'Max agent steps', '5')\n .action(async (opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n const steps = parseInt(opts.steps, 10);\n const diff = getWorkingDiff();\n await runReview('working tree changes', diff, agent, opts.focus, steps);\n } catch (err) {\n fail(`Review error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n\n cmd\n .command('pr <number>')\n .description('Review a GitHub Pull Request')\n .option('-a, --agent <type>', 'Agent to use: copilot or claude', 'copilot')\n .option(\n '-f, --focus <area>',\n 'Focus area: all, security, performance, bugs, style',\n 'all',\n )\n .option('-s, --steps <n>', 'Max agent steps', '5')\n .action(async (number: string, opts) => {\n try {\n const agent = resolveAgent(opts.agent);\n const steps = parseInt(opts.steps, 10);\n const diff = getPrDiff(number);\n await runReview(`PR #${number}`, diff, agent, opts.focus, steps);\n } catch (err) {\n fail(`Review error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { runAgentTask } from '../lib/process.js';\nimport { resolveAgent, assertAgent, type AgentType } from '../lib/provider.js';\nimport { log, ok, warn, fail, info } from '../lib/logger.js';\nimport { BOLD, CYAN, DIM, RESET, YELLOW, GREEN } from '../lib/colors.js';\n\n// ─── Types ───\n\ninterface Schedule {\n name: string;\n cron: string;\n prompt: string;\n project: string;\n agent: AgentType;\n enabled: boolean;\n maxSteps?: number;\n}\n\n// ─── Paths ───\n\nconst CONFIG_DIR = join(homedir(), '.copilot-agent');\nconst SCHEDULES_FILE = join(CONFIG_DIR, 'schedules.yaml');\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n}\n\n// ─── Schedule persistence ───\n\nfunction loadSchedules(): Schedule[] {\n if (!existsSync(SCHEDULES_FILE)) return [];\n try {\n const raw = parseYaml(readFileSync(SCHEDULES_FILE, 'utf-8'));\n return Array.isArray(raw) ? raw : [];\n } catch {\n return [];\n }\n}\n\nfunction saveSchedules(schedules: Schedule[]): void {\n ensureConfigDir();\n writeFileSync(SCHEDULES_FILE, stringifyYaml(schedules), 'utf-8');\n}\n\n// ─── Cron matching ───\n\nexport function matchesCron(cron: string, date: Date): boolean {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return false;\n\n const [minPart, hourPart, , , dowPart] = parts;\n const minute = date.getMinutes();\n const hour = date.getHours();\n const dow = date.getDay(); // 0=Sun\n\n if (!matchField(minPart, minute)) return false;\n if (!matchField(hourPart, hour)) return false;\n if (!matchField(dowPart, dow)) return false;\n\n return true;\n}\n\nfunction matchField(pattern: string, value: number): boolean {\n if (pattern === '*') return true;\n\n // */N — every N\n const stepMatch = pattern.match(/^\\*\\/(\\d+)$/);\n if (stepMatch) {\n const step = parseInt(stepMatch[1], 10);\n return step > 0 && value % step === 0;\n }\n\n // Exact number\n const num = parseInt(pattern, 10);\n if (!isNaN(num)) return value === num;\n\n return false;\n}\n\n// ─── Next run calculation ───\n\nfunction nextRunTime(cron: string): Date | null {\n const now = new Date();\n // Check each minute in the next 7 days\n const limit = 7 * 24 * 60;\n const candidate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes());\n for (let i = 1; i <= limit; i++) {\n candidate.setMinutes(candidate.getMinutes() + 1);\n if (matchesCron(cron, candidate)) return new Date(candidate);\n }\n return null;\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });\n}\n\nfunction formatDateTime(date: Date): string {\n const day = date.toLocaleDateString([], { weekday: 'short', month: 'short', day: 'numeric' });\n return `${day} ${formatTime(date)}`;\n}\n\nfunction timestamp(): string {\n return `${DIM}[${formatTime(new Date())}]${RESET}`;\n}\n\n// ─── Commands ───\n\nfunction listCommand(): void {\n const schedules = loadSchedules();\n if (schedules.length === 0) {\n info('No schedules configured.');\n info(`Add one with: ${CYAN}copilot-agent schedule add <name> --cron \"...\" --prompt \"...\"${RESET}`);\n return;\n }\n\n log(`\\n${BOLD}Schedules${RESET} ${DIM}(${SCHEDULES_FILE})${RESET}\\n`);\n\n for (const s of schedules) {\n const status = s.enabled ? `${GREEN}●${RESET}` : `${DIM}○${RESET}`;\n const next = s.enabled ? nextRunTime(s.cron) : null;\n const nextStr = next ? `${DIM}next: ${formatDateTime(next)}${RESET}` : '';\n log(` ${status} ${BOLD}${s.name}${RESET} ${DIM}${s.cron}${RESET} ${nextStr}`);\n log(` ${DIM}prompt:${RESET} ${s.prompt.length > 60 ? s.prompt.slice(0, 57) + '...' : s.prompt}`);\n log(` ${DIM}project:${RESET} ${s.project} ${DIM}agent:${RESET} ${s.agent} ${DIM}steps:${RESET} ${s.maxSteps ?? 30}`);\n log('');\n }\n}\n\ninterface AddOptions {\n cron: string;\n prompt: string;\n project: string;\n agent?: string;\n steps: string;\n disabled: boolean;\n}\n\nfunction addCommand(name: string, opts: AddOptions): void {\n const schedules = loadSchedules();\n\n if (schedules.some(s => s.name === name)) {\n fail(`Schedule \"${name}\" already exists. Remove it first or use a different name.`);\n process.exit(1);\n }\n\n // Validate cron by testing it\n if (!opts.cron || opts.cron.trim().split(/\\s+/).length !== 5) {\n fail('Invalid cron expression. Expected 5 fields: minute hour day month weekday');\n process.exit(1);\n }\n\n const schedule: Schedule = {\n name,\n cron: opts.cron,\n prompt: opts.prompt,\n project: opts.project || process.cwd(),\n agent: resolveAgent(opts.agent),\n enabled: !opts.disabled,\n maxSteps: parseInt(opts.steps, 10) || 30,\n };\n\n schedules.push(schedule);\n saveSchedules(schedules);\n\n ok(`Added schedule \"${name}\"`);\n const next = nextRunTime(schedule.cron);\n if (next) {\n info(`Next run: ${formatDateTime(next)}`);\n }\n}\n\nfunction removeCommand(name: string): void {\n const schedules = loadSchedules();\n const idx = schedules.findIndex(s => s.name === name);\n\n if (idx === -1) {\n fail(`Schedule \"${name}\" not found.`);\n process.exit(1);\n }\n\n schedules.splice(idx, 1);\n saveSchedules(schedules);\n ok(`Removed schedule \"${name}\"`);\n}\n\nfunction dryRunCommand(): void {\n const schedules = loadSchedules().filter(s => s.enabled);\n\n if (schedules.length === 0) {\n info('No enabled schedules.');\n return;\n }\n\n log(`\\n${BOLD}Dry run — what would run next${RESET}\\n`);\n\n for (const s of schedules) {\n const next = nextRunTime(s.cron);\n if (next) {\n log(` ${CYAN}${s.name}${RESET} → ${formatDateTime(next)}`);\n log(` ${DIM}${s.agent}${RESET} in ${s.project}`);\n log(` ${DIM}prompt:${RESET} ${s.prompt.length > 70 ? s.prompt.slice(0, 67) + '...' : s.prompt}`);\n log('');\n }\n }\n}\n\nasync function runDaemon(): Promise<void> {\n const schedules = loadSchedules();\n const enabled = schedules.filter(s => s.enabled);\n\n if (enabled.length === 0) {\n fail('No enabled schedules. Add one first.');\n process.exit(1);\n }\n\n for (const s of enabled) {\n assertAgent(s.agent);\n }\n\n log(`\\n${BOLD}${CYAN}Scheduler daemon started${RESET}`);\n info(`${enabled.length} schedule(s) active. Press Ctrl+C to stop.\\n`);\n\n const lastRun = new Map<string, number>();\n\n const showStatus = () => {\n const now = new Date();\n let soonestName = '';\n let soonestTime: Date | null = null;\n\n for (const s of enabled) {\n const next = nextRunTime(s.cron);\n if (next && (!soonestTime || next < soonestTime)) {\n soonestTime = next;\n soonestName = s.name;\n }\n }\n\n const nextStr = soonestTime\n ? `next: ${CYAN}${soonestName}${RESET} at ${formatTime(soonestTime)}`\n : 'no upcoming runs';\n log(`${timestamp()} ${DIM}Scheduler running — ${enabled.length} schedules, ${nextStr}${RESET}`);\n };\n\n showStatus();\n\n const check = async () => {\n const now = new Date();\n // Normalize to the start of the current minute\n const minuteKey = `${now.getFullYear()}-${now.getMonth()}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}`;\n\n for (const s of enabled) {\n if (!matchesCron(s.cron, now)) continue;\n\n const runKey = `${s.name}:${minuteKey}`;\n if (lastRun.has(runKey)) continue;\n lastRun.set(runKey, Date.now());\n\n // Prune old entries\n const cutoff = Date.now() - 2 * 60 * 1000;\n for (const [k, v] of lastRun) {\n if (v < cutoff) lastRun.delete(k);\n }\n\n log(`\\n${timestamp()} ${BOLD}${YELLOW}▶ Running: ${s.name}${RESET}`);\n log(` ${DIM}cron:${RESET} ${s.cron} ${DIM}agent:${RESET} ${s.agent} ${DIM}project:${RESET} ${s.project}`);\n log(` ${DIM}prompt:${RESET} ${s.prompt}`);\n\n try {\n const result = await runAgentTask(\n s.agent,\n s.prompt,\n s.maxSteps ?? 30,\n s.project,\n );\n if (result.exitCode === 0) {\n ok(`${timestamp()} ✓ ${s.name} completed (session: ${result.sessionId?.slice(0, 8) ?? 'n/a'})`);\n } else {\n warn(`${timestamp()} ${s.name} exited with code ${result.exitCode}`);\n }\n } catch (err) {\n fail(`${timestamp()} ${s.name} failed: ${err instanceof Error ? err.message : err}`);\n }\n\n showStatus();\n }\n };\n\n // Initial check\n await check();\n\n // Check every 60 seconds\n const interval = setInterval(() => {\n check().catch(err => {\n fail(`Scheduler error: ${err instanceof Error ? err.message : err}`);\n });\n }, 60_000);\n\n // Graceful shutdown\n const shutdown = () => {\n log(`\\n${timestamp()} ${DIM}Scheduler stopped.${RESET}`);\n clearInterval(interval);\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n // Keep alive\n await new Promise(() => {});\n}\n\n// ─── Registration ───\n\nexport function registerScheduleCommand(program: Command): void {\n const cmd = program\n .command('schedule')\n .description('Cron-like recurring task scheduler');\n\n cmd\n .command('list')\n .description('Show all configured schedules')\n .action(() => {\n listCommand();\n });\n\n cmd\n .command('add <name>')\n .description('Add a recurring schedule')\n .requiredOption('--cron <expression>', 'Cron expression (e.g. \"0 */6 * * *\")')\n .requiredOption('--prompt <text>', 'Agent prompt to execute')\n .option('--project <path>', 'Project directory', process.cwd())\n .option('-a, --agent <type>', 'Agent: copilot or claude')\n .option('-s, --steps <n>', 'Max autopilot steps', '30')\n .option('--disabled', 'Add as disabled')\n .action((name: string, opts: AddOptions) => {\n addCommand(name, opts);\n });\n\n cmd\n .command('remove <name>')\n .description('Remove a schedule')\n .action((name: string) => {\n removeCommand(name);\n });\n\n cmd\n .command('run')\n .description('Start the scheduler daemon (foreground)')\n .action(async () => {\n try {\n await runDaemon();\n } catch (err) {\n fail(`Scheduler error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n\n cmd\n .command('dry-run')\n .description('Show what would run next for each schedule')\n .action(() => {\n dryRunCommand();\n });\n}\n"],"mappings":"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","names":["stat","stat","execSync","resolve","execSync","resolve","resolve","program","agentLabel","execSync","program","sleep","existsSync","readFileSync","readdirSync","join","basename","resolve","execSync","mkdirSync","readFileSync","join","homedir","existsSync","join","resolve","execSync","resolve","existsSync","program","timestamp","join","homedir","program","join","homedir","timestamp","sleep","existsSync","mkdirSync","join","resolve","homedir","program","resolve","join","existsSync","homedir","mkdirSync","timestamp","resolve","program","resolve","existsSync","join","basename","homedir","SESSION_DIR","CLAUDE_PROJECTS_DIR","resolve","parseSimpleYaml","bar","program","renderProcesses","spawn","program","spawn","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","existsSync","writeFileSync","program","chalk","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","program","chalk","program","chalk","chalk","join","homedir","join","homedir","program","chalk","bar","chalk","writeFileSync","existsSync","mkdirSync","join","homedir","join","homedir","ensureDir","existsSync","mkdirSync","writeFileSync","program","chalk","chalk","readFileSync","existsSync","join","homedir","parseYaml","findUpSync","program","chalk","chalk","execaCommandSync","program","chalk","execaCommandSync","chalk","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","parseYaml","stringifyYaml","CONFIG_DIR","ensureDir","program","chalk","writeFileSync","program","chalk","fmtTime","statusIcon","fmtDur","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","basename","homedir","chalk","parseYaml","stringifyYaml","CONFIG_DIR","join","homedir","program","mkdirSync","existsSync","writeFileSync","readFileSync","parseYaml","stringifyYaml","formatDuration","resolve","chalk","basename","chalk","execSync","execSync","chalk","program","readFileSync","writeFileSync","existsSync","mkdirSync","join","homedir","parseYaml","stringifyYaml","CONFIG_DIR","join","homedir","ensureConfigDir","existsSync","mkdirSync","parseYaml","readFileSync","writeFileSync","stringifyYaml","formatTime","showStatus","program"]}