# pi-web-ui DSH runtime overrides — applies AFTER the dsh-base bundle patch
# (loaded from the runtime tree). Rows that restate a base row use id-targeted
# REPLACE (last write wins per row); new rows come in a plain insert block.
# !!js 表达式由 Cordis Loader 在挂载时求值（boot 暴露 dshHomePath，process.env
# 直读）。

# 会话持久化根 —— 覆盖 base 的 dshHomePath('sessions')，让 pi-web-ui 指向自己的数据目录。
- id: session-persistence-jsonl
  name: "@deepseek-ai/dsh-session-persistence-jsonl"
  config:
    root: !!js process.env.DSH_SESSION_ROOT ?? dshHomePath('sessions')

# Agent 默认模型 —— initialize() 每次都带 provider/model，这里只兜底。
- id: agent-default-model
  name: "@deepseek-ai/dsh-agent-default-model"
  config:
    provider: !!js process.env.DSH_DEFAULT_PROVIDER ?? 'deepseek-official'
    model: !!js process.env.DSH_DEFAULT_MODEL ?? 'deepseek-v4-flash'

# 部署人设（默认空；pi-web-ui 设置面板可注入）。
# 键名必须是 personaPrefix（dsh-system-prompt schema；persona: 会被 zod 静默丢弃）。
- id: system-prompt
  name: "@deepseek-ai/dsh-system-prompt"
  config:
    personaPrefix: !!js process.env.DSH_PERSONA ?? ''

# 沙箱工作区根（workspace-write 权限模式的护栏边界）。
- id: sandbox-policy
  name: "@deepseek-ai/dsh-sandbox-policy"
  config:
    mode: !!js process.env.DSH_PERMISSION_MODE ?? 'workspace-write'
    workspaceRoot: !!js process.env.DSH_CWD ?? process.cwd()

# 无头 JSON-RPC 服务：没有交互用户来应答审批弹窗；工具在 workspace-write
# 沙箱内直接执行，用户的 Stop 按钮就是控制手段。
- id: approval
  name: "@deepseek-ai/dsh-user-approval"
  config:
    policy: "never"

# 权限预设表 —— 与 approval=never 组合匹配。patch 语义：整行 config 全量替换，
# 必须重述 base 的全部预设并补上 (workspace-write, never) 组合，显式 defaultPreset。
- id: permission
  name: "@deepseek-ai/dsh-permission-presets"
  config:
    presets:
      read-only:
        sandbox: read-only
        approval: ask
      workspace-write:
        sandbox: workspace-write
        approval: ask
      workspace-write-never:
        sandbox: workspace-write
        approval: never
      danger-full-access:
        sandbox: danger-full-access
        approval: never
    defaultPreset: workspace-write-never

# ── 新行（plain insert）─────────────────────────────────────────────────────
- insert:
    # pi-web-ui 自定义系统提示词（设置面板）：独立 host section，随 standard/ptc/
    # cordis 下发；minimal（complete:true）按官方语义压住。文本走环境变量
    # PI_WEB_DSH_CUSTOM_PROMPT（Node 侧维护，变化即重启运行时）。
    - id: pi-webui-custom-prompt
      name: ./custom-prompt.mjs
    # PTC mode 的 TypeScript 运行时（preset 的 tool-presentation 行等它；
    # 无此行时 ptc 预设能挂但不出 run_code，PTC 名存实亡）。
    - id: code-runtime
      name: "@deepseek-ai/dsh-code-runtime-worker-thread"
    # 子代理模型选择开关（standard/ptc/cordis 的 tool-subagent 行
    # modelSelectionSettings: true 要求它在 Host scope；缺失则整组 mount 失败）。
    - id: subagent-model-selection-settings
      name: "@deepseek-ai/dsh-tool-subagent/model-selection-settings"
    # cordis 模式的宿主执行器（tool-cordis 等 dynamicCordisRunner/cordisInspect；
    # 缺失则 cordis 预设 mount 失败）。与官方 dsh-web-app 的 cordis-host-runner 同位。
    - id: cordis-host-runner
      name: "@deepseek-ai/dsh-cordis-host-runner"
    # 模型提问工具：ask_user_question → ctx.userQuestions（base 已挂 user-questions
    # 服务）→ goal-rpc wrapper 注册的 provider 桥到浏览器对话框。
    - id: tool-ask-user
      name: "@deepseek-ai/dsh-tool-ask-user"
    # Stdio JSON-RPC 服务插件（inject: agents）。name 用 !!js 求值为绝对路径
    # （指向项目 node_modules 里的 dsh-sdk-jsonrpc-server），因为 cordis loader
    # 的裸包解析只认 bareModuleBaseUrl（运行时树），混树挂载必须走绝对路径；
    # 该插件的 peer 依赖从项目树自洽解析。
    - id: sdk-jsonrpc
      name: !!js process.env.PI_WEB_DSH_JSONRPC_ENTRY
