shuiyu67 and WorkBuddy
9dd418ec89
feat: LSP 集成(连接外部语言服务器,真实诊断/智能感知喂给模型)
...
- 新增 lsp_client.py:LspClient(subprocess stdio,Content-Length 分帧 JSON-RPC,
reader 线程,initialize/initialized/didOpen/didChange/hover/definition/references/
completion + publishDiagnostics 通知捕获)+ LspManager(按扩展名→语言→server 路由、
connect_all 读 lspServers、get_context 返回已分析文件诊断、cleanup 幂等)
- unified_tool_manager.py:initialize 末尾加载 LSP server,注册 5 个 lsp__* 工具
(diagnostics/hover/definition/references/completion,带真实 inputSchema、protocol='lsp'、
instance 存 manager 供 shutdown 清理)
- cli_core.py:_build_system_prompt 末尾注入 LSP 诊断上下文(模型持续看到真实诊断)
- config.json:顶层加 lspServers 段(python/rust 示例,含 _说明;该文件被 gitignore 不入库)
- 新增 tests/test_lsp_client.py(9 项:fake server 全链路+路由+桥接+fc_tools 保真+缺失/失败优雅降级)
- 修 LSP 线缆坑:didOpen/didChange 是通知(无响应),初版误当请求等响应导致超时
Co-Authored-By: WorkBuddy <workbuddy@tencent.com >
2026-08-05 17:49:46 +08:00
shuiyu67 and WorkBuddy
a3977ecc85
feat: opencode 式 Plan 模式(只读调研 + /build 批准执行)
...
- safety.check 最高优先级加 Plan 只读拦截:写操作暂挂,只读放行
- BaseAICLI 新增 plan_mode / current_plan 状态
- _build_system_prompt 注入 PLAN 约束;/plan /build 命令路由与 handle 方法
- 速查表与启动提示补充 /plan /build
- 新增 tests/test_plan_mode.py(16 项,纯函数+拦截+注入+状态转换)
Co-Authored-By: WorkBuddy <workbuddy@tencent.com >
2026-08-05 17:25:17 +08:00
shuiyu67
07490c4d38
feat: opencode 式会话持久化 + /resume 一键恢复
...
此前只有手动的 /chat save|list|open,关终端就丢上下文。现升级为
opencode 式体验:每轮对话自动落盘、启动提示历史会话、/resume 一键恢复。
- 新增 xcli_core/session.py:Session 数据类(id/title/created_at/updated_at/
engine/model/messages)+ SessionManager(new/save/list/load/resolve,存
chat_history/<id>.json)。向后兼容旧 /chat 格式(无 id、用 conversation 键,
读取时回退用文件名作 id)。标题自动取首条 user 消息前若干字。
- HistoryMixin 升级(cli_history.py):新增 init_session_manager /
_autosave_session / handle_resume_command。自动保存首轮惰性建会话、
更新标题与 updated_at;/resume 列出(序号|ID)或按序号|ID|前缀恢复,
恢复时把 messages 载入 shared_conversation_history 并同步引擎。
- 集成:cli_base.__init__ 在 chat_history_dir 就绪后 init_session_manager;
cli_core 主循环 1395 行 process_conversation 后调用 _autosave_session;
新增 /resume|/sessions 路由(/sessions 等同 /resume)。
- 体验:启动时若有历史会话提示 /resume(含最近会话标题);run() 紧凑提示
与 /help 速查表均补 /resume(列出/恢复/开新会话)。
- 修复 cli_history.py 一处历史 typo:{Style.RESET型} -> {Style.RESET_ALL}
(旧 load_chat_history 在含消息时会抛 AttributeError)。
- 测试:新增 tests/test_session.py(12 项,覆盖兼容/新建/落盘/排序/解析/
自动保存/恢复/列表/未知token,全程临时目录不污染真实 config/chat_history)。
全量 242 passed(原 230)。
真实 CLI 冒烟:启动提示识别到历史会话、/resume 正确列出(含标题/时间/引擎/
条数)、/resume <id> 正确恢复并回显;已清理测试种入文件,chat_history 复原为空。
2026-08-05 17:16:49 +08:00
shuiyu67
1383d32f8b
feat: OpenAI 多模型注册表 + /model 命令,告别手改配置文件
...
痛点:很多模型都是 OpenAI 格式,但换模型只能手改 config.json 的单槽位,
且只能存一个。新增模型注册表与 /model 命令族:
- 新增 xcli_core/model_registry.py:在 api.engines.openai 下维护
models 列表(name + base_url + api_key + model)与 current 指针,全部落盘。
向后兼容:无 models 时把扁平 api_key/base_url/model 当作单条隐式模型。
- OpenaiAI 接入:__init__ 应用注册表 current 模型;新增
set_registry_model / list_registry_models / add_model / remove_model /
current_model_name。注意保留引擎原有的轻量 set_model(只改 model 名)
与 list_models(查 API /models 端点),新方法与它们不重名、互不干扰。
- 新增 /model 命令族(仅 openai 引擎):
/model 列出已配置模型(* 标记当前)
/model <名称> 切换当前模型并持久化
/model add 交互式录入(名称/base_url/api_key/model),回车即存并切换
/model rm <名称> 删除(删当前则回退到列表第一个)
- 启动横幅引擎名后显示当前模型;紧凑提示与 /help 速查表均补 /model 入口。
- 测试:新增 tests/test_model_registry.py(13 项,覆盖兼容/增删/切换/落盘/
引擎接入/CLI 路由,全程临时配置不污染真实 config.json)。
全量 230 passed(原 217 passed)。
交互实测:/model add → 已添加并切换到 gpt4o;/model gpt4o → 已切换;
/model rm gpt4o → 回退到 xophunyuan7bmt,配置结构与内容完好。
2026-08-05 16:12:35 +08:00
shuiyu67
3a86da7444
perf: 启动输出瘦身 + FC 能力探测缓存,修复测试套件失效
...
自用体验(同时以人类和被接入 AI 的视角)暴露出三个问题,一并处理:
1. 启动太吵:117 行 / 16983 字符的开屏,人还没开始用就先刷屏
- 完整 ASCII 开机动画改为 --logo / --banner 按需召唤,默认两行紧凑标识
- 21 行命令说明折叠成一行「/help 全部命令 · /quit 退出 · ...」,
完整速查表挪进 /help(新增 show_quick_commands)
- 插件/引擎/工具的逐条加载日志改走 vprint,由 --verbose / -v /
XCLI_VERBOSE=1 召唤;工具加载汇总成一行
- 日志控制台 handler 降到 WARNING(文件仍留全量 INFO),并静音
httpx/httpcore/urllib3 等第三方心跳日志
=> 默认启动 10 行 / 475 字符,--verbose 仍可看到全部 36 行细节
2. 不支持 FC 的模型每次会话都白撞一发 500
讯飞 xophunyuan7bmt 不支持 Function Calling,请求带 tools 字段必报
500 Invalid Params,虽有降级重试兜底,但每个新会话都要先错一次。
- 新增 xcli_core/fc_tools 能力缓存(按 base_url::model 落盘 .fc_support.json)
- 降级重试成功后记住该模型不支持 FC,后续直接不发 tools
- 降级也失败时不写缓存,避免把别的故障误判成 FC 问题
- 新增 /fc [reset] 查看与清除缓存
3. diff 弹窗模式每次启动都要重新问一遍
- 首次选择后经 config.json 持久化,新增 /diff [popup|inline] 随时切换
测试:
- 新增 tests/test_startup_and_fc.py(27 项,含假 HTTP 验证降级与缓存链路)
- 修复 tests/test_plugins.py 长期失效:插件入口类早已由 Plugin 改名 Liugin,
8 处 fixture 未跟进导致 65 个用例直接 error;断言也未适配 ToolResult 返回值
与「❌ 」错误前缀。改为 plugin_class() / as_text() / is_error() 语义判断。
- 全量:217 passed(此前 152 passed + 65 error + 27 failed)
2026-08-05 15:57:38 +08:00
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
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
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
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
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
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-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
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