桌面客户端
桌面客户端是员工每天面对的产品表面。它把官方 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 与模式
Section titled “Profile 与模式”| 概念 | 说明 |
|---|---|
| Profile | 一组 DSH bundle、依赖与 patch 的组合;产品固定运行 desktop profile,无托盘切换,也无 profile 选择器。自定义配置(patch)如果主动改写持久化路径,则以该 profile 自己的设置为准 |
| 高级模式 | 产品固定使用高级模式:在不改变上游 Web carrier 的前提下注入桌面自有 frame、布局与原生材质;Linux 使用标准系统窗框(无 Mica / hidden-inset),但布局仍为高级模式 |
插件变更后需重启应用,新 bundle 才会进入 Loader 组合。
对话与智能体
Section titled “对话与智能体”- 会话(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并重打包。
能力中心(Capability Hub)
Section titled “能力中心(Capability Hub)”侧边栏单入口,替代早期「技能中心 + 共享 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 等待管理员审核;可重新上传新版本 |
| 查看状态 | 「我的」分区展示自己上传内容的审核状态(审核中/已共享/未通过+原因) |
分发与信任模型
Section titled “分发与信任模型”- 市场(商城):管理员上架、按用户/部门授权后才可见可装;分级词为免费版 / 专业版(
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 布局是内存态:刷新或重启客户端后每个会话都回到折叠的默认态(切换会话则保留当前各停靠面的位置),它不是一个能跨重启保留的工作区布局。
记忆(五轨记忆)
Section titled “记忆(五轨记忆)”产品内置(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)。