Skip to main content

dsh-fix

修复 DeepSeek Harness 桌面端(DSH Desktop)的安装、启动、市场与插件问题:BOM/非法 JSON 启动崩溃、install-recovery 事务卡死、pnpm 供应链策略拦截、市场 agent guard 拒绝安装、插件冲突与禁用状态。遇到 DSH 报错、插件装不上、启动失败时使用。

الانتقال إلى التثبيت

معلومات المصدر

المستودع
wpc725562-dotcom/dsh-agent-kit
آخر نشاط في المصدر
٢٤ أغسطس ٢٠٢٦ في ١١:٠٠
لغة SKILL.md المكتشفة
الصينية
النجوم
٠
التفرعات
٠

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
dsh-fix
description
修复 DeepSeek Harness 桌面端(DSH Desktop)的安装、启动、市场与插件问题:BOM/非法 JSON 启动崩溃、install-recovery 事务卡死、pnpm 供应链策略拦截、市场 agent guard 拒绝安装、插件冲突与禁用状态。遇到 DSH 报错、插件装不上、启动失败时使用。
# DSH 修复(DSH Desktop / dshmarket / 插件排障) ## 何时使用 在 DeepSeek Harness Desktop(DSH Desktop 2.x,Windows)环境遇到以下问题时: - 启动直接弹恢复界面 / 报 `Unexpected token`、`not valid JSON`(BOM 或编码问题) - `dsh plugin` 命令报 `another plugin install recovery transaction is pending` - 市场卡片显示「无法安装 · 查看详情」(agent guard 或供应链策略) - 插件装上了但不生效 / bundle 没加载 / 状态是 restart - 想装/想卸插件但被各种策略拦 - `ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION`(供应链策略) ## 关键环境事实(本机实测) | 项 | 值 | |---|---| | DSH Desktop 版本 | 2.0.2(Electron, win32, node v24.18.1)| | GUI 端口 | http://127.0.0.1:43120 | | DSH_HOME | `C:\Users\Administrator\.dsh` | | 实际使用的 profile | **desktop**(`~/.dsh/profiles/desktop`),不是 web!| | web profile | `~/.dsh/profiles/web`(市场默认命令常写 web,但 GUI 用的是 desktop)| | 市场 registry | `https://awesome-dsh-plugin.com/plugins.json`(env `DSHM_REGISTRY_URL` 可覆盖)| | npm 包名 | 卡片显示的作者 ≠ npm 发布者:如 dsh-memory-plugin 是 `@openviking/dsh-memory-plugin`(发布者 linxin666/volcengine);dsh-web-ui-all 是 `@linxin666/dsh-web-ui-all` | | OpenViking 服务 | `http://localhost:1933`(必须运行,否则记忆插件只告警不工作)| ## 铁律 ``` 先诊断根因,再动手改。每一步改动前先备份,改动最小化。 ``` - 改任何 Desktop 持有的状态文件前,先 `Copy-Item` 备份 - 不要手删 install-recovery 的 state.json 而不留备份(改名保留,不删除) - 不要盲目 `pnpm add` 一堆包——先确认目标 profile 和包名 - 所有 `pwsh` 调用用 `& npm.cmd` / `pnpm.cmd`(`npm.ps1` 被执行策略拦截) ## 排障流程 ### 1. 启动崩溃:`Unexpected token '' ... is not valid JSON` **根因**:某个 JSON 配置文件开头多了 BOM(`\uFEFF`)。常见于上次用 PowerShell/编辑器保存时写成了带 BOM 的 UTF-8。 **定位**:检查目标文件前几个字节是否为 `0xEF 0xBB 0xBF`: ```powershell $raw = Get-Content "$HOME\.dsh\profiles\desktop\package.json" -Raw -Encoding Byte Write-Host ($raw[0..2] -join ', ') # 123,10,32,... = 无 BOM;239,187,191 = 有 BOM ``` **修复**:去掉 BOM,其余内容零改动(用 edit 工具重写首行,或: ```powershell $p = "$HOME\.dsh\profiles\desktop\package.json" $bytes = [System.IO.File]::ReadAllBytes($p) if ($bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) { [System.IO.File]::WriteAllBytes($p, $bytes[3..($bytes.Length-1)]) } ``` 改完用 `ConvertFrom-Json` 验证合法。BOM 来源:PowerShell `Set-Content -Encoding UTF8`(Windows PowerShell 5.1 写 UTF8 带 BOM)→ 之后写 JSON 用 `-Encoding UTF8` 前的 `| ConvertTo-Json` 到 `Set-Content` 会带 BOM,需注意。安全写法:`[System.IO.File]::WriteAllText($p, $content, [System.Text.UTF8Encoding]::new($false))`。 ### 2. `dsh plugin` 报 "another plugin install recovery transaction is pending" **根因**:install-recovery WAL 里有遗留事务。WAL 路径:`%APPDATA%\DSH Desktop\plugin-install-recovery\state.json` + `backups\`。 **关键理解**(本机实测): - `phase: awaiting-restart` = 安装已 seal 成功,等 DSH Desktop 重启后 claim → verify → clear - 但**如果事务的 profile 与 Desktop 当前 profile 不匹配**(例如 CLI 装到了 web,而 Desktop 用 desktop),claim 会 `profile-mismatch` → 永久 defer → **所有后续 CLI 安装全被阻塞** - `beginLocked` 只要 state.json 存在就抛错;`clearLocked` 只允许 verified/rolled-back **修复**(先确认安装本身已成功——package.json dependencies + bundles + node_modules 都在): ```powershell $sp = "$env:APPDATA\DSH Desktop\plugin-install-recovery" Copy-Item "$sp\state.json" "$sp\state.json.orphan-bak" -Force Remove-Item "$sp\state.json" -Force Remove-Item "$sp\backups\<transactionId>" -Recurse -Force # 对应的事务目录 ``` 之后所有 `dsh plugin` 命令恢复可用。 ### 3. 市场卡片「无法安装 · 查看详情」 **根因**(两类叠加): 1. **agent guard**:市场安装/更新/卸载时检测到任何 agent 正在运行(包括用户当前对话的 agent 会话本身!)→ HTTP 409 拒绝 → 操作记录 failed → 卡片锁定。`agentGuardAvailable: true`(查 `/dsh-market/status`)。 2. **供应链策略**:pnpm `minimumReleaseAge` 拦截太新的包(本机 `dsh-pocket@1.13.4` 曾触发)。dshmarket 会自动重试一次 `--config.minimumReleaseAge=0`,但 CLI 直装不会。 **判定**: ```powershell $s = (Invoke-WebRequest -Uri "http://127.0.0.1:43120/dsh-market/status" -UseBasicParsing).Content | ConvertFrom-Json $s.agentGuardAvailable # true = agent guard 生效 $s.installed # 实际已装的包(判定市场操作的 profile!) ``` **修复**:CLI 直装绕过 agent guard(agent guard 只在 HTTP 路由层,CLI 不走它): ```powershell Push-Location "$HOME\.dsh\profiles\desktop" & pnpm.cmd add <真实npm包名> --config.minimumReleaseAge=0 Pop-Location ``` ### 4. 装完不生效 / bundle 没加载 **修复**:把包加进 `dsh.profile.bundles`(dsh CLI 装完会自动 reconcile,但直装 pnpm 不会): ```powershell $pkgPath = "$HOME\.dsh\profiles\desktop\package.json" $json = Get-Content $pkgPath -Raw -Encoding UTF8 | ConvertFrom-Json $json.dsh.profile.bundles += '@xxx/dsh-plugin' # 去重后 $json | ConvertTo-Json -Depth 10 | Set-Content $pkgPath -Encoding UTF8 # 注意无 BOM ``` **验证 bundle 结构**:插件包须有 `cordis.patch.yml`(`- insert:` 行)+ `dsh.bundle.patch` 字段。bundle 层插件**必须重启 DSH Desktop 才激活**(market 的 activation 状态会显示 `restart`)。 ### 5. 查询插件激活/禁用状态 ```powershell $r = Invoke-WebRequest -Uri "http://127.0.0.1:43120/dsh-market/installed" -UseBasicParsing $r.Content | ConvertFrom-Json | % { $_.activation.PSObject.Properties | % { "$($_.Name): $($_.Value.state)" } } ``` 状态含义:`live`(已热挂载)/ `restart`(重启生效)/ `disabled`(被禁用)/ `inert` / `broken` / `missing`。 **禁用状态存储**(三处都可能): 1. `{profileDir}/.dsh-market/state.json` 的 `disabled` 数组(market 开关) 2. `{profileDir}/cordis.patch.yml` 的 `- id: X` + `disabled: true` 行 3. Desktop 私有:`%APPDATA%\DSH Desktop\startup-recovery\state.json` 的 `disabledBundles`(启动恢复禁用)——**这一处最隐蔽**,dshmarket 感知不到 ### 6. 恢复被禁用的插件(startup-recovery 层) ```powershell $sp = "$env:APPDATA\DSH Desktop\startup-recovery\state.json" Copy-Item $sp "$sp.bak-$(Get-Date -Format yyyyMMdd-HHmmss)" -Force # 把该 profile 的 disabledBundles 数组改为 [](空数组合法,parseState 只校验长度上限) ``` 改完重启 DSH Desktop 生效。 ### 7. 供应链策略相关 - 策略配置在 profile 的 `pnpm-workspace.yaml`:`minimumReleaseAgeExclude` 列表 - 但**即使 exclude 里写了,`pnpm install` 仍可能拦截**(本机实测 `dsh-pocket@1.13.4` 在 exclude 里却仍报 violation)→ 直接用 `--config.minimumReleaseAge=0` 绕过最可靠 - 忽略的构建脚本:`ERR_PNPM_IGNORED_BUILDS` 是警告不是失败;相关功能(node-pty/ssh2)不工作再处理 `allow-scripts` 白名单 ## 常用验证命令 ```powershell # 市场状态(活跃 profile / installed / agent guard) Invoke-WebRequest http://127.0.0.1:43120/dsh-market/status # 插件激活状态 Invoke-WebRequest http://127.0.0.1:43120/dsh-market/installed # profile 依赖与 bundles (Get-Content "$HOME\.dsh\profiles\desktop\package.json" -Raw | ConvertFrom-Json).dsh.profile.bundles # install-recovery WAL Get-Content "$env:APPDATA\DSH Desktop\plugin-install-recovery\state.json" -Raw # 日志 Get-Content "$env:APPDATA\DSH Desktop\logs\dsh-2026-08-2*.log" -Tail 50 ``` ## 反模式(不要做) - ❌ 不诊断直接重装/删文件 - ❌ 手删 state.json 不留备份 - ❌ 装插件装到 web profile 而用户 GUI 用 desktop profile(先查 `/dsh-market/status` 的 installed 确认活跃 profile) - ❌ 用 `npm.ps1`(执行策略拦截)——用 `npm.cmd` - ❌ 改 Desktop 持有的状态文件时写成带 BOM 的 UTF-8 - ❌ 认为"market 显示无法安装 = 插件有问题"——多数是 agent guard 或策略,插件本身没问题
عرض على GitHub