# dsh-vision-router bundle layer: applied automatically when the package is
# installed (package.json declares dsh.bundle.patch), i.e. a profile that
# runs `dsh plugin add github:ysr666/dsh-vision-router` gets this wiring
# without any manual cordis.patch.yml edits. Later layers (the profile's own
# cordis.patch.yml, --patch overlays) override these rows by id.

# 纯增量补丁（issue #34）：不替换/禁用核心行。最低支持 Host 仍保留旧兼容路径；
# batch-attachment 合同的 Host 始终拥有 deepseek-official，插件只提供
# 「+ 自动识图」包装路由，因此这里永远不默认禁用官方 llm-deepseek 行。
#
# DSH 0.1.5 family（含当前 0.1.5-rc.1）的 client-modules Node half 在 webServer 尚未可用时会走
# ctx.inject() 延迟注册路径；Linux 并行 Loader 激活可在安装额外 client bundle 后
# 命中 Cordis 的 service-access 竞态（"webServer without inject"）。rc.8 至当前
# Web bundle 都使用同一个 modules row，因此只给该既有行追加显式 webServer
# activation dependency：不替换 row，不改变 client graph，只把官方已经需要的
# Web carrier 依赖从运行时探测收敛成 Loader 顺序。非 Web surface 缺少该 row 时
# Include 按官方 patch 语义仅跳过此 overlay。上游修复该竞态后可重新审计删除。
- id: modules
  name: '@deepseek-ai/dsh-client-modules'
  inject: [webServer]

# DSH rc.6 至 0.1.5-rc.2 的 Web bundle 里，Connection provider row 只声明
# webRuntime，但 HostConnectionService.rpc/fetch 的 accessor 会把调用 owner
# 追踪回这个 provider fiber；rpc.handle() 最终又通过 owner.webServer.register()
# 挂载路由。因此仅在 DVR 的调用 child fiber 注入 webServer 仍不足以覆盖
# Cordis Service shadow 语义（issue #478 / Desktop 2.0.9 可稳定复现）。
#
# 保留官方既有 webRuntime 依赖，并让 Connection provider 本身同时等待
# webServer。这样不改 connection config / trustedHosts，不复制 RPC 协议或鉴权，
# 也不改变非 Web surface。exact-source contract 会监控上游 row；官方一旦
# 自己拥有 webServer，此 shim 必须随支持窗口审计退休，避免覆盖未来新增依赖。
- id: connection
  name: '@deepseek-ai/dsh-client-connection'
  inject: [webRuntime, webServer]

# 挂载插件行。默认保持完整视觉工具表常驻（issue #81）：虽然渐进挂载可以
# 少发一小段工具 schema，但图片轮首次扩展工具列表会改变请求前缀，可能让
# 长会话的 provider KV/prefix cache 整体失效。高级用户仍可在 profile /
# composition 补丁中显式把 progressiveTools 改回 true（启动期配置）。
- insert:
    - id: vision-router
      name: dsh-vision-router
      config:
        progressiveTools: false

# DSH 的 live patch/HMR 旧实现会把 loader dispose 的 disabled=true 就地写回
# bundle insert 对象，随后 recompose 又复用同一个对象（upstream #2854）。
# 0.1.7-rc.2 仍保留该共享对象边界；Desktop supervisor + 多 bundle 场景可因此
# 反复卸载/重挂 DVR（issue #547）。在 insert 之后再按 id 显式恢复 enabled，
# 让每次 recompose 都覆盖被污染的 disabled 值。新 Include 会立即命中上面的
# insert；旧 Include 若尚不能在同一 patch list 中索引新 insert，则只会跳过这条
# overlay，保持旧 Host 原有启动行为。上游 clone insert 后可审计删除。
- id: vision-router
  name: dsh-vision-router
  disabled: false

# Vision Router 的附件产品契约：Host attachment store 是 durable 图片的唯一
# owner，视觉工具只读取 Host 已持久化、校验后的 canonical pixels。DSH rc.8
# 以前 Host 会把已准入的源编码直接持久化；0.1.2-alpha.1 开始又增加独立的
# provider-independent normalization stage。若沿用 alpha.1 的 4.2MP / 4MiB
# 默认值，DVR 的 crop / grounding / OCR / pixel-diff 会在用户毫不知情时换到
# 一个更小的像素坐标系。因此这里把 normalization policy 同步到 DVR 既有的
# 20MiB / 1 亿像素 / 10000px 准入边界：普通 8-bit sRGB 图片继续 pass-through，
# 不扩大 DVR 在 rc.8 时已经允许的 durable 存储上限，同时仍让 Host 独占
# normalization、完整性校验和对象身份。
#
# 注意：alpha.1 对 EXIF/色彩空间/GIF/超限编码等输入仍可能规范化或重编码。
# DVR 不另存第二份 raw attachment，也不声称能从 canonical object 恢复源字节；
# 像素工具的合同因此以 Host canonical pixels 为准。ImageAttachmentRef 的
# originalDimensions 仅用于说明 Host 曾缩放，不能被当作可读取的原图。
#
# DSH 的 patch 是“整段 config 替换”而非深度合并。旧版 Vision Router 曾在
# profile 自己的 cordis.patch.yml 写入同一行的 20MiB/100MP 两个字段；这层
# 比 bundle 晚，会把这里新加的 maxImageDimension 擦掉，让 rc.8 又落回 2000。
# 1.7.2 起运行时只对“20MiB + 100MP + rc.8 默认 2000px”这一历史指纹做一次
# 内存态迁移到 10000px；显式自定义过 dimension 或其他附件策略一律不碰。
# 这样升级旧 profile 不要求用户手工清理配置，同时后续 profile/--patch 的
# 明确部署策略仍保持最终所有权。
#
# rc.6/rc.7/rc.8 没有 normalizedImage*；发布合同 CI 会用真实旧包验证额外
# 配置键仍被安全忽略。若旧 Host 开始严格拒绝未知键，此处必须改为按能力
# 生成配置，而不是靠版本字符串分支。
- id: attachment-local
  config:
    maxImageBytes: 20971520
    maxImagePixels: 100000000
    maxImageDimension: 10000
    normalizedImageMaxBytes: 20971520
    normalizedImageMaxPixels: 100000000
    normalizedImageMaxDimension: 10000
