485 Commits

Author SHA1 Message Date
oudecheng
ffc1f79de4 refactor: 建立前端 API 客户端层,消除硬编码路径与重复 fetch
- 新增 web/src/api/ 目录(6 个文件):client.ts 基础设施 + 5 个领域模块
- 封装 18 处 fetch 调用为强类型函数,消除 17 处硬编码 /api/ 路径
- 统一 13 处重复的 fetch+json+错误处理模式
- 删除旧 web/src/components/Settings/api/expert.ts,合并到新 api/experts.ts
- ConfigPage.tsx 替换 15 处 fetch 调用,ExpertSelector.tsx 改用新 API
- 保持现有组件行为不变(静默失败仍静默,错误处理等价)
2026-07-08 10:03:34 +08:00
oudecheng
a8267631b8 refactor: 移除未使用的 cli_sessions 变量,优化 ws.rs 中的代码 2026-07-08 09:45:20 +08:00
oudecheng
393052ae48 refactor: 重构 AgentLoop 中的消息处理逻辑,简化工具结果处理和 LLM 请求构建 2026-07-08 09:33:11 +08:00
oudecheng
c8660df14b refactor: 拆分 storage/mod.rs 与 ConfigPage.tsx (P2)
storage/mod.rs (2957 -> 1834 行):
- 抽出 tests.rs: 17 个测试函数
- 抽出 row_mapping.rs: 8 个 row<->record 映射与单记录查询函数
- 抽出 migrations.rs: 7 个 schema 迁移函数 (ensure_*_schema, has_column, add_column_if_missing)

ConfigPage.tsx (1568 -> 1235 行):
- 抽出 types.ts: 所有接口/类型定义
- 抽出 constants.ts: TABS, inputCls, selectCls, TIMEZONE_OPTIONS
- 抽出 ui.tsx: Field, Toggle, TagEditor, SectionCard, SourceEditor, MapEntryHeader
- 抽出 api/expert.ts: getSelectedExpert, selectExpert (经 ConfigPage 再导出保持兼容)

验证: cargo build, cargo test --lib storage:: 17/17, npm run build
对抗性检查: 8/8 通过 (无丢失/重复函数, 无循环依赖, 无未使用导入)
2026-07-07 18:36:23 +08:00
oudecheng
f8d5f0253a refactor: 清理 P1 类型债与 React key 债
- 消除 useChat.ts 中 13 处 (message as any).timestamp,改用已收窄变量的 .timestamp
- 给 ExecutionCancelled 接口补 timestamp?: number 字段,与后端对齐
- 修复 MessageInput 附件列表 key={index}: 给 FileAttachment 加 id 字段(crypto.randomUUID())
- 修复 ConfigPage TagEditor key={i} → key={t}(tag 值唯一)
- 修复 ConfigPage SourceEditor customPaths key={i} → key={p}(路径值唯一)
2026-07-07 17:53:53 +08:00
oudecheng
7eb2933ca5 chore: 清理 P0 技术债
- 删除 web/src/components/Sidebar/.deprecated 目录(死代码)
- 清理 useChat.ts/useWebSocket.ts 中 13 条调试 console.log
- 修复 load_task_messages.rs 硬编码 task 状态: 新增 TaskSessionState::Unknown,
  DB 重建时返回 Unknown 而非误报 Completed, 前端显示"未知"
2026-07-07 17:45:07 +08:00
oudecheng
f264a7b307 fix: 兼容 base_url 末尾斜杠,避免拼接产生双斜杠导致 404
anthropic.rs 和 openai.rs 在构造时 trim_end_matches('/'),兼容如 https://opencode.ai/zen/go/v1/ 带末尾斜杠的 base_url。
2026-07-07 14:14:20 +08:00
oudecheng
4da7b5f505 fix: TodoWriteTool merge 模式内存为空时从 DB 回填,防止丢失旧项
todo_write.rs: 内存状态为空时从 repository.list_todos 回填,保证 merge 模式不丢失旧项(进程重启后内存清空场景)。新增 MockTodoRepository 和回填测试。

tool_registry_factory.rs: TodoWriteTool::new 传入 todo_repository。
2026-07-07 14:13:56 +08:00
oudecheng
7652bb16e2 refactor: get_current/save_topic 直读 DB 加载消息,移除 SessionManager 依赖
get_current.rs 和 save_topic.rs 改为直读 DB(load_messages_for_topic),不依赖 SessionManager 内存,重启后也能正确获取历史。

mod.rs: 删除 get_messages_from_session 辅助函数。

processor.rs/ws.rs: 移除 with_session_manager 调用。
2026-07-07 14:13:31 +08:00
oudecheng
7eecd0b6bb feat: 专家配置保存后即时生效,无需重启网关
experts/mod.rs: config 改为 RwLock 支持 update_config 运行时更新; ExpertWithStatus 增加 body 字段供前端编辑模态框直接显示; 空 sources 时不再兜底返回 [User,Project],尊重用户关闭所有源的意图。

gateway/http.rs: save_config 同步调用 experts.update_config,返回消息从'需要重启'改为'已保存'。

ConfigPage.tsx: 编辑模态框宽度扩大到 max-w-3xl,textarea 高度增加到 360px,提示文案明确正文与名称/描述的注入关系。
2026-07-07 14:13:09 +08:00
oudecheng
fdd22556a1 fix: 高亮消息时不再退出子智能体视图
子智能体视图的消息源是同一 chat_id,高亮消息不需要退出子智能体栈。仅定时任务视图(另一个 chat_id)需要退出。
2026-07-07 14:12:42 +08:00
oudecheng
b9c880d823 fix: 同步前置 subAgentViewRef/subAgentStackRef,消除子智能体视图间歇性丢消息
根因: subAgentViewRef.current 在 setSubAgentStack updater 内部更新,updater 在 React render 阶段才执行,不是同步的。从 enterSubAgentView() 返回到 React render 之间存在竞态窗口,WebSocket 消息读到过时的 ref 被错误路由到主视图并丢弃。

修复: ref 赋值从 updater 内部移到 setSubAgentStack 之前同步执行。新增 subAgentStackRef 供 exit/navigate 在空依赖闭包中读取最新栈计算新栈顶。selectTopic/selectChannel/selectSession 清空栈时也同步设置 ref。updater 变纯函数,StrictMode 双调用无副作用。

Plan: fix-subagent-view-ref-race
2026-07-07 14:12:21 +08:00
oudecheng
6df87fe399 fix: 子智能体工具消息去重改为按 id+type,修复工具状态卡在执行中
后端为同一次工具调用的 tool_call/tool_result/tool_pending 生成相同的 id(= tool_call_id),上一提交的去重逻辑仅按 id 判断,导致 tool_result 被 tool_call 误判为重复而跳过,App.tsx 合并逻辑收不到 tool_result,工具永远停留在 calling 状态。

改为按 id + type 去重:同类型消息不会重复(解决 load_task_messages 并发重复),不同类型消息(tool_call vs tool_result)不会被误伤(修复工具状态卡死)。

同时修复 appendToSubAgentViewMessage 和 appendToSubAgentLayerMessage 两处。
2026-07-07 11:22:48 +08:00
oudecheng
bde55cbf14 feat: 重构工具提示提供者,整合工具使用说明;删除冗余的 TodoPromptProvider 2026-07-07 10:03:16 +08:00
oudecheng
653687276c chore: 更新版本号至 0.1.2 2026-07-07 09:20:31 +08:00
oudecheng
4329cfbbe9 feat: 统一路径显示格式,确保跨平台兼容性;重构系统提示词提供者构建逻辑 2026-07-07 09:19:58 +08:00
oudecheng
43f6ea7b08 feat: 新增用户附件处理规则,支持判断文件后缀并选择读取方式 2026-07-06 18:13:14 +08:00
oudecheng
fc050c5074 fix: 前端子智能体视图消息显示与刷新修复
protocol.ts: ExecutionCompleted/WsError 类型增加 subagent_task_id 字段。

useChat.ts 核心修复:

- getSubagentTaskId 识别 execution_completed/error 消息类型

- task_messages_loaded 处理增加 task_id 校验,避免快速切换视图时状态污染

- 主视图 execution_completed/error case 防护,子智能体事件不操作主视图

- 新增 appendToSubAgentLayerMessage,非栈顶子智能体消息遍历栈匹配层而非丢弃

- appendToSubAgentViewMessage 对 tool_call/tool_result/tool_pending 按 id 去重

- execution_completed/error 路由到匹配层更新 status

- exitSubAgentView/navigateToSubAgentLevel 返回 load_task_messages 命令重新拉取

Spec: fix-subagent-message-refresh-on-exit (Task 3-8)
2026-07-06 18:11:37 +08:00
oudecheng
b4b7c5a208 fix: 子智能体执行路径发布带 subagent_task_id 的完成/错误事件
在 runtime.rs 新增 build_subagent_event_metadata/publish_subagent_completion/publish_subagent_error 函数,在 spawn/resume 的 Ok/Err 分支发布带 subagent_task_id=session.id 的 ExecutionCompleted/ErrorNotification 事件。

load_task_messages.rs 的 reconstruct_task_from_db 硬编码 Completed 加 TODO 注释,记录 DB 重建无法可靠推断 task 状态的已知缺陷。

Spec: fix-subagent-message-refresh-on-exit (Task 1.4, 9)
2026-07-06 18:11:12 +08:00
oudecheng
61c2fca2a7 feat: 对话框上方集成专家选择器,支持实时选择与系统提示词注入
- 新建 ExpertSelector 组件,加载时查询 session 选中状态,失败降级显示无专家

- 下拉面板含无专家/专家列表/管理专家入口,乐观更新+失败回滚保证一致性

- ChatContainer 在 MessageList 与 MessageInput 之间渲染 ExpertSelector

- MessageInput 接收 selectedExpert,选中时 placeholder 显示以专家身份对话

- App.tsx 传递 sessionId/onOpenSettings 给 ChatContainer,支持从对话框直达专家设置

- App.tsx 同时包含 subagent 导航 command 发送的连带修改
2026-07-06 18:08:19 +08:00
oudecheng
5651c4ae7f feat: 设置页新增专家 Tab,支持专家增删改查与启用切换
- 新增 ExpertsConfig/ExpertItem/ExpertListResponse 类型与 AppConfig.experts 字段

- TABS 数组加入专家 Tab (UserCheck 图标),TabId 含 'experts'

- renderExperts 渲染启用开关、来源目录编辑器、已发现专家列表与添加按钮

- 专家编辑 modal 含 name(编辑时只读)/description(必填)/body(textarea) 三字段

- 导出 selectExpert 与 getSelectedExpert 模块级函数供 ExpertSelector 复用

- Tab 切换自动拉取列表,专家 toggle 即时生效不触发未保存警告

- initialTab prop 支持从对话框入口直达专家 Tab
2026-07-06 18:07:54 +08:00
oudecheng
9d7c1f2e52 feat: 集成专家提示词到网关配置、依赖注入与HTTP API
- config: 新增 ExpertsConfig,默认 sources=[user,project], enabled=true

- AgentFactory: 新增 experts 字段,providers 顺序为 Agent→Skill→Expert→Subagent→Todo

- GatewayState: 持有 Arc<ExpertRuntime>,from_config 中初始化

- runtime: build_session_manager_with_sender 接收 experts 参数

- 路由: 注册 7 个专家 API (list/toggle/create/update/delete/selected/select)

- http: 实现 7 个处理器,支持专家 CRUD 与 session 级选择

- session/cli: 测试便利构造器与 empty_config/build_config 补齐 experts 字段
2026-07-06 18:07:33 +08:00
oudecheng
c2d9bf8b5e feat: 新增专家提示词核心模块,支持文件发现、CRUD与运行时选择
- 新增 src/experts/mod.rs 模块,镜像 skills/subagents 模式

- 支持 user/project 双 scope 从 EXPERT.md 文件发现专家

- ExpertRuntime 维护 session→expert 映射与禁用列表,持久化到 expert-state.json

- ExpertPromptProvider 实现系统提示词注入,未选中时返回 None

- 包含 16 个单元测试覆盖 frontmatter 解析、discover 优先级、CRUD、select/clear、disable 场景
2026-07-06 18:07:10 +08:00
oudecheng
8d30ccd020 feat: 新增子代理管理API,支持获取子代理列表和切换子代理状态 2026-07-06 14:41:30 +08:00
oudecheng
38b9f661ee feat: 新增技能管理API,支持获取技能列表和切换技能状态 2026-07-06 11:59:11 +08:00
oudecheng
d7ff969560 feat: 增强消息处理,清理不完整的 tool_call 序列以防止数据污染 2026-07-06 09:04:32 +08:00
oudecheng
cb0d3d932d feat: TodoPanel 改为常驻右边栏并支持点击跳转
- TodoPanel 移除浮动定位与拖动逻辑,改为常驻右边栏
- 右边栏与左边栏对称的折叠/展开逻辑,localStorage 持久化
- 待办/记忆/技能三 Tab 切换
- 点击已完成 todo 滚动并高亮对应 tool 消息
- 修复 MessageBubble isMergedTool 分支缺失 data-message-id 导致跳转失效
- ChatContainer 移除 todoPanel prop
2026-07-03 19:32:46 +08:00
oudecheng
4766f838a2 fix: 过滤 subagent session 避免污染会话列表
subagent session(id 形如 sub:...)存入 DB 时 channel_name=websocket,会被 list_sessions 查出并显示在前端右上角。SQL 添加 AND id NOT LIKE 'sub:%' 过滤。
2026-07-03 19:32:28 +08:00
oudecheng
994db87f11 feat: 新增 ExecutionCompleted 信号修复发送按钮状态
- 后端 OutboundEventKind/WsOutbound 新增 ExecutionCompleted 变体
- processor 在 handle_message 完成后发送该信号
- 飞书/微信通道过滤该信号(不发送)
- 前端 useChat 移除 stream_delta/assistant_response 的 isLoading=false
- 改由 execution_completed 事件统一设置 isLoading=false,确保智能体迭代期间按钮保持停止态
2026-07-03 19:32:14 +08:00
oudecheng
76abdbd1de feat: MCP stdio 命令解析与错误诊断增强
- 新增 resolve_command_path:Windows 上搜索 .exe/.cmd/.bat 后缀
- 启动失败时给出友好错误信息(含 PATH 和建议)
- 捕获子进程 stderr 并在连接失败时回显
- ConfigPage 新增 cwd 工作目录字段
- 添加单元测试覆盖路径解析逻辑
2026-07-03 19:31:52 +08:00
oudecheng
1309fa28da feat: McpClientManager 传递 cwd 参数至 connect_stdio 2026-07-03 16:34:01 +08:00
oudecheng
5ceafb1fd7 feat: 添加配置应用诊断日志,便于排查 AgentFactory 实例与工具列表 2026-07-03 16:33:01 +08:00
oudecheng
7640a6e5b7 fix: 修复 WebSocket 连接泄漏,使用 CancellationToken 实现优雅重启 2026-07-03 16:32:43 +08:00
oudecheng
7e24e57af4 fix: 修复 persistent_session_id 前缀重复累积问题 2026-07-03 16:32:24 +08:00
oudecheng
a78f5c5512 feat: MCP stdio 传输支持工作目录配置 2026-07-03 16:32:09 +08:00
oudecheng
b206e077e2 chore: 忽略 .trae 目录 2026-07-03 16:31:49 +08:00
oudecheng
2a02adc7c3 feat: 将 StreamingAccumulator 中的 tool_calls 类型从 HashMap 更改为 BTreeMap;在 SkillSource 中添加自定义源支持 2026-07-03 11:34:30 +08:00
oudecheng
d2af01eb30 feat: 更新通道名称为 websocket,调整相关引用和逻辑 2026-07-03 10:58:24 +08:00
oudecheng
f3365f8d3a feat: 添加 HistoryUnit 解析单元测试,验证系统守卫和工具调用的处理逻辑 2026-07-03 10:19:33 +08:00
oudecheng
51e06c8f73 feat: 实现两段历史压缩的同步处理,替换会话的活动历史记录 2026-07-03 09:52:45 +08:00
oudecheng
1af0fab3ad feat: 更新配置管理,支持异步读取和写入;添加 MCP 服务器状态接口 2026-07-03 08:37:02 +08:00
oudecheng
4071dcc6ee feat: 更新取消结果构建逻辑,确保已生成消息包含在取消响应中 2026-07-02 18:27:22 +08:00
oudecheng
32d49601a2 feat: 更新取消信号处理,支持 interior mutability;优化 LLM 调用与工具执行的取消逻辑 2026-07-02 17:17:03 +08:00
oudecheng
81c88257c8 feat: 更新模型配置,调整温度和上下文窗口令牌数量;添加启动和停止网关的批处理脚本 2026-07-01 15:11:28 +08:00
oudecheng
c70571b0d1 feat: 更新版本号至 0.1.1 2026-07-01 11:33:45 +08:00
oudecheng
f8e7bfcd54 feat: 更新默认提供者配置,修改基础URL和模型ID 2026-07-01 09:29:34 +08:00
oudecheng
4fabbe47e9 feat: 增强MCP集成,支持配置路径和连接重试机制 2026-06-30 10:46:33 +08:00
oudecheng
7d11ab8067 feat: 添加默认配置文件创建功能,确保首次启动时可用 2026-06-29 15:27:22 +08:00
oudecheng
26cbe7aa2d feat: 更新 created_by_message_id 逻辑,仅在内容或状态变化时进行更新 2026-06-29 15:01:32 +08:00
oudecheng
bf1549b88b feat: 优化 todo_write 工具的 merge 参数描述,调整默认值逻辑并添加测试 2026-06-29 09:24:05 +08:00