release: v6.1.0 - TUI 体验全面升级 + 背景自定义

TUI 界面改进:
- 全面中文化: CommandPalette/HelpPanel/Footer/Chatbox 边框标题等所有用户可见英文汉化
- 辅助中心 (Ctrl+P/F9): 原"设置"重命名, 含 6 项可切换设置
- 独立帮助浮层 (? 键): 重写帮助页面逻辑, 全中文, 带滑入淡入动画
- 背景切换: 辅助中心 [5] 预设背景, [6] 自定义背景; 新增 /bg 命令支持图片提取主色调
- 换行修复: Ctrl+J 作为主推换行键 (Windows 终端不区分 Shift+Enter)
- 引擎切换修复: 解决 call_from_thread 在主线程崩溃的 RuntimeError

技术改进:
- 文本工具调用解析: 检测模型用 <tool_call> 标签返回的工具调用
- 网络工具优化: network_tools.py 和 ai_search.py 改进请求头/重试/编码
- 流式输出修复: append_chunk 的 refresh 改为 layout=True
- 取消响应修复: 引擎层 _cancelled 标志 + TUI 层 worker 身份跟踪

融合 v6.0.0 工作:
- 保留 terminal 模拟器/operit 桥接/深度思考/工作模式/记忆模式等 v6.0.0 全部功能
- 在此基础上叠加本会话的 TUI 改进
This commit is contained in:
shuiyu1123 committed 2026-06-29 13:00:19 +08:00
1 parent b5f638cffc
commit de15b54b19
30 files changed
+3267 -934

No files matched your search

+13 -28
View File
@@ -107,24 +107,16 @@ class ProcessProtection:
if sys.platform == 'darwin':
# macOS: 使用 fcntl 文件锁
import fcntl
self._lock_fd = open(self._lock_file_path, 'w')
self._lock_fd = open(self._lock_file_path, 'a+')
self._lock_fd.seek(0)
try:
fcntl.flock(self._lock_fd.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
except (IOError, OSError):
# 文件已被锁定 — 已有实例在运行
# 检查锁文件中的 PID 是否仍在运行
try:
old_pid = self._lock_fd.read().strip()
if old_pid and self._is_process_running(int(old_pid)):
self._lock_fd.close()
self._lock_fd = None
return False
else:
# 旧进程已死,清理残留锁
self._lock_fd.seek(0)
self._lock_fd.truncate()
except (ValueError, OSError):
pass
# flock 失败 — 已有存活实例在运行
# (flock 是进程级锁,进程退出时自动释放)
self._lock_fd.close()
self._lock_fd = None
return False
self._lock_fd.seek(0)
self._lock_fd.truncate()
@@ -135,22 +127,15 @@ class ProcessProtection:
else:
# Linux: 使用 fcntl 文件锁
import fcntl
self._lock_fd = open(self._lock_file_path, 'w')
self._lock_fd = open(self._lock_file_path, 'a+')
self._lock_fd.seek(0)
try:
fcntl.flock(self._lock_fd.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
except (IOError, OSError):
# 检查旧进程是否仍在运行
try:
old_pid = self._lock_fd.read().strip()
if old_pid and self._is_process_running(int(old_pid)):
self._lock_fd.close()
self._lock_fd = None
return False
else:
self._lock_fd.seek(0)
self._lock_fd.truncate()
except (ValueError, OSError):
pass
# flock 失败 — 已有存活实例在运行
self._lock_fd.close()
self._lock_fd = None
return False
self._lock_fd.seek(0)
self._lock_fd.truncate()