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

鲸鱼娘插件仓库 ccl4-56-23-5/DSH-Plugins

DeepSeek Harness
ccl4-56-23-510 天前有提交已提供中文文档扫描:含敏感能力

在 DSH 内一键安装、更新并管理本仓库的全部插件

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ccl4-56-23-5/DSH-Plugins
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
L4 · 真实安装等级说明 →
数据截至 2026/10/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 10 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 84 处,展示前 80 条)
  • 读取本地文件
    Api-Switcher插件/2.3.0/Verify-Package.mjs:9
    const bytes = gunzipSync(readFileSync(archive))
  • 读取本地文件
    Api-Switcher插件/2.3.0/Verify-Package.mjs:38
    assert.equal(hash(readFileSync(target)), hash(expected), `Installed file mismatch: ${name}`)
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/capabilities.js:2
    export const apiyiCatalog = JSON.parse(readFileSync(new URL('./assets/apiyi-catalog.json', import.meta.url), 'utf8'))
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/capabilities.js:3
    export const mimoCatalog = JSON.parse(readFileSync(new URL('./assets/mimo-catalog.json', import.meta.url), 'utf8'))
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/http.js:43
    res.statusCode = 200; res.setHeader('content-type', 'text/css; charset=utf-8'); res.setHeader('cache-control', 'no-cache'); res.setHeader('x-content-t
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/http.js:46
    const image = leaf === 'brand' ? {bytes:readFileSync(new URL('./assets/logo.png', import.meta.url)),type:'image/png'} : await controller.logo({provide
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:85
    const record = JSON.parse(readFileSync(join(folder, `${identity(website)}.json`), 'utf8'))
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:86
    if (!existsSync(join(folder, `${record.hash}.img`))) return undefined
  • 写入本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:107
    mkdirSync(folder, {recursive:true})
  • 写入本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:109
    writeFileSync(join(folder, `${hash}.img`), bytes)
  • 写入本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:111
    try { writeFileSync(temp, JSON.stringify(record)); renameSync(temp, join(folder, `${identity(website)}.json`)) } finally {try{unlinkSync(temp)}catch{}
  • 写入本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:111
    try { writeFileSync(temp, JSON.stringify(record)); renameSync(temp, join(folder, `${identity(website)}.json`)) } finally {try{unlinkSync(temp)}catch{}
  • 删除本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:111
    try { writeFileSync(temp, JSON.stringify(record)); renameSync(temp, join(folder, `${identity(website)}.json`)) } finally {try{unlinkSync(temp)}catch{}
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/logos.js:119
    return {bytes:readFileSync(join(folder, `${record.hash}.img`)),type:record.type,hash:record.hash}
  • 读取本地文件
    Api-Switcher插件/2.3.0/lib/store.js:7
    const value = JSON.parse(readFileSync(path, 'utf8').replace(/^ FEFF/, ''))
  • 写入本地文件
    Api-Switcher插件/2.3.0/lib/store.js:18
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    Api-Switcher插件/2.3.0/lib/store.js:21
    writeFileSync(temp, JSON.stringify(value, null, 2) + '\n', { flag: 'wx', mode: 0o600 })
  • 写入本地文件
    Api-Switcher插件/2.3.0/lib/store.js:22
    renameSync(temp, path)
  • 删除本地文件
    Api-Switcher插件/2.3.0/lib/store.js:23
    } finally { try { unlinkSync(temp) } catch {} }
  • 发起网络请求
    DSH控制桥插件/1.0.0/lib/client.js:22
    async function post(leaf,data){const r=await fetch(root+leaf,{method:'POST',headers:{'content-type':'application/json','x-dsh-control-client':'1'},bod
  • 写入本地文件
    DSH控制桥插件/1.0.0/lib/control.js:6
    export function atomic(file,value) { mkdirSync(dirname(file),{recursive:true});const tmp=file+'.'+randomUUID()+'.tmp';writeFileSync(tmp,JSON.stringify
  • 写入本地文件
    DSH控制桥插件/1.0.0/lib/control.js:6
    export function atomic(file,value) { mkdirSync(dirname(file),{recursive:true});const tmp=file+'.'+randomUUID()+'.tmp';writeFileSync(tmp,JSON.stringify
  • 写入本地文件
    DSH控制桥插件/1.0.0/lib/control.js:6
    export function atomic(file,value) { mkdirSync(dirname(file),{recursive:true});const tmp=file+'.'+randomUUID()+'.tmp';writeFileSync(tmp,JSON.stringify
  • 读取本地文件
    DSH控制桥插件/1.0.0/lib/control.js:11
    const receipts=existsSync(stateFile)?JSON.parse(readFileSync(stateFile,'utf8')):{};
  • 读取本地文件
    DSH控制桥插件/1.0.0/lib/control.js:11
    const receipts=existsSync(stateFile)?JSON.parse(readFileSync(stateFile,'utf8')):{};
  • 读取本地文件
    DSH控制桥插件/1.0.0/lib/index.js:13
    export function route(control,token){let lastClientRequest;return {kind:'prefix',path:ROOT,handler:async(req,res)=>{const send=(status,data)=>{res.sta
  • 读取本地文件
    Token用量插件/1.0.0/lib/index.js:6192
    res.end(readFileSync(new URL("./assets/logo.png", import.meta.url)));
  • 读取本地文件
    Token用量插件/1.0.0/src/routes.ts:155
    res.end(readFileSync(new URL('./assets/logo.png', import.meta.url)))
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/cache.js:27
    try{const b=readFileSync(path);if(b.length>MAX_BYTES)throw new Error('仓库缓存过大');const v=JSON.parse(b.toString('utf8'));
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/cache.js:36
    try{writeFileSync(temp,data,{encoding:'utf8',mode:0o600});renameSync(temp,path);}finally{try{unlinkSync(temp);}catch{}}
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/cache.js:36
    try{writeFileSync(temp,data,{encoding:'utf8',mode:0o600});renameSync(temp,path);}finally{try{unlinkSync(temp);}catch{}}
  • 删除本地文件
    仓库插件管理器/1.3.0/lib/cache.js:36
    try{writeFileSync(temp,data,{encoding:'utf8',mode:0o600});renameSync(temp,path);}finally{try{unlinkSync(temp);}catch{}}
  • 发起网络请求
    仓库插件管理器/1.3.0/lib/catalog.js:11
    const r=await fetch(url,{headers:{'User-Agent':'DSH-Repo-Manager','Accept':'application/vnd.github+json'},signal:AbortSignal.timeout(60000)});
  • 发起网络请求
    仓库插件管理器/1.3.0/lib/client.js:128
    const r=await fetch(ROOT+'state'+(refresh?'?refresh=1':''),{headers:{'x-dsh-repo-manager':'1'},...(ac?{signal:ac.signal}:{})});
  • 发起网络请求
    仓库插件管理器/1.3.0/lib/client.js:163
    const r=await fetch(ROOT+'action',{method:'POST',headers:{'x-dsh-repo-manager':'1','content-type':'application/json'},body:JSON.stringify(confirm.payl
  • 发起网络请求
    仓库插件管理器/1.3.0/lib/client.js:174
    try{const r=await fetch(ROOT+'preferences',{method:'POST',headers:{'x-dsh-repo-manager':'1','content-type':'application/json'},body:JSON.stringify({re
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/index.js:20
    mkdirSync(directory,{recursive:true});
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/index.js:22
    if(existsSync(preferencesFile)){try{const preferences=JSON.parse(readFileSync(preferencesFile,'utf8'));receiveTests=preferences.schema===1&&preference
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/index.js:22
    if(existsSync(preferencesFile)){try{const preferences=JSON.parse(readFileSync(preferencesFile,'utf8'));receiveTests=preferences.schema===1&&preference
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/index.js:27
    if(existsSync(jobsFile)){try{for(const j of JSON.parse(readFileSync(jobsFile,'utf8'))){if(!['done','failed'].includes(j.status)){j.status='uncertain';
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/index.js:27
    if(existsSync(jobsFile)){try{for(const j of JSON.parse(readFileSync(jobsFile,'utf8'))){if(!['done','failed'].includes(j.status)){j.status='uncertain';
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/index.js:30
    const save=()=>{if(disposed)return;const path=jobsFile+'.'+randomUUID()+'.tmp';writeFileSync(path,JSON.stringify([...jobs.values()].slice(-40),null,2)
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/index.js:30
    const save=()=>{if(disposed)return;const path=jobsFile+'.'+randomUUID()+'.tmp';writeFileSync(path,JSON.stringify([...jobs.values()].slice(-40),null,2)
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/index.js:48
    if(value!==receiveTests){const temporary=preferencesFile+'.'+randomUUID()+'.tmp';writeFileSync(temporary,JSON.stringify({schema:1,receiveTests:value})
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/index.js:48
    if(value!==receiveTests){const temporary=preferencesFile+'.'+randomUUID()+'.tmp';writeFileSync(temporary,JSON.stringify({schema:1,receiveTests:value})
  • 写入本地文件
    仓库插件管理器/1.3.0/lib/index.js:82
    const path=join(directory,`${item.name}-${item.version}-${item.sha256.slice(0,16)}.tgz`);writeFileSync(path+'.tmp',data);renameSync(path+'.tmp',path);
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/index.js:123
    if(req.method==='GET'&&['/logo','/icon'].includes(leaf)){res.setHeader('content-type','image/png');res.end(readFileSync(new URL('./assets/'+(leaf==='/
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/operations.js:12
    if(path&&!existsSync(path))throw new Error('已安装插件 '+bundle.name+' 的本地安装源不存在:'+path+'。请先恢复该安装包或重新安装此插件,再更新;未执行安装。');
  • 读取本地文件
    仓库插件管理器/1.3.0/lib/operations.js:18
    try{return sha256(readFileSync(path))===target.sha256;}catch{return false;}
  • 发起网络请求
    仓库插件管理器/1.3.0/src/client.js:128
    const r=await fetch(ROOT+'state'+(refresh?'?refresh=1':''),{headers:{'x-dsh-repo-manager':'1'},...(ac?{signal:ac.signal}:{})});
  • 发起网络请求
    仓库插件管理器/1.3.0/src/client.js:163
    const r=await fetch(ROOT+'action',{method:'POST',headers:{'x-dsh-repo-manager':'1','content-type':'application/json'},body:JSON.stringify(confirm.payl
  • 发起网络请求
    仓库插件管理器/1.3.0/src/client.js:174
    try{const r=await fetch(ROOT+'preferences',{method:'POST',headers:{'x-dsh-repo-manager':'1','content-type':'application/json'},body:JSON.stringify({re
  • 发起网络请求
    故事中控台/0.8.0/lib/client.js:4
    async function api(leaf,body){const r=await fetch(ROOT+leaf,{method:body?'POST':'GET',headers:{'x-storydeck':'1',...(body?{'content-type':'application
  • 写入本地文件
    故事中控台/0.8.0/lib/core.js:134
    constructor(file,{resolveWorkspace=()=>null}={}) { this.file=file;this.resolveWorkspace=resolveWorkspace; mkdirSync(dirname(file),{recursive:true}); t
  • 读取本地文件
    故事中控台/0.8.0/lib/core.js:171
    if(!existsSync(this.file)) return empty();
  • 读取本地文件
    故事中控台/0.8.0/lib/core.js:172
    const raw=readFileSync(this.file,'utf8');check(Buffer.byteLength(raw)<=32*1024*1024,'数据文件过大');
  • 读取本地文件
    故事中控台/0.8.0/lib/core.js:191
    if(existsSync(this.file)&&JSON.parse(readFileSync(this.file,'utf8')).schema===1&&!existsSync(this.file+'.schema1-backup'))writeFileSync(this.file+'.sc
  • 写入本地文件
    故事中控台/0.8.0/lib/core.js:191
    if(existsSync(this.file)&&JSON.parse(readFileSync(this.file,'utf8')).schema===1&&!existsSync(this.file+'.schema1-backup'))writeFileSync(this.file+'.sc
  • 读取本地文件
    故事中控台/0.8.0/lib/core.js:191
    if(existsSync(this.file)&&JSON.parse(readFileSync(this.file,'utf8')).schema===1&&!existsSync(this.file+'.schema1-backup'))writeFileSync(this.file+'.sc
  • 读取本地文件
    故事中控台/0.8.0/lib/core.js:192
    if(existsSync(this.file)&&JSON.parse(readFileSync(this.file,'utf8')).schema===2&&!existsSync(this.file+'.schema2-backup'))writeFileSync(this.file+'.sc
  • 写入本地文件
    故事中控台/0.8.0/lib/core.js:192
    if(existsSync(this.file)&&JSON.parse(readFileSync(this.file,'utf8')).schema===2&&!existsSync(this.file+'.schema2-backup'))writeFileSync(this.file+'.sc
  • 读取本地文件
    故事中控台/0.8.0/lib/core.js:192
    if(existsSync(this.file)&&JSON.parse(readFileSync(this.file,'utf8')).schema===2&&!existsSync(this.file+'.schema2-backup'))writeFileSync(this.file+'.sc
  • 写入本地文件
    故事中控台/0.8.0/lib/core.js:193
    if(existsSync(this.file)&&JSON.parse(readFileSync(this.file,'utf8')).schema===3&&!existsSync(this.file+'.schema3-backup'))writeFileSync(this.file+'.sc
  • 写入本地文件
    故事中控台/0.8.0/lib/core.js:195
    try { writeFileSync(tmp,bytes,{flag:'wx'});renameSync(tmp,this.file); }
  • 写入本地文件
    故事中控台/0.8.0/lib/core.js:195
    try { writeFileSync(tmp,bytes,{flag:'wx'});renameSync(tmp,this.file); }
  • 删除本地文件
    故事中控台/0.8.0/lib/core.js:196
    finally { if(existsSync(tmp)) unlinkSync(tmp); }
  • 删除本地文件
    故事中控台/0.8.0/lib/core.js:198
    } finally { closeSync(handle);unlinkSync(lock); }
  • 读取本地文件
    故事中控台/0.8.0/lib/worldbook.js:53
    res.end(readFileSync(new URL('./assets/star-map.html',import.meta.url)));return;
  • 读取本地文件
    故事中控台/0.8.0/lib/worldbook.js:56
    res.setHeader('content-type','image/png');res.end(readFileSync(new URL('./assets/'+(leaf==='/logo'?'logo':leaf==='/mascot'?'mascot':'icon')+'.png',imp
  • 发起网络请求
    故事中控台/0.8.0/src/client.js:4
    async function api(leaf,body){const r=await fetch(ROOT+leaf,{method:body?'POST':'GET',headers:{'x-storydeck':'1',...(body?{'content-type':'application
  • 发起网络请求
    故事中控台/0.8.0/src/star-map-runtime.js:15
    async function api(leaf,body){const controller=new AbortController(),timer=setTimeout(()=>controller.abort(),20000);try{const r=await fetch('/storydec
  • 发起网络请求
    最高指令插件/1.1.2/lib/client.js:9
    const response = await fetch(root + leaf, {
  • 读取本地文件
    最高指令插件/1.1.2/lib/index.js:29
    res.end(readFileSync(new URL('./assets/logo.png', import.meta.url)))
  • 读取本地文件
    最高指令插件/1.1.2/lib/state.js:14
    return JSON.parse(readFileSync(file, 'utf8').replace(/^ FEFF/, ''))
  • 写入本地文件
    最高指令插件/1.1.2/lib/state.js:22
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    最高指令插件/1.1.2/lib/state.js:27
    writeFileSync(fd, `${JSON.stringify(value, null, 2)}\n`, 'utf8')
  • 写入本地文件
    最高指令插件/1.1.2/lib/state.js:30
    renameSync(tmp, file)
  • 删除本地文件
    最高指令插件/1.1.2/lib/state.js:33
    if (existsSync(tmp)) unlinkSync(tmp)
  • 读取本地文件
    最高指令插件/1.1.2/lib/state.js:33
    if (existsSync(tmp)) unlinkSync(tmp)
  • 读取本地文件
    最高指令插件/1.1.2/lib/state.js:38
    if (!existsSync(file)) return { state: defaultState(), recovered: false, warning: '' }
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH插件:最高指令1.1.2、Api-Switcher2.1.5。完整源码、图文使用说明与最新版安装包。

README

由 DeepSeek 最新模型翻译生成
DSH 插件 为 DSH 桌面提供模型管理、全局提示词、用量统计、外部控制和世界书功能。 | 插件 | 版本 | 功能 | 安装包 | | api-switcher | 2.3.0 | 管理 API 服务商,在会话中搜索和切换模型,配置思考参数 | 下载 | | 最高指令 | 1.1.2 | 编辑全局系统提示词,保存原文,随时启停 | 下载 | | 使用统计·大肥鱼定制版 | 1.0.0 | 查看 Token 用量、活跃热力图、模型与服务商占比 | 下载 | | DSH Control Bridge | 1.0.0 | 通过宿主接口和 DOM 控件树管理 DSH | 下载 | | 鲸鱼娘插件仓库 | 1.1.2 | 在 DSH 内安装、更新和管理本仓库插件 | 下载 | | 故事中控台 StoryDeck | 0.2.0 | 导入世界书,按对话选择条目,记录剧情状态和事件 | 下载 | 安装 在插件对应的 Release 下载预构建 TGZ,通过 DSH 插件管理添加。Windows 用户也可下载 ZIP,解压后按包内说明安装;最高指令提供单独的 PowerShell 安装器。安装器需要关闭 DSH 时,先完成正在运行的任务。 各插件的 README 包含使用方法、配置位置和开发入口。Release 附带 SHA-256 清单。
展开完整文档(README 剩余 1 节)
DSH 插件

为 DSH 桌面提供模型管理、全局提示词、用量统计、外部控制和世界书功能。

| 插件 | 版本 | 功能 | 安装包 |
| api-switcher | 2.3.0 | 管理 API 服务商,在会话中搜索和切换模型,配置思考参数 | 下载 |
| 最高指令 | 1.1.2 | 编辑全局系统提示词,保存原文,随时启停 | 下载 |
| 使用统计·大肥鱼定制版 | 1.0.0 | 查看 Token 用量、活跃热力图、模型与服务商占比 | 下载 |
| DSH Control Bridge | 1.0.0 | 通过宿主接口和 DOM 控件树管理 DSH | 下载 |
| 鲸鱼娘插件仓库 | 1.1.2 | 在 DSH 内安装、更新和管理本仓库插件 | 下载 |
| 故事中控台 StoryDeck | 0.2.0 | 导入世界书,按对话选择条目,记录剧情状态和事件 | 下载 |

安装

在插件对应的 Release 下载预构建 TGZ,通过 DSH 插件管理添加。Windows 用户也可下载 ZIP,解压后按包内说明安装;最高指令提供单独的 PowerShell 安装器。安装器需要关闭 DSH 时,先完成正在运行的任务。

各插件的 README 包含使用方法、配置位置和开发入口。Release 附带 SHA-256 清单。

源码与配套工具

每个插件按「项目/版本」存放,版本目录包含独立项目源码。默认分支提供当前版本,历史变更可通过 Git 提交查看。

DSH Control Bridge 的 Codex 端配套插件位于 Codex-Plugins。

代码采用 MIT 许可。使用统计基于 HaoyueQin/dsh-usage-statistics-panel 定制,依赖与素材来源见各项目的第三方声明。
预览分享卡片长什么样 ↓ccl4-56-23-5/DSH-Plugins
分享 · DeepSeek Harness Hub
ccl4-56-23-5/DSH-Plugins

在 DSH 内一键安装、更新并管理本仓库的全部插件

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部