Repository navigation
Releases: taikaikaikai-pixel/dsh-tap
Releases · taikaikaikai-pixel/dsh-tap
Release list
dsh-tap v0.20.0
- Trae 通道「额度/模型/工具环」在 DSH 闭环——agent 传输档(
traeChatTransport:'agent',goal docs/goals/trae-agent-v3.md 的 M1→M3 一轮落地):inline 面 3003 第 6 周未愈、remote 面架构性拒绝工具的处境下,探针证实同端点llm_utils_chat的function=solo_work_lite面是第三条活路。证据docs/probes/trae-agent-v3-*.jsonl(8 臂 + function 名扫描 ×2):- M1 探针(
scripts/probe-trae-agent-v3.mjs):决策门 PASS——A1 纯聊天 200 流式;A2 tools+auto 出结构化 tool_calls;A3 两轮工具闭环(assistant tool_calls + role:tool 回传 → 最终回答);A4 并行调用单事件双 tool_calls;A5 reasoning_effort 被忽略不报错(如实记录);E1 错模型名/E2 坏参数静默容忍;A6 kimi-k2.6/DeepSeek-V4-Flash 的 provider_model_name 恒 glm-5.2(模型位钉死证实)。function 名扫描:agent_chat/agent_v3/solo_agent_chat 等均未注册(2001);chat 已注册但模型不被路由(4023)。新坑 #68(同端点不同 function 面各有出站方言:历史 assistant.tool_calls 在 solo_work_lite 面必须function_call键,OpenAIfunction键被 proto 层拒 2001「required field Name is not set」)。 - M2 实装(全落 providers/trae/ + index.js,core/ 零 diff):
buildChatRequest增{fnKey}选项(nativeToolCalls/toNativeMessages按面换键);handleChat增 agent 分支(function=solo_work_lite、无 3003→chat_v3 回退——agent 面本身就是出路;改派诚实披露/计量记真实模型沿用既有机制);errors.js码表补 2001(function 未注册/proto 形态错,提示带 function_call 键指引)/4001/4011/4023(chat 模型未知)/9074,3003 提示补 agent 出路;index.jstraeChatTransport枚举加'agent';设置卡「聊天传输」加第三档(标注:支持工具+并行,模型恒 glm-5.2,耗 IDE 额度)。reasoning_effort 照发不虚标(上游忽略);档位注入维持仅在 remote 面。 - M3 验证:verify-trae-provider 131→141 断言(新增 agent 节 8 断言:出站 function/function_call 键/tool 回传块化/tools 透传/effort 照发/3003 不回退/码表扩充);离线十一套件全绿;core/ 零 diff;真实端到端双层:①临时网关实例(生产代码 + 真实凭据)两轮工具环 PASS;②真实 DSH 桌面宿主内(重启加载新码 → 热切 transport=agent → 选择器点选 TraeWork CN/GLM-5.3):「bash echo + read STATE.md」真实会话端到端成功(轨迹视图双工具执行记录、最终回答正确引用两结果),IDE 额度池实测扣减 430.394→482.54(证据 docs/probes/trae-agent-e2e-host-2026-10-05.json);
probe-effort-gaps三通道 11/11 无缺口;card-accordion 204/0 + 跑前后codebuddy-plugin.jsonmd5 一致。 -
- 默认传输档 inline→agent(2026-10-05 用户拍板):主聊天恒带 agent 工具表,inline 故障期对主聊天必炸 3003——新装/重置用户开箱即工具环可用;存量用户的手动选择不受影响(逐请求热读取)。设置卡选项顺序同步(agent 置顶并标注「默认」;inline 标注「2026-08 起服务端 3003 故障中」)。
边界如实标注(不虚标能力):agent 面模型路由钉死 glm-5.2(「模型可用」= 目录模型名可发、实际由 glm-5.2 服务);reasoning_effort 无效;inline 面 3003 未愈(agent 是绕路非修复)。docs/diagnosis-trae-3003.md §13 销案(「插件侧无解」结论终结)。默认传输档已切 agent(用户拍板)。
- 默认传输档 inline→agent(2026-10-05 用户拍板):主聊天恒带 agent 工具表,inline 故障期对主聊天必炸 3003——新装/重置用户开箱即工具环可用;存量用户的手动选择不受影响(逐请求热读取)。设置卡选项顺序同步(agent 置顶并标注「默认」;inline 标注「2026-08 起服务端 3003 故障中」)。
- 生效方式:
traeChatTransport逐请求热读取免重启;设置卡(浏览器半)刷新页面即见新档;errors.js 新文案重启生效。
- M1 探针(
完整变更记录见 CHANGELOG.md。
dsh-tap v0.19.1
- TraeWork CN 通道修复与档位出档(goal docs/goals/trae-work-cn-repair.md,G1→G4 + 复诊一轮落地):桌面端「同步目录」从恒失败到 26 模型可用、思考档位从不出档到宿主「推理等级」出 Default/Low/High/Xhigh;新坑 #66/#67;证据
docs/probes/trae-thinking-scene-*.json+trae-transport-outage-*.json:- G1 vscdb 发现按平台分支(
fix(trae)c6e1954):discoverStateDbs()此前写死 WSL 形态/mnt/c/Users,Windows 桌面端(原生进程)恒扫空 → 同步恒报「未发现 state.vscdb」。修法 = 无参调用按process.platform分路(win32 直查os.homedir()/AppData/Roaming/{TRAE SOLO CN,TraeWork CN}/…,WSL 保持逐用户扫描),{platform, home}可注入供离线夹具。验收::3090 实例trae-model-sync{ok:true,count:26};verify-trae-model-catalog 真实库段实测跑通(3 候选 29 模型)。 - G2 同步失败原因浮到 UI(
feat(trae)76381cb):失败原因此前只在 POST 响应体、GET 视图恒sync:null⇒ 模型区永远泛化「未同步」。落地 = provider 记lastSyncError+ 新syncView()(kept 场景带旧计数附 error),设置卡 syncbar 显示「同步失败:<真实原因>」/「已同步…|最近同步失败:…」;顺手修syncModels不看res.d.ok的吞错。验收:改名 vscdb → UI 显示「…未发现 TRAE SOLO CN 的 state.vscdb…」,恢复 → 「已同步 26 个模型」(trae-sync-error-check 两模式实测)。 - G3 思考档位出档(
feat(trae)e1c1d24,探针门控通过):官方 bundle 取证 remote 通道custom_model.reasoning_effort是官方线缆字段;探针probe-trae-thinking-scene.mjs证实 remote 面 8/8 臂接受 + 真模型路由,inline_chat 面三变体全被忽略恒 3003(终局销案)。落地 = 目录归一reasoningEffortConfig→catalogToProfiles投影reasoningEfforts(键=宿主枚举映射 light→low/high→high/extra_high→xhigh,值=声明拼写——原拼写做键被宿主 schema 整块静默拒收,坑 #66)→ 镜像compat.supportsReasoningEffort(坑 #64)→ 设置卡逐模型 select(traeModelSetPrefs,允许集=声明∪存量)→ 网关 remote 出站注入(客户端带值优先、prefs 补默认)。验收:镜像 26 模型 11 带档位表;宿主「推理等级」出 Default/Low/High/Xhigh;效果方向性 2 采样 INCONCLUSIVE(#42 如实记录)。 - G4 对账加固(
feat(probes)73ad7f1):probe-effort-gaps补--token(此前打不了带 token 闸的实例)+ Trae 从 SKIP 文案升级为真实三层对账(11/11 ok)。 - Ark 档位臂定论(
feat(probe)7f370d9):probe-ark-thinking.mjs --levels-as-arms(budget=pi-ai 映射、max_tokens=32768 宿主线值),3 模型 ×5 臂 ×3 采样:3/3 非单调,high/max 同线值对照噪声达 2.5 倍 ⇒ 档位=budget 上限非强度旋钮口径成立。 - Qoder 档位多采样复证(
feat(probe)02a425d):probe-qoder-thinking-efforts.mjs显式带reasoning_effort避 prefs 注入,2 模型 ×3 臂 ×3 采样同向非单调(高档位均值反而更低)——与 Ark 互证:档位入口不报错 ≠ 有单调语义。 - 3003 复诊(
fix(trae)87dece0):用户复报「还是不能用」→ 三传输出路实测(probe-trae-transport-outage.mjs):inline 全臂 3003(第 6 周未愈)、remote 面健康(真模型路由)、chat_v3 本次也 3003(ModelLoading)。结构性结论:带 dsh 工具环的 agent 对话在 Trae 通道当前不可用(inline 服务端故障 × remote 架构边界 × chat_v3 时坏),插件侧无解;纯文本会话切 remote 即恢复(用户已切换并实测)。3003 提示文案补 remote 工具环边界(防「切了还是不能用」二次困惑)。 - 回归:离线 11 套件全绿(verify-trae-model-catalog 55、verify-trae-provider 109、qoder 171、host-config 36、desktop-acceptance 13ok/4SKIP、models 23/23、bridge/rotation/core-generic/providers PASS、agents-md 踩坑 1..67 连续预算绿);浏览器 card-accordion 204/0 + 跑前后
codebuddy-plugin.jsonmd5 一致。 - 生效方式:G3 镜像/compat 属启动期加载 ⇒ 重启 dsh / 退出并重启桌面应用;设置卡(浏览器半)刷新页面;3003 新文案随 errors.js 重启生效;
traeChatTransport切换逐请求热读取免重启。
- G1 vscdb 发现按平台分支(
完整变更记录见 CHANGELOG.md。
dsh-tap v0.19.0
- 设置卡思考档位改由目录逐模型声明驱动 + 新模型免人工(B/C 步一轮)(承接 0.18.0 的 A 步发版;Qoder 卡档位真源化、key 型服务商声明透传不丢、Trae/Ark 探针取证、缺口检测脚本;新坑见 pitfalls #64 同族增补):
- B — Qoder 卡档位真源化(
feat(qoder)26f3098):设置卡 Qoder 行档位 select 不再用固定表off/low/medium/high/max,改由目录逐模型声明(thinking_config.enabled.efforts)驱动,与宿主「推理等级」同一真源。写入校验按模型收口(未声明档位写入报 400 且列出该模型自己的档位表);存量兼容——readQoderModelPrefs不静默丢值,存量max(qfmodel/qmodel_38max,目录只声明 xhigh/low/medium)以「思考:max(目录未声明)」形态在 UI 可见可选,不自动迁移。GET 视图qoder.models增efforts字段供卡直读。verify-qoder-provider161→171 断言(新增 efforts 形状/逐模型拒绝/存量兼容 10 断言)。 - C2 — key 型服务商档位声明透传且刷新不丢:
providers/openai-compat.jsproviderBlock支持preset.modelEfforts(按模型 id 合并reasoningEfforts)与preset.reasoningCompat===true时写compat:{thinkingFormat:'openai',supportsReasoningEffort:true}。修一实锤:index.js此前把声明只传给不写块的testExtraProvider,真正重建块的refreshExtraProviderModels漏传 ⇒ 每次刷新把档位声明洗掉(注释谎称已修)。新增接缝rebuildAdapterForEntry(openai-compat.js)让 test/refresh/add 三路结构性恒一致,refresh 不再丢声明。verify-providers17→24 断言(7c-7e providerBlock 纯函数 + 新增第 10 节 10a-10d 覆盖 refresh 重建后声明仍在,10c 经变异测试验证能抓到旧 bug)。文档docs/rules/extra-providers.md增 E-P8 透传契约(逐条实测依据 #42、拼写不映射)。 - C1 — Trae 方言探针:负结论只落文档不落投影:
scripts/probe-trae-efforts.mjs(probe 类不入 CI)经 Trae 通道同题多臂(baseline /reasoning_effort=light/high/extra_high,多采样)——全臂 3003,内层 400 恒为Invalid combination of reasoning_effort and thinking type: high + disabled;连不带 effort 的 baseline 臂(inline_chatscene 置 thinking disabled)也 3003,证明与请求字段无关。按 R4 负结论:docs/rules/gateway-facts.mdTrae 节记「reasoning_effort 方言仍不可用 ⇒ 不开 compat、不出档」(含逐模型档位词汇表),Trae 路由维持不出档;后续课题 = 找能把 thinking 置 enabled 的 scene/参数组合。证据docs/probes/trae-efforts-*.json+trae-chat-live-*.json。 - C3 — Ark 一条命令 + 省额度默认:
scripts/probe-ark-thinking.mjs固化 Ark/api/plan/v1/messages三臂判据(--emit/--write/--from)。实测 7 模型:全接受thinking:{type:enabled,budget_tokens};disabled被glm-5.3/glm-5.3-flash400 拒 ⇒ 这两个不声明 off 档(声明 = 摆必然 400 的档),其余 5 个声明off:null+low/medium/high/max。证据docs/probes/ark-thinking-*.json。省额度默认(额度事故后加固):默认每模型只跑 baseline+enabled 两臂(off 未测不臆造、--write保留 patch 既有 off 档),--full-matrix才跑旧三臂全矩阵——7 模型从 21 次降到 14 次上游调用;顺带修--repeat覆盖 bug(改多样本聚合 min/mean/max)与 yamlget()把off:null归并成 undefined 致写出丢档的真雷(改从 Pair 原始节点读)。 - C4 — 缺口检测让漏项可见:
scripts/probe-effort-gaps.mjs(probe 类不入 CI)对 CodeBuddy(/v3/config)/Qoder(目录)/Trae(state.vscdb)三托管路由比对「上游声明了档位」vs「路由条目有 reasoningEfforts 且路由有 compat」,逐模型打 ok/GAP 表 + 缺口汇总;缺口 = exit 1、找不到宿主配置层 = exit 2,免凭据。加入docs/rules/STATE.md发版清单(规则 4:发版前跑一次,#64 的回归眼)。 - 回归:
verify-models --list(23/23)/verify-bridge/verify-rotation/verify-core-generic/verify-providers(24)/verify-trae-provider(90)/verify-qoder-provider(171)/verify-host-config(36)/verify-agents-md(51,踩坑编号连续、预算绿)/verify-desktop-acceptance --structural(7 ok / 0 FAIL / 5 SKIP)全部 exit 0。 - 生效方式:B/C1 的镜像属组合根启动期加载 ⇒ 重启 dsh / 退出并重启桌面应用;卡侧刷新页面即可。Trae 维持不出档(缺口 C4 可见)。
- B — Qoder 卡档位真源化(
完整变更记录见 CHANGELOG.md。
dsh-tap v0.18.0
- 宿主「推理等级」入口补齐:Qoder 目录的逐模型思考能力声明投影进镜像(并补路由 compat),用户 profile 的 Ark(volces) 5 个模型补档位表(用户报「我想在输入框设置模型的思考强度……有些模型没有这一项」;新坑 #64;证据
docs/probes/qoder-thinking-config-*.json):- 判据(源码级):宿主 composer 模型菜单的「推理等级」只由模型条目的
reasoningEfforts决定——pi-airesolveModelReasoning→reasoning:true+thinkingLevelMap→reasoningInfo→reasoning.efforts[],getSupportedThinkingLevels再按 map 过滤(off键缺省 = map.off 为 null = 不出 Off 档)。两种方言的 off 语义不同:anthropic = 发thinking:{type:disabled}(anthropic-messages.js:902)、openai-completions = 省略参数(openai-completions.js:716)。live 实例实测基线:volces 2/7、Qoder 0/14、codebuddy 16/25 出档。 - Qoder(仓库):目录条目本就带
thinking_config:{disabled:{…},enabled:{efforts:{"<档>":{is_default}}}}(2026-10-04 实测 14 模型、9 个带命名档位),而projectQoderModel此前只投影 id/name/contextWindow/maxTokens/input——声明在投影层被丢掉。新增qoderReasoningEfforts()(providers/qoder/catalog.js):disabled在场 →off:null(省略参数,同 prefs 的 off 语义);enabled.efforts的键 → 线值照抄档位名;无命名档位/无 thinking_config → 不出表(llm-pi-ai 拒绝"只有 off"的表,也不臆造档位)。镜像块同时补compat:{thinkingFormat:'openai',supportsReasoningEffort:true}——缺 compat,pi-ai 出站不会把选中档位写成reasoning_effort(选择器出档但请求里没这个键)。投影后 9/14 出档:qmodel_38max/qfmodel= off/low/medium/xhigh;dmodel/gm51model= off/high/max;gmodel/kmodel/kmodel_latest= low/high/max;gfmodel= high/max;dfmodel= off/low/high/max;auto/qmodel/qmodel_latest/q37fmodel/mmodel目录无命名档位 → 不出。 - Ark(volces)(用户 profile
~/.dsh/profiles/desktop/cordis.patch.yml,备份.pre-effort-20261004.bak):glm-5.3-flash/glm-5.3/kimi-k3/doubao-seed-evolving/doubao-seed-2.1-lite补reasoningEfforts。档位面按 Ark/api/plan/v1/messages实测裁:7 个模型思考默认开、thinking:{type:enabled,budget_tokens}全部接受;thinking:{type:disabled}被glm-5.3/glm-5.3-flash400InvalidParameter("thinking.typedisabledis not supported by this model")⇒ 这两个不声明 off 档(声明 = 摆一个必然 400 的档位)。补齐后 volces 7/7 出档。 - 诚实边界(未定论,记录在案):①Ark 是 anthropic 方言,档位映射 pi-ai 预算表(low 2048 / medium 8192 / high 16384 / max 夹到 high),2 采样下自适应思考的模型多数看不到单调差异(glm-5.3:2048→1713 / 16384→2219 有;glm-5.3-flash、kimi-k3、doubao-seed-2.1-lite 无)⇒ 档位更像"上限"而非"强度旋钮";②Qoder 线上效果 6 臂单采样呈自适应非单调(
thinking_config=disabled臂仍出 619 字推理、reasoning_effort=low比max更长)⇒ 按踩坑 #42 纪律不臆造thinking_config翻译,维持网关既有reasoning_effort透传(与设置卡 prefs 同源,客户端带值不覆盖)。 - 回归:
verify-qoder-provider161 通过 / 0 失败(新增 9 断言:thinking_config 投影 6 + 镜像形状/compat 3);verify-models --list/verify-bridge/verify-rotation/verify-core-generic/verify-providers/verify-trae-provider/verify-host-config(36/0)/verify-agents-md(踩坑编号 1..64 连续、预算绿)/verify-desktop-acceptance --structural(7 ok / 0 FAIL / 5 SKIP)全部 exit 0。新增取证脚本scripts/probe-qoder-thinking-config.mjs(只读一次签名 GET,落docs/probes/qoder-thinking-config-<ts>.json)。 - 生效方式:Qoder 镜像(组合根)与 volces patch(profile 静态层)都属启动期加载 ⇒ 重启 dsh / 退出并重启桌面应用;宿主目录效应用 pi-ai 真
getSupportedThinkingLevels复算 = 32/46 模型出档。
- 判据(源码级):宿主 composer 模型菜单的「推理等级」只由模型条目的
完整变更记录见 CHANGELOG.md。
dsh-tap v0.17.0
- 风险清单全量核实与修复(8 项高/中危 + 9 项低危逐条实锤后修复;新坑 #57–#63;离线九套件全绿):
- 高危 1 — Qoder COSY
decrypt()ABI 调用错误(cosy.js):wasm 类型段实报decrypt_server_response为 retptr-first 三参((i32,i32,i32)→(),与同文件generate_runtime_auth_fields同型),旧胶水只传 2 参——wasm 把结果槽写进输入串线性内存、ret 恒undefined,catch{}吞掉 ⇒rt.decrypt(任意输入)恒原样返回,catalog.js 的「Encode=1 密文兜底」实为死路(上游回密文即JSON.parseSyntaxError,目录同步静默失败)。修复 = 栈槽协议:sp=__wbindgen_add_to_stack_pointer(-16); decrypt_server_response(sp,ptr,len),读槽[rptr,rlen,eptr,elen],errLen 非零抛takeObject(eptr),成功getString后__wbindgen_export4还内存。实测修复后 plaintext 正确 round-trip、3 参栈槽调用能取到 wasm 真实输出槽。 - 高危 2 — Qoder WASM 对象从不释放(cosy.js):导出表确有
__wbg_requestresult_free/__wbg_qodercontext_free但胶水全文未调——每次prepareChat/Get/Signed泄漏一个 RequestResult(≈3KB/次,8 万次签名 +245MB),凭据轮换还泄漏旧 QoderContext,global.gc()不回收(字节在 wasm 线性内存,V8 GC 管不着)。修复 = 双 free 纪律:RequestResult/QoderContext 加幂等free()(if(ptr) __wbg_*_free(ptr); ptr=0),三个签名出口统一经drain()消费即释,ensureContext轮换时先建后 free 旧上下文(失败保留旧上下文)。 - 中危 3 — Qoder 网关双重 release(qoder/gateway.js):流内错误帧路径先显式
release()再return,finally 又 release 一次——并发上限被击穿(limit=4 实际变 6)。修复 = 删分支内显式 release,统一由 finally 兜。 - 中危 4 — Trae 3003 回退内容重发(trae/gateway.js):遇 3003 换 chat_v3 在同一 HTTP 响应上从头再发,旧代码只挡 writeHead 重不挡内容重——首 attempt 的角色/排队/文本帧全部重复下发。修复 = 跨 attempt 维护「可见内容离手」信号
streamStarted,首个可见帧离手后置真,此后 3003 按终局错误下发不再回退;角色 chunk 延迟到首个可见帧随头发出(不能 attempt 开头预发,否则回退永远走不到);响应头在进入 SSE 循环前先 writeHead(不算可见内容),避免 reroute 注释行抢在 writeHead 前落地炸「Cannot write headers after they are sent」。 - 中危 5 — Trae 单事件多 tool_calls 只下发最后一个(trae/gateway.js):
out.toolCall在循环内被反复覆盖,parallel_tool_calls在出站白名单里但并行调用静默丢帧。修复 = 改数组out.toolCalls逐个产出,消费端逐帧下发;verify-trae-provider 补「单事件多 tool_calls 全量下发」断言。 - 中危 6 — Trae remote 传输无首字节护栏(remote.js):
openRemoteEvents的 fetch 无 signal(createSession 有 20s、stop 有 10s,唯独它没有),边缘「收下不回应」时请求永久挂起、并发槽不释放。修复 = 首字节护栏只约束「连上却不出响应头」窗口(AbortController + 手动计时,非AbortSignal.timeout——后者会约束整条 SSE 长流把正常长会话误杀),响应头到达即解绑。 - 中危 7 — 三本地网关无 Origin 校验(qoder/gateway.js + trae/gateway.js + core/bridge.js):只验 Host 头回环——恶意网页
navigator.sendBeacon(text/plain 免 CORS 预检、浏览器自动带正确 Host)即可驱动网关烧用户 Trae/Qoder/CodeBuddy 额度,响应读不到但副作用已发生。修复 = 补 Origin 门(index.jslocalGuardFailure同口径):浏览器跨站请求恒带 Origin,其 host:port 必须与 Host 完全一致才放行;无 Origin 放行(本机 fetch/curl 与剥 Origin 的壳转发均不带该头,Host 门仍把守回环,与 #56 同语义)。bridge.js 导出originMatchesHost供三处复用。 - 中危 8 — 登出/刷新竞态复活已登出令牌(trae/qoder/codebuddy 三 oauth 模块):刷新落盘是
writeAuth({...readAuth(), auth: next})读-改-写,与 logout 的整体覆写竞态——刷新在飞时点登出,刷新完成把令牌写回。修复 = 存储代际守卫:模块级storeGeneration,logout 递增,refresh 启动记代际、落盘前比对,过期即丢弃结果(内存模型实测:守卫后 refresh 返 undefined、logout 后 store 保持空)。 - 低危一批:rotation.js 首字节超时被当「调用方取消」不冷却不故障转移——改用 bridge 的
clientDisconnected标记区分,仅真客户端断开豁免冷却;qoder/trae 网关错误路径不取消上游 reader + 全文无res.on('close')客户端断开传播——qoder 网关补 reader cancel + close 传播(trae 经forEachSseEvent循环退出自然收尾);qoder/trae 网关超 32MB 静默req.destroy()改答 413(与 core/bridge.js 同口径);trae quota memoize 补单飞(并发 snapshot 共享在飞请求)+x-uid只在值非有限数字时丢弃(账号 uid 是字符串语义,不再误拦u-001这类合法值);qodersyncCatalog补单飞(并发共享在飞 Promise,与 codebuddy 侧口径对齐);trae/qoderresolveCredential的 expiresAt 缺失视为临期而非永不过期(有 refreshToken 时强制刷新,不再拿未知新鲜度凭据出门)。 - client.js 设置卡四项:登出/删 Key 等 4 处 mutating POST 不查
res.ok(4xx/5xx 静默刷新用户误以为已退出/已删)——补齐 HTTP 错误分支;toggleModel 重建本地状态丢unroutable字段——拷贝清单补回,「不可路由」徽标与「可路由 M 个」计数不再失真;OAuth 弹窗被拦完全静默——window.open返回 null 时setErr提示用户允许弹窗。 - 回归:
verify-models(23 模型)/verify-bridge/verify-rotation/verify-core-generic/verify-providers/verify-trae-provider(90 断言,含新增多 tool_calls)/verify-qoder-provider(154 断言)/verify-host-config(36)/verify-desktop-acceptance(12 ok)/verify-agents-md全 PASS。
- 高危 1 — Qoder COSY
完整变更记录见 CHANGELOG.md。
dsh-tap v0.16.0
- 桥端口按运行时宿主 profile 分流——desktop Qoder/Trae 独立监听 3913/3912,web 线 3902/3903 逐位不变(goal
docs/goals/bridge-port-host-split.mdG3–G7 一轮落地;功能换代:端口按宿主分流;新坑 #55;机制证据docs/probes/port-split-2026-10-03.json、共存端到端证据docs/probes/coexist-e2e-port-split-2026-10-03.json):- 机制:共享文件层
codebuddy-plugin.json被 web/desktop 两进程共读——分流端口不持久化(写进去两边读同一份仍撞),每进程按自身宿主信号现读现算。新增模块级归一函数resolveBridgePorts(三端口有效值唯一出处)+ 信号源currentProfileDirName(每次现读hostConfig.probe().documentPath的 profile 目录名,永不缓存——settings 服务经 ctx.inject 异步注入,缓存会把启动竞态烙成永久错分)。默认 profile(web)或信号不可用 → 偏移 0(= 既有行为逐位一致);其余宿主 profile → trae/qoder +10(3902→3912、3903→3913)。CodeBuddy 桥 3901 本期不动(goal 边界)。 - 「显式」判定收口(踩坑 #55):cordis 给 apply 的 entry config 恒含
Config({})的 schema 默认端口(活 desktop 实测 entryPortKeys=[bridgePort,traeBridgePort,traeChatTransport,qoderBridgePort])——entry ≠ 用户显式,若把 entry 无差别当显式,schema 默认会压过分流偏移(分流失效)。故:entry 端口值偏离 schema 默认才算显式(verify-* 套件随机空闲口 ≠ 默认 → 采信,否则桥绑 3901 撞真实实例);文件层显式恒采信(设置卡 commit 才落键,含等于默认的值);cordis 默认 entry 落回分流/文件层。 - listen/镜像同源:镜像两函数(syncQoder/syncTraeModelsToDshSettings)从
Config({...readFileLayer()})切到模块级出口effectiveSettingsFn(apply 内赋值的 resolveNow)——listen 端口与镜像 baseURL 同源同一次解析,根除「listen 3913 镜像写 3903」双路径漂移。sync*Bridge / 设置卡回显零改动(只读s.<port>)。 - web 位级不变承诺:web 的 documentPath 目录名 =
web(实测...\profiles\web\cordis.patch.yml)→ shift=0 → 产出与今日逐位一致;信号不可用同。共享文件层实测无三端口键、零真实写入。 - 设置卡观感语义(写入 gateway-facts 免当 bug 报):desktop 端口字段显示 3912/3913 但
overridden()判 false(文件层无该键)→ 无「已覆盖」标记;删键/重置 = 回到分流值 391x 而非 3902——语义自洽。 - 验收(G6):
node --check;verify-desktop-acceptance --structuralexit 0(§4a/§4b 零 desktop 字样 + 新增 §4a+ 收口加固断言全绿;B 组加 §4c/§4d desktop 镜像端口=3913/3912 断言、C 组补 §4e 活体补采 SKIP);verify-bridge/verify-rotation/verify-providers/verify-trae/verify-qoder/verify-host-config/verify-core-generic/verify-agents-md全 PASS。 - 活体 G3/G4(机制):desktop Qoder 监听 3913(PID 28088,
running:true lastError:null)、Trae 启用实测监听 3912、web 仍 3901/3903(PID 3400)——netstat 实证两实例各持各端口零 EADDRINUSE,诊断卡不再出现「另一实例代管」;desktop patch qoder 镜像 baseURL 重铺为 3913(docs/probes/port-split-2026-10-03.json)。 - 活体 G5(共存端到端,
docs/probes/coexist-e2e-port-split-2026-10-03.json):web(:3090) 与 desktop(:19387) 同跑各持各桥——①desktop 经 :3913 真实聊天qfmodel出正文「成功」finish_reason=stop(11 chunks / 1.354s);②桌面独立:taskkillweb 进程后 desktop Qoder :3913 仍自持、再聊出「独立」(CONTENT-OK),web 已死 CONNECTION-REFUSED;③web 重启后 :3903 自持可用(出「共存」),终态 netstat 3090/3901/3903→web 新 PID 12904、3913/19387→desktop 28088 未动。baseURL 对平:web patch qoder=…:3903/v1、desktop patch qoder=…:3913/v1;CodeBuddy 桥 3901 仍由 web 先占 desktop 借桥(goal 边界,与分流无关)。双实例traeEnabled=false,3902/3912 未监听、Trae 独立性本期不适用如实标注。 - 回退即 revert:resolveNow 两行 + 归一函数 + 镜像两行切换,共享层无写入无残留;desktop patch 的 391x 镜像块由 sync* 以旧端口整块重铺自动修正。
- G7 文档收尾:goal 文档状态转「已落地」、STATE.md goal 节同步、wiki/02 desktop 共存节与 wiki/08 端口总表补 3912/3913 分流口径、AGENTS.md 踩坑速查加
#55(守预算闸门,verify-agents-md绿)、CHANGELOG 本节定稿 0.16.0。
- 机制:共享文件层
- 真 GUI 实测补记(computer-use 首轮真实壳内操作,三个被探针漏掉的缺陷当场爆出并修复):
- 壳内 POST 全 403(用户报障截图实爆):真实桌面壳点「重试监听」→「重试失败(HTTP 403)」。根因 = 壳
forwardWebRequest(asar main.js:7469-7474)转发时剥掉 origin 头(["host","origin","cookie","sec-fetch-site"].delete),而sameOrigin对origin===undefined恒拒 ⇒ 桌面壳内所有 POST(保存/重试监听/登录)自 0.15.0 起全是 403——0.15.0 的「三连 200/200/403」是 curl 模拟(带 Origin 头直打),真壳请求从未实测。修复 =sameOrigin放行无 Origin 的 POST(威胁模型:浏览器跨站 POST 恒带 Origin 不受影响;无 Origin = 壳转发/非浏览器客户端,回环 Host 门兜底;与 GET 侧localGuardFailure的无-Origin-放行语义自洽;非浏览器客户端本可伪造任意 Origin,此门对它们无约束力)。 - 启动时序竞态实爆(评审预言命中):真实重启桌面后 desktop 解析回 3903(撞 web EADDRINUSE)——首轮
sync*Bridgelisten 跑在 settings 服务注入前,documentPath未就绪 → 信号 null → 落 default;探针验证时实例恰好时序对,真实重启必踩。修复 =currentProfileDirName两级信号:① process.argv 自证(host 进程把 profile 目录作位置参数传入自身 argv,启动期可用零时序依赖)② documentPath 兜底。离线单测 desktop→desktop/ web→null/ 套件→null;活体重启后 3913 LISTENING(host 同进程)。 - CodeBuddy 头芯片补「·另一实例代管」:0.15.1 只补了 Trae/Qoder 芯片,CodeBuddy 行(用户截图同款位置)漏了——同步补齐,
[B2]预言机 codebuddy 分支镜像同款逻辑。 - GUI 验收(computer-use,AX 树取证):壳内设置卡
Qoder CN 运行中(3913)、CodeBuddy … 桥未监听 :3901·另一实例代管(goal 边界内共享桥如实标注)、点「重试监听」无 403 横幅——壳内 POST 路径修复闭环。
- 壳内 POST 全 403(用户报障截图实爆):真实桌面壳点「重试监听」→「重试失败(HTTP 403)」。根因 = 壳
完整变更记录见 CHANGELOG.md。
dsh-tap v0.15.1
- 诊断口径修复:EADDRINUSE 共存不再报成故障(用户报障:桌面 GUI 诊断卡显示 Qoder「网关未监听 :3903 / lastError EADDRINUSE」)。真因 = web 实例(:3090)先占 3901/3903、桌面网关退避让位、聊天路由先占方桥(凭据同源功能等价,desktop 端到端证据已实测)——功能正常,是诊断卡把良性 EADDRINUSE 报成了错。
lib/client.js沿用 CodeBuddy 桥:1391已有口径("若占用者是另一个 dsh 实例,其桥仍会代管本实例流量"),补齐 Qoder/Trae 半边:头芯片未监听文案追加「·另一实例代管」(EADDRINUSE 专属)、Qoder/Trae 网关状态行带同款说明、「复制诊断」聚合文本同步——三处仅在lastError === "EADDRINUSE"严格等值时触发,mock-eaddrinuse等其他失败文案不变。 - 回归:
card-accordion.js新增[B6](4 断言:真 EADDRINUSE mock ⇒ 头芯片追加 + Qoder 网关行代管说明正向锁,踩坑 #50——此前套件无此锁,删掉追加照样全绿);[B2]状态行预言机同步镜像 client.js 的 EADDRINUSE 分支(逐字全等口径不变)。全套 204 通过 / 0 失败(基线 200 + [B6] 4),零真实写入 md5 对账一致(c5cff30c…)。
完整变更记录见 CHANGELOG.md。
dsh-tap v0.15.0
- desktop profile 接入落地(goal
docs/goals/desktop-adaptation.mdG3–G7 一轮完成;实施实录见 goal 文档「实施实测」节与 STATE.md 同日节):- 装载:desktop 自带 CLI
plugin --profile desktop add <repo>一次到位——dependencies.dsh-tap=link:与dsh.profile.bundles两落点自动写好,link 实落profiles/desktop/node_modules/;verify-desktop-acceptance.mjs§1c FAIL→ok(9 ok / 0 FAIL),三手写块(volces / agent-default-model / ui-settings-account)与 2026-10-01 注释逐行原样(diff 备份实证) - 活体(0.2.0-rc.2 asar 内嵌宿主):
?probe=host-config=mode=forms/formsWritable=true/legacySettingsPath指向%USERPROFILE%\.dsh(DSH_HOME 未漂移)⇒ host-config.js 零改动(能力探测选路自动命中,未写版本号分支);凭据/桥端口与 web profile 全共享,web(:3090)与桌面实例并存、桥端口先占方持有(EADDRINUSE 落 lastError 不炸,聊天路由先占方桥) - 新坑 #54:桌面组合树不合并 bundle patch 的 codebuddy 块,镜像只写
providers.codebuddy.models子路径被 0.2.0 llm-pi-ai 校验拒(needs an api⇒ mutate 回滚)——接入 = 往 desktop patch 手放完整 provider 块(web 用户层同构先例);修复后lastError=null、providerIds=[volces,qoder,codebuddy] - Origin 门兜底:
Origin: dsh-app://app的本地特权面请求实测 403(方案风险 3 命中)⇒ index.js 新增通用localAllowedOrigins配置字段(默认空 = 行为不变,零 desktop 字样,§4a/§4b 静态守卫保持绿)+localGuardFailure/sameOrigin两门消费(完整串精确匹配,Host 回环门不变);desktop 侧文件层建议值["dsh-app://app"],落地后三连实测 200 / 200 / 陌生 Origin 403 - 端到端:CodeBuddy 桥
glm-5.3-flash真实聊天content:"成功"+finish_reason:"stop";Qoder :3903 流式正文在途;Trae 按用户设置禁用未测 - 回归:离线九套件全绿(models 23 / host-config 36 / trae 89 / qoder 154 / desktop-acceptance / agents-md 预算…)+
dsh-ui-test/card-accordion 200 + qoder-slot-check 13 + qoder-tab-phase2 11,零真实写入 md5 对账一致;desktop patch 首启镜像写回前已备份(cordis.patch.yml.pre-dsh-tap-20261003.bak) - 活体验证收尾(段内补记,零代码改动;发版后 08:35 端到端探针,证据
docs/probes/desktop-e2e-2026-10-03.json):desktop 活实例四项全绿{"mounted":true,"cfg":true,"e2e":true,"verifyOk":true}——①mounted:Electron 壳 + host :19387(0.2.0-rc.2 asar 内嵌)真实挂载;②cfg:§1c?probe=host-config活实例全绿(formsWritable=true、documentPath=…profiles\desktop\cordis.patch.yml、applies=live、providerIds=[volces,qoder,codebuddy],宿主对账 codebuddy 29/29 + qoder 14/14、drift=[]、web 钉选 ok);③e2e:双通道真实聊天 CONTENT-OK——桥 :3901glm-5.3-flash与 Qoder :3903qfmodel首增量"成功"+finish_reason=stop(上条"Qoder 流式正文在途"就此闭合),Trae 按用户设置禁用如实标注不代开;④verifyOk:verify-desktop-acceptance= 9 ok / 0 FAIL / 3 SKIP,验收 C 组 §1c/§2 由本探针补跑(§3 壳内设置卡回归仍未验)。共存纪律实证:web(:3090) 先占 3901+3903,desktop 桥 EADDRINUSE 让位不炸、聊天路由先占方桥;零真实写入 md5 跑前=跑后=c5cff30c…
- 装载:desktop 自带 CLI
完整变更记录见 CHANGELOG.md。
dsh-tap v0.13.0
- 设置卡 P3:打磨——冷启动引导 + 头部开关误触缓解(goal 驱动,判定表
docs/goals/settings-card-ux-redesign.md§4;纯lib/client.js前端改动,后端契约零变化)- P3-6 冷启动引导(提交
52ed8d5):首次被采纳的 GET 视图里三通道均无凭据(CodeBuddy 按 authMode 看oauth.signedIn/activeApiKey,Trae/Qoder 看各自oauth.signedIn)⇒ 自动展开 CodeBuddy 区块一次——useRef守卫,同一挂载内只引导一次(用户手动收起后不被后续 load 撬开)、不引入持久化状态;任一通道有凭据即保持默认全收 - P3-7 头部开关误触缓解(提交
6ec82ba,设计文档 §8 风险表首选方案):Trae/Qoder 区块头启用开关收起态第一次点击只进确认态——0 POST、就地提示「再点一次确认启用/停用」(.cbc-headconfirm,warn 色)、受控 checkbox 弹回原态;4s 窗内第二次点击才落盘,超时自动复位(沿用 askConfirm 模式)。展开态直切不确认——用户正看着分区内容,误触面不同。回退方案「开关移入展开区第一行」不启用。title/aria-label 随确认态切换 - 验证:
card-accordion.js187 → 197 断言全绿(新增[L1]×8 冷启动引导:无凭据自动展开+其余三区仍收 / 手动收起+再次保存后不重复引导 / 有凭据对照默认全收 / 两 mock 通道无 pageerror 无告警;[C3]重写为确认语义 ×7:收起态首击 0 POST+提示+弹回 / 4s 窗内二击恰 1 POST 且 patch 单字段 / 4s 超时自动复位 / 展开态直切恰 1 POST)。RED 实测:撤掉 P3-6 产品代码复跑,恰[L1]两条红、其余 193 全绿(logs/card-accordion-p36-red.log);[C3]首条断言与产品代码因果直连(无确认逻辑时首击即 POST ⇒ 必红)。qoder-slot-check13 /qoder-tab-phase211 /qoder-prefs-check37 复跑全绿(phase2 只读开关状态不点击,不受确认语义影响);离线七套件 +verify-models.mjs --list(23 模型)复跑全绿。零真实写入:~/.dsh/codebuddy-plugin.jsonmd5 跑前跑后恒为7127964e…。成本口径:两项均零新增上游调用(确认态与引导判定都是纯客户端,数据来自既有 GET 视图)
- P3-6 冷启动引导(提交
完整变更记录见 CHANGELOG.md。
dsh-tap v0.12.0
- 设置卡 P2:既有能力 UI 化——状态行就地动作 + 模型口径透明 + 凭据主动验证(goal 驱动,判定表与落点
docs/goals/settings-card-ux-redesign.md§4;后端全部走既有 POST action 模式,脱敏纪律不破)- P2-3 状态行可操作化(提交
a993be4):仅 warn/err 态的通道区块头尾部出两个就地动作,正常态零动作零噪音。重试监听 = 新 POST actiongateway-retry(channel 限定三通道;服务端 enabled 限定点重跑对应sync*——wedge 自愈路径本身就是重试语义;禁用通道跳过,避免连带镜像撤铺写宿主层),客户端复用踩坑 #45 的退避补拉。复制诊断 = 纯客户端从 GET 视图聚合 running/端口/lastError/最近同步时间写剪贴板(视图本就脱敏,零请求增量)。BlockHead增 actions 槽(独立交互元素,不嵌套展开 button) - P2-4 模型口径透明(提交
54f3668):providers/codebuddy/catalog.js导出UNROUTABLE_MODELS(id→原因,唯一真源;证据 = codebuddy-efforts-matrix-2026-09-22 六臂全 11102 + routing-2026-08-19;hy4-preview-x2026-09-26 复核已离开目录,集合保留防重现)。model-list 响应带unroutable表、GET 视图models.sync增routable计数;同步行/列表底行口径「目录 N · 可路由 M」;死条目行置灰 +「不可路由」徽标(title 带原因),勾选框未启用时禁用(防加死模型)、已启用保留可勾掉(出清通道)——不改镜像/选择器行为,transparency only。实测对账:目录 31 · 可路由 28,glm-4.6v 在选且死、另两枚已禁用,两态皆有 - P2-5 凭据主动验证「测一下」(提交
d2d2228):新 POST actioncredential-test(channel=codebuddy|qoder)与provider-test(id);验证结论即响应本体(available布尔,恒 200——验证失败不是路由故障)。CodeBuddy 走目录面 GET /v3/config(零额度消耗);Qoder 走签名目录 GET(catalog 面 /algo,非聊天面prepareInferRequest);key 型服务商走testExtraProvider——与 refresh 同路径活解析 key、/models 或 probeChatKey 探针,只读不写块。三处落点就地显示「✓ 可用(目录 N 个模型)」/「✗ 具体错误」,不进全局横幅。实测:codebuddy ✓(目录 31)、qoder ✓(目录 14)、参数错误 400、未注册 provider available:false - 新坑 #51:CDP
overridePermissions授clipboard-read会把同族clipboard-write一并显式 deny,之后连可信点击的瞬时激活都救不回writeText(恒 NotAllowedError);完全不授权反而正常。「复制诊断」的剪贴板断言因此 = 零授权 +page.click可信点击 + writeText 间谍(window.__clip)读回(套件 [I1] 段注释锁定"别改回 overridePermissions") - 验证:
card-accordion.js160 → 187 断言全绿(新增[I1]×9 warn 头就地动作 /[J1]×8 目录·可路由口径与置灰 /[K1]×10 测一下三通道与参数错误;mockInstaller的 responses 支持 action|channel 细分键);qoder-slot-check13 /qoder-tab-phase211 /qoder-prefs-check37 复跑全绿;离线七套件(verify-bridge / rotation / core-generic / providers / trae / qoder / host-config)+verify-models.mjs --list(23 模型)复跑全绿;真实实例gateway-retry三态实测(ok / 400 / disabled-skip)。零真实写入:~/.dsh/codebuddy-plugin.jsonmd5 跑前跑后恒为7127964e…。成本口径:「测一下」每次点击 = 一次真实上游只读(codebuddy 目录面零额度;qoder 签名目录只读;key 型为 /models 或 1-token 探针),不点不发;重试监听零上游调用(只重跑本地 listen);复制诊断零请求
- P2-3 状态行可操作化(提交
完整变更记录见 CHANGELOG.md。