会话与记忆 · v0.4.12
dsh-rich-questions
Rich branching survey system for DeepSeek Harness (DSH) Web GUI: the ask_survey tool extends the flat ask_user_question flow — up to 150 questions, per-option branching (select C -> a different range of questions follows), delayed hover insights with sources, expandable Mermaid diagrams, multi-select, free-text, quick mode (one-click whole-survey answer templates), and reroll/push/discuss pre-flight actions. Host-authoritative pending surveys, rendered as a wizard in the same conversation composer seat.
该插件尚未翻译,显示作者原文。
安装命令
dsh plugin --profile web add git+https://github.com/svgop/dsh-rich-questions
实测:这条命令在隔离环境里装得上,并且已经挂载。
检测报告
能力清单
- 发起网络请求
network需留意23 处命中src/client.bundle.js:215fetch(`${API}/state`, { cache: "no-store" }).then((res) => (res.ok ? res.json() : null)).then((data) => {src/client.bundle.js:297const res = await fetch(`${API}/action`, {src/host.js:853if (!got.ok) throw new SurveyError(`survey_draft_get failed: ${got.error}`, 'SURVEY_DRAFT_MISSING')src/host.js:855slug: got.draft.slug,- 看请求发往哪些域名。发往作者自己的后端是常见做法。
- 写入文件
writes-files需留意9 处命中src/draft-store.js:57await mkdir(join(manifestPath, '..'), { recursive: true })src/draft-store.js:58await writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf8')src/draft-store.js:62await mkdir(draftsDir, { recursive: true })src/draft-store.js:63await writeFile(join(draftsDir, `${draft.slug}.json`), JSON.stringify(draft, null, 2) + '\n', 'utf8')- 看写入位置。写自己的配置目录是正常的,写系统目录不是。
- 动态执行代码
dynamic-code需留意2 处命中tests/client-harness/drive.mjs:54vm.runInThisContext(readFileSync(bundlePath, 'utf8'), { filename: LABEL })tests/client-smoke.test.mjs:85new Function('window', 'document', 'EventSource', 'fetch', bundleSource)(- 看 eval / new Function 的入参来自哪里。常量字符串和用户输入是两回事。
- 客户端可疑脚本
client-side-risk需留意2 处命中- client.bundle.js: postMessage 无 origin 校验; client-smoke.test.mjs: postMessage 无 origin 校验
- 浏览器侧代码能改你看到的界面。确认改动范围符合插件用途。
- 读取文件
reads-files一般25 处命中src/announcement-contract.test.mjs:20const skill = readFileSync(new URL('../skills/rich-questions-authoring/SKILL.md', import.meta.url), 'utf8')src/bundle-contract.test.mjs:24if (existsSync(index) === false) return nullsrc/bundle-contract.test.mjs:26const indexSource = readFileSync(index, 'utf8')src/bundle-contract.test.mjs:34if (existsSync(iconsPath) === true) {- 读文件是绝大多数插件的正常工作方式,本身不构成顾虑。
- 读取环境变量
reads-env一般6 处命中src/host.js:51return process.env.DSH_RICH_QUESTIONS_HOME ?? join(homedir(), '.dsh', 'rich-questions')src/host.js:102const locale = process.env.LANG ?? process.env.LC_ALL ?? ''tests/host-drive.spec.js:13process.env.DSH_RICH_QUESTIONS_HOME = join(await mkdtemp(join(tmpdir(), 'rq-home-')))tests/host-drive.spec.js:217const record = JSON.parse(await readFile(join(process.env.DSH_RICH_QUESTIONS_HOME, 'surveys', `${surveyId}.json`), 'utf8…- 环境变量里常混有密钥。看它是否把整个 env 都读走。
- 动态加载模块
dynamic-import一般5 处命中src/bundle-contract.test.mjs:52const mod = await import(`file:///${installed.replaceAll('\\', '/')}/package.json`, { with: { type: 'json' } })src/bundle-contract.test.mjs:54const real = await import(`file:///${join(installed, entry).replaceAll('\\', '/')}`)src/client.bundle.js:681if (mermaidLoad === undefined) mermaidLoad = import(/* @vite-ignore */ MERMAID_CDN_URL).then((module) => {tests/draft-store.spec.js:77const { rm } = await import('node:fs/promises')- 动态导入本身无害,但会让依赖关系难以静态审阅。
- 使用 vm 模块做隔离
uses-vm-module一般1 处命中tests/client-harness/drive.mjs:11import vm from 'node:vm'- 用 node:vm 是在建立隔离,不是在突破它。本身不是顾虑,但值得知道这个插件会执行动态代码。
逐条扫描明细
| 能力 | 标识 | 关注度 | 命中次数 |
|---|---|---|---|
| 发起网络请求 | network | 需留意 | 23 |
| 写入文件 | writes-files | 需留意 | 9 |
| 动态执行代码 | dynamic-code | 需留意 | 2 |
| 客户端可疑脚本 | client-side-risk | 需留意 | 2 |
| 读取文件 | reads-files | 一般 | 25 |
| 读取环境变量 | reads-env | 一般 | 6 |
| 动态加载模块 | dynamic-import | 一般 | 5 |
| 使用 vm 模块做隔离 | uses-vm-module | 一般 | 1 |
这份报告的口径
扫描读的是包里的源码,全程不执行第三方代码。 本次读了 20 个文件,扫描于 2026-10-22。 命中次数只说明源码里出现过这类调用,不说明行为好坏——一个插件读写文件 500 次和 1 次 都会被记为「读取文件」。这是能力清单,不是信任评分,也不是安全结论: 没扫出来的能力可能只是写法没被规则覆盖。
可信度
这个插件只在 GitHub 上发布,没有走过 npm 的分发链路。下面的梯子按 GitHub 通道的证据计算:补丁审计、钉在 commit 上的源码快照、隔离试装;L2 的「宿主启动」这一层还没有对 git 通道跑过,所以等级停在 L1。
- -10声明与实物不符:client-present-undeclaredmajor:['src/client.bundle.js', 'tests/client-harness/README.md', 'tests/client-harness/drive.mjs', 'tests/client-harness/spec-poison.json']
- -2没有 READMEminor
认证等级 L1
- L0静态结构与契约✓源码快照钉在 commit da2e6191,补丁与入口齐备,另有 1 项声明不一致(计入健康扣分)
- L1配置组合与依赖图✓跨包无 entry id 冲突,插入模块可解析,目录内 peer 满足
- L2隔离沙箱冒烟—还没有宿主启动记录
- L3运行时健康监控—未抽样(本层是抽样检测:没有会话不等于干净)
评分口径与作者信息
从 100 分开始按规则扣减:fail −20 / major −10 / warn −5 / minor −2;star 数、下载量、LLM 输出都不参与评分
- 维护者
- —
- 仓库
- https://github.com/svgop/dsh-rich-questions
- 许可
- MIT
- 最后发布
- —
- 周下载
- —
- star
- —
扫描状态:已扫描。能力是事实,不是缺陷; 周下载与 star 只作参考,不参与评分。
认证等级只回答四件事:包本身是否完整可解析(L0)、能不能与别的插件组合(L1)、隔离环境里装不装得上并起得来(L2)、抽样运行时有没有异常(L3)。依赖漏洞、仓库存活、下载量都不参与评级,只作为独立信号标注。可信 ≠ 无漏洞,上架 ≠ 推荐。
| Node 要求 | >=20 |
|---|---|
| 第三方依赖 | 0 个(纯自包含) |
| 依赖安全公告 | 已查询全部依赖,没有匹配到已公开的安全公告(含 DSH 框架包在内的 @deepseek-ai/* 不作查询——那是运行时自己的问题,不是插件的。) |
元数据
| 主页 | https://github.com/savageops/dsh-rich-questions#readme |
|---|
DSH