| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: dsh 会话钩子接入与全站下拉 layui 渲染统一 - dsh 进程内 Cordis 插件挂载 ~/.dsh/profiles,事件回调手机推送/远程作答 - phone hook 三端点扩展 dsh,事件路由与注册表接入,补测试与验证脚本 - 4 处原生 select 转 form.render,展开面板与配置方案同源,删 app-select 方案 - dev_server 写 desktop.json 供进程内插件发现回调地址 | 22 天前 | |
refactor(api)!: API 切换只代管 Claude Code 与 Codex,三端移交应用内自配 BREAKING CHANGE: dsh / ZCode / pi 的 API 配置不再由 a4agent 写入, 改由用户在应用内自行配置(这三端应用自带完整供应商配置界面)。 判定标准统一为「目标应用是否自带完整的供应商配置界面」—— 自带的就不代管。外部写配置文件既不省事(用户点几下更快), 又有额外风险:界面上的能力开关、上下文窗口、启用状态外部写入时 无从得知,只能填保守默认值。 注意判定依据不是「我们读不懂」:Qoder 的模型目录虽经 WASM 按机器码 加密、外部无法写明文,但用户自己在界面里配得好好的。技术障碍不等于 产品理由。原代码注释把 Qoder 排除的理由写成「配置加密无法托管」, 已改为正确表述并写入测试,避免重犯判断错误。 移除托管时的三条红线(backend/app/removal.py): - 只删自己写的东西:识别依据是 a4a_p* 前缀(含 a4api_p*) 与 dsh 的 llm-deepseek 段,绝不按用户自定义键名猜测 - 每次动作前强制永久快照(removal_backup.py,永不滚动清理); 快照失败即中止,不留半完成状态 - 判定依据不足时不动:dsh 的 llm-deepseek 段仅在确认 baseURL 指向 本工具代理端口(17890–17899)时才删;用户的 llm-pi-ai 任何情况下 都不碰 dsh 配置有两个候选落点 settings.yaml 与 settings.yaml.imported (后者来源未能确证),快照与清理均覆盖。 无头任务下发因此解耦并扩展到六端(原先仅 pi/dsh,且依赖托管配置才能跑, 移除托管会导致该功能报废):改为接管用户自配的配置 + 真实连通验证—— 预检第三步 smoke_run() 用最小提示词真实跑一次无头调用,密钥有效没、 模型拼写、网络通不通一次全暴露。Qoder 走登录态/PAT 且配置加密读不到, 如实说明「无法校验,请以实测结果为准」而非假装通过。 修复 5 个真实缺陷: - qoder_home() 丢失环境变量覆盖,A4AGENT_QODER_HOME 静默失效 - config_io 的 SpooledTemporaryFile 滚动到磁盘后 getvalue() 抛异常 - 清理函数默认键名 provider,但 pi 用 providers(复数)致残留清不掉 - smoke_run 只喂 stdout,引擎错误在 stderr 时用户只看到「退出码 1」 - _parse_pi 分支顺序致失败摘要永不执行;_failure_summary 认不出 裸的 401 unauthorized(新增 _looks_like_error_line 只认强信号, 避免「0 errors」误判) 抽出 config_io.py 公共 IO 层:6 个逐行重复的备份函数与 4 个重复的 原子写入函数合为一套,config_manager.py 998 → 806 行。 更新弹窗新增破坏性变更横幅:版本按三元组数组比较,不能用 parseFloat('0.5.0')(三段式不是合法数字会得 NaN 使横幅永不显示), 也不能只取前两段('0.5.0' 与 '0.5.1' 会被压成 0.5 丢掉修订号)。 测试 257 项通过,新增 test_removal.py 17 项(含「用户自有配置不被动」 的反向用例)。 | 24 天前 | |
refactor(api)!: API 切换只代管 Claude Code 与 Codex,三端移交应用内自配 BREAKING CHANGE: dsh / ZCode / pi 的 API 配置不再由 a4agent 写入, 改由用户在应用内自行配置(这三端应用自带完整供应商配置界面)。 判定标准统一为「目标应用是否自带完整的供应商配置界面」—— 自带的就不代管。外部写配置文件既不省事(用户点几下更快), 又有额外风险:界面上的能力开关、上下文窗口、启用状态外部写入时 无从得知,只能填保守默认值。 注意判定依据不是「我们读不懂」:Qoder 的模型目录虽经 WASM 按机器码 加密、外部无法写明文,但用户自己在界面里配得好好的。技术障碍不等于 产品理由。原代码注释把 Qoder 排除的理由写成「配置加密无法托管」, 已改为正确表述并写入测试,避免重犯判断错误。 移除托管时的三条红线(backend/app/removal.py): - 只删自己写的东西:识别依据是 a4a_p* 前缀(含 a4api_p*) 与 dsh 的 llm-deepseek 段,绝不按用户自定义键名猜测 - 每次动作前强制永久快照(removal_backup.py,永不滚动清理); 快照失败即中止,不留半完成状态 - 判定依据不足时不动:dsh 的 llm-deepseek 段仅在确认 baseURL 指向 本工具代理端口(17890–17899)时才删;用户的 llm-pi-ai 任何情况下 都不碰 dsh 配置有两个候选落点 settings.yaml 与 settings.yaml.imported (后者来源未能确证),快照与清理均覆盖。 无头任务下发因此解耦并扩展到六端(原先仅 pi/dsh,且依赖托管配置才能跑, 移除托管会导致该功能报废):改为接管用户自配的配置 + 真实连通验证—— 预检第三步 smoke_run() 用最小提示词真实跑一次无头调用,密钥有效没、 模型拼写、网络通不通一次全暴露。Qoder 走登录态/PAT 且配置加密读不到, 如实说明「无法校验,请以实测结果为准」而非假装通过。 修复 5 个真实缺陷: - qoder_home() 丢失环境变量覆盖,A4AGENT_QODER_HOME 静默失效 - config_io 的 SpooledTemporaryFile 滚动到磁盘后 getvalue() 抛异常 - 清理函数默认键名 provider,但 pi 用 providers(复数)致残留清不掉 - smoke_run 只喂 stdout,引擎错误在 stderr 时用户只看到「退出码 1」 - _parse_pi 分支顺序致失败摘要永不执行;_failure_summary 认不出 裸的 401 unauthorized(新增 _looks_like_error_line 只认强信号, 避免「0 errors」误判) 抽出 config_io.py 公共 IO 层:6 个逐行重复的备份函数与 4 个重复的 原子写入函数合为一套,config_manager.py 998 → 806 行。 更新弹窗新增破坏性变更横幅:版本按三元组数组比较,不能用 parseFloat('0.5.0')(三段式不是合法数字会得 NaN 使横幅永不显示), 也不能只取前两段('0.5.0' 与 '0.5.1' 会被压成 0.5 丢掉修订号)。 测试 257 项通过,新增 test_removal.py 17 项(含「用户自有配置不被动」 的反向用例)。 | 24 天前 | |
feat(notify): 全端通知统一样式与 toast 来源区修复 - 两条链(hook/任务)统一三行制:标题=话题名称、正文=通知类型+应用名称,共用 format_notice - 通知去除全部 emoji 图标(含通知测试按钮文案) - 手机推送附「AI 最后输出」(下发任务与 OpenCode 会话,截 1000 字),桌面横幅保持短版 - OpenCode 会话终局桌面横幅不再受窗口可见门控(此前窗口开着彻底无声) - 六端提问/权限申请横幅按统一样式接入(dispatch 层入队) - toast 来源区换 AUMID eogee.a4agent.v2 修复身份缓存污染(原显示原始串且无图标), 来源图标改 64px logo_small.png,移除正文 appLogoOverride 大圆标 | 21 天前 |