deeper-cli 1.0.5 → 1.2.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.d.ts CHANGED
@@ -123,6 +123,7 @@ interface ToolCall {
123
123
  id: string;
124
124
  name: string;
125
125
  arguments: Record<string, unknown>;
126
+ index?: number;
126
127
  }
127
128
  interface ToolCallResult {
128
129
  callId: string;
@@ -137,16 +138,20 @@ interface ChatMessage {
137
138
  role: 'system' | 'user' | 'assistant' | 'tool';
138
139
  content: string | null;
139
140
  tool_calls?: ToolCall[];
140
- toolCalls?: ToolCallRecord[];
141
141
  tool_call_id?: string;
142
142
  name?: string;
143
+ reasoning_content?: string;
143
144
  thinking?: string;
144
145
  timestamp?: number;
145
146
  }
146
147
  interface StreamChunk {
147
- type: 'text' | 'thinking' | 'tool_call' | 'done' | 'error';
148
+ type: 'text' | 'thinking' | 'tool_call_start' | 'tool_call_end' | 'tool_call' | 'done' | 'error';
148
149
  content?: string;
149
- tool_call?: ToolCall;
150
+ tool_call?: ToolCall | {
151
+ id: string;
152
+ name: string;
153
+ index?: number;
154
+ };
150
155
  error?: string;
151
156
  }
152
157
  interface ToolCallRecord {
package/dist/index.js CHANGED
@@ -592,13 +592,31 @@ var SLASH_COMMANDS = [
592
592
  { command: "/help", description: "\u663E\u793A\u5E2E\u52A9\u4FE1\u606F" },
593
593
  { command: "/clear", description: "\u6E05\u7A7A\u5BF9\u8BDD" },
594
594
  { command: "/quit", description: "\u9000\u51FA DeeperCode" },
595
+ { command: "/save [name]", description: "\u4FDD\u5B58\u5F53\u524D\u4F1A\u8BDD" },
596
+ { command: "/load [name]", description: "\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD" },
597
+ { command: "/resume [name]", description: "\u6062\u590D\u5386\u53F2\u4F1A\u8BDD" },
598
+ { command: "/sessions", description: "\u4F1A\u8BDD\u5217\u8868" },
595
599
  { command: "/model", description: "\u67E5\u770B/\u5207\u6362\u6A21\u578B" },
596
600
  { command: "/config", description: "\u67E5\u770B/\u4FEE\u6539\u914D\u7F6E" },
597
- { command: "/tools", description: "\u5217\u51FA\u53EF\u7528\u5DE5\u5177" },
601
+ { command: "/tools [cat]", description: "\u5217\u51FA\u53EF\u7528\u5DE5\u5177" },
598
602
  { command: "/skills", description: "\u5217\u51FA\u5DF2\u52A0\u8F7D\u6280\u80FD" },
599
603
  { command: "/mcp", description: "\u7BA1\u7406 MCP \u8FDE\u63A5" },
600
- { command: "/save", description: "\u4FDD\u5B58\u5F53\u524D\u4F1A\u8BDD" },
601
- { command: "/load", description: "\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD" }
604
+ { command: "/memory", description: "\u8BB0\u5FC6\u7CFB\u7EDF" },
605
+ { command: "/tasks", description: "\u4EFB\u52A1\u5217\u8868" },
606
+ { command: "/rules", description: "\u89C4\u5219\u7BA1\u7406" },
607
+ { command: "/stats", description: "\u7EDF\u8BA1\u4FE1\u606F" },
608
+ { command: "/status", description: "\u5F53\u524D\u72B6\u6001" },
609
+ { command: "/cwd", description: "\u5F53\u524D\u76EE\u5F55" },
610
+ { command: "/export", description: "\u5BFC\u51FA\u5BF9\u8BDD" },
611
+ { command: "/init", description: "\u521D\u59CB\u5316\u9879\u76EE" },
612
+ { command: "/plan <\u4EFB\u52A1>", description: "\u5148\u51FA\u65B9\u6848\u518D\u5B9E\u65BD" },
613
+ { command: "/spec <\u4EFB\u52A1>", description: "\u5148\u51FA\u89C4\u683C\u518D\u5B9E\u65BD" },
614
+ { command: "/review <\u8DEF\u5F84>", description: "\u4EE3\u7801\u5BA1\u67E5" },
615
+ { command: "/fix [\u76EE\u6807]", description: "\u81EA\u52A8\u4FEE\u590D\u6784\u5EFA/\u6D4B\u8BD5\u9519\u8BEF" },
616
+ { command: "/commit", description: "\u667A\u80FD\u5206\u6790\u53D8\u66F4\u5E76\u63D0\u4EA4" },
617
+ { command: "/analyze [\u8DEF\u5F84]", description: "\u9879\u76EE\u67B6\u6784\u5206\u6790" },
618
+ { command: "/diff <\u6587\u4EF6>", description: "\u67E5\u770B\u6587\u4EF6\u53D8\u66F4" },
619
+ { command: "/undo", description: "\u64A4\u9500\u6700\u8FD1\u6587\u4EF6\u4FEE\u6539" }
602
620
  ];
603
621
 
604
622
  // src/ui/InputBox.tsx
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/themes/default.ts","../src/ui/themes/dark.ts","../src/ui/themes/light.ts","../src/ui/Spinner.tsx","../src/ui/MessageBubble.tsx","../src/ui/ToolCallCard.tsx","../src/ui/DiffView.tsx","../src/ui/FilePreview.tsx","../src/ui/AgentTree.tsx","../src/ui/ConfirmDialog.tsx","../src/ui/StatusBar.tsx","../src/core/eventbus.ts","../src/ui/InputBox.tsx","../src/model/types.ts","../src/ui/ChatView.tsx","../src/ui/App.tsx","../src/core/config.ts","../src/core/constants.ts","../src/tools/tool-types.ts","../src/cli/bootstrap.ts","../src/cli/commands/chat.tsx","../src/cli/commands/run.ts"],"sourcesContent":["export interface Theme {\n primary: string;\n secondary: string;\n success: string;\n warning: string;\n error: string;\n text: string;\n dimText: string;\n border: string;\n background: string;\n cardBackground: string;\n}\n\nexport const defaultTheme: Theme = {\n primary: '#00BFA5',\n secondary: '#7C4DFF',\n success: '#00E676',\n warning: '#FFAB40',\n error: '#FF5252',\n text: '#E0E0E0',\n dimText: '#757575',\n border: '#424242',\n background: '#121212',\n cardBackground: '#1E1E1E',\n};\n","import type { Theme } from './default.ts';\nimport { defaultTheme } from './default.ts';\n\nexport const darkTheme: Theme = { ...defaultTheme };\n","import type { Theme } from './default.ts';\n\nexport const lightTheme: Theme = {\n primary: '#00897B',\n secondary: '#6200EA',\n success: '#00C853',\n warning: '#FF6D00',\n error: '#D50000',\n text: '#212121',\n dimText: '#9E9E9E',\n border: '#E0E0E0',\n background: '#FAFAFA',\n cardBackground: '#FFFFFF',\n};\n","import { useState, useEffect } from 'react';\nimport { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\nconst spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\ninterface SpinnerProps {\n label?: string;\n type?: 'dots' | 'line' | 'braille';\n}\n\nexport function Spinner({ label, type = 'braille' }: SpinnerProps) {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame((prev) => (prev + 1) % spinnerFrames.length);\n }, 80);\n return () => clearInterval(timer);\n }, []);\n\n const dotsFrames = [' ', '. ', '.. ', '...'];\n const frameChar = type === 'dots'\n ? dotsFrames[frame % dotsFrames.length]\n : type === 'line'\n ? ['|', '/', '-', '\\\\'][frame % 4]\n : spinnerFrames[frame];\n\n return (\n <Box>\n <Text color={defaultTheme.primary}>{frameChar}</Text>\n {label ? <Text> {label}</Text> : null}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface Props {\n role: 'user' | 'assistant' | 'system' | 'tool';\n content: string | null;\n thinking?: string;\n timestamp?: number;\n}\n\nexport function MessageBubble({ role, content }: Props) {\n const display = content ?? '';\n const lines = display.split('\\n');\n const color = role === 'user' ? defaultTheme.secondary : defaultTheme.text;\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={role === 'user' ? defaultTheme.secondary : defaultTheme.primary} bold>\n {role === 'user' ? '> ' : role === 'system' ? '⚙ ' : '● '}\n </Text>\n </Box>\n {lines.map((line, i) => (\n <Box key={i} paddingLeft={1}>\n <Text color={color}>{line || ' '}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface ToolCallCardProps {\n toolName: string;\n args: Record<string, unknown>;\n result?: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n}\n\nconst statusConfig: Record<ToolCallCardProps['status'], { icon: string; color: string; label: string }> = {\n pending: { icon: '⏳', color: defaultTheme.dimText, label: '等待中' },\n running: { icon: '🔄', color: defaultTheme.primary, label: '执行中' },\n completed: { icon: '✅', color: defaultTheme.success, label: '已完成' },\n failed: { icon: '❌', color: defaultTheme.error, label: '失败' },\n};\n\nfunction summarizeArgs(args: Record<string, unknown>): string {\n const entries = Object.entries(args);\n if (entries.length === 0) return '无参数';\n\n const maxLen = 60;\n const summary = entries\n .map(([k, v]) => {\n const strVal = typeof v === 'string' ? v : JSON.stringify(v);\n return `${k}: ${strVal.length > 40 ? strVal.slice(0, 40) + '...' : strVal}`;\n })\n .join(', ');\n\n return summary.length > maxLen ? summary.slice(0, maxLen) + '...' : summary;\n}\n\nexport function ToolCallCard({ toolName, args, result, status }: ToolCallCardProps) {\n const cfg = statusConfig[status];\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={cfg.color}\n paddingX={1}\n marginY={0}\n >\n <Box>\n <Text color={cfg.color}>{cfg.icon}</Text>\n <Text bold color={cfg.color}> {toolName}</Text>\n <Text dimColor> - {cfg.label}</Text>\n </Box>\n\n <Box marginTop={0}>\n <Text dimColor>参数: </Text>\n <Text>{summarizeArgs(args)}</Text>\n </Box>\n\n {result && status === 'completed' ? (\n <Box marginTop={0} flexDirection=\"column\">\n <Text dimColor>结果: </Text>\n <Box borderStyle=\"single\" borderColor={defaultTheme.border} paddingX={1}>\n <Text>\n {result.length > 200 ? result.slice(0, 200) + '...' : result}\n </Text>\n </Box>\n </Box>\n ) : null}\n\n {result && status === 'failed' ? (\n <Box marginTop={0}>\n <Text color={defaultTheme.error}>错误: {result}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { useMemo } from 'react';\nimport { Text, Box } from 'ink';\nimport { diffLines } from 'diff';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface DiffViewProps {\n filePath: string;\n oldContent: string;\n newContent: string;\n}\n\nexport function DiffView({ filePath, oldContent, newContent }: DiffViewProps) {\n const changes = useMemo(() => {\n return diffLines(oldContent || '', newContent || '', {\n ignoreWhitespace: false,\n });\n }, [oldContent, newContent]);\n\n const addedCount = changes.filter((c) => c.added).length;\n const removedCount = changes.filter((c) => c.removed).length;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={defaultTheme.border} paddingX={1}>\n <Box>\n <Text bold>📄 </Text>\n <Text bold color={defaultTheme.primary}>{filePath}</Text>\n <Text dimColor>\n {' '}\n <Text color={defaultTheme.success}>+{addedCount}</Text>\n {' / '}\n <Text color={defaultTheme.error}>-{removedCount}</Text>\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={0}>\n {changes.slice(0, 50).map((change, i) => {\n if (change.added) {\n return (\n <Box key={i}>\n <Text color={defaultTheme.success}>+ {change.value.trimEnd()}</Text>\n </Box>\n );\n }\n if (change.removed) {\n return (\n <Box key={i}>\n <Text color={defaultTheme.error}>- {change.value.trimEnd()}</Text>\n </Box>\n );\n }\n return (\n <Box key={i}>\n <Text dimColor> {change.value.trimEnd()}</Text>\n </Box>\n );\n })}\n </Box>\n\n {changes.length > 50 ? (\n <Text dimColor>... 还有 {changes.length - 50} 处变更未显示</Text>\n ) : null}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface FilePreviewProps {\n filePath: string;\n content?: string;\n language?: string;\n lineCount?: number;\n size?: number;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction detectLang(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase();\n const map: Record<string, string> = {\n ts: 'TypeScript', tsx: 'TSX', js: 'JavaScript', jsx: 'JSX',\n py: 'Python', rs: 'Rust', go: 'Go', java: 'Java',\n json: 'JSON', yaml: 'YAML', yml: 'YAML', toml: 'TOML',\n md: 'Markdown', html: 'HTML', css: 'CSS', scss: 'SCSS',\n sql: 'SQL', sh: 'Shell', bat: 'Batch', ps1: 'PowerShell',\n };\n return map[ext || ''] || ext?.toUpperCase() || 'text';\n}\n\nexport function FilePreview({ filePath, content, language, lineCount, size }: FilePreviewProps) {\n const lang = language || detectLang(filePath);\n const lines = content ? content.split('\\n').slice(0, 10) : [];\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={defaultTheme.border} paddingX={1}>\n <Box>\n <Text bold>📄 </Text>\n <Text bold color={defaultTheme.primary}>{filePath}</Text>\n <Text dimColor> ({lang})</Text>\n {size !== undefined ? <Text dimColor> - {formatSize(size)}</Text> : null}\n {lineCount !== undefined ? <Text dimColor> - {lineCount} 行</Text> : null}\n </Box>\n\n {content ? (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={defaultTheme.border} paddingX={1} marginTop={0}>\n {lines.map((line, i) => (\n <Box key={i}>\n <Text dimColor>{(i + 1).toString().padStart(3, ' ')} │ </Text>\n <Text>{line.length > 100 ? line.slice(0, 100) + '...' : line}</Text>\n </Box>\n ))}\n {content.split('\\n').length > 10 ? (\n <Text dimColor>... 还有 {content.split('\\n').length - 10} 行</Text>\n ) : null}\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface AgentNode {\n id: string;\n name: string;\n status: 'idle' | 'running' | 'completed' | 'failed';\n children?: AgentNode[];\n}\n\ninterface AgentTreeProps {\n agents: AgentNode[];\n}\n\nconst statusIcon: Record<AgentNode['status'], string> = {\n idle: '⏸',\n running: '🔄',\n completed: '✅',\n failed: '❌',\n};\n\nconst statusColor: Record<AgentNode['status'], string> = {\n idle: defaultTheme.dimText,\n running: defaultTheme.primary,\n completed: defaultTheme.success,\n failed: defaultTheme.error,\n};\n\nfunction AgentNodeRow({\n node,\n depth,\n isLast,\n}: {\n node: AgentNode;\n depth: number;\n isLast: boolean;\n}) {\n const prefix = depth === 0\n ? ''\n : ' '.repeat(depth - 1) + (isLast ? '└─' : '├─');\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text dimColor>{prefix}</Text>\n <Text color={statusColor[node.status]}>{statusIcon[node.status]}</Text>\n <Text bold color={statusColor[node.status]}> {node.name}</Text>\n </Box>\n {node.children?.map((child, i) => (\n <AgentNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n isLast={i === (node.children?.length || 0) - 1}\n />\n ))}\n </Box>\n );\n}\n\nexport function AgentTree({ agents }: AgentTreeProps) {\n const total = agents.length;\n const running = agents.filter((a) => a.status === 'running').length;\n const completed = agents.filter((a) => a.status === 'completed').length;\n const failed = agents.filter((a) => a.status === 'failed').length;\n\n const countChildren = (ns: AgentNode[]): number =>\n ns.reduce((sum, n) => sum + 1 + countChildren(n.children || []), 0);\n\n const totalWithChildren = countChildren(agents);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={defaultTheme.border} paddingX={1}>\n <Box>\n <Text bold>🤖 Agent 树</Text>\n <Text dimColor>\n {' '}\n [{totalWithChildren} 节点:\n {' '}<Text color={defaultTheme.success}>{completed} 完成</Text>\n {running > 0 ? <Text color={defaultTheme.primary}> {running} 运行</Text> : null}\n {failed > 0 ? <Text color={defaultTheme.error}> {failed} 失败</Text> : null}\n ]\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={0}>\n {agents.map((agent, i) => (\n <AgentNodeRow\n key={agent.id}\n node={agent}\n depth={0}\n isLast={i === total - 1}\n />\n ))}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface ConfirmDialogProps {\n message: string;\n detail?: string;\n onConfirm: () => void;\n onReject: () => void;\n}\n\nexport function ConfirmDialog({ message, detail, onConfirm, onReject }: ConfirmDialogProps) {\n const [selected, setSelected] = useState<'confirm' | 'reject'>('reject');\n\n useInput((input, key) => {\n if (key.leftArrow || key.rightArrow) {\n setSelected((prev) => (prev === 'confirm' ? 'reject' : 'confirm'));\n }\n if (key.return) {\n if (selected === 'confirm') {\n onConfirm();\n } else {\n onReject();\n }\n }\n if (input === 'y' || input === 'Y') {\n onConfirm();\n }\n if (input === 'n' || input === 'N') {\n onReject();\n }\n });\n\n useEffect(() => {\n setSelected('reject');\n }, [message]);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"double\" borderColor={defaultTheme.warning} paddingX={2} paddingY={1}>\n <Box>\n <Text bold color={defaultTheme.warning}>⚠ {message}</Text>\n </Box>\n {detail ? (\n <Box marginTop={0}>\n <Text dimColor>{detail}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Box marginRight={2}>\n <Text\n color={selected === 'confirm' ? defaultTheme.success : defaultTheme.dimText}\n bold={selected === 'confirm'}\n >\n {selected === 'confirm' ? '▶ ' : ' '}[Y] 确认\n </Text>\n </Box>\n <Box>\n <Text\n color={selected === 'reject' ? defaultTheme.error : defaultTheme.dimText}\n bold={selected === 'reject'}\n >\n {selected === 'reject' ? '▶ ' : ' '}[N] 取消\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\nimport { eventbus, type ContextUpdatedPayload } from '../core/eventbus.ts';\n\nfunction fmtTokens(n: number): string {\n return n > 1000 ? `${(n / 1000).toFixed(1)}K` : `${n}`;\n}\n\nfunction fmtUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n return `${m}m ${s % 60}s`;\n}\n\nexport function StatusBar() {\n const [st, setSt] = useState<ContextUpdatedPayload>({\n modelName: 'deepseek-v4-pro',\n tokenCount: 0,\n memoryUsage: 0,\n uptime: 0,\n });\n\n useEffect(() => {\n const h = (p: Partial<ContextUpdatedPayload>) => setSt(prev => ({ ...prev, ...p }));\n eventbus.onStatusUpdate(h);\n eventbus.onContextUpdated(h);\n return () => { eventbus.removeAllListeners(); };\n }, []);\n\n return (\n <Box flexDirection=\"row\" paddingX={1}>\n <Text dimColor>{st.modelName}</Text>\n <Text dimColor> | Tok: {fmtTokens(st.tokenCount)}</Text>\n <Text dimColor> | Mem: {st.memoryUsage}MB</Text>\n <Text dimColor> | {fmtUptime(st.uptime)}</Text>\n <Text dimColor> | Ctrl+C 退出</Text>\n </Box>\n );\n}\n","import { EventEmitter } from 'node:events';\n\nexport interface ContextUpdatedPayload {\n modelName: string;\n tokenCount: number;\n memoryUsage: number;\n uptime: number;\n}\n\nexport interface MessagePayload {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n thinking?: string;\n timestamp: number;\n}\n\nexport interface ToolCallPayload {\n id: string;\n toolName: string;\n args: Record<string, unknown>;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: string;\n}\n\nexport interface DiffPayload {\n filePath: string;\n oldContent: string;\n newContent: string;\n}\n\nexport interface AgentPayload {\n id: string;\n name: string;\n status: 'idle' | 'running' | 'completed' | 'failed';\n parentId?: string;\n task: string;\n children?: AgentPayload[];\n}\n\nexport const Events = {\n CONTEXT_UPDATED: 'context:updated',\n MESSAGE_SEND: 'message:send',\n MESSAGE_RECEIVED: 'message:received',\n MESSAGE_STREAMING: 'message:streaming',\n TOOL_CALL_START: 'tool:call:start',\n TOOL_CALL_END: 'tool:call:end',\n FILE_DIFF: 'file:diff',\n AGENT_TREE_UPDATED: 'agent:tree:updated',\n APP_QUIT: 'app:quit',\n APP_CLEAR: 'app:clear',\n STATUS_UPDATE: 'status:update',\n CONFIG_CHANGED: 'config:changed',\n AGENT_STATUS_CHANGE: 'agent:status:change',\n AGENT_CREATED: 'agent:created',\n AGENT_THINKING: 'agent:thinking',\n AGENT_EXECUTING: 'agent:executing',\n AGENT_WAITING: 'agent:waiting',\n AGENT_COMPLETED: 'agent:completed',\n AGENT_FAILED: 'agent:failed',\n AGENT_CANCELLED: 'agent:cancelled',\n AGENT_LOOP_ITERATION: 'agent:loop:iteration',\n AGENT_LOOP_DETECTED: 'agent:loop:detected',\n AGENT_LOOP_LIMIT: 'agent:loop:limit',\n TOOL_CALL_ERROR: 'tool:call:error',\n ORCHESTRATOR_DECOMPOSE: 'orchestrator:decompose',\n ORCHESTRATOR_DISPATCH: 'orchestrator:dispatch',\n ORCHESTRATOR_AGGREGATE: 'orchestrator:aggregate',\n SUBAGENT_START: 'subagent:start',\n SUBAGENT_TIMEOUT: 'subagent:timeout',\n SUBAGENT_COMPLETE: 'subagent:complete',\n SUBAGENT_ERROR: 'subagent:error',\n POOL_ACQUIRE: 'pool:acquire',\n POOL_RELEASE: 'pool:release',\n POOL_QUEUE: 'pool:queue',\n CONTEXT_SUMMARIZED: 'context:summarized',\n CONTEXT_TOKEN_WARNING: 'context:token:warning',\n MCP_CONNECTED: 'mcp:connected',\n MCP_ERROR: 'mcp:error',\n MCP_DISCONNECTED: 'mcp:disconnected',\n MCP_TOOLS_DISCOVERED: 'mcp:tools:discovered',\n SKILL_LOADED: 'skill:loaded',\n SKILL_EXECUTED: 'skill:executed',\n SKILL_CREATED: 'skill:created',\n SKILL_TRIGGERED: 'skill:triggered',\n} as const;\n\nexport const EventBusEvents = Events;\n\nexport class EventBus extends EventEmitter {\n private static instance: EventBus;\n\n static getInstance(): EventBus {\n if (!EventBus.instance) {\n EventBus.instance = new EventBus();\n }\n return EventBus.instance;\n }\n\n onContextUpdated(handler: (payload: ContextUpdatedPayload) => void): void {\n this.on(EventBusEvents.CONTEXT_UPDATED, handler);\n }\n\n emitContextUpdated(payload: ContextUpdatedPayload): void {\n this.emit(EventBusEvents.CONTEXT_UPDATED, payload);\n }\n\n onMessageSend(handler: (payload: { content: string }) => void): void {\n this.on(EventBusEvents.MESSAGE_SEND, handler);\n }\n\n emitMessageSend(payload: { content: string }): void {\n this.emit(EventBusEvents.MESSAGE_SEND, payload);\n }\n\n onMessageReceived(handler: (payload: MessagePayload) => void): void {\n this.on(EventBusEvents.MESSAGE_RECEIVED, handler);\n }\n\n emitMessageReceived(payload: MessagePayload): void {\n this.emit(EventBusEvents.MESSAGE_RECEIVED, payload);\n }\n\n onMessageStreaming(handler: (payload: { id: string; content: string; thinking?: string }) => void): void {\n this.on(EventBusEvents.MESSAGE_STREAMING, handler);\n }\n\n emitMessageStreaming(payload: { id: string; content: string; thinking?: string }): void {\n this.emit(EventBusEvents.MESSAGE_STREAMING, payload);\n }\n\n onToolCallStart(handler: (payload: ToolCallPayload) => void): void {\n this.on(EventBusEvents.TOOL_CALL_START, handler);\n }\n\n emitToolCallStart(payload: ToolCallPayload): void {\n this.emit(EventBusEvents.TOOL_CALL_START, payload);\n }\n\n onToolCallEnd(handler: (payload: ToolCallPayload) => void): void {\n this.on(EventBusEvents.TOOL_CALL_END, handler);\n }\n\n emitToolCallEnd(payload: ToolCallPayload): void {\n this.emit(EventBusEvents.TOOL_CALL_END, payload);\n }\n\n onFileDiff(handler: (payload: DiffPayload) => void): void {\n this.on(EventBusEvents.FILE_DIFF, handler);\n }\n\n emitFileDiff(payload: DiffPayload): void {\n this.emit(EventBusEvents.FILE_DIFF, payload);\n }\n\n onAgentTreeUpdated(handler: (payload: { agents: AgentPayload[] }) => void): void {\n this.on(EventBusEvents.AGENT_TREE_UPDATED, handler);\n }\n\n emitAgentTreeUpdated(payload: { agents: AgentPayload[] }): void {\n this.emit(EventBusEvents.AGENT_TREE_UPDATED, payload);\n }\n\n onAppQuit(handler: () => void): void {\n this.on(EventBusEvents.APP_QUIT, handler);\n }\n\n emitAppQuit(): void {\n this.emit(EventBusEvents.APP_QUIT);\n }\n\n onAppClear(handler: () => void): void {\n this.on(EventBusEvents.APP_CLEAR, handler);\n }\n\n emitAppClear(): void {\n this.emit(EventBusEvents.APP_CLEAR);\n }\n\n onStatusUpdate(handler: (payload: Partial<ContextUpdatedPayload>) => void): void {\n this.on(EventBusEvents.STATUS_UPDATE, handler);\n }\n\n emitStatusUpdate(payload: Partial<ContextUpdatedPayload>): void {\n this.emit(EventBusEvents.STATUS_UPDATE, payload);\n }\n\n onConfigChanged(handler: (payload: Record<string, unknown>) => void): void {\n this.on(EventBusEvents.CONFIG_CHANGED, handler);\n }\n\n emitConfigChanged(payload: Record<string, unknown>): void {\n this.emit(EventBusEvents.CONFIG_CHANGED, payload);\n }\n\n reset(): void {\n this.removeAllListeners();\n }\n}\n\nexport const eventbus = EventBus.getInstance();\nexport const globalEventBus = eventbus;\n","import { useState, useCallback, useRef } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\nimport { eventbus } from '../core/eventbus.ts';\nimport { SLASH_COMMANDS } from '../model/types.ts';\n\ninterface InputBoxProps {\n onSubmit: (content: string) => void;\n placeholder?: string;\n}\n\nconst MAX_HISTORY = 100;\nconst history: string[] = [];\n\nfunction addHistory(content: string) {\n if (content.trim() && history[history.length - 1] !== content) {\n history.push(content);\n if (history.length > MAX_HISTORY) {\n history.shift();\n }\n }\n}\n\nexport function InputBox({ onSubmit, placeholder = '输入消息...' }: InputBoxProps) {\n const [value, setValue] = useState('');\n const [cursorPos, setCursorPos] = useState(0);\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [showConfirmExit, setShowConfirmExit] = useState(false);\n const [tabSuggestions, setTabSuggestions] = useState<string[]>([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed) return;\n\n if (trimmed.startsWith('/')) {\n const cmd = SLASH_COMMANDS.find((c) => trimmed.startsWith(c.command));\n if (cmd) {\n eventbus.emitMessageSend({ content: trimmed });\n addHistory(trimmed);\n setValue('');\n setCursorPos(0);\n setHistoryIndex(-1);\n return;\n }\n }\n\n onSubmit(trimmed);\n eventbus.emitMessageSend({ content: trimmed });\n addHistory(trimmed);\n setValue('');\n setCursorPos(0);\n setHistoryIndex(-1);\n }, [value, onSubmit]);\n\n const handleTabComplete = useCallback(() => {\n if (value.startsWith('/')) {\n const matching = SLASH_COMMANDS\n .filter((c) => c.command.startsWith(value))\n .map((c) => c.command);\n\n if (matching.length === 1) {\n setValue(matching[0] + ' ');\n setCursorPos(matching[0].length + 1);\n setShowSuggestions(false);\n } else if (matching.length > 1) {\n setTabSuggestions(matching);\n setShowSuggestions(true);\n }\n }\n }, [value]);\n\n useInput((input, key) => {\n if (showConfirmExit) {\n if (input === 'y' || input === 'Y') {\n eventbus.emitAppQuit();\n return;\n }\n if (input === 'n' || input === 'N' || key.escape) {\n setShowConfirmExit(false);\n return;\n }\n return;\n }\n\n if (input === '\\x03') {\n setShowConfirmExit(true);\n return;\n }\n\n if (key.return) {\n if (key.ctrl) {\n handleSubmit();\n return;\n }\n if (showSuggestions) {\n setShowSuggestions(false);\n return;\n }\n handleSubmit();\n return;\n }\n\n if (key.tab) {\n handleTabComplete();\n return;\n }\n\n if (key.upArrow) {\n if (showSuggestions) {\n setShowSuggestions(false);\n return;\n }\n if (history.length === 0) return;\n const newIndex = historyIndex === -1\n ? history.length - 1\n : Math.max(0, historyIndex - 1);\n setHistoryIndex(newIndex);\n setValue(history[newIndex]);\n setCursorPos(history[newIndex].length);\n return;\n }\n\n if (key.downArrow) {\n if (showSuggestions) {\n setShowSuggestions(false);\n return;\n }\n if (historyIndex === -1) return;\n const newIndex = historyIndex + 1;\n if (newIndex >= history.length) {\n setHistoryIndex(-1);\n setValue('');\n setCursorPos(0);\n } else {\n setHistoryIndex(newIndex);\n setValue(history[newIndex]);\n setCursorPos(history[newIndex].length);\n }\n return;\n }\n\n if (key.escape) {\n setShowSuggestions(false);\n return;\n }\n\n if (key.backspace || key.delete) {\n setShowSuggestions(false);\n if (key.backspace) {\n if (cursorPos > 0) {\n const newVal = value.slice(0, cursorPos - 1) + value.slice(cursorPos);\n setValue(newVal);\n setCursorPos(Math.max(0, cursorPos - 1));\n }\n }\n if (key.delete) {\n if (cursorPos < value.length) {\n const newVal = value.slice(0, cursorPos) + value.slice(cursorPos + 1);\n setValue(newVal);\n }\n }\n return;\n }\n\n if (key.leftArrow) {\n setCursorPos(Math.max(0, cursorPos - 1));\n return;\n }\n\n if (key.rightArrow) {\n setCursorPos(Math.min(value.length, cursorPos + 1));\n return;\n }\n\n if ((key as Record<string, unknown>).home) {\n setCursorPos(0);\n return;\n }\n\n if ((key as Record<string, unknown>).end) {\n setCursorPos(value.length);\n return;\n }\n\n if (input && input.length === 1 && !key.ctrl && !key.meta) {\n const newVal = value.slice(0, cursorPos) + input + value.slice(cursorPos);\n setValue(newVal);\n setCursorPos(cursorPos + 1);\n\n if (newVal.startsWith('/') && newVal.length > 1) {\n const matching = SLASH_COMMANDS\n .filter((c) => c.command.startsWith(newVal))\n .map((c) => c.command);\n if (matching.length > 0) {\n setTabSuggestions(matching);\n setShowSuggestions(true);\n } else {\n setShowSuggestions(false);\n }\n } else {\n setShowSuggestions(false);\n }\n return;\n }\n });\n\n if (showConfirmExit) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"double\"\n borderColor={defaultTheme.error}\n paddingX={2}\n paddingY={0}\n >\n <Box>\n <Text bold color={defaultTheme.error}>⚠ 确认退出 DeeperCode?</Text>\n </Box>\n <Box marginTop={0}>\n <Text>按 [Y] 退出 [N/ESC] 取消</Text>\n </Box>\n </Box>\n );\n }\n\n const cursorChar = '█';\n\n const beforeCursor = value.slice(0, cursorPos);\n const atCursor = value[cursorPos] || ' ';\n const afterCursor = value.slice(cursorPos + 1);\n\n return (\n <Box flexDirection=\"column\">\n {showSuggestions && tabSuggestions.length > 0 ? (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={defaultTheme.border} paddingX={1}>\n {tabSuggestions.map((s) => (\n <Text key={s} color={defaultTheme.primary}>{s}</Text>\n ))}\n </Box>\n ) : null}\n\n <Box\n flexDirection=\"row\"\n borderStyle=\"round\"\n borderColor={defaultTheme.primary}\n paddingX={1}\n >\n <Text color={defaultTheme.primary} bold>❯ </Text>\n <Box>\n <Text>{beforeCursor}</Text>\n <Text backgroundColor={defaultTheme.primary} color={defaultTheme.background}>\n {atCursor}\n </Text>\n <Text>{afterCursor}</Text>\n {value.length === 0 ? (\n <Text dimColor>{placeholder}</Text>\n ) : null}\n </Box>\n <Text dimColor> Ctrl+Enter 发送</Text>\n </Box>\n </Box>\n );\n}\n","import type { ToolCall, ToolDefinition } from '../tools/tool-types.js';\n\nexport interface ChatMessage {\n id?: string;\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | null;\n tool_calls?: ToolCall[];\n toolCalls?: ToolCallRecord[];\n tool_call_id?: string;\n name?: string;\n thinking?: string;\n timestamp?: number;\n}\n\nexport interface StreamChunk {\n type: 'text' | 'thinking' | 'tool_call' | 'done' | 'error';\n content?: string;\n tool_call?: ToolCall;\n error?: string;\n}\n\nexport interface DeepSeekConfig {\n apiKey: string;\n model: string;\n baseUrl: string;\n temperature: number;\n maxTokens: number;\n think: {\n enabled: boolean;\n budgetTokens: number;\n };\n}\n\nexport interface ToolCallRecord {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: string;\n}\n\nexport interface AgentInfo {\n id: string;\n name: string;\n status: 'idle' | 'running' | 'completed' | 'failed';\n task: string;\n children?: AgentInfo[];\n}\n\nexport interface SlashCommand {\n command: string;\n description: string;\n}\n\nexport const SLASH_COMMANDS: SlashCommand[] = [\n { command: '/help', description: '显示帮助信息' },\n { command: '/clear', description: '清空对话' },\n { command: '/quit', description: '退出 DeeperCode' },\n { command: '/model', description: '查看/切换模型' },\n { command: '/config', description: '查看/修改配置' },\n { command: '/tools', description: '列出可用工具' },\n { command: '/skills', description: '列出已加载技能' },\n { command: '/mcp', description: '管理 MCP 连接' },\n { command: '/save', description: '保存当前会话' },\n { command: '/load', description: '加载历史会话' },\n];\n\nexport type DeepSeekMessage = ChatMessage;\nexport type DeepSeekToolCall = ToolCall;\nexport type DeepSeekToolDefinition = ToolDefinition;\nexport type DeepSeekRequest = {\n model: string;\n messages: ChatMessage[];\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n tools?: DeepSeekToolDefinition[];\n};\nexport type DeepSeekResponse = {\n id: string;\n choices: Array<{\n message: ChatMessage;\n finish_reason: string;\n }>;\n};\nexport type DeepSeekStreamChunk = StreamChunk;\n","import { useEffect, useState, useRef } from 'react';\nimport { Text, Box, useStdin } from 'ink';\nimport { MessageBubble } from './MessageBubble.tsx';\nimport { defaultTheme } from './themes/default.ts';\nimport { eventbus } from '../core/eventbus.ts';\nimport type { ChatMessage } from '../model/types.ts';\nimport readline from 'node:readline';\n\ninterface ChatViewProps {\n initialMessages?: ChatMessage[];\n apiKey?: string;\n model?: string;\n}\n\nconst HISTORY_MAX = 100;\nconst history: string[] = [];\n\nconst SLASH_RESULTS: Record<string, string> = {\n '/help': '命令: /help /clear /quit /config /model /tools /export /theme',\n '/clear': '__CLEAR__',\n '/quit': '__QUIT__',\n '/config': '打开配置: deeper config list | deeper config set <key> <value>',\n '/model': '模型: deepseek-v4-pro / v4-flash',\n '/tools': '105 个内置工具已就绪',\n '/export': '对话导出功能开发中',\n '/theme': '主题: dark | 切换: deeper config set theme light',\n};\n\nexport function ChatView({ initialMessages = [], apiKey, model }: ChatViewProps) {\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [thinking, setThinking] = useState(false);\n const keyRef = useRef(apiKey);\n const modelRef = useRef(model || 'deepseek-v4-pro');\n keyRef.current = apiKey;\n\n useEffect(() => {\n const onMsg = (p: { id: string; role: 'user' | 'assistant' | 'system'; content: string; timestamp: number }) => {\n setMessages(prev => [...prev, { ...p }]);\n };\n const onClear = () => { setMessages([]); setThinking(false); };\n eventbus.onMessageReceived(onMsg);\n eventbus.onAppClear(onClear);\n return () => { eventbus.removeAllListeners(); };\n }, []);\n\n const handleSubmit = (content: string) => {\n const trimmed = content.trim();\n if (!trimmed) return;\n\n if (SLASH_RESULTS[trimmed]) {\n const r = SLASH_RESULTS[trimmed];\n if (r === '__QUIT__') { eventbus.emitAppQuit(); return; }\n if (r === '__CLEAR__') { setMessages([]); return; }\n setMessages(prev => [...prev, { id: `s-${Date.now()}`, role: 'system', content: r, timestamp: Date.now() }]);\n return;\n }\n\n history.push(trimmed);\n if (history.length > HISTORY_MAX) history.shift();\n\n const um: ChatMessage = { id: `u-${Date.now()}`, role: 'user', content: trimmed, timestamp: Date.now() };\n setMessages(prev => [...prev, um]);\n eventbus.emitMessageSend({ content: trimmed });\n\n const currentKey = keyRef.current || '';\n if (!currentKey) {\n setMessages(prev => [...prev, {\n id: `a-${Date.now()}`, role: 'system',\n content: '⚠ 未配置 API Key。\\n\\n请运行以下命令配置:\\n deeper config set apiKey \"sk-你的DeepSeek密钥\"\\n\\n获取密钥: https://platform.deepseek.com',\n timestamp: Date.now(),\n }]);\n return;\n }\n\n setThinking(true);\n callDeepSeek(trimmed, currentKey, modelRef.current, messages)\n .then(responseText => {\n setThinking(false);\n setMessages(prev => [...prev, {\n id: `a-${Date.now()}`, role: 'assistant',\n content: responseText,\n timestamp: Date.now(),\n }]);\n })\n .catch(err => {\n setThinking(false);\n setMessages(prev => [...prev, {\n id: `a-${Date.now()}`, role: 'system',\n content: `❌ API 请求失败: ${err instanceof Error ? err.message : String(err)}`,\n timestamp: Date.now(),\n }]);\n });\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\" paddingX={1}>\n {messages.length === 0 && !thinking ? (\n <Box flexDirection=\"column\" paddingY={1}>\n <Box>\n <Text bold color={defaultTheme.primary}>DeeperCode</Text>\n <Text dimColor> — 一句话生成完整项目</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>输入你的任务或 /help 查看命令</Text>\n </Box>\n </Box>\n ) : null}\n\n {messages.map((m) => (\n <MessageBubble key={m.id} role={m.role} content={m.content} timestamp={m.timestamp} />\n ))}\n\n {thinking ? (\n <Box marginY={1}><Text dimColor>思考中...</Text></Box>\n ) : null}\n </Box>\n\n <InputLine onSubmit={handleSubmit} />\n </Box>\n );\n}\n\nasync function callDeepSeek(\n prompt: string,\n apiKey: string,\n model: string,\n history: ChatMessage[],\n): Promise<string> {\n const systemMsg = {\n role: 'system',\n content: '你是 DeeperCode AI 编程助手,基于 DeepSeek-V4-Pro。你擅长编写代码、调试、项目构建和技术问题解答。请用中文回复,代码保持原样。',\n };\n\n const recentHistory = history.slice(-20).map(m => ({\n role: m.role === 'system' ? 'system' : m.role,\n content: m.content || '',\n }));\n\n const messages = [systemMsg, ...recentHistory, { role: 'user', content: prompt }];\n\n const response = await fetch('https://api.deepseek.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: false,\n max_tokens: 4096,\n temperature: 0.7,\n }),\n });\n\n if (!response.ok) {\n const errText = await response.text().catch(() => '');\n if (response.status === 401) throw new Error('API Key 无效或已过期,请检查配置');\n throw new Error(`HTTP ${response.status}: ${errText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n return data.choices?.[0]?.message?.content || '(空响应)';\n}\n\nfunction InputLine({ onSubmit }: { onSubmit: (v: string) => void }) {\n const { stdin } = useStdin();\n const [buf, setBuf] = useState('');\n const bufRef = useRef('');\n bufRef.current = buf;\n const histIdx = useRef(-1);\n const cursorRef = useRef(0);\n\n useEffect(() => {\n if (!stdin) return;\n\n readline.emitKeypressEvents(stdin as unknown as NodeJS.ReadableStream);\n\n const onKP = (str: string | undefined, key: readline.Key) => {\n if (key.ctrl && key.name === 'c') {\n eventbus.emitAppQuit();\n return;\n }\n\n if (key.name === 'return' || key.name === 'enter') {\n if (bufRef.current.trim()) {\n onSubmit(bufRef.current);\n }\n bufRef.current = '';\n cursorRef.current = 0;\n setBuf('');\n histIdx.current = -1;\n return;\n }\n\n if (key.name === 'backspace') {\n if (cursorRef.current > 0) {\n const prev = bufRef.current;\n bufRef.current = prev.slice(0, cursorRef.current - 1) + prev.slice(cursorRef.current);\n cursorRef.current = Math.max(0, cursorRef.current - 1);\n setBuf(bufRef.current);\n }\n return;\n }\n\n if (key.name === 'delete') {\n if (cursorRef.current < bufRef.current.length) {\n const prev = bufRef.current;\n bufRef.current = prev.slice(0, cursorRef.current) + prev.slice(cursorRef.current + 1);\n setBuf(bufRef.current);\n }\n return;\n }\n\n if (key.name === 'left') {\n cursorRef.current = Math.max(0, cursorRef.current - 1);\n return;\n }\n if (key.name === 'right') {\n cursorRef.current = Math.min(bufRef.current.length, cursorRef.current + 1);\n return;\n }\n if (key.name === 'home') { cursorRef.current = 0; return; }\n if (key.name === 'end') { cursorRef.current = bufRef.current.length; return; }\n\n if (key.name === 'up') {\n if (history.length === 0) return;\n const idx = histIdx.current === -1 ? history.length - 1 : Math.max(0, histIdx.current - 1);\n histIdx.current = idx;\n bufRef.current = history[idx];\n cursorRef.current = bufRef.current.length;\n setBuf(bufRef.current);\n return;\n }\n\n if (key.name === 'down') {\n if (histIdx.current === -1) return;\n const idx = histIdx.current + 1;\n if (idx >= history.length) {\n histIdx.current = -1;\n bufRef.current = '';\n cursorRef.current = 0;\n } else {\n histIdx.current = idx;\n bufRef.current = history[idx];\n cursorRef.current = bufRef.current.length;\n }\n setBuf(bufRef.current);\n return;\n }\n\n if (str) {\n const prev = bufRef.current;\n bufRef.current = prev.slice(0, cursorRef.current) + str + prev.slice(cursorRef.current);\n cursorRef.current += str.length;\n setBuf(bufRef.current);\n histIdx.current = -1;\n }\n };\n\n (stdin as any).on('keypress', onKP);\n return () => { (stdin as any).removeListener('keypress', onKP); };\n }, []);\n\n const before = buf.slice(0, cursorRef.current);\n const at = buf[cursorRef.current] || ' ';\n const after = buf.slice(cursorRef.current + 1);\n\n return (\n <Box paddingX={1}>\n <Text color={defaultTheme.primary} bold>❯ </Text>\n <Text>{before}</Text>\n <Text inverse>{at}</Text>\n <Text>{after}</Text>\n </Box>\n );\n}\n","import { useEffect, useState, useRef } from 'react';\nimport { Text, Box } from 'ink';\nimport { ChatView } from './ChatView.tsx';\nimport { StatusBar } from './StatusBar.tsx';\nimport { eventbus } from '../core/eventbus.ts';\nimport type { ChatMessage } from '../model/types.ts';\n\ninterface AppProps {\n apiKey?: string;\n model?: string;\n verbose?: boolean;\n autoRun?: string;\n}\n\nexport function App({ apiKey, model, autoRun }: AppProps) {\n const [initialMessages, setInitialMessages] = useState<ChatMessage[]>([]);\n const startTimeRef = useRef(Date.now());\n\n useEffect(() => {\n const memTimer = setInterval(() => {\n eventbus.emitStatusUpdate({\n memoryUsage: Math.round(process.memoryUsage().heapUsed / (1024 * 1024)),\n uptime: Date.now() - startTimeRef.current,\n });\n }, 5000);\n\n if (autoRun) {\n setInitialMessages([{\n id: `auto-${Date.now()}`, role: 'user', content: autoRun, timestamp: Date.now(),\n }]);\n }\n\n return () => { clearInterval(memTimer); eventbus.reset(); };\n }, []);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <ChatView\n initialMessages={initialMessages}\n apiKey={apiKey}\n model={model}\n />\n <StatusBar />\n </Box>\n );\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { DEEPER_CONFIG_FILE, PROJECT_CONFIG_FILE, DEEPSEEK_DEFAULT_MODEL, DEEPSEEK_BASE_URL } from './constants.js';\n\nexport interface MCPConfigEntry {\n name: string;\n command?: string;\n args?: string[];\n url?: string;\n enabled: boolean;\n autoConnect: boolean;\n}\n\nexport interface SkillConfigEntry {\n name: string;\n path: string;\n enabled: boolean;\n autoLoad: boolean;\n}\n\nexport interface DeeperConfig {\n model: string;\n apiKey: string;\n baseUrl: string;\n temperature: number;\n maxTokens: number;\n thinkEnabled: boolean;\n thinkBudget: number;\n thinkBudgetTokens: number;\n logLevel: string;\n maxRetries: number;\n timeoutMs: number;\n maxSubAgents: number;\n maxRecursionDepth: number;\n theme: 'dark' | 'light';\n locale: string;\n mcpServers: MCPConfigEntry[];\n skills: SkillConfigEntry[];\n [key: string]: unknown;\n}\n\nconst DEFAULT_CONFIG: DeeperConfig = {\n model: DEEPSEEK_DEFAULT_MODEL,\n apiKey: process.env.DEEPSEEK_API_KEY || '',\n baseUrl: DEEPSEEK_BASE_URL,\n temperature: 0.7,\n maxTokens: 8192,\n thinkEnabled: true,\n thinkBudget: 32000,\n thinkBudgetTokens: 32000,\n logLevel: 'info',\n maxRetries: 3,\n timeoutMs: 120000,\n maxSubAgents: 5,\n maxRecursionDepth: 2,\n theme: 'dark',\n locale: 'zh-CN',\n mcpServers: [],\n skills: [],\n};\n\nconst PROJECT_CONFIG_PATH = join(process.cwd(), PROJECT_CONFIG_FILE);\nconst USER_CONFIG_PATH = DEEPER_CONFIG_FILE;\n\nexport class ConfigManager {\n private defaults: DeeperConfig;\n private userConfig: Partial<DeeperConfig>;\n private projectConfig: Partial<DeeperConfig>;\n private envOverrides: Partial<DeeperConfig>;\n private cliOverrides: Partial<DeeperConfig>;\n\n constructor() {\n this.defaults = { ...DEFAULT_CONFIG };\n this.userConfig = {};\n this.projectConfig = {};\n this.envOverrides = {};\n this.cliOverrides = {};\n }\n\n load(): void {\n this.userConfig = this.readJSONFile(USER_CONFIG_PATH);\n this.projectConfig = this.readJSONFile(PROJECT_CONFIG_PATH);\n this.envOverrides = this.readEnvOverrides();\n }\n\n save(scope: 'user' | 'project'): void {\n const configPath = scope === 'user' ? USER_CONFIG_PATH : PROJECT_CONFIG_PATH;\n const currentConfig = scope === 'user' ? this.userConfig : this.projectConfig;\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(currentConfig, null, 2), 'utf-8');\n }\n\n get<K extends keyof DeeperConfig>(key: K): DeeperConfig[K] {\n if (key in this.cliOverrides) {\n return this.cliOverrides[key] as DeeperConfig[K];\n }\n if (key in this.envOverrides) {\n return this.envOverrides[key] as DeeperConfig[K];\n }\n if (key in this.projectConfig) {\n return this.projectConfig[key] as DeeperConfig[K];\n }\n if (key in this.userConfig) {\n return this.userConfig[key] as DeeperConfig[K];\n }\n return this.defaults[key];\n }\n\n set<K extends keyof DeeperConfig>(key: K, value: DeeperConfig[K], scope: 'cli' | 'project' | 'user'): void {\n switch (scope) {\n case 'cli':\n this.cliOverrides[key] = value;\n break;\n case 'project':\n this.projectConfig[key] = value;\n break;\n case 'user':\n this.userConfig[key] = value;\n break;\n }\n }\n\n setCliOverrides(overrides: Partial<DeeperConfig>): void {\n this.cliOverrides = { ...overrides };\n }\n\n getAll(): DeeperConfig {\n return {\n ...this.defaults,\n ...this.userConfig,\n ...this.projectConfig,\n ...this.envOverrides,\n ...this.cliOverrides,\n };\n }\n\n private readJSONFile(path: string): Partial<DeeperConfig> {\n try {\n if (existsSync(path)) {\n const content = readFileSync(path, 'utf-8');\n return JSON.parse(content) as Partial<DeeperConfig>;\n }\n } catch {\n }\n return {};\n }\n\n private readEnvOverrides(): Partial<DeeperConfig> {\n const overrides: Partial<DeeperConfig> = {};\n const envMap: Record<string, keyof DeeperConfig> = {\n DEEPER_MODEL: 'model',\n DEEPER_API_KEY: 'apiKey',\n DEEPER_BASE_URL: 'baseUrl',\n DEEPER_TEMPERATURE: 'temperature',\n DEEPER_MAX_TOKENS: 'maxTokens',\n DEEPER_THINK_ENABLED: 'thinkEnabled',\n DEEPER_THINK_BUDGET: 'thinkBudget',\n DEEPER_LOG_LEVEL: 'logLevel',\n DEEPER_MAX_RETRIES: 'maxRetries',\n DEEPER_TIMEOUT: 'timeoutMs',\n };\n\n for (const [envKey, configKey] of Object.entries(envMap)) {\n const value = process.env[envKey];\n if (value !== undefined) {\n switch (typeof DEFAULT_CONFIG[configKey]) {\n case 'number':\n (overrides as Record<string, unknown>)[configKey] = Number(value);\n break;\n case 'boolean':\n (overrides as Record<string, unknown>)[configKey] = value.toLowerCase() === 'true' || value === '1';\n break;\n default:\n (overrides as Record<string, unknown>)[configKey] = value;\n break;\n }\n }\n }\n\n return overrides;\n }\n}\n\nlet cachedConfig: DeeperConfig | null = null;\n\nconst KEY_ALIASES: Record<string, keyof DeeperConfig> = {\n api_key: 'apiKey',\n 'api-key': 'apiKey',\n base_url: 'baseUrl',\n 'base-url': 'baseUrl',\n max_tokens: 'maxTokens',\n 'max-tokens': 'maxTokens',\n think_enabled: 'thinkEnabled',\n 'think-enabled': 'thinkEnabled',\n think_budget: 'thinkBudget',\n 'think-budget': 'thinkBudget',\n log_level: 'logLevel',\n 'log-level': 'logLevel',\n max_retries: 'maxRetries',\n 'max-retries': 'maxRetries',\n timeout_ms: 'timeoutMs',\n 'timeout-ms': 'timeoutMs',\n max_sub_agents: 'maxSubAgents',\n 'max-sub-agents': 'maxSubAgents',\n max_recursion_depth: 'maxRecursionDepth',\n 'max-recursion-depth': 'maxRecursionDepth',\n mcp_servers: 'mcpServers',\n 'mcp-servers': 'mcpServers',\n};\n\nfunction normalizeConfig(raw: Record<string, unknown>): Partial<DeeperConfig> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n const canonical = KEY_ALIASES[key] || key;\n result[canonical] = value;\n }\n return result as Partial<DeeperConfig>;\n}\n\nexport function loadConfig(): DeeperConfig {\n if (cachedConfig) return cachedConfig;\n try {\n if (existsSync(DEEPER_CONFIG_FILE)) {\n const raw = readFileSync(DEEPER_CONFIG_FILE, 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n cachedConfig = { ...DEFAULT_CONFIG, ...normalizeConfig(parsed) };\n } else {\n cachedConfig = { ...DEFAULT_CONFIG };\n }\n } catch {\n cachedConfig = { ...DEFAULT_CONFIG };\n }\n return cachedConfig;\n}\n\nexport function saveConfig(config?: DeeperConfig): void {\n if (config) cachedConfig = { ...config };\n if (!cachedConfig) cachedConfig = { ...DEFAULT_CONFIG };\n const dir = dirname(DEEPER_CONFIG_FILE);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(DEEPER_CONFIG_FILE, JSON.stringify(cachedConfig, null, 2), 'utf-8');\n}\n\nexport function getConfig(): DeeperConfig {\n return cachedConfig ?? loadConfig();\n}\n\nexport function updateConfig(partial: Partial<DeeperConfig>): DeeperConfig {\n const current = getConfig();\n cachedConfig = { ...current, ...partial };\n saveConfig();\n return cachedConfig;\n}\n\nexport function resetConfig(): DeeperConfig {\n cachedConfig = { ...DEFAULT_CONFIG };\n saveConfig();\n return cachedConfig;\n}\n\nexport function getConfigValue<K extends keyof DeeperConfig>(key: K): DeeperConfig[K] {\n return getConfig()[key];\n}\n\nexport function setConfigValue<K extends keyof DeeperConfig>(key: K, value: DeeperConfig[K]): void {\n updateConfig({ [key]: value } as unknown as Partial<DeeperConfig>);\n}\n\nexport function getApiKey(): string {\n return getConfig().apiKey || process.env.DEEPSEEK_API_KEY || '';\n}\n\nexport function getModel(): string {\n return getConfig().model;\n}\n\nexport function getBaseUrl(): string {\n return getConfig().baseUrl;\n}\n\nexport const configManager = { load: () => loadConfig(), save: saveConfig, get: getConfigValue, set: setConfigValue, getAll: getConfig };\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport process from 'node:process';\n\nexport const DEEPER_VERSION = '1.0.0';\nexport const DEEPER_NAME = 'DeeperCode';\nexport const DEEPER_HOME = join(process.env.DEEPER_HOME || join(homedir(), '.deeper'));\nexport const DEEPER_CONFIG_FILE = join(DEEPER_HOME, 'config.json');\nexport const DEEPER_MCP_FILE = join(DEEPER_HOME, 'mcp.json');\nexport const DEEPER_SKILLS_DIR = join(DEEPER_HOME, 'skills');\nexport const DEEPER_SESSIONS_DIR = join(DEEPER_HOME, 'sessions');\nexport const DEEPER_LOGS_DIR = join(DEEPER_HOME, 'logs');\nexport const DEEPER_MEMORY_FILE = join(DEEPER_HOME, 'memory.json');\nexport const PROJECT_CONFIG_DIR = '.deeper';\nexport const PROJECT_CONFIG_FILE = join(PROJECT_CONFIG_DIR, 'config.json');\nexport const PROJECT_SKILLS_DIR = join(PROJECT_CONFIG_DIR, 'skills');\n\nexport const DEEPSEEK_BASE_URL = 'https://api.deepseek.com';\nexport const DEEPSEEK_DEFAULT_MODEL = 'deepseek-v4-pro';\nexport const DEEPSEEK_MODELS = ['deepseek-v4-pro', 'deepseek-v4-flash'] as const;\nexport type DeepSeekModel = typeof DEEPSEEK_MODELS[number];\nexport const DEEPSEEK_MAX_TOKENS = 1_048_576;\nexport const DEEPSEEK_THINK_BUDGET = 16000;\n\nexport const AGENT_MAX_SUB_AGENTS = 5;\nexport const AGENT_MAX_RECURSION_DEPTH = 2;\nexport const AGENT_SUB_AGENT_TIMEOUT_MS = 120000;\nexport const AGENT_MAX_CONCURRENT_TOOLS = 3;\n\nexport const CONTEXT_MAX_TOKENS = 1_048_576;\nexport const CONTEXT_AUTO_SUMMARIZE_THRESHOLD = 786_432;\nexport const CONTEXT_HISTORY_SIZE = 80;\nexport const CONTEXT_FILE_LIMIT = 50_000;\n\nexport const CONTEXT_COMPRESSION_STAGES = [\n { threshold: 0.7, strategy: 'light' },\n { threshold: 0.85, strategy: 'aggressive' },\n { threshold: 0.95, strategy: 'emergency' },\n] as const;\n\nexport const MCP_CONNECTION_TIMEOUT_MS = 10000;\n\nexport const TOOL_CATEGORIES = [\n 'filesystem', 'search', 'shell', 'network',\n 'code', 'database', 'data', 'security',\n 'project', 'ai', 'system',\n] as const;\n\nexport type ToolCategory = typeof TOOL_CATEGORIES[number];\n","export interface JSONSchema {\n type: string;\n properties?: Record<string, JSONSchema>;\n required?: string[];\n description?: string;\n enum?: string[];\n items?: JSONSchema;\n additionalProperties?: boolean;\n}\n\nexport interface ToolParameter {\n name: string;\n type: string;\n description: string;\n required: boolean;\n default?: unknown;\n enum?: string[];\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n category: string;\n parameters: JSONSchema;\n dangerous?: boolean;\n requiresApproval?: boolean;\n}\n\nexport interface ToolResult {\n success: boolean;\n output: string;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ToolExecutor {\n execute(params: Record<string, unknown>, signal?: AbortSignal): Promise<ToolResult>;\n}\n\nexport type Tool = ToolDefinition & ToolExecutor;\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolCallResult {\n callId: string;\n result: ToolResult;\n timestamp: number;\n}\n\nexport type ToolSafetyLevel = 'safe' | 'confirm' | 'dangerous';\n\nexport const TOOL_SAFETY_MAP: Record<string, ToolSafetyLevel> = {\n read_file: 'safe', list_dir: 'safe', glob_find: 'safe', file_info: 'safe',\n grep_search: 'safe', text_search: 'safe', fuzzy_find: 'safe', regex_find: 'safe',\n find_references: 'safe', find_definition: 'safe', symbol_search: 'safe',\n search_package: 'safe', search_docs: 'safe', codebase_search: 'safe',\n token_count: 'safe', system_info: 'safe', process_list: 'safe',\n resource_monitor: 'safe', log_viewer: 'safe', bug_scan: 'safe',\n web_fetch: 'safe', web_search: 'safe', check_url: 'safe',\n parse_html: 'safe', http_request: 'safe',\n watch_file: 'safe', batch_read: 'safe', create_dir: 'safe',\n json_parse: 'safe', csv_parse: 'safe', xml_parse: 'safe', yaml_parse: 'safe', toml_parse: 'safe',\n data_validate: 'safe', data_diff: 'safe', hash_generate: 'safe', jwt_decode: 'safe',\n coverage_report: 'safe', config_manage: 'safe', notify_user: 'safe',\n format_code: 'safe', lint_code: 'safe', type_check: 'safe', code_metrics: 'safe',\n analyze_deps: 'safe', import_organizer: 'safe', parse_ast: 'safe',\n db_schema: 'safe',\n context_summarize: 'safe', prompt_template: 'safe',\n skill_create: 'safe', tool_create: 'safe', memory_store: 'safe',\n todo_manager: 'safe', subagent: 'safe',\n background_terminal: 'safe', list_terminals: 'safe', read_terminal: 'safe',\n send_keys: 'safe', send_ctrl_keys: 'safe', send_text: 'safe', kill_terminal: 'safe',\n terminal_screenshot: 'safe', terminal_resize: 'safe', check_status: 'safe', stop_command: 'safe',\n download_file: 'safe', api_call: 'safe', graphql_query: 'safe', websocket_connect: 'safe',\n\n write_file: 'safe', edit_file: 'safe',\n delete_file: 'confirm', move_file: 'confirm', copy_file: 'confirm', batch_write: 'safe',\n merge_files: 'confirm', diff_files: 'confirm',\n run_command: 'safe', run_async: 'safe', pipe_commands: 'safe',\n shell_script: 'confirm', npm_manage: 'confirm',\n project_init: 'confirm', build_project: 'confirm', run_test: 'confirm',\n docker_manage: 'confirm', env_manage: 'confirm',\n sql_query: 'confirm', sql_migrate: 'confirm', nosql_query: 'confirm',\n db_backup: 'confirm', db_restore: 'confirm', redis_command: 'confirm',\n encrypt_file: 'confirm', decrypt_file: 'confirm',\n template_render: 'confirm', chart_generate: 'confirm',\n secret_scan: 'confirm', vulnerability_check: 'confirm',\n orm_generate: 'confirm', generate_code: 'confirm', refactor_code: 'confirm',\n extract_function: 'confirm', data_transform: 'confirm', proxy_request: 'confirm',\n\n interactive_terminal: 'confirm',\n browser_action: 'confirm', screenshot_page: 'confirm',\n};\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { DEEPER_HOME, DEEPER_CONFIG_FILE, DEEPER_SKILLS_DIR, DEEPER_SESSIONS_DIR, DEEPER_LOGS_DIR, DEEPER_VERSION } from '../core/constants.ts';\nimport { loadConfig } from '../core/config.ts';\nimport { eventbus } from '../core/eventbus.ts';\n\nexport interface BootstrapResult {\n success: boolean;\n errors: string[];\n warnings: string[];\n config: ReturnType<typeof loadConfig>;\n}\n\nexport async function bootstrap(): Promise<BootstrapResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const nodeVersion = process.versions.node;\n const majorVersion = parseInt(nodeVersion.split('.')[0], 10);\n if (majorVersion < 20) {\n errors.push(`Node.js 版本过低: ${nodeVersion},需要 >= 20.0.0`);\n return { success: false, errors, warnings, config: loadConfig() };\n }\n\n const dirs = [\n DEEPER_HOME,\n DEEPER_SKILLS_DIR,\n DEEPER_SESSIONS_DIR,\n DEEPER_LOGS_DIR,\n ];\n\n for (const dir of dirs) {\n try {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n } catch {\n errors.push(`无法创建目录: ${dir}`);\n }\n }\n\n let config;\n try {\n config = loadConfig();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n errors.push(`配置加载失败: ${msg}`);\n config = loadConfig();\n }\n\n if (!config.apiKey && !process.env.DEEPSEEK_API_KEY) {\n warnings.push('未设置 API Key。请运行: deeper config set api_key \"sk-你的密钥\"');\n }\n\n if (errors.length > 0) {\n return { success: false, errors, warnings, config };\n }\n\n return { success: true, errors, warnings, config };\n}\n\nexport function checkNodeVersion(): boolean {\n const nodeVersion = process.versions.node;\n const majorVersion = parseInt(nodeVersion.split('.')[0], 10);\n return majorVersion >= 20;\n}\n\nexport function getVersionInfo(): string {\n return `DeeperCode v${DEEPER_VERSION} | Node.js ${process.versions.node} | ${process.platform} ${process.arch}`;\n}\n","import { render } from 'ink';\nimport { App } from '../../ui/App.tsx';\nimport { bootstrap } from '../bootstrap.ts';\n\ninterface ChatOptions {\n model?: string;\n apiKey?: string;\n verbose?: boolean;\n autoRun?: string;\n}\n\nexport async function chat(opts: ChatOptions = {}): Promise<void> {\n const result = await bootstrap();\n\n if (!result.success) {\n for (const err of result.errors) {\n console.error(`❌ ${err}`);\n }\n process.exit(1);\n }\n\n for (const warn of result.warnings) {\n console.warn(`⚠ ${warn}`);\n }\n\n const model = opts.model || result.config.model;\n const apiKey = opts.apiKey || result.config.apiKey;\n\n const { waitUntilExit } = render(\n <App\n apiKey={apiKey}\n model={model}\n verbose={opts.verbose}\n autoRun={opts.autoRun}\n />,\n );\n\n await waitUntilExit();\n}\n","import { loadConfig } from '../../core/config.ts';\nimport { bootstrap } from '../bootstrap.ts';\nimport type { DeeperConfig } from '../../core/config.ts';\n\ninterface RunOptions {\n task?: string;\n model?: string;\n apiKey?: string;\n files?: string[];\n}\n\nexport async function run(task: string, opts: RunOptions = {}): Promise<void> {\n const result = await bootstrap();\n\n if (!result.success) {\n for (const err of result.errors) {\n console.error(`❌ ${err}`);\n }\n process.exit(1);\n }\n\n if (!task) {\n console.error('❌ 请提供任务描述。用法: deeper run \"任务描述\"');\n process.exit(1);\n }\n\n const config = opts.model || opts.apiKey\n ? { ...result.config, ...(opts.model ? { model: opts.model } : {}), ...(opts.apiKey ? { apiKey: opts.apiKey } : {}) }\n : result.config;\n\n if (!config.apiKey && !process.env.DEEPSEEK_API_KEY) {\n console.error('❌ 未设置 API Key');\n console.error(' 请设置环境变量 DEEPSEEK_API_KEY 或使用 --api-key 参数');\n process.exit(1);\n }\n\n console.log(`\\n🚀 DeeperCode 执行任务\\n`);\n console.log(`📋 任务: ${task}`);\n console.log(`🤖 模型: ${config.model}`);\n console.log(`🔗 API: ${config.baseUrl}`);\n console.log();\n\n console.log('⏳ 正在连接 DeepSeek API...');\n console.log();\n\n try {\n const apiKey = config.apiKey || process.env.DEEPSEEK_API_KEY || '';\n const response = await fetch(`${config.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: config.model,\n messages: [\n {\n role: 'system',\n content: '你是一个强大的 AI 编程助手。请帮助用户完成任务。',\n },\n {\n role: 'user',\n content: task,\n },\n ],\n stream: true,\n max_tokens: Math.max(1, Math.min(config.maxTokens || 4096, 131072)),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n console.error(`❌ API 请求失败 (${response.status}): ${text}`);\n process.exit(1);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n console.error('❌ 无法读取响应流');\n process.exit(1);\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let fullContent = '';\n let thinkingContent = '';\n\n console.log('📝 AI 响应:\\n');\n console.log('─'.repeat(60));\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data: ')) continue;\n\n const data = trimmed.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.thinking) {\n thinkingContent += delta.thinking;\n }\n\n if (delta?.content) {\n fullContent += delta.content;\n process.stdout.write(delta.content);\n }\n } catch {\n // 跳过无法解析的行\n }\n }\n }\n\n console.log('\\n' + '─'.repeat(60));\n console.log();\n\n if (thinkingContent) {\n console.log('💭 思考过程:');\n console.log('─'.repeat(60));\n console.log(thinkingContent.slice(0, 500));\n if (thinkingContent.length > 500) {\n console.log(`... (还有 ${thinkingContent.length - 500} 字符)`);\n }\n console.log('─'.repeat(60));\n }\n\n const usage = `📊 Token: ~${fullContent.length} 输出`;\n console.log(usage);\n console.log();\n\n console.log('✅ 任务执行完成!');\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`❌ 请求失败: ${msg}`);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","useState","useEffect","Text","Box","jsx","jsxs","useState","useEffect","Box","Text","useState","useEffect","Text","Box","jsx","jsxs","useState","useEffect","Box","Text","useState","Text","Box","useInput","jsx","jsxs","useState","useInput","Box","Text","useEffect","useState","useRef","Text","Box","jsx","jsxs","history","useState","useRef","useEffect","Box","Text","useEffect","useState","useRef","Box","jsx","jsxs","useState","useRef","useEffect","Box","join","process","process","process","join","process","existsSync","mkdirSync","existsSync","mkdirSync","jsx"]}
1
+ {"version":3,"sources":["../src/ui/themes/default.ts","../src/ui/themes/dark.ts","../src/ui/themes/light.ts","../src/ui/Spinner.tsx","../src/ui/MessageBubble.tsx","../src/ui/ToolCallCard.tsx","../src/ui/DiffView.tsx","../src/ui/FilePreview.tsx","../src/ui/AgentTree.tsx","../src/ui/ConfirmDialog.tsx","../src/ui/StatusBar.tsx","../src/core/eventbus.ts","../src/ui/InputBox.tsx","../src/model/types.ts","../src/ui/ChatView.tsx","../src/ui/App.tsx","../src/core/config.ts","../src/core/constants.ts","../src/tools/tool-types.ts","../src/cli/bootstrap.ts","../src/cli/commands/chat.tsx","../src/cli/commands/run.ts"],"sourcesContent":["export interface Theme {\n primary: string;\n secondary: string;\n success: string;\n warning: string;\n error: string;\n text: string;\n dimText: string;\n border: string;\n background: string;\n cardBackground: string;\n}\n\nexport const defaultTheme: Theme = {\n primary: '#00BFA5',\n secondary: '#7C4DFF',\n success: '#00E676',\n warning: '#FFAB40',\n error: '#FF5252',\n text: '#E0E0E0',\n dimText: '#757575',\n border: '#424242',\n background: '#121212',\n cardBackground: '#1E1E1E',\n};\n","import type { Theme } from './default.ts';\nimport { defaultTheme } from './default.ts';\n\nexport const darkTheme: Theme = { ...defaultTheme };\n","import type { Theme } from './default.ts';\n\nexport const lightTheme: Theme = {\n primary: '#00897B',\n secondary: '#6200EA',\n success: '#00C853',\n warning: '#FF6D00',\n error: '#D50000',\n text: '#212121',\n dimText: '#9E9E9E',\n border: '#E0E0E0',\n background: '#FAFAFA',\n cardBackground: '#FFFFFF',\n};\n","import { useState, useEffect } from 'react';\nimport { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\nconst spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\ninterface SpinnerProps {\n label?: string;\n type?: 'dots' | 'line' | 'braille';\n}\n\nexport function Spinner({ label, type = 'braille' }: SpinnerProps) {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame((prev) => (prev + 1) % spinnerFrames.length);\n }, 80);\n return () => clearInterval(timer);\n }, []);\n\n const dotsFrames = [' ', '. ', '.. ', '...'];\n const frameChar = type === 'dots'\n ? dotsFrames[frame % dotsFrames.length]\n : type === 'line'\n ? ['|', '/', '-', '\\\\'][frame % 4]\n : spinnerFrames[frame];\n\n return (\n <Box>\n <Text color={defaultTheme.primary}>{frameChar}</Text>\n {label ? <Text> {label}</Text> : null}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface Props {\n role: 'user' | 'assistant' | 'system' | 'tool';\n content: string | null;\n thinking?: string;\n timestamp?: number;\n}\n\nexport function MessageBubble({ role, content }: Props) {\n const display = content ?? '';\n const lines = display.split('\\n');\n const color = role === 'user' ? defaultTheme.secondary : defaultTheme.text;\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={role === 'user' ? defaultTheme.secondary : defaultTheme.primary} bold>\n {role === 'user' ? '> ' : role === 'system' ? '⚙ ' : '● '}\n </Text>\n </Box>\n {lines.map((line, i) => (\n <Box key={i} paddingLeft={1}>\n <Text color={color}>{line || ' '}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface ToolCallCardProps {\n toolName: string;\n args: Record<string, unknown>;\n result?: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n}\n\nconst statusConfig: Record<ToolCallCardProps['status'], { icon: string; color: string; label: string }> = {\n pending: { icon: '⏳', color: defaultTheme.dimText, label: '等待中' },\n running: { icon: '🔄', color: defaultTheme.primary, label: '执行中' },\n completed: { icon: '✅', color: defaultTheme.success, label: '已完成' },\n failed: { icon: '❌', color: defaultTheme.error, label: '失败' },\n};\n\nfunction summarizeArgs(args: Record<string, unknown>): string {\n const entries = Object.entries(args);\n if (entries.length === 0) return '无参数';\n\n const maxLen = 60;\n const summary = entries\n .map(([k, v]) => {\n const strVal = typeof v === 'string' ? v : JSON.stringify(v);\n return `${k}: ${strVal.length > 40 ? strVal.slice(0, 40) + '...' : strVal}`;\n })\n .join(', ');\n\n return summary.length > maxLen ? summary.slice(0, maxLen) + '...' : summary;\n}\n\nexport function ToolCallCard({ toolName, args, result, status }: ToolCallCardProps) {\n const cfg = statusConfig[status];\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={cfg.color}\n paddingX={1}\n marginY={0}\n >\n <Box>\n <Text color={cfg.color}>{cfg.icon}</Text>\n <Text bold color={cfg.color}> {toolName}</Text>\n <Text dimColor> - {cfg.label}</Text>\n </Box>\n\n <Box marginTop={0}>\n <Text dimColor>参数: </Text>\n <Text>{summarizeArgs(args)}</Text>\n </Box>\n\n {result && status === 'completed' ? (\n <Box marginTop={0} flexDirection=\"column\">\n <Text dimColor>结果: </Text>\n <Box borderStyle=\"single\" borderColor={defaultTheme.border} paddingX={1}>\n <Text>\n {result.length > 200 ? result.slice(0, 200) + '...' : result}\n </Text>\n </Box>\n </Box>\n ) : null}\n\n {result && status === 'failed' ? (\n <Box marginTop={0}>\n <Text color={defaultTheme.error}>错误: {result}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { useMemo } from 'react';\nimport { Text, Box } from 'ink';\nimport { diffLines } from 'diff';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface DiffViewProps {\n filePath: string;\n oldContent: string;\n newContent: string;\n}\n\nexport function DiffView({ filePath, oldContent, newContent }: DiffViewProps) {\n const changes = useMemo(() => {\n return diffLines(oldContent || '', newContent || '', {\n ignoreWhitespace: false,\n });\n }, [oldContent, newContent]);\n\n const addedCount = changes.filter((c) => c.added).length;\n const removedCount = changes.filter((c) => c.removed).length;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={defaultTheme.border} paddingX={1}>\n <Box>\n <Text bold>📄 </Text>\n <Text bold color={defaultTheme.primary}>{filePath}</Text>\n <Text dimColor>\n {' '}\n <Text color={defaultTheme.success}>+{addedCount}</Text>\n {' / '}\n <Text color={defaultTheme.error}>-{removedCount}</Text>\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={0}>\n {changes.slice(0, 50).map((change, i) => {\n if (change.added) {\n return (\n <Box key={i}>\n <Text color={defaultTheme.success}>+ {change.value.trimEnd()}</Text>\n </Box>\n );\n }\n if (change.removed) {\n return (\n <Box key={i}>\n <Text color={defaultTheme.error}>- {change.value.trimEnd()}</Text>\n </Box>\n );\n }\n return (\n <Box key={i}>\n <Text dimColor> {change.value.trimEnd()}</Text>\n </Box>\n );\n })}\n </Box>\n\n {changes.length > 50 ? (\n <Text dimColor>... 还有 {changes.length - 50} 处变更未显示</Text>\n ) : null}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface FilePreviewProps {\n filePath: string;\n content?: string;\n language?: string;\n lineCount?: number;\n size?: number;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction detectLang(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase();\n const map: Record<string, string> = {\n ts: 'TypeScript', tsx: 'TSX', js: 'JavaScript', jsx: 'JSX',\n py: 'Python', rs: 'Rust', go: 'Go', java: 'Java',\n json: 'JSON', yaml: 'YAML', yml: 'YAML', toml: 'TOML',\n md: 'Markdown', html: 'HTML', css: 'CSS', scss: 'SCSS',\n sql: 'SQL', sh: 'Shell', bat: 'Batch', ps1: 'PowerShell',\n };\n return map[ext || ''] || ext?.toUpperCase() || 'text';\n}\n\nexport function FilePreview({ filePath, content, language, lineCount, size }: FilePreviewProps) {\n const lang = language || detectLang(filePath);\n const lines = content ? content.split('\\n').slice(0, 10) : [];\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={defaultTheme.border} paddingX={1}>\n <Box>\n <Text bold>📄 </Text>\n <Text bold color={defaultTheme.primary}>{filePath}</Text>\n <Text dimColor> ({lang})</Text>\n {size !== undefined ? <Text dimColor> - {formatSize(size)}</Text> : null}\n {lineCount !== undefined ? <Text dimColor> - {lineCount} 行</Text> : null}\n </Box>\n\n {content ? (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={defaultTheme.border} paddingX={1} marginTop={0}>\n {lines.map((line, i) => (\n <Box key={i}>\n <Text dimColor>{(i + 1).toString().padStart(3, ' ')} │ </Text>\n <Text>{line.length > 100 ? line.slice(0, 100) + '...' : line}</Text>\n </Box>\n ))}\n {content.split('\\n').length > 10 ? (\n <Text dimColor>... 还有 {content.split('\\n').length - 10} 行</Text>\n ) : null}\n </Box>\n ) : null}\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface AgentNode {\n id: string;\n name: string;\n status: 'idle' | 'running' | 'completed' | 'failed';\n children?: AgentNode[];\n}\n\ninterface AgentTreeProps {\n agents: AgentNode[];\n}\n\nconst statusIcon: Record<AgentNode['status'], string> = {\n idle: '⏸',\n running: '🔄',\n completed: '✅',\n failed: '❌',\n};\n\nconst statusColor: Record<AgentNode['status'], string> = {\n idle: defaultTheme.dimText,\n running: defaultTheme.primary,\n completed: defaultTheme.success,\n failed: defaultTheme.error,\n};\n\nfunction AgentNodeRow({\n node,\n depth,\n isLast,\n}: {\n node: AgentNode;\n depth: number;\n isLast: boolean;\n}) {\n const prefix = depth === 0\n ? ''\n : ' '.repeat(depth - 1) + (isLast ? '└─' : '├─');\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text dimColor>{prefix}</Text>\n <Text color={statusColor[node.status]}>{statusIcon[node.status]}</Text>\n <Text bold color={statusColor[node.status]}> {node.name}</Text>\n </Box>\n {node.children?.map((child, i) => (\n <AgentNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n isLast={i === (node.children?.length || 0) - 1}\n />\n ))}\n </Box>\n );\n}\n\nexport function AgentTree({ agents }: AgentTreeProps) {\n const total = agents.length;\n const running = agents.filter((a) => a.status === 'running').length;\n const completed = agents.filter((a) => a.status === 'completed').length;\n const failed = agents.filter((a) => a.status === 'failed').length;\n\n const countChildren = (ns: AgentNode[]): number =>\n ns.reduce((sum, n) => sum + 1 + countChildren(n.children || []), 0);\n\n const totalWithChildren = countChildren(agents);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={defaultTheme.border} paddingX={1}>\n <Box>\n <Text bold>🤖 Agent 树</Text>\n <Text dimColor>\n {' '}\n [{totalWithChildren} 节点:\n {' '}<Text color={defaultTheme.success}>{completed} 完成</Text>\n {running > 0 ? <Text color={defaultTheme.primary}> {running} 运行</Text> : null}\n {failed > 0 ? <Text color={defaultTheme.error}> {failed} 失败</Text> : null}\n ]\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginTop={0}>\n {agents.map((agent, i) => (\n <AgentNodeRow\n key={agent.id}\n node={agent}\n depth={0}\n isLast={i === total - 1}\n />\n ))}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\n\ninterface ConfirmDialogProps {\n message: string;\n detail?: string;\n onConfirm: () => void;\n onReject: () => void;\n}\n\nexport function ConfirmDialog({ message, detail, onConfirm, onReject }: ConfirmDialogProps) {\n const [selected, setSelected] = useState<'confirm' | 'reject'>('reject');\n\n useInput((input, key) => {\n if (key.leftArrow || key.rightArrow) {\n setSelected((prev) => (prev === 'confirm' ? 'reject' : 'confirm'));\n }\n if (key.return) {\n if (selected === 'confirm') {\n onConfirm();\n } else {\n onReject();\n }\n }\n if (input === 'y' || input === 'Y') {\n onConfirm();\n }\n if (input === 'n' || input === 'N') {\n onReject();\n }\n });\n\n useEffect(() => {\n setSelected('reject');\n }, [message]);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"double\" borderColor={defaultTheme.warning} paddingX={2} paddingY={1}>\n <Box>\n <Text bold color={defaultTheme.warning}>⚠ {message}</Text>\n </Box>\n {detail ? (\n <Box marginTop={0}>\n <Text dimColor>{detail}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Box marginRight={2}>\n <Text\n color={selected === 'confirm' ? defaultTheme.success : defaultTheme.dimText}\n bold={selected === 'confirm'}\n >\n {selected === 'confirm' ? '▶ ' : ' '}[Y] 确认\n </Text>\n </Box>\n <Box>\n <Text\n color={selected === 'reject' ? defaultTheme.error : defaultTheme.dimText}\n bold={selected === 'reject'}\n >\n {selected === 'reject' ? '▶ ' : ' '}[N] 取消\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { Text, Box } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\nimport { eventbus, type ContextUpdatedPayload } from '../core/eventbus.ts';\n\nfunction fmtTokens(n: number): string {\n return n > 1000 ? `${(n / 1000).toFixed(1)}K` : `${n}`;\n}\n\nfunction fmtUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n return `${m}m ${s % 60}s`;\n}\n\nexport function StatusBar() {\n const [st, setSt] = useState<ContextUpdatedPayload>({\n modelName: 'deepseek-v4-pro',\n tokenCount: 0,\n memoryUsage: 0,\n uptime: 0,\n });\n\n useEffect(() => {\n const h = (p: Partial<ContextUpdatedPayload>) => setSt(prev => ({ ...prev, ...p }));\n eventbus.onStatusUpdate(h);\n eventbus.onContextUpdated(h);\n return () => { eventbus.removeAllListeners(); };\n }, []);\n\n return (\n <Box flexDirection=\"row\" paddingX={1}>\n <Text dimColor>{st.modelName}</Text>\n <Text dimColor> | Tok: {fmtTokens(st.tokenCount)}</Text>\n <Text dimColor> | Mem: {st.memoryUsage}MB</Text>\n <Text dimColor> | {fmtUptime(st.uptime)}</Text>\n <Text dimColor> | Ctrl+C 退出</Text>\n </Box>\n );\n}\n","import { EventEmitter } from 'node:events';\n\nexport interface ContextUpdatedPayload {\n modelName: string;\n tokenCount: number;\n memoryUsage: number;\n uptime: number;\n}\n\nexport interface MessagePayload {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n thinking?: string;\n timestamp: number;\n}\n\nexport interface ToolCallPayload {\n id: string;\n toolName: string;\n args: Record<string, unknown>;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: string;\n}\n\nexport interface DiffPayload {\n filePath: string;\n oldContent: string;\n newContent: string;\n}\n\nexport interface AgentPayload {\n id: string;\n name: string;\n status: 'idle' | 'running' | 'completed' | 'failed';\n parentId?: string;\n task: string;\n children?: AgentPayload[];\n}\n\nexport const Events = {\n CONTEXT_UPDATED: 'context:updated',\n MESSAGE_SEND: 'message:send',\n MESSAGE_RECEIVED: 'message:received',\n MESSAGE_STREAMING: 'message:streaming',\n TOOL_CALL_START: 'tool:call:start',\n TOOL_CALL_END: 'tool:call:end',\n FILE_DIFF: 'file:diff',\n AGENT_TREE_UPDATED: 'agent:tree:updated',\n APP_QUIT: 'app:quit',\n APP_CLEAR: 'app:clear',\n STATUS_UPDATE: 'status:update',\n CONFIG_CHANGED: 'config:changed',\n AGENT_STATUS_CHANGE: 'agent:status:change',\n AGENT_CREATED: 'agent:created',\n AGENT_THINKING: 'agent:thinking',\n AGENT_EXECUTING: 'agent:executing',\n AGENT_WAITING: 'agent:waiting',\n AGENT_COMPLETED: 'agent:completed',\n AGENT_FAILED: 'agent:failed',\n AGENT_CANCELLED: 'agent:cancelled',\n AGENT_LOOP_ITERATION: 'agent:loop:iteration',\n AGENT_LOOP_DETECTED: 'agent:loop:detected',\n AGENT_LOOP_LIMIT: 'agent:loop:limit',\n TOOL_CALL_ERROR: 'tool:call:error',\n ORCHESTRATOR_DECOMPOSE: 'orchestrator:decompose',\n ORCHESTRATOR_DISPATCH: 'orchestrator:dispatch',\n ORCHESTRATOR_AGGREGATE: 'orchestrator:aggregate',\n SUBAGENT_START: 'subagent:start',\n SUBAGENT_TIMEOUT: 'subagent:timeout',\n SUBAGENT_COMPLETE: 'subagent:complete',\n SUBAGENT_ERROR: 'subagent:error',\n POOL_ACQUIRE: 'pool:acquire',\n POOL_RELEASE: 'pool:release',\n POOL_QUEUE: 'pool:queue',\n CONTEXT_SUMMARIZED: 'context:summarized',\n CONTEXT_TOKEN_WARNING: 'context:token:warning',\n MCP_CONNECTED: 'mcp:connected',\n MCP_ERROR: 'mcp:error',\n MCP_DISCONNECTED: 'mcp:disconnected',\n MCP_TOOLS_DISCOVERED: 'mcp:tools:discovered',\n SKILL_LOADED: 'skill:loaded',\n SKILL_EXECUTED: 'skill:executed',\n SKILL_CREATED: 'skill:created',\n SKILL_TRIGGERED: 'skill:triggered',\n} as const;\n\nexport const EventBusEvents = Events;\n\nexport class EventBus extends EventEmitter {\n private static instance: EventBus;\n\n static getInstance(): EventBus {\n if (!EventBus.instance) {\n EventBus.instance = new EventBus();\n }\n return EventBus.instance;\n }\n\n onContextUpdated(handler: (payload: ContextUpdatedPayload) => void): void {\n this.on(EventBusEvents.CONTEXT_UPDATED, handler);\n }\n\n emitContextUpdated(payload: ContextUpdatedPayload): void {\n this.emit(EventBusEvents.CONTEXT_UPDATED, payload);\n }\n\n onMessageSend(handler: (payload: { content: string }) => void): void {\n this.on(EventBusEvents.MESSAGE_SEND, handler);\n }\n\n emitMessageSend(payload: { content: string }): void {\n this.emit(EventBusEvents.MESSAGE_SEND, payload);\n }\n\n onMessageReceived(handler: (payload: MessagePayload) => void): void {\n this.on(EventBusEvents.MESSAGE_RECEIVED, handler);\n }\n\n emitMessageReceived(payload: MessagePayload): void {\n this.emit(EventBusEvents.MESSAGE_RECEIVED, payload);\n }\n\n onMessageStreaming(handler: (payload: { id: string; content: string; thinking?: string }) => void): void {\n this.on(EventBusEvents.MESSAGE_STREAMING, handler);\n }\n\n emitMessageStreaming(payload: { id: string; content: string; thinking?: string }): void {\n this.emit(EventBusEvents.MESSAGE_STREAMING, payload);\n }\n\n onToolCallStart(handler: (payload: ToolCallPayload) => void): void {\n this.on(EventBusEvents.TOOL_CALL_START, handler);\n }\n\n emitToolCallStart(payload: ToolCallPayload): void {\n this.emit(EventBusEvents.TOOL_CALL_START, payload);\n }\n\n onToolCallEnd(handler: (payload: ToolCallPayload) => void): void {\n this.on(EventBusEvents.TOOL_CALL_END, handler);\n }\n\n emitToolCallEnd(payload: ToolCallPayload): void {\n this.emit(EventBusEvents.TOOL_CALL_END, payload);\n }\n\n onFileDiff(handler: (payload: DiffPayload) => void): void {\n this.on(EventBusEvents.FILE_DIFF, handler);\n }\n\n emitFileDiff(payload: DiffPayload): void {\n this.emit(EventBusEvents.FILE_DIFF, payload);\n }\n\n onAgentTreeUpdated(handler: (payload: { agents: AgentPayload[] }) => void): void {\n this.on(EventBusEvents.AGENT_TREE_UPDATED, handler);\n }\n\n emitAgentTreeUpdated(payload: { agents: AgentPayload[] }): void {\n this.emit(EventBusEvents.AGENT_TREE_UPDATED, payload);\n }\n\n onAppQuit(handler: () => void): void {\n this.on(EventBusEvents.APP_QUIT, handler);\n }\n\n emitAppQuit(): void {\n this.emit(EventBusEvents.APP_QUIT);\n }\n\n onAppClear(handler: () => void): void {\n this.on(EventBusEvents.APP_CLEAR, handler);\n }\n\n emitAppClear(): void {\n this.emit(EventBusEvents.APP_CLEAR);\n }\n\n onStatusUpdate(handler: (payload: Partial<ContextUpdatedPayload>) => void): void {\n this.on(EventBusEvents.STATUS_UPDATE, handler);\n }\n\n emitStatusUpdate(payload: Partial<ContextUpdatedPayload>): void {\n this.emit(EventBusEvents.STATUS_UPDATE, payload);\n }\n\n onConfigChanged(handler: (payload: Record<string, unknown>) => void): void {\n this.on(EventBusEvents.CONFIG_CHANGED, handler);\n }\n\n emitConfigChanged(payload: Record<string, unknown>): void {\n this.emit(EventBusEvents.CONFIG_CHANGED, payload);\n }\n\n reset(): void {\n this.removeAllListeners();\n }\n}\n\nexport const eventbus = EventBus.getInstance();\nexport const globalEventBus = eventbus;\n","import { useState, useCallback, useRef } from 'react';\nimport { Text, Box, useInput } from 'ink';\nimport { defaultTheme } from './themes/default.ts';\nimport { eventbus } from '../core/eventbus.ts';\nimport { SLASH_COMMANDS } from '../model/types.ts';\n\ninterface InputBoxProps {\n onSubmit: (content: string) => void;\n placeholder?: string;\n}\n\nconst MAX_HISTORY = 100;\nconst history: string[] = [];\n\nfunction addHistory(content: string) {\n if (content.trim() && history[history.length - 1] !== content) {\n history.push(content);\n if (history.length > MAX_HISTORY) {\n history.shift();\n }\n }\n}\n\nexport function InputBox({ onSubmit, placeholder = '输入消息...' }: InputBoxProps) {\n const [value, setValue] = useState('');\n const [cursorPos, setCursorPos] = useState(0);\n const [historyIndex, setHistoryIndex] = useState(-1);\n const [showConfirmExit, setShowConfirmExit] = useState(false);\n const [tabSuggestions, setTabSuggestions] = useState<string[]>([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed) return;\n\n if (trimmed.startsWith('/')) {\n const cmd = SLASH_COMMANDS.find((c) => trimmed.startsWith(c.command));\n if (cmd) {\n eventbus.emitMessageSend({ content: trimmed });\n addHistory(trimmed);\n setValue('');\n setCursorPos(0);\n setHistoryIndex(-1);\n return;\n }\n }\n\n onSubmit(trimmed);\n eventbus.emitMessageSend({ content: trimmed });\n addHistory(trimmed);\n setValue('');\n setCursorPos(0);\n setHistoryIndex(-1);\n }, [value, onSubmit]);\n\n const handleTabComplete = useCallback(() => {\n if (value.startsWith('/')) {\n const matching = SLASH_COMMANDS\n .filter((c) => c.command.startsWith(value))\n .map((c) => c.command);\n\n if (matching.length === 1) {\n setValue(matching[0] + ' ');\n setCursorPos(matching[0].length + 1);\n setShowSuggestions(false);\n } else if (matching.length > 1) {\n setTabSuggestions(matching);\n setShowSuggestions(true);\n }\n }\n }, [value]);\n\n useInput((input, key) => {\n if (showConfirmExit) {\n if (input === 'y' || input === 'Y') {\n eventbus.emitAppQuit();\n return;\n }\n if (input === 'n' || input === 'N' || key.escape) {\n setShowConfirmExit(false);\n return;\n }\n return;\n }\n\n if (input === '\\x03') {\n setShowConfirmExit(true);\n return;\n }\n\n if (key.return) {\n if (key.ctrl) {\n handleSubmit();\n return;\n }\n if (showSuggestions) {\n setShowSuggestions(false);\n return;\n }\n handleSubmit();\n return;\n }\n\n if (key.tab) {\n handleTabComplete();\n return;\n }\n\n if (key.upArrow) {\n if (showSuggestions) {\n setShowSuggestions(false);\n return;\n }\n if (history.length === 0) return;\n const newIndex = historyIndex === -1\n ? history.length - 1\n : Math.max(0, historyIndex - 1);\n setHistoryIndex(newIndex);\n setValue(history[newIndex]);\n setCursorPos(history[newIndex].length);\n return;\n }\n\n if (key.downArrow) {\n if (showSuggestions) {\n setShowSuggestions(false);\n return;\n }\n if (historyIndex === -1) return;\n const newIndex = historyIndex + 1;\n if (newIndex >= history.length) {\n setHistoryIndex(-1);\n setValue('');\n setCursorPos(0);\n } else {\n setHistoryIndex(newIndex);\n setValue(history[newIndex]);\n setCursorPos(history[newIndex].length);\n }\n return;\n }\n\n if (key.escape) {\n setShowSuggestions(false);\n return;\n }\n\n if (key.backspace || key.delete) {\n setShowSuggestions(false);\n if (key.backspace) {\n if (cursorPos > 0) {\n const newVal = value.slice(0, cursorPos - 1) + value.slice(cursorPos);\n setValue(newVal);\n setCursorPos(Math.max(0, cursorPos - 1));\n }\n }\n if (key.delete) {\n if (cursorPos < value.length) {\n const newVal = value.slice(0, cursorPos) + value.slice(cursorPos + 1);\n setValue(newVal);\n }\n }\n return;\n }\n\n if (key.leftArrow) {\n setCursorPos(Math.max(0, cursorPos - 1));\n return;\n }\n\n if (key.rightArrow) {\n setCursorPos(Math.min(value.length, cursorPos + 1));\n return;\n }\n\n if ((key as Record<string, unknown>).home) {\n setCursorPos(0);\n return;\n }\n\n if ((key as Record<string, unknown>).end) {\n setCursorPos(value.length);\n return;\n }\n\n if (input && input.length === 1 && !key.ctrl && !key.meta) {\n const newVal = value.slice(0, cursorPos) + input + value.slice(cursorPos);\n setValue(newVal);\n setCursorPos(cursorPos + 1);\n\n if (newVal.startsWith('/') && newVal.length > 1) {\n const matching = SLASH_COMMANDS\n .filter((c) => c.command.startsWith(newVal))\n .map((c) => c.command);\n if (matching.length > 0) {\n setTabSuggestions(matching);\n setShowSuggestions(true);\n } else {\n setShowSuggestions(false);\n }\n } else {\n setShowSuggestions(false);\n }\n return;\n }\n });\n\n if (showConfirmExit) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"double\"\n borderColor={defaultTheme.error}\n paddingX={2}\n paddingY={0}\n >\n <Box>\n <Text bold color={defaultTheme.error}>⚠ 确认退出 DeeperCode?</Text>\n </Box>\n <Box marginTop={0}>\n <Text>按 [Y] 退出 [N/ESC] 取消</Text>\n </Box>\n </Box>\n );\n }\n\n const cursorChar = '█';\n\n const beforeCursor = value.slice(0, cursorPos);\n const atCursor = value[cursorPos] || ' ';\n const afterCursor = value.slice(cursorPos + 1);\n\n return (\n <Box flexDirection=\"column\">\n {showSuggestions && tabSuggestions.length > 0 ? (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={defaultTheme.border} paddingX={1}>\n {tabSuggestions.map((s) => (\n <Text key={s} color={defaultTheme.primary}>{s}</Text>\n ))}\n </Box>\n ) : null}\n\n <Box\n flexDirection=\"row\"\n borderStyle=\"round\"\n borderColor={defaultTheme.primary}\n paddingX={1}\n >\n <Text color={defaultTheme.primary} bold>❯ </Text>\n <Box>\n <Text>{beforeCursor}</Text>\n <Text backgroundColor={defaultTheme.primary} color={defaultTheme.background}>\n {atCursor}\n </Text>\n <Text>{afterCursor}</Text>\n {value.length === 0 ? (\n <Text dimColor>{placeholder}</Text>\n ) : null}\n </Box>\n <Text dimColor> Ctrl+Enter 发送</Text>\n </Box>\n </Box>\n );\n}\n","import type { ToolCall, ToolDefinition } from '../tools/tool-types.js';\n\nexport interface ChatMessage {\n id?: string;\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | null;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n name?: string;\n reasoning_content?: string;\n thinking?: string;\n timestamp?: number;\n}\n\nexport interface StreamChunk {\n type: 'text' | 'thinking' | 'tool_call_start' | 'tool_call_end' | 'tool_call' | 'done' | 'error';\n content?: string;\n tool_call?: ToolCall | { id: string; name: string; index?: number };\n error?: string;\n}\n\nexport interface DeepSeekConfig {\n apiKey: string;\n model: string;\n baseUrl: string;\n temperature: number;\n maxTokens: number;\n think: {\n enabled: boolean;\n budgetTokens: number;\n };\n signal?: AbortSignal;\n}\n\nexport interface ToolCallRecord {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: string;\n}\n\nexport interface AgentInfo {\n id: string;\n name: string;\n status: 'idle' | 'running' | 'completed' | 'failed';\n task: string;\n children?: AgentInfo[];\n}\n\nexport interface SlashCommand {\n command: string;\n description: string;\n}\n\nexport const SLASH_COMMANDS: SlashCommand[] = [\n { command: '/help', description: '显示帮助信息' },\n { command: '/clear', description: '清空对话' },\n { command: '/quit', description: '退出 DeeperCode' },\n { command: '/save [name]', description: '保存当前会话' },\n { command: '/load [name]', description: '加载历史会话' },\n { command: '/resume [name]', description: '恢复历史会话' },\n { command: '/sessions', description: '会话列表' },\n { command: '/model', description: '查看/切换模型' },\n { command: '/config', description: '查看/修改配置' },\n { command: '/tools [cat]', description: '列出可用工具' },\n { command: '/skills', description: '列出已加载技能' },\n { command: '/mcp', description: '管理 MCP 连接' },\n { command: '/memory', description: '记忆系统' },\n { command: '/tasks', description: '任务列表' },\n { command: '/rules', description: '规则管理' },\n { command: '/stats', description: '统计信息' },\n { command: '/status', description: '当前状态' },\n { command: '/cwd', description: '当前目录' },\n { command: '/export', description: '导出对话' },\n { command: '/init', description: '初始化项目' },\n { command: '/plan <任务>', description: '先出方案再实施' },\n { command: '/spec <任务>', description: '先出规格再实施' },\n { command: '/review <路径>', description: '代码审查' },\n { command: '/fix [目标]', description: '自动修复构建/测试错误' },\n { command: '/commit', description: '智能分析变更并提交' },\n { command: '/analyze [路径]', description: '项目架构分析' },\n { command: '/diff <文件>', description: '查看文件变更' },\n { command: '/undo', description: '撤销最近文件修改' },\n];\n\nexport type DeepSeekMessage = ChatMessage;\nexport type DeepSeekToolCall = ToolCall;\nexport type DeepSeekToolDefinition = ToolDefinition;\nexport type DeepSeekRequest = {\n model: string;\n messages: ChatMessage[];\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n tools?: DeepSeekToolDefinition[];\n};\nexport type DeepSeekResponse = {\n id: string;\n choices: Array<{\n message: ChatMessage;\n finish_reason: string;\n }>;\n};\nexport type DeepSeekStreamChunk = StreamChunk;\n","import { useEffect, useState, useRef } from 'react';\nimport { Text, Box, useStdin } from 'ink';\nimport { MessageBubble } from './MessageBubble.tsx';\nimport { defaultTheme } from './themes/default.ts';\nimport { eventbus } from '../core/eventbus.ts';\nimport type { ChatMessage } from '../model/types.ts';\nimport readline from 'node:readline';\n\ninterface ChatViewProps {\n initialMessages?: ChatMessage[];\n apiKey?: string;\n model?: string;\n}\n\nconst HISTORY_MAX = 100;\nconst history: string[] = [];\n\nconst SLASH_RESULTS: Record<string, string> = {\n '/help': '命令: /help /clear /quit /config /model /tools /export /theme',\n '/clear': '__CLEAR__',\n '/quit': '__QUIT__',\n '/config': '打开配置: deeper config list | deeper config set <key> <value>',\n '/model': '模型: deepseek-v4-pro / v4-flash',\n '/tools': '105 个内置工具已就绪',\n '/export': '对话导出功能开发中',\n '/theme': '主题: dark | 切换: deeper config set theme light',\n};\n\nexport function ChatView({ initialMessages = [], apiKey, model }: ChatViewProps) {\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [thinking, setThinking] = useState(false);\n const keyRef = useRef(apiKey);\n const modelRef = useRef(model || 'deepseek-v4-pro');\n keyRef.current = apiKey;\n\n useEffect(() => {\n const onMsg = (p: { id: string; role: 'user' | 'assistant' | 'system'; content: string; timestamp: number }) => {\n setMessages(prev => [...prev, { ...p }]);\n };\n const onClear = () => { setMessages([]); setThinking(false); };\n eventbus.onMessageReceived(onMsg);\n eventbus.onAppClear(onClear);\n return () => { eventbus.removeAllListeners(); };\n }, []);\n\n const handleSubmit = (content: string) => {\n const trimmed = content.trim();\n if (!trimmed) return;\n\n if (SLASH_RESULTS[trimmed]) {\n const r = SLASH_RESULTS[trimmed];\n if (r === '__QUIT__') { eventbus.emitAppQuit(); return; }\n if (r === '__CLEAR__') { setMessages([]); return; }\n setMessages(prev => [...prev, { id: `s-${Date.now()}`, role: 'system', content: r, timestamp: Date.now() }]);\n return;\n }\n\n history.push(trimmed);\n if (history.length > HISTORY_MAX) history.shift();\n\n const um: ChatMessage = { id: `u-${Date.now()}`, role: 'user', content: trimmed, timestamp: Date.now() };\n setMessages(prev => [...prev, um]);\n eventbus.emitMessageSend({ content: trimmed });\n\n const currentKey = keyRef.current || '';\n if (!currentKey) {\n setMessages(prev => [...prev, {\n id: `a-${Date.now()}`, role: 'system',\n content: '⚠ 未配置 API Key。\\n\\n请运行以下命令配置:\\n deeper config set apiKey \"sk-你的DeepSeek密钥\"\\n\\n获取密钥: https://platform.deepseek.com',\n timestamp: Date.now(),\n }]);\n return;\n }\n\n setThinking(true);\n callDeepSeek(trimmed, currentKey, modelRef.current, messages)\n .then(responseText => {\n setThinking(false);\n setMessages(prev => [...prev, {\n id: `a-${Date.now()}`, role: 'assistant',\n content: responseText,\n timestamp: Date.now(),\n }]);\n })\n .catch(err => {\n setThinking(false);\n setMessages(prev => [...prev, {\n id: `a-${Date.now()}`, role: 'system',\n content: `❌ API 请求失败: ${err instanceof Error ? err.message : String(err)}`,\n timestamp: Date.now(),\n }]);\n });\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\" paddingX={1}>\n {messages.length === 0 && !thinking ? (\n <Box flexDirection=\"column\" paddingY={1}>\n <Box>\n <Text bold color={defaultTheme.primary}>DeeperCode</Text>\n <Text dimColor> — 一句话生成完整项目</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>输入你的任务或 /help 查看命令</Text>\n </Box>\n </Box>\n ) : null}\n\n {messages.map((m) => (\n <MessageBubble key={m.id} role={m.role} content={m.content} timestamp={m.timestamp} />\n ))}\n\n {thinking ? (\n <Box marginY={1}><Text dimColor>思考中...</Text></Box>\n ) : null}\n </Box>\n\n <InputLine onSubmit={handleSubmit} />\n </Box>\n );\n}\n\nasync function callDeepSeek(\n prompt: string,\n apiKey: string,\n model: string,\n history: ChatMessage[],\n): Promise<string> {\n const systemMsg = {\n role: 'system',\n content: '你是 DeeperCode AI 编程助手,基于 DeepSeek-V4-Pro。你擅长编写代码、调试、项目构建和技术问题解答。请用中文回复,代码保持原样。',\n };\n\n const recentHistory = history.slice(-20).map(m => ({\n role: m.role === 'system' ? 'system' : m.role,\n content: m.content || '',\n }));\n\n const messages = [systemMsg, ...recentHistory, { role: 'user', content: prompt }];\n\n const response = await fetch('https://api.deepseek.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: false,\n max_tokens: 4096,\n temperature: 0.7,\n }),\n });\n\n if (!response.ok) {\n const errText = await response.text().catch(() => '');\n if (response.status === 401) throw new Error('API Key 无效或已过期,请检查配置');\n throw new Error(`HTTP ${response.status}: ${errText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n return data.choices?.[0]?.message?.content || '(空响应)';\n}\n\nfunction InputLine({ onSubmit }: { onSubmit: (v: string) => void }) {\n const { stdin } = useStdin();\n const [buf, setBuf] = useState('');\n const bufRef = useRef('');\n bufRef.current = buf;\n const histIdx = useRef(-1);\n const cursorRef = useRef(0);\n\n useEffect(() => {\n if (!stdin) return;\n\n readline.emitKeypressEvents(stdin as unknown as NodeJS.ReadableStream);\n\n const onKP = (str: string | undefined, key: readline.Key) => {\n if (key.ctrl && key.name === 'c') {\n eventbus.emitAppQuit();\n return;\n }\n\n if (key.name === 'return' || key.name === 'enter') {\n if (bufRef.current.trim()) {\n onSubmit(bufRef.current);\n }\n bufRef.current = '';\n cursorRef.current = 0;\n setBuf('');\n histIdx.current = -1;\n return;\n }\n\n if (key.name === 'backspace') {\n if (cursorRef.current > 0) {\n const prev = bufRef.current;\n bufRef.current = prev.slice(0, cursorRef.current - 1) + prev.slice(cursorRef.current);\n cursorRef.current = Math.max(0, cursorRef.current - 1);\n setBuf(bufRef.current);\n }\n return;\n }\n\n if (key.name === 'delete') {\n if (cursorRef.current < bufRef.current.length) {\n const prev = bufRef.current;\n bufRef.current = prev.slice(0, cursorRef.current) + prev.slice(cursorRef.current + 1);\n setBuf(bufRef.current);\n }\n return;\n }\n\n if (key.name === 'left') {\n cursorRef.current = Math.max(0, cursorRef.current - 1);\n return;\n }\n if (key.name === 'right') {\n cursorRef.current = Math.min(bufRef.current.length, cursorRef.current + 1);\n return;\n }\n if (key.name === 'home') { cursorRef.current = 0; return; }\n if (key.name === 'end') { cursorRef.current = bufRef.current.length; return; }\n\n if (key.name === 'up') {\n if (history.length === 0) return;\n const idx = histIdx.current === -1 ? history.length - 1 : Math.max(0, histIdx.current - 1);\n histIdx.current = idx;\n bufRef.current = history[idx];\n cursorRef.current = bufRef.current.length;\n setBuf(bufRef.current);\n return;\n }\n\n if (key.name === 'down') {\n if (histIdx.current === -1) return;\n const idx = histIdx.current + 1;\n if (idx >= history.length) {\n histIdx.current = -1;\n bufRef.current = '';\n cursorRef.current = 0;\n } else {\n histIdx.current = idx;\n bufRef.current = history[idx];\n cursorRef.current = bufRef.current.length;\n }\n setBuf(bufRef.current);\n return;\n }\n\n if (str) {\n const prev = bufRef.current;\n bufRef.current = prev.slice(0, cursorRef.current) + str + prev.slice(cursorRef.current);\n cursorRef.current += str.length;\n setBuf(bufRef.current);\n histIdx.current = -1;\n }\n };\n\n (stdin as any).on('keypress', onKP);\n return () => { (stdin as any).removeListener('keypress', onKP); };\n }, []);\n\n const before = buf.slice(0, cursorRef.current);\n const at = buf[cursorRef.current] || ' ';\n const after = buf.slice(cursorRef.current + 1);\n\n return (\n <Box paddingX={1}>\n <Text color={defaultTheme.primary} bold>❯ </Text>\n <Text>{before}</Text>\n <Text inverse>{at}</Text>\n <Text>{after}</Text>\n </Box>\n );\n}\n","import { useEffect, useState, useRef } from 'react';\nimport { Text, Box } from 'ink';\nimport { ChatView } from './ChatView.tsx';\nimport { StatusBar } from './StatusBar.tsx';\nimport { eventbus } from '../core/eventbus.ts';\nimport type { ChatMessage } from '../model/types.ts';\n\ninterface AppProps {\n apiKey?: string;\n model?: string;\n verbose?: boolean;\n autoRun?: string;\n}\n\nexport function App({ apiKey, model, autoRun }: AppProps) {\n const [initialMessages, setInitialMessages] = useState<ChatMessage[]>([]);\n const startTimeRef = useRef(Date.now());\n\n useEffect(() => {\n const memTimer = setInterval(() => {\n eventbus.emitStatusUpdate({\n memoryUsage: Math.round(process.memoryUsage().heapUsed / (1024 * 1024)),\n uptime: Date.now() - startTimeRef.current,\n });\n }, 5000);\n\n if (autoRun) {\n setInitialMessages([{\n id: `auto-${Date.now()}`, role: 'user', content: autoRun, timestamp: Date.now(),\n }]);\n }\n\n return () => { clearInterval(memTimer); eventbus.reset(); };\n }, []);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <ChatView\n initialMessages={initialMessages}\n apiKey={apiKey}\n model={model}\n />\n <StatusBar />\n </Box>\n );\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport process from 'node:process';\nimport { DEEPER_CONFIG_FILE, PROJECT_CONFIG_FILE, DEEPSEEK_DEFAULT_MODEL, DEEPSEEK_BASE_URL } from './constants.js';\n\nexport interface MCPConfigEntry {\n name: string;\n command?: string;\n args?: string[];\n url?: string;\n enabled: boolean;\n autoConnect: boolean;\n}\n\nexport interface SkillConfigEntry {\n name: string;\n path: string;\n enabled: boolean;\n autoLoad: boolean;\n}\n\nexport interface DeeperConfig {\n model: string;\n apiKey: string;\n baseUrl: string;\n temperature: number;\n maxTokens: number;\n thinkEnabled: boolean;\n thinkBudget: number;\n thinkBudgetTokens: number;\n logLevel: string;\n maxRetries: number;\n timeoutMs: number;\n maxSubAgents: number;\n maxRecursionDepth: number;\n theme: 'dark' | 'light';\n locale: string;\n mcpServers: MCPConfigEntry[];\n skills: SkillConfigEntry[];\n [key: string]: unknown;\n}\n\nconst DEFAULT_CONFIG: DeeperConfig = {\n model: DEEPSEEK_DEFAULT_MODEL,\n apiKey: process.env.DEEPSEEK_API_KEY || '',\n baseUrl: DEEPSEEK_BASE_URL,\n temperature: 0.7,\n maxTokens: 8192,\n thinkEnabled: true,\n thinkBudget: 32000,\n thinkBudgetTokens: 32000,\n logLevel: 'info',\n maxRetries: 3,\n timeoutMs: 120000,\n maxSubAgents: 5,\n maxRecursionDepth: 2,\n theme: 'dark',\n locale: 'zh-CN',\n mcpServers: [],\n skills: [],\n};\n\nconst PROJECT_CONFIG_PATH = join(process.cwd(), PROJECT_CONFIG_FILE);\nconst USER_CONFIG_PATH = DEEPER_CONFIG_FILE;\n\nexport class ConfigManager {\n private defaults: DeeperConfig;\n private userConfig: Partial<DeeperConfig>;\n private projectConfig: Partial<DeeperConfig>;\n private envOverrides: Partial<DeeperConfig>;\n private cliOverrides: Partial<DeeperConfig>;\n\n constructor() {\n this.defaults = { ...DEFAULT_CONFIG };\n this.userConfig = {};\n this.projectConfig = {};\n this.envOverrides = {};\n this.cliOverrides = {};\n }\n\n load(): void {\n this.userConfig = this.readJSONFile(USER_CONFIG_PATH);\n this.projectConfig = this.readJSONFile(PROJECT_CONFIG_PATH);\n this.envOverrides = this.readEnvOverrides();\n }\n\n save(scope: 'user' | 'project'): void {\n const configPath = scope === 'user' ? USER_CONFIG_PATH : PROJECT_CONFIG_PATH;\n const currentConfig = scope === 'user' ? this.userConfig : this.projectConfig;\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, JSON.stringify(currentConfig, null, 2), 'utf-8');\n }\n\n get<K extends keyof DeeperConfig>(key: K): DeeperConfig[K] {\n if (key in this.cliOverrides) {\n return this.cliOverrides[key] as DeeperConfig[K];\n }\n if (key in this.envOverrides) {\n return this.envOverrides[key] as DeeperConfig[K];\n }\n if (key in this.projectConfig) {\n return this.projectConfig[key] as DeeperConfig[K];\n }\n if (key in this.userConfig) {\n return this.userConfig[key] as DeeperConfig[K];\n }\n return this.defaults[key];\n }\n\n set<K extends keyof DeeperConfig>(key: K, value: DeeperConfig[K], scope: 'cli' | 'project' | 'user'): void {\n switch (scope) {\n case 'cli':\n this.cliOverrides[key] = value;\n break;\n case 'project':\n this.projectConfig[key] = value;\n break;\n case 'user':\n this.userConfig[key] = value;\n break;\n }\n }\n\n setCliOverrides(overrides: Partial<DeeperConfig>): void {\n this.cliOverrides = { ...overrides };\n }\n\n getAll(): DeeperConfig {\n return {\n ...this.defaults,\n ...this.userConfig,\n ...this.projectConfig,\n ...this.envOverrides,\n ...this.cliOverrides,\n };\n }\n\n private readJSONFile(path: string): Partial<DeeperConfig> {\n try {\n if (existsSync(path)) {\n const content = readFileSync(path, 'utf-8');\n return JSON.parse(content) as Partial<DeeperConfig>;\n }\n } catch {\n }\n return {};\n }\n\n private readEnvOverrides(): Partial<DeeperConfig> {\n const overrides: Partial<DeeperConfig> = {};\n const envMap: Record<string, keyof DeeperConfig> = {\n DEEPER_MODEL: 'model',\n DEEPER_API_KEY: 'apiKey',\n DEEPER_BASE_URL: 'baseUrl',\n DEEPER_TEMPERATURE: 'temperature',\n DEEPER_MAX_TOKENS: 'maxTokens',\n DEEPER_THINK_ENABLED: 'thinkEnabled',\n DEEPER_THINK_BUDGET: 'thinkBudget',\n DEEPER_LOG_LEVEL: 'logLevel',\n DEEPER_MAX_RETRIES: 'maxRetries',\n DEEPER_TIMEOUT: 'timeoutMs',\n };\n\n for (const [envKey, configKey] of Object.entries(envMap)) {\n const value = process.env[envKey];\n if (value !== undefined) {\n switch (typeof DEFAULT_CONFIG[configKey]) {\n case 'number':\n (overrides as Record<string, unknown>)[configKey] = Number(value);\n break;\n case 'boolean':\n (overrides as Record<string, unknown>)[configKey] = value.toLowerCase() === 'true' || value === '1';\n break;\n default:\n (overrides as Record<string, unknown>)[configKey] = value;\n break;\n }\n }\n }\n\n return overrides;\n }\n}\n\nlet cachedConfig: DeeperConfig | null = null;\n\nconst KEY_ALIASES: Record<string, keyof DeeperConfig> = {\n api_key: 'apiKey',\n 'api-key': 'apiKey',\n base_url: 'baseUrl',\n 'base-url': 'baseUrl',\n max_tokens: 'maxTokens',\n 'max-tokens': 'maxTokens',\n think_enabled: 'thinkEnabled',\n 'think-enabled': 'thinkEnabled',\n think_budget: 'thinkBudget',\n 'think-budget': 'thinkBudget',\n log_level: 'logLevel',\n 'log-level': 'logLevel',\n max_retries: 'maxRetries',\n 'max-retries': 'maxRetries',\n timeout_ms: 'timeoutMs',\n 'timeout-ms': 'timeoutMs',\n max_sub_agents: 'maxSubAgents',\n 'max-sub-agents': 'maxSubAgents',\n max_recursion_depth: 'maxRecursionDepth',\n 'max-recursion-depth': 'maxRecursionDepth',\n mcp_servers: 'mcpServers',\n 'mcp-servers': 'mcpServers',\n};\n\nfunction normalizeConfig(raw: Record<string, unknown>): Partial<DeeperConfig> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n const canonical = KEY_ALIASES[key] || key;\n result[canonical] = value;\n }\n return result as Partial<DeeperConfig>;\n}\n\nexport function loadConfig(): DeeperConfig {\n if (cachedConfig) return cachedConfig;\n try {\n if (existsSync(DEEPER_CONFIG_FILE)) {\n const raw = readFileSync(DEEPER_CONFIG_FILE, 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n cachedConfig = { ...DEFAULT_CONFIG, ...normalizeConfig(parsed) };\n } else {\n cachedConfig = { ...DEFAULT_CONFIG };\n }\n } catch {\n cachedConfig = { ...DEFAULT_CONFIG };\n }\n return cachedConfig;\n}\n\nexport function saveConfig(config?: DeeperConfig): void {\n if (config) cachedConfig = { ...config };\n if (!cachedConfig) cachedConfig = { ...DEFAULT_CONFIG };\n const dir = dirname(DEEPER_CONFIG_FILE);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(DEEPER_CONFIG_FILE, JSON.stringify(cachedConfig, null, 2), 'utf-8');\n}\n\nexport function getConfig(): DeeperConfig {\n return cachedConfig ?? loadConfig();\n}\n\nexport function updateConfig(partial: Partial<DeeperConfig>): DeeperConfig {\n const current = getConfig();\n cachedConfig = { ...current, ...partial };\n saveConfig();\n return cachedConfig;\n}\n\nexport function resetConfig(): DeeperConfig {\n cachedConfig = { ...DEFAULT_CONFIG };\n saveConfig();\n return cachedConfig;\n}\n\nexport function getConfigValue<K extends keyof DeeperConfig>(key: K): DeeperConfig[K] {\n return getConfig()[key];\n}\n\nexport function setConfigValue<K extends keyof DeeperConfig>(key: K, value: DeeperConfig[K]): void {\n updateConfig({ [key]: value } as unknown as Partial<DeeperConfig>);\n}\n\nexport function getApiKey(): string {\n return getConfig().apiKey || process.env.DEEPSEEK_API_KEY || '';\n}\n\nexport function getModel(): string {\n return getConfig().model;\n}\n\nexport function getBaseUrl(): string {\n return getConfig().baseUrl;\n}\n\nexport const configManager = { load: () => loadConfig(), save: saveConfig, get: getConfigValue, set: setConfigValue, getAll: getConfig };\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport process from 'node:process';\n\nexport const DEEPER_VERSION = '1.0.0';\nexport const DEEPER_NAME = 'DeeperCode';\nexport const DEEPER_HOME = join(process.env.DEEPER_HOME || join(homedir(), '.deeper'));\nexport const DEEPER_CONFIG_FILE = join(DEEPER_HOME, 'config.json');\nexport const DEEPER_MCP_FILE = join(DEEPER_HOME, 'mcp.json');\nexport const DEEPER_SKILLS_DIR = join(DEEPER_HOME, 'skills');\nexport const DEEPER_SESSIONS_DIR = join(DEEPER_HOME, 'sessions');\nexport const DEEPER_LOGS_DIR = join(DEEPER_HOME, 'logs');\nexport const DEEPER_MEMORY_FILE = join(DEEPER_HOME, 'memory.json');\nexport const PROJECT_CONFIG_DIR = '.deeper';\nexport const PROJECT_CONFIG_FILE = join(PROJECT_CONFIG_DIR, 'config.json');\nexport const PROJECT_SKILLS_DIR = join(PROJECT_CONFIG_DIR, 'skills');\n\nexport const DEEPSEEK_BASE_URL = 'https://api.deepseek.com';\nexport const DEEPSEEK_DEFAULT_MODEL = 'deepseek-v4-pro';\nexport const DEEPSEEK_MODELS = ['deepseek-v4-pro', 'deepseek-v4-flash'] as const;\nexport type DeepSeekModel = typeof DEEPSEEK_MODELS[number];\nexport const DEEPSEEK_MAX_TOKENS = 1_048_576;\nexport const DEEPSEEK_THINK_BUDGET = 16000;\n\nexport const AGENT_MAX_SUB_AGENTS = 5;\nexport const AGENT_MAX_RECURSION_DEPTH = 2;\nexport const AGENT_SUB_AGENT_TIMEOUT_MS = 120000;\nexport const AGENT_MAX_CONCURRENT_TOOLS = 3;\n\nexport const CONTEXT_MAX_TOKENS = 1_048_576;\nexport const CONTEXT_AUTO_SUMMARIZE_THRESHOLD = 786_432;\nexport const CONTEXT_HISTORY_SIZE = 80;\nexport const CONTEXT_FILE_LIMIT = 50_000;\n\nexport const CONTEXT_COMPRESSION_STAGES = [\n { threshold: 0.7, strategy: 'light' },\n { threshold: 0.85, strategy: 'aggressive' },\n { threshold: 0.95, strategy: 'emergency' },\n] as const;\n\nexport const MCP_CONNECTION_TIMEOUT_MS = 10000;\n\nexport const TOOL_CATEGORIES = [\n 'filesystem', 'search', 'shell', 'network',\n 'code', 'database', 'data', 'security',\n 'project', 'ai', 'system',\n] as const;\n\nexport type ToolCategory = typeof TOOL_CATEGORIES[number];\n","export interface JSONSchema {\n type: string;\n properties?: Record<string, JSONSchema>;\n required?: string[];\n description?: string;\n enum?: string[];\n items?: JSONSchema;\n additionalProperties?: boolean;\n}\n\nexport interface ToolParameter {\n name: string;\n type: string;\n description: string;\n required: boolean;\n default?: unknown;\n enum?: string[];\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n category: string;\n parameters: JSONSchema;\n dangerous?: boolean;\n requiresApproval?: boolean;\n}\n\nexport interface ToolResult {\n success: boolean;\n output: string;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ToolExecutor {\n execute(params: Record<string, unknown>, signal?: AbortSignal): Promise<ToolResult>;\n}\n\nexport type Tool = ToolDefinition & ToolExecutor;\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n index?: number;\n}\n\nexport interface ToolCallResult {\n callId: string;\n result: ToolResult;\n timestamp: number;\n}\n\nexport type ToolSafetyLevel = 'safe' | 'confirm' | 'dangerous';\n\nexport const TOOL_SAFETY_MAP: Record<string, ToolSafetyLevel> = {\n read_file: 'safe', list_dir: 'safe', glob_find: 'safe', file_info: 'safe',\n grep_search: 'safe', text_search: 'safe', fuzzy_find: 'safe', regex_find: 'safe',\n find_references: 'safe', find_definition: 'safe', symbol_search: 'safe',\n search_package: 'safe', search_docs: 'safe', codebase_search: 'safe',\n token_count: 'safe', system_info: 'safe', process_list: 'safe',\n resource_monitor: 'safe', log_viewer: 'safe', bug_scan: 'safe',\n web_fetch: 'safe', web_search: 'safe', check_url: 'safe',\n parse_html: 'safe', http_request: 'safe',\n watch_file: 'safe', batch_read: 'safe', create_dir: 'safe',\n json_parse: 'safe', csv_parse: 'safe', xml_parse: 'safe', yaml_parse: 'safe', toml_parse: 'safe',\n data_validate: 'safe', data_diff: 'safe', hash_generate: 'safe', jwt_decode: 'safe',\n coverage_report: 'safe', config_manage: 'safe', notify_user: 'safe',\n format_code: 'safe', lint_code: 'safe', type_check: 'safe', code_metrics: 'safe',\n analyze_deps: 'safe', import_organizer: 'safe', parse_ast: 'safe',\n db_schema: 'safe',\n context_summarize: 'safe', prompt_template: 'safe',\n skill_create: 'safe', tool_create: 'safe', memory_store: 'safe',\n todo_manager: 'safe', subagent: 'safe',\n background_terminal: 'safe', list_terminals: 'safe', read_terminal: 'safe',\n send_keys: 'safe', send_ctrl_keys: 'safe', send_text: 'safe', kill_terminal: 'safe',\n terminal_screenshot: 'safe', terminal_resize: 'safe', check_status: 'safe', stop_command: 'safe',\n download_file: 'safe', api_call: 'safe', graphql_query: 'safe', websocket_connect: 'safe',\n\n write_file: 'safe', edit_file: 'safe',\n delete_file: 'confirm', move_file: 'confirm', copy_file: 'confirm', batch_write: 'safe',\n merge_files: 'confirm', diff_files: 'confirm',\n run_command: 'safe', run_async: 'safe', pipe_commands: 'safe',\n shell_script: 'confirm', npm_manage: 'confirm',\n project_init: 'confirm', build_project: 'confirm', run_test: 'confirm',\n docker_manage: 'confirm', env_manage: 'confirm',\n sql_query: 'confirm', sql_migrate: 'confirm', nosql_query: 'confirm',\n db_backup: 'confirm', db_restore: 'confirm', redis_command: 'confirm',\n encrypt_file: 'confirm', decrypt_file: 'confirm',\n template_render: 'confirm', chart_generate: 'confirm',\n secret_scan: 'confirm', vulnerability_check: 'confirm',\n orm_generate: 'confirm', generate_code: 'confirm', refactor_code: 'confirm',\n extract_function: 'confirm', data_transform: 'confirm', proxy_request: 'confirm',\n\n interactive_terminal: 'confirm',\n browser_action: 'confirm', screenshot_page: 'confirm',\n};\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { DEEPER_HOME, DEEPER_CONFIG_FILE, DEEPER_SKILLS_DIR, DEEPER_SESSIONS_DIR, DEEPER_LOGS_DIR, DEEPER_VERSION } from '../core/constants.ts';\nimport { loadConfig } from '../core/config.ts';\nimport { eventbus } from '../core/eventbus.ts';\n\nexport interface BootstrapResult {\n success: boolean;\n errors: string[];\n warnings: string[];\n config: ReturnType<typeof loadConfig>;\n}\n\nexport async function bootstrap(): Promise<BootstrapResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const nodeVersion = process.versions.node;\n const majorVersion = parseInt(nodeVersion.split('.')[0], 10);\n if (majorVersion < 20) {\n errors.push(`Node.js 版本过低: ${nodeVersion},需要 >= 20.0.0`);\n return { success: false, errors, warnings, config: loadConfig() };\n }\n\n const dirs = [\n DEEPER_HOME,\n DEEPER_SKILLS_DIR,\n DEEPER_SESSIONS_DIR,\n DEEPER_LOGS_DIR,\n ];\n\n for (const dir of dirs) {\n try {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n } catch {\n errors.push(`无法创建目录: ${dir}`);\n }\n }\n\n let config;\n try {\n config = loadConfig();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n errors.push(`配置加载失败: ${msg}`);\n config = loadConfig();\n }\n\n if (!config.apiKey && !process.env.DEEPSEEK_API_KEY) {\n warnings.push('未设置 API Key。请运行: deeper config set api_key \"sk-你的密钥\"');\n }\n\n if (errors.length > 0) {\n return { success: false, errors, warnings, config };\n }\n\n return { success: true, errors, warnings, config };\n}\n\nexport function checkNodeVersion(): boolean {\n const nodeVersion = process.versions.node;\n const majorVersion = parseInt(nodeVersion.split('.')[0], 10);\n return majorVersion >= 20;\n}\n\nexport function getVersionInfo(): string {\n return `DeeperCode v${DEEPER_VERSION} | Node.js ${process.versions.node} | ${process.platform} ${process.arch}`;\n}\n","import { render } from 'ink';\nimport { App } from '../../ui/App.tsx';\nimport { bootstrap } from '../bootstrap.ts';\n\ninterface ChatOptions {\n model?: string;\n apiKey?: string;\n verbose?: boolean;\n autoRun?: string;\n}\n\nexport async function chat(opts: ChatOptions = {}): Promise<void> {\n const result = await bootstrap();\n\n if (!result.success) {\n for (const err of result.errors) {\n console.error(`❌ ${err}`);\n }\n process.exit(1);\n }\n\n for (const warn of result.warnings) {\n console.warn(`⚠ ${warn}`);\n }\n\n const model = opts.model || result.config.model;\n const apiKey = opts.apiKey || result.config.apiKey;\n\n const { waitUntilExit } = render(\n <App\n apiKey={apiKey}\n model={model}\n verbose={opts.verbose}\n autoRun={opts.autoRun}\n />,\n );\n\n await waitUntilExit();\n}\n","import { loadConfig } from '../../core/config.ts';\nimport { bootstrap } from '../bootstrap.ts';\nimport type { DeeperConfig } from '../../core/config.ts';\n\ninterface RunOptions {\n task?: string;\n model?: string;\n apiKey?: string;\n files?: string[];\n}\n\nexport async function run(task: string, opts: RunOptions = {}): Promise<void> {\n const result = await bootstrap();\n\n if (!result.success) {\n for (const err of result.errors) {\n console.error(`❌ ${err}`);\n }\n process.exit(1);\n }\n\n if (!task) {\n console.error('❌ 请提供任务描述。用法: deeper run \"任务描述\"');\n process.exit(1);\n }\n\n const config = opts.model || opts.apiKey\n ? { ...result.config, ...(opts.model ? { model: opts.model } : {}), ...(opts.apiKey ? { apiKey: opts.apiKey } : {}) }\n : result.config;\n\n if (!config.apiKey && !process.env.DEEPSEEK_API_KEY) {\n console.error('❌ 未设置 API Key');\n console.error(' 请设置环境变量 DEEPSEEK_API_KEY 或使用 --api-key 参数');\n process.exit(1);\n }\n\n console.log(`\\n🚀 DeeperCode 执行任务\\n`);\n console.log(`📋 任务: ${task}`);\n console.log(`🤖 模型: ${config.model}`);\n console.log(`🔗 API: ${config.baseUrl}`);\n console.log();\n\n console.log('⏳ 正在连接 DeepSeek API...');\n console.log();\n\n try {\n const apiKey = config.apiKey || process.env.DEEPSEEK_API_KEY || '';\n const response = await fetch(`${config.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: config.model,\n messages: [\n {\n role: 'system',\n content: '你是一个强大的 AI 编程助手。请帮助用户完成任务。',\n },\n {\n role: 'user',\n content: task,\n },\n ],\n stream: true,\n max_tokens: Math.max(1, Math.min(config.maxTokens || 4096, 131072)),\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n console.error(`❌ API 请求失败 (${response.status}): ${text}`);\n process.exit(1);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n console.error('❌ 无法读取响应流');\n process.exit(1);\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let fullContent = '';\n let thinkingContent = '';\n\n console.log('📝 AI 响应:\\n');\n console.log('─'.repeat(60));\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data: ')) continue;\n\n const data = trimmed.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.thinking) {\n thinkingContent += delta.thinking;\n }\n\n if (delta?.content) {\n fullContent += delta.content;\n process.stdout.write(delta.content);\n }\n } catch {\n // 跳过无法解析的行\n }\n }\n }\n\n console.log('\\n' + '─'.repeat(60));\n console.log();\n\n if (thinkingContent) {\n console.log('💭 思考过程:');\n console.log('─'.repeat(60));\n console.log(thinkingContent.slice(0, 500));\n if (thinkingContent.length > 500) {\n console.log(`... (还有 ${thinkingContent.length - 500} 字符)`);\n }\n console.log('─'.repeat(60));\n }\n\n const usage = `📊 Token: ~${fullContent.length} 输出`;\n console.log(usage);\n console.log();\n\n console.log('✅ 任务执行完成!');\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`❌ 请求失败: ${msg}`);\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","Text","Box","jsx","jsxs","Box","Text","useState","useEffect","Text","Box","jsx","jsxs","useState","useEffect","Box","Text","useState","useEffect","Text","Box","jsx","jsxs","useState","useEffect","Box","Text","useState","Text","Box","useInput","jsx","jsxs","useState","useInput","Box","Text","useEffect","useState","useRef","Text","Box","jsx","jsxs","history","useState","useRef","useEffect","Box","Text","useEffect","useState","useRef","Box","jsx","jsxs","useState","useRef","useEffect","Box","join","process","process","process","join","process","existsSync","mkdirSync","existsSync","mkdirSync","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deeper-cli",
3
- "version": "1.0.5",
3
+ "version": "1.2.0",
4
4
  "description": "DeeperCode - 一句话生成完整项目的 AI Agentic CLI 工具",
5
5
  "type": "module",
6
6
  "bin": {