dsh-env-inspector-plus
Manifest valid★ 2Environment Health Check: Add a tab under Settings → Environment Health Check that displays the identity of the current DSH host process (pid / entry point / working directory / Node / uptime) and environment variable groupings (total count, DSH_ prefix group, credential shape group), with values never leaving the host; also provide the model with a read-only env_inspect tool.
dsh-env-inspector-plus
在 DSH(DeepSeek Harness)网页版「设置 → 环境体检」加一个只读分页,一眼看清当前宿主进程的处境。
同时给模型一个只读工具 env_inspect,让 AI 也能回答「现在跑在哪个目录、用哪个 profile、Node 什么版本」。
关于包名:本包是
dsh-env-inspector的重命名版本 —— npm 上dsh-env-inspector已被第三方占用(维护者 geeklei),故加-plus后缀发布。功能为同一份实现。
展示什么
宿主身份
- 进程 id(pid)
- 入口脚本路径
- 当前工作目录
- Node 版本、平台
- 已运行时长
环境变量分组
- 总数
DSH_前缀组- 凭证形态组(
KEY/PASSWORD/SECRET/TOKEN) - 其余
逐条变量清单:只含键名、是否以 DSH_ 开头、是否命中凭证形态、是否已设值、值长度 —— 每个变量一行。
安全边界(重要)
凭证形态变量的值一律不出宿主。命中的键只返回布尔与长度,明文绝不进入模型上下文,也绝不进入 HTTP 响应体。
承诺范围是精确的:逐条变量清单(env.entries 与两组键名)只含键名与元数据,不含任何环境变量的值。
唯一携带原值的字段是 4 个 host 身份字段 —— host.cwd、host.profileDir、host.profile、host.entry(分别对应 PWD / DSH_PROFILE_DIR / DSH_PROFILE / 入口路径)。这是刻意的:「现在在哪个目录跑、用哪个 profile」正是体检最该回答的问题,掩掉就等于删掉主要用途;且这些值本来就会出现在会话里。
要看某个变量的明文,请用
dsh-settings-params的env_param_get—— 那条路有独立的显式授权。
安装
dsh plugin --profile web add github:felixpu/dsh-env-inspector-plus
安装后重启宿主进程。
使用
网页:设置 → 环境体检
模型工具:
env_inspect
无参数,返回上述快照。适合在排查「环境变量没生效」「跑的是哪个 profile」这类问题时让模型自己看。
宿主贡献
| 类型 | 值 |
|---|---|
| 注入服务 | ['tools', 'webServer'] |
| 只读路由 | GET /dsh-env-inspector/snapshot |
| 成功信封 | { ok: true, data: <快照> } |
| 失败信封 | { ok: false, code: 'snapshot-failed' }(HTTP 500,文案由客户端字典翻译) |
路由路径保留原名
dsh-env-inspector(未随包名改为-plus), 以避免既有 profile 的注册点失效。settings.section的注册 id 同理保留原名; 而 locale 命名空间用包名dsh-env-inspector-plus(避免与 npm 上同名第三方包撞字典)。
中英双语(三套互相独立的机制,别混)
① 运行时 UI 文案 —— client/client.js 里的字典(45 条)
客户端半身走平台官方 locale 服务:
const NS = 'dsh-env-inspector-plus' // 命名空间用包名,避免与他人撞名
ctx.effect(() => ctx.locale.register(NS, { zh, en }), NS + ': dictionaries')
const t = ctx.locale.bind(NS)
ctx.slots.register({ ..., locale: NS }, EnvInspectorSection) // 渲染器自动注入 t
- 每个
ctx.slots.register都要带locale: NS—— 平台渲染器据此把t座位自动注入组件 props,所以组件里直接props.t,不需要再写inject: () => ({ t })。 - 设置分页导航项的
label必须用函数(() => t('section.label')):设置页导航每次读取时经resolveSlotLabel求值,语言切换后这一格立刻跟着变,不用重新注册。写成固定字符串则切换语言 后仍是旧语言。 - 必须声明客户端注入:
package.json的dsh.client.inject含@deepseek-ai/dsh-client-locale,插件对象inject含'locale'。缺了它,注册带locale:的 插槽会抛SlotAssemblyError。 - 一条消息 = 一个完整句子,变量用
{name}占位。不要片段拼接 —— 中英语序不同 (2 d 3 hvs 「2 天 3 小时」),拼接式无法重排。 - 平台
common命名空间已有的通用词(cancel/loading/unknown…)刻意不重复定义, 查表未命中会自动回落 common。 - 键名小写点分层级;
code.*的叶段可含连字符(如code.snapshot-failed),因为它要一对一 对齐宿主回的机器可读 code。 - zh 与 en 的键必须完全一致:运行时
register不检查,漏键不报错、只会在该语言下显示 key 名。apply里有一次键一致性自查 +console.warn(参考归档插件)。
② 宿主 → 客户端的失败:只回机器可读 code
宿主不该知道 UI 语言。快照路由失败时回 { ok: false, code: 'snapshot-failed' },面向用户的
句子全部由客户端字典翻译:
const HOST_CODES = { 'snapshot-failed': 'code.snapshot-failed' } // 白名单映射
未知 code 退回通用文案(error.badResponse)—— 绝不把 code.xxx 这种 key 名显示给用户。
客户端把失败存成描述符(字典键 + 参数)而不是已翻好的句子,因此切换语言后错误文案即时跟随,
不会停在取数那一刻的语言。
③ 模型侧工具描述与 render 文本:有意保持英文单语
env_inspect 的 description 与参数说明是面向模型的能力契约,不是 UI 文案:平台自带工具
(bash / read / grep…)同样只有一份英文描述,且宿主拿不到会话的 UI 语言。
output.render 的文本同时进「模型上下文」与「网页工具卡片」,但它也不是本插件的界面 ——
故写成语言无关的字段式标签(host: / entry: / cwd: / uptime: / env:),与平台自带工具一致。
④ 插件展示元数据 —— locale/*.json
locale/en.json 与 locale/zh.json 提供插件展示元数据(meta.title / meta.description),
Plugin Manager 与设置页无需激活插件即可读取,用于显示本地化的插件名与说明。
这与上面 ① 的运行时 UI 文案是两套东西。
{ "meta": { "title": "…", "description": "…" } }
⚠️ 两个容易漏的点(漏任一个都会静默失效,不报错):
- 必须在
package.json的exports里导出./locale/*.json—— 宿主经 Node 模块解析器 读取该资源,未导出的子路径会得到ERR_PACKAGE_PATH_NOT_EXPORTED,被当作「没有 locale」跳过。 files需包含locale—— 否则pnpm pack/npm publish的产物里不会带上它。
icon.svg 走顶层 icon 字段(相对路径),不需要 exports。
设计说明
本包不 import 任何 @deepseek-ai/* 包。作为树外插件包,插件目录下没有 node_modules,import '@deepseek-ai/dsh-tools' 会抛 ERR_MODULE_NOT_FOUND,宿主侧表现为 failed to import、插件根本装载不上。
因此工具定义是手写对象(零 dsh 依赖):{ name, description, parameters, output, execute },其中 parameters 是显式 JSON Schema 根对象。这与官方 defineTool 语法糖编译出的形状等价。
客户端 bundle 仅 require 平台种子表内的模块(react 与
@deepseek-ai/dsh-client-ui-primitives);slots / locale 两个服务走 dsh.client.inject 声明。
许可证
MIT © felixpu
仓库
Versions
| Latest version | Published | Size |
|---|---|---|
| 0.0.0-stage | — | — |
| 0.1.0 | — | — |
| 0.1.1 | — | — |
| 0.1.2 | — | — |
| 0.1.3 | — | — |
| 0.1.4 | — | — |
| 0.1.5 | — | — |
Comments
Loading…