跳转到内容

桌面客户端

桌面客户端是员工每天面对的产品表面。它把官方 DeepSeek Harness 的本地智能体运行时装进一个原生应用:窗口、托盘、自动更新,无需安装 Node.js 或执行任何命令。

  • 原生窗口:标准桌面窗口,支持高级模式下的自有 frame、原生材质(macOS vibrancy / Windows Mica 由平台能力提供)与原生拖动区域;
  • 系统托盘:关闭窗口默认隐藏而非退出;托盘提供「打开窗口 / 检查更新 / 导出诊断 / 退出」等操作(Profile 固定为 desktop,无托盘切换入口,也无 DSH 终端项);
  • 本地 Web 端口:默认由系统随机分配(dsh-desktop.port: 0),避免端口冲突;服务只监听 127.0.0.1。若某个界面插件依赖稳定 origin(localStorage 按 origin 隔离),可在设置中固定端口;
  • 单实例:重复启动会聚焦已有实例。
概念说明
Profile一组 DSH bundle、依赖与 patch 的组合;产品固定运行 desktop profile,无托盘切换,也无 profile 选择器。自定义配置(patch)如果主动改写持久化路径,则以该 profile 自己的设置为准
高级模式产品固定使用高级模式:在不改变上游 Web carrier 的前提下注入桌面自有 frame、布局与原生材质;Linux 使用标准系统窗框(无 Mica / hidden-inset),但布局仍为高级模式

插件变更后需重启应用,新 bundle 才会进入 Loader 组合。

  • 会话(Session):每条会话独立上下文,可指定工作区(项目目录);会话列表、搜索与恢复由官方 Harness 语义提供;
  • 模型:企业版经服务端网关取模型清单(/api/client/v2/config/bootstrap),模型可用性与额度由服务端决定;
  • 上下文管理:会话可随时清除/重建上下文,执行详情与消息流按官方 UI 提供;
  • 权限审批:模型调用有风险的工具(写文件、跑命令、操作浏览器)时,按上游权限门控请求用户确认——这是「AI 只提议」的第一道闸门。

输入框右侧的麦克风按钮把说话变成输入框里的文字(默认开启,2026-09-29 决策):

  • 在本机识别:SenseVoiceSmall + Silero VAD 跑在客户端的本地子进程里,音频不出机器,不经任何云端识别服务,也没有云端回退——离线可用;
  • 模型来自哪里:默认随客户端分发(权重就在客户端目录里,装上即用、零网络、离线可用;权重本身约 230MiB,安装包增幅视平台打包格式的压缩率而定,约 +140~250 MiB);只有渠道显式关掉(desktop.speech_bundle_model: false)时才回到「首次使用下载 int8 量化模型(约 228MB,落 $DSH_HOME/speech-to-text/sensevoice)」;点麦克风后按提示进入准备面(阶段/进度/失败原因,可取消、可重试)。下载是直连的,所以”只有认证代理能出公网”的网络需要在渠道包里预置模型目录或指定内网镜像(desktop.speech_model_dir / desktop.speech_vad_path / desktop.speech_model_origin,见部署文档的渠道章节);
  • 权限:首次录音时向系统申请麦克风;只放行本应用主窗口的纯音频请求(内嵌浏览器与应用窗口各走自己的权限面,不受影响)。macOS 首次弹系统授权框;
  • 语言:中/英/日/韩/粤自动识别;
  • 边界:转写只落到输入框(可先改再发),不写入会话、不自动发送;录音最长 120 秒、单次上限 4MiB。

语音输入依赖随包的本地识别运行时(约 70MB 原生库)。关闭它的做法:从 packages/host/desktop/src/profile.ts 的必需 bundle 列表移除 @deepseek-ai/dsh-experimental-voice-input-bundle 并重打包。

侧边栏单入口,替代早期「技能中心 + 共享 Agent」三个平行面板。它回答两个问题:「有什么内容可以用?」 与 「从哪里来?」。

能力中心
├── 我的(本地创作 + 上传状态)
│ ├── 技能(本地 SKILL.md) —— 上传共享 / 重新上传 / 查看审核状态
│ └── 智能体(本地 agent preset)—— 同上
└── 市场(授权制商城 + 组织共享库合并视图)
├── 技能
└── 智能体
  • 顶部 Tab 只有「我的 / 市场」两个来源维度;「组织」来源以徽章出现在市场视图内(来源徽章:市场 / 组织 / 本地);
  • 类型筛选:全部 / 技能 / 智能体;另有搜索框;
  • 状态徽章:官方(official)/ 精选(featured) 由管理员在审批时标记,已安装 / 可更新(更新到 vX)/ 审核中 / 未通过(显示原因) 来自共享库状态机;
  • 多版本归并:同名({kind}:{name} 复合键)多版本合并为一张卡片,展开可看历史版本;市场与组织同名的内容由服务端合并为一条权威行(市场优先);
  • 分区独立错误态:一个端点失败只影响对应分区,展示「重试」,其余分区照常。
操作行为
安装从市场/组织安装技能或智能体包;若与本地同名,弹出覆盖确认框(决策:不引入 ?force=1 假设接口,仅客户端确认)
更新已安装且有更高 approved 版本时显示「更新到 vX」;同样走安装确认
卸载确认后卸载并移除本地目录。两种情形会拒绝(如实回显原因,不静默处理):① 同名内容还存在于项目/用户等更高优先级的技能根 ⇒ 422 RESIDUE,需先处理那一份;② 本地内容已被改动过 ⇒ 409 LOCAL_CONTENT,确认覆盖(?overwrite=1)后才删
上传共享把本地技能/智能体打包上传(packSkill / packPreset,归档安全校验双侧重),进入 pending 等待管理员审核;可重新上传新版本
查看状态「我的」分区展示自己上传内容的审核状态(审核中/已共享/未通过+原因)
  • 市场(商城):管理员上架、按用户/部门授权后才可见可装;分级词为免费版 / 专业版(price.tier);
  • 组织(共享库):员工上传 → pending → 管理员 approve / reject(reject 必填 reason)→ approved 后仍须授权(用户或部门)才可见可装——与商城同构的「双门制」;管理员恒可全量;
  • 本地:自己创作的技能/智能体,仅本机可见,不经过审核。

连接器把外部系统以 MCP(Model Context Protocol) 接入 Agent。当前内置:

连接器说明
销售易 NeoCRM官方 streamable-HTTP MCP(mcp.xiaoshouyi.com),RFC 8414 OAuth(授权码 + PKCE + 动态客户端注册),查询客户/线索/商机/联系人,执行 XOQL 与元数据操作
远程 MCP 示例通用远程 MCP 连接器:OAuth 2.1 + PKCE + 授权服务器元数据发现(RFC 9728 / RFC 8414)+ streamable-HTTP;端点与字段由管理员按实际服务填写(mcp.example.com 为占位值)
  • 授权走 OAuth 授权码 + PKCE(offline_access 获取刷新令牌),state 校验与 60s 超时防 CSRF;
  • 凭据本地加密存储在用户 scope 路径(0600/0700、原子写、防符号链接);连接成功后通过 ctx.plugin 动态注册 MCP,模型即可调用其工具;
  • 连接器定义可扩展(options.connectors),第三方可注册自己的 MCP def。

历史说明:产品早期的「CLI 连接器」(dws/wecom-cli/lark-cli/beisen-cli 等)已整体移除。CLI 厂商能力改由技能商店以 SKILL.md 分发,MCP 能力统一走连接器框架——这是「技能 + MCP」两种标准形态的最终架构(2026-08-26 决策)。

侧边栏「定时任务」打开任务中心。任务看板已于 v2.3.0 并入定时任务——现在只有一种任务:到点由 Host 进程执行一个智能体动作。

一个任务 = cron 表达式 + 执行内容 + 执行环境:

字段说明
名称自定义
Cron 表达式分钟级精度;预设有每天 09:00 / 每小时 / 每 10 分钟 / 每周一 09:00
执行内容(提示词)发送给智能体的任务描述
项目(工作区)默认当前项目,或指定其他工作区
执行智能体默认部署预设,或从 agent presets 中选择
权限不使用 / 只读 / 工作区可写 / 完全访问
启用可按启停
  • 到点由 Host 进程执行:关闭窗口或浏览器页面后仍会执行(应用完全退出期间错过触发默认跳过,可在设置开启「补跑最近一次」);
  • 每次执行会新建一个智能体会话(指定工作区、预设与权限),把任务提示词发给该会话;
  • 执行详情:触发时间、开始/结束时间、结果(成功/失败/已取消)、错误信息、打开的会话——可从详情直接跳到该会话继续(session jump);
  • 支持手动「立即执行」;任务可启用/停用/删除;
  • 模型可直接调用 cron_create / cron_list / cron_set_enabled / cron_run / cron_remove 工具——但用户始终可以在界面上看到并管理这些任务(AI 只提议、人决定)。
  • 启用/停用调度器(停用保留已配置任务);
  • 是否向 Agent 公告插件能力(系统提示词中声明,模型可据此协作);
  • 补跑错过的触发(默认关闭)。

Agent 驱动的内嵌浏览器位于独立浏览器窗口(2026-08-20 窗口模型):

  • 多标签:每个 tab 是一个 WebContentsView,持久化 browser partition(稳定会话存储);
  • 地址栏:工具栏提供 URL 输入框,可手动导航、后退/前进/刷新、关闭标签;
  • 控制权:只有右下角「我来操作」按钮能取得控制权;取得后同一个胶囊变成「交给 AI」, 由它交回。蒙版空白处、活动面板、Esc 都不会改变控制权 —— 避免”随手点一下就把浏览器从 AI 手里抢走”;
  • 下载管控:下载默认 100MB 上限,超限拒绝;其余下载先询问保存位置(用户确认);
  • 操作日志:op log 记录每次导航/点击/下载,可审计;
  • 关闭语义:用户关窗只是隐藏;只有 Agent 的 browser_close 才真正销毁窗口。

右侧栏由官方 ui-sidebar-right 提供(每会话一份的停靠面:可拖拽/分栏/浮动的 tab 面板,随包的引导页、工作区文件树与文档预览)。它是预览与文件底座,不含代码编辑、交互式终端或 Git 面板;产品浏览器仍从侧边栏底部「浏览器」动作进入。右栏的 tab 布局是内存态:刷新或重启客户端后每个会话都回到折叠的默认态(切换会话则保留当前各停靠面的位置),它不是一个能跨重启保留的工作区布局。

产品内置(vendored 社区插件 dsh-memory-evolve)的跨会话长期记忆:

轨道内容
用户档案用户的稳定偏好与事实
全局事实环境/项目事实(跨项目)
项目关键记忆当前项目的关键长期记忆(自动注入上下文,按 git 分支过滤)
项目日志当前项目会话日志(按需读取)
每日日志每日工作日志(按需读取)
  • 确认制:AI 提议的记忆/待办/技能全部先进待确认队列,你采纳才写入(AI 不会擅自改变自己的行为输入);
  • 可归档:主轨 ↔ 归档文件双向,低频旧事归档后不注入、可随时移回;
  • 跨会话衔接:换项目、隔天继续时直接问 AI「查一下记忆」,它检索记忆衔接上下文,不用你复述;
  • 记忆系统同时提供待办(life/work/project/daily 四轨)与技能自我进化能力(本机模式、本地存储)。
  • 设置:通用(语言/主题)、定时任务、连接器、浏览器、关于与更新等分区;
  • 账户页(企业版):当前账号、服务端地址、额度/余额(来自 /api/client/v2/auth/usage——今日/本月累计费用、剩余额度)、退出登录(退出即触发会话解除,连接器/浏览器/定时任务令牌全部清理);
  • 升级徽章:会话头部右上角显示新版本提示(蓝色圆点 + 版本号),点击即可下载;下载中显示进度;托盘菜单同步升级状态;
  • 诊断导出:托盘「导出诊断信息…」生成 diagnostics-*.zip(版本、profile、日志、env 摘要,脱敏后输出)。
  • 升级源只有一个:客户端登录的那台服务端(GET /api/client/v2/updates/manifest)。 客户端不访问更新服务器、不访问 GitHub,也不需要知道自己属于哪个渠道 —— 渠道身份由服务端在结构上决定;
  • 检查时机:启动 60 秒后首次检查,之后每 6 小时一次;托盘 Check for Updates… 与「设置 → 关于」可手动检查 (手动检查即使已是最新也显示结果,检查失败提示稍后重试);
  • 校验:清单 schema 必须为 1、channel_id 必须与服务端一致、下载地址必须绝对 https, 安装包按清单里的 SHA-256 流式校验;任何一步不通过都不安装;
  • 平台资产:Windows NSIS 安装器、macOS DMG(Apple 芯片)、Linux AppImage(x86_64)。 Linux 下载后 chmod +x 并提示用户替换当前 AppImage 后重启(AppImage 无静默自安装);
  • 失败不破坏当前版本:网络错误、非 200、非法版本或校验失败都保持静默并继续使用已安装版本; 服务端明确说”给不出下载地址”(client_unavailable)时界面会如实说明,而不是伪装成”已是最新”;
  • 未连接服务端时没有更新源:不做任何外发检查(单机使用场景);
  • 未签名说明:Windows 安装器与 Linux AppImage 未签名(macOS 正式版签名 + 公证); Windows SmartScreen 可能提示「未知发布者」。

应用固定运行 desktop profile,没有「打开 DSH 终端 / 切换 Profile / 模式切换」的托盘入口。 上游自 0.1.5 起保留该 profile 名:dsh --profile desktop 与 dsh plugin --profile desktop 都会被 CLI 直接拒绝(profile "desktop" is managed exclusively by the Electron application)。 第三方插件改由 profile 的用户补丁层加入:编辑 ~/.picoaide-harness/cordis.patch.yml, 按 Loader patch 语法追加一行(应用每次启动都会合并该层):

- insert:
- id: my-plugin
name: my-plugin-package

应用自带 DSH 依赖,不改系统全局 PATH 或 shell 配置。插件变更后需重启应用才进入 Loader 组合。

  • 应用能进托盘:右键托盘 →「导出诊断信息…」→ 生成并打开 diagnostics-*.zip;
  • 应用持续闪退:运行安装后的程序加 --export-diagnostics 参数(Windows 示例:& "$env:LOCALAPPDATA\Programs\PicoAide Harness\PicoAide Harness.exe" --export-diagnostics),该命令不启动 Host,输出诊断 ZIP 绝对路径;通过 npm 安装过桌面启动器时 dsh-desktop --export-diagnostics 同理;
  • 诊断包内容:最近日志、本地 Crashpad .dmp、当前运行标记与 system-info.txt(Desktop / Electron / Node / 平台 / 架构版本);日志对可识别凭据脱敏,但本地路径、工作区 ID、会话 ID、崩溃内存片段仍可能存在——公开上传前必须检查,敏感 dump 走可信渠道;
  • 端口固定冲突:把 dsh-desktop.port 改回 0(随机)或换空闲端口;
  • 窗口消失了:先检查系统托盘,关闭窗口不是退出;
  • 插件没有出现:确认命令作用于目标 profile(应用固定使用 desktop),并重启应用;
  • 更新没有提示:后台错误静默;用托盘手动检查查看结果;
  • 开发者调试:CDP 调试端口(9223)被残留实例占用会导致复用错误实例——排查前先 pkill 旧实例(使用 bracket 技巧避免误杀 shell)。