openpets/packages/dsh

1.1kStar95Fork13Issue6Watching

在 DSH 编码代理运行时自动联动桌面宠物,根据代理工作状态显示思考、完成、报错或等待审批的反应气泡。

语言
TypeScript
License
MIT
分支
main
ai-agentsclaude-codecoding-agentsdesktop-companiondesktop-petdsh-pluginelectronmcp

安装

$ dsh plugin --profile web add github:alvinunreal/openpets/packages/dsh

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

把 OpenPets 桌面宠物接入 DSH 编码代理:根据代理当前是在思考、报错还是等待审批,自动让宠物显示对应的反应气泡和短句提醒,把编码过程可视化但不会泄露任何业务数据。

核心能力

  • 监听 DSH 的 agent/status 事件,把代理进入"思考中"映射为 thinking 反应,"已完成"映射为 success 反应
  • 监听 DSH 的 agent/error 事件,让宠物立刻切换到 error 反应并弹出报错提示短句
  • 监听 DSH 的 approval/request 事件,把等待用户审批的状态映射为 waiting 反应,提示"需要批准"
  • 自动派发使用本地 IPC、500 毫秒超时的客户端,不走远程通道,忽略远程环境变量
  • 内部采用预置短句池加校验,避免把代码、URL、路径或密钥混入气泡文案
  • 在错误事件后的 5 秒内抑制 success/idle 反应,避免"刚报错立刻显示完成"的视觉混乱

技术实现

  • 语言: TypeScript(ESM,包内编译产物为 dist/
  • 关键依赖: @deepseek-ai/cordis(peerDep)、@open-pets/agent-events(预置短句池与校验)、@open-pets/client(本地 IPC 客户端)
  • 架构模式: 通过 dsh.bundle.patchopenpets-dsh 这个 Cordis 插入 apply(ctx, options) 注册到宿主上下文的 agent/statusagent/errorapproval/request 三个事件钩子上;分类器只读事件分类值,由调度器异步派发,绝不阻塞宿主流程
  • 入口文件: packages/dsh/src/index.ts(导出 applyname 等,由 cordis.patch.yml 加载)

适用场景

  • DSH 用户希望让桌面宠物反映出编码代理此刻的工作状态(思考、报错、等待审批),获得更直观的"陪伴感",而不希望任何代码或提示词被外泄。
  • 不需要远程宠物控制、不希望通过 MCP 调用模型工具的轻度 DSH 用户,需要一个开箱即用、严格本地的轻量集成。
  • 想给不同 DSH profile 单独启用宠物联动,并保持与其他 OpenPets 插件/远程 MCP 配置完全解耦的场景。

前置依赖与兼容性

依赖最低版本说明
@deepseek-ai/cordis^4.0.1包以 peerDependencies 形式声明,DSH 宿主需自带此核心库
@open-pets/agent-eventsworkspace提供事件分类用预置短句池与气泡文本校验
@open-pets/clientworkspace提供本地 IPC 客户端能力
操作系统未声明客户端内部通过 @open-pets/client 走本地 IPC,可跨平台运行

源码中未声明 Node 最低版本,亦未声明平台限制。

安装方式

dsh plugin --profile web add github:alvinunreal/openpets/packages/dsh

配置项

配置类型说明默认值
本插件无需额外配置通过 dsh plugin --profile web add 安装即生效;OpenPetsDshOptions 字段(clientFactory/schedule/random/now)仅供宿主测试注入

常见问题

Q: 这个插件会被安装到 DSH 的哪里?

A: 通过 dsh plugin --profile web add 按指定的 profile 安装;要让多个 profile 都启用,就对每个 profile 分别执行同一命令。

Q: 启用后我的代码或提示词会被发给宠物吗?

A: 不会。分类器只读取事件信封里的 status 分类值,并且气泡文案只从 agent-events 里预先写好的短句池里抽一句;消息会被强制校验,不能包含 URL、文件路径、密钥等敏感内容,也不会转发任何 prompt 或 tool result。

Q: 它和 OpenPets 自带的远程 MCP 有什么关系?

A: 本插件完全本地化,使用 500 毫秒超时的本地 IPC 客户端与桌面应用通信,并在测试用例里明确忽略 OPENPETS_REMOTE_ENDPOINT/TOKEN 环境变量;远程 MCP 仍可独立配置,互不干扰。

Q: 宠物反应会卡住 DSH 吗?

A: 不会。所有分类与派发都是异步、被调度器(默认走 Promise.resolve().then)放到事件循环里执行,并由宿主测试可注入的 schedule 替换;派发异常会被静默吃掉,绝不回传到 DSH 主流程。

Q: 报错后宠物要过几秒才显示"完成",是 bug 吗?

A: 属于有意为之。源码常量 errorSuccessSuppressionMs = 5_000 会在 5 秒内抑制 success/idle 反应,让错误状态先被看见;如果不想等,可以临时关闭后端、等待、或联系作者调整阈值。

Q: 如何卸载?

A: 使用对应 profile 的 DSH bundle 移除命令即可;插件不会写入持久化文件,删除后立即失效。

上手难度

入门 — 安装命令一行即可启用,且不依赖任何外部服务、远程凭证或额外配置项,DSH 启动后宠物会自动随代理状态切换反应。

已知问题与限制

  • 暂未发现源码中标注的 TODO/FIXME/已知缺陷;runtime.test.ts 已覆盖分类映射、抑制窗口与远程变量忽略三条核心路径。
  • 行为上的固有限制(属设计而非 bug):
    • error 反应后 5 秒内的 success/idle 会被静默抑制,体感上会有"延迟"。
    • 仅支持预置的 4 类(thinking/success/error/permission)短句,无法自定义气泡文案。
    • 仅识别 agent/statusagent/errorapproval/request 三类事件,其它 DSH 事件会被分类器直接忽略。
    • 强制使用本地 IPC;若用户配置了远程 OpenPets 端点,此插件也会忽略,仅靠其他插件/CLI 处理远程通道。