143 Commits

Author SHA1 Message Date
98eb7bea3d 新增跨session消息发送能力 2026-05-04 00:32:24 +08:00
24d3407b05 fix(session): 所有时间显示改用本地时区而非 UTC
- /info 和 /sessions 中的时间戳通过 DateTime::from_timestamp_millis 后
  调用 with_timezone(&Local) 转换为本地时间
- dump_to_file 和 dump_as_markdown 导出的时间也改用本地时区
2026-04-29 23:04:01 +08:00
fe4088cd1f feat(session): 扩展 /info 命令显示更多 session 信息
新增:对话标题、模型名称、用户消息数/总消息数、创建时间、最后活跃时间
2026-04-29 22:59:49 +08:00
5c558027fa feat(session): 添加 /? 帮助命令,错误命令显示友好提示
- 新增 /? 和 /help 命令显示所有可用斜杠命令
- 未知命令不再报错,而是提示"未知命令:/xxx。输入 /? 获取帮助。"
- execute_slash_command 错误现在返回友好提示而非传播为服务器错误
2026-04-29 22:57:59 +08:00
e1681e0424 debug(session): 添加 handle_message 和 session 恢复的 tracing 日志
用于排查 restart 后 session 恢复和 TTL 刷新问题。
2026-04-29 22:51:50 +08:00
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