🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话环境选择器 beihzb/dsh-envsel

DeepSeek Harnessv0.3.0
beihzb3 天前有提交已提供中文文档扫描:未发现敏感能力

DeepSeek HarnessDSH的会话环境选择器。按语言槽位 —— Python、R、CLI 工具 ——…

32.7/100
综合分
4
GitHub 星标
124
npm 周下载
—/5
用户评分

数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @beihaizb/dsh-envsel
npm 源 · @beihaizb/dsh-envsel 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · dev
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@beihaizb/dsh-envsel @ 0.3.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/21 17:44:55

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-session@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-commands@deepseek-ai/dsh-fs
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 按会话切换环境
  • 环境来源可自定义

DeepSeek Harness 的按会话环境选择器:Python / R / CLI 槽位可来自 conda、独立 R、WSL 或自定义路径,通过 /env、session_env、DSH_ENV_* 事实和顶部下拉菜单切换。

v0.3.12026-10-31
· dsh-envsel v0.3.1 每轮运行时上下文多一条:选中的 Python 环境里如果也带了 R,就说明这一点。 · 为什么 conda 环境经常在 Python 旁边带一份 R——用 r-base 装的 scRNAv2 环境,/Scripts/Rscript.exe 就紧挨着 /python.exe。envsel 早就检测到了(每个 conda 目录条目都含 rscript,这样的环境也能进 R 槽位),但运行时块只描述 R 槽位。于是当 python = scRNAv2、r = R-4.5.1 时,模型只看到一个 R 安装,完全不知道你让它跑 Python 的那个环境里还装着另一个配置不同的 R。 · 改了什么 Python 块末尾现在多一行: · This environment also provides R: C:\Users\\.conda\envs\scRNAv2\Scripts\Rscript.exe 规则: · 只在选中的 Python 条目确实带 rscript 时输出; · 输出时沿用 R 槽位那套 rscriptCommand/rscript 偏好(所以 WSL 条目会显示它的 wsl.exe -d … -- … 调用); · R 槽位指向同一安装前缀时不输出——一个环境同时占两个槽位时不会重复; · R 槽位是另一个安装时照常输出,而这正是值得提醒的情况。 其余不变:选择解析一样,委托给子代理时的继承一样,shell 信息一样,顶部下拉菜单一样。这只是渲染改动——没有新增 DSH API,兼容矩阵不受影响(块本身仍需 DSH 0.2.0-rc.1+,在 0.1.7-rc.1+ 上仍能加载)。 · 验证 · pnpm run typecheck 通过。 · 40/40 单元测试通过(新增 4 个):带 rscript 的 conda 环境出现 R 行,不带时不出现,两个槽位共用同一安装时不出现,不同时重新出现。
v0.3.02026-10-10
· v0.3.0 现在选中的环境会以文本形式送到模型面前。envsel 把会话的环境渲染进 DSH 每轮的运行时上下文;会话自己没有选中任何环境时——每个被委派的子代理都是这样——就继承它向上追溯到的最近一个做过选择的会话。 · 为什么之前选中项不总被用上 在此之前,插件只有两种方式把选中项送到模型面前,而这两种方式都没把它说清楚: | 通道 | 模型拿到什么 | | --- | --- | | shellEnv 贡献项 | DSH_ENV_PYTHON / DSH_ENV_RSCRIPT / DSH_ENV_CLI_PREFIX,只在 shell 调用自己的环境里 | | session_env 工具、/env 命令 | 什么都没有,除非模型想到去问 | selectionContext() 这个函数会写出「Session Python env (user-selected): scRNAv2 (conda). Use it for all Python work in this session: C:\…\python.exe」这句话,它定义了、导出了,却从没被调用。这个仓库里没有任何代码把它渲染到任何地方,README 也把这点列为已知限制(「选中项不会渲染进模型的系统提示词」)。 看得见的后果:shell 调用里要 $env:DSH_ENV_PYTHON 时能拿到正确的环境,但只是跑 python script.py 的 shell 调用,跑的是 PATH 上排第一的那个——所以能不能守规矩,全看模型记不记得去查,而它经常不记得。 DSH 0.2.0-rc.1 去掉了之前绕不过去的障碍:assembleContextFor(agent, signal) 现在返回 { agent, scope: agent, signal },dsh-system-prompt 用 entry.text(context) 配合这个对象来求值上下文条目——按会话的选中项终于能渲染了。所以这个版本要渲染这块内容就得 0.2.0-rc.1,但在 0.1.7-rc 上照样能加载、能工作(只是没有这块内容)。 · 改动 · 运行时上下文块。注册 systemPrompt.context({ name: 'envsel:session-environment', order: 130, text }),它的服务商解析正在组装上下文的智能体的会话,并渲染选中项。选中项为空时渲染 '',所以什么都没选的会话不加块,也不会反复改动持久快照。 · 沿委派链继承。查找时先用会话自己的条目,否则沿 SessionHeader.parentSession 往上找最近一个选过东西的会话。DSH 给每个被委派的子代理单独一个会话(origin: 'subagent'、depth: 1、parentSession: ),所以子代理以前解析出来是空的——每次被委派的 shell 调用都悄悄跑了宿主机默认环境。向上查找有上限(MAX_INHERIT_HOPS = 8),找不到就返回空选中项,遇到血缘成环会终止。 · 新增 registerContext 配置键(默认 true),用来关掉这个块。 · 没有新增依赖。宿主服务通过一个两字段的结构类型和 ctx.inject(['systemPrompt'], …) 访问;服务或其绑定不存在时跳过贡献。dsh-system-prompt 随 dsh-base 一起发布,所以没有新增 peer。 · session_env 工具的描述现在写明:选中项会在运行时上下文里重述,子代理会从父会话继承。 · README(英文 / 中文):新增 Features 条目、0.3.0 兼容性行、registerContext 配置行、How it stores selections 下的继承段落,并替换掉过时的「没有运行时上下文文本」限制。 · 验证 · pnpm run typecheck(针对 DSH 0.2.0-rc.2 类型跑 tsc)和 pnpm run build(tsc + tsdown)通过。 · pnpm test:36 个测试,36 个通过——新增 13 个,覆盖解析顺序(自己的条目优先、直接父级、跳过未选中的中间层、最近的祖先优先)、空的情况、跳数上限和成环终止;另外还覆盖 python / R / CLI 三个槽位渲染出的运行时上下文文本。resolveSelection 被抽成纯函数,正是为了不用宿主也能测解析顺序。 · lib/index.js 已重新构建并重新发布;lib/client.js 与 0.2.0 逐字节相同(tsdown 每次构建都会重写 CSS 模块的键顺序,所以是还原而不是
v0.2.02026-10-09
· v0.2.0 放行 DSH 0.2.0-rc 系列,插件在 0.2.x 运行时上启动时不再被跳过。 · 原因 DSH 拒绝启动插件包,只要它的 @deepseek-ai/dsh* peer 范围排除了当前运行的运行时——它会打印 dsh: skipping profile bundle "@beihaizb/dsh-envsel": Error: Plugin @beihaizb/dsh-envsel@0.1.6 is incompatible with dsh 0.2.0-rc.2: peerDependencies {...}. ... Exact-version exemption: not active. 然后加载配置档的其余部分,跳过这个包。18 个 @deepseek-ai/dsh-* peer 全都锁在 ^0.1.7-rc.1,上界是 <0.2.0,所以 0.2.x 运行时被拒。这道关卡不是新加的——和 DSH 在 0.1.7 系列上用的是同一条规则。 · 改动 · peerDependencies 和 devDependencies:每个 @deepseek-ai/dsh-* 条目现在都是 ^0.1.7-rc.1 || ^0.2.0-rc.1,放行 0.1.7-rc.2、0.2.0-rc.1、0.2.0-rc.2 和 0.2.1-alpha.2。 · 源码没改。插件用到的接缝在两个系列之间没变;发布的 lib/ 和 0.1.6 完全一致。 · README(英文 / 中文):Requirements、版本兼容表(新增 0.2.0 行)和 peer 边界说明现在都覆盖两个系列。早先的 Requirements 文字声称只提升了 Typert peer,而「其余 peer 保持在 ^0.1.0-rc.7」——自 0.1.7 升级后这句就过时了,这里一并修正。 · 安装 dsh plugin --profile web add @beihaizb/dsh-envsel@0.2.0 然后重启 dsh web。 版本锁定:如果发布后很快安装,pnpm 的供应链策略(minimumReleaseAge)可能跳过刚发布的版本,装成旧版。按上面的写法显式锁定版本,或者等发布超过策略窗口后用 @latest。 · 验证 · 用 DSH 自己的规则(@deepseek-ai/dsh-app-boot/lib/index.js:286-313)和真实 semver 重放了启动兼容关卡:0.1.7-rc.2 / 0.2.0-rc.1 / 0.2.0-rc.2 / 0.2.1-alpha.2 全部通过,本仓库的 manifest 和已安装副本都通过。 · pnpm run build(tsc 类型检查 + tsdown)通过;重建的包和已提交的包只在 CSS 模块类名键的输出顺序上不同,所以已提交的产物保持原样。 · 在 DSH 0.1.7-rc.2 上此前已验证过插件(含头部下拉菜单)。0.2.0-rc 系列由 peer 范围放行;在 0.2.0-rc.2 上对头部下拉菜单做运行时检查是本次发布的后续步骤。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-envsel DeepSeek Harness(DSH)的会话环境选择器。按语言槽位 —— Python、R、CLI 工具 —— 每个槽位各持有一个来自 conda、独立 R 安装、WSL 发行版或手动固定路径的首选环境。选择按会话隔离、重启后保留,并从下一轮起对模型生效。 这是一个独立的、可通过 npm 安装的 DSH 插件。用 dsh plugin add 安装即可 —— 无需打源码补丁,也无需 monorepo 检出。 功能 - /env 命令 —— 在对话中查看、设置、清空和列出环境。 - session_env 模型工具 —— 智能体可以自行列出、选择、固定和取消固定环境。 - 每轮运行时上下文块 —— 每一轮都会把当前选择写进模型的运行时上下文,模型因此能直接读到本会话用的是哪个环境,而不必「想起来去问」。自身没有选择的会话(例如被派出的子代理)会继承它向上最近的那个有选择的会话。 - 说明 conda 环境自带的 R —— 当选中的 Python 环境同时自带 Rscript 时,运行时上下文会补一行(- This environment also provides R: …)。conda 环境经常在 Python 旁边装 R,没有这一行时模型只看得到 R 槽位,可能把两个不同的 R 安装混用。若 R 槽位指向同一个安装则不重复输出。
展开完整文档(README 剩余 1 节)
dsh-envsel

DeepSeek Harness(DSH)的会话环境选择器。按语言槽位 —— Python、R、CLI 工具 —— 每个槽位各持有一个来自 conda、独立 R 安装、WSL 发行版或手动固定路径的首选环境。选择按会话隔离、重启后保留,并从下一轮起对模型生效。

这是一个独立的、可通过 npm 安装的 DSH 插件。用 dsh plugin add 安装即可 —— 无需打源码补丁,也无需 monorepo 检出。

功能

- /env 命令 —— 在对话中查看、设置、清空和列出环境。
- session_env 模型工具 —— 智能体可以自行列出、选择、固定和取消固定环境。
- 每轮运行时上下文块 —— 每一轮都会把当前选择写进模型的运行时上下文,模型因此能直接读到本会话用的是哪个环境,而不必「想起来去问」。自身没有选择的会话(例如被派出的子代理)会继承它向上最近的那个有选择的会话。
- 说明 conda 环境自带的 R —— 当选中的 Python 环境同时自带 Rscript 时,运行时上下文会补一行(- This environment also provides R: …)。conda 环境经常在 Python 旁边装 R,没有这一行时模型只看得到 R 槽位,可能把两个不同的 R 安装混用。若 R 槽位指向同一个安装则不重复输出。
- DSH_ENV_ shell 事实 —— 每次 shell 调用都会看到会话所选环境的 DSH_ENV_PYTHON、DSH_ENV_RSCRIPT、DSH_ENV_CLI_PREFIX。
- 头部下拉框 —— 会话头部提供按语言(Python / R / CLI 工具)选择的面板,并带「添加路径」表单,可固定任意解释器或安装目录。
- 跨平台发现 —— conda 环境、独立 R(Windows Program Files、macOS 框架 + Homebrew、Linux /opt/R)、Windows 上的 WSL 发行版,以及手动固定的路径。WSL 扫描在非 Windows 主机上自动跳过。
- 中英双语 UI —— 产品文案(/env 命令、头部下拉框、发现警告)跟随 DSH 界面语言:默认英文,当 DSH 语言偏好设为中文时显示中文。

环境要求

- DeepSeek Harness 0.1.7-rc.1 或更新版本(web profile),现在也覆盖 0.2.0-rc 线:所有 @deepseek-ai/dsh- peer 都声明为 ^0.1.7-rc.1 || ^0.2.0-rc.1。已在 0.1.7-rc.2 上验证;该区间同时接纳 0.2.0-rc.1、0.2.0-rc.2 与 0.2.1-alpha.2。DSH 会跳过 @deepseek-ai/dsh peer 区间不包含当前运行版本的插件 bundle——决定插件能否加载的是这个区间,而不是运行时的版本探测。
- PATH 上有 pnpm(dsh plugin 会用到)。

DSH 版本兼容性

| 插件 | DeepSeek Harness | 原因 |
| 0.3.1 | 0.2.0-rc.1 或更新版本才有运行时上下文块;在 0.1.7-rc.1+ 上仍可加载,只是没有该块 | 新增「- This environment also provides R: …」一行:选中的 conda Python 环境若自带 Rscript,现在会被说明,而不是在 R 槽位旁边变得隐形。纯渲染改动,不依赖新的 DSH API。 |
| 0.3.0 | 0.2.0-rc.1 或更新版本才有运行时上下文块;在 0.1.7-rc.1+ 上仍可加载,只是没有该块 | 把选择渲染进每轮运行时上下文,并让自身没有选择的会话继承向上最近的有选择的会话,因此被派出的子代理能沿用父会话的环境。该块通过 systemPrompt.context() 贡献,其文本提供者会收到组装中的 agent(AssembleContext.agent)——这个绑定是 DSH 0.2.0-rc.1 才提供的。 |
| 0.2.0 | 0.1.7-rc.1 或更新版本(0.1.7-rc 与 0.2.0-rc 两条线) | 覆盖 DSH 0.2.0-rc:18 个 @deepseek-ai/dsh- peer 现在都接纳 ^0.2.0-rc.1,启动期的兼容性门禁不再跳过整个 bundle。此前它们仍钉在 ^0.1.7-rc.1,其上界 <0.2.0 会拒绝 0.2.x 运行时。 |
| 0.1.6 | 0.1.7-rc.1 或更新版本 | 修复 0.1.7 上的头部下拉框:该版本改了 UI 图标命名(IconCheckOutline14 改为 IconCheckOutlineRegular),0.1.5 的按钮因此渲染出 undefined 元素、该 slot 条目崩溃。 |
| 0.1.5 | 0.1.7-rc.1 或更新版本 | 发射带 create() 工厂的 strict Typert codec,该契约由 0.1.7-rc.1 引入。宿主侧(/env、session_env、DSH_ENV_)可用;头部下拉框不可用。 |
| 0.1.3 及更早(已发布) | 0.1.0-rc.7 至 0.1.5-rc.x | 发射这些 loader 所校验的即刻构造 schema 实例。 |

DSH 在 0.1.7-rc.1 改了 strict codec 契约:dsh-typert-loader 与 dsh-typert-registry(宿主端和浏览器端)要求 typeof codec.create === 'function',且不再校验即刻构造的 schema 字段。因此只带 schema 的 codec 在 0.1.7-rc.1 及更新版本上加载失败,只带 create() 的 codec 在 0.1.0-rc.x 上加载失败,两代无法共用同一份产物。本版本只针对新契约;在旧版 DSH 上请改装该线最后一个已发布版本(v0.1.4 打了标签但从未发布到 npm):

dsh plugin --profile web add @beihaizb/dsh-envsel@0.1.3

本包中每个生成的 codec 都经 strictCodec()(src/strict-codec.ts)发射,契约只有一个改动点。

安装

dsh plugin --profile web add @beihaizb/dsh-envsel

重启 dsh web,打开一个已有会话,对话头部就会出现 Env 下拉框;/env 和 session_env 立即可用。

从本地检出安装:

dsh plugin --profile web add "file:/绝对/路径/到/本仓库"

使用

/env 命令

/env 查看当前选择 /env python=mycondaenv 设置 Python 槽位(conda 名 / 独立R名 / wsl:发行版:名 / custom:名) /env r=R-latest 设置 R 槽位 /env cli=base 设置 CLI 槽位(PATH 前缀) /env python= 清空某个槽位 /env list [过滤词] 列出所有可发现的环境 /env add <路径> 把解释器或安装目录记入本机缓存 /env unpin custom:<名> 移除一条固定路径 /env clear 清空全部选择 /env wsl 重新扫描 WSL 发行版(仅 Windows)

session_env 工具

智能体可以用 action=list|get|set|pin|unpin 自行管理选择。

头部下拉框

会话头部的 Env 按钮会打开按语言分类的下拉面板。目录在首次打开时惰性扫描(探测 conda 和 WSL 需要几秒)。「添加路径」可把任意绝对解释器或安装路径固定进本机缓存。

配置

插件无需任何配置即可工作。可选的在 profile 的 cordis.patch.yml 中给 envsel 行加 config:

| 键 | 默认值 | 含义 |
| listTtlMs | 300000 | 目录缓存 TTL(毫秒)。 |
| condaCommand | conda | conda 可执行文件名或绝对路径。 |
| standaloneRRoots | [] | 在平台默认值之后额外扫描的独立 R 根目录。 |
| wslEnabled | true | 是否启用 WSL 发现(仅 Windows)。 |
| registerTool | true | 是否注册 session_env 模型工具。 |
| registerContext | true | 是否把选择贡献到每轮运行时上下文(需要 DSH 0.2.0-rc.1 或更新版本;没有该绑定的宿主不会渲染任何内容)。 |
| probeTimeoutMs | 20000 | 每次探测的看门狗超时(毫秒)。 |

示例:

在你的 profile 的 cordis.patch.yml 中,位于 bundle 层之后
- id: envsel
name: '@beihaizb/dsh-envsel'
config:
wslEnabled: false
registerTool: true

选择如何存储

选择保存在本机 JSON 存储($DSH_HOME/envsel-state.json,按会话 id 键控)中 —— 而不是会话事件日志。harness 的 session-persistence 读取器会拒绝包含未知事件类型的日志(除非事件标记为可忽略),而 Session.append 没有为下游插件提供设置该标记的途径。把选择变更写进日志会让该会话在重启后无法读取,因此本插件自带独立的状态存储。

查找时优先用该会话自己的条目;没有则沿派出链(SessionHeader.parentSession)向上找最近的有选择的会话。DSH 给每个被派出的子代理分配独立会话,所以这一步决定了子代理的 shell 调用与 notebook 内核是沿用父会话选择的环境,还是悄悄退回宿主默认环境。该上行有跳数上限,整条链都没有匹配时返回空选择,遇到谱系成环也会终止。

开发

pnpm install
pnpm run build # tsc(类型)+ tsdown(lib/index.js 宿主 + lib/client.js 浏览器包)
pnpm run test # node:test 单元测试

构建产生两个产物:lib/index.js(宿主插件,从包根加载)和 lib/client.js(浏览器包,由 client-modules 扫描器根据包的 dsh.client 声明提供)。单个包可以同时是宿主行和 client 行。

已知限制

- 运行时上下文块需要 DSH 0.2.0-rc.1 或更新版本。 它通过 systemPrompt.context() 贡献,其文本提供者会收到组装中的 agent(AssembleContext.agent)——这个绑定是 DSH 0.2.0-rc.1 才加入的。在 0.1.7-rc 上该块不渲染任何内容,选择只能通过 DSH_ENV_ shell 事实以及 /env、session_env 到达模型;其余行为不变。在任何宿主上都可用 registerContext: false 关闭该块。
- peer 绑定 0.1.7-rc 与 0.2.0-rc 两条线。 插件把每个 @deepseek-ai/dsh-* peer 都声明为 ^0.1.7-rc.1 || ^0.2.0-rc.1,并已在 0.1.7-rc.2 上验证;0.2.0-rc 线由该区间覆盖。在 DSH 0.1.0-rc.7 至 0.1.5-rc.x 上请改装 @beihaizb/dsh-envsel@0.1.3(该线最后一个已发布版本);未来改变这些 API、或再次改动 Typert 产物契约的 DSH 版本,都需要插件跟版。若某条版本线不被 peer 区间接纳,请用精确版本豁免(dsh plugin allow-version 或插件管理器),不要强行安装。
- 选择不属于会话日志。 它们会在重启后保留在 envsel-state.json 中,但不会从(或由)会话日志重放。

License

MIT
预览分享卡片长什么样 ↓beihzb/dsh-envsel
分享 · DeepSeek Harness Hub
beihzb/dsh-envsel

DeepSeek HarnessDSH的会话环境选择器。按语言槽位 —— Python、R、CLI 工具 ——…

这是你的仓库?认领条目

回到顶部