dcb2d552d9
chore(session): 将标题生成阈值从 10 条减至 5 条用户消息
2026-04-29 22:46:33 +08:00
228204517d
fix(session): 每次 add_message 时同步更新 Storage 的 message_count
...
之前只持久化了消息内容,没有更新 SessionMeta.message_count,
导致重启后从 Storage 恢复时 message_count 低于实际值,
should_generate_title() 判断失败。
2026-04-29 22:45:04 +08:00
97e3be6d3a
fix(session): 调用 generate_title 生成对话标题
...
之前 generate_title 函数已实现但从未被调用,导致对话标题
自动生成(10 条用户消息后)一直没有触发。
2026-04-29 22:34:02 +08:00
2f2631e36a
fix(session): /new 后新对话被旧对话数据覆盖的问题
...
问题原因:execute_slash_command 执行 /new 后,错误地将旧 session 的数据
存储到新 session 的 key 下,导致 current_sessions 虽然指向新 session,
但 sessions 里面存的是旧数据。
解决方案:移除错误的 session 映射更新逻辑。create_session 已经正确地将
新 session 存入 sessions 并更新 current_sessions,不需要额外覆盖。
2026-04-29 22:32:58 +08:00
e2fd836794
fix(session): 消息持久化和恢复
...
问题:消息只写内存,重启后丢失。from_storage 恢复了 meta 但没加载消息。
修复:
- add_message 改为 async,同时写内存和 Storage
- compact 场景用 persist=false 避免重复持久化
- clear_session_history 同时清内存和 Storage 消息
- 所有调用点添加 .await 和错误转换
2026-04-28 23:10:53 +08:00
c48ed83a23
refactor(session): 移除 InboundMessage.dialog_id,dialog_id 完全由 SessionManager 管理
...
Channel 消息不再携带 dialog_id,完全由 SessionManager 通过
current_sessions 内部管理。/new 后下一条消息会自动路由到新 session。
改动:
- InboundMessage 移除 dialog_id 字段
- handle_message 移除 dialog_id 参数
- Feishu/CLI channel 创建 InboundMessage 时不再设置 dialog_id
- 路由逻辑简化为:current_sessions → find_active_session → 创建新 session
2026-04-28 23:05:06 +08:00
e235268133
fix(session): /new 后仍停留在旧对话的问题
...
问题原因:/new 创建新 session 后,客户端下次发消息仍带着旧的
dialog_id,导致服务端找到旧 session。
解决方案:在 SessionManager 中新增 current_sessions 跟踪
每个 channel:chat_id 的当前活跃 session:
- create_session / get_or_create_session 时更新 current_sessions
- switch_dialog / delete_dialog 时同步更新 current_sessions
- handle_message 无 dialog_id 时优先使用 current_sessions
2026-04-28 22:53:37 +08:00
7fac68b51c
feat(session): Phase 4 - 斜杠命令完善
...
新增命令:
- /sessions — 列出 channel:chat_id 下最近 10 条对话
- /switch <dialog_id> — 切换到指定对话
- /rename <新标题> — 重命名当前对话
更新命令:
- /delete — 软删除后创建新对话
- /info — 显示 session_id + message_count
所有命令描述改为中文。
2026-04-28 22:30:22 +08:00
ac7576bb4b
feat(session): Phase 3 - SessionManager 完善
...
- SessionManager::new 接收 Arc<Storage> 参数
- create_session / get_or_create_session 写入/恢复 Storage
- handle_message 支持无 dialog_id 时自动查找最近活跃 session 或创建新 session
- 实现 list_dialogs() — 从 Storage 读取最近 10 条
- 实现 switch_dialog() — 从 Storage 恢复 session
- 实现 delete_dialog() — 软删除 Storage + 内存移除
- 实现 rename_dialog() — 更新 Storage 和内存 title
- 实现 archive_dialog()(空实现,archive 概念已删除)
- 新增 start_cleanup_task() 后台 TTL 清理任务
- GatewayConfig 新增 session_db_path 和 cleanup_interval_minutes 配置
- Gateway::new 改为 async,创建 Storage 并启动清理任务
- rename_dialog / delete_dialog 改为 async(需 .await)
- WsOutbound::SystemNotification 已在 Phase 2 添加
2026-04-28 22:29:24 +08:00
5f7ffd28ef
feat(session): Phase 2 - 扩展 Session 结构
...
- Session 新增字段: title, created_at, last_active_at,
message_count, total_message_count, seq_counter,
storage, routing_info
- Session::new 新增 storage/routing_info/title 参数
- 新增 Session::from_storage() 从 Storage 恢复 Session
- 新增 Session::add_message_and_persist() 持久化版本
- 新增 Session::send_system_notification() 不记历史的通知
- 新增 Session::persist_session_meta() 写回 Storage
- 新增 Session::should_generate_title() / generate_title()
- 新增 LLM title 自动生成(10 条消息后触发)
- SessionManager::create_session 新增 routing_info 参数
- WsOutbound 新增 SystemNotification variant
- Client mod.rs 处理 SystemNotification
2026-04-28 22:25:10 +08:00
c17e286db1
test(storage): 编写 Storage 单元测试
2026-04-28 22:17:02 +08:00
3ffa8c41f7
feat(storage): 添加写入重试逻辑
2026-04-28 22:13:49 +08:00
69a8ec2775
feat(storage): 实现 Message CRUD 操作
2026-04-28 22:13:29 +08:00
eeb8a77ac8
feat(storage): 实现 Session CRUD 操作
2026-04-28 22:13:10 +08:00
c51ba900fa
feat(storage): 定义 SessionMeta 和 MessageMeta 数据结构
2026-04-28 22:12:44 +08:00
88f8a86b99
feat(storage): 实现 Storage 主结构和初始化
2026-04-28 22:12:30 +08:00
c4c87aac95
feat(storage): 创建 storage 模块骨架
2026-04-28 22:09:10 +08:00
22546d3ad0
feat(storage): 添加 StorageError 类型
2026-04-28 22:08:47 +08:00
3ed7ac7cbd
deps: 添加 sqlx + sqlite 依赖
2026-04-28 22:07:55 +08:00
575f264773
docs: 添加 Phase 1 Storage 基础实现计划
...
9 个 Task:
1. 添加 sqlx + sqlite 依赖
2. 创建 StorageError 类型
3. 创建 storage 模块骨架
4. 实现 Storage 主结构 + init_schema
5. 定义 SessionMeta / MessageMeta
6. 实现 Session CRUD
7. 实现 Message CRUD
8. 添加写入重试逻辑
9. 编写 7 个单元测试
2026-04-28 21:46:32 +08:00
2cbd959ac4
docs: 添加 Session 持久化设计方案
...
设计目标:
- SQLite 持久化,消息实时落盘
- Session = Dialog 概念等价,不再分层
- handle_message 自动恢复或创建 session
- Dialog 完整生命周期管理(/new /sessions /switch /rename /delete)
- Title 自动生成(10 条用户消息后)
- TTL 自动内存清理,Storage 保留所有数据
2026-04-28 21:45:05 +08:00
1ac6de118a
修复 /dump 命令:保存到文件并注入系统提示词
...
- /dump 现在保存到 {workspace}/dumps/ 目录而非仅返回文本
- dump 文件包含注入模型的完整系统提示词(AgentLoop + Skills)
- 修复 cli_chat 中 current_session_guard 变量声明问题
- gateway 正确处理 HandleResult::AgentResponse 和 CommandOutput
- 移除 cli_chat 中未使用的 parse_slash_command 导入
2026-04-28 21:27:36 +08:00
e61b78eaff
重构:斜杠命令通过 handle_message 处理,Channel 不再管理 Session
...
架构优化:
- Feishu 渠道的 handle_and_publish 简化为只发布消息到 bus
- Session 创建/复用由 SessionManager 在 handle_message 内部处理
- 斜杠命令检测移到 handle_message,execute_slash_command 直接调用
- CLI 和 Feishu 统一通过消息总线处理斜杠命令
2026-04-28 21:10:28 +08:00
e787203e94
修复飞书渠道会话创建时机:执行斜杠命令前先确保会话存在
...
在 Feishu 收到斜杠命令时,先通过 CreateDialog 创建会话,
再执行实际的命令。这样 /dump 等命令就能正确获取对话历史。
2026-04-28 21:06:25 +08:00
c52461055d
修复飞书渠道 /dump 和 /info 命令:支持无会话时自动创建
...
当 Feishu 用户首次发送斜杠命令时,如果没有会话则自动创建。
这使得 /dump 和 /info 命令可以在对话开始前使用。
2026-04-28 21:03:58 +08:00
30b68599a4
为飞书渠道添加斜杠命令支持
...
重写 FeishuChannel 的 handle_and_publish 方法,在发布消息前
检查是否为斜杠命令。如果是,则通过控制平面执行命令并返回结果。
2026-04-28 20:58:31 +08:00
a3d8ebb534
添加 /dump 命令,导出 session 为 markdown 文档
...
/dump 命令会输出当前 session 的完整信息:
- Session 元信息 (ID, channel, chat_id, model 等)
- 所有对话历史 (system, user, assistant, tool)
- 每条消息包含角色、时间戳、内容、工具调用等
2026-04-28 20:54:54 +08:00
84bb06cc76
优化日志输出:斜杠命令执行时打印,过滤冗余的压缩日志
...
- 添加斜杠命令执行的 info 日志
- Context compression 日志只在实际触发压缩时输出 (debug级别)
2026-04-28 20:52:20 +08:00
7220e89a22
简化斜杠命令,移除不可用的命令
...
删除:sessions, switch, rename, archive
保留:new, delete, compact, info
2026-04-28 20:50:01 +08:00
8219e7c928
优化系统提示词:移除冗余的工具列表,自动创建skills目录
...
- 移除 ToolsSection:工具定义已通过 API 的 tools 参数传递,无需在提示词中重复
- SkillsLoader 启动时自动创建 ~/.picobot/skills 目录
2026-04-28 20:41:36 +08:00
6c50f433d1
删除旧的session持久化机制
2026-04-28 20:34:44 +08:00
61eea62bfc
增强斜杠命令功能,支持参数解析和新命令;实现双重 Ctrl+C 退出确认
2026-04-28 00:01:28 +08:00
c11eb348f9
Refactor: Make AgentLoop stateless, clean up architecture
2026-04-27 23:23:10 +08:00
1abac85034
集成技能功能到系统提示词框架
...
- 在 AgentLoop 中添加 SkillsLoader 支持\n- 在系统提示词构建中集成技能提示\n- 更新 Session 以传递 SkillsLoader\n- 修复所有编译错误和测试问题
2026-04-27 23:04:24 +08:00
8226e8429d
Merge remote-tracking branch 'origin/main'
2026-04-27 22:47:37 +08:00
cc73344192
Add AGENTS.md and CLAUDE.md for agent guidance
...
- AGENTS.md: build/run commands, config, tests, reference directory,
architecture with data flow diagram, module responsibilities,
functional boundaries, key constraints, known issues
- CLAUDE.md: redirect to AGENTS.md for Claude Code
- .gitignore: stop ignoring AGENTS.md and CLAUDE.md
2026-04-27 18:35:09 +08:00
f704900e07
统一工作目录管理
2026-04-27 17:23:52 +08:00
75a3bf9df4
增加系统提示词框架
2026-04-27 17:07:01 +08:00
ac2333900a
重构: 添加技能加载和获取工具,优化技能管理
2026-04-26 23:35:06 +08:00
401a7b6473
初步实现skill
2026-04-26 23:18:23 +08:00
98259a7770
重构: 添加斜杠命令支持和命令菜单功能
2026-04-26 22:09:04 +08:00
0c356e7ac4
重构: 添加斜杠命令解析和执行功能
2026-04-26 21:51:24 +08:00
38425e23f6
重构: 优化终端初始化和清理流程
2026-04-26 21:40:34 +08:00
bcee62713f
重构: 移除调试日志以简化消息处理流程
2026-04-26 21:26:27 +08:00
cf6d57c568
重构: 添加 TUI 组件以支持聊天界面和输入处理
2026-04-26 21:00:17 +08:00
86dea0f874
Refactor session management to support dialog-based architecture
...
- Removed InputHandler and related input event handling code.
- Updated GatewayState to handle new session commands for dialogs.
- Introduced UnifiedSessionId for managing session identifiers across channels and chats.
- Refactored Session and SessionManager to manage dialogs instead of sessions.
- Added methods for creating, listing, switching, renaming, archiving, and deleting dialogs.
- Updated storage functions to accommodate dialog IDs in persistent session management.
- Enhanced tests to cover new dialog functionalities and ensure stability.
2026-04-26 20:59:54 +08:00
5ce5502c56
refactor: 抽取独立 session 模块
...
将 Session/SessionManager 从 gateway 抽取到独立的 session 模块:
- 新建 src/session/ 目录
- mod.rs: 模块导出
- error.rs: SessionError 类型
- commands.rs: SessionCommand 枚举
- events.rs: SessionEvent 枚举
- session.rs: Session 和 SessionManager 实现
- 更新 src/gateway/mod.rs
- 移除 pub mod session
- 改用 crate::session::SessionManager
- 更新 src/lib.rs
- 添加 pub mod session
- 删除 src/gateway/session.rs (内容已移动)
注意: ControlInbound/ControlOutbound/ControlMessage 保留在 bus/message.rs,
cli_chat 仍通过消息总线与 SessionManager 通信,待后续简化。
2026-04-26 17:48:23 +08:00
75281952d0
refactor: 统一 current_timestamp 函数到 bus::message 模块
...
- bus/message.rs: current_timestamp 改为 pub(crate) 导出
- cli_chat.rs: 删除本地定义,改用 crate:🚌 :message::current_timestamp()
- feishu.rs: 改用 crate:🚌 :message::current_timestamp()
- storage/mod.rs: 删除本地定义,改用 crate:🚌 :message::current_timestamp()
2026-04-26 17:24:44 +08:00
72c888a41f
重构: 整合客户端代码到 client 目录
...
- 将 cli/ 目录合并到 client/
- InputEvent::Message 改为简单 String 类型,移除对 ChatMessage 的依赖
- cli 模块从 lib.rs 移除
- client/mod.rs 添加 mod channel 和 mod input 声明
- 添加设计文档 docs/plans/2026-04-26-client-refactor-design.md
2026-04-26 17:18:13 +08:00
dfe0fad61e
重构: 统一消息总线与通道管理,消除重复引用
...
- OutboundDispatcher 改用 ChannelManager 获取通道,不再维护独立注册表
- CliChatChannel 通过控制消息通道操作 SessionStore,移除独立引用
- MessageBus 统一通过 ChannelManager 创建,避免重复实例
- GatewayState 移除冗余字段,统一通过 ChannelManager 访问
- 新增 ControlInbound/ControlOutbound/ControlMessage 类型支持会话管理操作
- 添加 ARCHITECTURE_REVIEW.md 记录架构问题与修复状态
2026-04-26 17:09:52 +08:00