Repository navigation
DSHEssentialTools v2.7.0
Changelog
v2.7.0 — 可安装的 bundle(manifest 完整化)
- 新增
dsh.bundle.patch:package.json的dsh节除client外,现在声明bundle.patch → ./cordis.patch.yml,并在仓库根补上了对应的cordis.patch.yml。在此之前 DET 只声明dsh.client,而单有dsh.client并不构成可安装的 bundle:dsh plugin add装不上,各插件收录库的静态校验会直接判invalid—— 中心 Registry 的rejected.json里 DET 的理由正是package.json does not declare a safe dsh.bundle.patch。 - 一条命令安装:
dsh plugin --profile web add dsh-essential-tools或dsh plugin --profile web add github:LLYlab/DSHEssentialTools。装完自动并入当前 profile 的 bundle 层,不再需要手工往cordis.patch.yml里插insert块(从源码挂载仍然可以那样做)。 cordis.patch.yml故意不写config:所有键都有中性默认值(路径为空串 / Debug / x64 / bootFailLimit=2),所以干净 profile 装上去就能直接启动,不带入任何个人或机器路径;要接自己的工程,在自己的 patch 层里按id覆盖(config是整块替换,不是逐字段深合并)。- README:Quick start 增加 Option C(GitHub 安装),并说明 bundle patch 会自动注册。
- 功能无变化:未改动任何
lib/代码,本次是打包/安装契约的修复。
v2.6.0 — 停用范围收窄到「DET 全局插件库」;DLT 这类插件不再被误伤
v2.5.2 为了让
topo也能被停用,把范围扩大成「loader 里所有非框架、非 DET 自身的常驻插件」。这个盲扫踩了两个坑:①cordis:include—— 它是持有整份cordis.yml子树的容器(dbs/dlt/topo的 loader id 都是它的孩子include:xxx),停它等于去拆整棵 profile 插件树,include 那侧随后按配置重建孩子,刚停掉的插件又被拉起来 —— 实测就是「关了 DET,dbs / topo 照旧在跑」;②把不属于 DET 的插件(如dlt—— 它有自己的「DLT 管理器」总开关)也一起停了。本版把范围收回到 DET 自己的库,并把「停没停」变成可核对的事实。
停用范围 = DET 全局插件库(不再盲扫 loader)
- 只遍历
global.list()(即「全局插件管理」里那份库)。不在库里的常驻插件(如dlt)永不碰 —— 它们各有自己的开关。 - 库里一条记录要能被停,必须绑定到 loader 条目(记录里有
moduleName,由「全局插件管理 → 扫描已安装插件 → 纳入」写入)。 - 容器/内置永不入列:拥有子树(
entry.subtree)或名字以cordis:开头的条目(如cordis:include)在停用与恢复两条路径上都被跳过 —— 既修掉「停不干净」,也排除拆整棵插件树的风险。 - 库里声称常驻、但绑定不上的记录,不再靠猜名字去停别人的插件:写进
det.master.unmanaged,设置页如实列「没被停用 + 原因(去『纳入』绑定)」。gpMasterState新增unmanaged/unmanagedCount。
停用后核对,不再「写下就算停」
_verifyPause:逐条回读 loader 的真实状态(entry.disabled),没停的补一次(250ms 后重试),仍没停就记applied: false+ 可读原因。快照det.master.paused现在带applied,页面区分「已确认停用 N / ⚠ 未能停用 M(+原因)」,并提供一键刷新页面 —— 入口被停用后该插件的 client 包不再下发,刷新即彻底干净。- 恢复侧同样只认快照:
_resumeManagedPlugins跳过旧快照里残留的容器条目(skipped),不会去替 loader 开关容器。
修复
global.upsert:「纳入」(code 传空)不再用空值覆盖库里记录原有的host/client动态代码。_pauseItemState:只要记录绑定了 loader 条目就以 loader 为准 —— 此前非permanent的绑定记录会被错判成「会话实例已停」。
测试
- 新增
tests/pause.test.mjs(假 loader / 假存储驱动真实方法,10 条):容器不入列、DLT 全程不被 update、绑定不上的进 unmanaged、停不下来的补刀并如实上报、旧快照恢复不碰容器。跑法见docs/DET发布.md。
v2.5.2 — 总开关的停用范围补全:随 DSH 常驻、但未纳入库的插件(dbs / topo)
2.5.1 的总开关只停了「全局插件库里有记录」的插件。本机实测发现:真正在跑的
topo是随 DSH 常驻装载、未纳入库的插件(loader 里是include:topo),库中只有一个动态副本gp-topo—— 于是关掉总开关后topo仍在跑(topo_ds_ask仍可用)。本版把这类插件也纳入停用范围。
- 停用范围 = DET 管理范围内的全部插件:
- 全局插件库里当时真的开着的插件(常驻按 loader 实际状态判断,动态看会话实例);
- 外加 loader 里所有非框架(
@deepseek-ai/*除外)、非 DET 自身、且当前未禁用的常驻插件 —— 也就是 DET「已安装插件」里能看到的那些(如topo)。
- 恢复不变:两类都写进快照
det.master.paused(库外常驻记录kind: "installed"+moduleName),重新打开总开关时按快照重新装载 / 还原会话记录;本来就没开的插件不进快照。重复关闭(含关着总开关重启)不会覆盖已有快照;DET 自己与框架组件永不被动。 - 关闭态可核对:DET 管理器列出的清单会区分「常驻已安装 · 已卸载」与「常驻 · 已卸载 / 会话实例已停」。
- 提醒:被 loader 卸载的常驻插件,其前端界面要等一次页面刷新(强刷)才会消失;后端能力(如
topo_ds_ask)立即失效。
v2.5.1 — 指示状态=实际状态;总开关关闭时一并停用 DET 管控的插件
2.5.0 的总开关只卸下了 DET 自己的注入,DET 管控的插件(dbs / topo 等)仍在跑;全局插件管理的指示也仍以「记录」为准。本版把这两件事补全。
总开关关闭 = 真的完全原生
- 一并停用 DET 管控的插件:常驻插件经
loader.update(disabled:true)实时卸载(其界面/扩展通道随之失效),动态插件停掉各会话实例并清空启用映射。 - 可逆:关闭前把「当时真正开着的」记成快照(
det.master.paused),重新打开时按快照恢复 —— 常驻插件重新装载、会话启用记录还原(客户端gpSync据此在对应会话重新启用)。本来就没开的插件不进快照,避免恢复时凭空打开。 - 快照不会被清空:重复关闭(含「关着总开关重启」)时,新结果为空就保留上一份,恢复信息不丢。
- 绝不碰自己:
_disableAllGlobalPlugins明确跳过 DET 管理器自身。 - 可核对:DET 管理器在关闭态会列出「已随总开关停用的 DET 管控插件」(常驻已卸载 / 保留的会话记录数);新增端点
gpMasterState。
指示状态 = 实际状态(全局插件管理)
- 常驻插件以 loader 为唯一事实源:记录里的
globallyEnabled只是 DET 的期望值,真正决定「装没装」的是宿主 loader 的entry.disabled。gpList现在按 loader 核对,不一致时自动回写纠正并在卡片上标注;同时显示fiber阶段(装载失败 / 进行中)。 - 会话状态区分「记录」与「在跑」:徽标改为按实际
running渲染 —— 「本会话运行中」/「已启用记录 · 未运行」/「本会话未打开 · 打开后恢复」;记录与运行清单不符且超过 15 秒才标stale,避免刚启用的一瞬间误报。 - 对话内一致:
det_global_plugin_list的工具文本同样报告实际状态(常驻按 loader、动态按是否有活跃运行),不再只报「档位 + 记录」。
修复
- 会话登记簿自检会登记一条
id=""的幽灵会话(自检报告里出现added: [""],下一轮又被当失联删除,来回抖动)。原因是个别SessionHeader缺id;现在无 id 的头一律跳过,reconcileRegistry再做一层防御。
v2.5.0 — 总开关:一键「完全原生」
DET 管理器顶部新增总开关(
det.features.master,默认开)。它是「DET 扩展 ↔ 完全原生 DSH」的唯一开关:关闭后,DET 对 DSH 的全部改动只剩「设置 → DET 管理器」这一页与其中的这个总开关本身,其余一律卸下且可随时恢复。
- 关闭总开关时(宿主侧):释放全部 DET 注入 ——
det_*/web_*模型工具(全局插件管理、TCT、CDM、MDA、浏览器、网络工具共 24 个)、系统提示注入(全局插件说明 / 网络权限档位 / MMS)、tools/pre-execute安全审计监听、本地浏览器桥(WS server,已连接的扩展会断开)、会话侧边栏登记簿的自动登记与节流自检,以及启动健康兜底(不再自动禁用其它插件);MDA 分组模式复位为native。 - 关闭总开关时(客户端侧):撤销全部界面注入 —— 右侧 ▶🗎🕘🧩🛡 工具栏、右下角余额/花费/MMS 状态框、输入框网络权限控件、VTD 对话标签与消息操作、MDA 侧栏浮层、设置页的「全局插件管理」与「MDA 分组」两个条目;同时停止余额轮询、全局插件自动启用同步与
ai-auto自动批准,并清掉写在<html>上的定位/占位 CSS 变量与属性。 - 保留:typert 管理端点与「设置 → DET 管理器」设置页(总开关关闭后它是重新打开 DET 的唯一切入点),总开关在页面上始终可见。
- 可逆且即时:开关持久化在
det.features,改动即刻生效、无需重启;关闭时的操作全部登记在 disposer 表里,重新打开会完整恢复(分项开关的持久化取值原样保留)。宿主侧自检:24 个工具 + 2 段系统提示 → 0 → 24/2。 - 默认值:沿用升级前的状态(
master默认true),不会改变现有用户的用法。
v2.4.1 — 浏览器桥稳定性 + 安全加固 + README / 用户指导手册
- 浏览器桥只保留最新连接:扩展重载 / MV3 Service Worker 重启后旧 socket 可能残留(
close未触发),此时命令会发到死连接上,表现为间歇性browser-timeout(实测见过 6 条残留)。新连接建立时清掉更早的连接,_firstSocket改为取最后加入的一条。 - 扩展档位切换经 background RPC:弹窗 / 选项页不再直接写
chrome.storage,而是chrome.runtime.sendMessage({type:'setMode'})→ 同时持久化 + 更新徽标 + 通知宿主。修掉「改成『启用』后det_browser仍报ext-mode-off」(宿主收不到通知,继续按旧档位拒绝)。 - 安全:
_fetch在 DNS 解析后再判一次私网(防 DNS rebinding);_fetch/ 余额 / 单价统一 15s 超时(此前一个不响应的主机能把端点挂死);读到响应体前先看Content-Length,避免超大响应整体进内存。 - 加固:
cmd.exe调用的mkdir/rmdir路径整体加引号——未加引号时空格会被拆成多参数,& | ^等元字符会被解释执行(命令注入)。id 已白名单化,仍补引号保护。 - 扫描器误报:
exec(/child_process规则加词边界(\b),browserExec(不再被误报为进程执行。 - 修复:inventory 行的
packages可能缺失(不同 DSH 版本),复用动态插件时加容错,避免 TypeError;GitHub 商店搜索结果的name/verificationStatus归一化,否则模型工具的 output schema 会拿到undefined被判为非法 JSON。 - 余额刷新更跟手:TTL 8s → 4s,配合前端 5s 轮询。
- 文档:重写
README.md(价值主张 / 亮点 / 快速开始 / 文档索引),新增面向使用者的 docs/GUIDE.md 用户指导手册(安装、上手、逐功能详解、权限模型、扩展装载、FAQ、故障排查、卸载回滚、速查表)。 - 发布:GitHub
main= tagv2.4.1(Release 资产install.ps1/README.md/GUIDE.md)+ npmdsh-essential-tools@2.4.1(latest)。新增publish-otp.ps1(非交互环境用 OTP 一次完成发布 + 校验)。
v2.4.0 — 浏览器控制(DET → 你已登录的浏览器,扩展方案)
- DSH 控制扩展(
browser-extension/):MV3 浏览器扩展(Chrome/Edge),通过本地 WebSocket 与 DSH 宿主通信;四档开关(关闭/只读/只写/启用)由用户在扩展弹窗控制;DSH 只读、可调用。 - 本地 WebSocket 桥(
lib/browser.js):DSH 宿主启动仅绑127.0.0.1:9123的 WS server,路由扩展命令;握手校验 Origin,防跨源。 - det_browser 模型工具:read_text / read_dom / screenshot / get_url / get_title / navigate / click / fill / run。只读/只写模式门禁在扩展端强制;「只写」不回传页面内容。
- 网络权限第4档(使用用户浏览器)= 启用浏览器控制:低于该档 DET 拦截;扩展未连接/未开启时报错。
- 高危审批:非 Full access 模式下,浏览器动作(读写)经
tools/pre-execute{kind:'ask'}走产品审批;Full access 免审。 - 客户端:DET 管理器新增「浏览器控制」状态块(Web权限档位/桥运行/扩展连接/模式)。
v2.3.4 — VTD 分叉流式 + 对话对齐产品样式
- 分叉也要流式:VTD 对话页签不再固定 4s 轮询。宿主
treeView新增generating(open-turn)信号;客户端据此在生成中高频刷新(≈700ms)、空闲低频(≈2.5s),并带生长检测兜底(宿主未更新时仍能流式)。生成中自动滚到底部、显示「正在生成…」提示。 - 更像标准对话:去掉普通用户/助手消息上的「用户 #seq / 助手 #seq」噪音标签,渲染与产品聊天更一致;保留分叉
<N>选择器与编辑/重试等 VTD 特有能力。
v2.3.3 — 关闭开关的副作用:插件管理关=自动禁用所有插件;MDA 关=回到原生
- 在 DET 管理器关闭「插件管理」时,自动禁用所有全局插件(停各会话实例;常驻插件置为禁用并实时卸载)。
- 关闭「MDA 分组」时,自动把 MDA 分组模式重置为原生(native)(不再残留 workspace/model),让 DET 近乎完全关闭、回到净版 DSH。
v2.3.1 — DET 功能开关新增「MDA 分组 / 插件管理」,可近乎完全关闭
DET 管理器新增两个开关键,把「插件管理」与「MDA 分组」也纳入开关——关掉后对应 UI 不再渲染,让 DET 几乎完全关闭。开关即时生效并持久化。
- 新开关:插件管理(工具栏「🧩插件」按钮/当前对话插件控制 + 全局插件管理)、MDA 分组(左侧栏分组入口 + 分组树/模型合作)。
- 关闭后:工具栏「插件」按钮消失、左侧栏「MDA 分组」入口消失、设置里对应区块显示"已关闭";DET 管理器始终保留以便重新开启。
v2.3.0 — MDA(混合同对话)分层 · CDM 跨对话记忆 · TCT 临时对话
DET 第二轮重大优化:MDA(Mixing Dialogue Agent)旨在更好地管理对话、降低成本。新增设置「MDA 分组」(仿「外观」三选一:原生/工作区组/模型组)、跨对话记忆 CDM、一次性临时对话 TCT,以及插件管理 UI 精简。
✨ 新增
- MDA 分层:设置新增「MDA 分组」(仿「外观」,三选一单选 + 图标):
- 原生分组(默认,行为与现在一致);工作区组(按 工作区→分支模型区域→会话 分组,区域内共享 CDM 记忆 + 插件清单);模型组(同工作区组,并允许模型合作)。
- 主视图左侧栏底部「🔀 MDA 分组」入口:工作区/区域/会话分组树(可折叠),工作区「+」建分组+新对话,区域「+」组内新对话。
- CDM(CrossDialogueMemory):跨对话读取/搜索对话段——
cdm_list/cdm_search(默认限定当前工作区;cross提权可跨工作区)/cdm_read。 - TCT(Temp Chat Tool):一次性临时对话——
det_tct(简短 prompt + 可选 preset + 权限控制 → 单段 feedback → 会话即焚、无持久化);DET 设置内可选 TCT 模型。 - 模型合作/介绍:
mda_card(用 TCT 生成模型介绍)、mda_activate(激活其它模型;⚠ 耗提示词,不鼓励)、mda_list_areas。
🧹 UI 精简
- 插件卡片底部改为小图标(✎ 编辑打开内联代码工作区 / 🔍 AI 安全审查 / 🗑 删除),删除「本会话停用」;设置页 DET 区块可折叠;新增高性能安全审查提示词。
🐛 修复 / 加固
- 全局插件库读取崩溃(存储域读表
entries())、并发首开竞态(opening防重入)。 - 常驻插件(如 DBS)全局「启用/禁用」二分开关(经
loader.update实时卸载/装载、跨重启持久化、切换后自动刷新前端)。 - 工具栏面板渲染改为兄弟节点(fragment),修复挤压/闪动;分组树支持折叠;移除与原生的单插槽冲突。
v2.2.0 — 更贴合原生 DSH 风格 + 简洁界面 · 全局插件管理强化
主打「更贴近原生 DSH 的观感与交互」与「更简洁的界面」:面板、标签、工具栏对齐 DSH 原生设计语言,常用操作收拢到一处。
✨ 改进与亮点
- 更贴合原生 DSH 风格
- 全局插件管理面板、VTD 对话页签、右侧工具栏统一对齐 DSH 原生层级/色彩变量/折叠与卡片语言,观感一致。
- 更简洁的界面
- 面板去重、操作收拢;常驻插件改为「启用/禁用」二分开关,替代繁琐五档;
- 扫描 / 纳入 / 刷新在各自标签内一键完成,减少跳转。
- 全局插件管理强化
- 修复全局插件库读取崩溃(
dsh_global_plugins域读表由.all()改为entries())与并发首开竞态(opening防重入); - 扫描已安装插件:列出随 DSH 常驻的永久宿主插件(自动排除 DET 管理器本身),可一键纳入全局插件库(
gpScanInstalled/gpImportInstalled/det_global_plugin_scan_installed/det_global_plugin_import_installed); - 常驻插件二分开关:对 DBS 这类跨会话插件做「启用/禁用」,实时经 Loader 卸载/装载、
globallyEnabled持久化、重启后再应用;切换后自动刷新前端让插件 UI 消失/重现(gpSetPermanentEnabled/det_global_plugin_set_enabled); - 两种从 GitHub 安装插件的方式:
- 直接下载(
det_global_plugin_github_direct/gpGithubDirect):按约定格式(dsh-plugin.json或plugin/host.js+plugin/client.js)拉取并入库,返回可疑代码扫描警告; - AI 读取源码自行编写(
det_global_plugin_github_rebuild→det_global_plugin_github_save):拉取 README 与源码、注入「病毒/漏洞检查上下文」供 AI 审查后自行编写等价版本入库——不直接执行第三方代码。
- 直接下载(
- 修复全局插件库读取崩溃(
🐛 修复
- 全局插件库列表读取崩溃(
.all is not a function)。 - 全局插件库并发首次打开时的
already-open竞态。
🔒 安全
- 全链路 SSRF 防护 + 可疑代码静态扫描(
scanCodeWarnings)+ commit 溯源;方式二不直接执行第三方代码。