下载 Windows 版 · 安装指南 · 0.6.1 更新说明 · 反馈问题
30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/4 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ZPA76/deepseek-pa-dsh-desktop该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 32 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包deepseek-pa(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 09:40:39
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 203 处,展示前 124 条)
- 读取本地文件main.js:33
const pkg = JSON.parse(fs.readFileSync(path.join(directory, 'package.json'), 'utf8')) - 写入本地文件main.js:67
fs.mkdirSync(logDir, { recursive: true }) - 读取本地文件main.js:70
if (fs.existsSync(file) && fs.statSync(file).size > DIAGNOSTIC_LOG_MAX_BYTES) { - 写入本地文件main.js:71
fs.renameSync(file, `${file}.prev`) - 写入本地文件main.js:76
fs.appendFileSync(file, `[${new Date().toISOString()}] ${kind}: ${detail.slice(0, 8000)}${suffix.slice(0, 4000)}\n`, 'utf8') - 读取密钥环境变量main.js:79
const HOTKEY = process.env.DSH_DESKTOP_HOTKEY || 'CommandOrControl+Shift+Space' - 读取本地文件main.js:144
if (fs.existsSync(p)) { - 读取本地文件main.js:555
try { previous = fs.readFileSync(markerPath, 'utf8').trim() } catch (_) {} - 写入本地文件main.js:562
fs.mkdirSync(DATA_DIR, { recursive: true }) - 写入本地文件main.js:563
fs.writeFileSync(markerPath, version, 'utf8') - 执行外部命令固定命令main.js:663
const result = spawnSync('netstat.exe', ['-ano', '-p', 'tcp'], { - 读取本地文件main.js:680
if (!fs.existsSync(MANAGED_SERVER_MARKER)) return null - 读取本地文件main.js:682
const marker = JSON.parse(fs.readFileSync(MANAGED_SERVER_MARKER, 'utf8')) - 删除本地文件main.js:687
fs.rmSync(MANAGED_SERVER_MARKER, { force: true }) - 写入本地文件main.js:704
fs.mkdirSync(path.dirname(MANAGED_SERVER_MARKER), { recursive: true }) - 执行外部命令固定命令main.js:719
const result = spawnSync('taskkill.exe', ['/PID', String(marker.pid), '/T', '/F'], { windowsHide: true }) - 删除本地文件main.js:725
fs.rmSync(MANAGED_SERVER_MARKER, { force: true }) - 发起网络请求main.js:735
const req = http.get(SERVER_URL, { timeout: timeoutMs }, (res) => { - 执行外部命令来自配置/变量main.js:793
const launched = spawn(process.env.ComSpec || 'cmd.exe', serverLaunchArgs(), { - 执行外部命令固定命令main.js:834
spawnSync('taskkill.exe', ['/PID', String(target.pid), '/T', '/F'], { windowsHide: true }) - 读取本地文件dsh-updater.js:60
if (!fs.existsSync(packagePath)) throw new Error(`DSH 运行时不完整:缺少 ${packagePath}`) - 读取本地文件dsh-updater.js:61
const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf8')) - 读取本地文件dsh-updater.js:74
if (!fs.existsSync(root)) return [] - 读取本地文件dsh-updater.js:77
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) { - 读取本地文件dsh-updater.js:93
const webEntry = webEntryCandidates.find((candidate) => fs.existsSync(candidate) && fs.statSync(candidate).size > 0) - 读取本地文件dsh-updater.js:97
if (fs.existsSync(recordPath)) { - 执行外部命令来自配置/变量dsh-updater.js:148
const child = spawn(executable, executableArgs, { - 写入本地文件dsh-updater.js:194
fs.mkdirSync(this.logDir, { recursive: true }) - 写入本地文件dsh-updater.js:215
fs.mkdirSync(this.logDir, { recursive: true }) - 写入本地文件dsh-updater.js:216
fs.writeFileSync(temporary, JSON.stringify(next, null, 2), 'utf8') - 写入本地文件dsh-updater.js:217
fs.renameSync(temporary, this.transactionFile) - 删除本地文件dsh-updater.js:226
fs.rmSync(this.transactionFile, { force: true }) - 写入本地文件dsh-updater.js:279
fs.mkdirSync(this.logDir, { recursive: true }) - 写入本地文件dsh-updater.js:283
fs.renameSync(this.logFile, rotated) - 读取本地文件capability-registry.js:12
try { return JSON.parse(fs.readFileSync(file, 'utf8')) } catch (_) { return fallback } - 读取本地文件capability-registry.js:23
try { text = fs.readFileSync(file, 'utf8') } catch (_) { return null } - 读取本地文件capability-registry.js:45
if (!fs.existsSync(root)) continue - 读取本地文件capability-registry.js:47
try { entries = fs.readdirSync(root, { withFileTypes: true }) } catch (_) { continue } - 读取本地文件capability-registry.js:60
const stat = fs.statSync(source) - 写入本地文件capability-registry.js:62
fs.mkdirSync(target, { recursive: true }) - 读取本地文件capability-registry.js:63
for (const entry of fs.readdirSync(source, { withFileTypes: true })) { - 写入本地文件capability-registry.js:68
fs.mkdirSync(path.dirname(target), { recursive: true }) - 写入本地文件capability-registry.js:69
fs.copyFileSync(source, target) - 写入本地文件capability-registry.js:110
if (backup) fs.renameSync(target, backup) - 删除本地文件capability-registry.js:115
if (backup) fs.rmSync(backup, { recursive: true, force: true }) - 写入本地文件capability-registry.js:141
fs.mkdirSync(path.dirname(trash), { recursive: true }) - 写入本地文件capability-registry.js:142
fs.renameSync(target, trash) - 发起网络请求github-auth.js:9
const request = https.request({ - 读取本地文件github-auth.js:47
if (!fs.existsSync(tokenFile) || !safeStorage || !safeStorage.isEncryptionAvailable()) return '' - 读取本地文件github-auth.js:49
const encrypted = fs.readFileSync(tokenFile) - 写入本地文件github-auth.js:57
fs.mkdirSync(path.dirname(tokenFile), { recursive: true }) - 写入本地文件github-auth.js:60
fs.writeFileSync(temporary, encrypted) - 写入本地文件github-auth.js:61
fs.renameSync(temporary, tokenFile) - 读取本地文件github-auth.js:128
if (fs.existsSync(tokenFile)) fs.rmSync(tokenFile, { force: true }) - 读取本地文件harness-team-adapter.js:11
supported: fs.existsSync(packageDir) && fs.existsSync(toolDir), - 读取本地文件appearance-service.js:156
try { return JSON.parse(fs.readFileSync(file, 'utf8')) } catch (_) { return fallback } - 写入本地文件appearance-service.js:160
fs.mkdirSync(path.dirname(file), { recursive: true }) - 写入本地文件appearance-service.js:162
fs.writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, 'utf8') - 写入本地文件appearance-service.js:163
fs.renameSync(temporary, file) - 读取本地文件appearance-service.js:312
if (!file || !fs.existsSync(file)) return { ...background, enabled: false, dataUrl: '' } - 读取本地文件appearance-service.js:316
return { ...background, dataUrl: `data:${mime};base64,${fs.readFileSync(file).toString('base64')}` } - 读取本地文件appearance-service.js:320
if (!fs.existsSync(themesDir)) return [] - 读取本地文件appearance-service.js:322
for (const entry of fs.readdirSync(themesDir, { withFileTypes: true })) { - 读取本地文件appearance-service.js:373
if (!fs.existsSync(sourcePath) || !fs.statSync(sourcePath).isFile()) throw new Error('背景图片不存在') - 写入本地文件appearance-service.js:378
fs.mkdirSync(backgroundsDir, { recursive: true }) - 写入本地文件appearance-service.js:382
fs.copyFileSync(sourcePath, temporary) - 写入本地文件appearance-service.js:383
try { fs.renameSync(temporary, target) } - 删除本地文件appearance-service.js:387
fs.rmSync(temporary, { force: true }) - 删除本地文件appearance-service.js:390
if (entry.isFile() && entry.name !== assetName && /^background /i.test(entry.name)) fs.rmSync(path.join(backgroundsDir, entry.name), { force: true }) - 删除本地文件appearance-service.js:401
if (entry.isFile() && /^background /i.test(entry.name)) fs.rmSync(path.join(backgroundsDir, entry.name), { force: true }) - 删除本地文件appearance-service.js:435
fs.rmSync(target, { force: true }) - 读取本地文件extension-market.js:53
const stat = fs.statSync(source) - 写入本地文件extension-market.js:55
fs.mkdirSync(target, { recursive: true }) - 读取本地文件extension-market.js:56
for (const entry of fs.readdirSync(source, { withFileTypes: true })) { - 写入本地文件extension-market.js:60
fs.mkdirSync(path.dirname(target), { recursive: true }) - 写入本地文件extension-market.js:61
fs.copyFileSync(source, target) - 执行外部命令来自配置/变量extension-market.js:74
const child = spawn(command, args, { - 发起网络请求extension-market.js:110
const request = https.get({ - 读取本地文件extension-market.js:190
try { pkg = JSON.parse(fs.readFileSync(manifest.file, 'utf8')) } catch (_) {} - 写入本地文件extension-market.js:325
fs.mkdirSync(skillDownloadRoot, { recursive:true }) - 写入本地文件extension-market.js:327
fs.mkdirSync(temporary, { recursive:true }) - 写入本地文件extension-market.js:339
fs.mkdirSync(path.dirname(target), { recursive:true }) - 读取本地文件extension-market.js:343
const text = fs.readFileSync(manifest, 'utf8') - 读取本地文件extension-market.js:349
if (fs.existsSync(temporary)) fs.rmSync(temporary, { recursive:true, force:true }) - 读取本地文件extension-market.js:356
if (fs.existsSync(target)) fs.rmSync(target, { recursive:true, force:true }) - 读取本地文件cluster-runtime.js:66
const text = fs.readFileSync(file, 'utf8') - 读取本地文件cluster-runtime.js:110
if (!fs.existsSync(preset)) throw new Error(`未找到 DSH 预设员工:${agentId}`) - 读取本地文件cluster-runtime.js:143
if (fs.existsSync(PRESETS_DIR)) { - 读取本地文件cluster-runtime.js:144
for (const entry of fs.readdirSync(PRESETS_DIR, { withFileTypes: true })) { - 读取本地文件cluster-runtime.js:185
try { text = fs.readFileSync(file, 'utf8') } catch (_) { return null } - 读取本地文件cluster-runtime.js:203
try { entries = fs.readdirSync(root, { withFileTypes: true }) } catch (_) { return [] } - 发起网络请求cluster-runtime.js:503
const response = await fetch(selected.endpoint, { - 读取本地文件cluster-store.js:79
return JSON.parse(fs.readFileSync(file, 'utf8')) - 写入本地文件cluster-store.js:82
try { fs.renameSync(file, `${file}.corrupt-${Date.now()}`) } catch (_) {} - 写入本地文件cluster-store.js:91
fs.mkdirSync(directory, { recursive: true }) - 写入本地文件cluster-store.js:100
fs.writeFileSync(descriptor, `${JSON.stringify(value, null, 2)}\n`, 'utf8') - 写入本地文件cluster-store.js:106
fs.renameSync(temporary, file) - 写入本地文件cluster-store.js:110
fs.copyFileSync(temporary, file) - 删除本地文件cluster-store.js:111
fs.unlinkSync(temporary) - 读取本地文件cluster-store.js:184
if (fs.existsSync(modern)) return readJson(modern) - 读取本地文件cluster-store.js:186
if (fs.existsSync(legacy)) return normalizeProject(readJson(legacy), null, false) - 读取本地文件cluster-store.js:192
for (const entry of fs.readdirSync(this.projectsDir, { withFileTypes: true })) { - 读取本地文件cluster-store.js:199
for (const entry of fs.readdirSync(this.clustersDir, { withFileTypes: true })) { - 读取本地文件cluster-store.js:308
if (fs.existsSync(modern)) fs.rmSync(modern, { recursive: true, force: true }) - 写入本地文件cluster-store.js:667
fs.renameSync(this.employeeFile(id), path.join(trash, 'employee.json')) - 读取本地文件cluster-acp-client.js:17
if (fs.existsSync(dotenv)) Object.assign(values, select(parseEnv(fs.readFileSync(dotenv, 'utf8')))) - 读取本地文件cluster-acp-client.js:19
if (!fs.existsSync(file)) return values - 读取本地文件cluster-acp-client.js:20
const document = parseDocument(fs.readFileSync(file, 'utf8'), { uniqueKeys: true }) - 读取本地文件cluster-acp-client.js:38
const modern = fs.existsSync(sourceBin) && sourceLoaderAvailable ? sourceBin : (fs.existsSync(builtBin) ? builtBin : '') - 读取本地文件cluster-acp-client.js:43
if (!config || (!modern && !fs.existsSync(legacy))) throw new Error('DSH 执行入口不完整,请先在更新设置中修复 DSH 运行环境') - 读取本地文件cluster-acp-client.js:94
if (!fs.existsSync(root)) return '' - 执行外部命令来自配置/变量cluster-acp-client.js:168
this.child = spawn(this.options.nodeExecutable || 'node', launch.args, { - 写入本地文件cluster-acp-client.js:384
fs.mkdirSync(options.workspace, { recursive: true }) - 写入本地文件cluster-acp-client.js:385
fs.mkdirSync(options.sessionsRoot, { recursive: true }) - 发起网络请求cluster-acp-client.js:406
await client.request('initialize', { - 发起网络请求cluster-acp-client.js:410
const created = await client.request('session/new', { - 发起网络请求cluster-acp-client.js:419
const result = await client.request('session/prompt', { - 发起网络请求capabilities.js:179
state.appearance = await api.request('setTypography', value) - 发起网络请求capabilities.js:230
const install = card.querySelector('.install'); if (install) install.addEventListener('click', async () => { await api.request('installSkill', { id:sk - 发起网络请求capabilities.js:231
const remove = card.querySelector('.remove'); if (remove) remove.addEventListener('click', async () => { if (!confirm(`把 Skill「${skill.name}」移入可恢复回收站? - 发起网络请求capabilities.js:243
card.querySelector('.apply').addEventListener('click', async () => { state.appearance = await api.request('setTheme', { themeId:theme.id }); applyThem - 发起网络请求capabilities.js:245
const remove = card.querySelector('.remove'); if (remove) remove.addEventListener('click', async () => { if (!confirm(`删除自定义主题「${theme.label}」?`)) ret - 发起网络请求capabilities.js:287
row.querySelector('.restore').addEventListener('click', async () => { if (!confirm('恢复后需要重启 Harness,继续吗?')) return; const result = await api.request(' - 写入剪贴板capabilities.js:472
byId('copy-theme-json').addEventListener('click', async () => { try { await navigator.clipboard.writeText(JSON.stringify(editorTheme(), null, 2)); toa
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 插件与Skill扩展
- 全局主题
- 可监督多智能体集群
README
由 DeepSeek 最新模型翻译生成DeepSeek-PA(DPA)
下载 Windows 版 · 安装指南 · 0.6.1 更新说明 · 反馈问题
开发者预览版 0.6.1 · Windows x64 · 已测试 DSH 0.1.5-rc.2
基于 DeepSeek Harness(DSH)构建的非官方模块化 Windows 桌面工作台。
DeepSeek-PA 将本地 DeepSeek Harness 运行时整合为一个连贯、可定制的桌面应用:把日常对话 Chat 与工具型 Agent 工作分开,提供统一的扩展与外观中心,并通过“集群”模块支持可监督的多智能体项目协作。
DPA 是基于 DeepSeek Harness 构建的独立社区项目,不是 DeepSeek 官方产品,也不会替代上游 DSH 运行时。
桌面安装包尚未内置 DSH。首次使用需要准备兼容的本地 DSH 运行时和模型凭据,详见安装指南。普通用户请下载 Release 中的安装版或便携版,不要把 GitHub 自动生成的源码压缩包当作安装包。
DPA 集群项目空间
截图均使用虚构项目和演示员工。扩展发现截图中的 75 项仓库是合成分页测试数据,不代表真实 GitHub 搜索结果或推荐目录。图片不包含个人账号、真实项目、本机路径或凭据。
展开完整文档(README 剩余 1 节)
DeepSeek-PA(DPA) 下载 Windows 版 · 安装指南 · 0.6.1 更新说明 · 反馈问题 开发者预览版 0.6.1 · Windows x64 · 已测试 DSH 0.1.5-rc.2 基于 DeepSeek Harness(DSH)构建的非官方模块化 Windows 桌面工作台。 DeepSeek-PA 将本地 DeepSeek Harness 运行时整合为一个连贯、可定制的桌面应用:把日常对话 Chat 与工具型 Agent 工作分开,提供统一的扩展与外观中心,并通过“集群”模块支持可监督的多智能体项目协作。 DPA 是基于 DeepSeek Harness 构建的独立社区项目,不是 DeepSeek 官方产品,也不会替代上游 DSH 运行时。 桌面安装包尚未内置 DSH。首次使用需要准备兼容的本地 DSH 运行时和模型凭据,详见安装指南。普通用户请下载 Release 中的安装版或便携版,不要把 GitHub 自动生成的源码压缩包当作安装包。 DPA 集群项目空间 截图均使用虚构项目和演示员工。扩展发现截图中的 75 项仓库是合成分页测试数据,不代表真实 GitHub 搜索结果或推荐目录。图片不包含个人账号、真实项目、本机路径或凭据。 0.6.1 更新内容 0.6.1 取代 0.6.0,并完整包含上一版的扩展发现、项目启动与界面改进。本安全版本将较短的 SHA-1 派生操作标识升级为更长的 SHA-256 派生标识,并加固本地 iframe 消息桥:移除通配目标,校验预期父窗口/子 frame 来源及精确本地 URL,同时用恶意 frame 回归验证已导航到不可信内容的 frame 无法调用特权 API,也收不到 DPA 外观或项目数据。 包含 0.6.0 的功能改进 - 扩展发现直接使用公开可见的 GitHub 查询,支持排序、翻页、跳页和每页 30 / 60 / 100 项;DPA 推荐与 GitHub 全站是独立来源。 - 兼容新版 DSH 凭据和 ACP 启动入口;开始项目前检查配置,启动失败持续显示原因并可重试,避免重复点击造成并发启动。 - 更新桌面导航、员工卡片、项目讨论、任务面板和输入框;审批内容独立滚动,小窗口下任务面板移到下方,保留讨论空间。 GitHub Search API 每个查询最多允许访问前 1,000 项。DPA 会展示总数和接口边界;可细化条件或打开同一 GitHub 搜索。能搜到仓库不等于该仓库兼容 DSH,安装仍需预检。 为什么开发 DPA DeepSeek Harness 提供了高度可组合的智能体运行时,而 DPA 关注的是围绕它建立完整的桌面使用体验:让不同工作方式各归其位,让非计算机专业用户也能通过界面发现和管理能力,并让多智能体执行过程变得可见、可控、可审批、可恢复。 DPA 不只是给 DSH 套一个桌面壳,“集群”也只是产品优势之一。当前产品方向包括: - Agent 与 Chat 分离: 本地 DSH Agent 负责工具调用和任务执行,普通 DeepSeek Chat 保持独立的对话空间。 - 模块化能力中心: 在一个界面中发现和管理插件、Skill、主题、字体、背景、更新、备份以及未来的 DPA 模块。 - 统一的 DPA 外观系统: 桌面外壳、集群、扩展中心共享主题、字体与背景设置;支持兼容主题导入、字号和缩放。嵌入的上游网页有单独的适配边界。 - 可监督的多智能体项目: 创建可复用员工,组建项目团队,让员工公开讨论、调用工具执行、提交证据,并由用户审批计划和成果。 - 本地优先与可恢复: 项目事件、版本、审批、工作轨迹、诊断和恢复数据优先保留在本机。 主要模块 | 模块 | 功能定位 | | Agent | 面向任务执行的本地 DSH 工作区,可使用智能体、文件、Shell、插件、工具和 Skill。 | | Chat | 与 Agent 分离的普通 DeepSeek 对话空间,避免闲聊与项目执行记录混杂。 | | 扩展中心 | GitHub 浏览、插件与 Skill 管理、主题、字体、图片背景、更新与恢复。 | | 员工中心 | 可复用员工身份,包含角色、模型、Skill、培养记录、版本和项目任命。 | | 集群项目 | 项目空间、治理策略、公开讨论、任务、决策、审批、交付和遥测。 | | 桌面外壳 | 统一导航、托盘常驻、启动恢复、安全更新封装和崩溃诊断。 | 界面展示 扩展、Skill 与主题发现 可用关键词以及 user:、topic:、language: 等条件搜索 GitHub 仓库,选择来源、排序和每页数量,也可打开同条件的 GitHub 页面。公开仓库可直接匿名浏览,无需配置账号。 0.6.1 的账号登录仍属于可选开发者配置:需要用户自行注册 GitHub OAuth App、启用 Device Flow、设置 DPA_GITHUB_CLIENT_ID,然后重启 DPA。当前授权请求包含 read:user 与 repo scope;其中 repo 明显宽于公开浏览,并可能授予私有仓库访问能力。请在 GitHub 授权页核对权限,不需要该能力时保持匿名即可。详见 Windows 安装指南。 DPA 扩展中心 分页界面演示:图中的 demo-* 仓库和数量均为合成测试数据,并非实际扩展目录。 员工设计与持续培养 员工不是一次性提示词,而是能够长期维护的智能体身份。用户可以编辑员工配置、记录培养过程、建立候选版本、考核晋升、回退版本、归档员工,并在不同项目中赋予不同职责和等级。 当前培养属于员工配置与提示词发展,尚未实现模型微调和蒸馏。 DPA 员工中心 建立项目与选择治理策略 创建项目时选择参与员工以及分级负责、协作共创或授权自治三种治理策略。治理策略只改变权限、决策和协作方式,所有项目仍然共用一致的生命周期、审批和交付逻辑。 DPA 新建项目 公开讨论与人工审批 项目聊天框只展示用户和员工围绕项目的公开讨论;工作摘要、工具调用、电脑操作、任务、决策、遥测和错误诊断进入独立视图。DPA 不展示或伪造模型的隐藏思维过程。员工的电脑访问策略可以设置为: - 逐项请求批准; - 风险托管自动执行; - 仅在项目工作区内完全访问。 实际隔离边界还取决于所使用的运行时与工具,不能将项目工作目录等同于操作系统级沙箱。 外观适用范围 DPA 外壳、集群和扩展中心共享主题、字体与图片背景设置。支持原生主题,以及受支持的 DSH / VS Code 颜色主题转换;导入配色不会复制另一款软件的布局或扩展功能。 DPA 主题与显示 嵌入的 DSH Agent 页面保留上游布局,新版 DSH 的配色注入尚未覆盖全部元素,可能出现浅色 Agent 与深色外壳并存。远程 DeepSeek Chat 保持网站自身的外观。 集群项目完整流程 1. 建立项目,填写目标并可选指定独立工作区。 2. 选择治理策略和参与项目的员工。 3. 用户在项目讨论中介绍任务、限制和期望成果。 4. 员工公开讨论方案,DPA 记录决策、职责和风险。 5. 系统整理项目计划并提交用户审批。 6. 审批通过后,员工依据权限调用 DSH 工具和 Skill 执行任务。 7. 用户可在独立视图查看任务进度、工具轨迹、电脑操作、Token 与缓存指标。 8. 完成后生成分级交付报告,区分已完成工作、讨论结论、风险以及需要用户审批的事项。 9. 用户接受成果,或退回并形成新的版本化返工任务。 稳定性与隐私 DPA 使用原子快照、追加式项目事件、有限前端缓存、幂等更新、损坏状态隔离和崩溃诊断,降低长时间运行、缓存增长或异常中断造成的数据损坏风险。 项目记录保存在本机,模型请求和 GitHub 操作会按所选服务发送相关内容。保存的 GitHub 令牌通过操作系统安全存储加密;系统安全存储不可用时,DPA 拒绝明文保存令牌。请勿将 DSH_HOME、.credentials.yaml、用户项目、日志、缓存、node_modules、构建产物或 .dpa-backups 提交到 GitHub。详见 安全说明 与 隐私说明。 当前状态 DPA 目前处于积极开发的预览阶段,源码版本为 0.6.1,本轮已测试的上游版本为 DSH 0.1.5-rc.2。不代表其他 DSH 版本已经验证兼容。 当前重点包括 DSH 版本兼容、安全更新、扩展发现、员工培养、项目治理、全局外观以及长时间高负载运行下的稳定性。 0.6.1 本地验收完成 100/100 项回归测试,其中包含操作标识和恶意 frame 安全回归,并继承 0.6.0 的打包桌面、GitHub 分页及 ACP 检查。没有据此声称完成多日压力测试或所有真实项目的完整交付,详见公开验收摘要。 下载与安装 进入 GitHub Releases,选择需要的预览版本,下载 Windows 安装版 .exe 或便携版 .zip。核对文件名中的版本,并使用 SHA256SUMS.txt 校验。如果页面尚无 0.6.1 安装文件,说明该版本尚未公开发布,可按下方步骤从源码运行。 Windows 安装指南包含 DSH 准备、凭据目录、首次启动、更新和常见错误。本预览版没有商业代码签名,Windows 可能提示“未知发布者”。 开发环境 - Windows 10/11 x64; - Node.js 22+ 与 npm; - 已准备好的本地 DeepSeek Harness 源码或运行时,以及该版本要求的包管理器(本轮测试使用 pnpm); - 通过环境变量或用户自己的 DSH 凭据文件提供模型认证。 从源码运行 npm ci $env:DSH_DESKTOP_HARNESS_DIR = 'C:\path\to\deepseek-harness' $env:DSH_DESKTOP_DSH_HOME = 'C:\path\to\your\configured-dsh-home' $env:DSH_DESKTOP_DATA_DIR = "$env:LOCALAPPDATA\DeepSeek-PA\data" npm start 请替换两个示例路径。DSH home 必须指向已配置模型凭据的数据目录;指向空目录时,不会自动继承其他目录里的凭据。 运行语法检查和自动测试: npm run check npm test npm run smoke:bridge 生成目录版桌面程序: npm run sync:app-src npm run dist:dir 构建产物不会提交到普通源码历史,安装包和便携版应通过 GitHub Releases 发布。 DPA 与 DSH 的关系 DPA 负责桌面外壳、模块导航、员工身份、集群治理、项目持久化、审批流程、外观系统、扩展发现、更新策略和恢复体验;DSH 负责底层智能体运行时、插件组合、会话和工具。 详细说明见 架构文档、开发护栏 和 更新策略。 参与项目 欢迎提交 Bug、DSH 兼容性报告、设计建议、文档改进和 Pull Request。参与前请阅读 贡献指南。DSH 本体相关问题请前往官方 DeepSeek Harness Discussions。 许可证 DPA 源代码使用 MIT License。DeepSeek Harness 和第三方依赖保留其各自许可证,详见 NOTICE.md。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ZPA76/deepseek-pa-dsh-desktop
下载 Windows 版 · 安装指南 · 0.6.1 更新说明 · 反馈问题
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目