Muse Code for DeepSeek Harness

前言

DeepSeek Harness(DSH)通过插件机制扩展能力。在开发智能体时,经常需要在对话中调用外部代码工具,并希望工具与当前对话共享上下文。Muse Code 是 Meta 提供的代码执行环境,提供模型、会话、审批与沙箱等能力。但 Muse Code 原生需要独立启动,与 DSH 的对话流程割裂。felixjiashengfu/dsh-muse-code 插件将 Muse Code 集成到 DSH 客户端侧:通过输入框左侧的开关控制右侧边栏面板,聊天工具与面板共享同一会话,并在本地实现花费护栏。

插件定位

  • 名称:dsh-muse-code
  • 维护者:FelixJiashengFu
  • 分类:客户端
  • 简介:在 DeepSeek Harness 中打开 Muse Code 右侧面板,与聊天共享会话,默认 $10 硬性花费上限

安装与启用

安装前请确保本机已安装并登录 Muse Code CLI(见 README 依赖说明)。在 DSH 中打开「插件 → 添加插件」,在输入框中填包名并点击「安装」,随后点击「立即启用」:

dsh-muse-code

也可以直接填 GitHub 仓库地址:

https://github.com/FelixJiashengFu/dsh-muse-code

安装后输入框左侧会出现「Muse」开关。若连接 npm 官方源困难,可在「安装源」中选中国大陆镜像源后再填包名。

工作方式

插件通过以下架构实现集成:

  • 浏览器侧:监听输入框左侧开关(conversation.input.left),在右侧边栏注册 Muse Code 标签页(sidebar.right.pane.tab),通过 SSE 接收事件流。
  • Host 侧:启动一个 muse serve 子进程(MSP schema v1),通过 NDJSON JSON-RPC 与 Muse 通信。聊天工具(muse_open / muse_prompt / muse_read / muse_status / muse_interrupt)与面板共享同一会话状态。

Host 侧只启动一个 muse serve 进程和一个 MSP 会话;面板与聊天工具读写的是同一份状态。面板使用原生右侧边栏(ctx.sidebarRightTabs.register 注册 tab 类型 + sidebar.right.pane.tab 注册内容槽),不是 iframe。

审批与提问只能由用户在面板中决定,聊天工具只能读取待办列表。

开关与工作区

  • 关闭:发送 session/leave 并结束 muse serve 子进程;聊天工具随后会提示先打开开关。关闭不会删除 Muse 自己的会话日志。
  • 开启:读取 %LOCALAPPDATA%\Programs\muse\.muse-version,定位 muse-bin-<version>.exe(绕过 launcher 的在线更新检查),以 serve --provider meta --trust-workspace 启动;然后在工作区根目录执行 session/start(审批模式 onRequest)。用户开启「无沙箱模式」时,spawn 追加 --disable-sandbox。
  • 工作区:优先取发起操作的 DSH 会话的项目目录(聊天工具用当前 agent 的目录;面板开关用 slot 提供的 sessionId,取不到时退回当前工作目录),并记入状态文件;重启插件后按记住的目录恢复。第一个打开 Muse 的 DSH 会话决定工作区,之后的会话沿用。
  • 状态文件:~/.dsh/muse-code.json,内容包含 { enabled, disableSandbox, workspace }。插件重载后按它恢复开关与无沙箱选项。

花费上限与护栏

每次 Muse 会话受一个本地花费护栏约束,默认上限为 $10,达到后自动强制停止,之后不再发起任何模型调用。护栏保证的是「最坏情况」,不是账单读数。

  • 计价来源:Muse CLI 自带的模型价格目录(~/.local/share/muse/model-catalog/*.json,按 mtimeMs 取最新一份),每个模型有 input / output / cached 单价(USD / 1M tokens)、context_limit、output_limit。
  • 最坏成本预留:一次调用最多花费
    R = context_limit × input单价 / 1e6 + output_limit × output单价 / 1e6
    (上下文窗口和输出上限是硬上限,所以单次调用不可能超过 R)。每次调用完成后(MSP session/tokenUsage)记录花费;只要 已花费 + R > 上限 就立即锁定。
  • 未知模型:目录里查不到或该行没有 cost 时,用目录中最贵的价格计算本地成本与预留。
  • 面板显示:面板顶部花费栏实时显示 花费 / 上限、剩余、进度条(剩余不足 20% 变琥珀色)、当前安全预留 R,以及锁定原因与解锁表单。

锁定与解锁

锁定后(locked=true 已同步落盘):

  1. 尽力 turn/interrupt,再 session/leave 并结束 muse serve 子进程;
  2. 面板开关自动关闭;prompt、打开开关、聊天工具与插件启动时的开关恢复全部拒绝;
  3. 面板出现「已触发花费上限」提示,输入框与发送按钮禁用。

解锁只有两条路,入口是面板花费栏:

  • 提高上限:输入新的美元上限(0 < cap ≤ 100000)。只有 已花费 + 当前预留 ≤ 新上限 才会真正解锁,否则保持锁定。
  • 重置花费记录:清空本地账本并解锁,保留当前上限。面板要求输入 RESET 二次确认。

HTTP 侧:GET /budget 只读,POST /budget 接受 { action: 'set-cap', capUsd } 或 { action: 'reset', confirm: true }。

账本

账本文件:~/.dsh/muse-code-spend.json(version: 1)。记录上限、锁定状态与每个 Muse 会话的花费估计:

{
  "version": 1,
  "capUsd": 10,
  "locked": false,
  "lockedCode": null,
  "lockedReason": null,
  "lockedAt": null,
  "spentUsdAtLock": null,
  "lastModelId": null,
  "catalogPath": null,
  "sessions": {
    "<sessionId>": {
      "serverUsd": 0,
      "localUsd": 0,
      "turnUsd": 0,
      "partial": false,
      "lastModelId": "muse-spark-1.3-contributor",
      "updatedAt": 0
    }
  }
}
  • 会话花费 = max(serverUsd, localUsd, turnUsd):取服务端上报的 cumulative.cost.usd、按模型目录重算的累计估计、逐回合累计的估计三者最大值。
  • 账本损坏 → 锁定(fail-closed):JSON 解析失败或 version 不认识时,坏文件改名为 muse-code-spend.json.corrupt-<时间戳> 保留,插件进入锁定态(ledger-corrupt)。
  • 目录不可用 → 只拒绝、不锁定:读不到模型目录时无法计算预留,护栏以 catalog-missing 拒绝新调用,但保持未锁定。

沙箱限制

Muse 的 shell 工具依赖沙箱。在 Windows 上,muse serve 的 initialize 始终返回 sandboxAvailability: "unavailable",导致 shell 工具直接失败:

tool failed: environment failure: sandbox enforcement unavailable:
windows_elevated setup_required: windows elevated sandbox setup has not run

muse sandbox windows check 显示各项 ready,muse exec --yolo 能正常执行命令,但故障只出现在 serve 模式。启用 --disable-sandbox 时不会产生任何 approval/requested(沙箱是唯一阻断层,禁用后等于完全放行、不逐条审批)。

因此插件默认 fail-closed,并在面板顶部显示琥珀色告警与补救命令:

muse sandbox windows check
muse sandbox windows setup

面板里有一个仅用户可点的「允许无沙箱运行(危险)」开关:开启后 spawn 追加 --disable-sandbox,面板常驻红色告警,且不会再有审批卡。该开关没有对应的聊天工具,模型无法翻转它;值持久化在状态文件里。

工具

工具 作用
muse_open 打开开关并启动/复用会话(与点击开关等价),并让面板出现在右侧边栏
muse_prompt 给 Muse 发任务(steer: true 插入当前回合)
muse_read 读取最近对话(用户、Muse 回复、工具调用、终端输出)
muse_status 会话、回合、上下文用量、花费与安全预留、沙箱状态、待审批/待回答
muse_interrupt 打断当前回合

工具只读或驱动执行;approval/decide、userInput/answer、无沙箱开关都不暴露成工具。

HTTP 路由

所有路由都挂在 /plugins/dsh-muse-code 下,且只接受回环地址(127.0.0.1 / ::1 / ::ffff:127.0.0.1),否则 403。

方法 路径 用途
GET /state 当前快照 { ok, loading, busy, snapshot }
GET /events SSE 推送(见下)
POST /enable { enabled, sessionId? } 开关
POST /prompt { text, steer?, sessionId? } 发送任务
POST /interrupt {} 停止当前回合
POST /approval { approvalId, choiceId, requirementId, feedback? }(用户)
POST /answer { userInputId, answers }(用户,一次回答全部问题)
POST /mode { mode } 会话内审批模式
POST /options { disableSandbox } 仅用户(无工具对应)
GET /budget 花费护栏快照 { ok, budget }(只读)
POST /budget { action: 'set-cap', capUsd } 或 { action: 'reset', confirm: true } 仅用户

SSE 事件(data: {"type": ...}):

snapshot · enabled · status · load · usage · budget · turn · item · delta · approval · approval-resolved · question · question-settled · prompt-ack · open-panel

(load 是会话加载态 session/statusChanged 的转发;item/delta 是流式正文。未知事件类型会被面板忽略。)

安全要求

  • 所有 POST 必须同时带 content-type: application/json(缺失或不是 JSON → 415)和请求头 x-muse-code: 1(缺失 → 403)。
  • 请求带 Origin 头且不等于宿主自身 origin → 403。
  • 请求带 sec-fetch-site: cross-site → 403。
  • 请求体上限 64 KiB,超过 → 413。

已知限制

  1. 不续接旧会话:插件重载或 DSH 重启后,开关恢复为开时会新建一个 Muse 会话,而不是 session/resume;面板里的历史因此清空。Muse 自己的会话日志仍在磁盘上(museHome,默认 ~/.local/share/muse),可以用 muse resume 在 DSH 之外找回。
  2. 一个 Muse 会话被所有 DSH 会话共享:工作区在第一次打开时固定,其它 DSH 会话拿到的仍是同一个会话、同一个工作区;要换工作区只能关闭再在目标会话里打开(会开始新会话,旧 transcript 不保留)。
  3. Windows 上 serve 沙箱不可用:Muse 的 shell 工具会失败,除非用户开启无沙箱模式(等于放弃逐条审批)。
  4. 无沙箱模式没有审批:--disable-sandbox 下 Muse 不会发出 approval/requested,命令直接执行;插件仍把开关限制在面板里,但这是用户显式承担的风险。
  5. 审批/回答只能由用户操作:面板是唯一入口;聊天工具只能读取 muse_status 里的待办列表。
  6. transcript 只是本进程的内存投影:SSE 重连或刷新页面会收到当前快照,但不会重放更早的历史;插件也不做 Muse 会话列表/分页浏览。
  7. 关闭面板标签 ≠ 关闭 Muse:关掉右侧标签只是收起视图,muse serve 仍在运行;开关才是唯一的启停入口。
  8. 花费上限只管本插件:插件只约束自己启动的 muse serve;用户在终端手动运行的 muse、其它工具启动的 Muse、以及 Muse 账户在别处产生的费用都不受影响。花费是按 Muse 模型目录价格估算的(服务端 cost.usd 也参与取最大值),与真实账单可能有偏差。
  9. 锁定后必须手动解锁:cap-reached / safety-margin / ledger-corrupt 会持久化锁定,重启 DSH 也不会自动恢复;只有面板里的「提高上限」或「重置花费记录」能解除(重置需要输入 RESET)。

适用场景与注意

该插件适合需要在 DSH 对话中直接调用 Muse Code 的开发者。使用前请确保本机已安装并登录 Muse Code CLI,并阅读源码与许可证。插件以当前 dsh 进程权限运行,安装前建议检查源码与许可证。

总结

felixjiashengfu/dsh-muse-code 将 Meta 的 Muse Code 集成到 DeepSeek Harness 客户端侧,通过开关控制右侧面板,与聊天共享会话,并提供本地花费护栏与沙箱限制控制。安装命令为 dsh-muse-code,安装后可在 DSH 插件目录页查看更多详情:
https://www.skillhub.cn/plugins/FelixJiashengFu/dsh-muse-code

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜