Commit Graph
100 Commits
Author SHA1 Message Date
kurihada 3849bec7de refactor(core): 更新内置命令的 agent 配置
- /test, /fix, /commit 使用 general agent
- /explain 使用 explore agent (更适合代码解释)
- /help 使用 guide agent (更适合帮助信息)
2025-12-17 14:53:35 +08:00
kurihada 5d1db127b2 refactor(core): 重命名 build agent 为 general agent
- build.ts 重命名为 general.ts
- buildAgent 重命名为 generalAgent
- 更新相关导出和测试
2025-12-17 14:50:40 +08:00
kurihada 5a6925aef3 feat(core): 添加后台 Shell 管理功能
- 新增 ShellManager 管理后台 Shell 进程生命周期
- bash 工具支持 run_in_background 参数在后台运行命令
- 新增 kill_shell 工具用于终止后台 Shell
- task_output 工具同时支持获取 Agent 和 Shell 任务输出
- 支持超时控制、输出限制和优雅终止
2025-12-17 14:36:38 +08:00
kurihada 72120b72c8 feat(core): build/plan agent 添加完整的 plan 模式工具 2025-12-17 14:23:14 +08:00
kurihada 036bdafd1e refactor(core): task_output 工具使用外部描述文件 2025-12-17 14:18:08 +08:00
kurihada f55bd8f526 refactor(core): 重命名 agent_output 为 task_output
- 删除 agent_output.ts,新增 task_output.ts
- 更新工具导出、注册和描述映射
- 更新 build/plan agent 预设的工具列表
- 更新 task 工具中的相关引用
2025-12-17 14:15:49 +08:00
kurihada 78551d68f3 feat(core): ToolParameter 支持 default、minimum、maximum、enum 字段
- 扩展 ToolParameter 类型,新增 default/minimum/maximum/enum 可选字段
- 更新 buildZodSchema 函数处理 enum 和 min/max 约束
- MCP 工具适配器解析 JSON Schema 中的扩展字段
- task_output 工具使用新字段替代 description 中的约束说明
- 新增单元测试覆盖所有扩展字段
2025-12-17 14:15:09 +08:00
kurihada fe6ef9be9b refactor(core): 移除 todoread 工具
todowrite 工具返回值已包含完整列表,todoread 工具多余
2025-12-17 14:00:22 +08:00
kurihada 6b3d62b4d6 refactor(core): todowrite 工具使用外部描述文件
- 将 todowrite.ts 中硬编码的 description 改为使用 loadDescription 加载
- 更新 todo_write.txt 为更详细的英文使用说明,包含使用场景和示例
2025-12-17 13:56:01 +08:00
kurihada 8d8ebb8786 feat(core): 更新 web 工具描述并添加域名过滤参数
- 更新 web_extract 工具描述为英文版本
- 更新 web_search 工具描述,添加搜索日期提示
- 为 web_search 添加 allowed_domains 和 blocked_domains 参数
- 添加 GET_CURRENT_DATE_FN 模板函数支持动态日期
2025-12-17 13:47:58 +08:00
kurihada 2afa7bb103 feat(core): 将 Tavily API Key 从环境变量迁移到系统配置
- 新增 ServiceConfig 类型和 services 配置字段
- 添加 getServiceApiKey/saveServiceConfig/deleteServiceConfig API
- 更新 web_search 和 web_extract 工具使用配置系统
- 新增 /api/services REST 端点管理第三方服务配置
2025-12-17 13:01:29 +08:00
kurihada bb3d42e6bf refactor(core): 整理工具描述文件目录结构
将 checkpoint 和 repomap 相关的描述文件移动到各自的子目录
2025-12-17 12:11:24 +08:00
kurihada 31e246f629 refactor(core): 移除 get_file_info 和 list_directory 工具
这些工具功能可通过 bash 命令 (ls, stat, file) 实现,不再需要单独的工具。

删除的文件:
- src/tools/filesystem/get_file_info.ts
- src/tools/filesystem/list_directory.ts
- src/tools/descriptions/filesystem/get_file_info.txt
- src/tools/descriptions/filesystem/list_directory.txt
- tests/unit/tools/filesystem/get_file_info.test.ts
- tests/unit/tools/filesystem/list_directory.test.ts

更新的文件:
- src/tools/index.ts: 移除导入和注册
- src/tools/filesystem/index.ts: 移除导出
- src/tools/load_description.ts: 移除映射
- src/agent/presets/*.ts: 移除 tools.enabled 引用
- tests/unit/tools/load_description.test.ts: 移除测试数据
2025-12-17 12:07:38 +08:00
kurihada 2abea47386 refactor(core): 移除不再需要的文件系统工具
删除以下工具及相关文件:
- copy_file: 复制文件
- create_directory: 创建目录
- delete_file: 删除文件
- move_file: 移动文件
- search_files: 搜索文件

清理范围:
- 工具实现文件 (5个)
- 工具描述文件 (5个)
- 单元测试文件 (6个)
- Agent presets 中的引用
- Checkpoint 系统中的触发类型
- Hook 系统中的相关处理
2025-12-17 12:00:46 +08:00
kurihada 48b458bb9a feat(core): 使用模板系统重构 plan 工具并完善 build agent 配置
- enter_plan_mode/exit_plan_mode 改用 loadDescription 加载描述
- 新增 plan 工具描述文件支持模板变量
- build agent 添加完整的工具启用列表和权限配置
- build agent 启用 promptTemplate 动态模板渲染
2025-12-17 11:52:52 +08:00
kurihada 8a04ad64c3 fix(ui): 统一 LSP 指示器按钮样式与工具栏其他按钮一致 2025-12-17 11:30:33 +08:00
kurihada 927969e9bc fix(ui): LSP 指示器图标改用 Code2 避免与 Providers 冲突 2025-12-17 11:28:18 +08:00
kurihada 1019ba7c9c feat(ui): 实现 LSP UI 集成
- 添加 LSP 相关类型定义 (LSPServer, FileDiagnostic, DiagnosticsResponse)
- 添加 LSP API 函数 (listLSPServers, installLSPServer, startLSPServer 等)
- 创建 LSPPanel 组件: 语言服务器管理面板
- 创建 DiagnosticsPanel 组件: 诊断详情面板 (含搜索过滤)
- 创建 DiagnosticsIndicator 组件: 状态栏指示器
- 集成到 Web 模块 (App.tsx, Chat.tsx)
2025-12-17 11:17:00 +08:00
kurihada c5b92e740c feat(core): 使用模板系统重构 task 工具描述
- 创建 task.txt 模板文件,包含完整的工具描述
- 添加 AGENT_TYPE_REGISTRY_STRING 变量支持动态 Agent 列表
- 添加 agentOutput 工具名称映射
- 更新 task.ts 使用模板渲染,保留回退逻辑
2025-12-17 10:50:33 +08:00
kurihada cfb2175916 feat(server): 实现 LSP 管理 REST API
- 新增 /api/lsp/servers 端点,列出所有语言服务器
- 新增 /api/lsp/servers/:id 端点,获取服务器详情
- 新增 /api/lsp/servers/:id/install 端点,安装服务器
- 新增 /api/lsp/servers/:id/start 端点,启动服务器
- 新增 /api/lsp/servers/:id/stop 端点,停止服务器
- 新增 /api/lsp/diagnostics 端点,获取诊断信息
- 新增 /api/lsp/running 端点,获取运行中服务器列表
- core/lsp 添加 stopServer, getRunningServers, isServerRunning 方法
2025-12-17 10:19:05 +08:00
kurihada b63b79e51e feat(core): 实现先读后写验证机制
确保 write_file 和 edit_file 修改已存在的文件前必须先调用 read_file

- 在 AgentToolExecutor 中添加 readFiles 状态跟踪已读文件
- 创建 read-before-write.ts hook 拦截写操作并验证
- 在 Agent 初始化时注册验证 hook
- 提供 AI 友好的错误消息引导正确操作
2025-12-17 10:05:07 +08:00
kurihada 93f6890a04 feat(core): 更新文件操作工具描述为模板格式
- 更新 read_file 工具描述,支持模板变量
- 更新 edit_file 工具描述,支持模板变量
- 更新 write_file 工具描述
- 添加 read-file-tool 常量 (DEFAULT_READ_LINES, MAX_LINE_LENGTH)
- 在模板渲染器中注册新常量
2025-12-17 01:13:27 +08:00
kurihada 8c46635dc7 feat(core): 实现 ask_user_question 工具的用户输入等待机制
- 创建 UserInputWaiter 管理用户输入等待状态
- 修改 agent-tool-executor 在 requiresUserInput 时等待用户回答
- 添加 onWaitingForInput 回调通知前端显示问题
- Server 端处理 waiting_for_input 广播和 user_input_response 消息
- 前端处理问题显示和用户回答提交
- 修复问题选项在流式输出时被禁用的问题
2025-12-17 00:44:25 +08:00
kurihada a4e8037108 fix(core): 修复工具调用重复触发导致前端显示两次的问题
问题原因:
- onToolStart 同时传给了 toVercelTools 和 streamChat 两处
- 导致工具开始事件在 onChunk 和 executeTool 中各触发一次
- 两处生成的 toolCallId 不同,前端去重逻辑无法生效

修复方案:
- 移除传给 toVercelTools 的 onToolStart,只保留 streamChat 中的触发
- 在 handleToolCallChunk 中增加 toolCallId 去重检查(防止 AI SDK 发送重复 chunk)
2025-12-16 23:50:18 +08:00
kurihada 3b170738ee feat(ui): 实现 ask_user_question 工具的前端支持
- 添加 AskUserQuestion 组件,支持单选/多选和自定义输入
- 添加 Question 相关类型定义 (QuestionOption, Question, QuestionMessagePart)
- 在 useChat 中处理 ask_user_question 工具完成事件,转换为问题 UI
- 添加 answerQuestion 回调用于提交用户回答
- 更新 ChatMessage 组件支持渲染问题类型的消息部分
2025-12-16 23:14:25 +08:00
kurihada 791c4a4616 fix(ui): 修复工具调用重复显示问题
在 useChat hook 中添加去重逻辑:
- tool_start: 检查是否已存在相同 ID 的工具调用,存在则跳过
- subagent:tool_start: 同样添加去重检查

问题原因:服务端可能因 AI SDK 触发两次 tool-call chunk
导致发送重复的 tool_start 事件,前端之前没有去重逻辑
2025-12-16 23:02:34 +08:00
kurihada eb80b2c9e6 fix(core): 修复测试用例以匹配最新实现
- todo-manager.test: 修复空日期字符串导致的 Invalid time value 错误
- config-loader.test: 更新测试以匹配简化后的配置加载逻辑
- mcp/config.test: 修复配置路径匹配问题
- task.test/task-extended.test: 添加缺失的 agentEventEmitter mock
- presets/index.test: 更新预设 Agent 数量和 maxSteps 测试
- agent.test: 添加缺失的 mock 函数并修正模式切换测试
- 删除过时的 session/manager.test 和 storage.test (使用已废弃的 API)
2025-12-16 22:33:46 +08:00
kurihada 66ad1a1ec9 refactor(core): 拆分大型单体文件为模块化子组件
将三个超过 700 行的大型文件重构为模块化架构:

Agent (1033 → ~400 行):
- agent-tool-executor: 工具获取、过滤和执行
- agent-message-handler: 消息构建、流式处理
- agent-mode-manager: 模式切换和权限检查
- agent-vision-handler: 视觉处理委托

CheckpointManager (1015 → ~620 行):
- checkpoint-store: 检查点 CRUD 操作
- checkpoint-rollback: 回滚和撤销操作
- checkpoint-session: 会话跟踪
- checkpoint-events: 事件发射系统

SessionManager (768 → 356 行):
- message-converter: Part ↔ ModelMessage 转换
- session-store: 会话 CRUD 操作
- project-manager: 项目管理
- session-auto-save: 自动保存功能

重构原则: 单一职责、编排器模式、向后兼容 API
2025-12-16 22:07:13 +08:00
kurihada e53035ffc0 refactor(core,server): 统一模块职责并消除类型重复
Core 模块职责:
- 添加 inferPermissionType() 权限类型推断函数
- 添加 partToApiFormat()/partsToApiFormat() API 格式转换函数
- 添加 ApiPart/ApiTextPart/ApiToolPart/ApiReasoningPart 类型
- 统一导出 toolRegistry 供 Server 使用

Server 模块职责:
- 重命名 PermissionRequestContext 为 PermissionDisplayContext
- 移除本地 toolRegistry,直接使用 Core 的注册表
- 使用 Core 的 inferPermissionType 替代本地实现
- 使用 Core 的 partsToApiFormat 替代手动转换

文档更新:
- 在 gui-server-client.md 添加第11章「模块职责边界」
- 明确 Core 和 Server 的职责划分
2025-12-16 21:28:19 +08:00
kurihada 0a26c3ab72 refactor(core,server): 统一模块职责并消除类型重复
- 统一 ToolStatus 类型(Core 导出,Server 引用)
- 重命名 Server SessionManager 为 SessionMetadataManager
- 扩展 Core PermissionContext 添加结构化字段
- 统一 Part 类型导出(Core 定义存储格式,Server 定义展示格式)
- 简化 Message 格式(移除 MergedMessage,统一使用 Message)
- 添加向后兼容的类型别名和 @deprecated 注释
2025-12-16 21:06:41 +08:00
kurihada 1b7d55848d refactor(server): 消除与 Core 的重复类型定义
- 删除 Server 中 60+ 个与 Core 重复的类型定义
- 将动态导入 (await import) 改为静态类型导入 (import type)
- 保留必要的运行时静态导入
- 修复测试文件中的 mock 初始化问题
- 净删除约 960 行重复代码

重构文件:
- routes/checkpoints.ts: 删除 155 行重复类型
- routes/agents.ts: 删除 93 行重复类型
- routes/commands.ts: 删除 83 行重复类型
- routes/mcp.ts: 修复类型窄化
- routes/hooks.ts: 已使用静态导入
- routes/providers.ts: 删除 63 行重复类型
- session/manager.ts: 删除 41 行重复类型
- routes/sessions.ts: 添加类型导入
- permission/handler.ts: 添加类型导入
2025-12-16 20:19:24 +08:00
kurihada 026429cb2f refactor(server): 将 Core 模块从动态导入改为静态导入
- 移除 adapter.ts 中约 160 行冗余接口定义
- 简化 initCore 函数,改为初始化检查逻辑
- 简化 getOrCreateAgent,直接使用 ConfigurationError 类
- 更新缓存类型注解使用 Core 导出的类型
- 简化事件订阅代码,直接使用 agentEventEmitter
- 在 Core index.ts 中添加 agentEventEmitter 导出
- 更新测试文件适配静态导入模式
2025-12-16 19:54:20 +08:00
kurihada 08d481483c feat(ui): 添加子 Agent 进度显示功能
当 build agent 调用 guide/explore 等子 agent 时,
用户可以在 web 页面实时看到子 agent 的执行进度

实现方案:
- Core: 使用 EventEmitter 模式发射子 agent 事件
- Server: 订阅事件并转发到 WebSocket
- UI: 处理事件并渲染 SubagentProgress 组件

新增文件:
- packages/core/src/agent/events.ts
- packages/ui/src/components/SubagentProgress.tsx

修改文件:
- core: executor.ts, manager.ts, types.ts, task.ts
- server: adapter.ts, types.ts
- ui: useChat.ts, types.ts
- web: Chat.tsx
2025-12-16 19:38:36 +08:00
kurihada f0ff887129 feat(core): 添加 guide agent 并使用模板变量
- 新增 guide agent 用于回答工具使用问题
- 更新 build agent 提示词使用模板变量
- 添加 GUIDE_SUBAGENT_TYPE 和 EXPLORE_SUBAGENT_TYPE 变量
2025-12-16 18:26:22 +08:00
kurihada 87edd6e35b refactor(core): 移除 BASH_TOOL_EXTRA_NOTES 和 GIT_COMMIT_AND_PR_CREATION_INSTRUCTION
- 从模板引擎中移除这两个函数的注册
- 从 bash 工具描述中移除对应的模板变量
- 删除不再需要的 git-instructions.txt 文件
- 更新单元测试,移除相关测试用例
2025-12-16 17:00:13 +08:00
kurihada 09dc046f8f feat(core): 扩展模板引擎支持函数调用和算术运算
- 新增模板函数调用语法 ${FUNC_NAME()}
- 新增除法算术运算 ${value/divisor}
- 添加 bash 工具配置常量 (CUSTOM_TIMEOUT_MS 等)
- 更新 bash 工具描述使用动态模板格式
- 添加 Git 操作指令文本 (commit/PR 说明)
- 添加模板渲染器单元测试 (31 个测试用例)
2025-12-16 16:52:46 +08:00
kurihada 7706af2c79 feat(core): 更新工具描述支持动态模板变量
- grep.txt: 使用 ${GREP_TOOL_NAME}、${BASH_TOOL_NAME}、${TASK_TOOL_NAME} 变量
- ask_user_question: 将 description 移至独立 txt 文件
- load_description.ts: 添加 ask_user_question -> plan 分类映射
2025-12-16 16:26:27 +08:00
kurihada 1d380d0bcb refactor(core): 统一模板引擎到 src/template/ 目录
- 将 agent/prompt-template/ 目录合并到 src/template/
- 新增通用模板函数 renderTemplate、render
- 新增 Agent 特定函数 renderPromptTemplate、renderPrompt
- 新增 createToolDescriptionContext 支持工具描述模板变量
- 支持 ${GREP_TOOL_NAME} 等 Claude Code 风格变量
- 更新所有相关导入路径
2025-12-16 16:05:10 +08:00
kurihada 30f35a6562 refactor(core): 重命名 grep_content 工具为 grep
- 重命名 grep_content.ts 为 grep.ts
- 更新工具名称从 grep_content 改为 grep
- 更新所有引用该工具的代码和测试文件
- 更新描述文件名称
2025-12-16 15:03:33 +08:00
kurihada 452f19e2a9 refactor(core): 移除未使用的 prompt-template templates 目录 2025-12-16 14:19:36 +08:00
kurihada 3baf3c0171 fix(core): 在 Agent.resolveSystemPrompt 中集成动态模板渲染 2025-12-16 14:16:52 +08:00
kurihada 58f1bc8718 feat(core): 实现动态提示词模板系统
- 新增 prompt-template 模块,支持运行时变量替换
- 支持 ${variable}、${obj.prop}、${cond ? "a" : "b"} 语法
- AgentInfo 新增 promptTemplate 字段标记动态模板
- Plan Agent 提示词改用模板语法,支持动态工具名和计划文件路径
- AgentExecutor.buildSystemPrompt 集成模板渲染
- 新增 27 个单元测试验证模板功能
2025-12-16 14:15:10 +08:00
kurihada a32c83480d feat(core): 新增 glob 工具,支持文件模式匹配
- 新增 glob 工具,支持 **/*.ts 等 glob 模式匹配文件
- 结果按修改时间排序,限制返回 100 个结果
- 自动忽略 node_modules、.git 等目录
- 更新 Plan Agent 提示词使用 glob 替代 search_files
- 在 Plan Agent 工具列表中启用 glob
2025-12-16 14:01:42 +08:00
kurihada cd0c2bdbfb feat(core): 重构 Plan 模式工具,新增 allowedWritePaths 路径限制
Plan 工具重构:
- 移除 plan_mode_respond 工具
- 新增 ask_user_question 工具:向用户提问并获取回复
- 新增 enter_plan_mode 工具:进入计划模式
- 新增 exit_plan_mode 工具:退出计划模式

allowedWritePaths 功能:
- AgentFilePermission 新增 allowedWritePaths 字段
- permission-merger 添加 isPathInAllowedWritePaths 检查函数
- executor 在写入操作时检查路径限制
2025-12-16 13:49:45 +08:00
kurihada f7b934a69e refactor(core): 简化 Agent 提示词系统,移除 provider 动态加载
- 直接在 build.ts 和 plan.ts 中定义 prompt 字段
- 简化 system-prompt.ts,移除 provider/forProvider/plan 函数
- 简化 agent.ts 中的 resolveSystemPrompt 方法
- 删除不再需要的提示词文件 (anthropic/beast/gemini/qwen/plan.txt)
- 更新 package.json build 脚本,移除复制 prompts 目录
2025-12-16 13:48:56 +08:00
kurihada 7f51d33319 fix(core): 初始化 Task 工具上下文,修复子 Agent 无法启动的问题 2025-12-16 11:56:12 +08:00
kurihada 6817aebfc4 refactor(core): 简化 Plan Agent bash 权限规则,移除 deny 改用 ask 2025-12-16 11:42:48 +08:00
kurihada f116b8a14a fix(core): 添加 Agent 级别的 bash 权限检查
在 getVercelTools 中添加 Agent 权限检查层,确保 Plan Agent 的 bash 规则
(如 touch * -> deny)在工具执行前生效,而不是仅依赖全局权限管理器。
2025-12-16 11:28:33 +08:00
kurihada 70394ed06c fix(core): 修复 Plan Agent 通过 heredoc 绕过写入限制的安全漏洞
- 重排 bash 权限规则顺序,deny 规则置于 allow 规则之前
- 添加 heredoc 重定向检测规则 (* << *)
- 新增 checkRedirectInRawCommand 预检函数,在 tree-sitter 解析前检测重定向
- 禁用 Plan Agent 的 tool_search 工具,防止动态发现写入工具
- 添加更多危险命令: ln, install, truncate, dd, tee
2025-12-16 11:23:02 +08:00
kurihada e698ec2a64 feat(ui): display agent name in message header 2025-12-16 10:43:02 +08:00
kurihada a6c1e792fa refactor(core,server): 简化配置加载,移除 workdir 参数
Provider 和 Agent 配置统一从全局目录加载,无需传递 workdir:
- ProviderRegistry.init() 不再需要 workdir 参数
- AgentRegistry.init() 不再需要 workdir 参数
- 配置文件路径统一使用 ~/.ai-terminal-assistant/
2025-12-16 10:23:28 +08:00
kurihada 6a28c98789 refactor(core): 统一存储路径到 ~/.ai-terminal-assistant/
- 新增 constants/paths.ts 模块统一管理存储路径
- Session 数据从 ~/.local/share/ai-assist/ 迁移到 ~/.ai-terminal-assistant/data/
- Checkpoint 从 ~/.ai-assist/checkpoints/ 迁移到 ~/.ai-terminal-assistant/checkpoints/
- MCP 配置从 ~/.ai-assist/config.* 迁移到 ~/.ai-terminal-assistant/mcp.*
- Agent 配置保持在 ~/.ai-terminal-assistant/agents.json
2025-12-16 10:09:21 +08:00
kurihada 9376887995 refactor(core): 统一配置系统,移除 config.json
- 移除 config.json,所有配置统一从 agents.json 和 providers.json 读取
- config-loader.ts 从全局目录 ~/.ai-terminal-assistant/ 加载配置
- loadConfig() 从 agentRegistry.getGlobalConfig() 获取 defaults.model
- 添加 loadVisionConfig() 支持 Vision 模型配置
- Tavily API Key 仅从环境变量读取
- UI AgentDefaultsEditor 添加 Vision 模型配置界面
- 更新相关测试
2025-12-16 00:33:29 +08:00
kurihada 76b1ae1573 fix(ui): CodeBlock 添加防抖优化,减少流式输出时的高亮闪烁
- 使用 ref 跟踪上一次高亮的代码,避免重复高亮
- 添加 150ms 防抖延迟,减少流式输出时的高亮次数
- 优化渲染逻辑,未高亮时显示纯文本
2025-12-15 23:18:07 +08:00
kurihada 92619df026 feat(web): 移除 Settings 按钮,在 Header 直接显示工作目录
- 移除 ConfigPanel 及其入口按钮
- 在 Chat 页面 Header 左侧显示当前工作目录
- 初始化时并行获取会话列表和工作目录
2025-12-15 23:17:27 +08:00
kurihada f3995d158c feat(core): 实现动态系统提示词加载
- 创建 SystemPrompt 模块,根据模型类型动态加载对应的提示词
- 从 OpenCode 拷贝提示词文件 (anthropic/beast/gemini/qwen/plan.txt)
- 修改 Build/Plan Agent 预设,移除内联 prompt
- Agent 类新增 resolveSystemPrompt 方法处理提示词加载逻辑
- 构建脚本自动复制 prompts 目录到 dist
2025-12-15 23:05:08 +08:00
kurihada 013e9a2712 feat(core): 移除内置 Agent 的 maxSteps 限制,默认使用 Build 模式
- 移除 build/plan/general/explore 的 maxSteps 配置
- 内置 Agent 不再限制步数(与 OpenCode 保持一致)
- 用户自定义 Agent 仍可按需配置 maxSteps
- 新建 Agent 默认使用 Build 模式
2025-12-15 22:27:42 +08:00
kurihada df811395f8 feat(core): 增强 General 和 Explore Agent 预设
General Agent:
- 添加详细的 prompt 引导子代理行为
- 禁用 todo_read/todo_write(避免与父 Agent 冲突)
- 增加 maxSteps 到 20

Explore Agent:
- 支持 thoroughness 参数 (quick/medium/thorough)
- 启用只读 bash 命令(ls, tree, find, git log 等)
- 禁用写入工具和 Todo 工具
- bash 默认策略改为 deny(比 Plan 更严格)
- 添加详细的探索深度指导 prompt

Plan Agent:
- 添加 web: 'ask' 权限配置
2025-12-15 22:01:53 +08:00
kurihada 35d87a04fb feat(core): 增强 Plan Agent 支持细粒度 bash 权限和模式切换
- Plan Agent 细粒度 bash 权限:允许只读命令 (ls, grep, git log 等),
  禁止危险操作 (rm, mv, git commit 等)
- 新增 plan_mode_respond 工具:结构化输出计划、进度和探索状态
- Agent.switchMode() 方法:支持 Build ↔ Plan 模式切换保留对话历史
- WebSocket mode_switch 消息:支持运行时动态切换模式
- 更新 Plan Agent prompt 引导使用 plan_mode_respond 工具
2025-12-15 20:51:57 +08:00
kurihada f238368f87 feat(ui): 支持 Auto Edit 运行时切换立即生效
- 添加 config_update WebSocket 消息类型
- setAutoApprove 切换时立即发送配置更新到服务端
- 服务端实时更新会话的 auto-approve 配置
2025-12-15 19:52:06 +08:00
kurihada ec3c7bccf9 feat(ui): 实现 Agent 模式切换和 Auto Edit 功能
- 添加 AgentModeSelector 组件,支持 Build/Plan 模式切换
- Build 模式下显示 Auto Edit 开关,自动授权文件写入/编辑
- 扩展 useChat hook 添加会话级别的 agentMode/autoApprove 状态
- 服务端支持解析和应用 Agent 模式配置
- 权限处理器实现 auto-approve 检查(仅 write/edit,不含 delete)
2025-12-15 19:42:51 +08:00
kurihada f09f8f2b03 fix: 修复多个问题
- fix(core): 修复 todoManager 未初始化导致待办工具无法使用
- fix(core): 为 LSP 初始化添加 10 秒超时,防止 write_file 卡住
- fix(ui): 停止对话时保留已流式输出的内容
2025-12-15 18:40:07 +08:00
kurihada 11d4abfc50 feat(core): 实现 Doom Loop 检测和软性 maxSteps 限制
- 新增 doom-loop.ts: 实现 Doom Loop 检测器,检测连续 3 次相同工具调用
- 修改 agent.ts: 集成检测器,添加 onDoomLoop 回调,动态 maxSteps
- 修改 registry.ts: 默认 maxSteps 从 10 改为 50
- 更新 index.ts: 导出新模块

参考 OpenCode/OpenHands 等开源项目的多层防御策略
2025-12-15 18:14:09 +08:00
kurihada 3fd8fd98b8 feat(ui): 优化流式输出工具调用渲染
- 添加 tool_start/tool_end WebSocket 事件支持
- 流式消息复用 ChatMessage 组件渲染工具调用卡片
- 修复 AI SDK v5 格式兼容问题(input/output 字段)
- 修复会话恢复时 tool-result 格式错误
- 放宽 ToolState schema 中 input 字段类型为 unknown
2025-12-15 17:35:39 +08:00
kurihada 865e0906b9 feat(ui): 实现 @ 文件提及自动补全功能
- Core: 添加 file-index 模块,使用 ripgrep 索引文件,fuzzysort 模糊搜索
- Server: 添加 /api/files/search 端点,支持文件模糊搜索
- Server: WebSocket 消息处理中将 @filepath 转换为 ./filepath 格式
- UI: 新增 FileMenu 组件,显示文件搜索结果列表
- UI: 新增 FileMentionTag 组件,高亮显示文件提及
- UI: 新增 useFileMention hook,管理文件提及状态
- UI: ChatInput 集成 @ 触发的文件自动补全
- UI: ChatMessage 用户消息中高亮显示 @filepath
2025-12-15 16:32:59 +08:00
kurihada 5b7b0ff1e4 feat(ui): 实现深色/浅色主题切换功能
- 添加 CSS 变量定义浅色和深色主题色板
- 扩展 Tailwind 配置支持语义化颜色 (surface-*, fg-*, line-*, code)
- 创建 useTheme hook 管理主题状态和持久化
- 创建 ThemeToggle 组件支持三种模式 (light/dark/system)
- 迁移所有组件从硬编码 gray-* 到语义化颜色
- 支持系统主题偏好检测 (prefers-color-scheme)
- 添加主题初始化脚本防止闪烁 (FOUC)
2025-12-15 15:47:32 +08:00
kurihada cd0dd814ab feat(ui): 实现消息 parts 有序渲染
- Server: API 返回 parts 数组保持原始顺序
- Server: 添加 MessagePart 类型定义 (text/tool/reasoning)
- UI: ChatMessage 按 parts 顺序交叉渲染文本和工具调用
- UI: 新增 ToolPartItem 组件渲染单个工具 part
- UI: useChat 创建消息时添加 parts 字段
2025-12-15 14:46:00 +08:00
kurihada 2150abde7c feat(agent): 实现流式输出取消功能
- 添加 AbortController 管理,支持取消正在进行的请求
- Agent.chat() 新增 abortSignal 参数,传递给 streamText/generateText
- 取消时保存用户消息和 AI 已输出的部分内容
- cancelProcessing 实际调用 abort() 中止流式请求
2025-12-15 14:21:24 +08:00
kurihada d54b9788fa fix(storage): 修复 multi-step 对话产生多个 assistant 消息问题
- 同一轮对话的后续 assistant 消息追加 Parts 到现有消息
- 修复 AI SDK tool-call 参数字段名(input 而非 args)
- 修复 setToolCompleted/setToolError 中 discriminated union 类型访问
2025-12-15 13:58:10 +08:00
kurihada 9f456c1029 refactor(storage): 重构消息存储为 2-message 格式
采用 OpenCode 风格的消息存储架构:
- 只有 user 和 assistant 两种角色,移除 tool/system
- ToolPart 使用状态机模式 (pending → running → completed/error)
- 新增 toModelMessages() 转换函数用于调用 AI SDK
- 删除 message-merger.ts,存储层直接返回正确格式

主要改动:
- parts.ts: ToolState 状态机(pending/running/completed/error)
- message.ts: 移除 system role,添加 parentId 关联
- converter.ts: 新增 toModelMessages() 格式转换
- manager.ts: 重构 syncMessages/partsToModelMessages
- sessions.ts: 简化路由,直接从 Core Storage 读取
2025-12-15 13:35:32 +08:00
kurihada eda2ccb171 feat(api): 实现消息合并 API,支持工具调用显示
- 新增 MergedMessage、ToolCallInfo 类型定义
- 创建 message-merger.ts 消息合并工具
- 更新 sessions 路由使用合并后的消息格式
- 前端新增 ToolCallsDisplay 组件展示工具调用
- 工具调用显示状态、时长,可展开查看参数和结果
2025-12-15 12:21:16 +08:00
kurihada e9e8bfa30a fix(storage): 修复 ToolPart args 字段缺失导致的验证错误 2025-12-15 11:30:43 +08:00
kurihada 527692ec03 refactor(storage): 采用 OpenCode 风格三层存储结构
重构消息存储系统,从"每条消息一个文件"改为分层存储:
- Session → Message → Parts 三层结构
- 12 种 Part 类型(TextPart, ToolPart, ReasoningPart 等)
- ToolPart 状态机(pending → running → completed/error)
- 通用 Storage API(read/write/list/remove)

新增文件:
- parts.ts: Part 类型定义(Zod schema)
- message.ts: MessageInfo 类型定义
- id.ts: ID 生成器
- storage/: 分层存储实现

删除旧文件:
- storage.ts, types.ts, migration.ts

存储路径:
~/.local/share/ai-assist/
├── session/{projectId}/{sessionId}.json
├── message/{sessionId}/{messageId}.json
├── part/{messageId}/{partId}.json
└── todo/{sessionId}.json
2025-12-15 11:16:10 +08:00
kurihada b8fcb65f73 fix(server): 修复消息持久化问题
- 在 adapter.ts 中为 Agent 绑定 Core SessionManager
- 添加 getOrCreateSessionManager 函数创建和恢复会话
- 修改 getOrCreateAgent 为异步函数
- 在 sessions.ts 中转换 AI SDK 消息格式为字符串
2025-12-15 10:45:58 +08:00
kurihada bbce1de60c fix(ui): 优化 WebSocket 连接和 PWA meta 标签
- WebSocket onopen 检查 isClosingRef,组件卸载后自动关闭连接
- 更新 PWA meta 标签为 mobile-web-app-capable
2025-12-15 10:29:49 +08:00
kurihada 9e55237dae fix(ui): 修复 React key 警告和 forwardRef 问题
- ChatMessage/SessionItem 使用 forwardRef 支持 AnimatePresence
- useChat 为 message_received/done 事件生成唯一消息 ID
- sessions API 为历史消息添加 ID 字段
- cli 添加 @types/inquirer 依赖
2025-12-15 10:24:45 +08:00
kurihada 842cf1a3e8 fix(ui): 优化会话初始化逻辑
- 首次启动时自动创建会话
- 用户删除所有会话后不再自动创建,显示空状态
- 使用 localStorage 记录是否曾有会话
2025-12-15 10:05:17 +08:00
kurihada 6342a46e59 refactor(storage): 统一消息存储到 Core 层
问题:Server 端只存储最终文本响应,工具调用的中间消息丢失。

解决方案:
- Agent.chat() 返回 ChatResult,包含完整消息链
- Server SessionManager 简化为只管理会话元数据
- 消息 API 改为从 Core Storage 读取
- 移除 Server 端的消息存储和 addMessage 方法

影响范围:
- core: Agent.chat() 返回类型变更
- server: SessionManager 接口变更,移除消息存储
- server: GET /sessions/:id/messages 从 Core 读取
- server: 移除 POST /sessions/:id/messages 端点
2025-12-15 10:04:22 +08:00
kurihada a657af9bb7 test(server): 修复 SessionManager 测试的 session 清理问题
- 添加 afterEach 钩子清理测试中创建的 session
- 引入 createTrackedSession 辅助函数追踪需要清理的 session
- 防止测试产生的 session 持久化到磁盘影响用户数据
2025-12-15 00:55:02 +08:00
kurihada 5b20420ccd test(server): 增强 auth/ws/sse 测试覆盖率
- auth/token.ts: 50% → 100%
  - 新增 authMiddleware 中间件完整测试
  - 覆盖本地 IP 检测、远程认证、跳过路径等场景
  - 新增 getAuthContext 测试

- ws.ts: 90% → 98%
  - 新增 Blob/非标准数据类型处理测试
  - 新增 addMessage 返回 null 场景测试
  - 新增 tool_response 和 permission_response 边界测试

- sse.ts: 新增事件格式化和统计测试

测试数量: 344 → 369 (+25)
总体覆盖率: 80.82% → 82.98%
2025-12-15 00:36:43 +08:00
kurihada 7bc4f006a0 test(server): 补充 checkpoints/mcp/sse/adapter 测试
- 新增 checkpoints.test.ts: 29 个测试覆盖 Checkpoint 管理 API
- 新增 mcp.test.ts: 15 个测试覆盖 MCP 服务器管理 API
- 扩展 sse.test.ts: 添加 handleSSE 路由测试
- 扩展 adapter.test.ts: 添加 cancelProcessing, getContextUsage,
  compressContext, processMessage 测试

覆盖率提升: 60% -> 80.82%
测试数量: 288 -> 344
2025-12-15 00:32:04 +08:00
kurihada 67e129fce2 fix(commands): 修复路由顺序导致 /content 端点被遮蔽的问题
- 将 /:name{.+}/execute 和 /:name{.+}/content 路由移到 /:name{.+} 之前
- Hono 的 {.+} 模式会贪婪匹配,导致 /test/content 被解析为 name='test/content'
- 更新测试用例以正确测试 /content 端点功能
2025-12-15 00:17:22 +08:00
kurihada c44527a890 test(server): 添加 routes 模块单元测试
- agents.test.ts: Agent presets CRUD API (18 tests)
- tools.test.ts: Tool registration & execution (10 tests)
- files.test.ts: File browser API with path security (24 tests)
- commands.test.ts: Slash commands CRUD & execution (20 tests)
- hooks.test.ts: Hooks configuration management (20 tests)

覆盖率从 29.59% 提升到 60.35%,共 287 个测试
2025-12-15 00:14:27 +08:00
kurihada 5835799b69 test(server): 添加 server 模块单元测试
- 新增 vitest 配置和测试基础设施
- 添加 adapter.test.ts: 测试 Core 模块初始化和 Agent 管理 (18 tests)
- 添加 token.test.ts: 测试 Token 生成、验证和中间件 (25 tests)
- 添加 handler.test.ts: 测试权限处理器 (18 tests)
- 添加 ws.test.ts: 测试 WebSocket 连接和消息处理 (19 tests)
- 添加 sse.test.ts: 测试 SSE 事件发送 (14 tests)
- 添加 sessions.test.ts: 测试会话路由 (16 tests)
- 添加 config.test.ts: 测试配置路由 (10 tests)
- 添加 context.test.ts: 测试上下文压缩路由 (9 tests)
- 添加 providers.test.ts: 测试 Provider 管理路由 (18 tests)
- 添加 manager.test.ts: 测试 SessionManager (48 tests)

总计 195 个测试,覆盖率从 0% 提升至 29.59%
2025-12-15 00:07:32 +08:00
kurihada 503e4c4ccd fix(init): 确保 Registry 在服务启动时正确初始化
- AgentRegistry: 在构造函数中同步初始化预设 Agent
- AgentRegistry: 添加 isInitialized() 方法
- initCore(): 添加 ProviderRegistry.init() 调用
- initCore(): 添加 AgentRegistry.init() 调用

修复用户配置(Provider、Agent)重启后丢失的问题
2025-12-14 23:40:33 +08:00
kurihada aefea715b1 feat(context): 根据模型动态设置 contextLimit
- AgentConfig 添加 contextWindow 字段
- ProviderRegistry 添加 getModelInfo() 方法查询模型信息
- loadConfig() 从 ProviderRegistry 获取模型的 contextWindow
- Agent 构造函数使用 contextWindow 初始化压缩管理器

效果:
- Anthropic Claude: 168k (200k - 32k 输出预留)
- DeepSeek: 32k (64k - 32k 输出预留)
- 未知模型回退到默认 200k
2025-12-14 23:34:32 +08:00
kurihada cacd9914fd fix(config): 优化配置错误提示信息
- 未选择 provider 时提示"选择并配置模型提供商"
- 已选择 provider 但未配置 API Key 时提示配置该 provider
2025-12-14 22:44:13 +08:00
kurihada 07a039001d feat(ui): 添加配置错误 toast 提示
当 Provider API Key 未配置时,显示 toast 提示并提供
"去配置"按钮,点击可直接打开 Providers 配置面板
2025-12-14 22:35:02 +08:00
kurihada 32064a3531 fix(config): 优雅处理 Provider 未配置错误
- 添加 ConfigurationError 类替代 process.exit(1)
- Server 端捕获配置错误并返回友好消息
- UI 端支持 config_error 类型的 WebSocket 消息
- 服务器不再因配置缺失而崩溃
2025-12-14 22:24:51 +08:00
kurihada c307cd3a7c refactor(agent): 将 Summary Model 改造为内置 Sub Agent
- 扩展 AgentMode 类型添加 'internal' 模式
- 新增 summary agent preset (claude-3-5-haiku)
- AgentRegistry 添加 getInternal/listInternalAgents 方法
- CompressionManager 添加 setSummaryModelFromAgentConfig
- Agent 构造函数改用 Registry 配置初始化 Summary 模型
- 清理旧的 SummaryConfig 配置系统
- UI AgentsPanel 分离显示 System/Preset/Custom agents
- UI AgentEditor 为 internal agent 显示简化编辑界面
2025-12-14 22:12:36 +08:00
kurihada e97daaa0eb refactor(settings): 移除无效的配置项
- 移除 maxTokens/temperature 滑块(后端从不使用)
- 移除 allowedPaths/deniedPaths 显示(权限通过 handler 处理)
- Settings 面板只保留 workdir 和 Summary Model 配置
2025-12-14 21:37:58 +08:00
kurihada 9e011476c8 refactor(config): 移除环境变量依赖,统一使用 Provider 配置系统
- 移除 .env.example 文件
- 简化 resolveApiKey 函数,只从配置文件读取 API Key
- 重构 loadConfig/loadVisionConfig/loadSummaryConfig 使用 ProviderRegistry
- 更新测试以 mock Provider 系统
2025-12-14 21:29:36 +08:00
kurihada c9d0cbce5b fix(session): 修复 getOrCreateProject 死锁问题
读写锁嵌套导致死锁:在持有读锁的情况下尝试获取写锁。
改为先释放读锁再获取写锁,并使用双重检查模式防止竞态条件。
2025-12-14 20:44:55 +08:00
kurihada 70a9a154a4 feat(context): 添加上下文压缩 API 和 UI 组件
Server API:
- 扩展 Agent Adapter 接口添加压缩相关方法
- 新增 context.ts 路由 (GET /sessions/:id/context, POST /sessions/:id/compress)
- 扩展 config.ts 添加摘要模型配置接口 (GET/PUT /config/summary)

UI 组件:
- 新增 ContextUsage 组件显示上下文使用情况
- 扩展 ConfigPanel 添加摘要模型配置区域
- 添加 API 客户端方法和类型定义

Web 集成:
- 在 Chat 页面头部集成 ContextUsage 紧凑模式显示
2025-12-14 20:33:51 +08:00
kurihada f54f24b079 feat(context): 优化对话压缩系统
- 添加独立摘要模型配置支持(SUMMARY_PROVIDER/MODEL/API_KEY/BASE_URL)
- 添加 CompressionStatus 枚举和 DetailedCompressionResult 详细返回类型
- 实现压缩失败检测(空摘要、token膨胀)
- 添加首条 user-assistant 对保护,确保上下文连贯性
- CompressionManager 支持独立摘要模型(优先使用小模型降低成本)
- Agent 自动压缩时显示详细状态信息
- 更新相关测试用例
2025-12-13 11:13:20 +08:00
kurihada 9ff2934089 refactor(session): 升级存储系统架构
- 添加读写锁机制防止并发写入冲突
- 实现数据迁移框架支持版本化升级
- 分层存储结构:项目/会话/消息独立存储
- 使用 Git root commit hash 作为稳定项目 ID
- 增量消息同步避免重复写入
- 每条消息独立文件,按序号命名 (0001.json, 0002.json)
2025-12-13 10:41:36 +08:00
kurihada 26e8646518 feat(ui): 集成 Provider 管理到 web 和 desktop 应用
- 新增 ProviderEditor 组件用于编辑提供商配置
- ProvidersPanel 添加编辑按钮集成 ProviderEditor
- ChatPage 添加 onOpenProviders 工具栏按钮
- web/desktop App.tsx 集成 ProvidersPanel 面板
2025-12-13 02:01:09 +08:00
kurihada 6ec6fe2f9f feat(provider): 添加独立的 Provider 模块管理模型提供商
实现可扩展的 Provider 系统,支持动态注册自定义提供商:

Core 模块 (packages/core/src/provider/):
- types.ts: Provider 相关类型定义
- builtin/: 内置提供商 (Anthropic, OpenAI, DeepSeek)
- registry.ts: ProviderRegistry 单例类
- config.ts: 配置持久化 (~/.ai-terminal-assistant/providers.json)
- utils.ts: 连接测试等工具函数

Server API (packages/server/src/routes/providers.ts):
- GET/POST/PUT/DELETE /providers 提供商管理
- POST /providers/:id/test 连接测试
- 自定义模型管理接口

Frontend (packages/ui/):
- ProvidersPanel 组件用于管理提供商
- API client 函数和类型定义

主要功能:
- 支持动态注册 OpenAI 兼容服务 (Ollama, vLLM 等)
- 每个提供商独立的 API Key 配置
- 预设模型列表 + 自定义模型输入
- 连接测试验证
2025-12-13 01:50:27 +08:00
kurihada 1d69fd876d feat(permission): 实现 WebSocket 权限确认机制
重构权限系统,将终端 UI 代码从 core 模块移除,实现基于 WebSocket 的权限确认流程:

Core 模块清理:
- 删除 permission/prompt.ts 和 file-prompt.ts(终端交互)
- 删除 diff.ts 中的 chalk 渲染函数
- 删除 config.ts 中的 inquirer 交互
- 移除 chalk 依赖

Server 权限处理:
- 新增 permission/handler.ts,实现 WebSocket 权限请求/响应
- 更新 agent/adapter.ts 设置权限回调
- 更新 ws.ts 处理 permission_response 消息

Web 权限组件:
- 新增 PermissionDialog 组件,显示权限请求详情和 Diff
- 更新 useChat hook 管理权限状态
- 更新 Chat 页面集成权限弹窗
2025-12-13 01:09:35 +08:00
kurihada 5d4afecd48 refactor(core): 移除 UI 交互层,保持 core 为纯能力模块
- 删除 terminal.ts 及其测试(UI 交互应属于 cli 包)
- 清理 index.ts 中的 CLI 入口代码
- 合并 lib.ts 导出到 index.ts
- 移除 commander、inquirer 依赖
- 更新 package.json 导出配置
2025-12-13 00:42:07 +08:00