# deepseek-harness-desktop-app

> 通过 IPC 把 10 个项目/对话/Canvas/Office 工具与 ui_render 注册进 DSH Web Profile，身份由父进程统一管。

## Metadata

- Author: [@vibeinging](https://github.com/vibeinging)
- Repo: <https://github.com/vibeinging/deepseek-harness-desktop-app.git>
- GitHub: [vibeinging/deepseek-harness-desktop-app](https://github.com/vibeinging/deepseek-harness-desktop-app)
- Stars: 606
- Language: JavaScript
- License: [MIT](https://spdx.org/licenses/MIT.html)
- Topics: `agentic-workflows`, `ai-agent`, `ai-workbench`, `data-analysis`, `deepseek-harness`, `desktop-app`, `dsh`, `dsh-plugin`, `electron`, `local-first`, `mcp`, `model-context-protocol`, `office-automation`, `react`, `typescript`
- Forks: 32
- Open Issues: 6
- Last push: 2026-08-15T08:56:28.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:vibeinging/deepseek-harness-desktop-app/packages/dsh-product-bridge
```

## Wiki

## 一句话定位
DeepSeek Harness Desktop App 的产品桥接 Profile Bundle。它通过 IPC 把 10 个项目/对话/Canvas/Site/Office 工具和 `ui_render` 注册到当前 DSH Web Profile 的 Agent 工具目录，并把应用指令、项目记忆、模型目标等关键上下文以受控方式注入模型步，让 DSH 能在不修改官方源码的前提下访问桌面应用的本地数据。

## 核心能力
- 暴露 2 个项目上下文工具：`project_list`（列出当前用户可见的项目）与 `conversation_list`（列出当前项目下对话，支持是否包含归档）
- 暴露 4 个 Canvas/Site 工具：`canvas_inspect` / `canvas_create` / `canvas_edit` / `canvas_suggest`，全部基于不可变 base 版本，编辑和建议都要求先 inspect
- 暴露 3 个 Office 产物工具：`artifact_office_inspect` / `artifact_office_create` / `artifact_office_edit`，覆盖 Markdown / DOCX / XLSX / PPTX / PDF 五种格式
- 暴露 1 个结构化界面工具 `ui_render`：在父进程校验的有界 schema 内渲染可交互界面，按钮和表单只会发出可见的用户消息
- 把 5 个工作台页面（结果与证据、浏览器、文件、产物、Site）通过 `product.json` 贡献到 `agent.workbench.tool` 产品位置，应用外壳从当前 Profile 目录读取
- 拦截写入类工具：5 个写操作都会触发 DSH 内置审批流程；子进程侧不持有任何身份或权限，全部由父进程绑定已授权 Session、用户和项目后处理

## 技术实现
- **语言**: JavaScript (ESM, `"type": "module"`)
- **关键依赖**: `@deepseek-ai/cordis` ^4.0.1、`@deepseek-ai/dsh-agent` ^0.1.0-rc.6、`@deepseek-ai/dsh-invariants` ^0.1.0-rc.6、`@deepseek-ai/dsh-tools` ^0.1.0-rc.6
- **架构模式**: Cordis 插件（`inject: ["agents","tools","webServer"]`），通过 `cordis.patch.yml` 声明为 `product-bridge` 行；通过 `product.json` 声明工作台产品位置贡献；运行时与父进程走 IPC，子进程只携带 Session id
- **入口文件**: `packages/dsh-product-bridge/src/index.js`（`apply(ctx)` 是 Cordis 启动钩子，内含 IPC 主机、工具注册、内存/指令注入、模型目标跟踪、生命周期收尾）

## 适用场景
想在 DeepSeek Harness Desktop App 里让 DSH 直接读写本地项目文件、Canvas、Office 产物和结构化界面时使用这个 Bundle。它把官方 DSH Web Profile 扩展为能调用桌面应用能力的形态，省去自行 fork 或维护本地 SDK 的成本。普通用户不需要单独安装它——它随桌面应用一起随 Profile 加载。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH Agent | 0.1.0-rc.6 | 通过 `peerDependencies` 显式钉到 `^0.1.0-rc.6`，必须使用 `next`/rc.6 系列，`latest` 仍指向旧版本 |
| DSH Tools | 0.1.0-rc.6 | 同上，`peerDependencies` 锁定 |
| DSH Invariants | 0.1.0-rc.6 | 同上，`peerDependencies` 锁定 |
| Cordis | ^4.0.1 | 提供插件运行时 |
| Node | ^22.19.0 或 >=24.0.0 | `engines` 字段声明 |
| 平台 | 跨平台 | 跟随宿主桌面应用（macOS / Windows / Linux） |

## 安装方式
```bash
dsh plugin --profile web add github:vibeinging/deepseek-harness-desktop-app/packages/dsh-product-bridge
```

## 配置项
本插件无需额外配置。所有能力由 `cordis.patch.yml`（声明 Cordis 插件行 `product-bridge`）、`product.json`（声明工作台 5 个页面与显示信息）和 `package.json#dshWork`/`#dsh`（声明 Bundle 元数据）静态注入，运行时通过 IPC 与父进程协商上下文。

## 常见问题
**Q: 装上这个包之后，DSH 会多出什么能力？**

A: DSH Agent 工具目录里会多出 10 个工具：`project_list` / `conversation_list` 用于读取项目与对话，4 个 Canvas/Site 工具（inspect/create/edit/suggest），3 个 Office 产物工具（inspect/create/edit），以及一个用于渲染结构化交互界面的 `ui_render`。

**Q: 这些工具在模型看到之前会先被怎么拦一道？**

A: 任何会改动桌面应用本地数据的写入类工具（`canvas_create` / `canvas_edit` / `canvas_suggest` / `artifact_office_create` / `artifact_office_edit`）都会触发 DSH 内置的审批流程，模型必须先拿到用户确认才能继续。

**Q: 子进程只发一个 Session id，身份和权限谁来管？**

A: 全由父进程（DeepSeek Harness Desktop App 的 Electron 主进程）管。子进程拿到 Session id 后发请求，父进程把它绑定到唯一已授权的 Session、用户与项目，再处理项目/对话/Canvas/Site/Office 请求；请求不能跨身份、跨项目。

**Q: 上下文里的应用指令和项目记忆是怎么注入的？**

A: 每个模型步进入前，桥接先读一次父进程快照，把允许的应用指令、项目指令、全局/项目记忆包装成不可变 user 消息附到 `agent/pre-step` 批次里，并打上 `dsh-work-context` / `dsh-work-memory` 来源；读取失败只跳过这一次补充，不会替换用户消息。

**Q: 子 Agent 会沿用父 Agent 的模型配置吗？**

A: 会。桥接会记录父 Agent 最终解析出的 provider/model，当 DSH 创建子 Agent 时在第一次请求前把目标固定下来，避免子 Agent 回退到进程启动默认模型；之后父 Agent 的请求仍然走自己的正常设置。

**Q: 这个包跟同仓库的 dsh-work-shell、dsh-theme-pack 是什么关系？**

A: 三者同属 DeepSeek Harness Desktop App 的私有 Profile Bundle 三件套：`dsh-work-shell` 替换默认壳，`dsh-theme-pack` 提供主题，`dsh-product-bridge` 注入产品工具；三件齐全桌面应用才完整。

**Q: 父进程关掉了，子进程会不会留未处理错误？**

A: 不会。运行时把就绪消息和产品 IPC 都走成回调式发送，父进程关闭会正常胜过晚到的 Loader，未发送成功的请求会被拒绝而不是变成 unhandled channel error。

**Q: 第三方 Bundle 能绕过这套机制把 UI 塞进渲染进程吗？**

A: 不能。包含 `dsh.client` 的社区 Bundle 会在预检阶段被拒绝，工作台页面只渲染本地白名单内的组件；用户安装的 Bundle 既无法跑 Client 代码，也无法只靠 JSON 名字进入 Renderer。

## 上手难度
进阶 — 需要理解 DSH Profile Bundle、Cordis 注入点和 IPC 工作机制才能修改，普通用户通常无需手动调整。

## 已知问题与限制
- `peerDependencies` 强制锁到 `0.1.0-rc.6`，因为部分叶子包的 `latest` 仍指向旧版本；开发时若链接 DSH 源码或混装不同 RC 系列会破坏兼容性
- 本包为私有包（`package.json` 标 `private: true`），不发布到公共 registry；成品必须携带同一份审核版本和匹配的官方 NPM SDK 版本
- rc.6 SDK 不再发布原来的 ProductHost 与项目工具包，工具与 IPC 桥接由本 Bundle 直接持有，升级 DSH SDK 时需同步调整
- KV Cache：同一 Profile 内 Bundle 版本或顺序变化会重启 DSH 运行时，可复用的工具前缀可能改变
- 普通请求 30 秒超时，写操作类审批后端到端 60 秒超时（`PRODUCT_REQUEST_TIMEOUT_MS` / `PRODUCT_MCP_TIMEOUT_MS`）
- 移除的"项目 Plugin 挂载、Skill、MCP 数据"目录方法返回空目录，由 DSH 原生注册表继续接管

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [deepseek-harness-desktop-app](https://deepseek-plugin.org/plugins/vibeinging/deepseek-harness-desktop-app/packages/dsh-product-bridge)
Wiki generated by AI (model: `MiniMax-M3`)
