# 变更记录 一句话一条,最新在上面。README 里只留最近几条,全部在这儿。 每条对应的代码改动在 [commit 历史](https://github.com/CatCatUncle/openworkbuddy/commits/main)—— 提交信息写的是「为什么改」,不是「改了哪个文件」,翻起来比这份清单细得多。 English: [CHANGELOG.en.md](CHANGELOG.en.md) ## 2026 - **11-10** v0.19.3:修复附件名带中文右括号时被截断:「报告(终版).docx」不再在对话里变成打不开的「报告(终版」,本机引擎也能拿到完整路径。 - **11-06** v0.19.2:修复资料库页签同时高亮:打开笔记时,全部文件、推荐等页签不再一起显示选中,一次只选中一个页签。 - **11-06** 评测新增盲评:两轮成果逐题并排,不显示来源,全部选完才揭晓哪轮赢。自进化提案可先带着候选规则跑一轮评测,对比基线后再决定采纳。 - **11-06** 企业后台新增「成员权限」和「存储」:按连接器和技能控制成员能用什么,可打开组织内任务只读分享,查看各账号磁盘占用并设每人配额。连接器接入增加内置检查,没装 toolward 也能发现下载直接执行、读密钥文件、云元数据地址等写法。 - **11-06** 记忆可以挂在项目上:甲客户的口径不再跟到乙客户的任务里,全局记忆照常到处带。自进化把用户下一句的纠正(不对、重做)算作负反馈,不再只靠很少有人点的 👍👎。 - **11-06** 画布新增 `/` 快捷面板(双击空白处也可打开)、图片切宫格、多选批量做视频和批量生成、把一组卡存为工作流再插回;工作流只留提示词、参数和连线,不带素材和结果。图片加载后量出的卡高不再占一步撤销。 - **11-06** 工程线新增工作目录条和改动面板:输入框上方显示文件夹、分支和改动数,面板逐文件看 diff,可放弃单个文件的修改;有源码的文件夹就地读写,跟命令行一致。应用自己调用的 git 改走沙箱并盖掉仓库里能执行命令的配置,防止 agent 借 .git/config 逃出沙箱。 - **11-06** v0.19.1:多人共用时 Linux 成员的命令改走 bubblewrap 系统沙箱,隔离立不起来就拒绝执行,修复拼接路径绕过文件黑名单读取 Key 文件的漏洞(用测试 Key 本地复现,未发现线上事故)。**升级须知**:Linux 多人部署升级前先装 bubblewrap,Docker 镜像已内置,compose 要保留 SYS_ADMIN 等权限,否则成员命令会被拒绝;确需放开写 `security.allow_member_unsandboxed`。升级前已给成员开过账号的,建议更换 Key。macOS、Windows 本来就有系统沙箱。 - **11-06** 资料库上万文件点击即响应:遍历移到后台线程并缓存,切换视图先画已有内容再刷新,接口约 100ms 降到 5ms;内容区不再被限高。多任务按内存排队,重活单独限流,子进程降优先级,排队不计入任务时限,设置页可调并发。 - **11-06** 命令行写代码档:每轮提示词减少 75%(49,635 → 12,643 字),工具 44 → 23,load_tools 按需加载,有源码的目录就地运行,支持 --profile。 - **11-06** 评测集支持 CSV、Excel、TXT、JSON 上传和页面新建;标准可设权重、必须项和扣分项,按 HealthBench 算法得分,人工与评委对账显示一致率和 Cohen's kappa;新增 PPT、Word、Excel 三道办公题。 - **11-06** 内置方舟下线表,下线型号提前告警并从目录隐藏;生图生视频按顺序回退,已下单或被审核拦下的不重发;新增豆包配音、转写和自定义语音接口(按官方文档实现,线上请先自测)。后台新增成员自带模型开关;超管首次创建输两遍密码并提醒保管。 - **11-06** 对话悬停看时间,回复下方改成图标,只留 tokens 数,点赞点踩放到右边;回复可直达执行追踪,追踪能跳回对应回合,显示 TTFT、TPOT、tok/s;侧栏直接列项目,页签不再被挤走,行数随窗口高度变化。写入面向 AI 助手的授权说明 AGENTS.md。 - **11-04** v0.18.4:云端首次接入不再锁死旧型号,支持按账号查询、刷新和手填模型或方舟 ep- 接入点;模型清单按地址、Key、协议隔离,改目的地不会带出已存 Key。修复 Claude/Gemini/Ollama 发现协议、方舟模态识别与异步回包串渠道;更新方舟/DeepSeek 默认型号和方舟媒体候选。404 不再一概断言型号不存在;Seedance 2.x 使用 JSON 参数并校验时长和分辨率。 - **11-03** v0.18.3:整理中间文件与资料库删除改为可恢复回收,桌面版进入系统废纸篓/回收站,服务端保留原字节和恢复记录;回收失败不回退永久删除。不再按 out/dist/build/target 名称清理整目录,依赖缓存默认不勾,运行中任务和后台命令阻止清理;新界面拒绝向旧服务发送删除请求。 - **11-03** 固定宽网页与 Office 预览首次显示自动适配,栏宽变化、隐藏后显示和内容更新后重新测量;保留手动缩放比例,修复混合纸张 OFD 后续宽页裁切,合并尺寸回调并在关闭时释放监听。 - **11-03** 内置 Agent 在执行中定期核对清单,忽略提醒后暂缓新操作,保留读取核验;手动续做恢复成功的未完成清单。进度显示确认时间,区分当前操作,隔离专家清单,清空与历史回放保持真实;未完成清单不再当作正常结束。补充执行架构与 LLMCompiler 的取舍说明。 - **11-01** v0.18.2:删除任务默认清理其专属文件夹,可取消勾选保留成果;桌面版移入系统废纸篓,服务端移入原工作目录 `.trash/tasks/` 并记录原位置。项目根目录、多个任务共享目录、定时任务共用成果目录保留;跨项目历史目录逐一核对,兼顾 CLI 落盘归属与网页内存归属。 - **11-01** 删除前等待任务停止、附件写入和最终保存完成;按确认快照复核目录身份,拒绝链接、替换目录和过期确认。清理失败保留对话并显示原因,部分回收准确告知;成功后清理记录、备份、归档并刷新资料库和旧预览,避免任务被收尾保存重新创建。 - **10-30** Office 预览增加纸张版式、缩放与展开;DOC/WPS、XLS/ET 内置兼容读取,系统“打开方式”保持可选,不修改默认关联。详见[格式能力与限制](docs/文件预览与转换.md)。 - **10-30** Office、PDF、OFD 可转 Markdown;OFD 上传保留后缀和字节;旧 PPT 提取有效文字,扫描页与截断会提示;CEB 需授权引擎。 - **10-30** 资料库预览接管阅读区域,收紧外框,标题和操作分行;关闭旧对话侧栏,取消过期读取,大表按工作表与每页 100 行显示。 - **10-30** 收件箱改按时间倒序,已读和旧错误不再挤掉最新消息;项目点击只切换选中态,快捷顺序保持稳定。CLI 历史独立保留,按启动目录识别项目,支持 --project。 - **10-30** 临时审批按账号和任务隔离,权限卡明确授权范围;目录外附件可导入工作副本,旧成果仅在路径、大小和时间证据一致时恢复读取。 - **10-29** 资料库分组与显示方式改为本地切换,不再重读目录和任务索引;复用文件行、缩略图及预览,并减少屏外内容排版。 - **10-29** 自动化编辑改用大正文面板,长任务按内容增高并在框内滚动,保存按钮始终可见,适配小窗口。 - **10-29** 项目侧栏展示当前及常用的 5 个项目,支持置顶、最近使用和搜索全部项目;完整列表上移到项目标题旁,编辑、移除收进菜单。 - **10-27** 修复无限画布同名图片串图:缩略图、放大图和右侧预览绑定原文件与项目;文件缺失不换图,切项目后忽略迟到素材。 - **10-27** 手机端应用:输入区适配可视高度,设置改横向导航,文件预览铺满屏幕,侧栏选择后自动收起。 - **10-27** 官网适配手机和微信浏览器:导航自动换行,修复标题、卡片和图片拥挤,中英文文档同步优化。 - **10-27** 推荐技能新增软著模板填写与导出、简历教练与求职辅导,按需从作者公开仓库安装。 - **10-27** 项目与自动化搜索保留输入框和光标,确认组词后再筛选,不重复请求列表;迟到的运行记录不再覆盖已切回的任务页。 - **10-26** 修复跨项目执行追踪遗漏、运行中切换目录导致记录拆分、本机引擎工具步骤未入账,以及父子节点用量重复累计。列表读取失败不再显示成空记录,运行中自动刷新;恢复「专家 · 技能 · 连接器」完整入口名称。 - **10-26** 资料库搜索保留原输入框和光标;输入法确认组词后再搜索,旧请求不会覆盖新输入,修复英文输入乱序。 - **10-26** 修复目录迁移后历史成果仍使用旧目录指纹,按同一会话备份核对后恢复链接;助理页支持独立选择 API 或本机引擎,界面与实际执行保持一致,不更改定时任务引擎。本机飞书发送通过专用应用通道访问钥匙串,保留沙箱限制与每轮回执去重,明确未送达的提醒不再显示已完成。 - **10-25** 飞书机器人支持明确配置主动通知接收目标,由应用发送并核对消息回执,不依赖本机引擎读取系统钥匙串。定时任务分别记录执行与通知结果;通知失败不重跑任务,不更新已送达基线,发送结果不明时不自动重发。 - **10-24** 桌面工作台统一在主窗口切换任务,移除会话菜单的新窗口入口;任务链接和预览跳转复用主窗口,保留成果文件独立预览。 - **10-23** 拆除技能、连接器和账号三处循环依赖;工作区上下文统一到独立模块,连接器读取目录不再加载整个工具执行器。技能和插件共用纯解析器,保留技能管理原导出;授权统计由管理路由传入实时计数器,循环依赖例外清零并锁定。补充并发素材隔离、嵌套上下文恢复、独立加载与账号计数回归。 - **10-23** 文本模型编辑和复制在当前总览内打开表单,旧的未挂渠道模型自动展开总览;保留目录迟到时尚未保存的输入。飞书本人身份新增取消连接,确认后通过官方 CLI 清除本机登录态并停止扫码进程树,失败如实显示,不清机器人凭证;服务端授权撤销范围另行说明。定时任务记录本轮飞书发送状态,内置工具与交回应用执行的 CLI 工具收到成功回执后不再换 profile/机器人重复发送,超时或无回执先核对,下一轮独立计数。 - **10-23** 修复 Agent 读取其他安装目录配置后,把不属于当前窗口的型号写进画布:API 与本机引擎都接收当前应用的媒体清单,新增和更新节点校验型号,不匹配整笔拒绝;无效型号可在卡片一键恢复为当前默认模型,切换本身不触发生成。 - **10-23** 修复多张卡同时长高时重复推挤、残留重叠和过量连线更新;统一计算位置,每张卡最多移动一次,保留人工叠放。已有结果的卡片收起编辑器后仍展示失败与待回收任务;等待报价有持续提示,确认期间切项目不启动生成。 - **10-23** 修复画布「开跑」缺少即时反馈和启动异常后无法重试,报价请求有超时反馈;生成失败原因保留在原卡。镜头结果不再自动复制卡片,旧的无引用副本可合并并撤销。视频首尾帧保留原始字节,火山人像审核拒绝显示中文并停止自动重发;支持填写已审核素材 ID,按参考模式发送并明确不混发本地首尾帧。 - **10-22** 修复本机引擎在画布中误报“未配置视频接口”:系统说明和画布读取工具提供准确媒体型号及生成清单路径,只传能力元数据、不传凭据。视频和配音分别判断,保留确认报价后执行的流程。 - **10-22** 补齐角色定妆照与场景图卡片上的设定输入和图像模型选择;显示实际默认型号,显式选择默认可覆盖剧本旧型号,无效或缺失配置在提交前提示。模型设置保存后卡片立即刷新,补充真实浏览器请求与结果写回回归。 - **10-22** 重整通用画布创作入口与卡片交互:卡内提示词、模型、参考和高级参数,已有素材按选择状态收紧;图片可继续做变体或视频,首尾帧分配明确,版本可并排对比,重命名后保留历史。Agent 默认收起,短剧起步只需写剧本。新增整张/选中画布与素材流式导出;同步增量更新、滚轮合帧、输入和批量操作合并保存,补齐真实浏览器与导出安全回归。 - **10-21** 收件箱打开时不再自动标记全部已读,普通任务通知按账号保留最近 300 条,已读后重新打开和刷新页面仍可查看;所有定时结果(含写回原对话的排期)集中显示,支持全部、未读和定时任务筛选及运行记录入口。对话搜索增加可见入口和可点击匹配片段,保留前后定位与早期消息检索,切换对话时清除旧搜索 - **10-21** 修正 Windows 安装验证调用批处理时的重复引号转义;主分支 CI 提前验证真实 cmd.exe、内置运行时、中文/空格路径和启动目录。候选构建未通过检查时保留原标签,使用新版本号重新发布 - **10-20** 文件链接按原项目定位,外部文件按完整路径打开;修复同名串页、部署串目录和切换预览时的迟到覆盖;新增跨项目同名与资源路径回归。发版只复用 24 小时内同一提交的已通过主分支 CI,无可信记录时仍跑全套 - **10-20** 安装版首次启动注册 CLI,使用内置运行时,保留启动目录与桌面数据根;源码目录移动后可用 `npm link` 修复命令。账号菜单独立宽度与滚动,开关不再挤成竖排,无限画布移至自动化下方 - **10-20** 首页收敛为两组十个常用任务,选择类型提示所需素材、不覆盖草稿;任务行常驻置顶按钮,重命名和停止等操作在菜单内 - **10-20** 关闭本机命令行会话导入与组织内只读分享:移除界面入口、停止自动扫描,新建导入与分享接口、旧分享链接均不可用 - **10-20** 精简账号区和对话工具栏;通知已读持久化,批量清除只刷新一次历史;角标接口只请求状态元数据;本轮结束、已停止和未完成分别显示 - **10-20** 内联网页脚本语法检查独立为工具模块,防止生成页面带语法错误;视频成片排他创建与发布,拒绝覆盖已有文件 - **10-20** Windows 安装版支持显式下载与重启安装更新,源码、免安装版和 macOS 保留各自的更新路径;补齐 Windows 文件缩略图 - **10-20** 源码更新提示说明检查更新只查 GitHub 发布版本,不会同步代码;先检查工作区,仅允许快进更新;本地有改动或分叉时保留旧目录,另建源码副本并沿用原数据根,避免误覆盖会话和成果 - **10-19** 修复发版 CI 漏跑 Goal 步数续跑套件的问题;补齐测试文件版权头,并按实际宿主、运行时、安全闸与交付链路重画技术架构图 - **10-19** 架构图改用中英文 SVG,避免 Mermaid 渲染失败和节点文字截断;README 最新动态压到单条 80 字以内 - **10-19** 任务标题旁显示创建日期并提供直接改名入口;成果预览在文件属于当前任务时使用「任务名 · 日期 / 文件名」,底层目录路径保持稳定,旧文件链接不失效。Goal 模式遇到单轮 100 步上限时先检查验收项,再按有限轮次续跑;Codex CLI 沙箱拦截会明确说明不会产生后台审批卡 - **10-19** 网页隔离预览的临时 `localStorage`、`sessionStorage` 上限各提高到 64 MiB,关闭后清除;本地部署使用浏览器原生存储配额,重要数据仍需网页导出备份 - **10-19** HTML 网页预览默认使用完整面板视口,交互画布和页面滚动不再被整页缩放压小;尺寸上报后可手动切换整页适配,SVG 等静态内容保留原有适配方式 - **10-17** CLI 按终端交互:默认单行进度与最终结果,工具输出、diff 和诊断通过 `/details` 或 `--verbose` 查看,用量保留在 `/usage`;空行不再成为插话,本机引擎未消费的补充要求会在同一会话继续执行;成果清单只列本轮改动,打开最近成果由本机程序执行并报告真实结果,保留审批、错误和管道协议 - **10-16** 修复网页预览中小游戏、按钮无反应:在页面脚本之前提供独立的临时存储,避免读取最高分等记录时中断初始化;工作区与资料库预览统一兼容,保留账号和应用数据隔离 - **10-16** 发布检查修正:打包回归样本统一放进临时目录;安装包提供 SHA-256 清单,发布说明从上一正式版汇总,跳过未发布标签;界面回归显式选择语言,覆盖中英文切换 - **10-16** OAuth 第二期:HTTP 连接器在服务商页面授权,令牌自动刷新,可移除本机授权 - **10-16** 预览支持圈选批注,文件改动能逐块回退、撤销,并按行提出修改要求 - **10-16** 团队任务使用组织共享模型和连接器,费用与个人任务分别记录;浏览器录制可生成技能草稿 - **10-16** 英文界面新增漏翻检查,用户原文不翻译;官网提供中英文用户和开发者指南 - **10-16** 新增组织内只读分享:本人生成和撤回,同组织登录成员查看;只展示对话正文和实际交付文件,排除工具参数、配置凭据、越界文件。分享操作在页面内展开,单人模式隐藏 - **10-16** 中英文 README 把首次成功路径提前:安装、连接模型、复制周报任务、打开实际文件并核对。新增故障排查、双向入口参数、试用计时和聚合漏斗模板;未采集指标明确标记缺失 - **10-15** 执行计划改成对话页面内的折叠清单:默认只显示标题和进度,点击原处展开,随对话滚动;进度更新保留展开状态、键盘焦点和文本选择,暂停原因与继续按钮照常可见 - **10-15** 新增任务收件箱,集中显示待审批、待答复、出错、运行中和未读任务;独立定时任务的完成结果也可从这里打开执行过程。定时任务在对话里创建时把结论写回来源对话,独立创建时放进收件箱;来源会话关联留在服务端,接口只返回是否关联 - **10-15** 任务历史按日期分组并显示文件产出标记;行菜单支持改名、移项目、标未读、置顶、删除和新窗口打开,拖动即可置顶;工作区与资料库文件可固定在侧栏 - **10-15** 审批等待时可按 Esc 拒绝、按主修饰键 + Enter 单次放行;增加新建任务和搜索快捷键,以及输入框下方的核对提醒 - **10-15** 任务历史能置顶了:鼠标停在一条任务上点图钉,它就进最上面的「已置顶」一组,后顶的排在上面;再点一下放回去。置顶记在服务端,换台电脑、清了缓存都还在,再老的任务顶着也不会从侧栏掉出去;置顶不改它的先后。没存上会挪回原处并说原因 - **10-15** 页面更跟手:自进化里点「采纳」「驳回」不再整页刷新,按钮显示「采纳中…」,列表原地更新;进自进化、智能体不用再等几秒——本机 CLI 开机就先探好,几个一起探,过期了先给旧结果、后台再刷新。技能、插件、连接器、账号页切换时不再闪「加载中」,设置页换内容后停在原来的位置 - **10-14** 多人服务器上每个账号都能绑自己的消息渠道:在「助理设置」里扫自己的微信,填自己的飞书、QQ、企业微信应用、公众号、群机器人、通用 Webhook 和邮箱。消息按本人账号跑,用他自己的工作目录、偏好和助理模型,记录只有本人看得到;定时任务和提醒推到他自己绑的渠道,一条都没绑才照旧推服务器那套。密钥读回来是打码的,各人的回调地址带一串随机号,不暴露账号名;成员的通用 Webhook 不设密钥不收任务。账号停用、删除后,他的渠道一分钟内断开。平台管理员那套原样不动 - **10-14** 多人服务器上成员有自己的那份了:平台管理员按渠道勾哪些模型给成员用;成员能填自己的 Key,只有他自己看得到、用得着,花他自己的钱,不扣组织额度(平台管理员可整台关掉) - **10-14** 成员能建自己的专家,只有自己能委派;平台管理员的专家可以一位一位设「不给成员用」,专家团里成员只看到自己能用的那几位 - **10-14** 每个人能起自己的助理名字、换头像、写「我的偏好」:每次任务都带上,排在组织统一的偏好后面,别人不受影响 - **10-14** 微信扫码、断开和各 IM 通道的「测一下」只有平台管理员能做 - **10-14** 文件名里带顿号的附件不再被拆成两个:「这是一个测、试文件.txt」以前在消息底下显示成两个不存在的文件,本机 Codex / Claude Code 也拿不到它的完整路径 - **10-13** 注册能直接填邮箱:自动取 @ 前面那段当用户名,登录时填邮箱也认;那段当不了用户名或撞名,页面上当场说清。注册失败不再算进限流,同一地址建满 20 个号才歇,先 1 分钟、再撞上 3 分钟(原来 5 个就锁 15 分钟)。 - **10-13** 设置 → 安全 新增「沙箱安全」开关:关掉后 AI 能动工作目录外的文件、连本机和内网,命令不再套系统沙箱;文件黑名单、OpenWorkBuddy 自己的端口照旧拦。多个账号共用时关不掉 - **10-13** 「本机/内网放行」支持通配符:192.168.1.*:* 放一整个网段,*.local:8080 放一类主机名,*:5432 放所有机器的某个端口。OpenWorkBuddy 自己的端口写了也不放 - **10-12** 扫码连的个人微信收得到定时任务和提醒了:任务跑完、让 AI「发我微信」都推到微信上,重启也不丢(前提是你在微信里给它发过一句)。以前只推企业微信、钉钉群机器人,AI 找不到发消息的路,回一句发不出去。从微信来的任务跑完不再重复推一遍 - **10-12** 微信连接更跟手:跑任务期间照样收消息,中途发「停」当场生效,不用等任务跑完;处理时微信里显示「对方正在输入」;网络抖一下 1 秒后就重连,最多等 10 秒,不再干等一分钟 - **10-12** 自动化页的「+ 添加自动化」「从模版添加」和编辑改成弹窗,不再在页面里撑开一大块;Esc 或「取消」关掉,点窗外不关。任务回复里顺口提到「fetch failed」不再被判成连不上上游 - **10-12** 飞书「扫码配应用」也能选已有的应用了:选了已有应用照样算配好;终端里那团二维码乱码不再贴进报错 - **10-12** 本机 Codex / Claude Code 读得到随消息传的文件了:粘贴的大段文字、拖进来的图和文档,发给它时末尾附上每个文件的完整路径。以前只给文件名,它自己去搜,工作目录在 git 仓库里、文件又被 .gitignore 忽略时搜不到,回一句「只收到文件名」 - **10-10** 成员、审计员和分公司账号也能建多个项目(工作空间):不止一个账号时,用自己工作目录的人在侧栏「项目」里新建、切换、改名、移除自己的项目,项目说明、挂的资料库、专家、技能、连接器照常按项目记。每个项目一个文件夹,建在自己工作目录下的 projects/ 里;以前的成果都在「默认项目」,就是原来那个工作目录。不能另选文件夹;项目文件夹被换成指到别处的链接时不跟过去,这一趟退回工作目录本身。各人的项目只有自己看得到,默认组织管理员共用的那份项目列表一个字不动。默认项目就是工作目录本身,不能移除。移除别的项目只从列表拿掉,文件夹和成果都留着;改名不改文件夹,老对话照样打得开。项目改名、移除后,它名下的老对话不再从侧栏消失:改名的跟着新名字走,移除的归到第一个项目,管理员那份项目列表也一样 - **10-10** 画布卡片右边多了连接点(鼠标停在卡上或选中时出现,触屏上一直显示):拖到另一张卡上松手就连线,线跟原来的一样,能断开、能撤销;连不上的卡标红并写明原因(用不上这张卡的内容、已经连着了、会绕成一个圈),松手不连;拖到空白处、拖回自己或按 Esc 都不留半截线,挪卡、框选、平移照旧。点一下连接点弹出「新建并连上」,只列连得上的种类,新卡放在右边空处、已经连好,撤销一下连卡带线一起退回。选中卡后,标题、名字、提示词能直接在卡上改:单行回车保存、多行回车换行,点别处保存,Esc 取消,拼音选字时按的回车和 Esc 不算;检查器当场跟着变,跟在检查器里改是同一步撤销。成员账号的画布里,文件夹下拉不再给「选择其他文件夹」 - **10-10** 渠道能选生图、视频、配音各走哪种接口:渠道表单加了「生图接口」「视频接口」「配音接口」三个下拉,默认「自动」,括号里写着这次会走哪种,中转也能手选;选了的优先于按型号、渠道类型和地址的推断。千问生图点「测」不再误报 400:以前测活拿生图型号去发对话请求,还发到了百炼原生地址后面拼出来的对话路径上,上游只能回 400;现在生图、视频、配音型号只做不花钱的清单核对,标「只验了一半」,对话测活改走兼容地址,报错带状态码和上游原文。百炼生图被上游明确拒绝「不支持同步/异步调用」、又没收单时,自动换另一种方式提交一次,并按渠道和型号记住;5xx、超时、已收单、渠道上选定了接口的都不换 - **10-10** 本回合产出按重要程度排:先把这一回合的文件排好再截前 12 张卡片,网页、PDF、Word / PPT / Excel 这类成品排前面,接着是视频、音频、图片;有成品时,草稿、调试脚本这类过程稿的卡片收起来,名字仍在下面的清单里。任务做完,最后那份成品自动在预览里打开,不用再一个个点。删掉或挪走的文件,服务端当场查实了才标「已删除」沉到最后,同名文件写回来会重新认;点开前先问一句文件还在不在,不再点了才报「不存在」。缩略图、复制图片没成功时只说看到的(「缩略图没显示出来」「图片没取到(HTTP 404)」),不再猜是改名、挪走还是删了 - **10-10** 输入框字多跟着长高:最少两行,最高约窗口三分之一(6~12 行),再多才在框里滚,最底下那行不会被切掉半截;框里上面或下面还有没露出来的字,那一边渐隐一行高,一眼看出还能往哪滚。对话区右下角那两颗滚动按钮跟着输入框往上让,不再压在正在写的字上 - **10-10** 多账号时工作目录、成果和资料库按账号分开:不止一个账号时,默认组织的管理员(含这台服务器的老主人)照旧用原来那份共享的工作目录、项目和资料库,以前建的工作空间都在;其余每人(成员、审计员,分公司的人连管理员在内)分到自己的工作目录(默认组织在数据根下的 accounts/<账号>/,分公司在组织根下一层)和自己的资料库,暂时每人一个工作空间。文件列表、成果页、搜索、下载,AI 读写和搜文件,都只认自己那份;管理员要看成员的文件,从成员的对话里点开。「本地产物」里的文件和文件夹能删了:只删得到自己工作目录里的,有任务在跑时不让删,删了记进安全审计。定时任务在负责人自己的目录里跑,命令行和 IM 进来的任务照旧在共享目录上。只有一个账号时一切照旧;老文件不搬,升级前的成果在「按任务」和老对话里照样打得开 - **10-10** 本机 Claude Code 删文件这类操作改成弹审批卡问你:Claude Code 卡上那项改叫「删文件等操作先问我」(原来叫「要审批的动作交给安全中心判」;设置 → 智能体 → 底层引擎,只有属主看得到,默认关)。勾上后 rm、sudo 这类要人点头的操作不再一律拒,改成弹审批卡,跟内置引擎同一张:网页、终端、手机都看得到,改文件的卡带 diff,批了才跑。名单放行的照跑,不认得的工具、判的时候出错的照拒。「自动改文件」档里 claude 自己会放行的 rm、rmdir,也按安全设置挂成先问(这版 claude 不认那个参数就照旧直接禁)。不用另勾「借给它的工具(生图、资料库等)在这边执行」;卡弹不出来时先说一句,这一趟碰到这类操作直接不做。放行的命令由 Claude Code 自己跑,不套系统沙箱;问答、计划那一趟和 Codex 不挂 - **10-10** 设置页说明改成大白话:每项一句话说清做什么、默认多少、花不花钱。「执行上限」里直接写「一个任务最多做几步」「一个任务最多跑几分钟」「一个工具最多等几秒」;六个先问小模型的开关并进「让小模型把关」一组,花多少钱、还没配小模型只在组头说一遍;安全页两份命令名单写明哪份直接跑、哪份先问你,名单外的那项改叫「名单外的命令先问小模型」。任务停下时、技能说明里、报错里点名的设置项跟设置页一字不差,「去设置里改」能直接点过去;英文界面同步 - **10-09** 换了工作目录不再带出别的对话的文件:自己选的文件夹也给每个对话单开一格放成果;命令行 -C、/cd 点名的和像代码仓库的照旧原地改。设置页和输入框旁的文件夹菜单都摆着这两种放法,选文件夹那一刻记下,按文件夹记住;分格后会告诉 AI 现成的文件在上一层。先传后发的附件记下传在哪、谁传的,换了文件夹或对话再发,搬的只是自己那份 - **10-09** 新对话头一条消息带的附件,点开预览不再报「文件不存在」:附件先放在工作空间根上,发出头一条消息才搬进新建的成果文件夹,现在气泡上的文件条和缩略图跟着改指向。两条对话各传一份同名文件,不再互相指到对方那份;传到一半切去别的对话,附件仍记在上传时那条名下 - **10-09** 答过的选项钉住:你在这个会话里答过的选项、中途补的话,每一步都带给模型,长任务压缩历史也冲不掉,专家子代理问到的主代理也看得见。一字不差再问一遍的直接拦下(以前这道拦截躲在一个默认关的开关后面,基本没生效过)。问句里自己写的前提不算你定的;真做不成先说清卡在哪再问,不许悄悄换一条路 - **10-09** 本机 Codex 有新版会告诉属主:点「重新检测本机」时顺带查一次(npm、bun、Homebrew 装的才查,平时打开设置页不联网),有新版就单列一行,附一键复制的升级命令;原地升级完会重新读型号表,新版才有的型号当场出现。任务里 Codex 报型号不认时,写明本机这份是几版、名字是不是只差写法、现在能用哪些、怎么升,它的原话附在最后,不再替你断定是订阅账号的限制 - **10-09** 本机引擎的型号下拉列出具体型号:分组列出具体型号、别名、其他型号和你用过的;属主多一项「手填别的型号…」,成员只在放行的里挑。本机装了不止一份 claude / codex 时,用版本最新、跑得起来的那份,卡上列出另外几份的路径和版本;要更新版 CLI 才能用的型号不进下拉,只对属主单列一行,附升级命令。「试一下能不能用」报这趟真跑的型号,填的是别名时连它落到的具体型号一起写 - **10-09** 平台管理员把底层引擎切到本机 Claude Code / Codex 直接能用,不用再先勾选;多人共用时只拦别的账号:成员要等管理员勾上「也给其他账号用」才跟着用,卡上写明走谁的订阅、命令在哪跑。设置页、引导、思考档位、对话和目标拆解都按这个账号实际在用的引擎来判断 - **10-09** DeepSeek V4 官方地址一条回复最多给到 64K,思考开关按它的新参数发(thinking.type 管开关,力度只分 low / high / max);回复写太长被截断时提示说人话,回「继续」就接着做 - **10-09** 地图设置:高德报错说人话,填 Key 的提示写明要选「Web服务」那种;新增「国内路线用哪家打开」,高德、Google 二选一 - **10-09** 附件不再卡 30MB:输入框和画布直接传原文件,服务端边收边写盘,不再转成 base64 整份进内存,两三百兆的录屏也拖得进来;老页面、脚本用的 JSON 上传照收 - **10-08** 借给本机引擎的工具可以改在主程序里执行:设置 → 智能体 → 底层引擎,在 Claude Code 或 Codex 卡上勾「借给它的工具(生图、资料库等)在这边执行」(只有属主看得到,默认关)。勾上后生图、配音、资料库这些借出去的工具每次都交回主程序,在这一趟的上下文里跑:账记在发起这一趟的人名下,审批卡在网页、终端、手机上都看得到,组织规矩、权限档位都按这一趟的。一趟一张凭据,跑完就作废(macOS、Linux 上只有本人读得到);名单外的、叫停之后来的一律拒。交不回去时明说这一步没做成,不退回引擎那头自己跑;口子没开成就说一句,这一趟照老样子跑。Codex 的命令沙箱连不了本机套接字,它命令行里的 owb 照旧自己跑,只有 MCP 那条交回来 - **10-08** 本机 Claude Code / Codex 能从资料库取素材:资料库里的 PDF、图片、Word 不是文本,以前引擎够不着,只能叫你拖进对话;现在借给它们 library_import,复制进这一趟的工作目录再用。只取得到你自己那份资料库,项目只挂了一块就只有那一块,按名字、带 ../ 都取不到别人的;问答、计划那一趟要往工作目录写,所以不借 - **10-07** 本机 Claude Code 要审批的动作可以交给安全中心判:设置 → 智能体 → 底层引擎 → Claude Code 卡上勾「要审批的动作交给安全中心判」(只有属主看得到,默认关)。命令、改文件、抓网页照安全中心的规则判,名单放行的直接跑;删除、sudo 这类要人点头的、不认得的工具、判的时候出错的,一律拒。每次现读设置,名单改了下一条就认。放行的命令由 Claude Code 自己跑,不套系统沙箱,跟没勾时一样;问答、计划那一趟和 Codex 不挂 - **10-07** 本机引擎出视频:按了停止、工具时限到了、CLI 先退了,上游已经收下的单照样出片,主程序在后台按任务号接着收,绝不重新下单;片子落回原对话目录、照常计费,结尾说一句有几条、任务号是哪些。你点了停止的,百炼、火山两家先去上游撤单(排队中的撤得掉,已在渲染的照样出片计费)。服务重启后接着收上次没收完的,超过一天还没收回来的不再查 - **10-07** 停本机引擎时连自立门户的子孙进程一起收:脚本拉起的浏览器、中间那层先退了留下的孤儿,以前按进程组杀够不着,现在按跑着时拍的进程树快照逐个停掉,不理 SIGTERM 的 3 秒后强停。pid 被复用的、换了父进程的一概不碰,不按名字杀 - **10-07** 本机引擎收尾照实核一遍交付:回复里点了名的文件不在或者是 0 字节的空壳、说「如图」这一趟却没有新图片,运行页上说一句(只提示,不打回重跑)。桥里的联网、命令、拦截记录逐条追加进审计,命令行跑完马上退也不丢,审计中心按时间并进来,不再整份盖掉主程序那份 - **10-07** 本机引擎的运行页看得懂了:借出去的工具叫回原名,图标、标题跟内置引擎一样,不再是 mcp__openworkbuddy__x;Codex 自带生图出的图半路就放进对话目录、出一张生图卡;好一阵不出声,每 30 秒说一声还在跑、多久没有新输出;工具没挂上、只读停了哪些设置这类提示存进对话,重开还在。本机引擎连着失败单独计数,不再算到云模型头上。这些话英文界面都有英文 - **10-07** 本机引擎也挂上插件带来的连接器,连接器页上关掉、暂停的不挂;走网址的连接器两个 CLI 写法各不相同,这次不转,运行页上点名是哪几台。名字里带点、带双下划线的改成两个 CLI 都认的写法,Claude 不再每次调用都弹权限;写给 Claude 的连接器配置只给本人读写 - **10-07** OWB 拉起的 Codex 不再加载宿主机上给别的工具装的技能和它自带的系统技能(只留 imagegen),描述不再挤掉项目说明和借出去的工具;项目自带的技能照常加载,你在终端里直接用 Codex 不受影响。Codex 报错照原话说:只有它明说没登录才说没登录,光一个 401 说是被上游拒了;说哪项设置「不再支持」的,连同怎么改一起带出来 - **10-07** 本机引擎的用量记准:Codex 续跑不再把整条线程的累计用量重算一遍(以前账本虚高好几倍),起算点找不到就记 0、不拿猜的数充数;Claude 被停、跑超时也记得上,一次调用拆成几条吐的只记一份。用本机订阅跑的只记不扣积分,界面上写明「用本机订阅跑的,不扣积分」 - **10-07** 问答、计划模式走本机 Claude Code / Codex 时一律按只读跑(claude plan、codex read-only),属主手填的放宽设置和附加参数这一趟不认,运行页上说一句哪几样没用;只借读的那几个工具。Codex 命令沙箱里跑不成的工具(要花钱记账的、要写数据目录的、要开 Chrome 的)开跑前就停,不花冤枉钱,提示词点名改走哪个 MCP 工具;「只看不动」档两个引擎都不给 owb 命令 - **10-07** 本机引擎的提示词照实说:借出去的工具逐个列全,技能一个不落、每条带正文文件的路径;看图 Claude 用 Read、Codex 用 view_image;node 脚本能直接 require 自带的 pptxgenjs / docx / exceljs。owb 放在哪都认 --help,打出完整说明和全部参数,敲错工具名给出近似的名字 - **10-07** 本机引擎借 OWB 的工具更靠谱:借出去的名单只留一份,提示词、MCP、owb list 照同一张表,一个不借就真不借;产物落在这一趟任务自己的工作区,资料库只看得见本人那份,项目只挂一块就只看那一块;PATH 先放 owb 那一层、补全的搜索路径接在后面,装在 nvm / homebrew 里的 CLI 不再找不到 node;生图、出视频、配音的回执照引擎的当前目录说路径,不再说成「已显示在上方」;设置文件读不出来时借出去的工具一律不执行,不再当空设置照默认跑 - **10-07** 行程卡「打开路线」:国内一天四站以上改开高德网页版路线规划,站名和坐标一起带过去,一天最多 15 站,扫码在手机上打开同一页(三站以内仍开高德导航链接,三站一律按驾车,不然途经点会丢)。Google 地图每站写「站名, 城市」,不再只给坐标——只给坐标时它会换成旁边商户、雕塑的名字,只写站名又可能跑到别的城市。国内的「打开路线」旁边多了「高德 / Google」两格,换了整天路线和段间导航一起换,记在本机;Google 一次最多 10 站,超了照实说这天几站。链接长的二维码画大一号,好扫 - **10-07** 行程卡:点地图上的钉子,旁边弹出这一站的小卡(照片、评分、类别、钟点、「导航到这」),「上一站」「下一站」一路翻下去,Esc 收起、焦点回到那颗钉子;窄窗口里小卡贴在地图底边。两站之间点「导航 ▾」,展开步行、公交、骑行、驾车四种走法,各开一条高德链接;「发到手机」就地出二维码(本机编的),扫了在手机上接着导航,段间的还能换走法。高德额度按月分开算,Key 出错当天停用、整批只打一次;路线没查成的那段写明原话、能再查一次,时间线上也看得到;每站标出地点信息从哪来;行程 JSON 解不开时说清第几行不对 - **10-07** 画布花钱更稳:画布对话里的 Agent 不再直接生成,改成交一份待生成清单挂在画布顶上,先估价,点「开跑」才扣费;只开跑一部分时,跑过的划掉,没跑的带新报价留着。每一单带单号,服务端同号只跑一次,断线不再重复扣费;没收到结果的格子标「状态未知」,给「看结果」「再生成一次(会再扣费)」「忽略」。生成失败只有上游明说没收单、或者压根没发出去才换备用模型重发,等超时、下载断了这类可能已扣费的照原话报错。镜头检查器能「生成配音」「换一版配音」,同样先报价再扣费。本机引擎跑画布任务也能改节点、交清单 - **10-07** 画布找得回来:删画布挪进项目回收站,画布下拉里一点放回来,备份和快照跟着走;Agent 清空画布或一口气删一串节点前先存快照,顶上给「撤销」一键补回。撤销只撤你自己的改动,提示上的「撤销」只撤它说的那一步;连线能单独断开,删节点不再弹确认。画布没存进项目时顶上挂红条照抄原话、可重试。时间线上拖镜头格子(触屏按住拖)或按 Alt+←/→ 换放映顺序,一键合成照同一个顺序拼;没配音但视频自带声音的镜头用视频原声;服务重启后合成进度问不到就照实说、给重新合成。上传同名文件存成 名字_2,原来那份不动,同一个附件重拖原地换新;素材台账不再把在用的标成没人用 - **10-07** 闲着时更省电:没有任务在跑、也没人在用的时候,服务那边的卡顿计时闲满一分钟就停,每秒醒来的次数从约 40 次降到 2 次左右;任务或请求一进来立刻接着计,界面后台的定时轮询不算「在用」。窗口不在前台时,界面线程也不再一直盯着卡没卡 - **10-07** 行程卡换了个样:地图铺满整张卡片,当天的地点浮在右边一栏,天数胶囊浮在地图左上角,缩放和「回到全览」挪到左下角。地图上的钉子是带白边的照片方块,挂着序号和地名,挤不下的地名先不写;取景躲开右边那栏,收起那栏就照整张地图重新取景。点地点卡片,地图滑到那一站;点钉子,右边滚到那张卡片。卡片照片更大,写评分和类别,具体钟点单列一行;两站之间那一行写怎么走、多远、多久,兼当分隔线。「打开路线」旁边写明开哪个地图:国内三站以内开高德,再多或国内外混着开 Google 地图(十站以内),一天每段都在两公里内就按步行 - **10-06** 系统沙箱:AI 跑的命令(run_shell、后台命令)和 run_node 脚本,在 macOS 上套系统自带的 sandbox-exec,在 Windows 上降到低完整性级别跑。不管命令怎么写,都读不到 Key 和账本、改不了应用本身;macOS 上还连不上 OpenWorkBuddy 自己的端口,Windows 上只写得进工作区和临时目录。开关在 设置 → 安全 → 系统沙箱,四档:默认、自动(立不起来照常跑)、必须(立不起来就不跑)、关闭,设置页看得到现在立没立起来。每条命令多花:macOS 约 7 毫秒,Windows 约 13–16 毫秒(真 Windows 上实测)。被拦下时输出里会说开关在哪。Windows 那层挡不住连本机端口、隔不开同机多个组织的工作区,开关旁边和[安全](docs/安全.md#系统沙箱macoswindows)里都写明了。Linux 上暂时没有这一层 - **10-06** 只用你配过的模型:中转站不再转发没登记的型号,放行任意型号要属主显式打开;判断模型只认配置过的型号;渠道测试只测已登记的型号,存着的 Key 不随改过的地址发出;记忆向量只用设置里选定的嵌入模型,没选就按关键词检索。设了额度时,没价目的型号直接拦下;价目补齐向导带上默认型号,本地免费的模型按渠道地址判断 - **10-06** 额度闸补漏:主渠道挂了换备用渠道前也过价,备用那条没价目就不换,照实说卡在哪、去价目表补;换过道的任务按渠道拆开记账。看图过额度闸,出图出视频先解析出实际型号再估价。只靠前缀对上价目的贵档型号(如 -pro、-realtime、-thinking)在设了上限时按没价目拦下,日期快照和更便宜的小号照常放行。记忆向量被额度拦下时,记忆页如实说原因、改按关键词召回 - **10-06** Key 不进 AI 手里:AI 起的子进程只拿最小环境变量,Key 类变量默认不带,属主可在 设置 → 安全 配透传清单。联网工具默认打不到本机、内网和云元数据:先解析地址逐个判,连接钉住判过的地址,跳转逐跳重判;OpenWorkBuddy 自己的端口始终拦,属主可按 host:端口 放行。多人共用时,命令和代码碰了文件黑名单直接拦下,不出审批卡 - **10-06** 外部引擎(本机 Codex、Claude)必须指定型号:型号要钉死或在属主放行列表里,附加参数不许换型号;组织关了命令行就不启动;多人共用默认关、属主逐个打开,不往引擎传 Key 类变量。Codex 默认不联网、只写工作区。报错指到真找得到的设置位置,老配置升上来时会提示这几条 - **10-06** 行程卡:回答里的行程画成能拖能点的地图,按天切换,地点卡片、时间线、照片都有。右边列表能收起、拖宽窄,地图能拖高,右上角「回到全览」一下回到当天所有地点(焦点在地图上按 0 也行)。不填 Key 也能用;在 设置 → 地图 填了高德 Key,国内地点更准、还有评分。地图服务没给照片就按名字和位置去 Wikidata 补。点「导航」国外开 Google 地图、国内开高德,两站两公里内按步行,再远按开车;国外一天的整条路线带上途经点一起开 - **10-06** README「长这样」放了行程卡的两张截图:北京三日游,地图视图按天标好每个点位、右边是带照片的地点卡片和导航,切到时间线一天从上午排到晚上 - **10-06** 本机 Codex 收到工作目录和产出说明;它自带生图出的图自动放进对话文件夹,成果栏能预览 - **10-06** 授权说明补上授权码作废的三种情形(退款、泄露、冒用)和申诉办法:作废前先通知,泄露、冒用不连累被授权方,作废只提示、不锁功能。写明软件没有统计和遥测,联网只为干活和检查更新 - **10-06** 源码按层搬进 src/:platform、core、domains、agent 与 engines、server / cli / im / desktop、util,各层只准往下引用,层级守护在测试里强制;打包白名单只认 src。二次开发先看[代码架构](docs/代码架构.md) - **10-05** 新建项目:连接器、专家、技能可全选、清空、筛选,按 Shift 连选,还能照搬已有项目的选择 - **10-05** 评测:评委看得到过程,提示词可改,加人工评测和多维成绩单 - **10-03** README 放了一集一句话做出来的 AI 短剧成片《不烧心》EP01:剧本、定妆、分镜、首帧、镜头视频到成片一路做到底,75 秒,点封面看 - **10-02** 参考模板用起来先弹一张填空表:模板里的 `__名字=默认__` 给默认值,`__名字=A/B/C__` 出选项,逗号或括号后面那段当提示;右边实时预览填好的样子,上次填的记着。没填完也能先填进输入框,按 Tab / Shift+Tab 在剩下的空之间跳。写模板时选中文字点「设为填空」(Mod+E)就包成空,再点一次拆回来,下面列出所有空、能试填。删模板不再二次确认,删完给一个撤销。内置 14 条模板的空都重写成有名字的格子 - **10-02** Windows 安装包改成向导:能选装在哪个盘、哪个文件夹,看得到进度条;装进数据文件夹会被拦下。包里文件从一万多个减到四千个,装得更快;任务栏图标和通知归到同一个应用名下。免安装版解压时有图,重复双击不再删掉正在跑的那份 - **10-02** Windows 起任务不再闪黑窗:子进程一律隐藏,.cmd 垫片、GBK 输出照常读得懂,退出收尾和剪贴板都不再卡界面。中文、空格、长路径统一处理;python3 走 ASCII 垫片,系统自带的 WindowsApps 占位不再抢先。高 DPI 下托盘图标、成果栏按钮、画布和时间线不再糊或错位。拦删除的命令补上二十多种 cmd 写法(`@`、`,`、`;`、`=` 前缀,重定向,`cmd.exe/c`、`%ComSpec%`、`^` 续行、`forfiles /c"…"` 等),PowerShell、start、net 走同一套判定 - **10-02** PPT 预览按每页真实版式画:位置、底色、字号、图片、表格、图表都在,zip64 打包的文件也能打开。无限画布按图片真实比例摆,不再拉变形;时间线预览改成胶片条。成果栏在窄窗口下关闭键不再被挤出屏幕 - **10-02** 模型渠道修一轮:火山方舟上的 GLM 不再被拦成「智谱的型号」;模型挂错渠道时不再乱判乱挪,改挂了会告诉你。多媒体渠道里通义国际站和专属地址、看图协议、按型号点名、万相异步出图都修好了;画布里对话放上去的参考图、首帧、视频不再全挂「找不到」 - **10-01** 对话里说「装这个技能」直接装进技能库:跟技能页「从 GitHub 装」走同一条路,过安全扫描、记来源;会覆盖已有技能、扫描有告警时要你点头。内置技能跟着应用升级换新版,你改过的原样留着。对话里要接 MCP 直接带你进连接器页 - **10-01** 飞书、微信这类消息的回复超过单条上限时,按段落拆成几条依次发,一个字不丢——以前超出的部分直接被截掉。回复里的 SVG 图表以前是把源码原样发过去,现在转成 PNG 当图片发;发不了图的渠道明说一句图没发出去 - **10-01** 分文件夹以前就有的老对话:工作空间根上已有的文件照原地改写,不再在新文件夹里另起一份同名的,成果区「本对话」里也列得出这些文件;换过工作空间目录后,老对话里的图片、文档附件照样有缩略图、点得开 - **10-01** 命令行(owb)也按对话各开一个文件夹,不再全堆在工作空间根上。有任务在跑时点「新任务」,新任务不再落进上一条临时切过的文件夹。消息和代码块上的「复制」在桌面版里点了没反应的毛病修了,复制不成时如实说 - **09-30** 成果按对话分文件夹,不再只限默认工作空间:新建项目没填目录(应用替你建在 ~/OpenWorkBuddy/projects 下)、没指定目录的分公司,每个对话也各有自己的文件夹,两条对话各写一份同名文件不再互相盖掉。飞书、微信这类消息按会话分(`IM_对话/月日_头一句话`),定时任务按任务名分(`定时任务/任务名`),跑完什么都没产出的空文件夹自动收掉。你自己选的文件夹照旧就地读写。对话中途换了文件夹,成果区不再显示「本对话 0」;定时任务点「看执行过程」能看到这一趟的产出 - **09-30** 参考模板库能自己加、改、删了。「我的」谁都能加,只有自己看得见;「公司」只有管理员能加改删,全组织看得见,每次改动记进操作审计;内置模板点「改」是存一份副本、原来那条藏起来,「已藏起」里能放回。个人桌面版只有「我的」 - **09-30** 同时开好几个对话不再卡:所有对话共用一条实时通道,每个对话各用各的浏览器标签页;服务挪出界面线程,存盘、缩略图、截图也不再占主线程;侧栏每一行都能单独停 - **09-30** 首次配置能直接填中转站、自建网关、本机 vLLM 这类 OpenAI 兼容地址,只填域名打回 404 时自动补 /v1 再验;用输入法选词时按回车不再把半截拼音发出去;长对话能连着往上翻 - **09-30** 一台服务器带几家公司能用了:平台超管在「组织管理」建组织,在那一行发这家的第一张邀请码,拿码注册的人就是这家的超管。组织到期后发不起新任务(网页、IM、定时任务、中转 Key 都停),登录、翻历史、下载成果照常;想立刻停一家,把到期时间改到以前 - **09-30** 多人部署的权限补漏:普通成员看不到连接器的地址和启动参数;租户管理员不能自己打开命令行、改记账折扣、抬组织封顶、改付费 API 额度;停用的人重新启用要过席位;邀请码上限按组织各算 200 张;删掉的成员留下的对话只归原组织管,登录名不能再被占用;办离职的交接人必须是本组织在用的人;成员那一行加了「解二次验证」,手机丢了不用再上服务器跑命令;命令行、IM 这类没登录的用量不会再记到分公司名下 - **09-30** 定时任务替负责人本人跑:记负责人的账、用负责人那家组织的目录和规矩;负责人被停用、删除,或组织到期,任务当场停并写明原因。登录成败都进运行日志,锁号和停用账号在试登录进组织审计 - **09-30** 新写[账号与部署运维](docs/账号与部署运维.md):部署方式怎么挑、第一个账号、加人、办离职、密码和二次验证丢了怎么找回(含 Docker 里怎么跑)、去哪查登录记录、备份恢复升级、一台服务器带几家组织、上线前自查。部署和多人协作文档里过时的地方一并改掉 - **09-30** 许可文件从三份并成两份:`LICENSE-ECOSYSTEM.md` 里的 MIT 清单和全文并进 [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md#按-mit-授权的部分),条款一字没改 - **09-28** 授权写清楚了:个人非商用免费;公司使用(哪怕只在内部)和个人商用(接单、做付费产品)要向作者买商业授权,公司可先免费试用 30 天。登录页、开箱向导第一步、关于页、启动日志都写着;管理后台加「商业授权」页,填授权码本机验证,不联网、不锁任何功能。细则见 [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md) - **09-28** Word 文档技能重写:用 docx 库出文件,中文字体、目录、页眉页码、表格一套模板直接能用;改已有 .docx 的做法和容易踩的坑也写上了 - **09-28** 通义渠道算记忆向量不再被误判成「不可用」:以前一次塞 16 条,通义上限是 10 条,整批被拒后退到了本地 Ollama。现在按各家的上限分批发 - **09-28** Excel、PPT 技能里的模板照抄就能跑:以前末尾那句 `await` 在 run_node 里是语法错,Excel 模板还用了一个没定义的变量 - **09-28** 回复说到一半就断、任务却报「完成」的毛病修了:上游半路停(DeepSeek 忙时会这样)或者流断了没收到结束标记,现在都算「没说完」,自动让它从断开的地方接着说,交付的是拼好的整句;连着断 3 次才停,并告诉你是上游没发完。上游内容审核掐掉的,界面上直说被拦了 - **09-28** 渠道能选接口格式了:OpenAI Chat Completions、OpenAI Responses、Anthropic、Google Gemini、Ollama 原生五种。本地部署、自建网关说哪种就选哪种,「测一下」和真跑打的是同一个地址;工具调用在每种格式下都能来回。Ollama 原生口默认把上下文开到 32k,不再被它按几千 token 悄悄截掉系统提示词;Gemini 被安全策略拦下会直说是它拦的 - **09-28** 对话在别处还跑着(另一个标签页、手机上发起的,或者断线后没接回来),这边发一句「继续」不再报「该会话已有任务在运行」:页面当场接上那一趟的直播,这句话按插队 / 排队的开关送进去;点开时那趟已经在跑的,跑着的那一轮只显示一份,不再多一轮「中断了」 - **09-27** 设置 → 模型里换了「主用」,新对话真的换过去:以前开着「新对话沿用上次选的模型」时,输入框里挑过的旧模型一直压着,设置里怎么点都没用;输入框里点「跟随全局默认」也同样会被拽回去。当前对话单独选过模型的,换主用时会说一声它没跟着换;助理页和飞书等消息单独选了模型的,对话卡里标出来,一键改回跟主用 - **09-27** 自动备份:设置 → 数据备份里选「每天」或「每周」,到点自动打一份,只留最近 7 份自动的,手点的、导入的一份不删;默认关(备份里有 API Key)。正在恢复时不打,打包时不许恢复,失败了设置页和审计里都看得见 - **09-27** 能做视频了:配音按段合成(TTS)、动效渲染(`render_motion`)、按时间线合成成片(`compose_video`)。四个现成配方——产品宣传片、产品演示、小红书轮播、多平台分发——开头先弹一张表,时长、画幅、声音、封面挑好再动手,交付页一次列齐成品。**要花钱的那一步(AI 生图、付费配音)默认是「这次不做」**,只标一句「要花钱,没替你选」,你自己勾了才跑;配音扣过费又被你停掉的,照实算已花钱。重名的文件不覆盖,另起名字 - **09-27** 网页演示录屏(`record_web_demo`):打开网页照步骤点一遍录成视频,要公开的先把本机用户名、路径这类信息打上码;录到一半页面跳走了就不交付,不拿半截录像充数。品牌档案一个产品存一份:名字、卖点(带出处)、配色、字体、配音、口吻,出图出片直接套 - **09-27** 资料库加「工作区」页签,像访达一样一层层点进文件夹,工作区里多深的文件都找得到、点得开;「文件夹」视图写明只显示最近一批,旁边「全部 N 个 →」一键跳过去;「未归属」和搜索改成查整个工作区,不再只看最新 500 个、三层以内 - **09-27** 「本回合产出」列得出第四层及更深的文件(以前 AI 写到深层目录里的文件不在清单上),飞书、企微回复里的附件同样带上;删掉的不列 - **09-27** 飞书:mp4 当视频消息发,超过上限先压缩再发,上传失败退回按文件发,手机竖拍的不再被压扁。任务卡片写这次花了多少钱(「已花 ¥0.84」);没有官方单价的写「单价未知」,不按 0 算;Claude Code、Codex 这类引擎花费记不全的,干脆不写金额,免得少报 - **09-27** 企微、QQ、公众号、iLink 发文件出错时,报错里不再带出你电脑上的完整路径 - **09-27** 测试不再碰真实数据:加了一道闸,哪条测试要写真实数据目录就当场报错;几套单独跑会写进去的测试都换成自己的临时目录。一次全量测试新增的临时文件从约 1.5G 降到 6.3M,e2e 跑通后不留临时目录 - **09-27** 配方的英文界面里「没选 / 这次不做 / 没填」三处兜底文字也翻成英文 - **09-25** 项目主页加了「替代对比」:Claude Cowork、Codex、豆包办公、千问办公、DeepSeek 各一页,中英两份,每页都老实写了什么时候还是用对方更合适;README 加「从别家换过来」一节,主页补上 sitemap.xml 和 robots.txt - **09-25** 命令行 REPL 能好好打多行了:粘进来的多行摆进输入框、回车才发(以前里头的回车直接把半截发出去);自己换行用行尾 `\` 回车、`Ctrl+J` 或 `Option+回车`;`Ctrl+G` 用 `$EDITOR` 写一大段,编辑器没存成原来的字还在;`Ctrl+R` 搜以前问过的话,多行的放回来还是多行;攒着几行时 `Ctrl+C` 只扔这段不退出 - **09-25** 命令行跑着的时候,「思考中…」和正在跑的工具那一行后面走字:`· 12s · 8.4k tokens · Esc 停`,分得清是在干活还是卡住了;按 `Esc` 停这一趟、不退出,停完那行定格成 `· 12s`。你在打字、在回答它的问题时不抢 Esc - **09-25** 命令行 Plan 模式出完计划,摆两个选项让你挑:「按这份计划开干」(切到 Craft 照计划动手,做完逐条对照计划说哪几步做了、哪几步没做)或「接着改计划」;Esc 不选,接着打字说别的。计划还在跑时你已经开始打字的,不弹 - **09-25** 命令行没人在终端前(管道、`--json`、定时任务)遇到要审批的一步,当场拒掉并告诉你怎么放行,不再干等;新增 `--allow`,出门前预先点头某一类命令、写文件或危险操作。提示里给的那串 `--allow "…"` 原样复制回去就认,写错规则直接退出码 2,不会带着没生效的放行悄悄跑下去。模型那头收到的也改成实话:以前说「已在界面弹出审批请求」,没摆过卡它就会跟你说「你拒了」 - **09-25** 命令行 REPL 里 `!` 开头自己跑一条 shell(`!git status`),输出自动带进下一句话给 agent 看,`/drop` 不要;Ctrl+C 只停这一条命令。真要发一句以 `!` 开头的话,打 `!!` - **09-25** 项目规范(AGENTS.md,没有就读 CLAUDE.md)从工作目录一路往上读到 git 仓库根,子目录里的规则离得近的优先,共用 6000 字预算;命令行任务现在也会带上,`/status` 里一行「项目规范」列出读了哪几份 - **09-25** 回答里提到的文件名,只要工作目录里真有就能点开预览。以前只认这一轮刚生成的,上一轮画的图在收尾清单表里是一行行死字;打开历史任务时文件清单晚到一步,到了也会补上链接。两个子文件夹里各有一份同名文件、说不清指哪个的,不链 - **09-24** 命令行的审批改成 ↑↓ 挑、回车确定(数字键和 y/n 照样直接选,Esc=不允许);单子刚冒出来那 0.4 秒内的回车不算,免得之前多敲的一下把删库命令放过去。窄终端里一行都不折,重画擦得干净 - **09-24** 命令行里工具调用的样子跟 Claude Code / Codex 对齐:`● Shell(npm test)` 一行写清跑的哪条命令、改的哪个文件,下面 `└` 挂输出头 4 行、剩下的说还有几行;退出码非 0 放第一行;并发或中间插了审批单,结果前把自己那行再印一遍,不会挂错 - **09-24** 画布出视频:上游已经收下的那一单出了错(等结果超时、下载断了)不再自动重跑,免得扣两次钱,提示里给出任务号 - **09-24** 画布出视频带上卡上写的时长、画幅、分辨率,镜头没写时长就用新建短剧定的每镜秒数;新镜头卡的占位字不再混进提示词 - **09-24** 设置里的上下文上限留空=按模型窗口自动算,不再一保存就卡在 12 万字 - **09-24** 在画布里对话,任务历史当场显示「运行中」、置顶、回复边到边进来;历史里只显示你打的那句,不再是一大段操作说明;断流会接着跟到真跑完 - **09-24** 输入框提示 `@` 引用文件、`/` 调用技能与指令 - **09-24** 判断模型(Jev)改成默认不开:只配了 OpenRouter 聊天渠道不再自动用它,要用得自己加一条「TypeSafe Jev」渠道 - **09-23** 命令行 `/cost`(也就是 `/status`):这个会话一共花了多少 token、调了几次、约多少钱;有一轮的模型查不到价就只报 token 不报钱,本机引擎按不花钱算 - **09-23** 等输入的命令(`read`、`input()`、`npm init`)不再空等到超时:`run_shell` / `run_node` 不给 stdin,当场读到结尾,以前白等 120 秒、现在 0.07 秒回来。`read_file` 认 `offset`/`limit`(以前静默丢掉、从头整篇读),二进制文件直说不回乱码;`search_files` 认 `pattern`/`path`,给一个文件就只搜这一个;空命令报错不再假装 exit 0 - **09-23** 改 Windows 换行(CRLF)的文件不再改出一半 `\n` 一半 `\r\n`:`edit_file` / `multi_edit` / `write_file`(含追加)都跟着文件原来的换行走;文件用 Tab、它给的是空格(或反过来)时写回去换成文件的那种,不再留下 Python 报 TabError 的混缩进。本来就混着的文件不动 - **09-23** `openworkbuddy workflow 流程.json`:把「想方案 → 照做 → 审一遍」写成文件按顺序跑,`{{名字}}` 贴前面某步的结论;一步没成后面就停,文件写错一步都不跑 - **09-23** 钩子:`config.json` 的 `agent.hooks` 里写命令——`before_shell` 拦命令、`after_edit` 改完文件自动跑(格式化/lint)、`done` 没过不许收尾(最多打回两次) - **09-23** 命令行:`/review`(和 `openworkbuddy review [基准]`)把改动取好交给它审,只看不动;`.openworkbuddy/commands/*.md` 自己写斜杠命令,`$ARGUMENTS` `$1` 填参数;新开关 `--model` `--max-steps` `--append-system` 只管这一次 - **09-23** 写代码更顺手:`find_files` 按名找文件、`multi_edit` 一个文件改多处(全成或全不动)、读后被改就拦(改前先重读)、`run_shell` 可放后台(`shell_output` / `shell_kill`)、`todo_write` 进度清单——没打勾就收工会被打回 - **09-23** **开工之前先挑技能:用户点名一分钱不花直接加载,没点名才问判断模型一道单选(默认关,设置 → 智能体设置)。** 用户装了技能是指望干那类活时照着做,可技能在提示词里只是一份名字清单,模型第一步想不起来,整篇就按自己的路子做完了。「/wechat-article」「用 wechat-article 写」现在机械地加载,开关关着也照做(整词匹配,`html-page` 不会被 `html-pages-v2` 蒙混);没点名、开了闸,问一道「该先照哪个技能做」,选项是技能名加「都不对口」,挑中且确定度到 70% 才替它加载。只在顶层任务问、已加载过不再问;只会多加载不会少加载;挑「都不对口」、拿不准、问不成一律照旧并留一行警告。67 条断言,换回旧 agent.js 18 条红 - **09-23** **加载过的技能,历史一压缩就忘了;下一轮续跑更是从头没这回事。** `use_skill` 的全文以前只是一条工具结果躺在历史里,压缩、截短第一个牺牲它,于是同一场对话里第三篇推文又不按技能来了。现在加载好的技能全文挂在系统提示词「已加载技能」一节(最多三份,更早的列名字),每一步都看得见;工具结果只回一句回执;压缩摘要里写一行【已加载技能】,续跑时从历史里的 use_skill 调用和这一行把技能自动带回来。提示词里把「动手前先 use_skill」从建议写成规矩 - **09-23** **历史压缩那一步用的是全局默认模型,不是这场对话选的那个——默认模型填成判断模型时压缩直接 400,报错一行看不懂。** 压缩摘要现在跟着这场对话的模型走;渠道里把判断模型(Jev)当对话模型用,报错直说:它只会在选项里挑一个,不会写字,去 设置 → 模型 换,判断模型在 设置 → 智能体设置 里单独配 - **09-23** **记忆超预算时,「交付别用 open 替我打开」这种规矩被挤掉了——恰恰是任何活都得守的那种。** 装不下时按跟本次任务的相关度挑,对事实是对的(写推文用不着「报销走飞书」),对规矩是错的:「别替我打开文件」跟「写公众号推文」一个词都不沾,相关度零分,比它新的杂事都排在它前面。现在规矩类先进门(按记入时间,稳定),剩下的预算再按相关度挑事实;规矩多到装不下也明说「还有 N 条规矩装不下」,不悄悄丢;命中只记给真进门的。21 条断言,把「规矩先进门」改回去 5 条红 - **09-23** **agent 做完老是 `open` 一下替你把文件打开——用户没要求的话,交付只报路径。** `open` / `xdg-open` / `start` / `explorer` 进了「先问」那张表:全自动档也会弹一次确认,用户明确说「打开」才开;提示词里也写明对话里会自动出预览卡,不必替用户开。cmd-risk 套 141 条,新增 11 条(含 `&&` 串起来的;`echo open the door`、`node open.js` 不误拦) - **09-23** **对话里的预览卡和右边预览面板打开的不是同一张图。** 同一个路径 agent 改了三版,卡片是改完那一刻抓的,右边面板点开是浏览器缓存里的上一版,用户以为它骗人。现在每张卡、每次预览都带那一版的时间戳(`?v=`),服务端只对带版本号的请求给长缓存,不带的一律不缓存;卡片和面板各自指向自己那一版,点哪张开哪张。前端和 e2e 各补了断言 - **09-23** **v0.9.0 第二次打标签又红了:这回红的是「clone 只占 50.1M,不到普通拷贝的四分之一」——量出来 clone 比普通拷贝还大,这在物理上不可能。** 那条断言量的是 `df` 系统级空闲盘的前后差,流水线那台机器上 e2e 刚跑完 Electron 就把 prefs 这套当子进程再跑一遍,别的进程还在往盘上写,48M 的差里混进了别人的 2M。同一提交在 push 触发的流水线上是绿的,本地也是绿的——**这是量法的噪声,不是 clone 退回了普通拷贝**。改成最多量三次,哪一次量出 clone 不到普通拷贝四分之一就停,三次都不像才算挂,两次之间 `sync` 等 300ms。红话里带上每次量出来的数,一眼能分清是噪声还是真退回。变异对照:在镜像里把 `canClone` 硬掰成 false,三次量出来都是 ≈48M,闸照红——重试救的是噪声,救不了真退回。本地 393 过 0 挂。 - **09-23** **打断你之前先判一句:第二问起,agent 弹给你之前先花一道题问问是不是非问不可。** `ask_user` 是唯一不受循环守卫管的工具——连问四遍也不会被拦,而拦它的理由本来就该是「这一问值不值得打断用户」,不是「问了几次」。现在开了这道闸(设置 → 「打断你之前先判一句」,默认关),头一问白放行;从第二问起,同一轮里字面上问过的直接回上次的答案不再弹;没问过的先交给判断模型归类——「关键信息 / 岔路 / 得你拍板」照旧弹,「汇报进度 / 技术路线 / 自己查得到 / 又问一遍」四类且确定度 ≥ 80% 才拦下,拦下的回给 agent 一段回执:按最合理默认继续、在最终汇报里注明、判错了再问一次这道闸不拦。归类没答上来、判断模型没回应、两道题打架,全都照旧弹——**这道闸只会少弹,不会替你挑答案**(岔路永远弹)。85 条断言,含五组真跑 agent 的对照:开闸配「汇报进度」拦 1 放 2、关闸 3 问全弹、「非得问」全弹、判断模型抛错全弹并留痕、归类说是岔路全弹。 - **09-23** **本地测试全绿,流水线上红了——这套测试悄悄依赖开发机的系统语言。** v0.9.0 的标签推上去,测试那一步就挂了,后面打包和发布整个跳过,Release 页上一个包都没有。差别不在代码在机器:界面语言默认跟系统走(`navigator.language`),开发机是中文,流水线那台是英文,而有两条断言照着中文原文比——「点 + 开的是新建项目那个编辑器」比的是弹窗标题那四个字,在英文界面上量出来是 `New project`。**红的是断言的写法,不是产品**:那个编辑器好好地开着,四栏一栏不少。两处都改成量结构——这一条现在数「名字 / 工作目录 / 项目指令 / 挂哪块资料库」这四栏在不在(这本来就是它那句话承诺的东西),/ 菜单表头那条改成看提示里有没有 `↑↓` 和 `Esc`,键名哪个语言都不翻。另外真页面进门先把语言钉死再整页重载,钉没钉住当场验,验不过直接报错,而不是让后面几十条断言结在一个说不清的前提上(另外四套开真页面的测试早就这么写了,就这一套漏了)。量了三遍:钉中文 68 节 2296 条全绿,钉英文同样 68 节 2296 条全绿——换台机器量出来的数一样;再拿修之前的断言配英文界面,第 66 节当场红,报出来的那句话跟流水线上的一字不差,这才算复现了。 - **09-23** **上一条是「数错了改过来」,这一条是「别再靠人记得」。** 徽章那份数字只有人手动跑 `npm run stats` 才重算,而「记得跑」这件事是靠不住的——上一版就是这么挂了一整版。现在机器每次跑测试都自己数一遍,跟 `docs/stats.json` 里存的那份逐栏对(连版本号一起对,发版抬了号忘了重跑当场红)。**`updated` 那一栏故意不比**:它每天都变,比它等于要求每天重跑一遍,然后所有人第二天早上看到的都是红的——一个天天误报的闸,两周之内就会被人学会忽略。9 条新断言,其中 4 条是反向对照:技能数差一个要抓得到、版本号没跟上要抓得到、只有日期不同不许红、文件整个读不出来要算每一栏都不对(而不是静悄悄放行)。真注进去量过:把存着的技能数减一,闸红在那一条上;把版本号退回 0.8.1,红话里直接写出「文件里写着 0.8.1,现在数出来是 0.9.0」和下一步该跑什么。发版清单里也补上了这一步。 - **09-23** **README 顶上那几个徽章数错了,写着 35 个技能,实际有 36 个。** 徽章读的是 `docs/stats.json`,这份文件得手动跑 `npm run stats` 才重算,上一版之后没人跑过。顺带修了同一个脚本里的日期:`updated` 那一栏用的是 `toISOString()`,那是 UTC——东八区晚上八点之后跑一遍,徽章上写的是昨天,而同一次提交里更新日志的日期是本机算的,**同一天的改动在两个地方写着两个日子**。改成按本机时区取。就地量过:此刻本机 09-23 00:42,旧写法吐 09-22,新写法吐 09-23;两条对照——把时钟搬到 `TZ=UTC`,两种写法必须一模一样;搬到 `TZ=America/Los_Angeles`,本机日期得是更早的那个。不然「修好了」可能只是把偏移硬加了一天,换个时区照样错。 - **09-22** **刚给 `/` 菜单加的上下键,没有一个地方告诉过用户它存在。** 顺手把「回车是填进输入框,不是把话发出去」也写在表头右边——这条规矩刚改过,学过旧行为的人不看一眼不会知道。一行都挑不了的时候(打了个谁也匹配不上的词)这句不出现,免得指一条走不通的路。**同一趟修掉了自己上一版引进的毛病:名单是异步对回来的,对回来就重画,而重画无条件把选中钉回第一行**——人刚按了两下 ↓,名单一落地就被拽回去,上下键等于白按。现在重画会把选中留在原来那一行,只在菜单正开着的时候算:关掉了的那一次挑到哪儿,下一次再打 `/` 不该还认,那是人看不见的旧状态。名单跟刚才一模一样时干脆一次都不重画。3 条新断言(提示在/不在、重画选中不跑、没变不重画),6 处变异注进真代码,另加 2 条等价改写当对照,一条都没误报。其中「选中跨关了又开漏过去」那条,是原来那条反向对照先红了才发现的。 - **09-22** **打 `/` 挑个技能,回车一按,话就发出去了——而人还没写要它做什么。** 认 `/` 的那个监听挂在 capture 阶段,只 `preventDefault()` 就收手了;可管回车发送的那个监听挂在同一个 textarea 上,两个都在「目标元素」这一级,按注册先后挨个跑——前一个拦掉的是浏览器的默认行为(换行),拦不住后一个 JS 监听。**要掐断的是传播,不是默认行为。** 同一处还补了上下键:以前「选中」那一行全靠渲染时给第一行钉个 `.sel`,回车永远只拿得到第一个,想要第二个只能伸手去点——所谓「选择技能」在键盘上根本做不到。现在 ↑↓ 能走、走到头绕回来、跟着滚动。**另一件事:装完技能得刷新一下页面,`/` 里才找得到。** 那份技能名单只在开页面那一下拉过一次,之后再没人管它。只补在「本机点了安装」那一下是不够的——技能进来的路有好几条:技能中心装的、插件一包带进来的、命令行直接往目录里扔的、别人在同一台服务器上装的。所以改成「要用的时候顺手对一遍」:`/` 一打就去核一次名单(节流 3 秒,不然一个词能打十几次接口),哪条路进来的都算;加号菜单里的技能列表走同一份,插件装好 / 更新 / 卸载那几处不重拉技能的地方再显式对一遍。7 条新断言在真页面上跑,临时服务器顺带支起一个 `/api/skills`——往那个数组里加一条就等于「服务器上装了个技能」,然后看页面不重载认不认得。两条**反向对照**:把 `stopImmediatePropagation` 抹平(只动这一句,别的一字不改),同一下回车当场把话发出去;把「顺手对一遍」换成空函数,新装的技能就永远看不见。11 处变异逐条注进真代码(换成 `stopPropagation`、回车不看选中行、上下写反、走到头不绕回、节流拉到半小时、名单拉回来了不重画),另加 2 条等价改写当对照,一条都没误报。 - **09-22** **点侧栏「项目」那一行上的 +,只闪了一下,什么也没有。** 这颗 + 长在「项目」那一整行里面,而整行的动作是「打开项目管理页」。侧栏的点击是委托在 `.side-nav` 上、按 `closest(".item")` 认的,所以点 + 和点整行在它眼里是同一件事:主区切到项目页 → 重新拉一遍项目 → 把 `#proj-list` 整个重画——刚插进去的那个输入框当场被抹掉。**「闪一下」不是动画,是两个动作打架,后一个把前一个的结果盖掉了。** 顺手把新建的入口也换了:原来是在列表顶上插一个只填名字的输入框,工作目录、项目指令、挂哪块资料库当场都配不了,建完还得再进去补一趟;现在点 + 直接开项目页上「新建项目」那同一个编辑器。扫了一遍 `public/index.html`,侧栏里嵌着可点控件的行只有这一处,所以这个坑是独一份的。6 条新断言全在真页面上跑:起一个临时静态服务器加载真的 `index.html`,点真的那颗 +,看弹窗开没开、主区有没有被顺手切走;其中一条是**反向对照**——把拦冒泡那句摘掉、换回旧的就地插输入框,当场复现「闪一下就没了」。不加这条的话,上面几条只能证明「现在好使」,证不了「当初坏在这一句上」,也就拦不住它再坏一次。2 处变异逐条注进真代码(摘掉拦冒泡、退回旧写法),另加 1 条等价改写当对照,一条都没误报。 - **09-22** **手机上那排键,手指得贴着连点两三次才中。** 在 390 宽的屏幕上量了一遍:50 个能点的东西里有 9 颗任一边不到 36px——发送键 32 见方,附件、侧栏、模型选择器、顶栏那几颗全是 30 高。手指的接触面直径大约 8–10mm,落到 390 宽的屏幕上就是 40px 上下,30 见方的键意味着每一次点都在赌。**这不是「小了点」,是同一个动作有时管用有时不管用**——而人分不清是自己没点准还是应用没反应,只会觉得这东西卡。现在按 `pointer` 分档:触屏上两个控件高度令牌一起抬到 44,发送键 44 见方,顶栏「成果文件」「插队」、空屏上那两排(场景页签、下面的建议)都给到 44 高;行里夹着的那几颗(列表行尾的「更多」、分组头那颗 +)行高给不到 44,给到 40;chip 上那颗 × 只有 18 见方,chip 本身才 26 高撑不开,用负外边距把热区从 chip 里溢出来——看着还是 18,点得着 32。**分档按 pointer 而不是按窗口宽度**:桌面浏览器拉窄了仍然是鼠标在点,没必要为它牺牲密度;真正需要大热区的是触屏,而这件事只有 pointer 说得准。几何本来就全挂在那两个令牌上,所以这儿改两行,整套键一起长大,不用一处处追。量完再量:触屏档 0 颗不到 44、0px 横向溢出(键长大最怕的就是把版面撑出横向滚动),鼠标档一颗没动、也没有任何一颗小于 24×24(WCAG 2.5.8 那条底线)。15 条新断言不是读 CSS 文本,是起一个只喂 `public/` 的临时静态服务器、在 390×844 的窗口里加载真的 `index.html` 去量真几何;触屏那一档靠 CDP 打开触摸模拟——`Emulation.setEmulatedMedia` 压根不支持 `pointer` 这个特性,最早那版两档量出来一模一样就是栽在这儿,所以**「这一档真的是 coarse 吗」被钉成了一条先验料断言**:一个假前提能让下面每一条都绿得毫无意义。侧栏收起来、chip 还没出现的时候那几颗量不到,量不到就等于没测(第一轮变异正是从这儿漏掉两条),改成把真选择器要的那层壳搭出来、摆到屏幕外面量。12 处变异逐条注进真样式表(含「整段规则等于没有」「按窗口宽度分档」「发送键只长宽不长高」「常规档那个令牌忘了改」),另加 3 条等价改写当对照,一条都没误报。 - **09-22** **那只桌面宠物,默认是开着的——而桌面上什么都没有。** 后端三处写的都是「没配过就是关」(`server.js` 的 `enabled === true`、`pet.js` 的初始值、`electron-main` 读不到配置时的兜底),只有设置页那张卡画成了 `enabled !== false`:于是一个从没碰过这个开关的人打开设置,看见「显示桌面宠物」勾得好好的,桌面角上却空空如也——他会去查宠物为什么没出来,而不是去查这个勾为什么是勾上的。**界面替状态撒谎,比状态本身错更难查。** 顺手把开关搬出来:原来唯一那个开关埋在 设置 → 助理 那一屏往下滚的一张卡里,想让它出来陪一会儿、或者开会前让它消失,都得翻三层——**开关存在但找不到,等于没有**。现在右上角头像菜单里、紧挨着「语言」那行就是它,「开 / 关」两颗胶囊跟语言那行一个样式,点即切、菜单不关、原地翻;点下去先把界面翻过去再去存,存不下当场翻回来并弹红字——屏幕上停着一个服务端并不认的状态更糟:他以为关掉了,下次开机那只还在桌面上。纯服务端模式(`npm start`)压根没有桌面窗口,这一行整个不画:一个点了没反应的开关比没有更伤人,而设置页那张卡照旧在,那儿写得下为什么。这一行一个新词条都没往字典里加——标签本来就在字典里,「开 / 关」跟着 `data-i18n-skip` 走,英文下自动是 On / Off,i18n 那道 90% 覆盖闸门的分子分母一个没动。头像菜单那组断言从 29 条涨到 47 条(含反向对照:`available:false` 时哪怕 `enabled` 是真也不画、再点同一档不白跑一趟服务端、真开着的时候设置页那格确实勾着)。其中两条是把存盘卡在半路量的——**「请求发出去了、还没回来」那一帧**:少写一句 `p.enabled = next`、或者存完之前压根不重画,只看最后一帧的话照样全绿(存成之后整个 `settingsCache` 会被服务端那份换掉,最后一帧看着一模一样),这两条变异当初就是这么漏过去的。23 处变异逐条注进真源码,另加 3 条等价改写当对照,一条都没误报。 - **09-22** **Release 页不告诉你这一版改了什么。** 上面只有一份安装指南和一条 `Full Changelog` 的 compare 链接——站在下载页前面的人只想知道一件事:值不值得现在更新;而要回答它,得点进去翻二十个 commit。那句话其实早就写好了,就是 README「最新动态」里那几行人话,只是从来没被搬到发版正文上去。现在 `scripts/release-notes.js` 按 **tag 区间**去挖:上一个 tag 到这个 tag 之间,README 里**新增的**那几行,原样摆在正文最上面。按 tag 挖而不是按日期抓,是因为同一天发两个 patch 时,日期口径会把上一版的改动在这一版再印一遍(e2e 里那条断言就是拿两个真 tag 比有没有重复条目——写这条的时候它当场逮住脚本自己的一个 bug:`main()` 收了参数却还在读 `process.argv[2]`,于是两次调用挖出的是同一版)。挖不到就一个字不写:第一个 tag 前面没有可比的东西,CI 上万一是浅克隆也取不到上一个 tag——宁可退回「只有安装指南」,也别在发版正文里印一段来路不明的东西。发版这条链的闸门从 22 种退回加到 26 种,新增的四种全是这段会**悄悄变成空白**的路(脚本没了、算了却没摆进正文、正文那步压根不调它、release job 的 checkout 退回浅克隆);顺带把「checkout 得是全深度」这条按 job 切开各查各的——release.yml 现在有两处 checkout,整份一起 regex 的话,一边退回浅克隆另一边还是深的,那条照样绿。 - **09-22** **会话太长要先压一压,而压的那十几秒屏幕上什么都没有。** 压缩自己也要跟模型说一次话,而这一步正卡在「他按下发送」和「第一个字出来」中间:一声不吭的话,他看到的就是一个不知道在干什么的转圈,只能猜是模型卡了还是网断了(余量条上那句「下一轮开跑前会自动压一次」,反而让这个空白更难解释——说好了要压,然后就没动静了)。现在开跑先报一声:过程区里摆一行「正在把早前 20 条消息压成一份摘要…已等 8 秒(压完这一轮才开跑,原文归档不删)」。没有真进度可报,硬画一根匀速爬的进度条是骗人,所以只报两件能说准的事——在压什么、已经等了多久;秒数由过程区那根本来就在的 1 秒计时器带着走,不另开一个可能漏掉的定时器。**报了开头就必须有收尾**:压成了、模型这一发挂了、模型回了个空,三条路各带一条结果出去,把同一行的字换掉(不是再摞一行——摞一行的话,历史里会永远留着一句停在「正在压…」,看着像卡死在那儿);压崩了如实说是哪一句报错、说清早前的内容一条没动、并指一下去哪调预算,不许假装压成了。后端漏了收尾还有最后一道:这一轮结束时扫一遍,还挂着「正在压」的行一律收掉。`compact_start` 这条是转瞬即逝的,不进存盘清单——进了的话,回放老会话会重演一行「正在压…」,而那一刻根本没人在压。10 条端到端(含反向对照:没到阈值压不着的时候一个字都不许说)+ 25 条前端(其中 11 条在真窗口里量,秒数是量文本真的变了、不是量那个函数被调用过)。 - **09-22** **设置里那个「看图模型」,把本来就会看图的主模型挤掉了。** 这一路以前的判据只有一条——那个槽里填没填东西,填了就一律绕开主模型。真实配置里于是出现了这一幕:主模型和看图槽填的是**同一个型号**,只是走了两条渠道,同一个模型被硬拆成两份,多一把 Key、多一份限流额度;单配的那条一路 429 和超时,主模型这边一次就过。用户的原话是「文本模型我用多模态模型就没有必要用什么看图模型」。现在按设置页上一直写着的那句话走:**单配的看图模型,是给「主模型看不了图」的人预备的**。主模型自己会看图就直接用主模型,并在答案末尾交代一句「没绕到单配的 X」——绕过了他亲手配的东西却一个字不说,那条配置在他眼里就是凭空没了;同一个型号拆两条渠道的,认型号名不认渠道;`look_at_image(model: "…")` 点了名的一律照办。「会不会看图」只认 caps 里那个勾(设置页上他自己勾的),老配置没 caps 才退回按型号名猜,跟设置页下拉分组共用同一份 `capOfModel`——名字是层很薄的伪装,能问就别猜。勾错了也不让这张图白丢:主模型当场回 400「不支持图片」时,单配的那条自动顶上,并告诉他去哪儿把那个勾取消。设置页那格同样照实说是谁在看——主模型会看图时写「主模型自己会看图,直接用它 · N 个备选待命」,不说的话,在这儿挂了个模型的人会一直以为图都归它,而它其实一次请求都没接到过。13 条纯函数断言 + 6 条端到端(含 2 条反向对照:点名了就不许改投、没绕过谁就不许多这句话)。 - **09-22** **你拖进去让它看的那张图,转头出现在「本回合产出」里。** 附件是**先传后发**的,上传接口要拿会话 id 去认领这条对话的成果文件夹;而新开一条对话时,这个 id 要等到**按下发送**那一刻才生成——于是传图那一刻带过去的是 `null`,服务端既没处放,也记不上「待搬进去」那笔账,图就落在任务目录的**上一级**。agent 在自己的工作目录里翻不到,只好 find 一圈再 cp 一份进来;那份副本是这一轮新写的文件,于是他传进去的**输入**,被如实记成了产出。现在 id 在传附件那一刻就取,发送那一步改成按「左边列表里有没有这条对话」判断是不是新会话——取过 id 不等于列过。顺带一笔:任务文件夹名把发送时自动补进正文的素材锚点也当成了用户写的字,于是真实数据里躺着一个「任务_0921_图片1IMG8037JP」——序号和被砍了一半的扩展名占满 12 个格,他真正问的那句「这是什么」一个字都没进去;现在锚点先洗掉,只拖了图一个字没写的,拿文件名(去扩展名)兜底。 - **09-22** **发出去之后,刚才拖进去的是哪张图,界面上只剩一个文件名。** 输入框上面那排 64px 缩略图是发送前的事,按下发送就没了——气泡底下只剩一颗写着 `IMG_8037.JPG` 的回形针 chip,点不动;想看一眼自己发的是哪张,只能去文件库里按名字找。现在图片在气泡**上面**摆成真缩略图(跟气泡右边缘对齐,最长边 220px,一律走 `?thumb=320`,原图有 2800×7032 的,解出来 75MB),非图片的附件仍是气泡里那排带名字的 chip——图看画面、文件看名字。两者点一下都开右边那张预览卡,卡上有「下载」和「打开所在位置」,这才算真的**找得到**那个文件。路径三档兜底:上传那一刻服务端亲口说的那份最准,其次按会话目录拼,再不行按工作空间根目录——会话 id 那个 bug 修好之前传的图,物理上就躺在根目录,所以第二档失手会自动退到第三档再试一次,两档都读不出来才降成一颗写着名字的灰 chip,并把 tooltip 改成「这份素材读不出来了:可能已被改名、移走或删掉」,不给人看一个空灰框。前端 2223 条断言 / 63 组(气泡那组从 28 涨到 50,其中 7 条是在真窗口里量 `getBoundingClientRect()`:缩略图在气泡上面、右边缘对齐、220px 封顶、长宽比没被压扁、灰 chip 真能看见);17 处变异逐条注进真源码。 - **09-21** **按「引用」,输入框里多出 400 字别人的话;拖进来一张图,输入框里多出一行「【图片 1:xxx.png】」。** 这两样都是发给模型看的协议,却一直往人打字的那个框里灌:引完得先翻过自己引的那一坨才能接着写,图片那行删错一个字锚点当场就废。飞书、ChatGPT、Claude 都不是这么做的,现在改成同一套:**引用钉成输入框上的一张卡**(谁说的 · 两行封顶 · × 撤掉 · 点一下跳回原文,原文不在这个对话里了会说一声),在回复里拖选一段还会就地冒出「引用这段」——只引选中的那一截,而且选区得真落在这条回复里,在别处选的字不许记到它头上(界面上看着完全正常,引的却是别人的话);**图片变成输入框上面那排 64px 缩略图**(名字进 tooltip 和无障碍标签,底边一条序号),文件仍是带名字的宽 chip——图看的是画面,文件看的是名字。协议推迟到按下发送那一刻才拼进正文:开头一段 `> `、随后一行一个【图片 N:…】、末尾那句兼容清单,**发给模型的字节一个没变**,老会话回放出来不差一个字;人自己把锚点打进句子里的,位置以他摆的为准,不在开头再补一遍(补了的话同一张图在模型眼里成了两张,它会老实地拼出四格)。气泡里也把这两样折起来:开头的 `> ` 折成一张点得开的引用卡(三行封顶),素材锚点折成气泡底下那排(图片 / 视频 / 音频 / 摘录 / 文件各自的图标,一排全是回形针等于没分类),**写在句子中间的锚点一个字不动**——折掉的话「把【图片 1:a.png】放左边」会变成「把放左边」,而他发出去的原文其实是好的。引用的正文是模型吐出来的,两处都走 textContent,不进 innerHTML。前端测试 2176 条断言 / 63 组(引用 46 条、气泡折叠 28 条):气泡那段长在 createTurnUI 的闭包里,从真源码里整块切出来用 new Function 跑;折叠和两行封顶都是量 `scrollHeight > clientHeight` 的真裁剪——`-webkit-box` 在 flex 子项上计算值是 `flow-root`,直接断言关键字会看走眼。12 处变异逐条注进真源码,12 红,红的都是对应那条断言。 - **09-21** **想知道本机的 Claude Code / Codex 到底能不能用,得先切过去用它一回。** 整个设置页只有一条通道说实话——「测试连接」,可它长在展开区里,而展开区只对**已经选中**的引擎渲染。现在「试一下能不能用」挂在每一张装了的卡上,不选中也能当场试,全卡就一颗钮。徽章那边同样在替人下结论:`--version` 跑通就发一个绿的「已装 ✓」,可它只证明文件在——没登录、订阅过期、被限流,长的全是同一个绿;现在没真跑过只说中性的「本机有 2.1.278」,绿留给真跑通的那一次,测不通当场转红并写清楚下一步敲哪条命令。版本号顺手削成一个形状(`2.1.278 (Claude Code)` 和 `codex-cli 0.154.0` 在徽章上都只剩数字,标题已经写着产品名了,不说第二遍),原样那行连同启动命令行一起挪进展开区——`claude -p --output-format stream-json` 摆在折叠卡上,对着想用订阅的人说不出任何信息。测出来的结论记一份,保存设置重画一次不用再花 token 重测;点钮、点结论都不算「切引擎」,试和用是两件事。前端新增 29 条断言(含 4 条反向对照:钮不在展开区里 / 命令行没被删只是挪了 / 点卡片正文确实切得过去 / 红是量出来的颜色不是数类名),6 条变异按「改之前」的写法塞回去,全被对应那条断言当场拦住。 - **09-21** **「本回合产出」里冒出一堆在别处见过的文件名。** 文件没有串台,是卡片把一包东西拆开摆了:那一轮任务跑了它自己写的导出脚本,把整个仓库拷进任务目录,真落盘 124 个文件、其中 122 个都在同一个目录里;而卡片上只写文件名、不写目录,摆出来就是一排眼熟的名字,连字节数都跟仓库里那几个一模一样(本来就是逐字节的拷贝),真正做出来的那份行动方案反倒被挤到只剩一张卡位。判据两条一起看:这个目录这一回合收了 8 个以上的文件,且里面够格上卡的是少数派——缺第二条的话,一回合出 12 张分镜图的做图任务会被折成一个文件夹图标,而那 12 张恰恰是真产出。够格的整包换一张文件夹卡,只给一个打开文件夹的入口;下面的变更清单一条不少,122 个文件照旧查得到全路径——摊开的是卡片区,不是事实。顺带:文件夹的生死改成「里面还有活着的文件就算它还在」(名字永远不在文件清单里,拿 `alive` 判等于每来一条事件撤它一次),`README.en.md` 这种带语种后缀的也不再当交付物上卡。frontend 15 条断言,3 条是反向对照。 - **09-21** **手机配对的二维码里,那个地址是猜出来的,猜错了扫出来打不开。** 老做法是「翻到第一个私网 IPv4 就用」,而 `os.networkInterfaces()` 的顺序没有任何保证——这台机器上量过:真网卡是 192.168.1.84,代理隧道 198.18.0.1 排在它前面,连 `route -n get default` 指的都是隧道,所以「按默认路由挑」同样错。装了 Docker 或连着公司 VPN 的机器,172.17.x / 10.x 完全可能排在前面,编进二维码就是一个手机永远够不着的地址。现在按网卡排:物理口在前,隧道口、Docker 网桥、虚拟机口一律靠后,同一档按名字排死,免得每次刷新给的地址都不一样;挑法再准也可能挑错,所以一次返回最多 3 个候选、各自带二维码,界面上给一句「打不开?换一个地址」。那一屏也补上了三句人话:这串码干嘛用、这个地址哪来的、它什么时候打不开(换网络、用手机流量都打不开);一个局域网地址都翻不到时不再留白。顺手逮到的另一桩:6 处 `toast(…, "err")` ——第二个参数是图标名,`#i-err` 在 169 个 sprite 符号里查不到,浏览器不报错不警告,画一个 15×15、里面 0 个形状的空框,于是「复制失败」「踢不掉」这几句既没图标也不是红的。`test/icons.js` 新增一道闸,专扫从参数流进 `ic()` 的那一类(102 处字面量逐个对 sprite)。 - **09-21** **快捷键表上有一条,按下去只会弹一句「暂未支持」。** 19 条逐条在真 app 里过了一遍:2 条由输入框自己处理,16 条按下去真有事发生,1 条是死的——⌘D「语音录制开关」,整个函数体就是 `toast("语音录制暂未支持")`,前端压根没有任何录音界面。它在设置里跟其余 18 条排在一起,长得一模一样,用户没法知道哪条是真的。三处一起删(表项、动作、英文词条),那行「共 N 条」读的是表长,自己从 19 变成 18。闸门不靠正则扫源码,而是把两张真表解析出来对账,五种坏法各配一条反向对照:占位动作、空动作、只在表上没动作、只在代码里用户永远按不到、标成系统级却没在主进程注册。 - **09-21** **搜索只认 Jina / Tavily / Brave 三家,国内用户得先翻出去才能搜。** 现在是八家,默认国内优先:博查、智谱、七牛云,海外 Tavily、Serper、Jina、Brave,再加一路「自定义」——填个地址就能接自建的 SearXNG,或者接我没法逐条核实的那几家(阿里云 IQS、秘塔、火山)。配了几家就顺延几家,前面那家挂了自动往后走,最后才落到不要 Key 的免费通道;配额是先扣后退,被免费通道兜住的那次会退回去,账单上记的是真正出结果的那家,不是你在设置里选的那家。返回结果按**形状**认(几种已知的数组位置挨个试),厂商哪天多包一层,最坏是「这次没搜到」,不是整条 agent 断掉。免费兜底那条的超时从 30 秒压到 8 秒——它只是兜底,卡够 30 秒不如早点说没有。价格表里那几个数字照公开资料填的,没逐条核对厂商页面,这句话也写在界面上。 - **09-21** **跑到一半进程没了的那一轮,历史里永远转着「运行中…」,还找不到哪儿能停。** 回放是拿「回答」那条记录来收尾的;一问后面没有回答(服务重启、进程被杀),这一轮就没人给它画终点,标题上的圈一直转——偏偏这时 runningSessions 里根本没有它,界面上一颗能停的钮都找不到,只能重开。现在回放到末尾发现最后一问没人接,就按「断了」收尾:写「中断了 · 1 步」,标题上挂一句「没收到结束,这一轮是断的」。frontend 新增 3 条断言,含一条反向对照——正常收尾的还得是「已完成」。 - **09-21** **答过的岔路,每次打开这条对话都重新问一遍。** 回放历史时先给提问卡加了 `done`——那个类是拿来标「不能再点了」的;可「结论已经画上去了」用的判据也是它,画结论那一步于是被自己人拦住。一条早就选完的岔路,隔天打开还是「有个岔路,想让你定一下 / 这是历史记录里的提问」,看着像卡在那儿等人回答。两件事拆成两个标记之后,同一条对话回放出来是「这个岔路你定过了 · 你选了 投资决策参考」。顺带量了一下最早的猜测(回放动画太慢造成的错觉):整段回放 21 毫秒,跟它没关系。frontend 新增 4 条断言,含一条反向对照——没答过的那张不许编出个答案。 - **09-21** **刚注册一个账号,侧栏里躺着的是前任所有的对话。** 升级上来那批老会话没记归属,而「没记归属」以前一律当「公共的」——本意是别让历史丢了,做出来却是新建一个 demo 账号,一打开满屏都是别人的任务。现在它们认到这台机器上第一个注册的人名下(账号体系还没有那会儿,坐在这台机器前的就是他):他的历史一条不少,新账号的侧栏干干净净。空壳会话照旧放行——前端是先发 id、再发第一句话的,拦了等于谁都开不了新任务。e2e 正反各钉一条 ★。 - **09-21** **资料库是整台机器共用的一份,谁传进去别人都看得见。** 以前只能按「谁的东西」拦:写拦得住(非管理员那儿挂「只读」角标),读拦不住——每个人的 agent 都带着 library_list / library_read,一句「翻一下资料库」照样把别人的合同念出来。现在换成一人一个根:老库原地不动、还归第一个注册的人(一个字节都不搬),其余账号各自一份、用到才建。写闸跟着撤了——根都分开还拦写,等于给成员一个自己的空目录什么也放不进去,比原来更难用;界面上那副「共享资料 · 只读」的面孔也一并拆掉。tenant 498 过 / 0 挂,8 个变异体全拦下。 - **09-21** **换了个账号,宠物和通知渠道还是上一个人的。** 引擎、宠物、快捷键这些本来就该谁用谁的,却一直只有 config.json 一份。现在按账号存,请求进来时跟工作区、配额、策略一起挂上。「个人桌面版」那条短路(一切照旧读 config)从两个条件收紧成三个:Electron 壳 + 只听本机 + **这台机器上只有一个账号**——同一台 Mac 上开了两个号,这话就不成立了,再走短路等于小张能改老板的 Key 和 MCP。 - **09-21** **想改自己的密码,只能去找管理员。** 头像菜单加了「修改密码」:验旧密码,改完把别的设备踢下线。密码要求那句话是服务端按组织策略回的,前端不抄第二份——抄了的下场是管理员改完策略,这儿还写着「至少 6 位」。 - **09-21** **渠道我修好了,AI 还在说「用不了」。** 本地熔断闸原来只有三条自愈的路:配置动了、设置页按了保存、熬过 30 分钟冷却。可用户修的是渠道那头(充值、续费、把网弄通),设置页一个字没动,指纹也就没变——三条全落空,只能干等。现在加第四条:**人重新开口就整个放开一次**。光放开还不够——上一轮那句「别再调这个工具了」还原样躺在对话历史里,模型照着它继续拒绝,用户看见的还是「用不了」;所以刚放开的那几条会写进这一轮的提示词,明说那句过期了、该调就正常调,不许一个请求都没发就先下结论。代价是最多多发一次请求。 - **09-21** **链接后面凭空多出「<strong>」几个字,点下去还跳错地方。** 裸网址转链接这一遍排在加粗前面,于是 `**https://…/abc**` 收尾那两个星号被当成网址吞进了 href,加粗那一遍再往 href 中间插一个 ``。把裸网址挪到最后转,这条路就断了——那会儿 `**…**` 早成了 `…`,网址两边干干净净。顺带两处:标签内部整个跳过(`见 https://…` 这种**属性里**的网址以前会被撑破),末尾的右圆括号成对的留、落单的剃(维基、飞书那类 `.../Foo_(bar)` 少剃一个字符就跳去另一个页面)。 - **09-21** **打不开这个应用的人,看见的是一整页中文。** 跟下面删除确认那条同一个根因,只是更往外一层:右键菜单、启动失败页、两个系统报错框,全是主进程里的 JS 字符串,一秒钟都没进过渲染进程的 DOM,网页那套翻译根本够不着。右键菜单 8 条在英文下条条是中文;更要紧的是启动失败页——看见它的恰恰是应用打不开的那个人(issue #1 那批),最需要看懂上面写的怎么修,给他的却是一整页中文。壳里现在单带一本字典(中英各 29 条):语言先问渲染进程存的那份偏好(`owb-lang`,跟网页同一个键),问不到——或者窗口压根就没建出来——才退回系统语言;启动失败页正是后一种时候要画的东西,它的 `` 也跟着走。闸门按**形状**比两本字典(键对齐、英文那本里不许剩汉字、不许两边一模一样),再把右键菜单和六种死法各跑一遍;反过来还扫那四段代码里的字符串,谁再写死一句就报。e2e 新增这一条,5 个变异体全拦下。 - **09-21** **画布上那张「短剧分镜」,在下拉里叫「新笔记」。** 12 种节点里,`canvasDefaultPayload` 漏了 storyboard 那一支,它于是掉进 default 分支,拿到的是笔记的 payload。卡面上看不出来——那句「短剧分镜」是写死的——可「连接到下游节点…」那个下拉里它叫「新笔记」,交给 Agent 的正文也是「记录灵感、任务或需要补充的内容…」;起手模板铺出来的那张就是这样。补上初值,另加一道按**形状**比的闸门:节点类型表和 case 表是两份名单,对不上就报(note 不算,它本身就是 default 分支)。把那一行删掉,e2e 当场红在这条断言上。 - **09-21** **英文界面下,每按一次「删掉」,弹出来的都是中文。** 全站 31 处删除确认走的是原生 `confirm()`,而翻译是照着 DOM 走的——原生框里那句话从头到尾只是个 JS 字符串,一秒钟都没进过 DOM,所以连「扫一遍界面看还剩几个汉字」那道闸门也发现不了。同一个根因还欠着两笔:浏览器那边用户一旦勾上「不再显示对话框」,`confirm()` 从此静默返回 false,每颗删除钮当场变哑巴(跟当初 `prompt()` 那个「点了没反应」是同一种长相);原生模态框离屏点不动,于是这 31 条删除路径一条都没验过。现在全换成自绘的框:词典补 59 条 + 15 组模式句(其中一组按 8 类名词展开),红钮上写的是动词(删掉 / 卸载 / 解散 / 踢掉 / 下架 / 恢复默认),焦点落在「算了」上,要删哪几样一条条列出来——清单封了高度、自带滚动,顶出屏幕的话连「算了」都按不着,那比没有确认框更糟。闸门认的是**选项对象的形状**,不是「写在 askConfirm 的括号里」,就这一下多逮到两处漏网:手填工作区路径那个框,和批量删自动化任务那处转手递进去的选项。这道闸扫的是整个 public/js,企业后台也在里面——它今天用的是自己画的框,但没人拦着它哪天随手写回 confirm()。test/confirm-dialogs.js 25 过 / 0 挂,14 个变异体全拦下。顺带删掉 library-mkdir 里一条被推翻的结论:「confirm 不抛,所以全站确认框不用改」——测量还成立,结论早就不成立了。换完之后,两套老测试自己先露了馅:它们的替身还停在 `window.confirm`,源码里那句 `askConfirm` 于是成了 ReferenceError——而它抛在 async 处理函数里没人接,「点了取消就一条请求都没发」照样绿。补了一条正向对照:同一颗钮点「确定」得真发出去,这条假绿才站不住。 - **09-21** **新建完一个文件夹,找不到地方删。** 删除只在「列表」这一种摆法里活着——图标和画廊两种摆法上写着 `display:none`,搜索那条路压根没画这颗钮。三种摆法现在都有(图标 / 画廊挪到格子右上角),搜出来的那份也删得掉;站在文件夹里面时,「删掉这个文件夹」就摆在「新建文件夹」旁边——建它和删它是同一条操作条,删完退回上一级。本地产物照样不给这颗钮:那是任务在工作目录里写出来的。顺带把非空文件夹那条死路接上——那颗钮原来叫「知道了」(你知道了,然后呢),现在叫「进去清空」,按下去就进到那一层。test/library-mkdir.js 85 过 / 0 挂(原 65),9 个变异体全拦下。 - **09-21** **工作台切成 English,点进企业管理后台还是满屏中文。** 这个后台从头到尾没引过 i18n.js——19 个面板、538 处界面文字一条没翻。词典补 494 条 + 28 条带数字日期的模式句,侧栏底下加了中 / 英切换(跟工作台共用一份偏好,在哪边切另一边也跟着变)。**用户自己起的名字不翻**:组织名、部门名、渠道名、模型名是数据不是界面,翻了等于把人家的渠道给改了名。数字也跟着语言走(1235 万 / 12M),切语言是把当前页整个重画——「万」和千分位是渲染时算出来的,翻 DOM 翻不到。新加一道闸:切成英文把 19 页全走一遍,DOM 里但凡还剩一个汉字就算漏;现在剩 11 条,条条对得上用户起的名字。admin-ui 145 过 / 0 挂(原 134),7 个变异体全拦下。 - **09-21** **手还按在卡上,同步来一趟,卡自己弹回原处。** 跟上一条同一个根因:铺快照是 graph.clear() 整图重来,正在拖的那张当场被拆掉,手里还按着、位置回到了起点。「同步给打字让路」这条现在推广成「手上有活就让路」——打字、拖卡都算,时效从最后一下动作算起(不是从按下去那一刻,有人对位置能磨蹭半分钟),拖出窗外撒了手也不会把同步卡死。test/canvas.js 58 过 / 0 挂(原 52),11 个变异体全拦下。 - **09-21** **正打着字,同步来一趟,刚敲的半句就没了。** 属性面板是整块重画的,重画一次输入框就换了新的一个,光标掉回 body,接着敲的字进了空气,节点里的文字也被对面那份盖了回去。现在同步会给打字让路(手停 10 秒才补上,免得焦点留在框里走开、这个标签页从此再也不同步),面板自己重画时也把光标放回原来那个字上。test/canvas.js 52 过 / 0 挂(原 47),7 个变异体全拦下。顺带修了一条会随机挂的测试:隐藏窗里那个 confirm 的框有时被 Electron 直接收掉,判据从「挂没挂」改成「抛没抛」(prompt 抛、confirm 不抛,同一扇窗里对比)。 - **09-21** **删掉的连线,同步一下、重开一次、按下撤销,都会自己回来。** 两处本来都是护着老画布的:「对面没有连线就沿用我这边的」,和「一个镜头 + 一个起过名的场景就替它补上线」——可「没有连线」也可能是人刚把线删了。现在存盘时标版本 2(连线是照实记的,空就是空),版本 1 的老文件照旧护着、照旧补线,他删一下就升成 2。顺带修了 v0.7.4 发版挂掉的那条画布测试(写死等 2.3 秒,而同步一圈 1.8 秒、撞上正在写盘会整圈跳过),所以 v0.7.4 没出安装包。test/canvas.js 47 过 / 0 挂(原 40),7 个变异体全拦下。 - **09-21** **删掉的画布会借尸还魂,清空的画布自己长东西。** 删画布只删服务器那份,本机副本按画布名留着——再建一张同名的,删掉那些原样长回来,还会被存回服务器。起手那两张卡(一句话概念 + 分镜表)的判据是「现在是空的」,于是用户自己清空的画布每打开一次就长回来两张,换台机器打开也一样。现在删画布、新建画布都把本机那份副本一起清掉;起手卡只给「从来没人动过」的画布——新建出来的 `updatedAt` 留 0,之后任何一次保存(清空也算)都盖上时间戳。test/canvas.js 40 过 / 0 挂(原 30),18 个变异体全拦下;服务端那半边另有 2 个变异体,也全拦下。 - **09-20** **换个项目打开,画布上是上一个项目的东西。** 本机那份副本的键上只有画布名,两个项目的 `main` 共用一格;铺上去之后还会存一次盘,把新项目自己的画布顶掉。切画布同理:存盘攒 240 毫秒再发,发的时候才去读「现在是哪张」,旧内容就落到了新画布名下。现在键上带项目名(老版本存的那份只认领一次)、切之前先把欠的那趟写完、写出去之前再核一次「这份是写给谁的」。test/canvas.js 30 过 / 0 挂,同一份测试放到 v0.7.2 上挂 8 条,11 个变异体全拦下。 - **09-20** **无限画布三处静默丢数据。** 标题叫「开始工作」「开始创作」的节点,加载和同步时一律不铺、连着的线一起扔——可代码里从来没谁造过这两个标题的卡,能撞上的只有用户自己起的名字;删完还顺手存一次盘,本机和服务器那两份一起变瘦(三个节点两条线进去,剩 1 个节点 0 条线)。同步拉回来的快照,铺完又原样发回服务器,而服务端每写一次就把时间戳换成现在,于是两个标签页每 1.8 秒互相顶一轮、各拷一份 .bak,谁都没动过画布。再有一趟同步把多选砍成一个:框选 3 个之后只剩 1 个还选着,下一下 Delete 删掉的就不是你以为的那一片。画布这 2462 行原来一条测试都没有,新写 test/canvas.js:修之前 6 过 / 9 挂,修完 16 过 / 0 挂,6 个变异体全拦下。 - **09-20** **英文界面上,资料库整页是中文——v0.7.0 的安装包也因此一个都没出。** 发版卡在测试那一步:CI 那台机器的系统语言是英文,界面照英文渲染,而断言是照中文文案写的。顺着查下去才是真问题——这一页整页没进词典,英文用户看到 22 段中文正文 + 15 处中文属性,连「新建文件夹到底有什么用」那段说明也是中文。词典补 59 条 + 11 条带数字和文件名的模式句;空状态改成一句话占一个文本节点(`` 把句子劈成两半,英文那边词序接不上)。全站那道覆盖率闸门按百分比算,一页全漏也摊得平,所以另加一道:把页面渲染出来切成英文,数屏幕上还剩几个汉字,用户自己的文件名先抠掉再数;开真页面的测试不钉语言直接不给过。资料库 65 过 / 0 挂(原 57),拆掉钉子在英文机器上当场挂 8 条。 - **09-20** **资料库现在说得清「新建文件夹」是干嘛的,也能删了。** 这一页原来把「你传进来的参考资料」和「任务写出来的产物」混在一起摆,而新建 / 上传两颗钮浮在两段的最上面,人自然以为它们管下面全部。现在两段分开,钮挪进「参考资料」那一段;空状态也直说:项目设置里只挂其中一个文件夹,这个项目的 AI 就只看得见那一块,不会翻到隔壁客户的材料——建文件夹是给 AI 划视野,不是给人归档看着整齐。文件夹和资料各挂一个垃圾桶(产物那段故意没有),确认框焦点落在「算了」上;文件夹里还有东西就不给「删掉」这颗钮,直接说清还剩几样、一条请求都不发。顺带把 Electron 那三个原生框实测了一遍:`prompt()` 一调用就抛(v0.6.12 那个「点了没反应」就死在这儿),`confirm()` / `alert()` 挂在原生模态框上等人点——对用户好使,但离屏测试点不动,所以新写的删除走自绘的框。测试里那条拿 `typeof` 证明 confirm 能用的断言也换成真调一次。57 过 / 0 挂(原 36)。 - **09-20** **企业后台还剩三处回包是按人头长的:678 / 491 / 631 KB → 11 / 12 / 9 KB。** 用量明细每趟捎带一张「按人分组」的汇总(3000 人时 205 KB 的回包有 195 KB 是它,而这一页画的是流水);中转 Key 页捎带「每人单独的 API 上限」那张表(631 KB 里 620 KB 是同一行重复三千遍);数据统计只要「几个人」这一个整数,却把全员的角色、额度、余额都算了一遍,还翻了一趟用量账本。成员用量和每人上限各拆出一条接口,一页 50 个,筛排翻页全在服务端;分组表截到前 20 / 50 并带上真实组数,不然「二十」会被当成「全部」。这两张表**故意不按花名册排**——它们回答的是「钱花在谁身上了」「谁的闸子要动」,按名册排的话相关的人散在六十页中间。「本月花了多少」三处口径钉死:充值不算花销。多租户 485 过 / 0 挂(原 435)、后台界面 134 项、中转站 218 过,15 个变异体全被拦下——第一轮有 4 个活口,也就是那四条断言在骗人(账本里没造过充值、归属校验只判状态码、额度见底只在不筛时比过、十个人正好一页装得下边界没跨过),补完才满。 - **09-20** **企业后台的成员页,是把整份花名册甩给浏览器、让它自己筛。** 一屏看得见十几行,而回包里装的是这家公司的每一个人:角色、部门、状态、余额、最后活跃,一个不少。实测 3000 人的组织,点进成员页那一趟是 **1041 KB**,浏览器里画出 **3002 行、78098 个 DOM 节点**,从点进来到表格出来 **878ms**;而这还只是成员页。同一份整份花名册另外还被捎带在两个地方:管理员角色页每次 **1042 KB**(为了画一张十来行的管理层名单),用量明细页每趟都带一份,于是 `?limit=` 根本缩不小回包——`limit=20` 是 **682 KB**,`limit=1` 还是 **678 KB**。现在筛、排、翻页全挪到服务端,一页 50 个人:3000 人时回包 **1041 → 17 KB**、DOM 节点 **78098 → 1403**、渲染 **878 → 38ms**、后端 18.8 → **12.2ms**;1000 人 346 → 17 KB、259 → 28ms;300 人 104 → 17 KB、90 → 22ms。搜一个字(含一整趟请求)3000 人时 **57ms** 出 52 行。角色页 1042 → **48 KB**(只回管理层名单,加一份**只有名字那五格**的候选人下拉,超过 500 个就截断、并且明说截断了——不然界面上「下拉里找不到那个人」会被当成他不存在);用量明细页的花名册改成按需捎带,682 → **200 KB**。这里头有两条顺序是看不见、但一破就悄悄退回从前的:**排序必须在切页之前**(不然「第一页」取决于人在账本里的物理顺序,今天谁排在前面取决于谁昨天改过资料),**算钱必须在切页之后**(每个人都要算角色额度余额、还要翻用量账本查最后活跃,六百个人算完只显示五十个,前面那些全是白算的);档位下限同理,得在**原始账号**上就把人筛掉,而不是算完再扔。地址栏里手改的 `?limit=99999` 只给 500,`limit=0` / `limit=-5` 当没传回默认一页(原来会被夹成 1,界面上变成「一页一个人、六百页」),翻过头退回最后一页而不是给一张空表(空表跟「这家公司没有人」长得一模一样)。**顺带修了一个只有真去敲键盘才量得出来的坏法**:这三页的搜索框,打完一个字、数据回来之后光标就没了——`route()` 每次都整页重画,搜索框那个 DOM 节点被扔掉,焦点落回 ``,接着打的第二个字直接进了空气。实测重渲染后 `document.activeElement` = BODY、下一个字进 BODY;修完是「光标还在框里、字停在原处、下一个字进搜索框」,成员 / 用量明细 / 操作审计三页都验过。另外量过一次骨架屏闪动(用量明细 1 帧 / 19ms、审计 0 帧),没量出收益,就没动。多租户套件 **435 条断言过 / 0 挂**(原来 367 条),企业后台界面测试 **107 项通过**(原来 88 项),**19 个突变体全被拦下**——包括「排序挪到切页之后」「最后活跃还按整份查」「limit 不夹上限」「翻过头给空表」「首页又捎带整份」「重渲染之后不把光标放回去」。**还没做完的**:「按人」那张用量表还是一人一行(3000 人的组织那一趟仍是 678 KB),用量明细页那个「看谁的」下拉也还是 3000 个 `