release: v8.0.4 — 会话 SQLite 存储 + 去加载动画 + 展示截断 + 工具调用解析加固

- 会话数据改用 SQLite(chat_history/conversations.db,WAL):sessions / snapshots 两表,
  首次启动自动迁移旧 JSON,/chat 与 /resume 改走 SQLite,memory 搜索兼容数据库
- 去掉流式显示(_typeprint 改整段打印)与常驻加载动画(移除 show_animation 线程及逐帧输出)
- 展示给用户的消息过长自动截断(仅展示层,底层 messages 完整保存)
- 工具调用解析加固:_loads_json 四级兜底修复;新增 _extract_last_action_json 成对错括号扫描;
  续轮也下发 Function Calling 工具,减少长文本格式错误浪费 token
- 版本号统一更新至 8.0.4(README/about.txt/constants/TUI banner/LSP·MCP clientInfo)
- 12 项 session 单测 + 8 项 JSON 提取边界用例全部通过

Co-Authored-By: WorkBuddy <workbuddy@tencent.com>
This commit is contained in:
shuiyu67andWorkBuddy committed 2026-08-08 00:54:18 +08:00
1 parent 66de8eea13
commit 749fb3f91c
15 files changed
+510 -249

No files matched your search

+5 -9
View File
@@ -65,15 +65,11 @@ def test_title_generated_from_first_user_msg(tmp_history):
def test_list_sessions_sorted_desc(tmp_history):
mgr = SessionManager(tmp_history)
# 写入两个会话,并强制 s1 的更新时间更早,制造稳定可排序差
s1 = mgr.new_session(); mgr.save(s1, [{"role": "user", "content": "旧会话A"}])
path1 = os.path.join(tmp_history, f"{s1.id}.json")
with open(path1, "r", encoding="utf-8") as f:
d = json.load(f)
d["updated_at"] = "2020-01-01 00:00:00"
with open(path1, "w", encoding="utf-8") as f:
json.dump(d, f, ensure_ascii=False)
s2 = mgr.new_session(); mgr.save(s2, [{"role": "user", "content": "新会话B"}])
# 写入两个会话,并用 updated_at 覆盖制造稳定可排序差(SQLite 后端)
s1 = mgr.new_session()
mgr.save(s1, [{"role": "user", "content": "旧会话A"}], updated_at="2020-01-01 00:00:00")
s2 = mgr.new_session()
mgr.save(s2, [{"role": "user", "content": "新会话B"}], updated_at="2026-08-08 00:00:00")
sessions = mgr.list_sessions()
assert len(sessions) == 2
# 倒序:更新的在前(updated_at 时间戳更大)