sandbase-harness

613Star57Fork0Issue20Watching

为 DSH 接入一个本地优先的 AI Agent 运行时,通过 stdio MCP 暴露代理、会话、产物管理能力。

语言
TypeScript
License
Apache-2.0
分支
main
agent-frameworkagent-observabilityagent-runtimeagent-sandboxai-agentsai-infrastructuredeepseekdeepseek-harness

安装

$ dsh plugin --profile web add github:sandbaseai/sandbase-harness

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

一句话定位

这个插件把 SandBase Harness 这套本地 AI Agent 运行时桥接到 DSH:通过 stdio MCP 协议,让 DSH 能像操作普通 MCP 工具一样去列出 Agent、创建持久化会话、流式发送消息、读取产物、停止运行中的任务。

核心能力

  • 在 DSH 中注册一个名为 sandbase 的 stdio MCP 客户端,自动启动 managed-agents-mcp 桥接进程
  • 暴露 6 个原生 MCP 工具:list_agentscreate_sessionrun_sessionget_sessionlist_artifactsstop_session
  • run_session 会等待流式回合结束,一次性返回组装好的文本和结束事件元数据,无需自行处理流
  • 支持 OpenAI、Anthropic 和任意 OpenAI 兼容端点(含 DeepSeek V4),由运行时统一管理模型供应商边界
  • 支持 4 种沙箱后端:Local 进程、Docker 容器、Kubernetes Pod、自托管 Worker 队列,DSH 侧不感知差异
  • 会话、产物、Memory、技能包、API Key 全部存在本地 SQLite 中,不依赖任何远程控制面

技术实现

  • 语言: TypeScript(Node.js ESM)
  • 关键依赖: @modelcontextprotocol/sdk(MCP 服务端)、hono + @hono/node-server(HTTP API)、ai + @ai-sdk/openai + @ai-sdk/anthropic(模型调用)、commander(CLI)、zod(输入校验)
  • 架构模式: 把本地 CLI/HTTP 运行时(managed-agents start)暴露的 /v1 API 用一个 stdio MCP 桥接进程封装起来,DSH 通过 Cordis bundle 把这个桥接注册为 mcp-sandbase-harness 节点,运行时与 DSH 之间通过 HTTP + Bearer Token 通信
  • 入口文件: src/index.ts(HTTP 运行时入口)、src/mcp/index.ts(stdio MCP 桥接入口),打包后对应 npm bin managed-agentsmanaged-agents-mcp

适用场景

当你想让 DSH 拥有一个"能持续跑长任务、能保存上下文、能调用工具"的本地 Agent 后端,而不只是临时的一次性模型对话时,这个插件把现有的 SandBase Harness 运行时接进来,特别适合需要沙箱隔离工具调用、需要事后审计与回放、或者要跨会话保留产物与 Memory 的场景。

前置依赖与兼容性

依赖最低版本说明
DSH未声明通过 dsh.bundle.patch 注入,未在 package.json 中声明最低 DSH 版本
Node.js>=22package.json#engines.node;bridge 进程基于 stdio MCP,运行时基于 Node 22+ 内建 HTTP
平台跨平台Node 进程本身跨平台;运行时额外依赖宿主上的 docker / kubectl CLI 是可选的(仅启用对应沙箱时需要)
node:sqliteNode 22 实验性 / Node 25+ 稳定数据库层依赖 node:sqlite,注意老版本 Node 上该模块处于实验阶段
Docker可选沙箱后端选 docker 时宿主需要 docker CLI
kubectl可选沙箱后端选 kubernetes 时宿主需要 kubectl 并能访问集群

安装方式

dsh plugin --profile web add github:sandbaseai/sandbase-harness

配置项

本插件本身没有面向用户的可配置参数;它通过 Cordis patch 在 DSH 中硬编码注册一个名为 sandbase 的 stdio MCP 客户端,桥接进程 managed-agents-mcp 在运行时通过环境变量与底层 HTTP Runtime 通信:

环境变量说明默认值
MANAGED_AGENTS_URL桥接进程要连接的运行时 HTTP 地址http://127.0.0.1:3000
MANAGED_AGENTS_API_KEY运行时开启访问认证时传入的 Bearer Token;多个 Key 用逗号分隔无(未配置则运行时按开放模式运行)
MANAGED_AGENTS_CORS_ORIGINS运行时允许的跨域来源列表(逗号分隔)
MANAGED_AGENTS_LOG_LEVEL运行时日志级别(debug / info / warn / error)info
MANAGED_AGENTS_LOG_FORMAT设为 pretty 时输出可读的开发格式普通格式
MANAGED_AGENTS_HOME覆盖运行时状态目录的根路径工作区下的 .managed-agents/
MANAGED_AGENTS_SECRET_KEY用于加密本地凭证库的主密钥未设置时按非加密处理

常见问题

Q: 安装这个插件后我需要额外启动什么服务吗?

A: 需要。插件只是把 managed-agents-mcp 桥接进程注册进 DSH Web Profile,你必须先在另一台终端用 managed-agents start 启动底层运行时(默认监听 http://127.0.0.1:3000),DSH 才能通过 MCP 工具访问到 Agent 和会话。

Q: 这个插件和 DSH 官方的 AI 能力是什么关系?

A: 它是一个独立的本地 Agent 运行时(基于 SQLite + 多沙箱后端),不是 DSH 内置模型的替代品。DSH 通过 mcp__sandbase__* 命名空间把它当作外部 MCP 服务调用,由它去调度 OpenAI、Anthropic 或任意 OpenAI 兼容端点。

Q: 会话、产物、凭证这些数据存在哪里?

A: 全部存在你 managed-agents init 时创建的工作区下的 .managed-agents/ 目录中(SQLite 文件 data.db、文件字节 files/、技能包 skills/、沙箱快照 snapshots/)。Bridge 进程不持久化任何凭证。

Q: 支持哪些模型供应商?

A: Settings V2 里配置一个活跃的模型供应商边界,覆盖 OpenAI、Anthropic 以及任何 OpenAI 兼容端点(README 中以 DeepSeek V4 为例)。Agent YAML 里指定具体模型 ID(如 gpt-4oclaude-sonnet-4-20250514openai/gpt-5.5)。

Q: 必须装 Docker 才能用吗?

A: 不是。默认 Local 沙箱就用当前操作系统用户执行命令,不依赖 Docker。只有当你在 Dashboard 里把 Environment 的沙箱后端切到 docker 或 kubernetes 时才需要 docker CLI 或 kubectl 可用。

Q: 如何卸载?

A: 先停掉 DSH,然后执行 dsh plugin --profile web remove managed-agents,即可同时移除 profile 依赖和 bundle 注入层。运行时的工作区数据不会自动删除,需要手动清理 .managed-agents/ 目录。

Q: 启动时报 "MCP startup failed" 怎么办?

A: 说明 managed-agents-mcp 不在 PATH 上。重新走一次源码构建(npm ci && npm run build:runtime)并执行 npm link,或在 DSH 启动日志里确认是否看到 mcp-sandbase-harness 节点。

上手难度

进阶 — 需要在另一台终端独立维护一个 Node 运行时并准备好至少一个模型 API Key;同时要理解 Settings V2、Environment、Sandbox Provider 等多组概念,DSH 本身只是调用入口。

已知问题与限制

  • Local 沙箱无内核级隔离:Local 后端只做了路径约束与环境变量白名单,命令仍以当前 OS 用户身份执行,不适合跑不可信代码(BACKLOG.md:27-30)
  • apps/console 存在未消化的模块拆分:当前有两条互不渲染的组件继承线,npm run typecheck 不覆盖 Console,导致 Dashboard 报 ~90 个错误;测试覆盖的是未上线的分支(BACKLOG.md:46-59)
  • Kubernetes 沙箱的活集群测试在 CI 中跳过:测试在没有可访问集群时直接 skip,目前没有机制强制运行(BACKLOG.md:32-34)
  • 流式命令输出(streamingExec)声明但未实现:能力被声明并报为"unsupported",工具结果仍以单值返回(BACKLOG.md:39-41)
  • managed-agents deploy 是 v1 占位:仅打印部署建议,不会真正推送(src/cli/program.ts:85-99)
  • Pod 被驱逐后只能以命令失败形式暴露:Provision 阶段对镜像/配置错误会快速失败,但运行期 Pod 被驱逐没有专门的处理路径(BACKLOG.md:35-37)
  • 0.2.0 起工作区状态目录变更:从 ~/.managed-agents/<name>-<hash>/ 迁移到 <workspace>/.managed-agents/,旧工作区需要手动搬移状态(CHANGELOG.md:39-47)