Skip to content

Tags: hAcKlyc/MyAgents

Tags

v0.2.19

Toggle v0.2.19's commit message
v0.2.19 — wake-lock for cron + 响应超时自动续跑

主修「长跑 cron 任务被系统休眠杀掉」这一类问题:cron 执行期间向系统申请
「防 idle sleep」锁(macOS / Windows / Linux 三平台),万一锁不住,AI 下次
回到这个 session 时自动续跑上次未完成的任务,不用手动「继续」。

Highlights:
- Cron 执行期间防止系统进入 idle sleep(macOS IOPMAssertion / Windows
  PowerCreateRequest / Linux systemd-inhibit)
- 响应超时自动续跑:watchdog 中止后 session 落盘标记,下次发消息时自动
  注入英文 <system-reminder> 让 AI 续跑;同 session 至多一次,避免循环
- Chat Cmd+F 翻页被流式更新打断的「卡在最后一个匹配」修复 (#214)
- SiliconFlow Kimi K2.5 等模型挂死修复 — 预设切到 OpenAI 协议 (#216)
- Chat 输入区 Todo / 发送队列 Z 层冲突修复
- WeCom 群聊「全部消息」开关补平台限制说明

See CHANGELOG.md [0.2.19] for the user-facing summary.

v0.2.18

Toggle v0.2.18's commit message
v0.2.18 — Session 间异步消息通道

引入 Session Inbox(PRD 0.2.18):AI 用 `myagents session send <sid> -p "..."`
跨 session 投递 prompt,target 处理后回复自动推回 caller 的下一个 turn。
Fire-and-forget 不阻塞,支持 `--no-reply` 单向投递。秘书 AI、并行调研、
跨 workspace 协作场景的基础设施。

辅以 Chat 长会话 Cmd+F 打通虚拟化(#209)、`myagents task` 全 flag CLI
支持(#205),以及 cron new_session overlay(#206)、WeCom 凭据(#207)、
OpenClaw 第三方插件(#208)、markdown 过激改写、IM Bridge 启动时序(#211)
等修复。

完整发布说明:https://github.com/hAcKlyc/MyAgents/blob/main/CHANGELOG.md

v0.2.17

Toggle v0.2.17's commit message
> 支持安装 Claude 插件,一行链接装一个,带 skills、子 agent、工具、hook 一并到位。新增 Chat 顶部 Age…

…nt Status 悬浮条,让你随时看到当前任务的 Todo 进度和正在跑的子 Agent。供应商可拖拽排序与按需启用,让模型选择器和 fallback 链只显示你在用的。

- **Claude 插件支持**:设置页新增「插件」Tab,支持 `owner/repo`、GitHub 链接、`.zip` 直链、本地目录四种来源一键安装;插件自带的 skills、子 agent、MCP 工具、hook 由运行时自动接入。
- **批量装插件**:一个仓库里平铺多个插件时(如 `anthropics/claude-for-legal` 的 13 个法律插件),安装弹窗自动列出全部候选默认全选,逐个安装;失败的不影响其它继续装。
- **按工作区启用插件**:设置页的开关只决定「这个插件在工作区里是否能看到」;是否对当前工作区生效,在 Chat 输入框「工具 → 插件」子菜单或 Agent 设置面板「插件」一行勾选,两个入口同步。
- **Chat 顶部 Agent Status 悬浮面板**:实时汇总当前轮的 Todo 进度和正在跑的子 Agent,点击展开看详情;点子 Agent 卡片直接跳到对话里发起它的位置;全部完成后自动淡出。
- **供应商启用与排序**([#201](#201) by [@Wesegm](https://github.com/Wesegm),社区贡献 🙏):设置 → 供应商新增「启用和排序」对话框,可拖拽排序、按需开关。禁用的供应商从模型选择器、fallback 链、cron 路由、IM Bot 选择器全面隐藏,但 API Key 和配置保留,重新启用即恢复。
- **CLI `myagents cc-plugin` 子命令**:`list / install / uninstall / enable / disable / show`,命令行管理 Claude 插件。

- **订阅登录识别**([#203](https://github.com/hAcKlyc/MyAgents/issues/203),感谢 [@TimCheung-jx](https://github.com/TimCheung-jx) 反馈):在 Claude Code CLI 上只跑过 `claude auth login`、OAuth token 仅存在系统 Keychain 的用户,之前会被误判成「未登录」导致订阅模型不可用。现在能正确识别。
- **Cron 任务的 `--model` 在外部 Runtime 生效**([#204](https://github.com/hAcKlyc/MyAgents/issues/204),感谢 [@sundanian1991](https://github.com/sundanian1991) 反馈):之前 `myagents task create-direct --runtime codex --model X` 里的 `--model` 会被 Agent 默认模型覆盖,Codex 等模型名不同的 Runtime 会直接报 unknown model。现已修正优先级。

v0.2.16

Toggle v0.2.16's commit message
> 全局快捷键 + 想法归档两个常用快捷动作;Codex Runtime 的「为什么不工作」终于看得见;订阅验证、IM 群消息、工作区文件…

…树几条体验断点修齐。

- **全局快捷键唤起 MyAgents**:默认 `⌘⇧M`(Windows / Linux: `Ctrl+Shift+M`),按一下前台、再按一下隐藏到托盘(Raycast 风格 toggle)。可在 设置 → 通用 → 启动设置 改键或关闭。当前 tab / 焦点保持不变——快捷键纯粹是窗口显隐切换,不抢焦点也不强切到 launcher。
- **Codex Runtime 自诊断面板 + 每 Agent 网络代理选择**(#194):用 Codex Runtime 时如果遇到登录、MCP server、外部连接器(artifact-tool 等)问题,chat 顶栏会自动浮出一条诊断条让你直接看到「哪里挂了」,不用翻日志。每个 Agent 的「基础设置」也多了一项「网络代理」二选一:**MyAgents 代理**(默认,与桌面端 设置 → 网络代理 一致)和 **跟随终端**(等同于在你电脑的终端里手动启动这个 CLI 时看到的环境变量)。解决一类典型问题:用户终端里能调到的外部连接器,MyAgents 里因为代理不一致调不到。
- **想法可归档**:想法列表的「更多」菜单和批量操作栏都加了归档/取消归档。归档后从默认视图隐藏但全文搜索仍可命中(邮箱式语义)。在已归档分段里也能直接新建想法(会自动切回活跃视图)。Launcher 最近想法行 / 输入框 `#` picker 默认不展示已归档项。
- **链接右键菜单**:chat 消息 / AI 回复里的链接,右键弹自定义菜单「预览(内置浏览器)/ 拷贝链接 / 在系统浏览器中打开」——之前只能直接外部打开。「预览」在 split view 启用时会落到右侧浏览器面板。
- **CLI 新增 runtime 诊断子命令**:`myagents runtime diagnose codex`(或 `myagents diagnose runtime codex`),返回结构化 JSON 可直接贴 GitHub issue。

- **工作区文件树不再每次 AI 写文件后就收起**:展开了多层目录后,AI 跑工具 / 保存文件 / 文件 watcher 事件 / 120s 后台轮询任意一个动作都会让深层目录视觉上收回去——多层嵌套项目用户感受明显。现在 tab 生命周期里展开状态稳定。
- **第三方迁订阅用户的 Anthropic 订阅验证不再 403**(#199):从 cc-switch / Claude Code Router 等第三方 CLI 工具迁过来的用户,`~/.claude/settings.json` 里残留的 `apiKeyHelper` 字段会让 SDK 拒绝走 OAuth → verify 报 403。verify 路径不再加载这个文件,与 chat session 行为一致,SDK 走 macOS Keychain 完成认证。
- **CLI 创建的定时任务能正确用工作区 provider 与模型**(#197):`myagents cron add` 创建的任务之前会忽略工作区 Agent 配的第三方 provider,回退到订阅 + Sonnet 默认模型,上游报 403。现在与桌面端 Chat 路径对齐,自动从 Agent 配置捕获 providerId + model;存量旧 cron 在执行时也会动态解析 provider env。
- **Codex Runtime 切换不再带走旧 runtime 的模型设置**(#194):从 Gemini Agent 切到 Codex,新开 tab 之前会继续把 `gemini-3.1-pro-preview` 喂给 Codex,CLI 直接报 "model not supported"。Settings 面板 / Launcher / CLI `agent set runtime` 三条切换路径现在统一清理跨 runtime 不通用的字段;启动时还会自动扫描并修复旧版本残留的污染配置。
- **Codex 已登录用户不再误报"需要登录"**(#194):诊断面板把 Codex 的产品级元标志当成了用户态信号,已登录的 ChatGPT 账号也会被判定"需要登录 Codex"。现在按真信号判断。
- **打开 Codex / Gemini 历史会话从 8-10 秒变成几乎瞬间**:以前切到 prewarm 过的同一 session 还要再等一遍 CLI 冷启动,纯白屏;现在同 session 切换立即返回。
- **Gemini Runtime 启动不再卡 30-40 秒**:之前打开 Gemini Tab 时两个并发的 `gemini --acp` 会互抢资源各自 timeout 30 秒,重试才能正常起来。修了并发协调 + stderr 管道阻塞,冷启动现在按预期完成。
- **企业微信群里 @ 机器人不再静默丢失**:之前每次 @ 都被识别成"非 mention"丢进 history buffer 不路由给 AI,机器人不回。同时群内消息现在能正确带 `[from: 发言人 时间]` 标签,AI 在群里能区分不同发言人。
- **主窗口右键打开链接不再劫持整个 App**:之前右键 chat 里的链接 → WKWebView 原生菜单选 "Open Link" → 整个 App 被替换成被点链接的页面,没有返回路径。现在外链统一走系统浏览器;恶意 `data:` URL 也无法替换主窗(潜在 XSS 风险一并堵了)。
- **macOS 顶栏红黄绿按钮垂直居中**:开源以来一直略偏下 4 像素的祖传错位顺手修了。

- **从 GitHub 安装 Skill 的超时窗口拉宽到 5 分钟**(#193):之前 10s / 60s 的三层超时在 CN 代理或慢网络下基本每次 install 都撞超时。

- 新增 `RuntimeEnvPolicy` 共享校验入口、`shell.ts` 启动期抓取用户 shell 的 8 个 proxy 环境变量、Rust `apply_to_subprocess` 统一清除继承的 `ALL_PROXY`/`all_proxy`,为「跟随终端」模式提供基础设施。
- 工作区文件树新增 `treeMerge.ts` 模块(4 个纯函数 + 27 vitest 用例):merge stale lazy children 作 fallback + frontier dirExpand 重抓 + 同路径死循环防护 + BFS 级联上限。
- 三视角 cross-review 流水线(Claude Code 代码质量 / Codex 对抗测试 / 架构合规)整合到合并前流程,本次发现 5 个 critical / warning 问题已全部修复。
- `tech_docs/multi_agent_runtime.md` / `proxy_config.md` / `cli_architecture.md` 同步 envPolicy + Codex 诊断 + CLI diagnose 子命令的契约文档。

v0.2.15

Toggle v0.2.15's commit message
v0.2.15 — rewind/long-task/Codex 工具产物可靠性收紧

长对话回溯、长任务执行、Codex 工具图片三条常见路径的可靠性收紧;外部 Runtime、Windows 下的几条阻塞性问题一并处理。

- Codex Runtime 现在能渲染工具返回的图片(image_generation / MCP 返图工具 / dynamic tool 返图等);webSearch / fileChange / plan / review mode 等长期静默丢弃的 Codex 事件类型补齐。

- 长对话里的时间回溯真的能回溯了(#189):长对话中断后 Retry / Fork 后立即回溯时 AI 上下文不再失忆。
- 长任务不再被记忆维护打断(#190):写作/研究进行中时自动记忆维护跳过,等空闲再补。
- 外部 Runtime 长 turn 不再误报"AI 调用失败:网络错误"(#188)。
- Windows 上 Claude Code CLI runtime 不再丢上下文。
- 元宝等 OpenClaw 插件升级后启动不再报缺接口(#187)。
- 点开 user-level skill / command 的文件不再误报"文件预览失败"(Windows 尤甚)。
- 文件预览快速点击不再错位、错误提示不再双弹。
- 代码块行号不再被选中/复制。

- 想法输入框默认更高(2 → 3 行)。

详见 CHANGELOG.md。

v0.2.14

Toggle v0.2.14's commit message
> Session 当前由谁在驱动一目了然,对话能在桌面 ↔ 飞书/Telegram/微信之间无缝流转;顺手把通知系统、Plan 模式、I…

…M 配置变更几条最痛的 papercut 都处理了。

- **顶栏会显示 session 当前绑定的 IM channel / 定时任务**:之前一个 session 是从飞书 channel 路由过来的,顶栏什么都没说,只能去历史抽屉里才能看出来。现在 session 标题后直接挂一个 `●飞书` / `●定时` 小标签,与历史抽屉风格一致。
- **新对话按钮在 channel-bound session 上会一起把绑定挪到新 session**:之前桌面端点 + 新对话只是清空桌面,飞书 channel 还停在老 session 上——等于"我以为换了对话,其实只换了一边"。现在等价于在 IM 里发 `/new`:channel 跟着到新 session,桌面顶栏的 `●飞书` 标签保持不动。
- **桌面 session 主动交接到 IM channel**:纯桌面 session 顶栏多了一个 `📤` 图标(与 channel 标签互斥,已绑定就消失)。点击弹窗列出当前工作区对应 Agent 的所有在线 channel,选中即把这条对话推过去——飞书/Telegram/钉钉 那边会收到一条「桌面端已将对话交接到此 channel」系统提示,IM 端用户接着聊就行;桌面端顶栏立即出现 channel 标签。继续在手机上工作的核心场景终于打通。
- **桌面 session 里的发言会镜像到绑定的 IM channel**:之前是单向的——IM 用户发什么桌面看得到,桌面发什么 IM 看不到,导致 IM 端用户视角丢一段对话。现在桌面用户消息以 `[From: 桌面端用户消息]` 前缀推到 IM,AI 回复正常推送(与直接对 bot 提问的流式格式一致)。镜像范围:用户文本 + 用户上传的 PNG/JPG + AI 文本回复块;不镜像工具调用、`canUseTool` 审批卡片、partial chunk(避免双端冲突 + 信息噪音)。
- **会话顶栏新增 ⋯ 菜单**:替代之前的条件式按钮,把 session 的 6 个常用操作(重命名 / 收藏 / 导出 md / 会话 Token 统计 / 上下文 Token 详情 / 绑定 Bot ▸ / 删除)聚合到一个稳定入口。"上下文 Token 详情" 直接以用户身份触发 `/context`,无需手动输入。
- **AI 出错后可一键重发**:错误 banner 上的「召唤小助理」换成「重新发送」按钮——直接回退并重新发送上一条用户消息,不需要重新打字。
- **Plan 模式可写修改意见**:AI 进入 plan 模式时,确认卡片下方多了一个文本框。留空提交是常规拒绝;填写反馈后提交则把意见送回 AI,AI 在同一回合内修订方案并重新出 plan,省去回到输入框重发的折腾。
- **OS 通知:跨平台体验完整化**:(a) 通知点击会唤起前台并切到对应 tab,三平台都生效——Windows 之前在企业环境下点了没反应的问题也修了;(b) 通知声音可在设置里关掉(默认开),三平台用各自的系统默认音;(c) 「启用通知」主开关现在真的生效——之前它是装饰性的,关掉之后通知照样响。升级后如果你之前在配置里把通知关了,会保留你的选择。
- **Agent 工作区 Runtime 变更时,IM bot 会自动迁到新会话**:之前在工作区把 Agent runtime 从 Claude Code CLI 切到 builtin(或反向)后,IM bot 还连在老 runtime 创建的 session 上——下次发消息要么没回应,要么报模型不存在。现在配置变更时会自动给 IM 推一条「Agent 工作区 Runtime 从「X」更新为「Y」,开始新会话(xxxxxxxx)」,新对话从干净的状态开始。老对话仍然完整保留在历史里,从桌面打开会按"它当时的 runtime + 配置"加载,跟其他历史会话表现一致。

- **AskUserQuestion / Plan 确认 / 权限请求弹窗不再 10 分钟后自动消失**:之前 AI 抛出选择题、计划确认或权限请求时,如果用户离开电脑超过 10 分钟回来,弹窗已经被静默清掉、AI 那边按"用户拒绝/未答"继续往下走——用户的体感是"刚才那个选择去哪了?"。Mac 睡眠唤醒时尤其明显,`setTimeout` 在唤醒瞬间就触发。修复后弹窗会一直停留直到用户回应(对齐 Claude Code CLI 行为)。
- **IM bot 绑定在 Agent 配置热更新时不再丢失**(issue #169 同类):之前在工作区改 MCP / Skills 等设置触发 sidecar 重启时,bot ↔ chat 的绑定会被一并清掉,要么收到"Channel 没有最近活跃的对话"提示,要么得在 IM 里重新发条消息才把绑定建回来。现在绑定在 sidecar 重启时正确保留。
- **慢首次回合不再被错误标为 "AI 启动中"**:触发 `/context` 这类需要本地多轮内部计算的命令时(实测 40+ 秒),顶栏会一直停在 "AI 启动中(首次启动可能较慢)",让人以为卡住了。现在用 SDK 自己的 ready 信号判断,启动期通常 3–5 秒就脱掉这个标签。
- **会话统计弹窗不再被工作区面板遮盖**:在右侧工作区打开的情况下点 ⋯ → 会话 Token 消耗统计,弹窗以前会被工作区面板覆盖。
- **Popover 外点击不再误关上层 ConfirmDialog**(issue #178):之前在 Popover 内触发删除等需要二次确认的对话框,点确认按钮会被 Popover 当作"外部点击"误关,得用 Enter 才能确认。
- **元宝 Channel Plugin 2.13.x 能正常启动**(issue #180):之前装上后 bridge 直接报 "Plugin did not register a channel",无法进 IM 流。

- 抽 `drainPendingInteractiveRequests` 统一 helper 处理四类 pending request 的 drain。
- Surface handover:`cmd_handover_session_to_channel` 重写 `peer_sessions[chat_key]` + 转移 `SidecarOwner::Agent` 所有权 + 通过 channel adapter 发送系统消息。镜像走新管理 API 端点 `/api/im/mirror`,Sidecar 在 desktop turn 的 user-message 持久化点 + AI text block-end 点 push。
- Runtime-change 编排:`cmd_update_agent_config` 检测 runtime 变更后调 `freeze_and_rotate_for_runtime_change`,对每个 peer_session 走"sidecar HTTP `/api/session/freeze` 优先 / 文件锁兜底"双写路径打 `OwnedSessionSnapshot`,再 mint 新 UUID 替换 `peer_sessions[*].session_id`。新增 `OwnedSessionSnapshot` 共享类型(TS Pick + Rust struct),sidecar 端点和 Rust 兜底走对称的 selective patch(只写存在字段 + 自带 `configSnapshotAt = now`)。
- Notification:Windows 走 `tauri-winrt-notification` 的 `on_activated` 闭包捕获 tab_id;macOS / Linux 走 `Empty / Single / Ambiguous` 三态 latch + 30s TTL(含两个 boundary case:旧 Single 过期当 Empty、旧 Ambiguous 过期重置为 Single)。`tray::show_main_window` 提为 `pub`,托盘点击 / 第二实例启动 / WinRT 通知点击三处共享。
- `updateSessionMetadata` 的 read-modify-write 全量挪到 `withSessionsLock` 内部,杜绝并发 writer 互相覆盖(freeze 端点的高频写入暴露的 pre-existing race)。
- `AbortSession` 在 provider-switch 终止后正确重置,避免下一条用户消息被 startup 守卫误判为"用户按了 Stop"丢弃;该守卫额外暴露 `chat:agent-error` 让 #183 的重发 banner 兜底任意 future 类似泄漏。

v0.2.13

Toggle v0.2.13's commit message
v0.2.13 — 0.2.12 紧急修复

消息显示两遍、多 Agent 状态错位、关闭 tab 后回切丢失 AI 回复。

Fixed:
- 每条发出去的消息不再显示两遍(issue #173,0.2.12 队列重写引入回归):聊天里出现两个一模一样的气泡 + 会话存档写两条记录。修复后只渲染一次、只存档一次
- 并行 Agent 任务的状态指示器与文字一致(issue #175):绿灯、Loader、详情面板文字三者状态严格同步
- 关闭 tab 后立刻从历史打开同一会话,AI 正在生成的内容不再丢失:之前关闭时后台保活已启动但用户立刻回切会触发先取消后台再重建 Sidecar 的顺序错误,这一瞬间 AI 进程被回收,30 秒思考与工具调用全丢。修复后接管顺序反过来,跨 tab 无缝继续(隐患自 v0.1.14 引入后台续跑功能时就存在,触发条件较窄)

v0.2.12

Toggle v0.2.12's commit message
v0.2.12 — 0.2.11 残留问题集中修复

定时任务能跑、Windows 用户能用、AI 中文输出不走样、对话细节回到正轨。

Fixed:
- 定时任务真的会执行(issue #166):标准 5 字段 cron 表达式(如每周日 21 点)之前卡在 running、永远不触发
- AI 中文输出的加粗和表格不再走样(issue #167):DeepSeek / MiniMax 等模型输出的全角星号正确渲染为粗体
- Windows 外部 runtime 解封(issue #170):Codex / Claude Code / Gemini 启动挂起 + 黑色控制台弹窗 + 含引号参数解析全部修复
- 手动编辑过的配置文件不再丢数据(issue #170):带 UTF-8 BOM 的 config.json / cron_tasks.json / sessions.json 之前会静默回退到备份
- AI 输出过程中追加消息更及时:流式输出时按 ⏎ 加的新消息立即进入当前轮
- 同账号开多 Tab 不互相错杀(issue #169):两个 Tab 打开同一会话切换不再路由错乱
- 删除对话的确认按钮不再被历史菜单挡住
- F5 / Cmd+R 不再误退到 launcher
- 微信 / 飞书 / 钉钉 bot 跟上 OpenClaw 升级(issue #171

v0.2.11

Toggle v0.2.11's commit message
fix(cli): Windows CLI v0.1.70 — issue #149 batch fix

Comprehensive fix for the 7 bugs reported in issue #149. Three are root-cause
fixes; three are output-quality fixes; one is defensive validation for a
Windows-only failure mode that I cannot reproduce on macOS.

# Bug 1 — `cron add --dry-run` silently ignored

Root cause: CLI body builder didn't pass `dryRun: flags.dryRun`, and
`handleCronCreate` didn't honor the flag if it had been passed. Result:
`cron add --dry-run` actually wrote a task to disk.

Fix:
- `src/cli/myagents.ts` cron-add body: forward `dryRun: flags.dryRun`.
- `src/server/admin-api.ts` `handleCronCreate`: short-circuit with
  `{ success: true, dryRun: true, preview }` before calling Rust. Mirrors
  the existing `mcp add --dry-run` shape so `printResult`'s `[DRY RUN]
  Would apply:` formatter renders it.

# Bug 6 — `thought create` 422 missing `content` on Windows

Root cause unclear (cannot reproduce on macOS): the AI emits
`myagents thought create '<content>'`, but on Windows the positional
sometimes arrives empty at the CLI parser, causing the body to serialize
as `{}`. User confirmed this is NOT a Windows shell single/double
quote issue. Likely a git-bash → cmd.exe → node argv interaction in
some edge cases.

Defensive fix at the CLI boundary so the failure mode is recoverable:
- New `--content-file <abs-path>` flag (mirrors `cron add --prompt-file`)
  reads the body from disk. Path is shell-quote-free, immune to any
  cross-shell quoting bug. AI's recovery path on the failure error message
  points here.
- CLI rejects empty content BEFORE the API round-trip with an actionable
  error: "thought create requires a non-empty content. Pass it as a
  positional arg, --content '<text>', or --content-file <path>." Tip
  line specifically mentions Windows / pwsh quirks.
- `--content` flag was already parsed but never advertised; now it's
  documented and consistent with `--content-file`.

System prompt updated (`SECTION_THOUGHT`) to teach the AI:
1. Single-quoted positional is preferred (default fast path).
2. If single-quoting misbehaves on Windows / pwsh, write content to a
   tempfile and pass `--content-file` — works identically across
   platforms.

New Bash auto-allow regex covers the `--content-file` form:
  ^myagents[ \t]+thought[ \t]+create[ \t]+--content-file[ \t]+
    [^ \t\n\r;|&<>$`'"]+ [ \t]*$
Strict path char class excludes every shell metachar (incl. CR / LF /
quote forms) so a malicious content path can't smuggle a write
command via the auto-approved Bash. 16/16 regex smoke probes pass
incl. shell-injection attempts.

# Bug 6 follow-on — `thought readme` returned "Unknown admin route"

The AI naturally generalizes from cron / im / widget readme. Now
`myagents thought readme` returns a graceful brief explaining there's
no expanded readme (the system prompt section is sufficient) and
documents the `--content-file` workaround.

# Bug 7 — Human-readable output gaps (4 commands)

Two distinct sub-bugs:

a) `plugin list` showed `?` for every cell. CLI formatter read
`name / id / version / description` but Rust returns `pluginId /
npmSpec / packageVersion / manifest.{name,description}`. Field-name
drift; fix CLI to read the actual fields.

b) `config get`, `mcp env get`, `agent channel list` had no custom
formatter and fell to the generic `✓ <action>` fallback (which only
renders `data.id`). Added formatters that render the actual key/value,
env map, channel rows respectively.

(c) Out of scope for this commit: user also reported `task list /
runtime list / skill list / thought list` print `✓ list`. Those
commands DO have custom formatters in the dispatch table (verified
both source and bundled artifact). Repro required to diagnose;
documented in delivery summary as needing Windows logs.

# Bug 2-5 — Positional args missing on Windows for some commands

User reports `mcp show <id>`, `agent show <id>`, `runtime describe
<rt>`, `task get <id>` all fail with server-side "Missing required
argument", while `mcp test <id>`, `cron remove <id>`, `model verify
<id>` work — DESPITE the CLI parser using identical code for both
groups. User confirmed it is NOT shell quoting. I cannot reproduce on
macOS and the JS parsing is byte-identical for working/broken cases,
so the underlying cause is environment-specific.

Defensive CLI fix: added `requirePositional()` helper that exits 1
with a clear usage line BEFORE any API call when the required
positional is missing. Applied to the 4 broken commands. This:
- Replaces a confusing server "Missing required argument" round-trip
  with a CLI-side error message that names the command and the
  expected arg name.
- Includes the `--<flag>` alternative form so users / AI have a
  workaround if positional parsing genuinely is broken on their
  shell setup.

Verification:
- `npm run typecheck` clean
- `npm run lint` clean (only pre-existing chatSuggestions orphan warning)
- 284/284 tests pass
- Bash auto-allow regex smoke 16/16 incl. injection probes
- CLI + server bundles build clean

Commits 6 fixes; the 7th (Bug 2-5 root cause) needs a Windows-machine
debug session — the defensive validation makes the failure mode
recoverable in the meantime.

v0.2.10

Toggle v0.2.10's commit message
v0.2.10

> 重点修复:1M 上下文模型真正按 1M 用、上游 API 抖动期间能手动停止、切模型 / 切供应商后立即发消息不再丢或跑错配置;安全侧补一个工作区内 symlink 逃逸的口子。

- **1M 模型真的按 1M 上下文用**:选了 1M 窗口的模型(DeepSeek V4 Pro / Gemini 2.5 / GPT-5.4 / Claude 1M ……),`/context` 现在显示 1M、长对话不会过早被自动压缩、附件也不会被提前截。之前所有非 Anthropic 协议的 1M 模型都被当 200K 处理,长上下文优势用不上。
- **切模型后立即发消息保证用新模型**:模型选择器换模型后立刻按发送,首条消息现在保证在新模型上跑——之前有内部异步窗口,首轮偶尔会跑在旧模型上。
- **API 抖动期间停止按钮可用**:上游 API 临时故障时内部会指数退避重试(最长 ~5 分钟),过去用户只能干等——停止按钮被禁用。现在期间显示红色「停止重试」按钮,可以随时退出。
- **切供应商后立即发消息不会被静默吞掉**:之前内部延迟重启的逻辑会误把刚起好的子进程关掉,前端默默回到空闲、用户消息丢失。
- **聊天滚动定位**:发消息 / Tab 切换后能正确停在最底,多 tool 调用的长助手消息不会停在中段;切走再切回时不会错误退出「自动跟随最新」模式。
- **Widget 标签出现在消息正文不破坏渲染**:当 AI 在解释或讨论 `<generative-ui-widget>` 协议本身时(inline code、文字中提及、一条消息含两个 widget),消息能完整显示,不再被错当成「未闭合 widget」吞掉后续内容。
- **Windows 非系统盘工作区 / 项目级 skill 的「打开」按钮**:工作区在 `D:\` / 外接卷上、或项目里的 skill / command 路径,「在 Finder/资源管理器中显示」和「用默认应用打开」现在能正常工作(之前一律报 "Path not allowed")。
- **渠道列表显示真实 bot 名,不再是 npm 包名**:同一个插件下挂多个 bot 时(比如两个飞书 bot),列表里之前都显示成 npm 包名(`larksuite/openclaw-lark` × 2)看不清谁是谁。现在直接拉飞书 / QQ 各自 API 的真实 bot displayName 显示。0.2.10 之前已经被写到磁盘的旧「包名」状态会在下次 channel 启动时自动清掉。

- **飞书 Channel 配置向导更顺**:凭证步骤删掉多余的几张引导图、凭证填好后顶部出现「凭证已验证 / 接下来要做的 3 步」的状态条,整个绑定流程不再让人原地懵。

- **工作区里的 symlink 不再能指向工作区外被系统打开**:repo 中存在 `leak → ~/.ssh/id_rsa` 这类 symlink 时(无论是误提交还是恶意构造),过去会被系统级「打开」跟随到外部敏感文件。现在 reveal / 默认应用打开两条路径都会做 canonical 校验,逃逸 symlink 直接被拒。

- **AI 决定何时画图改为基于内容**:之前要用户说「可视化 / 画一张图 / 做表」AI 才会动用 generative-ui widget;现在 AI 自己根据内容判断——比较、流程、结构、时间轴这类用图比用字更清楚的场景。多个运行时(builtin SDK / Claude Code / Codex / Gemini CLI)行为统一。