open-design/packages/dsh-runtime

88.2kStar10.2kFork815Issue264Watching

Open Design 注入 dsh 的 profile,走 JSONL stdio 驱动 dsh 转发文本、思考、工具、用量,支持续接。

语言
TypeScript
License
Apache-2.0
分支
main
agent-skillsai-designbyokclaude-code-for-designclaude-designcodex-designcoding-agentscursor-design

安装

$ dsh plugin --profile web add github:nexu-io/open-design/packages/dsh-runtime

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

一句话定位

open-design-runtime 是 Open Design 注入到用户本机 DeepSeek Harness 内的 JSONL stdio 协议适配层,让 Open Design 不存凭据、不下载 dsh,就能直接驱动用户自己安装的官方 dsh CLI 完成设计生成任务。

核心能力

  • open-design profile 身份注入到 DeepSeek Harness 中,用 commander 接管启动模式(--probe / --models / --stdio 三选一)
  • 通过 stdin/stdout 上的 JSONL 帧把"execute / cancel / session / text / thinking / tool_call / tool_result / usage / result / protocol_error"等消息拼成结构化协议
  • 把 Harness 的文本、思考、工具调用、工具结果、token 用量实时转发给宿主,文本折叠忽略空 delta
  • 启动期只读探测协议兼容性与模型目录(带 provider、模型名、推理强度选项与默认项),密钥永不写入帧
  • 跨进程 cold resume:会话 ID 由 Harness 自身存储,宿主要续接只需在下次 run 提供 resume_session_id
  • 支持中途取消:在 execute 激活前收到的 cancel 会被记录并在 AbortController 初始化时立刻重放

技术实现

  • 语言: TypeScript (ESM)
  • 关键依赖:
    • @deepseek-ai/dsh-cordis 4.0.1(插件容器)
    • @deepseek-ai/dsh-cmdline 0.1.0-rc.6(命令行解析)
    • commander 15.0.0(CLI 框架)
  • 架构模式: 通过 cordis.patch.yml 把 dsh 的 system-prompt 改写为 Open Design 化身,并禁用 hmr;同时向宿主注册 open-design-startupopen-design-runtime 两个 Cordis 服务,前者定模式、后者驱动会话
  • 入口文件: packages/dsh-runtime/src/index.ts(apply)、packages/dsh-runtime/src/startup.ts(启动模式解析)、packages/dsh-runtime/src/protocol.ts(帧定义)

适用场景

已经安装并配置好 DeepSeek Harness 的用户,希望把 dsh 里的模型能力接入 Open Design,让 Open Design 统一管理 prompt、模型切换、会话续接和中途取消,同时仍然把 API Key 留在 dsh 的 Web UI 中。Open Design 不再额外存秘钥,文件由 Harness 直接写到 OD 的当前工程目录,可被 OD 既有的实时预览管道直接消费。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness0.1.0-rc.6+由用户本地安装的官方 dsh CLI 提供;本插件不附带
Node.js>=24插件自身运行时(dsh 进程内部)
平台跨平台依赖用户本机已装 dsh,README 同时给出 macOS/Linux 与 Windows 的 bootstrap 安装脚本
原生模块纯 Node stdio 协议,无 better-sqlite3 / node-pty 等原生依赖

安装方式

dsh plugin --profile web add github:nexu-io/open-design

配置项

本插件对终端用户没有独立配置项;运行期所需的 cwd、prompt、模型、推理强度等参数均由宿主(Open Design 主程序)通过 JSONL 协议逐次下发,插件自身只接受运行模式开关:

配置类型说明默认值
启动模式枚举三个开关互斥:--probe 输出协议兼容信息后退出;--models 导出模型目录后退出;--stdio 进入正式对话循环launch 时由宿主决定
取消请求协议命令收到 cancel { request_id } 时立即终止对应请求,已在 pipeline 中的请求会延迟到 execute 激活时重放

常见问题

Q: 必须先安装 DeepSeek Harness 吗?

A: 是。插件不会下载或安装 dsh 本身,需要用户先用 Open Design 提供的 bootstrap 安装脚本(macOS/Linux:curl … install-dsh.sh;Windows:irm install-dsh.ps1)把官方 dsh 装好并在 Harness 的 Web UI 里配置好模型 API Key。

Q: 我的 API Key 会保存在 Open Design 里吗?

A: 不会。Open Design 仅在 dsh 的 Web UI 中以只写方式存放凭据,Open Design 既不读取也不回写 Key 明文;运行时按需让 dsh 自己读取自己配置的秘钥。

Q: 每个设计任务都会新启一个 dsh 进程吗?

A: 是。Open Design 每次发起 run 都会启动一个短命的 dsh --profile open-design --stdio 进程;Harness 会话存储负责跨进程 cold resume,无需在 CLI 参数里带会话 ID。

Q: 跑一半想停下来怎么办?

A: 协议层支持中途取消。宿主发 cancel 命令后会立即 abort;插件在 AbortController 未初始化的窗口期也会保留请求级意图并在 execute 激活时重放。

Q: 一次进程能同时跑多个任务吗?

A: 不能。每个 profile 进程恰好接受一个 execute 命令,第二个会被 DSH_PROFILE_BUSY 拒绝;要用并发请由宿主侧开多个进程。

Q: 怎么卸载这个连接组件?

A: 通过 od agent setup deepseek-harness 或 DSH 自带的 dsh plugin --profile open-design remove 卸载即可,DSH 自己的安装、凭据、模型配置都不会被改动。

Q: 生成的文件会留在 Open Design 工程里吗?

A: 会。Harness 把文件落到 OD 当前的工程工作目录,文件监听和实时预览交给 Open Design 既有的工件管道处理。

Q: 协议握手失败会怎样?

A: 探测阶段仅打印一个 JSON 对象失败信息;Open Design 仍把 DeepSeek Harness 留在"已安装 CLI"列表里并显示"需要安装连接组件",需要用户再次确认才会通过本插件的 dsh 重装。

上手难度

进阶 — 用户需要先独立安装与配置好 DeepSeek Harness(含 API Key),并理解 Open Design 不会复制秘钥这件事;理解后只需要让 Open Design 自动发现 dsh 即可使用。

已知问题与限制

  • 每个 dsh --profile open-design --stdio 进程只接受一次 execute 命令,重复发送 command 会被 DSH_PROFILE_BUSY 拒绝(src/index.ts:422-431)
  • 进程退出有 1 秒保底回退:rc.6 在宿主 stdin 仍打开时可能让 root 释放先于 launcher 的文件 watcher 附着完成,插件会踢一个 process.exit 兜底(src/index.ts:124-135)
  • Harness 报 blocked / 无 turn_end / 已被 abort 等异常都会被规整为 DSH_PROFILE_TURN_FAILED / DSH_PROFILE_TURN_BLOCKED / DSH_PROFILE_MISSING_TURN_END 错误码,宿主需要在 UI 层提示用户重试
  • 插件自身不携带 dsh 可执行文件、Node.js、凭据或 provider 配置,缺少其中任意一项都需要用户在另一侧补齐