🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

多智能体桌面工作台 ZPA76/deepseek-pa-dsh-desktop

DeepSeek Harness
ZPA7632 天前有提交已提供中文文档扫描:含敏感能力

下载 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
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 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。
预览分享卡片长什么样 ↓ZPA76/deepseek-pa-dsh-desktop
分享 · DeepSeek Harness Hub
ZPA76/deepseek-pa-dsh-desktop

下载 Windows 版 · 安装指南 · 0.6.1 更新说明 · 反馈问题

这是你的仓库?认领条目

回到顶部