oudecheng
2e4b1931a6
feat(tokens): 添加 topic 维度 token 消耗与上下文窗口占用统计
...
后端:
- openai provider 流式响应启用 stream_options.include_usage,从 SSE 末帧捕获 usage
- ChatMessage 新增 MessageUsage(prompt/completion/total/context_window_tokens)
- agent_loop 三处 LLM 调用点持久化 usage,含 context_window_tokens
- storage 新增 context_window_tokens 列及 migration,batch_session_token_stats 聚合查询
- last_prompt_tokens 查询过滤 prompt_tokens IS NOT NULL,跳过 error/cancel 消息
- build_topic_summaries 简化签名,context_window_tokens 从消息记录读取
- protocol 扩展 TopicTokenStats,按 session_id 聚合天然隔离子代理
前端:
- protocol.ts 新增 TopicTokenStats 类型
- useTopics 映射 token_stats 到 Topic
- TopicList 展示总 token 消耗与上下文占用百分比(绿/黄/红三色)
测试:outbound_dispatcher 4 个测试修复(drop(bus) 不关闭 bus,改用 abort)
2026-08-04 17:01:54 +08:00
oudecheng
cda14360af
chore: 建立工程化基线(rustfmt + clippy + CI + eslint + prettier)
...
配置:
- rustfmt.toml: 固化 max_width=100 / 4 空格缩进,cargo fmt 全量格式化
- Cargo.toml: 配置 [lints.rust] 与 [lints.clippy] 渐进式规则
- .github/workflows/ci.yml: Rust(fmt+clippy+test) + 前端(eslint+tsc+test) 双平台 CI
- Makefile: 新增 check/fmt/fix 目标,clippy 对齐 --all-targets --all-features
- web: eslint flat config + prettier 配置 + package.json 脚本与依赖
- src/main.rs: loop→while 修复 clippy::never_loop
对抗性审查发现并修复:
- eslint 缺 caughtErrorsIgnorePattern 导致 catch(_) 误报为 error
- 前端 lint 未接入 CI,现已补上 Lint 步骤
- Makefile 与 CI 的 clippy flags 不一致,已对齐
2026-08-03 23:24:02 +08:00
oudecheng
2a5a0277c0
feat(web): 添加话题重命名功能
...
新增 RenameTopic 命令与 TopicRenamed 协议消息,复用存储层已有的
update_topic_title 方法。后端响应携带刷新后的完整 topic 列表,
前端零额外往返即可同步侧边栏。
前端 TopicList 侧边栏增加内联编辑入口:悬停显示铅笔图标,点击进入
编辑模式,Enter 提交 / Esc 取消 / blur 取消;通过 onMouseDown
preventDefault 防止按钮点击时 input 提前失焦。
包含 5 个单元测试覆盖成功、空标题、不存在、标题未变跳过写入、
can_handle 等场景。
2026-08-03 22:10:25 +08:00
oudecheng
58f461c953
fix: 修复 SSRF 重定向绕过 + 符号链接路径遍历 + TodoItemSummary 字段缺失
...
P0: src/tools/http_request.rs SSRF 重定向绕过
- reqwest::Client 默认跟随最多 10 次重定向,is_private_host 仅检查初始 URL
- 攻击者可用公网 URL 返回 302 → http://127.0.0.1/ 或
http://169.254.169.254/(云元数据端点)绕过防护访问内网
- 修复:.redirect(reqwest::redirect::Policy::none()) 完全禁用重定向
P1: src/tools/file_read/write/edit.rs 符号链接路径遍历
- resolve_path 用 starts_with 检查但未 canonicalize
- 攻击者可在 allowed_dir 内创建指向 /etc/passwd 的符号链接绕过限制
- 修复:对 resolved 和 allowed 均执行 canonicalize 后比较
- file_read: 文件必须存在,canonicalize 失败直接报错
- file_write/edit: 文件可能不存在,降级到父目录 canonicalize
P1: src/protocol/mod.rs + list_todos.rs TodoItemSummary 字段缺失
- 后端 TodoItemSummary 仅返回 4 字段,前端期望 7 字段
- 缺失 priority, created_at, updated_at,前端 TodoPanel 无法显示
优先级和时间戳
- 修复:struct 补齐 3 字段,list_todos 构造时传递完整字段
2026-07-08 16:23:09 +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
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
bf1549b88b
feat: 优化 todo_write 工具的 merge 参数描述,调整默认值逻辑并添加测试
2026-06-29 09:24:05 +08:00
oudecheng
c72853c79d
feat: 添加 user_message_id 字段以支持用户消息的关联和同步
2026-06-24 15:13:36 +08:00
oudecheng
4efc8b51e7
feat(todo): 添加待办项关联的创建消息ID并支持消息高亮
...
- 在待办相关数据结构和存储中新增 created_by_message_id 字段
- 记录待办项创建时对应的消息ID,支持追溯来源
- 在前端待办列表项增加点击事件,点击后滚动并高亮对应消息
- 在消息列表组件中实现高亮动画及自动滚动功能
- 更新相关工具、协议和数据库查询,确保新字段正确传递和存储
- 增加 CSS 动画实现待办对应消息的高亮闪烁效果
- 优化前端状态管理,支持设置与获取高亮消息ID
2026-06-22 14:50:37 +08:00
oudecheng
606fcbcd29
feat(agent): 注入并传递 tool_call_id 实现任务与工具调用精准关联
...
- 在 agent_loop 执行上下文中注入 tool_call_id,确保执行时传递该字段
- 在 agent_factory、ws、todo_read、todo_write 等多处构造对象时添加 tool_call_id 字段初始化
- 扩展协议定义及序列化,支持 tool_call_id 字段传递
- 在工具调用任务运行时传递 tool_call_id,便于事件追踪和层级关联
- 在前端 useChat hook 增加 tool_call_id 关联逻辑,实现 task_started 事件精准匹配和跳转
- 增加 pendingTaskNavs 缓存处理,解决 task_started 事件先于 tool_call 到达的顺序问题
- 调整消息渲染逻辑,根据 tool_call_id 进行优先匹配,提升用户交互体验
2026-06-22 10:22:36 +08:00
oudecheng
e506ffd539
feat(agent): 支持子孙智能体的父任务链路传递
...
- 在 agent_factory 和子代理相关结构体中新增 parent_task_id 字段
- 协议层序列化、反序列化及 WebSocket 适配器支持 parent_task_id 信息传递
- todo_read 与 todo_write 工具添加 parent_task_id 以保持任务层级一致
- 在 DefaultSubAgentRuntime 中实现从 session_id 提取 parent_task_id 的逻辑
- 子智能体创建孙智能体时,正确设置并传递 parent_task_id 元数据
- 前端 useChat 钩子过滤孙智能体的 TaskStarted 事件,避免视图串扰
2026-06-18 11:30:47 +08:00
fc7df67474
feat(streaming): 支持流式文本增量与结束信号功能
...
- 新增 StreamDelta 和 StreamEnd 类型,支持流式数据增量传输
- 扩展 LLMProvider trait,添加带回调的 chat_with_streaming 接口
- 修改 OpenAI Provider 实现,支持流式聊天回调传输增量数据
- Agent 流处理改为异步消费增量消息并传递给前端
- 保证流式增量和最终消息使用相同消息 ID 以便前端替换
- 修改消息总线和协议层,支持携带和识别流式消息的消息 ID
- 客户端 CLI 通过增量输出实现交互式流式响应显示
- Web 前端接收流式增量消息,追加到对应消息,实现实时显示
- 各通道(飞书、微信)支持转发流式增量和结束消息
- 任务工具运行时添加消息 ID 支持,保持消息一致性
- 统一消息构造函数新增流式增量和结束信号的构建方法
2026-06-14 10:24:52 +08:00
229221aab1
refactor(todo): 重构待办事项管理逻辑及更新状态规则
...
- 移除 TodoItem 中的 priority、created_at 和 updated_at 字段
- 强制每个任务都必须有唯一 id,且由用户负责生成
- 修改合并模式逻辑,merge=true 下保留未提及的旧任务
- 支持已完成和已取消任务重新激活(状态改回 pending 或 in_progress)
- 禁止 in_progress 状态退回到 pending,必须标记为 completed 或 cancelled
- 优化状态转换校验,允许特定状态间合法切换
- 简化任务变更消息,移除详细的新增/更新/移除统计
- 更新文档和示例,明确 id 必须由用户生成和使用
- 修复和补充测试,增强状态转换和合并模式验证
- 调整任务时间戳生成逻辑,统一使用当前时间及索引
- 该变更提供更合理的任务状态机械及管理模式,提升稳定性和易用性
2026-06-13 17:38:18 +08:00
oudecheng
881fcace47
feat: 添加 todo_write 工具,支持全量替换和增量合并两种模式
...
- Tool: 纯内存实现 (Arc<RwLock<HashMap>>),零 DB 依赖,解耦持久化
- 状态机: pending → in_progress → completed/cancelled,单 in_progress 约束
- merge=false: 全量替换模式(默认)
- merge=true: 增量更新模式,只传变更的项,其余保留
- 隔离: scope_key = topic_id.unwrap_or(session_id),topic 和子代理隔离
- 持久化: TodoRepository trait + SessionStore SQLite 实现,在 Session 拦截器层完成
- 前端推送: WsOutbound::TodoList 事件
- Prompt: TodoPromptProvider 中文指令,子代理模板也包含
- 测试: 16 个单元测试,全部通过
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 14:19:07 +08:00
oudecheng
cedd8b2a69
feat: 添加 topic_id 字段到消息结构,优化消息处理逻辑
2026-06-12 12:22:21 +08:00
oudecheng
87fc8cc3b7
feat: 更新工具调用的ID处理逻辑,确保在缺失时生成唯一ID
2026-06-12 11:48:01 +08:00
oudecheng
4487f1a490
feat: 添加思考过程显示功能,允许用户选择是否展示助手的思考内容
2026-06-11 17:15:03 +08:00
oudecheng
6ff5907616
feat: 添加 reasoning_content 字段到多个消息结构,支持思考过程展示
2026-06-11 14:33:29 +08:00
oudecheng
0ce89a0e4e
feat: 添加 reasoning_content 字段到多个消息结构,支持思考过程展示
2026-06-11 12:04:52 +08:00
oudecheng
f470affb2f
feat: 添加技能列表功能,支持列出所有技能并在前端展示
2026-06-08 14:13:54 +08:00
7708112649
feat: 添加记忆功能,支持列出所有记忆并在前端展示,优化记忆面板
2026-06-07 19:50:46 +08:00
eeea7d44d0
feat: 添加 topic_id 支持,确保消息按话题隔离
2026-06-07 17:49:22 +08:00
bf66c00950
feat: 为 WebSocket 消息添加时间戳字段,确保消息的时间信息可用
2026-06-07 09:18:15 +08:00
e8a3a47ac7
feat: 添加 TaskStarted 事件,支持任务开始通知功能
2026-06-03 21:53:37 +08:00
oudecheng
1b571e943f
feat: 添加停止当前执行的 Agent 功能,支持通过 /stop 命令取消执行
2026-06-03 16:49:29 +08:00
oudecheng
5f2bc950b1
feat: 添加定时任务和聊天消息加载功能,增强调度管理
2026-06-02 17:04:00 +08:00
oudecheng
f8fc0f7d0f
feat: 添加工具结果处理功能,支持执行时长记录和显示
2026-06-02 16:15:05 +08:00
c2293238fc
feat: 前端支持文件附件输入
...
- 后端 WsInbound::Message 添加 attachments 字段
- ws.rs 将 attachments 转换为 MediaItem
- 前端 MessageInput 支持点击选择和拖拽文件
- 附件预览列表,支持删除
- 文件大小限制 50MB
- 支持所有文件类型
2026-05-30 08:07:02 +08:00
oudecheng
d0051baa07
refactor: 消息持久化从批量改为实时逐条,通过装饰器模式实现
...
- 新增 PersistingEmittedMessageHandler 装饰器,在 emitter 广播前逐条落库
- processor 和 task/runtime 使用装饰器包裹 emitter,替代 post-loop 批量写入
- 移除 session_history 中的批量 DB 写入,仅保留内存历史更新
- execution 中跳过已由 live emitter 实时广播的工具消息,避免重复
- 前端支持运行中 task 工具卡片"查看实时进度"跳转子智能体视图
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 16:47:57 +08:00
oudecheng
4cb26b5b67
feat: 子智能体任务消息查看,实时广播工具调用事件
...
- 新增 LoadTaskMessages 命令,加载子智能体任务的历史消息
- SubAgentEmitter 通过 MessageBus 实时广播子智能体工具调用
- 前端新增子智能体视图,支持导航进入/退出子智能体会话
- 外部渠道过滤子智能体事件,避免推送到飞书/微信
- ToolCall/ToolResult 新增 subagent_task_id 字段
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 11:15:38 +08:00
oudecheng
598d425c28
feat: 话题添加描述字段,工具消息按 tool_call_id 合并展示
...
- TopicSummary 新增 description 字段,侧边栏优先显示描述
- ToolPanel 使用 toolCallId 将 tool_call 和 tool_result 配对合并展示
- 保存消息时同步更新 topics 表的 message_count 和 last_active_at
- ChatMessage 新增 toolCallId 字段
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 14:30:21 +08:00
oudecheng
44e82e8473
feat: 附件通过 base64 内容实现前端直接下载
...
- MediaItem/MediaSummary 新增 content_base64 和 file_name 字段
- 解析附件时读取文件内容并 base64 编码(限 50MB),前端 Blob 下载
- 创建 Session 后返回完整 topics 列表,前端侧边栏实时同步
- 简化话题历史加载逻辑,不再回退到 session 消息
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 14:01:37 +08:00
oudecheng
7898ca69e4
feat: 添加附件支持、自动选择话题及消息展示优化
...
- 消息协议新增 attachments 字段,支持图片/音频/视频/文件附件
- 文本和附件合并在一条消息中发送,不再拆分为多条
- Topics 加载后自动选中第一个话题并加载历史消息
- 用户消息现在通过 WebSocket 发送,可在前端展示
- 前端过滤 tool_result 消息,添加附件卡片展示组件
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 11:51:48 +08:00
oudecheng
e9e1439428
feat: 添加通道和话题管理功能
...
后端:
- 新增 ListChannels 命令,列出所有可用通道 (WebSocket/CLI)
- 新增 ListSessionsByChannel 命令,支持按通道筛选会话
- 新增 ListTopics 命令,列出 Session 的所有 Topics
- 添加 Channel 和 TopicSummary 数据结构
- 更新 WebSocket 协议,支持 channel_list 和 topic_list 消息
前端:
- 新增 ChannelSelector 组件用于通道选择
- 新增 SessionSelector 组件用于会话选择
- 更新 TopicList 组件支持话题展示
- 更新 useChat hook 和协议类型定义
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 14:55:09 +08:00
oudecheng
025c0b5d7f
feat: 添加 session_id 支持到 OutboundMessage,优化会话管理
2026-05-15 10:00:17 +08:00
5eb9a26843
feat: 添加会话查询命令处理器,支持列出和加载会话功能
2026-05-14 23:27:23 +08:00
b77fc93d71
Refactor command handling and input adapters
...
- Removed the `format_session_list` function and related session handling from the client module.
- Simplified command output in the client by removing session-related commands.
- Introduced `ChannelInputAdapter` for parsing channel commands like `/new` and `/save`.
- Updated WebSocket handling to process commands via the new command system.
- Removed deprecated in-chat command handling from the gateway.
- Adjusted tests to reflect changes in command serialization and session handling.
- Enhanced session cleanup and job scheduling in the configuration module.
2026-05-14 22:23:02 +08:00
35b9c42d07
feat: 添加 /save 命令以保存会话内容到 Markdown 文件;实现 SaveSessionCommandHandler 处理逻辑
2026-05-13 21:46:29 +08:00
8f27bd2735
feat: 重构工具和协议模块,添加工具注册和会话管理逻辑,优化消息处理
2026-04-28 14:16:30 +08:00