Commit Graph
35 Commits
Author SHA1 Message Date
shuiyu67 a63b9d2f97 fix: 修复 'ToolResult' object has no attribute 'get'
根因: cli_tools.process_tool_call 在启用 UnifiedToolManager 时直接返回
ToolResult 对象,而 7 个调用点全部按 dict 用 result.get('result'),触发
AttributeError;FC 路径 _execute_tool_by_name 也可能把 ToolResult 透传出去,
后续 result[:5000] 会再炸 TypeError。

- tool_result.py: 新增 normalize_tool_text / normalize_tool_dict,
  统一收敛 ToolResult / dict / str / None 三种历史返回形态。
- cli_tools.process_tool_call: 统一返回 dict(附带 success/error_code/
  tool_result),回退 handler 路径同样归一。
- cli_core._execute_tool_by_name: handler / memory / scheduler 返回值
  归一成 str,保证 FC 路径可安全切片。
- openai/ollama/manual 引擎、websocket_server、cli_clawli: 取工具结果改用
  normalize_tool_text(带本地兜底实现,避免循环导入)。
- cli_clawli: 顺带修复只回传最后一个工具结果的 bug,改为汇总全部。
- 测试: 23 项全过;纯格式/讯飞 500 降级回归冒烟通过。
2026-08-05 10:54:39 +08:00
shuiyu67 dfc42d8583 fix(v8.0): openai 引擎改纯官方格式 + 讯飞 500 兼容 + <input> 向导
- openai_engine: 请求体严格纯官方 OpenAI /chat/completions 格式(tool 消息去 name、
  tool_calls 重建、tools 统一 type=function);500(含 xunfei/Invalid Params)自动去掉
  tools 降级重试;_friendly_error 友好提示;MODEL_CONTEXT_WINDOWS 补讯飞星火。
- ollama_engine/fc_tools/cli_core: tool 消息去 name。
- config.py resolve_input_value(<input> 语法);ollama max_token_k(默认 <input:...>);
  launcher 向导加 max_token_k 步骤。
2026-08-05 00:26:02 +08:00
shuiyu67 db9203687d fix(v8.0): 启用真·全屏 textual TUI 并修复 opacity 崩溃
- 修复崩溃: tui.py MessageBubble.on_mount 用 self.animate('opacity'),但
  textual>=8 的 Widget.opacity 为只读属性会抛 'has no setter',导致每条消息
  气泡崩溃 -> 改 styles.animate 并兜底直接设置。
- run_tui 改为默认真·全屏 textual XiaoliTUI(上方滚动聊天区+底部固定输入框+侧栏),
  rich 面板仅作 textual 不可用时的回退(此前默认的是顺序面板,被指出是'假TUI')。
- 版本统一 v8.0.0: 欢迎框 + /about 改用 VERSION 常量。
- 状态栏联动 token 感知: 显示 used/context_window 进度条(引擎支持时)。
- 新增 /snapshot(/screenshot) 命令: 导出当前屏幕 SVG 到 .tui_snapshots/live.svg,
  让实时 TUI 也能被 AI 自验。
- 新增 tools/tui_real_snapshot.py: textual run_test+Pilot 无头驱动真实 TUI,
  喂对话、断言 DOM(用户/工具成功失败/助手/状态栏/token条/欢迎版本),导出 SVG。
  7 项断言全过。
- 注: launcher 启动会重写 plugins_config.py/requirements.txt(含 tkinter 等错误项),
  提交前已还原,避免误提交漂移。
2026-08-01 10:30:42 +08:00
shuiyu67 79957eba0f feat(v8.0): 基于 v5.4.1 重构立项 v8.0.0
- 版本立项: constants.VERSION=8.0.0,about.txt/README 同步。
- Rich 面板式 TUI (xcli_core/rich_tui.py): 默认 TUI 渲染器,rich 驱动;
  核心创新=快照出口(Console(record=True) -> text/svg/html),AI 开发界面
  时可把渲染读回自验,补上'看不见渲染'闭环。tools/tui_snapshot.py 无头生成
  演示快照。run_tui 优先 RichTUI,textual 作为回退。
- Token 感知压缩: openai_engine 捕获 usage.prompt_tokens -> last_prompt_tokens,
  新增 context_window()(模型名查表 MODEL_CONTEXT_WINDOWS + config 覆盖);
  memory.should_compress 升级为 token 感知(used/context_window >= ratio 触发,
  默认 0.7),消息数阈值兜底;cli_core.process_conversation 自动压缩并提示。
- 记忆模式增强: 保留 v5.4.1 的 MEMORY.md/日记/自动保存/AI 摘要压缩,新增
  /compress 手动压缩 与 /memory mode <companion|work> 切换。
- requirements 加 rich;.gitignore 忽略 .tui_snapshots/。
2026-08-01 09:28:39 +08:00
shuiyu1123 b8faaae0c6 release: v5.4.1 2026-06-19 00:30:15 +08:00
shuiyu1123 bac5ea01a9 feat: 统一错误处理 - ToolResult 类
- 新增 xcli_core/tool_result.py: ToolResult + ErrorCode
- unified_tool_manager: execute/mcp_call 返回 ToolResult
- cmd_executor: 所有返回改为 ToolResult
- file_manager: 所有返回改为 ToolResult
- 兼容旧接口: execute_dict() 返回 dict, handler 可返回 str 或 ToolResult
2026-06-19 00:26:49 +08:00
shuiyu1123 161ab9d3a8 feat: MCP stdio server + TUI回车发送 + 子Agent无限制 + 安全引擎优化 + diff弹窗绿红背景
- 新增 mcp_server.py: 标准 MCP stdio 传输层入口
- TUI: 回车发送消息,Shift+回车换行 (SendTextArea子类)
- 子Agent: 移除 max_steps=20 限制
- 安全引擎: 移除 ALWAYS_CONFIRM 关键词强制拦截
- code_editor: diff弹窗绿底(+)/红底(-)背景色
2026-06-19 00:10:27 +08:00
xiaoli-cli b0d9a24003 release: v5.4.0 - 跨平台进程保护机制 2026-05-09 20:33:14 +08:00
xiaoli-cli 97cc2bb0f7 feat: 跨平台进程保护机制 v5.3.0
- 新增 process_protection.py 模块
  - 单实例保护: Windows命名Mutex / macOS+Linux fcntl文件锁
  - 进程优先级提升: Windows SetPriorityClass / POSIX os.nice()
  - Windows PPL风格保护: SetErrorMode抑制错误弹窗
  - POSIX信号保护: 忽略SIGHUP/SIGPIPE, 注册SIGTERM优雅关闭
  - 看门狗监控: 后台线程监控父进程状态
  - 关闭钩子系统: 进程退出时自动执行清理
  - /protect 命令查看保护状态
- 更新 platform_utils.py 新增进程工具函数
- 集成到 cli_base.py 启动时自动初始化
- 更新 CHANGELOG.md / README.md 至 v5.3.0
2026-05-09 20:28:17 +08:00
xiaoli-cli bot a7f64cd797 refactor: 移除插件内存管理系统 + 新增工作流引擎
移除内容:
- 删除 plugin_memory_manager.py (TTL淘汰 + 懒加载系统)
- unified_tool_manager.py 精简为直接加载,去掉内存管理器集成
- tui.py 移除内存管理状态显示

新增内容:
- plugins/workflow.py: YAML 工作流引擎
  - 顺序执行多步骤 (tool/shell/echo/wait/set/if)
  - 步骤间变量传递 ({{steps.name.output}})
  - 条件分支 (if/then/else)
  - 错误处理 (continue_on_error / on_fail)
  - 断点续跑 (状态持久化)
  - 调用其他插件作为步骤
- workflows/example.yaml: 示例工作流

修复:
- unified_tool_manager.shutdown() 增加 graceful cleanup
- unregister_tool() 增加实例清理
2026-05-08 18:07:55 +08:00
OpenClaw bfefbef475 release: v5.2.0 - 插件内存管理 + TUI 修复 2026-05-08 00:47:38 +08:00
OpenClaw fb41c79b14 feat: 插件内存管理 - TTL自动淘汰 + 懒加载
新增 plugin_memory_manager.py:
- 后台线程定期扫描空闲插件,超过TTL自动从内存卸载
- AI调用已卸载插件时自动重新加载(懒加载)
- 核心插件(tool_search)可钉住永不淘汰
- 可配置: TTL(300s), 最大空闲数(10), 扫描间隔(60s), 钉住列表

改造 unified_tool_manager.py:
- 集成 PluginMemoryManager
- execute/mcp_call/search_tools/get_tool 统一走 _ensure_loaded
- search_tools 可搜索已卸载插件(使用缓存信息)
- 新增 get_all_tools_info/get_tool_by_name/memory_manager 属性

改造 tui.py:
- /status 命令显示内存管理详细状态
- 侧栏显示已加载/已卸载工具数
2026-05-08 00:40:01 +08:00
OpenClaw 038fbe24c8 fix(tui): 修复set_timer(0)导致的ZeroDivisionError
_render_welcome_animated中delay=i*0.1在i=0时为0.0,
Textual 8.x的set_timer(0,...)内部interval为0导致除零崩溃。
使用max(0.01, delay)确保最小延迟。
2026-05-08 00:24:26 +08:00
OpenClaw fe79f0e5d4 fix(tui): 修复消息分类、侧栏切换、动画失效、TextArea导入
- _write_raw: 空字符串'' in msg永远为True导致所有消息归类为tool-ok,
  替换为正确的emoji标记(✅/❌/🤖)
- action_toggle_sidebar: Textual无.visible属性,改用has_class/addClass
- CSS .hidden: display:none阻止transition动画,改用width+opacity方案
- constants.py: 添加TextArea、Rule到Textual可用性检查导入列表
2026-05-08 00:17:36 +08:00
xiaoli-cli bot 0b19ec64a4 fix: 修复 Gitee 下载支持,通过 API + token 下载插件
- Gitee raw URL 返回 403,自动转为 API 调用
- 从 GITEE_TOKEN 环境变量读取访问令牌
- 修复 Fore.DIM → Style.DIM
- 测试通过: install / list / remove 全流程正常
2026-04-30 02:42:52 +08:00
xiaoli-cli bot 6f13d41c11 feat: 添加 /plugin 插件市场命令
功能:
- /plugin list - 列出可用插件(自动同步远程源)
- /plugin search <关键词> - 搜索插件
- /plugin info <插件码> - 查看插件详情
- /plugin install <插件码|URL> - 安装插件(自动下载、启用、动态加载)
- /plugin remove <名称> - 卸载插件
- /plugin update <插件码> - 更新插件
- /plugin add-source <URL> - 添加远程插件源

文件:
- xcli_core/plugin_market.py - PluginMarketMixin 核心逻辑
- plugin_registry.json - 本地插件码注册表
- xcli_core/cli_core.py - 集成 PluginMarketMixin
- HELP.md - 添加插件市场文档
2026-04-30 02:37:05 +08:00
xiaoli-cli-bot 0d27f2b774 feat: add /manual command + fix cross-engine command routing
- /manual → switch to manual engine (CLI + TUI)
- /manual status → run manual engine sub-commands
- /manual restart → restart manual terminal
- /engine.manual status → now works from any engine (not just manual)
- Fixed handle_engine_command to route to correct engine by name
2026-04-29 20:04:40 +08:00
xiaoli-cli-bot 7a72a5c69e fix: Ollama model validation, TUI CSS, WebUI overhaul
1. Ollama: validate model is configured before API call, show helpful error
2. TUI: remove unsupported scroll-behavior CSS property
3. WebUI server: add full tool calling loop (FC + JSON action)
4. WebUI HTML: complete redesign
   - Modern dark theme with better typography
   - Markdown rendering via marked.js
   - Tool call/result visualization with colored cards
   - Dynamic sidebar (engines + tools from server)
   - Better input area with gradient send button
   - Responsive layout
2026-04-29 19:51:42 +08:00
xiaoli-cli-bot baa2cbc49a feat: diff display mode - popup or inline (SSH compatible)
- Startup prompt asks user to choose popup or inline diff mode
- Added inline diff display in main terminal with colored output
- Green for added lines, red for deleted lines (both modes)
- TUI mode uses Rich markup, CLI mode uses ANSI colors
- New commands: diff_popup popup / diff_popup inline
- Default: inline mode (SSH compatible)
2026-04-29 19:40:07 +08:00
xiaoli-cli-bot f41d5d5a7c fix: remove unsupported @keyframes from Textual CSS
Textual CSS parser does not support @keyframes syntax (it's a Web CSS feature).
These keyframes were unused - all animations are implemented via Python's
set_interval() and animate() methods. Removing them fixes the stylesheet
parse error that prevented TUI mode from starting.
2026-04-29 19:28:53 +08:00
shuiyu1123 9048b0e813 feat: 自动语法检查 + Diff弹窗 + Web UI + 默认模型更新
- 自动语法检查: 编辑操作完成后自动检查代码语法(11种语言)
- Diff弹窗: 编辑后弹出新窗口显示修改前后对比(可开关)
- 主动语法检查: 新增 syntax_check/check 操作
- Web UI: 纯静态HTML界面(对话/编辑器/文件浏览/状态面板)
- 默认模型: Ollama默认从qwen2.5更新为gemma4:31b
- 更新README/HELP/CHANGELOG文档
2026-04-27 01:08:27 +08:00
shuiyu1123 6de5c6f202 feat: Function Calling 兼容
新增 xcli_core/fc_tools.py:
- MCP 定义 → OpenAI FC 格式转换
- FC 响应解析 (tool_calls 提取)
- 自动收集所有插件 FC 定义
- 400 错误自动降级为普通模式

引擎层改动 (openai_engine + ollama_engine):
- generate_response 新增 tools 参数
- 请求体自动注入 tools/tool_choice
- 响应检测 tool_calls 并返回 FC 标记
- 对话历史支持 tool 角色消息和 assistant.tool_calls
- _build_messages_with_history 兼容 FC 消息格式

cli_core.py 集成:
- _handle_fc_response: FC 响应 → 工具执行 → 结果回传
- _execute_tool_by_name: FC 调用路径的安全检查+工具分发
- process_conversation 循环自动处理 FC 工具调用
- TUI/CLI 双模式 FC 支持
2026-04-27 00:29:34 +08:00
shuiyu1123 15e35ca8ad feat: 持久化记忆系统
新增 xcli_core/memory.py (20KB):
- MEMORY.md: 长期记忆,AI 可追加备忘
- memory/YYYY-MM-DD.md: 每日日记,AI 可写观察日记
- chat_history/: 自动保存聊天记录 (JSON)
- 全局关键词搜索 (日记+记忆+聊天记录)
- 上下文自动压缩 (超50条时AI摘要)
- /memory 命令入口

cli_core.py 集成:
- process_conversation 结束后自动保存聊天记录
- 超过阈值自动压缩上下文 (保留最近10条+摘要)
- 系统提示词自动注入记忆上下文 (MEMORY.md+今日日记)
- /memory 帮助文本
2026-04-27 00:23:52 +08:00
shuiyu1123 11afacb6e9 fix: ESC 跨平台取消 AI 响应
- 重写 _generate_response_with_animation
- generate_response 移入独立线程,ESC 后可立即返回
- Linux/macOS: 使用 tty.setcbreak + select 非阻塞读取
- Windows: 保留 msvcrt 检测
- 三个线程并行: 动画 / ESC检测 / AI响应
- ESC 按下后立即停止动画并返回取消标记
2026-04-27 00:12:03 +08:00
shuiyu1123 4f3a60bf9f feat: 定时任务插件 - AI 可设定定时提醒
- 新增 plugins/scheduler.py 定时任务插件
  - add: 添加定时任务 (支持 30m/2h/14:30/2026-04-28 10:00/r:30m)
  - list: 列出所有任务及剩余时间
  - delete: 取消指定任务
  - clear: 清除已结束任务
- 后台守护线程每秒检查到期任务
- 到期时自动激活 AI 处理提醒 (CLI/TUI 双模式)
- 重复任务 (r: 前缀) 触发后自动重新调度
- JSON 持久化存储 scheduler_tasks.json
- /scheduler 和 /remind 命令入口
2026-04-27 00:06:23 +08:00
shuiyu1123 19f9cf0826 feat: 任务完成时发送系统通知
- 新增 xcli_core/notification.py 跨平台通知模块
  - Windows: win10toast / PowerShell BurntToast / MessageBox
  - macOS: osascript display notification
  - Linux: notify-send / D-Bus
- process_conversation 结束后自动触发通知
- 新增 /notify 命令开关通知 (on/off)
- 通知在后台线程发送,不阻塞主流程
- 防重复通知冷却机制 (2秒)
2026-04-27 00:03:14 +08:00
艾轮 卧壳 98c9e51dc2 fix: 移除提示词中的'插件'术语,统一为'工具',强制 JSON 格式调用防止直接拼接参数 2026-04-26 23:34:46 +08:00
艾轮 卧壳 c51fe6accc feat: 强化系统提示词 — 所有工具调用前必须先 tool_search 查询用法 2026-04-26 23:27:02 +08:00
xiaoli-cli 39d2b0368b feat(tui): 添加动画效果和多行输入支持
- 替换 Input 为 TextArea,支持多行文本输入
- Ctrl+Enter 发送消息,Enter 换行,Tab 缩进
- ThinkingSpinner: 旋转+脉冲思考指示器
- TypingIndicator: 模拟AI打字动画
- MessageBubble: 消息入场淡入动画
- 欢迎界面逐行动画显示
- CSS 过渡动画 + 关键帧动画
- 输入区域动态高度调整
- 清理未使用的 import,ruff 检查通过
2026-04-26 14:03:22 +08:00
xiaoli-bot 29df2a4ac1 chore: 移除所有 emoji 及对标文案
- 删除全部文件中的 emoji 字符(29 个文件)
- 移除 tui.py 中「对标 Claude Code」表述
- 保持代码缩进和格式不变
2026-04-26 12:35:27 +08:00
xiaoli-cli 5147662b88 feat: 统一安全层 - AI 风险识别 + 三模式切换
安全检查流程:
- 工具调用前统一经过 safety.check() 拦截
- 普通模式: AI 独立分析指令风险(不带历史对话)
- 识别出风险后展示: 指令/风险等级/影响,请求 y/n 确认
- 安全操作快速预检放行(读取类/查询类直接跳过)

三种模式 (/safe 切换):
- 普通模式 (默认): AI 识别风险,有风险才确认
- 人工确认模式: 所有指令都需确认
- 无限制模式: 直接执行,不检查

特殊指令始终需确认:
- cmd_executor: rm/chmod/chown
- file_manager: delete
- git_tools: checkout -b
2026-04-26 06:13:54 +08:00
xiaoli-cli 7c02642982 fix: 移除无效的 text-size CSS 属性 (TUI 报错根因) 2026-04-25 23:00:05 +08:00
xiaoli-cli 623d53f06f fix: 全面修复 TUI 和跨平台兼容性
- constants.py: requests/openai/numpy 改为 try/except 保护
- tui.py: asyncio.get_event_loop() → get_running_loop() (Python 3.10+)
- tui.py: _remove_thinking 增加异常保护
- tui.py: XiaoliTUI 占位类增加 __init__ 和 run 方法
- tui.py: bare except 改为 except Exception
- sandbox.py: resource 模块 try/except 保护 (Windows 兼容)
2026-04-25 22:54:41 +08:00
xiaoli-cli d819502b00 fix: 修复 Windows 上 resource 模块导入错误 2026-04-25 22:45:40 +08:00
xiaoli-cli 04e2d26809 refactor: 拆分 ai_cli.py 为模块化 xcli_core 包
将 4130 行的单文件拆分为 13 个职责清晰的模块:
- constants.py: 常量 + 可选依赖导入
- sandbox.py: 安全代码沙箱 (AST检查器 + 子进程隔离)
- config.py: 配置管理 + 日志
- plugin_manager.py: LiuginManager 插件管理器
- cli_base.py: BaseAICLI 基类 (初始化/引擎/插件/命令)
- cli_clawli.py: ClawliMixin 远程模式
- cli_tools.py: ToolMixin 工具调用
- cli_code_exec.py: CodeExecMixin 代码沙箱执行
- cli_display.py: DisplayMixin 显示/输出/图片/帮助
- cli_history.py: HistoryMixin 聊天记录
- cli_core.py: AICLI 主类 + 对话循环 + main()
- tui.py: Textual TUI 界面
- __init__.py: 包导出汇总

ai_cli.py 保留为入口文件 (11行), 根目录整洁。
原逻辑完全不变, 仅做结构拆分。
2026-04-25 22:27:59 +08:00