dshcode/packages/bundle/base

90Star8Fork0Issue1Watching

把 dsh 全套基础能力打包成 profile 组合包,作为每个 profile 的第一层 patch,承载模型、工具、沙箱、权限、会话持久化等 60+ 基础行。

语言
TypeScript
License
MIT
分支
master
agentdeepseekdeepseekharness-plugindsh-pluginharness

安装

$ dsh plugin --profile web add github:whitelonng/dshcode/packages/bundle/base

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

入口包名:@deepseek-ai/dsh-base,落地页 ID:whitelonng/dshcode/packages/bundle/base。下文统称"基础组合包"。

一句话定位

它是 dsh 出厂 profile 的"第一层 patch"——把模型、Agent、工具、沙箱、权限、会话持久化、遥测、subagent 等 60 多个基础插件一并注入到空 profile 的根上,相当于浏览器的出厂默认扩展集合;其他模式组合包和用户配置都在它之上叠加或按行覆盖。

核心能力

  • 引入 LLM 适配器(DeepSeek 原生 + pi-ai 多 provider 桥)和默认模型选择(agent-default-model 默认 deepseek-official / deepseek-v4-flash)
  • 挂载 Agent 主循环(agent / agent-loop / agent-default-model / agent-instructions / system-prompt),奠定任务派发骨架
  • 暴露基础工具:bash/pwsh(按平台二选一)、fs、fs-search、str-replace-editor、web_search、todo、subagent、subagent-fork、subagent-control、subagent-report、workflow、goal、skill、ralph、jobs 等
  • 装配持久化与会话管理:JSONL 会话日志(写到 $DSH_HOME/sessions)、SQLite 会话索引(默认内存模式、关闭内容搜索)、内存型 attachment 字节仓库、checkpoint 策略与 projection
  • 启用文件沙箱、权限策略与审批开关,默认 workspace-write + ask,提供 read-only / workspace-write / danger-full-access 三档预设
  • 提供本地凭据与设置($DSH_HOME/.credentials.yaml + $DSH_HOME/settings.yaml,hot-reload)以及 OTLP 遥测挂载(默认关闭)

技术实现

  • 语言: TypeScript,但运行时是配置型——本包 src/index.ts 仅导出 {},没有运行时 API,所有行为由 cordis.patch.yml 描述
  • 关键依赖: @deepseek-ai/dsh-llm@deepseek-ai/dsh-agent@deepseek-ai/dsh-tools@deepseek-ai/dsh-session-persistence-jsonl(任列 4 即可,详见 package.json:41-119
  • 架构模式: 通过 package.json#dsh.bundle.patch manifest 字段声明 patch 路径,profile 组合器解析加载,没有任何 Cordis 钩子或事件注册
  • 入口文件: src/index.ts(仅声明 @module)、cordis.patch.yml(实质内容)、src/invariant.ts(一条空 invariant companion)

适用场景

每个出厂的 dsh profile(包括 headless、ACP、CLI、Web)都需要这一层作为开箱可用的能力底座;它不是给普通用户"按需启用"的扩展,而是所有上层 profile 拼装的前置条件。当用户想了解自己 profile 里那些默认能用、不能关的工具和默认值由谁决定时,看这一层的 patch 文件即可。

前置依赖与兼容性

依赖最低版本说明
DSH未单独声明(仓库未发布 < dsh-base 的下限)作为 dsh 同源 profile 组合包安装使用
Node^22.19.0 || >=24.0.0源自仓库根 package.json:8-10 的 engines 字段
平台macOS / Linux / Windows同一份 patch,bash 与 pwsh 工具栈按平台互斥挂载
原生模块本包自身不引入原生模块,依赖闭包内某些 row 可能依赖

安装此包会自动引入 70+ 个 workspace 依赖(详见 package.json:41-119),包括 LLM、agent、工具、持久化、subagent、shell 等多个核心包。

安装方式

dsh plugin --profile web add github:whitelonng/dshcode/packages/bundle/base

配置项

本包没有"用户态"配置项;它定义的 50+ 行 row config 是给后续 profile 覆盖使用的默认值。常见的可被外部环境变量覆盖的行:

行 / 环境变量默认值说明
sandbox-policy.mode(环境变量 DSH_PERMISSION_MODEworkspace-write三档:read-only / workspace-write / danger-full-access
approval.policy(环境变量同上)ask(在 danger-full-access 下为 never受 sandbox-policy 行同源取值驱动
session-telemetry-otel.mode(环境变量 DSH_TELEMETRY_MODEDISABLED设为 FULL / FEEDBACK_ONLY 开启 OTLP 上报
session-telemetry-otel.exporter.url(环境变量 DSH_TELEMETRY_OTLP_URLhttps://harness-telemetry.deepseeksvc.com/v1/logsOTLP/HTTP 上报端点,可指向自建收集器
agent-default-model.provider / .modeldeepseek-official / deepseek-v4-flash默认模型选择,可被 user profile 覆盖
session-query-sqlite.openAtnever全文搜索默认关闭,开启需覆盖为 first-searchstartup,通常附带 path

DSH_TELEMETRY_DISABLED 只要非空(含 '0'/'false')就完全关闭遥测;launcher 在启动时直接 disable 该 row。

常见问题

Q: 这个组合包包含哪些能力?

A: 它汇集了 dsh 的全部"出厂自带"能力——LLM 适配器、Agent 主循环、bash 与 pwsh 工具、文件系统工具、subagent 派发与 fork、会话 JSONL 持久化、SQLite 会话索引、权限与沙箱策略、本地设置/凭据、OTLP 遥测、token 用量、压缩、计划模式、目标(goal)循环、Web 搜索等。

Q: 我可以编辑这个组合包吗?

A: 不需要也不建议。它的"配置"集中在同一份 cordis.patch.yml,由 profile 组合器在加载时挂入;你的覆盖应该写在自己 profile 的 cordis.patch.yml 里,按 row 的 id 整行覆盖即可。patch 的语义是"替换整行 config",没有深度合并。

Q: macOS / Linux 和 Windows 下行为有什么不同?

A: bash 与 pwsh 两套 shell 栈在同一份 patch 文件里互斥挂载。POSIX 上启用 bash-sandbox 与 tool-bash、禁用 pwsh 系列;Windows 上启用 pwsh 系列、禁用 bash 系列。沙箱、权限和 fs-sandbox 两边都生效,Windows 走 ACL 受限令牌 runner。

Q: 怎么开启遥测?

A: 出厂默认关闭。要开启需要把环境变量 DSH_TELEMETRY_MODE 设为 FULLFEEDBACK_ONLY,并把 DSH_TELEMETRY_OTLP_URL 指向你的 OTLP/HTTP 收集器;导出记录会带上 $DSH_HOME/.anonymous-user-id 里的 UUID 作为 user.id

Q: 默认是哪种权限模型?

A: 沙箱默认 workspace-write(写入限于工作区与本会话临时子目录),审批默认 ask。将环境变量 DSH_PERMISSION_MODE 设为 danger-full-access 可切到全权访问与免审批;设为 read-only 则只读。

Q: 默认能全文搜索会话历史吗?

A: 不能。session-query-sqlite 行默认 path: ':memory:'openAt: 'never',全文搜索调用会返回 SESSION_QUERY_SEARCH_DISABLED;精确读取、标题与 lineage 仍可用。要启用需在 profile 覆盖里改成 first-searchstartup 并提供持久化 path

Q: 卸载它会发生什么?

A: 它是所有出厂 profile 的第一层 patch——把它从 dsh.profile.bundles 列表移除,整个 profile 会回到"仅剩用户自定义 row"的空状态,常用工具、模型、持久化都会消失。它不是面向普通用户的可选扩展,建议保留。

Q: 会话里的图片存在哪里?

A: 字节放在 attachment-local 行配置的本地目录(与 JSONL 会话日志分离)。会话日志里只保留内容寻址引用,由该 row 在每次请求时即时解析。

上手难度

入门 — 因为它没有暴露给用户的可写配置面,普通用户不需要懂它;想自定义的话只需要往自己的 cordis.patch.yml 里追加整行覆盖即可。

已知问题与限制

  • Patch 整行替换语义:profile 覆盖必须把目标行要保留的每个字段都重写一遍,没有深度合并层;README 显式列出此限制(README.md:21
  • Windows 临时目录是会话私有子目录workspace-write 把写入限制在工作区与本会话自己的 temp 子目录(<temp>\dsh-<hash>,受限子进程的 TMP/TEMP 被改写),read-only 不授予任何临时目录写入(README.md:22
  • bash 与 pwsh 恢复配方必须配对:在 Windows 上想换回 bash 需要同时禁用 pwsh-sandbox/tool-pwsh 并重新启用 bash-sandbox/tool-bash,两边都注册同一个 bash 服务,单独开一边会让加载失败
  • 全文会话搜索默认关闭session-query-sqliteopenAt: never,未在 profile 覆盖中开启前 SQL 不会打开(cordis.patch.yml:117-122
  • 遥测默认关闭session-telemetry-otel.mode 默认 DISABLED,未设 DSH_TELEMETRY_MODE 不会上报(cordis.patch.yml:148-161
dshcode/packages/bundle/base — DeepSeek Harness 插件 | deepseek-plugin.org