补齐多引擎搜索、技能与 MCP 管理及主题等日常功能
30.4/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add HIT-HTML/dsh-ENHANCED该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 52 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-enhanced(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/6 14:17:40
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 77 处,展示前 53 条)
- 读取本地文件dist/index.js:31
let s = fs.existsSync(SETTINGS_PATH) ? fs.readFileSync(SETTINGS_PATH, "utf8") : ""; - 写入本地文件dist/index.js:36
fs.writeFileSync(SETTINGS_PATH, s); - 读取本地文件dist/skills.js:43
const entries = await readdir(SKILLS_DIR, { withFileTypes: true }); - 写入本地文件dist/skills.js:52
await mkdir(dir, { recursive: true }); - 写入本地文件dist/skills.js:64
await writeFile(file, `${front}\n${body.trim()}\n`, "utf8"); - 读取本地文件dist/skills.js:75
entries = await readdir(root, { withFileTypes: true }); - 读取本地文件dist/skills.js:84
const hasManifest = await stat(join(dir, "SKILL.md")).then(() => true, () => false); - 读取本地文件dist/skills.js:93
const raw = await readFile(join(srcReal, "SKILL.md"), "utf8"); - 读取本地文件dist/skills.js:100
if (!overwrite && (await stat(dest).catch(() => null))) { - 读取本地文件dist/skills.js:105
if (srcReal === dest || dest.startsWith(srcReal + sep) || srcReal === (await realpath(SKILLS_DIR))) { - 删除本地文件递归dist/skills.js:227
await rm(join(SKILLS_DIR, name), { recursive: true, force: true }); - 写入本地文件dist/skills.js:289
await mkdir(dirname(abs), { recursive: true }); - 写入本地文件dist/skills.js:290
await writeFile(abs, data); - 写入本地文件dist/skills.js:294
await chmod(abs, 0o755); - 删除本地文件递归dist/skills.js:313
await rm(stage, { recursive: true, force: true }); - 写入本地文件dist/mcp.js:36
await writeFile(patchPath(profile), next, "utf8"); - 写入本地文件dist/compact.js:34
await writeFile(patchPath(profile), (head + tail).trimEnd() + "\n" + block + "\n", "utf8"); - 发起网络请求dist/fetch.js:8
const res = await fetch(url, { - 读取本地文件dist/instance.js:21
return a && isAbsolute(a) && existsSync(a) ? a : process.execPath; - 执行外部命令来自配置/变量dist/instance.js:114
const helper = spawn(nodeExecutable(), ["-e", restartHelperSource(spawned, launch.cwd, logs, servingPort())], { - 读取本地文件dist/plugins.js:26
raw = await readFile(join(PROFILES_DIR, profile, "package.json"), "utf8"); - 读取本地文件dist/plugins.js:38
const depPkg = JSON.parse(await readFile(join(PROFILES_DIR, profile, "node_modules", dep, "package.json"), "utf8")); - 写入本地文件dist/plugins.js:88
await writeFile(patchPath(profile), next, "utf8"); - 写入本地文件dist/sessions.js:48
await mkdir(infoDir, { recursive: true }); - 写入本地文件dist/sessions.js:49
await writeFile(join(infoDir, `${name}.trashinfo`), body); - 读取本地文件dist/sessions.js:65
workspaces = await readdir(SESSIONS_ROOT); - 读取本地文件dist/sessions.js:73
dirs = await readdir(join(SESSIONS_ROOT, workspace)); - 读取本地文件dist/sessions.js:80
const st = await stat(full).catch(() => null); - 读取本地文件dist/sessions.js:87
for (const f of await readdir(full).catch(() => [])) { - 读取本地文件dist/sessions.js:88
const fst = await stat(join(full, f)).catch(() => null); - 写入本地文件dist/sessions.js:183
await mkdir(trashDir, { recursive: true }); - 写入本地文件dist/sessions.js:195
await rename(src, join(trashDir, name)); - 写入本地文件dist/search.js:41
await writeFile(patchPath(profile), (head + tail).trimEnd() + "\n" + block + "\n", "utf8"); - 写入本地文件dist/search.js:44
await chmod(patchPath(profile), 0o600).catch(() => { }); - 发起网络请求dist/search.js:58
const res = await fetch(`${url}/search?q=test&format=json`, { - 发起网络请求dist/free-search-vendor.js:195
response = await fetch(url, { - 发起网络请求dist/free-search-vendor.js:343
const response = await fetch(`${base}/search?${params}`, { - 发起网络请求dist/free-search-vendor.js:392
response = await fetch(ANYSEARCH_URL, { - 发起网络请求dist/free-search-vendor.js:433
response = await fetch(EXA_MCP_URL, { - 请求外部主机api.github.comdist/free-search-vendor.js:510
const response = await fetch(`https://api.github.com/search/repositories?q=${encodeURIComponent(query)}&per_page=${maxResults ?? 5}`, { - 发起网络请求dist/free-search-vendor.js:510
const response = await fetch(`https://api.github.com/search/repositories?q=${encodeURIComponent(query)}&per_page=${maxResults ?? 5}`, { - 请求外部主机www.v2ex.comdist/free-search-vendor.js:527
const response = await fetch("https://www.v2ex.com/api/topics/hot.json", { - 发起网络请求dist/free-search-vendor.js:527
const response = await fetch("https://www.v2ex.com/api/topics/hot.json", { - 请求外部主机api.bilibili.comdist/free-search-vendor.js:548
const response = await fetch(`https://api.bilibili.com/x/web-interface/search/all/v2?keyword=${encodeURIComponent(query)}`, { - 请求外部主机old.reddit.comdist/free-search-vendor.js:576
const response = await fetch(`https://old.reddit.com/search.json?q=${encodeURIComponent(query)}&limit=${maxResults ?? 5}&sort=relevance`, { - 请求外部主机hn.algolia.comdist/free-search-vendor.js:599
const response = await fetch(`https://hn.algolia.com/api/v1/search?query=${encodeURIComponent(query)}&hitsPerPage=${maxResults ?? 5}`, { - 请求外部主机api.stackexchange.comdist/free-search-vendor.js:621
const response = await fetch(`https://api.stackexchange.com/2.3/search/advanced?order=desc&sort=relevance&q=${encodeURIComponent(query)}&site=stackove - 读取本地文件dist/shared.js:63
return await readFile(patchPath(profile), "utf8"); - 读取本地文件dist/cooldown.js:48
return normalize(JSON.parse(readFileSync(path, "utf8"))); - 写入本地文件dist/cooldown.js:56
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }); - 写入本地文件dist/cooldown.js:58
writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 }); - 写入本地文件dist/cooldown.js:59
renameSync(tmp, path); - 删除本地文件dist/cooldown.js:63
unlinkSync(path);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.github.com、www.v2ex.com、api.bilibili.com、old.reddit.com、hn.algolia.com 等 11 个
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-settings@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 多引擎网页搜索
- 技能与MCP管理
- 按配置档切换插件
一个插件补齐 DeepSeek Harness 开箱缺的全部升级:多引擎网页搜索、技能与 MCP 管理器、按配置档切换插件、会话清理带悬停删除、一键重启/关机、主题。单一工具面板,无遥测。
README
由 DeepSeek 最新模型翻译生成dsh-enhanced
CI
License: MIT
preview
DeepSeek Harness(DSH)开箱即用所缺少的日常升级 —— 打包成一个插件。
免费的多引擎网页搜索,带自动回退;持久化的技能与 MCP 管理;受保护的会话清理;以及主题 —— 全部接入同一个 Settings 标签页和一个模型工具。预构建发布,因此从安装到可用之间无需构建步骤;并且它不会向任何人回传数据。
✨ 你将获得
- 🔍 持续运行的免费网页搜索 —— 一个内置的多引擎提供程序:DuckDuckGo ×2、Bing、AnySearch、SearXNG 以及兼容 SearXNG 的网关,外加带密钥的引擎(Exa、Tavily、Keenable、Perplexity、DeepSeek),当免费引擎触发速率限制时,它们会在回退链中待命。完全通过 Settings 标签页配置:对自托管实例进行实时健康检查、按引擎排除、重启后仍保留的故障冷却,以及用于代理设置的端点覆盖。
- 🌐 web_fetch —— URL 内容获取 —— 获取任意 HTTP(S) URL,并以 markdown 形式返回内容(HTML 页面会被剥离为可读文本)。插件加载后即可开箱即用(使用 Node 内置的 fetch;无需 harness fetch 提供程序)。
展开完整文档(README 剩余 1 节)
dsh-enhanced
CI
License: MIT
preview
DeepSeek Harness(DSH)开箱即用所缺少的日常升级 —— 打包成一个插件。
免费的多引擎网页搜索,带自动回退;持久化的技能与 MCP 管理;受保护的会话清理;以及主题 —— 全部接入同一个 Settings 标签页和一个模型工具。预构建发布,因此从安装到可用之间无需构建步骤;并且它不会向任何人回传数据。
✨ 你将获得
- 🔍 持续运行的免费网页搜索 —— 一个内置的多引擎提供程序:DuckDuckGo ×2、Bing、AnySearch、SearXNG 以及兼容 SearXNG 的网关,外加带密钥的引擎(Exa、Tavily、Keenable、Perplexity、DeepSeek),当免费引擎触发速率限制时,它们会在回退链中待命。完全通过 Settings 标签页配置:对自托管实例进行实时健康检查、按引擎排除、重启后仍保留的故障冷却,以及用于代理设置的端点覆盖。
- 🌐 web_fetch —— URL 内容获取 —— 获取任意 HTTP(S) URL,并以 markdown 形式返回内容(HTML 页面会被剥离为可读文本)。插件加载后即可开箱即用(使用 Node 内置的 fetch;无需 harness fetch 提供程序)。20 秒超时,最多 5 次重定向跳转,256 KB 响应保护。
- ✅ web_search 在启动时自动配置 —— dsh-enhanced 在首次运行时将 free-search: provider: ddg 写入 ~/.dsh/settings.yaml(幂等;会重写过期的 provider: 值)。web_fetch 完全无需设置。
- 🧩 技能管理器 —— 持久化地安装、编辑和移除 agent 的 SKILL.md 技能。安装接受单个技能或一个技能文件夹(磁盘路径或浏览器文件夹选择器均可),保持捆绑的 scripts/ 可执行(浏览器会丢弃权限位;shebang 文件会被恢复为 0755),并按技能报告结果,因此一个坏包永远不会阻塞其余部分。
- 🔌 MCP 服务器管理器 —— 在一个地方跨配置文件管理 @deepseek-ai/dsh-mcp-client 行。
- 🎛️ 插件管理器 —— 通过将禁用行写入配置文件的补丁文件,按配置文件启用/禁用任何已挂载的插件;启动时会监视该文件并实时重新组合,因此切换无需重启即可生效。核心插件(dsh-base、dsh-web-app、dsh-enhanced)会被硬性拒绝,而禁用官方 @deepseek-ai/ 插件需要明确确认。
- 🗑️ 值得信赖的会话清理 — 将整个会话目录从 ~/.dsh/sessions/ 移入操作系统自带的回收站:macOS 的 Finder 废纸篓(~/.Trash)、Linux 上的 FreeDesktop 回收站(带有 .trashinfo 元数据,以便桌面环境提供“还原”功能),以及 Windows 的回收站(通过 PowerShell)。删除操作先进行试运行(计划 + 令牌),并拒绝删除在本进程中打开或最近 15 分钟内活跃的会话(另一个窗口可能仍持有它们);如果原生移动失败,则不会删除任何内容——你会收到确切的错误信息。还原只需将文件夹拖回 ~/.dsh/sessions/ 下即可。在侧边栏中,每个会话行在悬停时会在其 ⋯ 菜单旁显示一个小垃圾桶图标;它驱动着同一套受保护的流程。
- 🧠 自动压缩调优器 — 将上下文压缩触发阈值限制在 harness 默认值以下,并保持在经过验证的安全范围内。
- 🔄 实例控制 — 通过侧边栏底部“设置”旁的图标按钮,一键关闭/重启 GUI 进程。
- 🎨 主题 — 原版 ENHANCED* 主题(磷光绿终端外观、数字雨启动动画)以及从社区主题移植的 Cyberpunk 2077 主题。
一个宿主组合插件(cordis.patch.yml 中的一行)、一个模型工具接口(manage_skills_mcps)、一个浏览器卡片(设置 → 插件)。无遥测,除搜索引擎本身外无外部服务。机密信息遵循同样的纪律:密钥以仅所有者可访问的权限(0600)写入且绝不回显,操作错误在到达模型、UI 或日志之前会经过机密信息脱敏处理,破坏性流程在确认令牌之后先进行试运行——并且有一个无框架的自检套件在 CI 中为每次发布把关。
📦 安装与首次运行
前提条件: 一个可正常工作的 DeepSeek Harness 安装——这是一个 DSH 插件,不是独立应用。
1. 安装(一条命令):
dsh plugin add https://github.com/HIT-HTML/dsh-ENHANCED
该仓库附带预构建的 dist/ 和 client.js,因此安装时无需构建步骤。若要进行开发,请参阅开发。
手动替代方案——自行克隆并添加该行
将仓库克隆到任意位置,然后将以下行添加到配置文件的 cordis.patch.yml 中(通常由 dsh plugin add 为你写入):
- id: dsh-enhanced
name: dsh-enhanced
config:
mcpProfiles: ["default", "web"] # whose cordis.patch.yml receives managed rows
allowRestart: false # opt-in for supervisor-assisted restarts
2. 重启配置文件,以便加载新的组合行(插件在启动时挂载)。
3. 验证其是否正常运行:
- Web GUI 中会出现一个 设置 → 插件 卡片,其中包含搜索、技能、MCP、插件、会话和主题等部分。
- 你的智能体获得一个新的模型工具:manage_skills_mcps。
- 可选的冒烟测试:打开 设置 → 插件 → 搜索,选择一个引擎,点击保存,然后让你的智能体运行一次网络搜索。
就是这样——另外请注意,网络搜索需要零配置:全新安装默认使用无需密钥的 Bing 引擎,因此你的 agent 在配置文件启动的那一刻就能搜索。访问 Settings → Plugins → Search 完全是可选的——用于配置需要密钥的引擎、自托管的 SearXNG 实例、排除项或冷却时间调优。
🏗️ 架构
两半部分,标准 DSH 插件形态:
┌─ HOST (Node, src/.ts → dist/) ─────────────────────────────┐
│ index.ts 组合根:注册模型工具、 │ │ browser RPC 通道、设置锚点,启动 │ │ 内置的搜索引擎 │ │ shared.ts 路径、托管块手术、Env/Handler 类型 │ │ skills.ts mcp.ts plugins.ts sessions.ts compact.ts │ │ instance.ts search.ts cooldown.ts — 功能 │ │ 模块,每个模块端到端拥有自己的操作 │ │ free-search-vendor.ts 内置引擎(见下文) │ └──────────────┬──────────────────────────────────────────────┘ │ 包私有 JSON RPC(browser → host) ┌─ CLIENT (browser, client/* → client.js bundle) ────────────┐ │ core.js 草稿/保存流水线、sections 注册表 │ │ main.js 启动、已保存主题激活 │ │ sections/* 每个功能一张卡片(skills、mcp、plugins、 │ │ sessions、compact、search、theme) │ │ session-delete.js 原生侧边栏行的悬停垃圾桶删除 │ │ (fiber 解析、受保护的 RPC) │ │ themes/* matrix、cyberpunk2077(+ 启动介绍) │ └─────────────────────────────────────────────────────────────┘
持久化刻意保持无聊: 每个宿主功能都会将标记分隔的 “托管块”写入 /cordis.patch.yml(技能则写入 ~/.dsh/skills/)。
没有数据库,没有状态文件——用户的配置树就是状态,肉眼可读:
dsh-enhanced:mcp >>> …rows… # >> dsh-enhanced:plugins >>> …rows… # >> dsh-enhanced:compact >>> …row… # >> dsh-enhanced:search >>> …row… # .ts,导出 ACTIONS + Handler,在 index.ts 中加两行,在 client/sections/ 下加一个 section 文件。这就是整个集成流程。
📋 功能参考
| 模块 | 操作 | 写入到 |
| skills | list_skills, read_skill, add_skill, edit_skill, remove_skill, install_skill, install_skill_files | ~/.dsh/skills//SKILL.md |
| mcp | list_mcps, mcp_status, add_mcp, remove_mcp, enable_mcp, disable_mcp | 托管的 :mcp: 块 |
| compact | compact_status, set_compact | 托管的 :compact: 块 |
| instance | shutdown_instance, restart_instance | 仅进程控制 |
| plugins | list_plugins, set_plugin_enabled | 托管的 :plugins: 块 |
| sessions | list_sessions, delete_sessions | 将会话目录移入回收站 |
| search | list_search, set_search | 托管的 :search: 块 |
| fetch | web_fetch | —(直接调用 Node 内置的 fetch) |
在客户端,每个功能都是一个 section,接入 core.js 中的三个注册表: DRAFT_SHAPES(表单状态)、DIRTY_CHECKS(未保存标记)、SAVE_STEPS(保存时重放)。
Section 在展开时自行拉取数据,并在本地暂存编辑;保存时按顺序重放步骤,批次中途失败时,恰好未应用的部分会保持暂存状态。
密钥(API key)绝不会被回显:list_search 报告 hasKey. 布尔值,密钥输入框初始为空,表示“未更改”,只有非空值才会被写入。还有两道防护:一旦密钥被存储,补丁文件会以仅所有者可写(0600)的方式写入;并且每个操作错误在到达模型、UI 或日志之前,都会经过基于形状的密钥脱敏——因此,即使网关在错误消息中回显了你的密钥,也会被掩码处理。
🌐 搜索子系统
来源
该引擎是内嵌(vendored)自 dsh-free-search v0.4.12(MIT,© DDDMUC),内嵌到 src/free-search-vendor.ts。我们选择内嵌而非依赖,是因为上游的 peerDependencies 未发布到 npm——独立插件全新安装时可能直接失败。
上游的修复不会自动传播;采纳时需重新移植。
与上游相比的本地适配(均为冲突安全或去品牌化):
| 项目 | 上游 | 此处 |
| 设置命名空间 | free-search | enhanced-free-search |
| 桥接前缀 | /api/dsh-free-search-settings | /api/dsh-enhanced-free-search |
| 搜索提供商 id | ddg | ddg(从 enhanced-free 回退;harness 配置期望 ddg) |
| 设置 UI section | 安装了自己的卡片 | 已移除——我们的 Search 标签页负责配置 UX |
| 自更新机制 | check-update + pnpm add 升级路由 | 已移除——内嵌副本不得用上游覆盖自身 |
| 代理可见字符串 | “Settings > Plugins > Free Search” | 指向本插件的 Search section |
启动流程
profile cordis.patch.yml dsh-enhanced 主机启动 :search: 托管块 ─┐ ├─► index.ts: readSearchConfig(profiles[0]) Settings→Search tab ────┘ │ ▼
ctx.inject(["web"], scope => freeSearch.apply(scope, cfg))
│
registers provider id "ddg",
agent tools, system-prompt section, bridge routes
│
▼
harness web_search / advanced_search route through it
配置在启动时读取一次——在标签页中保存后,重启配置文件以应用。
如果独立版 dsh-free-search 也安装在某个地方,不会有任何冲突:不同的命名空间/前缀/提供者 ID,并且每次注册都有防护。
引擎与回退链
首选引擎 = 你的 Provider 下拉选择。失败/结果为空时,回退链继续向下走:
付费(仅在配置密钥时): exa → tavily → keenable → perplexity → deepseek-official 免费,始终可用: bing → anysearch → ddg → ddg-lite → searxng
时间过滤(advanced_search)由支持它的引擎处理,其余引擎跳过。
结果按查询缓存(LRU 约 50 条,TTL ≤5 分钟,可配置)。
排除、冷却、端点覆盖
- 排除引擎(excludedEngines):一个 CSV 字符串或引擎 ID 数组,将其从回退链中完全移除——拼写错误会被拒绝,排除所有引擎会被拒绝。保存在 :search: 块中;在配置文件重启后生效。
- 带记忆的失败冷却(src/cooldown.ts):配额耗尽的失败会让引擎冷却 12 小时,429/速率限制相关的措辞冷却 15 分钟。状态持久化到磁盘(~/.dsh/dsh-enhanced/cooldown-state.json),因此重启不会重新耗尽已失效的配额;一般的网络错误和缺失的密钥不会触发任何冷却。保存搜索配置会清除过期的判定(你的密钥或端点已更改)。
- 端点覆盖(exaBaseUrl、tavilyBaseUrl、keenableBaseUrl):将带密钥的引擎指向自托管或代理网关;仅支持 http/https,留空则清除。
- 回退是可见的:落在非首选引擎上的结果会携带一个结构化的
_fallback {from, to, reason} 副本,与人类可读的 Note 并列。
SearXNG 实例(自托管路径)
公共 SearXNG 实例会把 JSON API 限流到死;运行你自己的:
mkdir -p ~/.searxng && cat > ~/.searxng/settings.yml /tmp/lab-port.yml
dsh --profile lab --patch /tmp/lab-port.yml
实时提供工作区客户端(cache-control: no-cache),因此客户端修改刷新即可见;宿主端修改需要重启实验台。切勿将其指向你的主 profile。
添加引擎(搜索)
1. src/free-search-vendor.ts:const X_URL、async function searchX(query, maxResults, options, signal)
返回 { sources: [{url,title?,snippet?}], truncated:false } — 复用 fetchHtmlWithRetry、
stripTags、uniqueSources。
2. 将 id 添加到 FREE_ENGINES / ALL_ENGINES、provider.search 内的 freeEngines 链式数组,以及 runEngineTest 中的一个 case。
3. client/sections/search.js:一个 PROVIDER_META 条目(除非需要密钥,否则 free: true)。
4. 通过桥进行冒烟测试:curl -X POST .../raw-search -d '{"engine":"x","query":"hi"}'。
添加功能模块
复制 src/compact.ts 的结构(最小的完整示例):actions 常量、Handler switch、通过 splitBlock/writeFile 管理块,服务端有防护栏。然后在 index.ts 中加一行 handleX + 展开 X_ACTIONS,再加一个注册到客户端注册表的 section 文件。
发布检查清单
- [ ] npm run build && npm run selfcheck
- [ ] Lab bench 冒烟测试:使用首选引擎 + 一个回退引擎的 bridge 查询
- [ ] dist/ 和 client.js 是此处提交的产物——确保它们是最新的
- [ ] 跟踪文件中没有机器特定路径或密钥(git grep -E "/Users/|sk-[A-Za-z0-9]")
- [ ] 提升 package.json 版本号,打上与之匹配的 vX.Y.Z 标签,一起推送提交和标签
🔒 隐私与安全说明
- 无遥测。唯一的出站流量是你(或你的 agent)运行的搜索。
- API 密钥存储在配置文件的 cordis.patch.yml 中,绝不会发送回浏览器(空字段 = 未更改;仅返回 hasKey 布尔值)。
- 测试 bridge 仅接受回环请求(isLoopbackRequest 防护)并会脱敏密钥。
- 测试中类似 EXA123 的字符串是刻意设置的测试夹具,不是凭据。
📄 许可证
MIT——见 LICENSE。包含从 dsh-free-search(MIT,© DDDMUC)引入的代码,以及源自 Cyberpunk 2077 社区主题的主题工作;两者均在文件内注明出处。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
HIT-HTML/dsh-ENHANCED
补齐多引擎搜索、技能与 MCP 管理及主题等日常功能
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,225未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,370已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13941 个插件含 PR 收录与…
★ 355已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目