zencode-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/zencode.js +4176 -0
- package/dist/bin/zencode.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/config/defaults.ts","../../src/config/loader.ts","../../src/llm/client.ts","../../src/tools/registry.ts","../../src/tools/read-file.ts","../../src/tools/write-file.ts","../../src/tools/edit-file.ts","../../src/tools/bash.ts","../../src/tools/glob.ts","../../src/tools/grep.ts","../../src/tools/register.ts","../../src/tools/permission.ts","../../src/core/conversation.ts","../../src/core/agent.ts","../../src/core/dual-agent/coder.ts","../../src/core/dual-agent/modes.ts","../../src/core/dual-agent/orchestrator.ts","../../src/core/prompt/layers/core.ts","../../src/core/prompt/layers/planning.ts","../../src/core/prompt/layers/parallel.ts","../../src/core/prompt/layers/git.ts","../../src/core/prompt/layers/project.ts","../../src/core/prompt/builder.ts","../../src/core/todo-store.ts","../../src/core/memo-store.ts","../../src/core/sub-agent.ts","../../src/tools/spawn-agents.ts","../../src/tools/todo.ts","../../src/tools/memo.ts","../../src/cli/tui/bridge.ts","../../src/core/sub-agent-tracker.ts","../../src/cli/tui/state.ts","../../src/cli/tui/components/ToolCallLine.tsx","../../src/cli/tui/components/MessageBubble.tsx","../../src/cli/tui/components/ChatArea.tsx","../../src/cli/tui/components/InputArea.tsx","../../src/cli/tui/components/StatusBar.tsx","../../src/cli/tui/components/ConfirmPrompt.tsx","../../src/cli/tui/components/TodoPanel.tsx","../../src/cli/tui/App.tsx","../../src/cli/tui/index.tsx","../../src/cli/index.ts","../../src/cli/repl.ts","../../src/cli/ui.ts","../../bin/zencode.ts"],"sourcesContent":["import type { ZenCodeConfig } from './types.js';\n\nexport const DEFAULT_CONFIG: ZenCodeConfig = {\n model: 'deepseek-chat',\n api_key: '',\n base_url: 'https://api.deepseek.com/v1',\n temperature: 0.7,\n max_tokens: 8192,\n\n agent_mode: 'dual',\n collaboration: 'delegated',\n\n dual_agent: {},\n\n features: {\n git: 'auto',\n mcp: 'off',\n planning_layer: 'on',\n parallel_agents: 'on',\n todo: 'on',\n },\n\n permissions: {\n auto_approve: ['read-file', 'glob', 'grep', 'spawn-agents', 'todo', 'memo'],\n require_approval: ['write-file', 'edit-file', 'bash', 'git'],\n },\n\n mcp_servers: [],\n prompts: [],\n max_tool_output: 30000,\n};\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { parse as parseYaml } from 'yaml';\nimport type { ZenCodeConfig } from './types.js';\nimport { DEFAULT_CONFIG } from './defaults.js';\n\n/**\n * 深度合并两个对象,source 中的值覆盖 target 中的值\n */\nfunction deepMerge(target: Record<string, any>, source: Record<string, any>): any {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const sourceVal = source[key];\n const targetVal = target[key];\n if (\n sourceVal !== undefined &&\n sourceVal !== null &&\n typeof sourceVal === 'object' &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === 'object' &&\n !Array.isArray(targetVal) &&\n targetVal !== null\n ) {\n result[key] = deepMerge(targetVal, sourceVal);\n } else if (sourceVal !== undefined) {\n result[key] = sourceVal;\n }\n }\n return result;\n}\n\n/**\n * 加载 YAML 配置文件,如果不存在返回空对象\n */\nfunction loadYamlFile(filePath: string): Partial<ZenCodeConfig> {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n return (parseYaml(content) as Partial<ZenCodeConfig>) || {};\n } catch {\n return {};\n }\n}\n\n/**\n * 从环境变量加载配置\n */\nfunction loadEnvConfig(): Partial<ZenCodeConfig> {\n const config: Partial<ZenCodeConfig> = {};\n\n if (process.env['ZENCODE_API_KEY']) {\n config.api_key = process.env['ZENCODE_API_KEY'];\n }\n if (process.env['ZENCODE_MODEL']) {\n config.model = process.env['ZENCODE_MODEL'];\n }\n if (process.env['ZENCODE_BASE_URL']) {\n config.base_url = process.env['ZENCODE_BASE_URL'];\n }\n if (process.env['ZENCODE_MODE']) {\n const mode = process.env['ZENCODE_MODE'];\n if (mode === 'dual' || mode === 'single') {\n config.agent_mode = mode;\n }\n }\n\n return config;\n}\n\n/**\n * 从 CLI 参数加载配置\n */\nexport interface CliOptions {\n model?: string;\n apiKey?: string;\n baseUrl?: string;\n single?: boolean;\n dual?: boolean;\n mode?: string;\n}\n\nfunction loadCliConfig(opts: CliOptions): Partial<ZenCodeConfig> {\n const config: Partial<ZenCodeConfig> = {};\n\n if (opts.model) config.model = opts.model;\n if (opts.apiKey) config.api_key = opts.apiKey;\n if (opts.baseUrl) config.base_url = opts.baseUrl;\n if (opts.single) config.agent_mode = 'single';\n if (opts.dual) config.agent_mode = 'dual';\n if (opts.mode) {\n const m = opts.mode;\n if (m === 'delegated' || m === 'autonomous' || m === 'controlled') {\n config.collaboration = m;\n }\n }\n\n return config;\n}\n\n/**\n * 加载并合并所有配置源\n * 优先级(从低到高):默认值 < 全局配置 < 项目配置 < 环境变量 < CLI参数\n */\nexport function loadConfig(cliOpts: CliOptions = {}): ZenCodeConfig {\n const globalConfigPath = path.join(os.homedir(), '.zencode', 'config.yaml');\n const projectDirConfigPath = path.resolve('.zencode', 'config.yaml');\n const projectFileConfigPath = path.resolve('.zencode.yaml');\n\n let config = { ...DEFAULT_CONFIG };\n config = deepMerge(config, loadYamlFile(globalConfigPath));\n config = deepMerge(config, loadYamlFile(projectDirConfigPath));\n config = deepMerge(config, loadYamlFile(projectFileConfigPath));\n config = deepMerge(config, loadEnvConfig());\n config = deepMerge(config, loadCliConfig(cliOpts));\n\n return config;\n}\n\n/**\n * 解析模型配置,合并 orchestrator/coder 的配置与全局配置\n */\nexport function resolveModelConfig(\n config: ZenCodeConfig,\n role: 'orchestrator' | 'coder',\n): Required<Pick<ZenCodeConfig, 'model' | 'api_key' | 'base_url' | 'temperature' | 'max_tokens'>> {\n const roleConfig = config.dual_agent[role] || {};\n return {\n model: roleConfig.model || config.model,\n api_key: roleConfig.api_key || config.api_key,\n base_url: roleConfig.base_url || config.base_url,\n temperature: roleConfig.temperature ?? config.temperature,\n max_tokens: roleConfig.max_tokens ?? config.max_tokens,\n };\n}\n","import OpenAI from 'openai';\nimport type {\n Message,\n ToolDefinition,\n ToolCall,\n StreamDelta,\n} from './types.js';\n\nexport interface LLMClientOptions {\n apiKey: string;\n baseURL: string;\n model: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport interface StreamCallbacks {\n onContent?: (text: string) => void;\n onToolCall?: (toolCall: ToolCall) => void;\n onToolCallStreaming?: (index: number, name: string, accumulatedArgs: string) => void;\n onFinish?: (message: Message) => void;\n onError?: (error: Error) => void;\n}\n\nexport class LLMClient {\n private client: OpenAI;\n private model: string;\n private temperature: number;\n private maxTokens: number;\n\n constructor(options: LLMClientOptions) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n baseURL: options.baseURL,\n });\n this.model = options.model;\n this.temperature = options.temperature ?? 0.7;\n this.maxTokens = options.maxTokens ?? 8192;\n }\n\n /**\n * 流式调用 LLM,实时回调文本内容和工具调用\n */\n async chatStream(\n messages: Message[],\n tools: ToolDefinition[] | undefined,\n callbacks: StreamCallbacks,\n ): Promise<Message> {\n const params: OpenAI.Chat.ChatCompletionCreateParamsStreaming = {\n model: this.model,\n messages: messages as OpenAI.Chat.ChatCompletionMessageParam[],\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n stream: true,\n };\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.ChatCompletionTool[];\n params.tool_choice = 'auto';\n }\n\n try {\n const stream = await this.client.chat.completions.create(params);\n\n let contentParts: string[] = [];\n const toolCallMap = new Map<number, { id: string; name: string; args: string }>();\n\n for await (const chunk of stream) {\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n const delta: StreamDelta = choice.delta as StreamDelta;\n\n // 处理文本内容\n if (delta.content) {\n contentParts.push(delta.content);\n callbacks.onContent?.(delta.content);\n }\n\n // 处理工具调用(流式中分片到达)\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const existing = toolCallMap.get(tc.index);\n if (existing) {\n if (tc.function?.arguments) {\n existing.args += tc.function.arguments;\n }\n } else {\n toolCallMap.set(tc.index, {\n id: tc.id || '',\n name: tc.function?.name || '',\n args: tc.function?.arguments || '',\n });\n }\n\n // 流式回调:write-file / edit-file 的参数实时推送\n const entry = toolCallMap.get(tc.index);\n if (entry && callbacks.onToolCallStreaming) {\n const n = entry.name;\n if (n === 'write-file' || n === 'edit-file') {\n callbacks.onToolCallStreaming(tc.index, n, entry.args);\n }\n }\n }\n }\n }\n\n // 组装完整的 tool_calls\n const toolCalls: ToolCall[] = [];\n for (const [, tc] of [...toolCallMap.entries()].sort(([a], [b]) => a - b)) {\n const toolCall: ToolCall = {\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: tc.args,\n },\n };\n toolCalls.push(toolCall);\n callbacks.onToolCall?.(toolCall);\n }\n\n const fullContent = contentParts.join('');\n const assistantMessage: Message = {\n role: 'assistant',\n content: fullContent || null,\n };\n\n if (toolCalls.length > 0) {\n assistantMessage.tool_calls = toolCalls;\n }\n\n callbacks.onFinish?.(assistantMessage);\n return assistantMessage;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n callbacks.onError?.(err);\n throw err;\n }\n }\n\n /**\n * 非流式调用 LLM\n */\n async chat(\n messages: Message[],\n tools?: ToolDefinition[],\n ): Promise<Message> {\n const params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming = {\n model: this.model,\n messages: messages as OpenAI.Chat.ChatCompletionMessageParam[],\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n stream: false,\n };\n\n if (tools && tools.length > 0) {\n params.tools = tools as OpenAI.Chat.ChatCompletionTool[];\n params.tool_choice = 'auto';\n }\n\n const response = await this.client.chat.completions.create(params);\n const choice = response.choices[0];\n if (!choice) {\n throw new Error('No response from LLM');\n }\n\n const msg = choice.message;\n const result: Message = {\n role: 'assistant',\n content: msg.content,\n };\n\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n result.tool_calls = msg.tool_calls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n }));\n }\n\n return result;\n }\n\n get modelName(): string {\n return this.model;\n }\n}\n\n/**\n * 从配置创建 LLM 客户端\n */\nexport function createLLMClient(options: LLMClientOptions): LLMClient {\n return new LLMClient(options);\n}\n","import type { Tool, ToolResult } from './types.js';\nimport type { ToolDefinition } from '../llm/types.js';\nimport type { PermissionsConfig } from '../config/types.js';\n\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n private permissionOverrides: PermissionsConfig | null = null;\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n unregister(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /**\n * 设置权限覆盖配置\n */\n setPermissions(permissions: PermissionsConfig): void {\n this.permissionOverrides = permissions;\n }\n\n /**\n * 运行时将某工具升级为自动批准(始终允许)\n */\n addAutoApprove(toolName: string): void {\n if (!this.permissionOverrides) {\n this.permissionOverrides = { auto_approve: [], require_approval: [] };\n }\n if (!this.permissionOverrides.auto_approve.includes(toolName)) {\n this.permissionOverrides.auto_approve.push(toolName);\n }\n // 从 require_approval 中移除\n this.permissionOverrides.require_approval =\n this.permissionOverrides.require_approval.filter((n) => n !== toolName);\n }\n\n /**\n * 获取工具的有效权限级别\n */\n getPermissionLevel(toolName: string): 'auto' | 'confirm' | 'deny' {\n if (this.permissionOverrides) {\n if (this.permissionOverrides.auto_approve.includes(toolName)) return 'auto';\n if (this.permissionOverrides.require_approval.includes(toolName)) return 'confirm';\n }\n const tool = this.tools.get(toolName);\n return tool?.permissionLevel ?? 'confirm';\n }\n\n /**\n * 执行工具调用\n */\n async execute(name: string, params: Record<string, unknown>, maxOutput: number): Promise<ToolResult> {\n const tool = this.tools.get(name);\n if (!tool) {\n return { content: `错误:未找到工具 \"${name}\"` };\n }\n\n try {\n const result = await tool.execute(params);\n\n // 截断过长的输出\n if (result.content.length > maxOutput) {\n return {\n content: result.content.slice(0, maxOutput) + '\\n\\n[输出已截断]',\n truncated: true,\n };\n }\n\n return result;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { content: `工具执行错误:${msg}` };\n }\n }\n\n /**\n * 导出为 OpenAI function calling 格式\n */\n toToolDefinitions(filter?: string[]): ToolDefinition[] {\n const tools: ToolDefinition[] = [];\n for (const [name, tool] of this.tools) {\n if (filter && !filter.includes(name)) continue;\n tools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as unknown as Record<string, unknown>,\n },\n });\n }\n return tools;\n }\n\n /**\n * 获取所有已注册的工具名\n */\n listTools(): string[] {\n return [...this.tools.keys()];\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Tool, ToolResult } from './types.js';\n\nexport const readFileTool: Tool = {\n name: 'read-file',\n description: '读取文件内容。修改文件前必须先读取。支持 offset/limit 读取大文件的指定部分。返回带行号的内容。',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: '文件路径(相对于工作目录或绝对路径)',\n },\n offset: {\n type: 'number',\n description: '起始行号(从1开始),默认从头读取',\n },\n limit: {\n type: 'number',\n description: '读取的行数,默认读取全部',\n },\n },\n required: ['path'],\n },\n permissionLevel: 'auto',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const filePath = path.resolve(params['path'] as string);\n const offset = (params['offset'] as number) || 1;\n const limit = params['limit'] as number | undefined;\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n const startIdx = Math.max(0, offset - 1);\n const endIdx = limit ? startIdx + limit : lines.length;\n const selectedLines = lines.slice(startIdx, endIdx);\n\n // 带行号输出\n const numbered = selectedLines\n .map((line, i) => `${String(startIdx + i + 1).padStart(5)}\\t${line}`)\n .join('\\n');\n\n return { content: numbered || '(空文件)' };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { content: `读取文件失败:${msg}` };\n }\n },\n};\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Tool, ToolResult } from './types.js';\n\nexport const writeFileTool: Tool = {\n name: 'write-file',\n description: '创建新文件或完整重写文件。如果是修改已有文件,优先使用 edit-file。会自动创建父目录。',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: '文件路径',\n },\n content: {\n type: 'string',\n description: '要写入的文件内容',\n },\n },\n required: ['path', 'content'],\n },\n permissionLevel: 'confirm',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const filePath = path.resolve(params['path'] as string);\n const content = params['content'] as string;\n\n try {\n // 确保父目录存在\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, 'utf-8');\n return { content: `文件已写入:${filePath}` };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { content: `写入文件失败:${msg}` };\n }\n },\n};\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Tool, ToolResult } from './types.js';\n\nexport const editFileTool: Tool = {\n name: 'edit-file',\n description: '通过字符串替换编辑文件(推荐的文件修改方式)。old_string 必须在文件中唯一匹配,将被替换为 new_string。匹配失败时请提供更多上下文使其唯一,或使用 replace_all。',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: '文件路径',\n },\n old_string: {\n type: 'string',\n description: '要被替换的原始字符串(必须唯一匹配)',\n },\n new_string: {\n type: 'string',\n description: '替换后的字符串',\n },\n replace_all: {\n type: 'boolean',\n description: '是否替换所有匹配项,默认 false',\n },\n },\n required: ['path', 'old_string', 'new_string'],\n },\n permissionLevel: 'confirm',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const filePath = path.resolve(params['path'] as string);\n const oldString = params['old_string'] as string;\n const newString = params['new_string'] as string;\n const replaceAll = (params['replace_all'] as boolean) ?? false;\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n\n if (replaceAll) {\n const newContent = content.split(oldString).join(newString);\n if (newContent === content) {\n return { content: `未找到匹配内容:${oldString.slice(0, 50)}...` };\n }\n await fs.writeFile(filePath, newContent, 'utf-8');\n const count = content.split(oldString).length - 1;\n return { content: `已替换 ${count} 处匹配` };\n }\n\n // 检查唯一性\n const firstIdx = content.indexOf(oldString);\n if (firstIdx === -1) {\n return { content: `未找到匹配内容:${oldString.slice(0, 100)}` };\n }\n\n const secondIdx = content.indexOf(oldString, firstIdx + 1);\n if (secondIdx !== -1) {\n return { content: `old_string 不唯一,找到多处匹配。请提供更多上下文使其唯一。` };\n }\n\n const newContent = content.slice(0, firstIdx) + newString + content.slice(firstIdx + oldString.length);\n await fs.writeFile(filePath, newContent, 'utf-8');\n\n return { content: `文件已编辑:${filePath}` };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { content: `编辑文件失败:${msg}` };\n }\n },\n};\n","import { exec } from 'node:child_process';\nimport type { Tool, ToolResult } from './types.js';\n\nconst DEFAULT_TIMEOUT = 120_000; // 2 minutes\n\nexport const bashTool: Tool = {\n name: 'bash',\n description: '执行 shell 命令。用于运行构建、测试、git 操作等系统命令。不要用 bash 做文件读写(用 read-file/edit-file/write-file)或搜索(用 glob/grep)。',\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: '要执行的 shell 命令',\n },\n timeout: {\n type: 'number',\n description: '超时时间(毫秒),默认 120000',\n },\n },\n required: ['command'],\n },\n permissionLevel: 'confirm',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const command = params['command'] as string;\n const timeout = (params['timeout'] as number) || DEFAULT_TIMEOUT;\n\n return new Promise<ToolResult>((resolve) => {\n exec(\n command,\n {\n cwd: process.cwd(),\n timeout,\n maxBuffer: 1024 * 1024 * 10, // 10MB\n shell: process.platform === 'win32' ? 'cmd.exe' : '/bin/bash',\n },\n (error, stdout, stderr) => {\n let output = '';\n if (stdout) output += stdout;\n if (stderr) output += (output ? '\\n' : '') + `[stderr]\\n${stderr}`;\n if (error && error.killed) {\n output += `\\n[命令超时,已终止]`;\n } else if (error && !stdout && !stderr) {\n output = `命令执行失败:${error.message}`;\n }\n\n resolve({ content: output || '(无输出)' });\n },\n );\n });\n },\n};\n","import { glob as globFn } from 'glob';\nimport type { Tool, ToolResult } from './types.js';\n\nexport const globTool: Tool = {\n name: 'glob',\n description: '按 glob 模式搜索文件路径。用于查找文件位置,如 \"**/*.ts\"、\"src/**/config.*\"。自动忽略 node_modules 和 .git。',\n parameters: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'Glob 模式,如 \"**/*.ts\"、\"src/**/*.js\"',\n },\n cwd: {\n type: 'string',\n description: '搜索的根目录,默认为工作目录',\n },\n },\n required: ['pattern'],\n },\n permissionLevel: 'auto',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const pattern = params['pattern'] as string;\n const cwd = (params['cwd'] as string) || process.cwd();\n\n try {\n const files = await globFn(pattern, {\n cwd,\n nodir: true,\n dot: false,\n ignore: ['**/node_modules/**', '**/.git/**'],\n });\n\n if (files.length === 0) {\n return { content: '未找到匹配的文件' };\n }\n\n return { content: files.join('\\n') };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { content: `搜索失败:${msg}` };\n }\n },\n};\n","import { exec } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Tool, ToolResult } from './types.js';\n\n/**\n * 纯 JS 实现的 grep,不依赖外部命令\n */\nasync function jsGrep(\n pattern: string,\n searchPath: string,\n options: { ignoreCase?: boolean; maxResults?: number; glob?: string },\n): Promise<string[]> {\n const regex = new RegExp(pattern, options.ignoreCase ? 'i' : '');\n const results: string[] = [];\n const maxResults = options.maxResults ?? 200;\n\n async function searchFile(filePath: string) {\n if (results.length >= maxResults) return;\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (results.length >= maxResults) break;\n if (regex.test(lines[i]!)) {\n results.push(`${filePath}:${i + 1}: ${lines[i]}`);\n }\n }\n } catch {\n // 跳过无法读取的文件\n }\n }\n\n async function searchDir(dirPath: string) {\n if (results.length >= maxResults) return;\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n if (results.length >= maxResults) break;\n const fullPath = path.join(dirPath, entry.name);\n\n // 跳过常见无关目录\n if (entry.isDirectory()) {\n if (['node_modules', '.git', 'dist', '.next', '__pycache__'].includes(entry.name)) {\n continue;\n }\n await searchDir(fullPath);\n } else if (entry.isFile()) {\n // 简单过滤二进制文件\n const ext = path.extname(entry.name).toLowerCase();\n const textExts = [\n '.ts', '.tsx', '.js', '.jsx', '.json', '.md', '.txt', '.yaml', '.yml',\n '.toml', '.css', '.scss', '.html', '.vue', '.svelte', '.py', '.go',\n '.rs', '.java', '.c', '.cpp', '.h', '.hpp', '.rb', '.php', '.sh',\n '.bash', '.zsh', '.fish', '.sql', '.xml', '.svg', '.env', '.gitignore',\n '.editorconfig', '.prettierrc', '.eslintrc',\n ];\n if (ext && !textExts.includes(ext)) continue;\n await searchFile(fullPath);\n }\n }\n } catch {\n // 跳过无法访问的目录\n }\n }\n\n const stat = await fs.stat(searchPath);\n if (stat.isFile()) {\n await searchFile(searchPath);\n } else {\n await searchDir(searchPath);\n }\n\n return results;\n}\n\nexport const grepTool: Tool = {\n name: 'grep',\n description: '在文件内容中搜索正则表达式。用于查找函数定义、类引用、特定代码模式。返回匹配的文件路径、行号和内容。',\n parameters: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: '正则表达式搜索模式',\n },\n path: {\n type: 'string',\n description: '搜索的文件或目录路径,默认为工作目录',\n },\n ignore_case: {\n type: 'boolean',\n description: '是否忽略大小写',\n },\n },\n required: ['pattern'],\n },\n permissionLevel: 'auto',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const pattern = params['pattern'] as string;\n const searchPath = (params['path'] as string) || process.cwd();\n const ignoreCase = (params['ignore_case'] as boolean) ?? false;\n\n try {\n const resolvedPath = path.resolve(searchPath);\n const results = await jsGrep(pattern, resolvedPath, {\n ignoreCase,\n maxResults: 200,\n });\n\n if (results.length === 0) {\n return { content: '未找到匹配内容' };\n }\n\n return { content: results.join('\\n') };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { content: `搜索失败:${msg}` };\n }\n },\n};\n","import { ToolRegistry } from '../tools/registry.js';\nimport { readFileTool } from '../tools/read-file.js';\nimport { writeFileTool } from '../tools/write-file.js';\nimport { editFileTool } from '../tools/edit-file.js';\nimport { bashTool } from '../tools/bash.js';\nimport { globTool } from '../tools/glob.js';\nimport { grepTool } from '../tools/grep.js';\n\n/**\n * 注册所有核心工具\n */\nexport function registerCoreTools(registry: ToolRegistry): void {\n registry.register(readFileTool);\n registry.register(writeFileTool);\n registry.register(editFileTool);\n registry.register(bashTool);\n registry.register(globTool);\n registry.register(grepTool);\n}\n","import chalk from 'chalk';\n\n/**\n * 确认处理函数类型\n * 接收提示文本,返回用户是否同意\n */\nexport type ConfirmHandler = (prompt: string) => Promise<boolean>;\n\n/**\n * 结构化确认结果\n */\nexport interface ConfirmExecutionResult {\n approved: boolean;\n feedback?: string;\n}\n\n/**\n * 结构化确认处理函数类型\n * 接收工具名和参数,返回确认结果(含可选反馈)\n * 用于 TUI 模式,避免 chalk 格式化字符串\n */\nexport type StructuredConfirmHandler = (\n toolName: string,\n params: Record<string, unknown>,\n) => Promise<ConfirmExecutionResult>;\n\n/**\n * 全局确认处理函数(由 REPL 注入)\n * 默认实现:自动拒绝(安全兜底)\n */\nlet globalConfirmHandler: ConfirmHandler = async () => false;\n\n/**\n * 结构化确认处理函数(由 TUI 注入)\n * 当设置时,confirmExecution 优先使用此 handler,跳过 stderr 输出\n */\nlet structuredConfirmHandler: StructuredConfirmHandler | null = null;\n\n/**\n * 设置全局确认处理函数\n */\nexport function setConfirmHandler(handler: ConfirmHandler): void {\n globalConfirmHandler = handler;\n}\n\n/**\n * 设置结构化确认处理函数(TUI 模式使用)\n * 当设置后,confirmExecution 将直接传递 toolName 和 params,\n * 而不是格式化为 chalk 字符串输出到 stderr\n */\nexport function setStructuredConfirmHandler(handler: StructuredConfirmHandler | null): void {\n structuredConfirmHandler = handler;\n}\n\n/**\n * 格式化工具调用的详细信息\n */\nfunction formatToolDetail(toolName: string, params: Record<string, unknown>): string {\n const lines: string[] = [];\n\n switch (toolName) {\n case 'bash':\n lines.push(` ${chalk.dim('命令:')} ${chalk.white(String(params['command'] || ''))}`);\n break;\n case 'write-file':\n lines.push(` ${chalk.dim('文件:')} ${chalk.white(String(params['path'] || ''))}`);\n if (params['content']) {\n const content = String(params['content']);\n const preview = content.length > 200 ? content.slice(0, 200) + '...' : content;\n lines.push(` ${chalk.dim('内容:')} ${chalk.gray(preview.split('\\n').join('\\n '))}`);\n }\n break;\n case 'edit-file':\n lines.push(` ${chalk.dim('文件:')} ${chalk.white(String(params['path'] || ''))}`);\n if (params['old_string']) {\n const old = String(params['old_string']);\n const preview = old.length > 100 ? old.slice(0, 100) + '...' : old;\n lines.push(` ${chalk.dim('替换:')} ${chalk.red(preview)}`);\n }\n if (params['new_string']) {\n const neu = String(params['new_string']);\n const preview = neu.length > 100 ? neu.slice(0, 100) + '...' : neu;\n lines.push(` ${chalk.dim('为 :')} ${chalk.green(preview)}`);\n }\n break;\n case 'git':\n lines.push(` ${chalk.dim('命令:')} git ${chalk.white(String(params['command'] || ''))}`);\n break;\n default:\n for (const [key, value] of Object.entries(params)) {\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n lines.push(` ${chalk.dim(key + ':')} ${str.slice(0, 120)}`);\n }\n break;\n }\n\n return lines.join('\\n');\n}\n\n/**\n * 向用户确认是否执行危险操作\n */\nexport async function confirmExecution(\n toolName: string,\n params: Record<string, unknown>,\n): Promise<ConfirmExecutionResult> {\n // TUI 模式:使用结构化 handler,跳过 stderr 输出\n if (structuredConfirmHandler) {\n return structuredConfirmHandler(toolName, params);\n }\n\n // REPL 模式:格式化并输出到 stderr\n const detail = formatToolDetail(toolName, params);\n const prompt = `\\n${chalk.yellow('⚠')} ${chalk.bold('需要确认')} ${chalk.cyan(`[${toolName}]`)}\\n${detail}\\n`;\n\n process.stderr.write(prompt);\n const approved = await globalConfirmHandler(`${chalk.yellow('?')} 是否执行?(${chalk.green('y')}/${chalk.red('N')}) `);\n return { approved };\n}\n","import type { Message } from '../llm/types.js';\n\n/**\n * 对话历史管理\n */\nexport class Conversation {\n private messages: Message[] = [];\n private systemPrompt: string = '';\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n addMessage(message: Message): void {\n this.messages.push(message);\n }\n\n addUserMessage(content: string): void {\n this.messages.push({ role: 'user', content });\n }\n\n addAssistantMessage(message: Message): void {\n this.messages.push(message);\n }\n\n addToolResult(toolCallId: string, content: string): void {\n this.messages.push({\n role: 'tool',\n tool_call_id: toolCallId,\n content,\n });\n }\n\n /**\n * 获取完整的消息列表(包含系统提示词)\n */\n getMessages(): Message[] {\n const result: Message[] = [];\n if (this.systemPrompt) {\n result.push({ role: 'system', content: this.systemPrompt });\n }\n result.push(...this.messages);\n return result;\n }\n\n /**\n * 获取不含系统提示词的历史消息\n */\n getHistory(): Message[] {\n return [...this.messages];\n }\n\n /**\n * 清空对话历史(保留系统提示词)\n */\n clear(): void {\n this.messages = [];\n }\n\n /**\n * 获取消息数量\n */\n get length(): number {\n return this.messages.length;\n }\n}\n","import type { ZenCodeConfig } from '../config/types.js';\nimport type { Message, ToolDefinition } from '../llm/types.js';\nimport type { LLMClient, StreamCallbacks } from '../llm/client.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport { confirmExecution } from '../tools/permission.js';\nimport { Conversation } from './conversation.js';\n\nexport interface AgentCallbacks extends StreamCallbacks {\n onToolExecuting?: (toolName: string, params: Record<string, unknown>) => void;\n onToolResult?: (toolName: string, result: string, truncated: boolean) => void;\n onDenied?: (toolName: string, feedback?: string) => void;\n}\n\n/**\n * 单 Agent 循环\n *\n * 消息流程:\n * 用户输入 → 构建消息 → LLM (带tools) → 处理响应\n * ├─ 含工具调用 → 执行工具 → 结果加入历史 → 回到 LLM\n * └─ 纯文本响应 → 返回\n */\nexport class Agent {\n private conversation: Conversation;\n private client: LLMClient;\n private registry: ToolRegistry;\n private config: ZenCodeConfig;\n private fixedTools?: ToolDefinition[];\n\n constructor(\n client: LLMClient,\n registry: ToolRegistry,\n config: ZenCodeConfig,\n systemPrompt: string,\n tools?: ToolDefinition[],\n ) {\n this.client = client;\n this.registry = registry;\n this.config = config;\n this.conversation = new Conversation();\n this.conversation.setSystemPrompt(systemPrompt);\n // 显式传入 tools 时固定使用(如 Coder),否则每轮从 registry 动态获取\n this.fixedTools = tools;\n }\n\n /**\n * 执行一轮完整的 agent 循环\n */\n async run(userMessage: string, callbacks: AgentCallbacks = {}): Promise<string> {\n this.conversation.addUserMessage(userMessage);\n\n let lastContent = '';\n\n while (true) {\n // 每轮动态获取工具列表,确保 /parallel /todo 等切换生效\n const tools = this.fixedTools || this.registry.toToolDefinitions();\n\n // 调用 LLM\n const assistantMsg = await this.client.chatStream(\n this.conversation.getMessages(),\n tools.length > 0 ? tools : undefined,\n callbacks,\n );\n\n this.conversation.addAssistantMessage(assistantMsg);\n\n // 如果没有工具调用,结束循环\n if (!assistantMsg.tool_calls || assistantMsg.tool_calls.length === 0) {\n lastContent = assistantMsg.content || '';\n break;\n }\n\n // 执行所有工具调用\n for (const toolCall of assistantMsg.tool_calls) {\n const toolName = toolCall.function.name;\n let params: Record<string, unknown>;\n try {\n params = JSON.parse(toolCall.function.arguments);\n } catch {\n this.conversation.addToolResult(toolCall.id, '参数解析失败:无效的 JSON');\n continue;\n }\n\n try {\n // 权限检查\n const permLevel = this.registry.getPermissionLevel(toolName);\n if (permLevel === 'deny') {\n callbacks.onDenied?.(toolName);\n this.conversation.addToolResult(toolCall.id, `工具 \"${toolName}\" 已被禁止执行`);\n continue;\n }\n\n // 自动执行的工具直接显示并执行\n if (permLevel === 'auto') {\n callbacks.onToolExecuting?.(toolName, params);\n }\n\n if (permLevel === 'confirm') {\n const confirmResult = await confirmExecution(toolName, params);\n if (!confirmResult.approved) {\n callbacks.onDenied?.(toolName, confirmResult.feedback);\n const denyMsg = confirmResult.feedback\n ? `用户拒绝了此操作,用户反馈: ${confirmResult.feedback}`\n : '用户拒绝了此操作';\n this.conversation.addToolResult(toolCall.id, denyMsg);\n continue;\n }\n }\n\n // 执行工具\n const result = await this.registry.execute(toolName, params, this.config.max_tool_output);\n callbacks.onToolResult?.(toolName, result.content, result.truncated ?? false);\n\n this.conversation.addToolResult(toolCall.id, result.content);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.conversation.addToolResult(toolCall.id, `工具执行异常:${msg}`);\n }\n }\n\n // 记录最后的文本内容\n if (assistantMsg.content) {\n lastContent = assistantMsg.content;\n }\n }\n\n return lastContent;\n }\n\n /**\n * 获取对话历史\n */\n getConversation(): Conversation {\n return this.conversation;\n }\n}\n","import type { ZenCodeConfig } from '../../config/types.js';\nimport type { Message, ToolDefinition } from '../../llm/types.js';\nimport type { LLMClient } from '../../llm/client.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport type { AgentCallbacks } from '../agent.js';\nimport { Conversation } from '../conversation.js';\nimport { confirmExecution } from '../../tools/permission.js';\n\n/**\n * Agent B - 编码者\n *\n * 短生命周期:每次任务创建新会话,避免累积上下文\n * 根据协作模式,可能有工具也可能没有\n */\nexport class Coder {\n private client: LLMClient;\n private registry: ToolRegistry;\n private config: ZenCodeConfig;\n private systemPrompt: string;\n private tools: ToolDefinition[];\n\n constructor(\n client: LLMClient,\n registry: ToolRegistry,\n config: ZenCodeConfig,\n systemPrompt: string,\n tools: ToolDefinition[],\n ) {\n this.client = client;\n this.registry = registry;\n this.config = config;\n this.systemPrompt = systemPrompt;\n this.tools = tools;\n }\n\n /**\n * 执行编码任务(短生命周期,每次新建会话)\n *\n * @param taskMessage 调度者发来的任务描述(作为 user message)\n * @param callbacks 回调\n * @returns 编码者的最终响应\n */\n async execute(taskMessage: string, callbacks: AgentCallbacks = {}): Promise<string> {\n const conversation = new Conversation();\n conversation.setSystemPrompt(this.systemPrompt);\n conversation.addUserMessage(taskMessage);\n\n let lastContent = '';\n\n while (true) {\n\n const assistantMsg = await this.client.chatStream(\n conversation.getMessages(),\n this.tools.length > 0 ? this.tools : undefined,\n callbacks,\n );\n\n conversation.addAssistantMessage(assistantMsg);\n\n // 无工具调用 → 结束\n if (!assistantMsg.tool_calls || assistantMsg.tool_calls.length === 0) {\n lastContent = assistantMsg.content || '';\n break;\n }\n\n // 有工具 → 执行工具循环(autonomous 模式)\n for (const toolCall of assistantMsg.tool_calls) {\n const toolName = toolCall.function.name;\n let params: Record<string, unknown>;\n try {\n params = JSON.parse(toolCall.function.arguments);\n } catch {\n conversation.addToolResult(toolCall.id, '参数解析失败:无效的 JSON');\n continue;\n }\n\n try {\n const permLevel = this.registry.getPermissionLevel(toolName);\n if (permLevel === 'deny') {\n callbacks.onDenied?.(toolName);\n conversation.addToolResult(toolCall.id, `工具 \"${toolName}\" 已被禁止执行`);\n continue;\n }\n\n if (permLevel === 'auto') {\n callbacks.onToolExecuting?.(toolName, params);\n }\n\n if (permLevel === 'confirm') {\n const confirmResult = await confirmExecution(toolName, params);\n if (!confirmResult.approved) {\n callbacks.onDenied?.(toolName, confirmResult.feedback);\n const denyMsg = confirmResult.feedback\n ? `用户拒绝了此操作,用户反馈: ${confirmResult.feedback}`\n : '用户拒绝了此操作';\n conversation.addToolResult(toolCall.id, denyMsg);\n continue;\n }\n }\n\n const result = await this.registry.execute(toolName, params, this.config.max_tool_output);\n callbacks.onToolResult?.(toolName, result.content, result.truncated ?? false);\n\n conversation.addToolResult(toolCall.id, result.content);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n conversation.addToolResult(toolCall.id, `工具执行异常:${msg}`);\n }\n }\n\n if (assistantMsg.content) {\n lastContent = assistantMsg.content;\n }\n }\n\n return lastContent;\n }\n}\n","import type { CollaborationMode } from '../../config/types.js';\n\n/**\n * 双 Agent 协作模式定义\n */\n\nexport interface ModeDefinition {\n name: CollaborationMode;\n description: string;\n coderHasTools: boolean; // 编码者是否拥有工具\n coderToolNames?: string[]; // 编码者可用的工具名(如果有)\n coderSystemPrompt: string; // 编码者的系统提示词\n}\n\n/**\n * Coder 身份与约束(嵌入所有有工具模式的 system prompt)\n */\nconst CODER_IDENTITY = `你是编码子 Agent。按以下顺序工作:\n\n1. **读 memo**:如果任务提到了 memo key,先 memo read 获取调度者记录的上下文\n2. **编码**:\n - 新建文件 → 直接 write-file\n - 修改文件 → read-file 阅读要改的文件 → edit-file 修改\n3. **写 memo**:完成后 memo write 记录改动摘要(key 如 \"done-xxx\"),便于调度者了解进展\n4. **回复**:一句话说明结果\n\n## 禁止\n- ❌ 编码前做探索(bash ls/dir/pwd、glob、grep)— 调度者已经做过了,结果在 memo 中\n- ❌ 输出计划、分析、思路说明 — 直接动手\n- ❌ 做任务范围外的改动\n- ❌ 添加未要求的注释、文档、错误处理\n- ❌ 过度工程化`;\n\n/**\n * delegated 模式:A收集上下文并委派,B拥有完整工具执行任务\n * - Agent A 负责收集上下文、规划任务、委派给 B\n * - Agent B 拥有全部工具,可自行读写文件、搜索和执行命令\n */\nexport const DELEGATED_MODE: ModeDefinition = {\n name: 'delegated',\n description: 'A收集上下文并委派,B拥有完整工具独立执行',\n coderHasTools: true,\n coderToolNames: ['read-file', 'write-file', 'edit-file', 'bash', 'glob', 'grep', 'memo'],\n coderSystemPrompt: `${CODER_IDENTITY}`,\n};\n\n/**\n * autonomous 模式:A规划,B自主执行\n * - Agent B 有工具,可自主读写文件和执行命令\n * - Agent A 只做高层规划和最终汇报\n */\nexport const AUTONOMOUS_MODE: ModeDefinition = {\n name: 'autonomous',\n description: 'A规划,B自主执行(适合能力强的模型)',\n coderHasTools: true,\n coderToolNames: ['read-file', 'write-file', 'edit-file', 'bash', 'glob', 'grep', 'memo'],\n coderSystemPrompt: `${CODER_IDENTITY}`,\n};\n\n/**\n * controlled 模式:A全权管理,B只返回代码\n * - Agent B 无工具,只输出代码/文本\n * - Agent A 负责所有文件操作\n */\nexport const CONTROLLED_MODE: ModeDefinition = {\n name: 'controlled',\n description: 'A全权管理,B只返回代码',\n coderHasTools: false,\n coderSystemPrompt: '你是被调度者派出的子 Agent。根据提供的代码和需求,只返回修改后的代码。不要自行操作文件,不要做额外改动。',\n};\n\n/**\n * 根据名称获取模式定义\n */\nexport function getMode(name: CollaborationMode): ModeDefinition {\n switch (name) {\n case 'delegated':\n return DELEGATED_MODE;\n case 'autonomous':\n return AUTONOMOUS_MODE;\n case 'controlled':\n return CONTROLLED_MODE;\n default:\n return DELEGATED_MODE;\n }\n}\n","import type { ZenCodeConfig, CollaborationMode } from '../../config/types.js';\nimport type { Message, ToolDefinition } from '../../llm/types.js';\nimport { LLMClient, createLLMClient } from '../../llm/client.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport type { AgentCallbacks } from '../agent.js';\nimport type { MemoStore } from '../memo-store.js';\nimport { resolveModelConfig } from '../../config/loader.js';\nimport { Conversation } from '../conversation.js';\nimport { confirmExecution } from '../../tools/permission.js';\nimport { Coder } from './coder.js';\nimport { getMode } from './modes.js';\n\n/**\n * 调度者发给编码者的内部工具\n * 在 delegated 和 controlled 模式下,调度者通过此工具与编码者通信\n */\nconst SEND_TO_CODER_TOOL: ToolDefinition = {\n type: 'function',\n function: {\n name: 'send-to-coder',\n description: '将编码任务发送给编码 Agent。传入任务描述和相关代码上下文,编码 Agent 将返回代码或解决方案。',\n parameters: {\n type: 'object',\n properties: {\n task: {\n type: 'string',\n description: '要发送给编码 Agent 的任务描述,包含相关代码上下文',\n },\n },\n required: ['task'],\n },\n },\n};\n\nexport interface OrchestratorCallbacks extends AgentCallbacks {\n onCoderStart?: () => void;\n onCoderEnd?: (response: string) => void;\n onModeInfo?: (mode: CollaborationMode) => void;\n}\n\n/**\n * Agent A - 调度者(Orchestrator)\n *\n * 职责:\n * - 接收系统提示词和工具定义\n * - 理解用户意图,收集上下文\n * - 将任务转化为纯净的编码指令\n * - 管理权限和对话历史\n */\nexport class Orchestrator {\n private conversation: Conversation;\n private orchestratorClient: LLMClient;\n private coderClient: LLMClient;\n private registry: ToolRegistry;\n private config: ZenCodeConfig;\n private mode: CollaborationMode;\n private baseSystemPrompt: string;\n private memoStore?: MemoStore;\n\n constructor(\n registry: ToolRegistry,\n config: ZenCodeConfig,\n systemPrompt: string,\n memoStore?: MemoStore,\n ) {\n this.registry = registry;\n this.config = config;\n this.mode = config.collaboration;\n this.baseSystemPrompt = systemPrompt;\n this.memoStore = memoStore;\n\n // 创建调度者的 LLM 客户端\n const orchConfig = resolveModelConfig(config, 'orchestrator');\n this.orchestratorClient = createLLMClient({\n apiKey: orchConfig.api_key,\n baseURL: orchConfig.base_url,\n model: orchConfig.model,\n temperature: orchConfig.temperature,\n maxTokens: orchConfig.max_tokens,\n });\n\n // 创建编码者的 LLM 客户端\n const coderConfig = resolveModelConfig(config, 'coder');\n this.coderClient = createLLMClient({\n apiKey: coderConfig.api_key,\n baseURL: coderConfig.base_url,\n model: coderConfig.model,\n temperature: coderConfig.temperature,\n maxTokens: coderConfig.max_tokens,\n });\n\n this.conversation = new Conversation();\n this.conversation.setSystemPrompt(this.buildSystemPrompt());\n }\n\n /**\n * 动态获取调度者的工具列表:注册表工具 + send-to-coder\n */\n private getTools(): ToolDefinition[] {\n return [\n ...this.registry.toToolDefinitions(),\n SEND_TO_CODER_TOOL,\n ];\n }\n\n /**\n * 构建调度者的系统提示词(包含当前协作模式)\n */\n private buildSystemPrompt(): string {\n const modeInfo = getMode(this.mode);\n return `${this.baseSystemPrompt}\n\n# 你是调度者 Agent\n\n协作模式:${modeInfo.name} - ${modeInfo.description}\n\n你是侦察兵 + 指挥官。你自己不写代码,你的职责是:收集情报 → 记入 memo → 委派编码 Agent。\n\n## 核心流程\n\n1. **评估**:任务是否需要了解现有代码?\n - 需要修改现有文件、需要与现有代码风格一致、需要理解依赖关系 → 先收集\n - 需求完全自包含、目标路径已明确 → 跳到第 3 步\n\n2. **收集上下文**(高效,不重复)\n - 用 glob/grep 定位(一次就够,不要同一目标查多次)\n - 用 read-file 或 spawn-agents 并行读取关键文件\n - **必须 memo write 记录发现**,key 用有意义的名称\n 例:memo write key=\"demo-structure\" value=\"demo/ 下有 weather.html(天气组件示例),使用纯 HTML+CSS+JS 单文件结构\"\n - 精炼摘要,不要复制整个文件内容\n\n3. **委派编码**:send-to-coder\n - task 中写清:做什么 + 目标路径 + 引用 memo key\n 例:task=\"在 demo/newyear.html 创建马年春节祝福网页。项目现有结构见 memo key 'demo-structure'。要求:单文件 HTML,包含内联 CSS 和 JS,中文内容。\"\n - 每次只发一个具体步骤\n\n4. **迭代/验证**:需要时继续委派或用 bash 运行验证\n\n## 重要\n\n- memo 是你与编码 Agent 的共享记忆,是协作的核心桥梁\n- 不要重复探索(glob 查过就不要再 bash ls 同一目录)\n- bash 用于执行命令(构建、测试),不需要委派\n- 完成所有步骤后简要告知用户结果`;\n }\n\n /**\n * 切换协作模式\n */\n setMode(mode: CollaborationMode): void {\n this.mode = mode;\n this.conversation.setSystemPrompt(this.buildSystemPrompt());\n }\n\n /**\n * 执行用户请求\n */\n async run(userMessage: string, callbacks: OrchestratorCallbacks = {}): Promise<string> {\n callbacks.onModeInfo?.(this.mode);\n this.conversation.addUserMessage(userMessage);\n\n let lastContent = '';\n\n while (true) {\n const tools = this.getTools();\n\n const assistantMsg = await this.orchestratorClient.chatStream(\n this.conversation.getMessages(),\n tools,\n callbacks,\n );\n\n this.conversation.addAssistantMessage(assistantMsg);\n\n // 无工具调用 → 结束\n if (!assistantMsg.tool_calls || assistantMsg.tool_calls.length === 0) {\n lastContent = assistantMsg.content || '';\n break;\n }\n\n // 处理工具调用\n for (const toolCall of assistantMsg.tool_calls) {\n const toolName = toolCall.function.name;\n let params: Record<string, unknown>;\n try {\n params = JSON.parse(toolCall.function.arguments);\n } catch {\n this.conversation.addToolResult(toolCall.id, '参数解析失败:无效的 JSON');\n continue;\n }\n\n try {\n // 特殊处理 send-to-coder\n if (toolName === 'send-to-coder') {\n const task = params['task'] as string;\n const coderResponse = await this.invokeCoder(task, callbacks);\n this.conversation.addToolResult(toolCall.id, coderResponse);\n continue;\n }\n\n // 普通工具权限检查与执行\n const permLevel = this.registry.getPermissionLevel(toolName);\n if (permLevel === 'deny') {\n callbacks.onDenied?.(toolName);\n this.conversation.addToolResult(toolCall.id, `工具 \"${toolName}\" 已被禁止执行`);\n continue;\n }\n\n if (permLevel === 'auto') {\n callbacks.onToolExecuting?.(toolName, params);\n }\n\n if (permLevel === 'confirm') {\n const confirmResult = await confirmExecution(toolName, params);\n if (!confirmResult.approved) {\n callbacks.onDenied?.(toolName, confirmResult.feedback);\n const denyMsg = confirmResult.feedback\n ? `用户拒绝了此操作,用户反馈: ${confirmResult.feedback}`\n : '用户拒绝了此操作';\n this.conversation.addToolResult(toolCall.id, denyMsg);\n continue;\n }\n }\n\n const result = await this.registry.execute(toolName, params, this.config.max_tool_output);\n callbacks.onToolResult?.(toolName, result.content, result.truncated ?? false);\n\n this.conversation.addToolResult(toolCall.id, result.content);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.conversation.addToolResult(toolCall.id, `工具执行异常:${msg}`);\n }\n }\n\n if (assistantMsg.content) {\n lastContent = assistantMsg.content;\n }\n }\n\n return lastContent;\n }\n\n /**\n * 调用编码者 Agent\n */\n private async invokeCoder(task: string, callbacks: OrchestratorCallbacks): Promise<string> {\n callbacks.onCoderStart?.();\n\n const modeInfo = getMode(this.mode);\n\n // 构建编码者的工具列表\n let coderTools: ToolDefinition[] = [];\n if (modeInfo.coderHasTools && modeInfo.coderToolNames) {\n coderTools = this.registry.toToolDefinitions(modeInfo.coderToolNames);\n }\n\n // 自动注入 memo 索引 + 边界提醒\n let taskWithMemo = task;\n if (this.memoStore) {\n const index = this.memoStore.buildIndex();\n if (index) {\n taskWithMemo += `\\n\\n[共享备忘录]\\n${index}`;\n }\n }\n taskWithMemo += '\\n\\n[重要:立即开始编码,不要探索,不要输出分析]';\n\n const coder = new Coder(\n this.coderClient,\n this.registry,\n this.config,\n modeInfo.coderSystemPrompt,\n coderTools,\n );\n\n const response = await coder.execute(taskWithMemo, {\n onContent: callbacks.onContent,\n onToolCallStreaming: callbacks.onToolCallStreaming,\n onToolExecuting: callbacks.onToolExecuting,\n onToolResult: callbacks.onToolResult,\n onDenied: callbacks.onDenied,\n });\n\n callbacks.onCoderEnd?.(response);\n return response;\n }\n\n /**\n * 获取对话历史\n */\n getConversation(): Conversation {\n return this.conversation;\n }\n}\n","import * as os from 'node:os';\n\n/**\n * Layer 0 - 核心层(始终加载)\n */\nexport function buildCorePrompt(): string {\n return `你是 ZenCode,一个 CLI 环境下的 AI 编程助手。你帮助用户完成软件工程任务:修bug、加功能、重构代码、解释代码等。\n\n工作目录:${process.cwd()}\n系统:${os.platform()} ${os.arch()}\n\n# 工具使用原则\n\n你有以下工具可用,请根据任务选择最合适的工具:\n\n- **read-file**:读取文件内容。修改代码前必须先读取目标文件。支持 offset/limit 读取大文件的特定部分。\n- **edit-file**:通过字符串替换编辑文件。优先使用 edit-file 而非 write-file 修改已有文件——它更精确、更安全。old_string 必须唯一匹配,匹配失败时提供更多上下文使其唯一。\n- **write-file**:创建新文件或完整重写文件。仅在创建新文件或需要大幅重写时使用。\n- **glob**:按模式搜索文件路径。用于查找文件位置(如 \\`**/*.ts\\`、\\`src/**/config.*\\`)。\n- **grep**:在文件内容中搜索正则表达式。用于查找函数定义、引用、特定代码模式。\n- **bash**:执行 shell 命令。用于运行构建、测试、git 操作等。不要用 bash 做能用上述工具完成的事(如不要用 cat 读文件、不要用 sed 编辑文件、不要用 find 搜索文件)。\n\n关键规则:\n- 修改代码前先用 read-file 阅读相关文件,理解现有逻辑\n- 优先 edit-file 编辑已有文件,而非 write-file 重写\n- 不要创建不必要的新文件,优先在现有文件中修改\n- 只做必要的最小改动,不做额外\"改进\"\n- 不要添加用户未要求的注释、文档、类型注解\n- 不要引入安全漏洞(注入、XSS、SQL 注入等 OWASP Top 10)\n- 引用代码时使用 \\`文件路径:行号\\` 格式(如 \\`src/app.ts:42\\`),方便用户跳转\n\n# 交互风格\n\n- 保持技术客观性,基于事实回答,不过度赞同或恭维用户,必要时直接指出问题\n- 不确定时先调查验证,而非直觉性地确认用户的假设\n- 不要给出时间预估(\"大概需要几分钟\"之类)\n- 回复简洁,直接给结果`;\n}\n","/**\n * Layer 1 - 工作方法层(默认开启)\n */\nexport function buildPlanningPrompt(): string {\n return `# 工作方法\n\n处理编程任务时:\n1. 先用 read-file / grep / glob 阅读相关代码,理解现有逻辑和上下文\n2. 确定方案后直接实施,不要长篇解释计划\n3. 改完即止,不要自行\"验证\"或\"测试\"\n\n多步任务管理:\n- 对于 3 个以上步骤的任务,使用 todo 工具创建计划再逐步执行\n- 开始步骤前标记 in-progress,完成后标记 completed\n- 每步完成后检查计划,决定下一步\n\n代码质量:\n- 不要写不必要的测试;如果要写测试,先确认项目的测试框架和依赖,确保能实际运行\n- 不要过度工程化:不要为一次性操作创建抽象、不要为假设的未来需求设计\n- 不要为不可能发生的场景添加错误处理;只在系统边界(用户输入、外部 API)做校验\n- 如果删除了代码,就彻底删除,不要留注释说\"已移除\",不要保留未使用的兼容性变量\n- 三行相似代码优于一个过早的抽象`;\n}\n\n","/**\n * Layer - 并行子 Agent 提示词层\n *\n * 核心原则:让\"并行\"成为默认行为,而非可选项。\n * LLM 天然倾向串行调用工具,必须用强指令扭转这一惯性。\n */\nexport function buildParallelPrompt(): string {\n return `# 并行执行(重要)\n\n当需要读取、搜索或分析 2 个以上独立目标时,必须使用 spawn-agents 并行执行,不要逐个串行调用。\n\n规则:\n- 需要读 2+ 个文件 → spawn-agents 并行读取\n- 需要搜索 2+ 个模式 → spawn-agents 并行搜索\n- 需要了解 2+ 个模块 → spawn-agents 并行分析\n- 只有 1 个目标 → 直接用工具,无需 spawn-agents\n\n示例 - 用户说\"帮我理解认证模块\":\n 正确:spawn-agents 同时读 auth controller、auth service、auth middleware、auth types\n 错误:先 read-file controller,再 read-file service,再 read-file middleware...\n\n每个子 Agent 有独立对话,默认可用 read-file、glob、grep、memo。`;\n}\n","/**\n * Layer 2 - Git 层(检测到 .git 时加载)\n */\nexport function buildGitPrompt(): string {\n return `# Git 操作\n\n当前项目使用 git 管理。\n\n提交规范:\n- 只在用户明确要求时才创建 commit\n- 用 git diff 查看变更,再写 commit message\n- commit message 描述\"为什么\"而非\"改了什么\"\n\n安全规则:\n- 不要 force push、reset --hard、checkout .、clean -f 等破坏性操作,除非用户明确要求\n- 不要 --no-verify 跳过 hook,除非用户明确要求\n- 优先创建新 commit,不要 --amend 修改已有 commit,除非用户明确要求(hook 失败后 amend 会破坏上一个 commit)\n- git add 时指定具体文件,避免 git add -A 意外暂存敏感文件(.env、credentials 等)\n- 不要使用交互式标志(git rebase -i、git add -i),CLI 环境不支持\n- 不要修改 git config`;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * Layer 3 - 项目层(从 ZENCODE.md 加载)\n */\nexport async function buildProjectPrompt(): Promise<string | null> {\n try {\n const content = await fs.readFile(path.resolve('ZENCODE.md'), 'utf-8');\n return content.trim() || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Layer 4 - 用户自定义提示词(从指定路径加载)\n */\nexport async function loadUserPrompts(paths: string[]): Promise<string[]> {\n const prompts: string[] = [];\n for (const p of paths) {\n try {\n const resolved = p.startsWith('~')\n ? path.join(process.env['HOME'] || process.env['USERPROFILE'] || '', p.slice(1))\n : path.resolve(p);\n const content = await fs.readFile(resolved, 'utf-8');\n if (content.trim()) {\n prompts.push(content.trim());\n }\n } catch {\n // 跳过不存在的文件\n }\n }\n return prompts;\n}\n","import * as fs from 'node:fs';\nimport type { ZenCodeConfig } from '../../config/types.js';\nimport { buildCorePrompt } from './layers/core.js';\nimport { buildPlanningPrompt } from './layers/planning.js';\nimport { buildParallelPrompt } from './layers/parallel.js';\nimport { buildGitPrompt } from './layers/git.js';\nimport { buildProjectPrompt, loadUserPrompts } from './layers/project.js';\n\nexport interface PromptBuildResult {\n systemPrompt: string;\n layers: string[];\n}\n\n/**\n * 检测当前目录是否为 git 仓库\n */\nfunction isGitRepo(): boolean {\n try {\n fs.statSync('.git');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 分层提示词构建器 - 按需组装各层\n */\nexport async function buildPrompt(config: ZenCodeConfig): Promise<PromptBuildResult> {\n const layers: string[] = [];\n\n // Layer 0: 核心层(始终加载)\n layers.push(buildCorePrompt());\n\n // Layer 1: 思考层(默认开启)\n if (config.features.planning_layer === 'on') {\n layers.push(buildPlanningPrompt());\n }\n\n // Layer 2: Git 层(自动检测或手动开启)\n const gitEnabled =\n config.features.git === 'on' ||\n (config.features.git === 'auto' && isGitRepo());\n if (gitEnabled) {\n layers.push(buildGitPrompt());\n }\n\n // Layer 3: 并行子 Agent 层\n if (config.features.parallel_agents === 'on') {\n layers.push(buildParallelPrompt());\n }\n\n // Layer 4: 项目层(ZENCODE.md)\n const projectPrompt = await buildProjectPrompt();\n if (projectPrompt) {\n layers.push(projectPrompt);\n }\n\n // Layer 4: 用户自定义提示词\n if (config.prompts.length > 0) {\n const userPrompts = await loadUserPrompts(config.prompts);\n layers.push(...userPrompts);\n }\n\n // 合并所有层\n const systemPrompt = layers.join('\\n\\n');\n\n return { systemPrompt, layers };\n}\n\n/**\n * 构建 Agent B(编码者)的极简提示词\n */\nexport function buildCoderPrompt(): string {\n return '你是一个编程助手。';\n}\n","export interface TodoItem {\n id: string;\n title: string;\n status: 'pending' | 'in-progress' | 'completed';\n}\n\nexport interface TodoPlan {\n items: TodoItem[];\n}\n\ntype TodoListener = (plan: TodoPlan | null) => void;\n\n/**\n * Todo 状态存储(可观察)\n *\n * LLM 通过 todo 工具操作,TUI 订阅变化实时渲染面板\n */\nexport class TodoStore {\n private plan: TodoPlan | null = null;\n private listeners = new Set<TodoListener>();\n\n create(items: { id: string; title: string }[]): TodoPlan {\n this.plan = {\n items: items.map((item) => ({\n id: item.id,\n title: item.title,\n status: 'pending' as const,\n })),\n };\n this.notify();\n return this.plan;\n }\n\n update(id: string, status: TodoItem['status']): TodoItem | null {\n if (!this.plan) return null;\n const item = this.plan.items.find((i) => i.id === id);\n if (!item) return null;\n item.status = status;\n this.notify();\n return { ...item };\n }\n\n list(): TodoPlan | null {\n return this.plan;\n }\n\n clear(): void {\n this.plan = null;\n this.notify();\n }\n\n subscribe(listener: TodoListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify(): void {\n const snapshot = this.plan\n ? { items: this.plan.items.map((i) => ({ ...i })) }\n : null;\n for (const listener of this.listeners) {\n listener(snapshot);\n }\n }\n}\n","/**\n * Memo 共享备忘录(Blackboard Pattern)\n *\n * 所有 Agent(Orchestrator、Coder、SubAgent)共享同一个 MemoStore,\n * 通过 memo 工具按需读写。每个 Agent 只拉取自己需要的条目,不占其他 Agent 的上下文。\n */\n\nexport interface MemoEntry {\n key: string;\n content: string;\n author: string;\n updatedAt: number;\n}\n\nconst MAX_ENTRIES = 30;\nconst MAX_CONTENT_LENGTH = 3000;\n\nexport class MemoStore {\n private entries = new Map<string, MemoEntry>();\n\n write(key: string, content: string, author: string = 'agent'): MemoEntry {\n const trimmed = content.slice(0, MAX_CONTENT_LENGTH);\n const entry: MemoEntry = { key, content: trimmed, author, updatedAt: Date.now() };\n\n // 超过上限时移除最旧的\n if (!this.entries.has(key) && this.entries.size >= MAX_ENTRIES) {\n let oldest: string | null = null;\n let oldestTime = Infinity;\n for (const [k, v] of this.entries) {\n if (v.updatedAt < oldestTime) {\n oldestTime = v.updatedAt;\n oldest = k;\n }\n }\n if (oldest) this.entries.delete(oldest);\n }\n\n this.entries.set(key, entry);\n return entry;\n }\n\n read(key: string): MemoEntry | null {\n return this.entries.get(key) ?? null;\n }\n\n list(): { key: string; author: string; preview: string }[] {\n return [...this.entries.values()].map((e) => ({\n key: e.key,\n author: e.author,\n preview: e.content.slice(0, 80),\n }));\n }\n\n delete(key: string): boolean {\n return this.entries.delete(key);\n }\n\n clear(): void {\n this.entries.clear();\n }\n\n /**\n * 生成简短的备忘录索引(用于注入 Agent 系统提示词)\n * 仅包含 key 列表和简短预览,占用极少 token\n */\n buildIndex(): string | null {\n if (this.entries.size === 0) return null;\n const lines = [...this.entries.values()].map(\n (e) => `- ${e.key}: ${e.content.slice(0, 50)}`,\n );\n return lines.join('\\n');\n }\n}\n","import type { ZenCodeConfig } from '../config/types.js';\nimport type { LLMClient } from '../llm/client.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { MemoStore } from './memo-store.js';\nimport { Conversation } from './conversation.js';\n\nconst DEFAULT_TIMEOUT_MS = 120_000; // 2 minutes\n\n/**\n * 轻量子 Agent - 独立对话,只读工具,非流式\n *\n * 用于并行执行多个子任务(如同时读多个文件、搜索多处代码)\n */\nexport class SubAgent {\n private client: LLMClient;\n private registry: ToolRegistry;\n private config: ZenCodeConfig;\n private task: string;\n private allowedTools: string[];\n private maxTurns: number;\n private timeoutMs: number;\n private memoStore?: MemoStore;\n\n constructor(\n client: LLMClient,\n registry: ToolRegistry,\n config: ZenCodeConfig,\n task: string,\n allowedTools: string[] = ['read-file', 'glob', 'grep', 'memo'],\n maxTurns: number = 10,\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n memoStore?: MemoStore,\n ) {\n this.client = client;\n this.registry = registry;\n this.config = config;\n this.task = task;\n // 禁止递归:排除 spawn-agents 和 todo\n this.allowedTools = allowedTools.filter((t) => t !== 'spawn-agents' && t !== 'todo');\n this.maxTurns = Math.min(maxTurns, 15);\n this.timeoutMs = timeoutMs;\n this.memoStore = memoStore;\n }\n\n async run(): Promise<string> {\n return Promise.race([\n this.execute(),\n this.timeout(),\n ]);\n }\n\n private timeout(): Promise<never> {\n return new Promise((_, reject) => {\n setTimeout(\n () => reject(new Error(`子 Agent 超时(${this.timeoutMs / 1000}s)`)),\n this.timeoutMs,\n );\n });\n }\n\n private async execute(): Promise<string> {\n const conversation = new Conversation();\n\n let systemPrompt = `你是 ZenCode 子 Agent。你的任务:${this.task}\\n完成后直接返回结果,不要多余解释。`;\n if (this.memoStore) {\n const index = this.memoStore.buildIndex();\n if (index) {\n systemPrompt += `\\n\\n[共享备忘录 - 可用 memo read 读取详情]\\n${index}`;\n }\n }\n\n conversation.setSystemPrompt(systemPrompt);\n conversation.addUserMessage(this.task);\n\n const tools = this.registry.toToolDefinitions(this.allowedTools);\n let lastContent = '';\n\n for (let turn = 0; turn < this.maxTurns; turn++) {\n const assistantMsg = await this.client.chat(\n conversation.getMessages(),\n tools.length > 0 ? tools : undefined,\n );\n\n conversation.addAssistantMessage(assistantMsg);\n\n if (!assistantMsg.tool_calls || assistantMsg.tool_calls.length === 0) {\n lastContent = assistantMsg.content || '';\n break;\n }\n\n for (const toolCall of assistantMsg.tool_calls) {\n const toolName = toolCall.function.name;\n\n if (!this.allowedTools.includes(toolName)) {\n conversation.addToolResult(\n toolCall.id,\n `子 Agent 不允许使用工具 \"${toolName}\"`,\n );\n continue;\n }\n\n let params: Record<string, unknown>;\n try {\n params = JSON.parse(toolCall.function.arguments);\n } catch {\n conversation.addToolResult(toolCall.id, '参数解析失败:无效的 JSON');\n continue;\n }\n\n try {\n const result = await this.registry.execute(\n toolName,\n params,\n this.config.max_tool_output,\n );\n conversation.addToolResult(toolCall.id, result.content);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n conversation.addToolResult(toolCall.id, `工具执行异常:${msg}`);\n }\n }\n\n if (assistantMsg.content) {\n lastContent = assistantMsg.content;\n }\n }\n\n return lastContent;\n }\n}\n","import type { Tool, ToolResult } from './types.js';\nimport type { LLMClient } from '../llm/client.js';\nimport type { ToolRegistry } from './registry.js';\nimport type { ZenCodeConfig } from '../config/types.js';\nimport type { SubAgentTracker } from '../core/sub-agent-tracker.js';\nimport type { MemoStore } from '../core/memo-store.js';\nimport { SubAgent } from '../core/sub-agent.js';\n\ninterface TaskInput {\n description: string;\n tools?: string[];\n}\n\nconst DEFAULT_TOOLS = ['read-file', 'glob', 'grep', 'memo'];\nconst MAX_CONCURRENT = 10;\nconst MAX_TURNS_LIMIT = 15;\n\n/**\n * 创建 spawn-agents 工具 - 并行启动多个子 Agent\n */\nexport function createSpawnAgentsTool(\n client: LLMClient,\n registry: ToolRegistry,\n config: ZenCodeConfig,\n tracker?: SubAgentTracker,\n memoStore?: MemoStore,\n): Tool {\n return {\n name: 'spawn-agents',\n description:\n '并行启动多个子 Agent 执行任务。每个子 Agent 有独立对话,默认只能用只读工具 (read-file, glob, grep)。适用于同时读取和分析多个文件、搜索多个模式等场景。',\n parameters: {\n type: 'object',\n properties: {\n tasks: {\n type: 'array',\n description: '要并行执行的任务列表',\n items: {\n type: 'object',\n properties: {\n description: {\n type: 'string',\n description: '任务描述',\n },\n tools: {\n type: 'array',\n description:\n '允许使用的工具列表(默认 read-file, glob, grep),不可包含 spawn-agents',\n items: { type: 'string' },\n },\n },\n required: ['description'],\n },\n },\n max_turns: {\n type: 'number',\n description: '每个子 Agent 的最大轮数(默认 10,上限 15)',\n },\n },\n required: ['tasks'],\n },\n permissionLevel: 'auto',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const tasks = params['tasks'] as TaskInput[];\n const maxTurns = Math.min(\n (params['max_turns'] as number) || 10,\n MAX_TURNS_LIMIT,\n );\n\n if (!tasks || tasks.length === 0) {\n return { content: '错误:未提供任务' };\n }\n\n if (tasks.length > MAX_CONCURRENT) {\n return { content: `错误:最多支持 ${MAX_CONCURRENT} 个并发任务` };\n }\n\n // 获取 auto 权限的工具列表\n const autoTools = registry\n .listTools()\n .filter((t) => registry.getPermissionLevel(t) === 'auto' && t !== 'spawn-agents');\n\n const descriptions = tasks.map((t) => t.description);\n\n // 通知 tracker 开始\n tracker?.start(descriptions);\n\n const agents = tasks.map((task) => {\n // 取请求工具与 auto 工具的交集,排除 spawn-agents\n let tools = task.tools\n ? task.tools\n .filter((t) => t !== 'spawn-agents')\n .filter((t) => autoTools.includes(t))\n : DEFAULT_TOOLS.filter((t) => autoTools.includes(t));\n\n if (tools.length === 0) {\n tools = DEFAULT_TOOLS.filter((t) => autoTools.includes(t));\n }\n\n return new SubAgent(client, registry, config, task.description, tools, maxTurns, undefined, memoStore);\n });\n\n // 包装每个 agent 的 run,追踪完成/失败\n const wrappedRuns = agents.map((agent) =>\n agent.run().then(\n (result) => { tracker?.markCompleted(); return result; },\n (err) => { tracker?.markFailed(); throw err; },\n ),\n );\n\n const results = await Promise.allSettled(wrappedRuns);\n\n // 通知 tracker 结束\n tracker?.finish();\n\n const succeeded = results.filter((r) => r.status === 'fulfilled').length;\n const failed = results.filter((r) => r.status === 'rejected').length;\n\n const output = results\n .map((result, i) => {\n const task = tasks[i]!;\n const status = result.status === 'fulfilled' ? '✓' : '✗';\n const header = `=== ${status} 任务 ${i + 1}: ${task.description} ===`;\n if (result.status === 'fulfilled') {\n return `${header}\\n${result.value}`;\n }\n return `${header}\\n错误: ${result.reason}`;\n })\n .join('\\n\\n');\n\n const summary = `[${succeeded} 成功${failed > 0 ? `, ${failed} 失败` : ''}]`;\n\n return { content: `${summary}\\n\\n${output}` };\n },\n };\n}\n","import type { Tool, ToolResult } from './types.js';\nimport type { TodoStore } from '../core/todo-store.js';\n\n/**\n * 创建 todo 工具 - 计划管理\n */\nexport function createTodoTool(store: TodoStore): Tool {\n return {\n name: 'todo',\n description:\n '管理任务计划。支持创建计划、更新条目状态、查看计划和清空计划。对于包含多个步骤的任务,先创建计划再逐步执行。',\n parameters: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n description: '操作类型',\n enum: ['create', 'update', 'list', 'clear'],\n },\n items: {\n type: 'array',\n description: 'create 时必填:计划条目列表',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: '条目 ID' },\n title: { type: 'string', description: '条目标题' },\n },\n required: ['id', 'title'],\n },\n },\n id: {\n type: 'string',\n description: 'update 时必填:要更新的条目 ID',\n },\n status: {\n type: 'string',\n description: 'update 时必填:新状态',\n enum: ['pending', 'in-progress', 'completed'],\n },\n },\n required: ['action'],\n },\n permissionLevel: 'auto',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const action = params['action'] as string;\n\n switch (action) {\n case 'create': {\n const items = params['items'] as\n | { id: string; title: string }[]\n | undefined;\n if (!items || items.length === 0) {\n return { content: '错误:create 需要提供 items' };\n }\n const plan = store.create(items);\n const lines = plan.items.map(\n (item) => `○ [${item.id}] ${item.title}`,\n );\n return {\n content: `计划已创建(${plan.items.length} 个条目):\\n${lines.join('\\n')}`,\n };\n }\n\n case 'update': {\n const id = params['id'] as string | undefined;\n const status = params['status'] as string | undefined;\n if (!id || !status) {\n return { content: '错误:update 需要提供 id 和 status' };\n }\n const item = store.update(\n id,\n status as 'pending' | 'in-progress' | 'completed',\n );\n if (!item) {\n return { content: `错误:未找到条目 \"${id}\"` };\n }\n const icon =\n item.status === 'completed'\n ? '●'\n : item.status === 'in-progress'\n ? '◐'\n : '○';\n return {\n content: `已更新:${icon} [${item.id}] ${item.title} → ${item.status}`,\n };\n }\n\n case 'list': {\n const plan = store.list();\n if (!plan) {\n return { content: '当前没有计划' };\n }\n const completed = plan.items.filter(\n (i) => i.status === 'completed',\n ).length;\n const lines = plan.items.map((item) => {\n const icon =\n item.status === 'completed'\n ? '●'\n : item.status === 'in-progress'\n ? '◐'\n : '○';\n return `${icon} [${item.id}] ${item.title}`;\n });\n return {\n content: `计划进度 ${completed}/${plan.items.length}:\\n${lines.join('\\n')}`,\n };\n }\n\n case 'clear': {\n store.clear();\n return { content: '计划已清空' };\n }\n\n default:\n return {\n content: `错误:未知操作 \"${action}\"。支持: create, update, list, clear`,\n };\n }\n },\n };\n}\n","import type { Tool, ToolResult } from './types.js';\nimport type { MemoStore } from '../core/memo-store.js';\n\n/**\n * 创建 memo 工具 - 共享备忘录\n *\n * 所有 Agent 通过此工具读写共享备忘录,实现跨上下文协作。\n */\nexport function createMemoTool(store: MemoStore): Tool {\n return {\n name: 'memo',\n description:\n '共享备忘录:在多个 Agent 之间共享信息。write 写入发现/决策/摘要供其他 Agent 读取,read 按 key 读取,list 查看所有可用条目。',\n parameters: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n description: '操作类型',\n enum: ['write', 'read', 'list', 'delete', 'clear'],\n },\n key: {\n type: 'string',\n description: 'write/read/delete 时必填:备忘录 key',\n },\n content: {\n type: 'string',\n description: 'write 时必填:要写入的内容(建议简洁摘要,最多 3000 字符)',\n },\n },\n required: ['action'],\n },\n permissionLevel: 'auto',\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n const action = params['action'] as string;\n\n switch (action) {\n case 'write': {\n const key = params['key'] as string | undefined;\n const content = params['content'] as string | undefined;\n if (!key || !content) {\n return { content: '错误:write 需要提供 key 和 content' };\n }\n const entry = store.write(key, content);\n return { content: `已写入 memo [${entry.key}](${entry.content.length} 字符)` };\n }\n\n case 'read': {\n const key = params['key'] as string | undefined;\n if (!key) {\n return { content: '错误:read 需要提供 key' };\n }\n const entry = store.read(key);\n if (!entry) {\n return { content: `memo [${key}] 不存在` };\n }\n return { content: `[${entry.key}] by ${entry.author}:\\n${entry.content}` };\n }\n\n case 'list': {\n const items = store.list();\n if (items.length === 0) {\n return { content: '备忘录为空' };\n }\n const lines = items.map(\n (item) => `[${item.key}] (${item.author}) ${item.preview}`,\n );\n return { content: `共 ${items.length} 条备忘录:\\n${lines.join('\\n')}` };\n }\n\n case 'delete': {\n const key = params['key'] as string | undefined;\n if (!key) {\n return { content: '错误:delete 需要提供 key' };\n }\n const ok = store.delete(key);\n return { content: ok ? `已删除 memo [${key}]` : `memo [${key}] 不存在` };\n }\n\n case 'clear': {\n store.clear();\n return { content: '备忘录已清空' };\n }\n\n default:\n return { content: `错误:未知操作 \"${action}\"。支持: write, read, list, delete, clear` };\n }\n },\n };\n}\n","// Bridge: Agent/Orchestrator callbacks → TUI dispatch\n// Includes token batching to avoid excessive React re-renders\n\nimport type { Dispatch } from 'react';\nimport type { AgentCallbacks } from '../../core/agent.js';\nimport type { OrchestratorCallbacks } from '../../core/dual-agent/orchestrator.js';\nimport type { TuiAction } from './state.js';\n\nconst BATCH_INTERVAL_MS = 64; // ~15fps, balances smoothness vs flicker for fullscreen redraw\n\nconst THINK_BORDER = '─'.repeat(40);\n\n/**\n * 流式 <think> 标签转换器\n * 圆角边框包裹 thinking 内容,左侧 │ 前缀标识每行\n */\nexport function createThinkFilter() {\n let inThink = false;\n let tagBuffer = '';\n let lineStart = true;\n let postThink = false; // 跳过 </think> 后的空行\n\n return function filter(text: string): string {\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n\n if (tagBuffer.length > 0) {\n tagBuffer += ch;\n if (tagBuffer === '<think>') {\n inThink = true;\n lineStart = true;\n tagBuffer = '';\n result += `╭─ 💭 ${THINK_BORDER}\\n`;\n } else if (tagBuffer === '</think>') {\n inThink = false;\n postThink = true;\n tagBuffer = '';\n result += `\\n╰${THINK_BORDER}───\\n\\n`;\n } else if (!'<think>'.startsWith(tagBuffer) && !'</think>'.startsWith(tagBuffer)) {\n if (inThink && lineStart) { result += '│ '; lineStart = false; }\n result += tagBuffer;\n tagBuffer = '';\n }\n continue;\n }\n\n if (ch === '<') {\n tagBuffer = '<';\n continue;\n }\n\n if (inThink) {\n if (lineStart) { result += '│ '; lineStart = false; }\n result += ch;\n if (ch === '\\n') { lineStart = true; }\n } else {\n // 跳过 </think> 后的空行直到正文\n if (postThink) {\n if (ch === '\\n' || ch === '\\r' || ch === ' ' || ch === '\\t') continue;\n postThink = false;\n }\n result += ch;\n }\n }\n return result;\n };\n}\n\n/**\n * Creates a token batcher that accumulates streaming content\n * and flushes to dispatch at a fixed interval.\n */\nfunction createTokenBatcher(dispatch: Dispatch<TuiAction>) {\n let buffer = '';\n let timer: ReturnType<typeof setInterval> | null = null;\n\n function flush() {\n if (buffer.length > 0) {\n const text = buffer;\n buffer = '';\n dispatch({ type: 'APPEND_CONTENT', text });\n }\n }\n\n function start() {\n if (!timer) {\n timer = setInterval(flush, BATCH_INTERVAL_MS);\n }\n }\n\n function stop() {\n flush();\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n\n function append(text: string) {\n buffer += text;\n start();\n }\n\n function pause() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n\n return { append, stop, flush, pause };\n}\n\n// Track tool call IDs for mapping tool results back\nlet toolCallCounter = 0;\nlet activeToolIds: Map<string, string> = new Map();\n// Track streaming tool index → id\nlet streamingToolIds: Map<number, string> = new Map();\n// Track last streaming args per tool id (for computing code line count on result)\nlet lastStreamingArgs: Map<string, string> = new Map();\n\n/**\n * 从部分 JSON 参数中提取代码内容(write-file 的 content 或 edit-file 的 new_string)\n */\nfunction extractCodeFromArgs(name: string, args: string): string | null {\n const field = name === 'write-file' ? 'content' : 'new_string';\n // 查找 \"content\": \" 或 \"new_string\": \"\n const patterns = [`\"${field}\": \"`, `\"${field}\":\"`];\n for (const pattern of patterns) {\n const idx = args.indexOf(pattern);\n if (idx >= 0) {\n let raw = args.slice(idx + pattern.length);\n // 去掉尾部不完整的 JSON 结构\n if (raw.endsWith('\"}')) raw = raw.slice(0, -2);\n else if (raw.endsWith('\"')) raw = raw.slice(0, -1);\n // 反转义 JSON 字符串\n return raw\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n }\n return null;\n}\n\n/**\n * Register a confirm tool id so that subsequent onToolResult/onDenied\n * can find it by tool name.\n */\nexport function registerConfirmToolId(toolName: string, id: string): void {\n activeToolIds.set(toolName, id);\n}\n\n/**\n * Creates AgentCallbacks & OrchestratorCallbacks that dispatch to TUI state.\n */\nexport function createBridgeCallbacks(dispatch: Dispatch<TuiAction>): AgentCallbacks & OrchestratorCallbacks {\n const batcher = createTokenBatcher(dispatch);\n const thinkFilter = createThinkFilter();\n activeToolIds = new Map();\n streamingToolIds = new Map();\n lastStreamingArgs = new Map();\n toolCallCounter = 0;\n\n // 节流:工具参数流式更新,限制 UI 刷新频率\n let streamingThrottleTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingStreamingUpdate: (() => void) | null = null;\n\n function flushStreamingUpdate() {\n if (pendingStreamingUpdate) {\n pendingStreamingUpdate();\n pendingStreamingUpdate = null;\n }\n if (streamingThrottleTimer) {\n clearTimeout(streamingThrottleTimer);\n streamingThrottleTimer = null;\n }\n }\n\n return {\n onContent: (text: string) => {\n const filtered = thinkFilter(text);\n if (filtered) batcher.append(filtered);\n },\n\n onToolCallStreaming: (index: number, name: string, accumulatedArgs: string) => {\n // 为此工具分配 ID(首次出现时)—— 即使代码内容还没开始,也立即显示工具块\n if (!streamingToolIds.has(index)) {\n batcher.flush();\n const id = `tool-${++toolCallCounter}`;\n streamingToolIds.set(index, id);\n activeToolIds.set(name, id);\n dispatch({ type: 'TOOL_STREAMING', id, name, streamingContent: '0' });\n }\n const id = streamingToolIds.get(index)!;\n\n // 保存原始 args 用于后续计算行数\n lastStreamingArgs.set(id, accumulatedArgs);\n\n // 估算已输出的代码行数:统计 JSON 转义换行符 \\n 的数量\n // 无需解析完整 JSON,从第一个换行符开始就能显示进度\n const lineCount = (accumulatedArgs.match(/\\\\n/g) || []).length;\n\n // 节流:积累更新,每 80ms 刷一次\n pendingStreamingUpdate = () => {\n dispatch({ type: 'TOOL_STREAMING', id, name, streamingContent: String(lineCount) });\n };\n if (!streamingThrottleTimer) {\n streamingThrottleTimer = setTimeout(() => {\n flushStreamingUpdate();\n }, 80);\n }\n },\n\n onToolExecuting: (name: string, params: Record<string, unknown>) => {\n flushStreamingUpdate();\n batcher.flush();\n batcher.pause(); // 工具执行期间暂停计时器,减少无效重绘\n // 如果已有流式创建的 tool block,复用其 ID\n const existingId = activeToolIds.get(name);\n const id = existingId || `tool-${++toolCallCounter}`;\n activeToolIds.set(name, id);\n dispatch({ type: 'TOOL_EXECUTING', id, name, params });\n },\n\n onToolResult: (name: string, result: string, truncated: boolean) => {\n const id = activeToolIds.get(name) || `tool-${++toolCallCounter}`;\n const lines = result.split('\\n');\n\n // 写入/编辑工具:从最后已知的 streamingContent 获取代码行数\n const isWriteTool = name === 'write-file' || name === 'edit-file';\n let summary: string;\n if (isWriteTool) {\n // 从最后一次 TOOL_STREAMING 的内容推算行数\n const code = extractCodeFromArgs(name, lastStreamingArgs.get(id) || '');\n const codeLines = code ? code.split('\\n').length : 0;\n summary = codeLines > 0 ? `${codeLines} 行` : (truncated ? '输出已截断' : `${lines.length} 行`);\n } else {\n summary = truncated ? `输出已截断` : `${lines.length} 行`;\n }\n\n // Preview: first 5 lines, max 200 chars\n const preview = lines.slice(0, 5).join('\\n').slice(0, 200);\n const resultContent = lines.length > 5 || preview.length >= 200\n ? preview + '...'\n : preview;\n dispatch({ type: 'TOOL_RESULT', id, resultSummary: summary, resultContent });\n },\n\n onCoderStart: () => {\n batcher.flush();\n dispatch({ type: 'CODER_START' });\n },\n\n onCoderEnd: () => {\n dispatch({ type: 'CODER_END' });\n },\n\n onDenied: (toolName: string, feedback?: string) => {\n const id = activeToolIds.get(toolName) || `tool-${++toolCallCounter}`;\n dispatch({ type: 'TOOL_DENIED', id, feedback });\n },\n\n onError: (err: Error) => {\n batcher.stop();\n dispatch({ type: 'SET_ERROR', error: err.message });\n },\n\n // Called internally when streaming is complete\n _stopBatcher: () => {\n batcher.stop();\n },\n } as AgentCallbacks & OrchestratorCallbacks & { _stopBatcher: () => void };\n}\n","/**\n * 子 Agent 并行执行追踪器\n *\n * spawn-agents 工具在执行时更新状态,TUI 订阅变化实时渲染。\n */\n\nexport interface SubAgentProgress {\n total: number;\n completed: number;\n failed: number;\n descriptions: string[];\n}\n\ntype ProgressListener = (progress: SubAgentProgress | null) => void;\n\nexport class SubAgentTracker {\n private progress: SubAgentProgress | null = null;\n private listeners = new Set<ProgressListener>();\n\n start(descriptions: string[]): void {\n this.progress = {\n total: descriptions.length,\n completed: 0,\n failed: 0,\n descriptions,\n };\n this.notify();\n }\n\n markCompleted(): void {\n if (!this.progress) return;\n this.progress = { ...this.progress, completed: this.progress.completed + 1 };\n this.notify();\n }\n\n markFailed(): void {\n if (!this.progress) return;\n this.progress = { ...this.progress, failed: this.progress.failed + 1 };\n this.notify();\n }\n\n finish(): void {\n this.progress = null;\n this.notify();\n }\n\n get current(): SubAgentProgress | null {\n return this.progress;\n }\n\n subscribe(listener: ProgressListener): () => void {\n this.listeners.add(listener);\n return () => { this.listeners.delete(listener); };\n }\n\n private notify(): void {\n const snapshot = this.progress ? { ...this.progress } : null;\n for (const listener of this.listeners) {\n listener(snapshot);\n }\n }\n}\n","import type { TodoPlan } from '../../core/todo-store.js';\nimport type { SubAgentProgress } from '../../core/sub-agent-tracker.js';\n\n// TUI state management with useReducer\n\nexport interface ToolCallState {\n id: string;\n name: string;\n params: Record<string, unknown>;\n status: 'running' | 'done' | 'denied' | 'confirming';\n resultSummary?: string;\n resultContent?: string;\n denyFeedback?: string;\n streamingContent?: string;\n}\n\nexport type ConfirmResult = 'allow' | 'deny' | 'always' | { feedback: string };\n\nexport interface ConfirmPending {\n toolName: string;\n params: Record<string, unknown>;\n resolve: (result: ConfirmResult) => void;\n}\n\n// Content blocks: text and tool calls are interleaved in order\nexport type ContentBlock =\n | { type: 'text'; text: string }\n | { type: 'tool'; toolCall: ToolCallState };\n\nexport interface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n blocks: ContentBlock[];\n isStreaming: boolean;\n confirmPending?: ConfirmPending;\n}\n\nexport interface TuiState {\n messages: ChatMessage[];\n isRunning: boolean;\n error?: string;\n coderWorking: boolean;\n modelName: string;\n agentMode: string;\n collaboration: string;\n todoPlan: TodoPlan | null;\n subAgentProgress: SubAgentProgress | null;\n}\n\nexport function createInitialState(modelName: string, agentMode: string, collaboration: string): TuiState {\n return {\n messages: [],\n isRunning: false,\n error: undefined,\n coderWorking: false,\n modelName,\n agentMode,\n collaboration,\n todoPlan: null,\n subAgentProgress: null,\n };\n}\n\n// Action types\nexport type TuiAction =\n | { type: 'ADD_USER_MESSAGE'; text: string }\n | { type: 'START_ASSISTANT' }\n | { type: 'APPEND_CONTENT'; text: string }\n | { type: 'TOOL_EXECUTING'; id: string; name: string; params: Record<string, unknown> }\n | { type: 'TOOL_STREAMING'; id: string; name: string; streamingContent: string }\n | { type: 'TOOL_RESULT'; id: string; resultSummary: string; resultContent?: string }\n | { type: 'TOOL_DENIED'; id: string; feedback?: string }\n | { type: 'TOOL_CONFIRMING'; id: string; name: string; params: Record<string, unknown>; resolve: (r: ConfirmResult) => void }\n | { type: 'CONFIRM_RESPONDED'; id: string }\n | { type: 'FINISH_STREAMING' }\n | { type: 'SET_RUNNING'; running: boolean }\n | { type: 'SET_ERROR'; error: string }\n | { type: 'CLEAR_ERROR' }\n | { type: 'CODER_START' }\n | { type: 'CODER_END' }\n | { type: 'CLEAR_MESSAGES' }\n | { type: 'SET_MODE'; agentMode: string; collaboration: string }\n | { type: 'SET_TODO_PLAN'; plan: TodoPlan | null }\n | { type: 'SET_SUB_AGENT_PROGRESS'; progress: SubAgentProgress | null };\n\nlet messageCounter = 0;\nfunction nextId(): string {\n return `msg-${++messageCounter}`;\n}\n\nfunction updateLastAssistant(messages: ChatMessage[], updater: (msg: ChatMessage) => ChatMessage): ChatMessage[] {\n const result = [...messages];\n for (let i = result.length - 1; i >= 0; i--) {\n if (result[i]!.role === 'assistant') {\n result[i] = updater(result[i]!);\n return result;\n }\n }\n return result;\n}\n\n/** Helper to find and update a tool block by id across all blocks */\nfunction updateToolInBlocks(blocks: ContentBlock[], toolId: string, updater: (tc: ToolCallState) => ToolCallState): ContentBlock[] {\n return blocks.map(b => {\n if (b.type === 'tool' && b.toolCall.id === toolId) {\n return { type: 'tool' as const, toolCall: updater(b.toolCall) };\n }\n return b;\n });\n}\n\nexport function tuiReducer(state: TuiState, action: TuiAction): TuiState {\n switch (action.type) {\n case 'ADD_USER_MESSAGE':\n return {\n ...state,\n messages: [\n ...state.messages,\n {\n id: nextId(),\n role: 'user',\n blocks: [{ type: 'text', text: action.text }],\n isStreaming: false,\n },\n ],\n };\n\n case 'START_ASSISTANT':\n return {\n ...state,\n error: undefined,\n messages: [\n ...state.messages,\n {\n id: nextId(),\n role: 'assistant',\n blocks: [],\n isStreaming: true,\n },\n ],\n };\n\n case 'APPEND_CONTENT': {\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => {\n const blocks = [...msg.blocks];\n const last = blocks[blocks.length - 1];\n if (last && last.type === 'text') {\n // Append to existing text block\n blocks[blocks.length - 1] = { type: 'text', text: last.text + action.text };\n } else {\n // Create new text block (after a tool block or empty)\n blocks.push({ type: 'text', text: action.text });\n }\n return { ...msg, blocks };\n }),\n };\n }\n\n case 'TOOL_EXECUTING': {\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => {\n // Check if a tool block with this id already exists (from confirming or streaming)\n const existingIdx = msg.blocks.findIndex(\n b => b.type === 'tool' && b.toolCall.id === action.id,\n );\n if (existingIdx >= 0) {\n // Update existing block: set status to running, fill in final params\n return {\n ...msg,\n blocks: updateToolInBlocks(msg.blocks, action.id, tc => ({\n ...tc,\n status: 'running' as const,\n params: action.params,\n })),\n };\n }\n // Add new tool block\n return {\n ...msg,\n blocks: [\n ...msg.blocks,\n {\n type: 'tool' as const,\n toolCall: {\n id: action.id,\n name: action.name,\n params: action.params,\n status: 'running' as const,\n },\n },\n ],\n };\n }),\n };\n }\n\n case 'TOOL_STREAMING': {\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => {\n // Check if streaming tool block already exists\n const existingIdx = msg.blocks.findIndex(\n b => b.type === 'tool' && b.toolCall.id === action.id,\n );\n if (existingIdx >= 0) {\n // Update streaming content\n return {\n ...msg,\n blocks: updateToolInBlocks(msg.blocks, action.id, tc => ({\n ...tc,\n streamingContent: action.streamingContent,\n })),\n };\n }\n // Create new tool block with streaming status\n return {\n ...msg,\n blocks: [\n ...msg.blocks,\n {\n type: 'tool' as const,\n toolCall: {\n id: action.id,\n name: action.name,\n params: {},\n status: 'running' as const,\n streamingContent: action.streamingContent,\n },\n },\n ],\n };\n }),\n };\n }\n\n case 'TOOL_RESULT': {\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => ({\n ...msg,\n blocks: updateToolInBlocks(msg.blocks, action.id, tc => ({\n ...tc,\n status: 'done' as const,\n resultSummary: action.resultSummary,\n resultContent: action.resultContent,\n })),\n })),\n };\n }\n\n case 'TOOL_DENIED': {\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => ({\n ...msg,\n blocks: updateToolInBlocks(msg.blocks, action.id, tc => ({\n ...tc,\n status: 'denied' as const,\n denyFeedback: action.feedback,\n })),\n })),\n };\n }\n\n case 'TOOL_CONFIRMING': {\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => ({\n ...msg,\n blocks: [\n ...msg.blocks,\n {\n type: 'tool' as const,\n toolCall: {\n id: action.id,\n name: action.name,\n params: action.params,\n status: 'confirming' as const,\n },\n },\n ],\n confirmPending: {\n toolName: action.name,\n params: action.params,\n resolve: action.resolve,\n },\n })),\n };\n }\n\n case 'CONFIRM_RESPONDED': {\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => ({\n ...msg,\n confirmPending: undefined,\n })),\n };\n }\n\n case 'FINISH_STREAMING':\n return {\n ...state,\n messages: updateLastAssistant(state.messages, (msg) => ({\n ...msg,\n isStreaming: false,\n })),\n };\n\n case 'SET_RUNNING':\n return { ...state, isRunning: action.running };\n\n case 'SET_ERROR':\n return { ...state, error: action.error, isRunning: false };\n\n case 'CLEAR_ERROR':\n return { ...state, error: undefined };\n\n case 'CODER_START':\n return { ...state, coderWorking: true };\n\n case 'CODER_END':\n return { ...state, coderWorking: false };\n\n case 'CLEAR_MESSAGES':\n return { ...state, messages: [] };\n\n case 'SET_MODE':\n return { ...state, agentMode: action.agentMode, collaboration: action.collaboration };\n\n case 'SET_TODO_PLAN':\n return { ...state, todoPlan: action.plan };\n\n case 'SET_SUB_AGENT_PROGRESS':\n return { ...state, subAgentProgress: action.progress };\n\n default:\n return state;\n }\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { ToolCallState } from '../state.js';\n\ninterface ToolCallLineProps {\n toolCall: ToolCallState;\n}\n\nexport function getToolParamSummary(name: string, params: Record<string, unknown>): string {\n switch (name) {\n case 'bash':\n return String(params['command'] || '').slice(0, 60);\n case 'read-file':\n case 'write-file':\n case 'edit-file':\n return String(params['path'] || '');\n case 'glob':\n return String(params['pattern'] || '');\n case 'grep':\n return String(params['pattern'] || '');\n case 'send-to-coder':\n return String(params['task'] || '').slice(0, 40);\n case 'spawn-agents': {\n const tasks = params['tasks'] as { description: string }[] | undefined;\n if (!tasks) return '';\n if (tasks.length <= 2) {\n return tasks.map((t) => t.description.slice(0, 30)).join(', ');\n }\n return `${tasks.length} 个并行任务`;\n }\n case 'todo': {\n const action = String(params['action'] || '');\n const id = params['id'] ? ` [${params['id']}]` : '';\n return `${action}${id}`;\n }\n case 'memo': {\n const action = String(params['action'] || '');\n const key = params['key'] ? ` [${params['key']}]` : '';\n return `${action}${key}`;\n }\n default: {\n const keys = Object.keys(params);\n if (keys.length > 0 && keys[0]) {\n return String(params[keys[0]] || '').slice(0, 40);\n }\n return '';\n }\n }\n}\n\nexport function getToolIcon(name: string): string {\n switch (name) {\n case 'bash': return '$';\n case 'write-file': return '+';\n case 'edit-file': return '±';\n case 'read-file': return '📄';\n case 'glob': return '🔍';\n case 'grep': return '🔍';\n case 'spawn-agents': return '⚡';\n case 'todo': return '📋';\n case 'memo': return '📝';\n default: return '⚙';\n }\n}\n\n/** 提取写入/编辑工具的代码内容 */\nfunction getCodeContent(name: string, params: Record<string, unknown>): string | null {\n if (name === 'write-file') {\n return (params['content'] as string | undefined) || null;\n }\n if (name === 'edit-file') {\n return (params['new_string'] as string | undefined) || null;\n }\n return null;\n}\n\n/** 截断代码为最多 maxLines 行的预览 */\nfunction truncateCode(code: string, maxLines: number): string {\n const lines = code.split('\\n');\n if (lines.length <= maxLines) return code;\n return lines.slice(0, maxLines).join('\\n') + `\\n... (共 ${lines.length} 行)`;\n}\n\n/**\n * 工具完成后的完整显示(用于 Static 区域)\n * 显示 ✓/✗ 状态 + 工具信息 + 结果预览\n * 写入/编辑工具完成后显示折叠的代码预览(最多 5 行)\n */\nexport function ToolCallLine({ toolCall }: ToolCallLineProps) {\n const { name, params, status, resultSummary, resultContent, denyFeedback } = toolCall;\n const summary = getToolParamSummary(name, params);\n const icon = getToolIcon(name);\n\n const isWriteTool = name === 'write-file' || name === 'edit-file';\n const rawCode = isWriteTool && status === 'done' ? getCodeContent(name, params) : null;\n\n let statusNode: React.ReactNode;\n let statusText = '';\n\n switch (status) {\n case 'running':\n statusNode = <Text color=\"yellow\">⏳</Text>;\n break;\n case 'done':\n statusNode = <Text color=\"green\">✓</Text>;\n statusText = resultSummary || '';\n break;\n case 'denied':\n statusNode = <Text color=\"red\">✗</Text>;\n statusText = 'denied';\n break;\n case 'confirming':\n statusNode = <Text color=\"yellow\">⚠</Text>;\n statusText = '[y/N]';\n break;\n }\n\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n <Box gap={1}>\n {statusNode}\n <Text color=\"yellow\" bold>{icon} {name}</Text>\n {summary ? <Text dimColor>{summary}</Text> : null}\n {statusText ? <Text dimColor>{statusText}</Text> : null}\n </Box>\n\n {/* 写入/编辑工具的折叠代码预览(完成后显示,最多 5 行) */}\n {status === 'done' && rawCode && (\n <Box marginLeft={3} marginTop={0}>\n <Text dimColor>{truncateCode(rawCode, 5)}</Text>\n </Box>\n )}\n\n {/* 非写入工具的结果预览(完成后显示) */}\n {status === 'done' && !isWriteTool && resultContent && (\n <Box\n marginLeft={3}\n marginTop={0}\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n >\n <Text dimColor>{resultContent}</Text>\n </Box>\n )}\n\n {/* Show deny feedback */}\n {status === 'denied' && denyFeedback && (\n <Box marginLeft={3} gap={1}>\n <Text color=\"red\">反馈:</Text>\n <Text>{denyFeedback}</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { ChatMessage } from '../state.js';\nimport { ToolCallLine } from './ToolCallLine.js';\n\ninterface MessageBubbleProps {\n message: ChatMessage;\n}\n\nexport const MessageBubble = React.memo(function MessageBubble({ message }: MessageBubbleProps) {\n const { role, blocks, isStreaming } = message;\n\n const color = role === 'user' ? 'green' : role === 'assistant' ? 'cyan' : 'gray';\n const icon = role === 'user' ? '>' : role === 'assistant' ? '◆' : '•';\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {blocks.map((block, i) => {\n if (block.type === 'text') {\n return (\n <Box key={`text-${i}`}>\n {i === 0 ? (\n <Text color={color} bold>{icon} </Text>\n ) : (\n <Text> </Text>\n )}\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text>{block.text}</Text>\n </Box>\n </Box>\n );\n } else {\n return (\n <ToolCallLine key={block.toolCall.id} toolCall={block.toolCall} />\n );\n }\n })}\n {blocks.length === 0 && (\n <Box>\n <Text color={color} bold>{icon} </Text>\n {isStreaming && <Text dimColor>...</Text>}\n </Box>\n )}\n </Box>\n );\n});\n","import React, { useRef } from 'react';\nimport { Static, Box, Text } from 'ink';\nimport type { ChatMessage } from '../state.js';\nimport type { ToolCallState } from '../state.js';\nimport { MessageBubble } from './MessageBubble.js';\nimport { ToolCallLine, getToolIcon, getToolParamSummary } from './ToolCallLine.js';\n\ninterface ChatAreaProps {\n messages: ChatMessage[];\n}\n\n/**\n * Static 渲染项 —— 推入 Ink <Static> 后写入 scrollback,永不重绘。\n *\n * 类型说明:\n * - message: 完整消息(未经流式渲染的用户/系统消息)\n * - line: 文本行(流式渲染的 assistant 消息,逐行推入)\n * - tool-header: 工具开始标记(⏳ icon,工具刚出现时推入,不可更新)\n * - tool-done: 工具完成结果(✓/✗ + 结果摘要,完成时推入)\n */\ninterface StaticItem {\n id: string;\n type: 'message' | 'line' | 'tool-header' | 'tool-done';\n message?: ChatMessage;\n text?: string;\n isFirstLine?: boolean;\n toolCall?: ToolCallState;\n}\n\n/**\n * 将消息分为已完成(static)和活跃(dynamic)\n */\nfunction splitMessages(messages: ChatMessage[]): { staticMsgs: ChatMessage[]; streamingMsg: ChatMessage | null; otherDynamic: ChatMessage[] } {\n let staticEnd = 0;\n for (let i = 0; i < messages.length; i++) {\n if (messages[i]!.isStreaming || messages[i]!.confirmPending) break;\n staticEnd = i + 1;\n }\n const dynamicMsgs = messages.slice(staticEnd);\n const streamingMsg = dynamicMsgs.find(m => m.isStreaming) || null;\n const otherDynamic = dynamicMsgs.filter(m => m !== streamingMsg);\n return {\n staticMsgs: messages.slice(0, staticEnd),\n streamingMsg,\n otherDynamic,\n };\n}\n\n/**\n * 从消息的 blocks 中提取 static 项和 dynamic 节点。\n *\n * 核心策略(log-style,面向 Windows 终端兼容):\n * - 完整的文本行(以 \\n 结尾)→ Static(每行一个 item)\n * - 工具开始 → Static(tool-header,⏳ 标记)\n * - 工具完成 → Static(tool-done,✓/✗ + 结果摘要)\n * - 写入/编辑工具进行中 → Dynamic(实时行数指示器,1 行)\n * - 正在输入的部分行 → Dynamic(最多 1 行,最小重绘面积)\n */\nfunction extractFromBlocks(\n msg: ChatMessage,\n staticItems: StaticItem[],\n dynamicNodes: React.ReactNode[],\n isStreaming: boolean,\n) {\n let lineIdx = 0;\n\n for (let bi = 0; bi < msg.blocks.length; bi++) {\n const block = msg.blocks[bi]!;\n const isLastBlock = bi === msg.blocks.length - 1;\n\n if (block.type === 'text') {\n const lines = block.text.split('\\n');\n\n if (isStreaming && isLastBlock) {\n // 最后一个 text block 仍在流式输入:完整行 → static,末尾部分行 → dynamic\n const partial = lines.pop() || '';\n for (const line of lines) {\n staticItems.push({\n id: `${msg.id}-L${lineIdx}`,\n type: 'line',\n text: line,\n isFirstLine: lineIdx === 0,\n });\n lineIdx++;\n }\n // 部分行(或第一行占位)→ dynamic(最多 1 行)\n if (partial || lineIdx === 0) {\n dynamicNodes.push(\n <Box key=\"partial\">\n <Text color=\"cyan\" bold>{lineIdx === 0 ? '◆ ' : ' '}</Text>\n <Box flexGrow={1}><Text>{partial}</Text></Box>\n </Box>,\n );\n }\n } else {\n // 已完成的 text block:所有行 → static\n for (const line of lines) {\n staticItems.push({\n id: `${msg.id}-L${lineIdx}`,\n type: 'line',\n text: line,\n isFirstLine: lineIdx === 0,\n });\n lineIdx++;\n }\n }\n } else if (block.type === 'tool') {\n const tc = block.toolCall;\n const isWriteTool = tc.name === 'write-file' || tc.name === 'edit-file';\n\n // tool-header: 工具开始标记\n staticItems.push({\n id: `${msg.id}-TH${tc.id}`,\n type: 'tool-header',\n toolCall: tc,\n });\n\n // 写入/编辑工具进行中:动态区域显示实时行数\n if (isWriteTool && tc.status === 'running' && isStreaming) {\n const lineCount = parseInt(tc.streamingContent || '0', 10);\n dynamicNodes.push(\n <Box key={`tool-progress-${tc.id}`} paddingX={1} marginLeft={4}>\n <Text color=\"cyan\">✎ 生成中...{lineCount > 0 ? ` ${lineCount} 行` : ''}</Text>\n </Box>,\n );\n }\n\n // tool-done: 完成/拒绝的结果\n if (tc.status === 'done' || tc.status === 'denied') {\n staticItems.push({\n id: `${msg.id}-TD${tc.id}`,\n type: 'tool-done',\n toolCall: tc,\n });\n }\n }\n }\n}\n\nfunction renderStaticItem(item: StaticItem) {\n if (item.type === 'message') {\n return (\n <Box key={item.id} paddingX={1}>\n <MessageBubble message={item.message!} />\n </Box>\n );\n }\n if (item.type === 'line') {\n return (\n <Box key={item.id} paddingX={1}>\n <Text color=\"cyan\" bold>{item.isFirstLine ? '◆ ' : ' '}</Text>\n <Text>{item.text}</Text>\n </Box>\n );\n }\n if (item.type === 'tool-header') {\n const tc = item.toolCall!;\n const icon = getToolIcon(tc.name);\n const summary = getToolParamSummary(tc.name, tc.params);\n return (\n <Box key={item.id} paddingX={1} marginLeft={2}>\n <Box gap={1}>\n <Text color=\"yellow\">⏳</Text>\n <Text color=\"yellow\" bold>{icon} {tc.name}</Text>\n {summary ? <Text dimColor>{summary}</Text> : null}\n </Box>\n </Box>\n );\n }\n if (item.type === 'tool-done') {\n return (\n <Box key={item.id} paddingX={1} marginLeft={0}>\n <ToolCallLine toolCall={item.toolCall!} />\n </Box>\n );\n }\n return null;\n}\n\nexport const ChatArea = React.memo(function ChatArea({ messages }: ChatAreaProps) {\n const { staticMsgs, streamingMsg, otherDynamic } = splitMessages(messages);\n\n // 记住哪些消息已按行推入 Static(完成后不再用 MessageBubble 重复渲染)\n const streamedIds = useRef(new Set<string>());\n if (streamingMsg) {\n streamedIds.current.add(streamingMsg.id);\n }\n\n // ── 计算当前所有应该存在的 static items ──\n const currentItems: StaticItem[] = [];\n\n for (const msg of staticMsgs) {\n if (streamedIds.current.has(msg.id)) {\n const ignore: React.ReactNode[] = [];\n extractFromBlocks(msg, currentItems, ignore, false);\n } else {\n currentItems.push({ id: msg.id, type: 'message', message: msg });\n }\n }\n\n const dynamicNodes: React.ReactNode[] = [];\n if (streamingMsg) {\n extractFromBlocks(streamingMsg, currentItems, dynamicNodes, true);\n }\n\n // ── 去重累积:保证每个 ID 的 item 只出现一次 ──\n // Ink 的 <Static> 在 items 数组引用变化时可能重复渲染。\n // 用 ref 维护一个只增不减的累积数组,彻底避免重复。\n const seenIds = useRef(new Set<string>());\n const accumulated = useRef<StaticItem[]>([]);\n\n let hasNew = false;\n for (const item of currentItems) {\n if (!seenIds.current.has(item.id)) {\n seenIds.current.add(item.id);\n accumulated.current.push(item);\n hasNew = true;\n }\n }\n // 当有新 item 时,创建新数组引用让 Ink 感知变化\n if (hasNew) {\n accumulated.current = [...accumulated.current];\n }\n\n const staticItems = accumulated.current;\n\n // 流式消息无内容时显示占位符\n const showPlaceholder = streamingMsg && streamingMsg.blocks.length === 0;\n\n return (\n <Box flexDirection=\"column\">\n {staticItems.length > 0 && (\n <Static items={staticItems}>\n {renderStaticItem}\n </Static>\n )}\n\n {/* 动态区域:最多 1 行(部分文本行 或 部分代码行) */}\n {(dynamicNodes.length > 0 || showPlaceholder) && (\n <Box flexDirection=\"column\" paddingX={1}>\n {showPlaceholder && (\n <Box>\n <Text color=\"cyan\" bold>◆ </Text>\n <Text dimColor>...</Text>\n </Box>\n )}\n {dynamicNodes}\n </Box>\n )}\n\n {/* 其他动态消息(如确认弹窗) */}\n {otherDynamic.map(msg => (\n <Box key={msg.id} paddingX={1}>\n <MessageBubble message={msg} />\n </Box>\n ))}\n </Box>\n );\n});\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\ninterface InputAreaProps {\n onSubmit: (text: string) => void;\n isRunning: boolean;\n}\n\n/**\n * Custom text input that only accepts printable characters.\n * Immune to mouse/terminal escape sequence leaks.\n */\nfunction CleanTextInput({ onSubmit, placeholder }: { onSubmit: (text: string) => void; placeholder?: string }) {\n const [value, setValue] = useState('');\n const [cursor, setCursor] = useState(0);\n\n useInput((input, key) => {\n if (key.return) {\n const trimmed = value.trim();\n if (trimmed) {\n onSubmit(trimmed);\n }\n setValue('');\n setCursor(0);\n return;\n }\n if (key.backspace || key.delete) {\n if (cursor > 0) {\n setValue(prev => prev.slice(0, cursor - 1) + prev.slice(cursor));\n setCursor(prev => prev - 1);\n }\n return;\n }\n if (key.leftArrow) { setCursor(prev => Math.max(0, prev - 1)); return; }\n if (key.rightArrow) { setCursor(prev => Math.min(value.length, prev + 1)); return; }\n if (input === 'a' && key.ctrl) { setCursor(0); return; }\n if (input === 'e' && key.ctrl) { setCursor(value.length); return; }\n if (input === 'u' && key.ctrl) { setValue(prev => prev.slice(cursor)); setCursor(0); return; }\n\n if (key.ctrl || key.meta || key.escape) return;\n if (!input || input.length === 0) return;\n if (input.includes('\\x1b') || input.includes('\\x00')) return;\n if (/^(?:\\[<\\d+;\\d+;\\d+[Mm])+$/.test(input)) return;\n if (/^\\[<[0-9;Mm]*$/.test(input)) return;\n if (input === '[5~' || input === '[6~') return;\n for (let i = 0; i < input.length; i++) {\n const code = input.charCodeAt(i);\n if (code < 0x20 && code !== 0x09) return;\n if (code === 0x7f || (code >= 0x80 && code <= 0x9f)) return;\n }\n\n setValue(prev => prev.slice(0, cursor) + input + prev.slice(cursor));\n setCursor(prev => prev + input.length);\n });\n\n if (value.length === 0) {\n return (\n <>\n <Text inverse> </Text>\n <Text dimColor>{placeholder || ''}</Text>\n </>\n );\n }\n\n const before = value.slice(0, cursor);\n const at = cursor < value.length ? value[cursor] : ' ';\n const after = cursor < value.length ? value.slice(cursor + 1) : '';\n\n return (\n <>\n <Text>{before}</Text>\n <Text inverse>{at}</Text>\n <Text>{after}</Text>\n </>\n );\n}\n\nexport function InputArea({ onSubmit, isRunning }: InputAreaProps) {\n return (\n <Box paddingX={1}>\n <Text color={isRunning ? 'gray' : 'green'} bold>> </Text>\n {isRunning ? (\n <Text dimColor>等待回复中...</Text>\n ) : (\n <CleanTextInput\n onSubmit={onSubmit}\n placeholder=\"输入消息或 /命令...\"\n />\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { TodoPlan } from '../../../core/todo-store.js';\nimport type { SubAgentProgress } from '../../../core/sub-agent-tracker.js';\n\ninterface StatusBarProps {\n agentMode: string;\n collaboration: string;\n coderWorking: boolean;\n isRunning: boolean;\n modelName: string;\n todoPlan?: TodoPlan | null;\n subAgentProgress?: SubAgentProgress | null;\n}\n\nexport function StatusBar({ agentMode, collaboration, coderWorking, isRunning, modelName, todoPlan, subAgentProgress }: StatusBarProps) {\n const modeLabel = agentMode === 'dual' ? `dual(${collaboration})` : 'single';\n const todoProgress = todoPlan\n ? `${todoPlan.items.filter((i) => i.status === 'completed').length}/${todoPlan.items.length}`\n : null;\n\n return (\n <Box paddingX={1} gap={1}>\n <Text dimColor>──</Text>\n <Text bold>{modeLabel}</Text>\n <Text dimColor>▶</Text>\n <Text bold>{modelName}</Text>\n {coderWorking && (\n <>\n <Text dimColor>│</Text>\n <Text color=\"yellow\">⚙ coder</Text>\n </>\n )}\n {isRunning && !coderWorking && !subAgentProgress && (\n <>\n <Text dimColor>│</Text>\n <Text color=\"cyan\">thinking...</Text>\n </>\n )}\n {subAgentProgress && (\n <>\n <Text dimColor>│</Text>\n <Text color=\"magenta\">⚡ {subAgentProgress.completed + subAgentProgress.failed}/{subAgentProgress.total} agents</Text>\n </>\n )}\n {todoProgress && (\n <>\n <Text dimColor>│</Text>\n <Text color=\"cyan\">plan {todoProgress}</Text>\n </>\n )}\n <Text dimColor>│</Text>\n <Text dimColor>/help</Text>\n </Box>\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ConfirmPending, ConfirmResult } from '../state.js';\n\ninterface ConfirmPromptProps {\n confirm: ConfirmPending;\n onRespond: (result: ConfirmResult) => void;\n}\n\nconst OPTIONS: { key: 'allow' | 'always' | 'deny'; label: string }[] = [\n { key: 'allow', label: '允许' },\n { key: 'always', label: '始终允许' },\n { key: 'deny', label: '拒绝' },\n];\n\nfunction getToolDetails(toolName: string, params: Record<string, unknown>): { lines: string[]; label: string } {\n const lines: string[] = [];\n let label = toolName;\n\n switch (toolName) {\n case 'bash':\n label = 'Bash';\n lines.push(`命令: ${String(params['command'] || '')}`);\n break;\n case 'write-file':\n label = 'Write';\n lines.push(`文件: ${String(params['path'] || '')}`);\n if (params['content']) {\n const content = String(params['content']);\n const preview = content.length > 120 ? content.slice(0, 120) + '...' : content;\n lines.push(`内容: ${preview.split('\\n').slice(0, 3).join('\\n ')}`);\n }\n break;\n case 'edit-file':\n label = 'Edit';\n lines.push(`文件: ${String(params['path'] || '')}`);\n if (params['old_string']) {\n const old = String(params['old_string']);\n const preview = old.length > 80 ? old.slice(0, 80) + '...' : old;\n lines.push(`替换: ${preview}`);\n }\n if (params['new_string']) {\n const neu = String(params['new_string']);\n const preview = neu.length > 80 ? neu.slice(0, 80) + '...' : neu;\n lines.push(`为: ${preview}`);\n }\n break;\n case 'git':\n label = 'Git';\n lines.push(`命令: git ${String(params['command'] || '')}`);\n break;\n default:\n for (const [key, value] of Object.entries(params)) {\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n lines.push(`${key}: ${str.slice(0, 80)}`);\n }\n break;\n }\n\n return { lines, label };\n}\n\n/** Minimal clean text input — only accepts printable chars, ignores escape sequences */\nfunction FeedbackInput({ onSubmit }: { onSubmit: (text: string) => void }) {\n const [value, setValue] = useState('');\n const [cursor, setCursor] = useState(0);\n\n useInput((input, key) => {\n if (key.return) {\n onSubmit(value);\n setValue('');\n setCursor(0);\n return;\n }\n if (key.backspace || key.delete) {\n if (cursor > 0) {\n setValue(prev => prev.slice(0, cursor - 1) + prev.slice(cursor));\n setCursor(prev => prev - 1);\n }\n return;\n }\n if (key.leftArrow) { setCursor(prev => Math.max(0, prev - 1)); return; }\n if (key.rightArrow) { setCursor(prev => Math.min(value.length, prev + 1)); return; }\n if (key.escape) { onSubmit(''); return; } // Escape cancels feedback\n\n if (key.ctrl || key.meta) return;\n if (!input || input.length === 0) return;\n if (input.includes('\\x1b') || input.includes('\\x00')) return;\n for (let i = 0; i < input.length; i++) {\n const code = input.charCodeAt(i);\n if (code < 0x20) return;\n if (code === 0x7f || (code >= 0x80 && code <= 0x9f)) return;\n }\n\n setValue(prev => prev.slice(0, cursor) + input + prev.slice(cursor));\n setCursor(prev => prev + input.length);\n });\n\n if (value.length === 0) {\n return (\n <>\n <Text inverse> </Text>\n <Text dimColor>输入反馈指令给 AI...</Text>\n </>\n );\n }\n\n const before = value.slice(0, cursor);\n const at = cursor < value.length ? value[cursor] : ' ';\n const after = cursor < value.length ? value.slice(cursor + 1) : '';\n\n return (\n <>\n <Text>{before}</Text>\n <Text inverse>{at}</Text>\n <Text>{after}</Text>\n </>\n );\n}\n\nexport function ConfirmPrompt({ confirm, onRespond }: ConfirmPromptProps) {\n const [selected, setSelected] = useState(0);\n const [feedbackMode, setFeedbackMode] = useState(false);\n\n useInput((input, key) => {\n if (feedbackMode) return;\n\n // Left / right to navigate\n if (key.leftArrow) {\n setSelected((prev) => (prev - 1 + OPTIONS.length) % OPTIONS.length);\n } else if (key.rightArrow) {\n setSelected((prev) => (prev + 1) % OPTIONS.length);\n }\n // Enter to confirm selection\n else if (key.return) {\n onRespond(OPTIONS[selected]!.key);\n }\n // Shortcut keys\n else if (input === 'y' || input === 'Y') {\n onRespond('allow');\n } else if (input === 'n' || input === 'N') {\n onRespond('deny');\n } else if (input === 'a' || input === 'A') {\n onRespond('always');\n }\n // Tab to enter feedback mode\n else if (key.tab) {\n setFeedbackMode(true);\n }\n // Escape to deny\n else if (key.escape) {\n onRespond('deny');\n }\n }, { isActive: !feedbackMode });\n\n const { lines, label } = getToolDetails(confirm.toolName, confirm.params);\n\n // Feedback input mode\n if (feedbackMode) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n >\n <Text bold color=\"yellow\">{label}</Text>\n {lines.map((line, i) => (\n <Text key={i} dimColor>{line}</Text>\n ))}\n </Box>\n <Box paddingX={1} gap={1}>\n <Text color=\"cyan\">反馈: </Text>\n <FeedbackInput\n onSubmit={(text) => {\n const trimmed = text.trim();\n if (trimmed) {\n onRespond({ feedback: trimmed });\n } else {\n setFeedbackMode(false);\n }\n }}\n />\n </Box>\n <Box paddingX={1}>\n <Text dimColor>Enter 发送 Esc 返回选择</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Tool detail box */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n >\n <Text bold color=\"yellow\">{label}</Text>\n {lines.map((line, i) => (\n <Text key={i} dimColor>{line}</Text>\n ))}\n </Box>\n\n {/* Selection bar */}\n <Box marginTop={0} paddingX={1} gap={2}>\n {OPTIONS.map((opt, i) => {\n const isSelected = i === selected;\n return (\n <Box key={opt.key}>\n {isSelected ? (\n <Text bold color=\"cyan\" inverse> {opt.label} </Text>\n ) : (\n <Text dimColor> {opt.label} </Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Hint */}\n <Box paddingX={1}>\n <Text dimColor>\n ← → 选择 Enter 确认 y 允许 n 拒绝 a 始终 Tab 反馈\n </Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { TodoPlan } from '../../../core/todo-store.js';\n\ninterface TodoPanelProps {\n plan: TodoPlan;\n}\n\nfunction getStatusIcon(status: string): string {\n switch (status) {\n case 'completed':\n return '●';\n case 'in-progress':\n return '◐';\n default:\n return '○';\n }\n}\n\nfunction getStatusColor(status: string): string {\n switch (status) {\n case 'completed':\n return 'green';\n case 'in-progress':\n return 'yellow';\n default:\n return 'gray';\n }\n}\n\nexport function TodoPanel({ plan }: TodoPanelProps) {\n const completed = plan.items.filter((i) => i.status === 'completed').length;\n const total = plan.items.length;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n marginBottom={0}\n >\n <Box justifyContent=\"space-between\">\n <Text bold color=\"cyan\">\n Plan\n </Text>\n <Text dimColor>\n {completed}/{total}\n </Text>\n </Box>\n {plan.items.map((item) => (\n <Box key={item.id} gap={1}>\n <Text color={getStatusColor(item.status)}>\n {getStatusIcon(item.status)}\n </Text>\n <Text\n color={item.status === 'completed' ? 'green' : undefined}\n dimColor={item.status === 'pending'}\n >\n {item.title}\n </Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import React, { useReducer, useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ZenCodeConfig, CollaborationMode } from '../../config/types.js';\nimport type { Agent } from '../../core/agent.js';\nimport type { Orchestrator, OrchestratorCallbacks } from '../../core/dual-agent/orchestrator.js';\nimport type { ToolRegistry } from '../../tools/registry.js';\nimport type { TodoStore } from '../../core/todo-store.js';\nimport type { MemoStore } from '../../core/memo-store.js';\nimport type { SubAgentTracker } from '../../core/sub-agent-tracker.js';\nimport type { LLMClient } from '../../llm/client.js';\nimport { setStructuredConfirmHandler } from '../../tools/permission.js';\nimport type { ConfirmExecutionResult } from '../../tools/permission.js';\nimport { tuiReducer, createInitialState, type TuiAction, type ConfirmPending, type ConfirmResult } from './state.js';\nimport { createBridgeCallbacks, registerConfirmToolId } from './bridge.js';\nimport { createSpawnAgentsTool } from '../../tools/spawn-agents.js';\nimport { createTodoTool } from '../../tools/todo.js';\nimport { ChatArea } from './components/ChatArea.js';\nimport { InputArea } from './components/InputArea.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport { ConfirmPrompt } from './components/ConfirmPrompt.js';\nimport { TodoPanel } from './components/TodoPanel.js';\n\ninterface AppProps {\n config: ZenCodeConfig;\n client: LLMClient;\n agent: Agent;\n orchestrator: Orchestrator;\n registry: ToolRegistry;\n todoStore: TodoStore;\n memoStore: MemoStore;\n subAgentTracker: SubAgentTracker;\n}\n\nexport function App({ config, client, agent, orchestrator, registry, todoStore, memoStore, subAgentTracker }: AppProps) {\n const [state, dispatch] = useReducer(\n tuiReducer,\n createInitialState(\n config.model,\n config.agent_mode,\n config.collaboration,\n ),\n );\n\n // Reset counter: forces full re-mount when /clear is used (like kilocode)\n const [resetKey, setResetKey] = useState(0);\n\n const agentRef = useRef(agent);\n const orchestratorRef = useRef(orchestrator);\n const todoStoreRef = useRef(todoStore);\n const subAgentTrackerRef = useRef(subAgentTracker);\n agentRef.current = agent;\n orchestratorRef.current = orchestrator;\n todoStoreRef.current = todoStore;\n subAgentTrackerRef.current = subAgentTracker;\n\n // Subscribe to TodoStore changes\n useEffect(() => {\n return todoStoreRef.current.subscribe((plan) => {\n dispatch({ type: 'SET_TODO_PLAN', plan });\n });\n }, []);\n\n // Subscribe to SubAgentTracker changes (throttled to reduce re-renders)\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let latest: import('../../core/sub-agent-tracker.js').SubAgentProgress | null = null;\n\n const unsub = subAgentTrackerRef.current.subscribe((progress) => {\n latest = progress;\n // null = finished, dispatch immediately\n if (progress === null) {\n if (timer) { clearTimeout(timer); timer = null; }\n dispatch({ type: 'SET_SUB_AGENT_PROGRESS', progress: null });\n return;\n }\n // Throttle: at most once per 2000ms(减少动态区域重绘)\n if (!timer) {\n dispatch({ type: 'SET_SUB_AGENT_PROGRESS', progress });\n timer = setTimeout(() => {\n timer = null;\n if (latest) dispatch({ type: 'SET_SUB_AGENT_PROGRESS', progress: latest });\n }, 2000);\n }\n });\n\n return () => { unsub(); if (timer) clearTimeout(timer); };\n }, []);\n\n // Find active confirm pending\n const confirmPending = state.messages.reduce<ConfirmPending | undefined>(\n (found, msg) => found || msg.confirmPending,\n undefined,\n );\n\n // --- Register structured confirm handler ---\n useEffect(() => {\n setStructuredConfirmHandler((toolName, params) => {\n return new Promise<ConfirmExecutionResult>((resolve) => {\n const id = `confirm-${Date.now()}`;\n registerConfirmToolId(toolName, id);\n dispatch({\n type: 'TOOL_CONFIRMING',\n id,\n name: toolName,\n params,\n resolve: (result: ConfirmResult) => {\n if (result === 'always') {\n registry.addAutoApprove(toolName);\n resolve({ approved: true });\n } else if (result === 'allow') {\n resolve({ approved: true });\n } else if (result === 'deny') {\n resolve({ approved: false });\n } else {\n resolve({ approved: false, feedback: result.feedback });\n }\n },\n });\n });\n });\n return () => { setStructuredConfirmHandler(null); };\n }, [registry]);\n\n // --- Handle user message submission ---\n const handleSubmit = useCallback(async (text: string) => {\n if (text.startsWith('/')) {\n handleSlashCommand(text, {\n config, orchestrator: orchestratorRef.current, registry, dispatch, setResetKey,\n client, todoStore, memoStore, subAgentTracker,\n });\n return;\n }\n\n dispatch({ type: 'ADD_USER_MESSAGE', text });\n dispatch({ type: 'START_ASSISTANT' });\n dispatch({ type: 'SET_RUNNING', running: true });\n\n const callbacks = createBridgeCallbacks(dispatch);\n\n try {\n if (config.agent_mode === 'single') {\n await agentRef.current.run(text, callbacks);\n } else {\n await orchestratorRef.current.run(text, callbacks as unknown as OrchestratorCallbacks);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n dispatch({ type: 'SET_ERROR', error: msg });\n }\n\n (callbacks as any)._stopBatcher?.();\n dispatch({ type: 'FINISH_STREAMING' });\n dispatch({ type: 'SET_RUNNING', running: false });\n }, [config]);\n\n // --- Handle confirm response ---\n const handleConfirmResponse = useCallback((result: ConfirmResult) => {\n if (confirmPending) {\n confirmPending.resolve(result);\n dispatch({ type: 'CONFIRM_RESPONDED', id: '' });\n const approved = result === 'allow' || result === 'always';\n // Only update confirming → running for approved tools.\n // Denied tools will be handled by bridge's onDenied callback (with feedback).\n if (approved) {\n for (const msg of state.messages) {\n for (const block of msg.blocks) {\n if (block.type === 'tool' && block.toolCall.status === 'confirming') {\n dispatch({ type: 'TOOL_EXECUTING', id: block.toolCall.id, name: block.toolCall.name, params: block.toolCall.params });\n }\n }\n }\n }\n }\n }, [confirmPending, state.messages]);\n\n // --- Keyboard shortcuts ---\n useInput((input, key) => {\n if (input === 'c' && key.ctrl) {\n if (state.isRunning) {\n dispatch({ type: 'SET_RUNNING', running: false });\n dispatch({ type: 'FINISH_STREAMING' });\n } else {\n process.exit(0);\n }\n return;\n }\n if (input === 'd' && key.ctrl) {\n process.exit(0);\n }\n });\n\n return (\n <Box key={resetKey} flexDirection=\"column\">\n {/* Messages area */}\n <Box flexDirection=\"column\" overflow=\"hidden\">\n <ChatArea messages={state.messages} />\n </Box>\n\n {/* Error */}\n {state.error && (\n <Box\n borderStyle=\"round\"\n borderColor=\"red\"\n paddingX={1}\n marginBottom={1}\n >\n <Text color=\"red\" bold>✖ Error: </Text>\n <Text color=\"red\">{state.error}</Text>\n </Box>\n )}\n\n {/* Confirm prompt */}\n {confirmPending && (\n <ConfirmPrompt\n confirm={confirmPending}\n onRespond={handleConfirmResponse}\n />\n )}\n\n {/* Todo panel */}\n {state.todoPlan && (\n <TodoPanel plan={state.todoPlan} />\n )}\n\n {/* Input */}\n <InputArea\n onSubmit={handleSubmit}\n isRunning={state.isRunning || !!confirmPending}\n />\n\n {/* Status bar */}\n <StatusBar\n agentMode={state.agentMode}\n collaboration={state.collaboration}\n coderWorking={state.coderWorking}\n isRunning={state.isRunning}\n modelName={state.modelName}\n todoPlan={state.todoPlan}\n subAgentProgress={state.subAgentProgress}\n />\n </Box>\n );\n}\n\n// --- Slash commands ---\ninterface SlashCommandContext {\n config: ZenCodeConfig;\n orchestrator: Orchestrator | undefined;\n registry: ToolRegistry;\n dispatch: React.Dispatch<TuiAction>;\n setResetKey: React.Dispatch<React.SetStateAction<number>>;\n client: LLMClient;\n todoStore: TodoStore;\n memoStore: MemoStore;\n subAgentTracker: SubAgentTracker;\n}\n\nfunction handleSlashCommand(input: string, ctx: SlashCommandContext) {\n const { config, orchestrator, registry, dispatch, setResetKey, client, todoStore, memoStore, subAgentTracker } = ctx;\n const parts = input.trim().split(/\\s+/);\n const command = parts[0];\n\n switch (command) {\n case '/help':\n dispatch({ type: 'ADD_USER_MESSAGE', text: input });\n dispatch({ type: 'START_ASSISTANT' });\n dispatch({\n type: 'APPEND_CONTENT',\n text: `可用命令:\n /help 显示此帮助信息\n /mode [模式] 切换协作模式 (delegated/autonomous/controlled)\n /single 切换到单 Agent 模式\n /dual 切换到双 Agent 模式\n /parallel 切换并行子 Agent 功能 on/off\n /todo 切换 todo 计划功能 on/off\n /clear 清空对话历史\n /info 显示当前配置\n Ctrl+C 取消当前请求 / 退出\n Ctrl+D 退出`,\n });\n dispatch({ type: 'FINISH_STREAMING' });\n break;\n\n case '/mode': {\n const mode = parts[1];\n if (!mode) {\n dispatch({ type: 'ADD_USER_MESSAGE', text: input });\n dispatch({ type: 'START_ASSISTANT' });\n dispatch({\n type: 'APPEND_CONTENT',\n text: `当前协作模式: ${config.collaboration}\\n可选: delegated, autonomous, controlled`,\n });\n dispatch({ type: 'FINISH_STREAMING' });\n } else if (['delegated', 'autonomous', 'controlled'].includes(mode)) {\n config.collaboration = mode as CollaborationMode;\n orchestrator?.setMode(mode as CollaborationMode);\n dispatch({ type: 'SET_MODE', agentMode: config.agent_mode, collaboration: mode });\n }\n break;\n }\n\n case '/single':\n config.agent_mode = 'single';\n dispatch({ type: 'SET_MODE', agentMode: 'single', collaboration: config.collaboration });\n break;\n\n case '/dual':\n config.agent_mode = 'dual';\n dispatch({ type: 'SET_MODE', agentMode: 'dual', collaboration: config.collaboration });\n break;\n\n case '/clear':\n dispatch({ type: 'CLEAR_MESSAGES' });\n setResetKey(prev => prev + 1);\n break;\n\n case '/parallel': {\n const current = config.features.parallel_agents;\n const next = current === 'on' ? 'off' : 'on';\n config.features.parallel_agents = next;\n if (next === 'off') {\n registry.unregister('spawn-agents');\n } else if (!registry.has('spawn-agents')) {\n registry.register(createSpawnAgentsTool(client, registry, config, subAgentTracker, memoStore));\n }\n dispatch({ type: 'ADD_USER_MESSAGE', text: input });\n dispatch({ type: 'START_ASSISTANT' });\n dispatch({ type: 'APPEND_CONTENT', text: `并行子 Agent 功能已${next === 'on' ? '开启' : '关闭'}` });\n dispatch({ type: 'FINISH_STREAMING' });\n break;\n }\n\n case '/todo': {\n const current = config.features.todo;\n const next = current === 'on' ? 'off' : 'on';\n config.features.todo = next;\n if (next === 'off') {\n registry.unregister('todo');\n } else if (!registry.has('todo')) {\n registry.register(createTodoTool(todoStore));\n }\n dispatch({ type: 'ADD_USER_MESSAGE', text: input });\n dispatch({ type: 'START_ASSISTANT' });\n dispatch({ type: 'APPEND_CONTENT', text: `Todo 计划功能已${next === 'on' ? '开启' : '关闭'}` });\n dispatch({ type: 'FINISH_STREAMING' });\n break;\n }\n\n case '/info':\n dispatch({ type: 'ADD_USER_MESSAGE', text: input });\n dispatch({ type: 'START_ASSISTANT' });\n dispatch({\n type: 'APPEND_CONTENT',\n text: `模型: ${config.model}\\nAgent 模式: ${config.agent_mode}\\n协作模式: ${config.collaboration}\\n基础 URL: ${config.base_url}`,\n });\n dispatch({ type: 'FINISH_STREAMING' });\n break;\n\n default:\n dispatch({ type: 'ADD_USER_MESSAGE', text: input });\n dispatch({ type: 'START_ASSISTANT' });\n dispatch({\n type: 'APPEND_CONTENT',\n text: `未知命令: ${command}。输入 /help 查看帮助。`,\n });\n dispatch({ type: 'FINISH_STREAMING' });\n break;\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport type { ZenCodeConfig } from '../../config/types.js';\nimport { createLLMClient } from '../../llm/client.js';\nimport { ToolRegistry } from '../../tools/registry.js';\nimport { registerCoreTools } from '../../tools/register.js';\nimport { Agent } from '../../core/agent.js';\nimport { Orchestrator } from '../../core/dual-agent/orchestrator.js';\nimport { buildPrompt } from '../../core/prompt/builder.js';\nimport { TodoStore } from '../../core/todo-store.js';\nimport { MemoStore } from '../../core/memo-store.js';\nimport { SubAgentTracker } from '../../core/sub-agent-tracker.js';\nimport { createSpawnAgentsTool } from '../../tools/spawn-agents.js';\nimport { createTodoTool } from '../../tools/todo.js';\nimport { createMemoTool } from '../../tools/memo.js';\nimport { App } from './App.js';\n\ninterface TuiOptions {\n config: ZenCodeConfig;\n}\n\n/**\n * Start the full-screen TUI using Ink (React for CLI)\n */\nexport async function startTui(options: TuiOptions): Promise<void> {\n const { config } = options;\n\n // Build system prompt\n const { systemPrompt } = await buildPrompt(config);\n\n // Register tools\n const registry = new ToolRegistry();\n registerCoreTools(registry);\n registry.setPermissions(config.permissions);\n\n // Create LLM client\n const client = createLLMClient({\n apiKey: config.api_key,\n baseURL: config.base_url,\n model: config.model,\n temperature: config.temperature,\n maxTokens: config.max_tokens,\n });\n\n // Create stores\n const todoStore = new TodoStore();\n const memoStore = new MemoStore();\n const subAgentTracker = new SubAgentTracker();\n\n // Register new tools based on feature flags\n if (config.features.parallel_agents === 'on') {\n registry.register(createSpawnAgentsTool(client, registry, config, subAgentTracker, memoStore));\n }\n if (config.features.todo === 'on') {\n registry.register(createTodoTool(todoStore));\n }\n registry.register(createMemoTool(memoStore));\n\n // Create both agents so /single and /dual switching works\n const agent = new Agent(client, registry, config, systemPrompt);\n const orchestrator = new Orchestrator(registry, config, systemPrompt, memoStore);\n\n // Render the full-screen TUI\n const { waitUntilExit } = render(\n <App\n config={config}\n client={client}\n agent={agent}\n orchestrator={orchestrator}\n registry={registry}\n todoStore={todoStore}\n memoStore={memoStore}\n subAgentTracker={subAgentTracker}\n />,\n { patchConsole: true },\n );\n\n await waitUntilExit();\n}\n","import { Command } from 'commander';\nimport type { CliOptions } from '../config/loader.js';\nimport { loadConfig } from '../config/loader.js';\nimport { createLLMClient } from '../llm/client.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport { registerCoreTools } from '../tools/register.js';\nimport { Agent, type AgentCallbacks } from '../core/agent.js';\nimport { Orchestrator, type OrchestratorCallbacks } from '../core/dual-agent/orchestrator.js';\nimport { buildPrompt } from '../core/prompt/builder.js';\nimport { startRepl } from './repl.js';\nimport { TodoStore } from '../core/todo-store.js';\nimport { MemoStore } from '../core/memo-store.js';\nimport { createSpawnAgentsTool } from '../tools/spawn-agents.js';\nimport { createTodoTool } from '../tools/todo.js';\nimport { createMemoTool } from '../tools/memo.js';\nimport { createThinkFilter } from './tui/bridge.js';\nimport { printStream, printToolCall, printToolResult, printError, printInfo } from './ui.js';\n\nexport { registerCoreTools };\n\n/**\n * 单次执行模式(非交互式)\n */\nasync function runOnce(prompt: string, config: ReturnType<typeof loadConfig>): Promise<void> {\n const { systemPrompt } = await buildPrompt(config);\n const registry = new ToolRegistry();\n registerCoreTools(registry);\n registry.setPermissions(config.permissions);\n\n const client = createLLMClient({\n apiKey: config.api_key,\n baseURL: config.base_url,\n model: config.model,\n temperature: config.temperature,\n maxTokens: config.max_tokens,\n });\n\n // Register new tools based on feature flags\n const todoStore = new TodoStore();\n const memoStore = new MemoStore();\n if (config.features.parallel_agents === 'on') {\n registry.register(createSpawnAgentsTool(client, registry, config, undefined, memoStore));\n }\n if (config.features.todo === 'on') {\n registry.register(createTodoTool(todoStore));\n }\n registry.register(createMemoTool(memoStore));\n\n let isStreaming = false;\n const thinkFilter = createThinkFilter();\n const callbacks: AgentCallbacks & OrchestratorCallbacks = {\n onContent: (text) => {\n const filtered = thinkFilter(text);\n if (!filtered) return;\n if (!isStreaming) {\n isStreaming = true;\n }\n printStream(filtered);\n },\n onToolExecuting: (name, params) => {\n if (isStreaming) {\n process.stdout.write('\\n');\n isStreaming = false;\n }\n printToolCall(name, params);\n },\n onToolResult: (name, result, truncated) => {\n printToolResult(name, result, truncated);\n },\n onCoderStart: () => {\n if (isStreaming) {\n process.stdout.write('\\n');\n isStreaming = false;\n }\n printInfo('编码 Agent 开始工作...');\n },\n onCoderEnd: () => {\n printInfo('编码 Agent 完成');\n },\n onError: (err) => {\n printError(err.message);\n },\n };\n\n try {\n if (config.agent_mode === 'single') {\n const agent = new Agent(client, registry, config, systemPrompt);\n await agent.run(prompt, callbacks);\n } else {\n const orchestrator = new Orchestrator(registry, config, systemPrompt, memoStore);\n await orchestrator.run(prompt, callbacks);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n printError(msg);\n process.exit(1);\n }\n\n if (isStreaming) {\n process.stdout.write('\\n');\n }\n}\n\n/**\n * 创建 CLI 程序\n */\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('zencode')\n .description('极简 CLI AI 编程工具')\n .version('0.1.0')\n .option('-m, --model <model>', '指定模型名称')\n .option('-k, --api-key <key>', 'API 密钥')\n .option('-u, --base-url <url>', 'API 基础 URL')\n .option('--single', '使用单 Agent 模式')\n .option('--dual', '使用双 Agent 模式')\n .option('--mode <mode>', '协作模式 (delegated/autonomous/controlled)')\n .option('--simple', '使用简单 REPL 模式(非全屏 TUI)')\n .argument('[prompt...]', '直接执行的提示词(非交互式)')\n .action(async (promptParts: string[], opts: CliOptions & { simple?: boolean }) => {\n const config = loadConfig(opts);\n\n // 验证 API key\n if (!config.api_key) {\n printError('未设置 API 密钥。请通过以下方式之一设置:');\n printError(' 1. 环境变量 ZENCODE_API_KEY');\n printError(' 2. 配置文件 ~/.zencode/config.yaml 中设置 api_key');\n printError(' 3. CLI 参数 --api-key');\n process.exit(1);\n }\n\n const prompt = promptParts.join(' ');\n\n if (prompt) {\n // 单次执行模式\n await runOnce(prompt, config);\n } else if (opts.simple) {\n // 简单 REPL 模式(旧版)\n await startRepl({ config });\n } else {\n // 全屏 TUI 模式(默认)\n const { startTui } = await import('./tui/index.js');\n await startTui({ config });\n }\n });\n\n return program;\n}\n","import * as readline from 'node:readline';\nimport type { ZenCodeConfig, CollaborationMode } from '../config/types.js';\nimport { createLLMClient, type LLMClient } from '../llm/client.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport { Agent, type AgentCallbacks } from '../core/agent.js';\nimport { Orchestrator, type OrchestratorCallbacks } from '../core/dual-agent/orchestrator.js';\nimport { buildPrompt } from '../core/prompt/builder.js';\nimport { registerCoreTools } from '../tools/register.js';\nimport { setConfirmHandler } from '../tools/permission.js';\nimport { TodoStore } from '../core/todo-store.js';\nimport { MemoStore } from '../core/memo-store.js';\nimport { createSpawnAgentsTool } from '../tools/spawn-agents.js';\nimport { createTodoTool } from '../tools/todo.js';\nimport { createMemoTool } from '../tools/memo.js';\nimport { createThinkFilter } from './tui/bridge.js';\nimport {\n printWelcome,\n printStream,\n printToolCall,\n printToolResult,\n printError,\n printInfo,\n printSuccess,\n printWarning,\n} from './ui.js';\n\ninterface ReplOptions {\n config: ZenCodeConfig;\n}\n\n/**\n * 处理斜杠命令\n */\nfunction handleSlashCommand(\n input: string,\n context: {\n config: ZenCodeConfig;\n orchestrator?: Orchestrator;\n registry: ToolRegistry;\n client: LLMClient;\n todoStore: TodoStore;\n memoStore: MemoStore;\n setMode?: (mode: CollaborationMode) => void;\n },\n): boolean {\n const parts = input.trim().split(/\\s+/);\n const command = parts[0];\n\n switch (command) {\n case '/help':\n console.log(`\n可用命令:\n /help 显示此帮助信息\n /mode [模式] 切换协作模式 (delegated/autonomous/controlled)\n /single 切换到单 Agent 模式\n /dual 切换到双 Agent 模式\n /parallel 切换并行子 Agent 功能 on/off\n /todo 切换 todo 计划功能 on/off\n /clear 清空对话历史\n /info 显示当前配置\n /exit 退出\n`);\n return true;\n\n case '/mode': {\n const mode = parts[1];\n if (!mode) {\n printInfo(`当前协作模式: ${context.config.collaboration}`);\n printInfo('可选: delegated, autonomous, controlled');\n return true;\n }\n if (['delegated', 'autonomous', 'controlled'].includes(mode)) {\n context.config.collaboration = mode as CollaborationMode;\n context.setMode?.(mode as CollaborationMode);\n printSuccess(`已切换到 ${mode} 模式`);\n } else {\n printError(`无效模式: ${mode}。可选: delegated, autonomous, controlled`);\n }\n return true;\n }\n\n case '/single':\n context.config.agent_mode = 'single';\n printSuccess('已切换到单 Agent 模式');\n return true;\n\n case '/dual':\n context.config.agent_mode = 'dual';\n printSuccess('已切换到双 Agent 模式');\n return true;\n\n case '/clear':\n printSuccess('对话历史已清空(将在下次对话时生效)');\n return true;\n\n case '/parallel': {\n const current = context.config.features.parallel_agents;\n const next = current === 'on' ? 'off' : 'on';\n context.config.features.parallel_agents = next;\n if (next === 'off') {\n context.registry.unregister('spawn-agents');\n } else if (!context.registry.has('spawn-agents')) {\n context.registry.register(\n createSpawnAgentsTool(context.client, context.registry, context.config, undefined, context.memoStore),\n );\n }\n printSuccess(`并行子 Agent 功能已${next === 'on' ? '开启' : '关闭'}`);\n return true;\n }\n\n case '/todo': {\n const current = context.config.features.todo;\n const next = current === 'on' ? 'off' : 'on';\n context.config.features.todo = next;\n if (next === 'off') {\n context.registry.unregister('todo');\n } else if (!context.registry.has('todo')) {\n context.registry.register(createTodoTool(context.todoStore));\n }\n printSuccess(`Todo 计划功能已${next === 'on' ? '开启' : '关闭'}`);\n return true;\n }\n\n case '/info':\n printInfo(`模型: ${context.config.model}`);\n printInfo(`Agent 模式: ${context.config.agent_mode}`);\n printInfo(`协作模式: ${context.config.collaboration}`);\n printInfo(`基础 URL: ${context.config.base_url}`);\n return true;\n\n case '/exit':\n process.exit(0);\n\n default:\n printWarning(`未知命令: ${command}。输入 /help 查看帮助。`);\n return true;\n }\n}\n\n/**\n * 启动交互式 REPL\n */\nexport async function startRepl(options: ReplOptions): Promise<void> {\n const { config } = options;\n\n // 构建提示词\n const { systemPrompt } = await buildPrompt(config);\n\n // 注册工具\n const registry = new ToolRegistry();\n registerCoreTools(registry);\n registry.setPermissions(config.permissions);\n\n // 创建 LLM 客户端\n const client = createLLMClient({\n apiKey: config.api_key,\n baseURL: config.base_url,\n model: config.model,\n temperature: config.temperature,\n maxTokens: config.max_tokens,\n });\n\n // 创建 stores 并注册新工具\n const todoStore = new TodoStore();\n const memoStore = new MemoStore();\n if (config.features.parallel_agents === 'on') {\n registry.register(createSpawnAgentsTool(client, registry, config, undefined, memoStore));\n }\n if (config.features.todo === 'on') {\n registry.register(createTodoTool(todoStore));\n }\n registry.register(createMemoTool(memoStore));\n\n // 根据模式创建 Agent\n let singleAgent: Agent | undefined;\n let orchestrator: Orchestrator | undefined;\n\n if (config.agent_mode === 'single') {\n singleAgent = new Agent(client, registry, config, systemPrompt);\n } else {\n orchestrator = new Orchestrator(registry, config, systemPrompt, memoStore);\n }\n\n // 打印欢迎信息\n const modeLabel = config.agent_mode === 'dual'\n ? `双Agent (${config.collaboration})`\n : '单Agent';\n printWelcome(config.model, modeLabel);\n\n // 创建 readline 接口\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: '> ',\n historySize: 100,\n });\n\n // 注入确认处理函数:复用 REPL 的 readline\n // 先 pause REPL readline,用原始 stdin 读取,再 resume\n setConfirmHandler(async (promptText: string): Promise<boolean> => {\n return new Promise<boolean>((resolve) => {\n // 直接用 process.stdout 输出提示,用 process.stdin 读取一行\n process.stdout.write(promptText);\n const onData = (data: Buffer) => {\n process.stdin.removeListener('data', onData);\n process.stdin.pause();\n const answer = data.toString().trim().toLowerCase();\n resolve(answer === 'y');\n };\n process.stdin.resume();\n process.stdin.once('data', onData);\n });\n });\n\n rl.prompt();\n\n rl.on('line', async (line) => {\n const input = line.trim();\n if (!input) {\n rl.prompt();\n return;\n }\n\n // 处理斜杠命令\n if (input.startsWith('/')) {\n const handled = handleSlashCommand(input, {\n config,\n orchestrator,\n registry,\n client,\n todoStore,\n memoStore,\n setMode: (mode) => {\n orchestrator?.setMode(mode);\n },\n });\n if (handled) {\n rl.prompt();\n return;\n }\n }\n\n // 切换模式可能需要重新创建 agent\n if (config.agent_mode === 'single' && !singleAgent) {\n singleAgent = new Agent(client, registry, config, systemPrompt);\n orchestrator = undefined;\n } else if (config.agent_mode === 'dual' && !orchestrator) {\n orchestrator = new Orchestrator(registry, config, systemPrompt, memoStore);\n singleAgent = undefined;\n }\n\n // 暂停 REPL readline,防止和确认弹窗抢 stdin\n rl.pause();\n\n // 构建回调\n let isStreaming = false;\n const thinkFilter = createThinkFilter();\n const callbacks: AgentCallbacks & OrchestratorCallbacks = {\n onContent: (text) => {\n const filtered = thinkFilter(text);\n if (!filtered) return;\n if (!isStreaming) {\n isStreaming = true;\n process.stdout.write('\\n');\n }\n printStream(filtered);\n },\n onToolExecuting: (name, params) => {\n if (isStreaming) {\n process.stdout.write('\\n');\n isStreaming = false;\n }\n printToolCall(name, params);\n },\n onToolResult: (name, result, truncated) => {\n printToolResult(name, result, truncated);\n },\n onCoderStart: () => {\n if (isStreaming) {\n process.stdout.write('\\n');\n isStreaming = false;\n }\n printInfo('编码 Agent 开始工作...');\n },\n onCoderEnd: () => {\n printInfo('编码 Agent 完成');\n },\n onError: (err) => {\n if (isStreaming) {\n process.stdout.write('\\n');\n isStreaming = false;\n }\n printError(err.message);\n },\n };\n\n try {\n if (config.agent_mode === 'single' && singleAgent) {\n await singleAgent.run(input, callbacks);\n } else if (orchestrator) {\n await orchestrator.run(input, callbacks);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n printError(msg);\n }\n\n if (isStreaming) {\n process.stdout.write('\\n');\n }\n console.log(); // 空行分隔\n\n // 恢复 REPL readline\n rl.resume();\n rl.prompt();\n });\n\n rl.on('close', () => {\n console.log('\\n再见!');\n process.exit(0);\n });\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport { marked } from 'marked';\nimport * as _markedTerminal from 'marked-terminal';\nimport { createTwoFilesPatch } from 'diff';\n\n// 配置 marked 使用终端渲染器\n// marked-terminal v7: named export 'markedTerminal' is the factory, default is the old Renderer class\nconst markedTerminal = (_markedTerminal as any).markedTerminal as () => any;\nmarked.use(markedTerminal());\n\n/**\n * 渲染 Markdown 到终端\n */\nexport function renderMarkdown(text: string): string {\n return (marked.parse(text) as string).trim();\n}\n\n/**\n * 创建加载动画\n */\nexport function createSpinner(text: string): Ora {\n return ora({ text, color: 'cyan' });\n}\n\n/**\n * 打印用户输入提示\n */\nexport function printPrompt(): void {\n process.stdout.write(chalk.green('> '));\n}\n\n/**\n * 打印助手回复\n */\nexport function printAssistant(text: string): void {\n console.log(renderMarkdown(text));\n}\n\n/**\n * 打印流式内容(不换行)\n */\nexport function printStream(text: string): void {\n process.stdout.write(text);\n}\n\n/**\n * 打印工具调用信息\n */\nexport function printToolCall(toolName: string, params: Record<string, unknown>): void {\n let detail = '';\n if (toolName === 'bash' && params['command']) {\n detail = ` ${chalk.dim(String(params['command']).slice(0, 80))}`;\n } else if ((toolName === 'read-file' || toolName === 'write-file' || toolName === 'edit-file') && params['path']) {\n detail = ` ${chalk.dim(String(params['path']))}`;\n } else if (toolName === 'glob' && params['pattern']) {\n detail = ` ${chalk.dim(String(params['pattern']))}`;\n } else if (toolName === 'grep' && params['pattern']) {\n detail = ` ${chalk.dim(String(params['pattern']))}`;\n } else if (toolName === 'spawn-agents' && params['tasks']) {\n const tasks = params['tasks'] as { description: string }[];\n detail = ` ${chalk.dim(`${tasks.length} 个并行任务`)}`;\n } else if (toolName === 'todo' && params['action']) {\n const action = String(params['action']);\n const id = params['id'] ? ` [${params['id']}]` : '';\n detail = ` ${chalk.dim(`${action}${id}`)}`;\n } else if (toolName === 'memo' && params['action']) {\n const action = String(params['action']);\n const key = params['key'] ? ` [${params['key']}]` : '';\n detail = ` ${chalk.dim(`${action}${key}`)}`;\n }\n const icon = toolName === 'spawn-agents' ? '⚡' : toolName === 'todo' ? '📋' : toolName === 'memo' ? '📝' : '⚙';\n console.log(chalk.yellow(` ${icon} ${toolName}`) + detail);\n}\n\n/**\n * 打印工具执行结果\n */\nexport function printToolResult(toolName: string, result: string, truncated: boolean): void {\n if (truncated) {\n console.log(chalk.dim(` ✓ ${toolName} (输出已截断)`));\n } else {\n const lines = result.split('\\n').length;\n console.log(chalk.dim(` ✓ ${toolName} (${lines} 行)`));\n }\n}\n\n/**\n * 打印错误信息\n */\nexport function printError(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * 打印信息\n */\nexport function printInfo(message: string): void {\n console.log(chalk.cyan(`ℹ ${message}`));\n}\n\n/**\n * 打印警告\n */\nexport function printWarning(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * 打印成功消息\n */\nexport function printSuccess(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * 打印 diff\n */\nexport function printDiff(oldContent: string, newContent: string, filePath: string): void {\n const patch = createTwoFilesPatch(filePath, filePath, oldContent, newContent);\n const lines = patch.split('\\n');\n for (const line of lines) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n console.log(chalk.green(line));\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n console.log(chalk.red(line));\n } else if (line.startsWith('@@')) {\n console.log(chalk.cyan(line));\n } else {\n console.log(chalk.dim(line));\n }\n }\n}\n\n/**\n * 打印模式信息\n */\nexport function printModeInfo(mode: string, isDouble: boolean): void {\n const modeType = isDouble ? '双Agent' : '单Agent';\n console.log(chalk.cyan(`模式: ${modeType}${isDouble ? ` (${mode})` : ''}`));\n}\n\n/**\n * 打印欢迎信息\n */\nexport function printWelcome(modelName: string, mode: string): void {\n console.log(chalk.bold.cyan('\\n ZenCode') + chalk.dim(' - 极简 AI 编程助手\\n'));\n console.log(chalk.dim(` 模型: ${modelName}`));\n console.log(chalk.dim(` 模式: ${mode}`));\n console.log(chalk.dim(` 输入 /help 查看命令,Ctrl+C 退出\\n`));\n}\n","import { createCli } from '../src/cli/index.js';\n\nconst program = createCli();\nprogram.parse();\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","newContent","resolve","fs","path","stat","os","fs","path","fs","id","Box","Text","jsx","jsxs","MessageBubble","React","Box","Text","jsx","jsxs","ChatArea","Box","Text","jsx","jsxs","Box","Text","Fragment","jsx","jsxs","useState","Box","Text","useInput","Fragment","jsx","jsxs","Box","Text","jsx","jsxs","useRef","useState","Box","Text","useInput","jsx","jsxs","resolve","handleSlashCommand","jsx","chalk","markedTerminal","chalk","chalk","resolve","program","startTui"]}
|