让官方 DeepSeek Harness 拥有更完整的工作台、主题和创作入口。
数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
dsh plugin --profile web add yubowen123/AIYOUDSH状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;engines.node 要求 >=24,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/4 03:23:59
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
查看扫描证据(共 110 处,展示前 79 条)
- 读取本地文件addon/installer.mjs:15
const optional = async file => { try { return await readFile(file); } catch (error) { if (error.code === 'ENOENT') return null; throw error; } }; - 读取本地文件addon/installer.mjs:16
const metadata = async file => { try { return await lstat(file); } catch (error) { if (error.code === 'ENOENT') return null; throw error; } }; - 写入本地文件addon/installer.mjs:22
async function privateDirectory(path) { await mkdir(path, { recursive: true, mode: 0o700 }); } - 写入本地文件addon/installer.mjs:24
await mkdir(dirname(file), { recursive: true, mode: 0o700 }); - 写入本地文件addon/installer.mjs:27
await writeFile(temporary, bytes, { flag: 'wx', mode }); - 写入本地文件addon/installer.mjs:32
await rename(temporary, file); - 删除本地文件addon/installer.mjs:34
finally { await rm(temporary, { force: true }); } - 读取本地文件addon/installer.mjs:131
for await (const chunk of createReadStream(file)) digest.update(chunk); - 读取本地文件addon/installer.mjs:155
for (const entry of (await readdir(join(root, prefix), { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) { - 读取本地文件addon/installer.mjs:159
else if (entry.isFile()) records.push({ file, sha256: hash(await readFile(join(root, file))) }); - 读取本地文件addon/installer.mjs:236
const manifestBytes = await readFile(join(state.runtimePath, 'manifest.json')); - 写入本地文件addon/installer.mjs:330
await mkdir(dirname(row.path), { recursive: true }); - 删除本地文件addon/installer.mjs:334
await unlink(row.path); - 删除本地文件addon/installer.mjs:347
await unlink(row.path); - 删除本地文件addon/installer.mjs:380
await unlink(row.path); - 写入本地文件addon/installer.mjs:388
try { await mkdir(lock, { mode: 0o700 }); } catch (error) { if (error.code === 'EEXIST') throw fail('INSTALLER_BUSY', 'Another installer is active; no - 删除本地文件递归addon/installer.mjs:389
try { return await operation(); } finally { await rm(lock, { recursive: true, force: true }); } - 删除本地文件addon/installer.mjs:488
if (raw) await atomic(patchFile, raw, receipt.patch.mode, receipt.patch.afterHash); else await rm(patchFile, { force: true }); - 写入本地文件aiyou/build.mjs:9
await mkdir(domain,{recursive:true}); - 读取本地文件aiyou/build.mjs:11
const manifest=JSON.parse(await readFile(join(SOURCE,'manifest.json'),'utf8')); - 写入本地文件aiyou/build.mjs:13
const target=join(dsh,'node_modules',...module.name.split('/'));await mkdir(target,{recursive:true}); - 读取本地文件aiyou/build.mjs:14
const meta=JSON.parse(await readFile(join(SOURCE,'modules',module.id,'package.json'),'utf8')); - 写入本地文件aiyou/build.mjs:15
await writeFile(join(target,'package.json'),JSON.stringify(meta,null,2)+'\n'); - 写入本地文件aiyou/build.mjs:16
await writeFile(join(target,'index.js'),`export * from '../../../aiyou/modules/${module.id}/index.js';\n`); - 读取本地文件aiyou/build.mjs:20
const descriptor=JSON.parse(await readFile(descriptorFile,'utf8')); - 写入本地文件aiyou/build.mjs:23
await writeFile(descriptorFile,JSON.stringify(descriptor,null,2)+'\n'); - 读取本地文件aiyou/build.mjs:24
const packageFile=join(dsh,'package.json');const pkg=JSON.parse(await readFile(packageFile,'utf8')); - 写入本地文件aiyou/build.mjs:26
await writeFile(packageFile,JSON.stringify(pkg,null,2)+'\n'); - 读取本地文件aiyou/build.mjs:38
const manifest=JSON.parse(await readFile(join(SOURCE,'manifest.json'),'utf8')); - 发起网络请求aiyou/lib/laya-document-search.mjs:109
const ranked = await runtime.request("rank-documents", candidates.map(row => ({ id: row.id, text: `${row.title}\n${row.snippet}` })), cleanSearchText( - 写入本地文件aiyou/lib/laya-search.mjs:38
await mkdir(path.dirname(file), { recursive: true }); - 写入本地文件aiyou/lib/laya-search.mjs:39
const tmp = `${file}.${randomUUID()}.tmp`; await writeFile(tmp, JSON.stringify(data), { mode: 0o600 }); await rename(tmp, file); - 写入本地文件aiyou/lib/laya-search.mjs:39
const tmp = `${file}.${randomUUID()}.tmp`; await writeFile(tmp, JSON.stringify(data), { mode: 0o600 }); await rename(tmp, file); - 读取本地文件aiyou/lib/laya-search.mjs:52
let config; try { config = JSON.parse(await readFile(this.configPath, "utf8")); } catch { throw unavailable(); } - 读取本地文件aiyou/lib/laya-search.mjs:54
await Promise.all([stat(config.pythonPath), stat(path.join(config.modelPath, "model.safetensors"))]).catch(() => { throw unavailable(); }); - 执行外部命令来自配置/变量aiyou/lib/laya-search.mjs:57
const child = spawn(config.pythonPath, ["-u", worker, config.modelPath], { stdio: ["pipe", "pipe", "pipe"], - 读取本地文件aiyou/lib/laya-search.mjs:104
let saved; if (!this.ready) try { saved = JSON.parse(await readFile(this.cachePath, "utf8")); } catch {} - 读取本地文件aiyou/lib/laya-search.mjs:110
try { info = await stat(file); } catch { documents.push({ ...entry, revision: "unavailable", chunks: [] }); this.progress.scanned++; continue; } - 读取本地文件aiyou/lib/laya-search.mjs:114
const chunks = [], seen = new Set(); const lines = createInterface({ input: createReadStream(file), crlfDelay: Infinity }); - 读取本地文件aiyou/lib/laya-search.mjs:135
const state = JSON.parse(await readFile(this.repository.globalStatePath, "utf8")); - 发起网络请求aiyou/lib/laya-search.mjs:205
const result = await runtime.request("profile", rows.slice(start, start + 24).map(p => ({ id: p.id, text: p.name + "\n" + p.titles.slice(0, 12).join(" - 发起网络请求aiyou/lib/laya-search.mjs:232
const ranked = candidates.length ? await runtime.request("rank", candidates.map(x => ({ id: x.id, text: x.text })), payload.query) : { items: [], elap - 读取本地文件aiyou/lib/preview-data.mjs:186
for await (const chunk of createReadStream(filePath, { start })) { - 读取本地文件aiyou/lib/preview-data.mjs:343
const fileStat = await stat(filePath); - 读取本地文件aiyou/lib/preview-data.mjs:364
entries = await readdir(root, { withFileTypes: true }); - 读取本地文件aiyou/lib/preview-data.mjs:412
const content = await readFile(this.sessionIndexPath, "utf8"); - 读取本地文件aiyou/lib/preview-data.mjs:466
try { if (!(await stat(filePath)).isFile()) return null; } catch { return null; } - 读取本地文件aiyou/lib/preview-data.mjs:521
const info = await stat(record.filePath); - 读取本地文件aiyou/lib/session-catalog.mjs:24
const info = await stat(filePath); - 读取本地文件aiyou/lib/session-catalog.mjs:51
await access(dbPath); - 读取本地文件aiyou/runtime.mjs:12
try { return JSON.parse(await readFile(join(stateRoot(), name), 'utf8')); } - 写入本地文件aiyou/runtime.mjs:20
await mkdir(stateRoot(), {recursive:true}); - 写入本地文件aiyou/runtime.mjs:23
await writeFile(temporary, JSON.stringify(next,null,2)+'\n', {mode:0o600}); - 写入本地文件aiyou/runtime.mjs:24
await rename(temporary,file); - 写入本地文件aiyou/services.mjs:10
async function seed(file,value){try{await access(file);}catch{await writeFile(file,JSON.stringify(value,null,2)+'\n',{mode:0o600,flag:'wx'}).catch(err - 读取本地文件aiyou/services.mjs:10
async function seed(file,value){try{await access(file);}catch{await writeFile(file,JSON.stringify(value,null,2)+'\n',{mode:0o600,flag:'wx'}).catch(err - 写入本地文件aiyou/services.mjs:13
await mkdir(root,{recursive:true});await mkdir(isolated,{recursive:true});await mkdir(join(root,'assets'),{recursive:true}); - 执行外部命令来自配置/变量aiyou/services.mjs:17
const child=spawn(process.execPath,[join(SOURCE,'service-worker.mjs'),kind],{cwd:SOURCE,env,stdio:['ignore','ignore','pipe','ipc'],windowsHide:true}); - 发起网络请求aiyou/services.mjs:38
const method=req.method||'GET';const response=await fetch(current.origin+path,{method,headers,...(['GET','HEAD'].includes(method)?{}:{body:req,duplex: - 发起网络请求aiyou/verify-embedded.mjs:53
let response=await fetch(origin+prefix); - 发起网络请求aiyou/verify-embedded.mjs:69
response=await fetch(url); - 发起网络请求aiyou/verify-embedded.mjs:77
assert.equal((await fetch(dependency)).status,200,dependency.pathname); - 发起网络请求aiyou/verify-embedded.mjs:82
response=await fetch(origin+prefix+'api/projects'); - 删除本地文件递归aiyou/verify-embedded.mjs:99
await rm(fixture,{recursive:true,force:true}); - 读取本地文件aiyou/verify.mjs:12
for(const module of JSON.parse(await readFile(join(root,'manifest.json'),'utf8')).modules){ - 读取本地文件aiyou/verify.mjs:15
vm.runInNewContext(await readFile(join(root,'modules',module.id,'client.js'),'utf8'),{window:{__ModuleLoader__:{load:value=>{definition=value;}}},cons - 发起网络请求aiyou/verify.mjs:31
let response=await fetch(board.origin+'/api/projects',{headers:{'x-aiyou-internal-token':board.token}});assert.equal(response.status,200); - 发起网络请求aiyou/verify.mjs:33
response=await fetch(board.origin+'/api/projects',{method:'POST',headers:{'content-type':'application/json','x-aiyou-internal-token':board.token},body - 发起网络请求aiyou/verify.mjs:35
response=await fetch(board.origin+'/api/tasks',{method:'POST',headers:{'content-type':'application/json','x-aiyou-internal-token':board.token},body:JS - 发起网络请求aiyou/verify.mjs:37
response=await fetch(board.origin+'/',{headers:{'x-aiyou-internal-token':board.token}});assert.equal(response.status,200);assert.match(await response. - 发起网络请求aiyou/verify.mjs:40
response=await fetch(asset.origin+'/api/library');assert.ok([401,403].includes(response.status)); - 发起网络请求aiyou/verify.mjs:41
response=await fetch(asset.origin+'/api/library',{headers:{'x-asset-console-token':asset.token}});const library=await response.json();assert.equal(res - 读取本地文件aiyou/verify.mjs:44
const source=await readFile(join(root,'modules','model-arena','index.js'),'utf8');assert.ok(source.includes('AIYOU_ARENA_MCP_URL'));assert.ok(!source. - 删除本地文件递归aiyou/verify.mjs:46
}finally{await stopServices();await rm(fixture,{recursive:true,force:true});} - 读取本地文件installer-ui/build.mjs:21
const { version } = JSON.parse(await readFile(join(sourceDirectory, '..', 'package.json'), 'utf8')); - 写入本地文件installer-ui/build.mjs:27
await mkdir(macOS, { recursive: true }); - 写入本地文件installer-ui/build.mjs:28
await mkdir(resources, { recursive: true }); - 读取本地文件installer-ui/build.mjs:32
await access(join(absoluteResources, relative)); - 写入本地文件installer-ui/build.mjs:45
await writeFile(infoPath, `<?xml version="1.0" encoding="UTF-8"?>
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
AIYOUDSH:面向 Windows x64 与 macOS Apple Silicon 的 DeepSeek Harness 可卸载桌面增强。主题配置与动态背景、独立导航、会话与资产管理、MOKE 入口、完整可构建源码。
README
由 DeepSeek 最新模型翻译生成展开完整文档(README 剩余 1 节)
AIYOUDSH 让官方 DeepSeek Harness 拥有更完整的工作台、主题和创作入口。 AIYOUDSH 是可安装、可卸载的桌面增强包。它基于官方安装包的原生扩展接口,重新整理导航和对话侧栏,加入主题配置、动态背景、本地资产与项目管理。v0.8.6 新增独立对话卡片透明度,并修复主题保存后重开设置的读回竞态。Windows x64、Mac arm64 与 Mac Intel x64 同步提供安装包。此前 v0.8.5 新增 GGWK / APIAI 默认媒体通道,填写 Key 后自动配置图片/视频模型;保留 Intel Mac(x64)独立安装包,并延续 AIYOUPLUS 画布与创作工具的本地融合,文字使用宿主模型,素材使用 DSH 统一素材库;新增全插件主题同步和独立的画布外观配置;素材库采用左目录右素材,支持目录关联与扫描,媒体 API 支持文档、模型目录与调用合同自动关联配置。本轮主题检查在 macOS Apple Silicon 与隔离浏览器中分层验证;Windows x64 继续使用独立官方基线,新增主题及画布能力尚未完成 Windows 桌面实测。 下载 v0.8.6 · 安装与卸载 · 功能说明 · 主题与动效 · 构建源码 · 问题反馈 AIYOUDSH 工作台:左侧功能栏与对话列表、中间聊天和主题背景;macOS 实机 本次主题修复及三平台验证范围见 v0.8.6 说明;默认媒体通道见 v0.8.5 说明,Intel 架构基线见 v0.8.4 说明。 下载与兼容 | 平台 | 安装包 | 条件 | | Windows 10 / 11 x64 | AIYOUDSH-v0.8.6-windows-x64.zip | 官方 x64 应用、.NET Framework 4.8;安装器与隔离事务验证,完整聊天界面仍待实机验收 | | macOS Apple Silicon arm64 | AIYOUDSH-v0.8.6-macos-arm64.zip | 官方 arm64 应用;原生 AppKit 安装器 | | macOS Intel x64 | AIYOUDSH-v0.8.6-macos-x64.zip | macOS 13+;官方 Intel rc.1 应用;独立 x64 安装器与媒体工具 | | 可构建源码 | AIYOUDSH-v0.8.6-source.zip | Node.js 24 或更新版本;按平台构建 | SHA-256 校验文件 · v0.5.0 说明 · 上一版 macOS v0.4.0 Apple Silicon 与 Windows 目标固定官方 0.2.1-rc.2 / 332895e;Intel 目标固定官方 0.2.1-rc.1 / ed75efe,其官方 Intel ZIP已独立核对。各包校验对应架构、应用归档和组件哈希,不匹配时停止安装。Windows ARM 不在支持范围。 工作台与功能 - 画布与创作。 左侧画布、创作工具和媒体模型菜单;支持对话控制原画布、同库素材插入、图片/视频/音频自定义接口及文档智能配置。说明与验证边界见融合说明。 - 统一工作台。 独立竖向功能栏与会话列表,置顶、项目、最近、中断四类视图;搜索、摘要、标签和三色标注。工具在右侧打开,中间聊天保留。 - 统一主题与画布外观。 七套内置主题加系统默认,资产库、项目看板、媒体模型、原生信息面板及本机画布页面跟随主题。全局保留 15 项透明度与 13 项颜色;画布另有 9 项颜色、4 项底色透明度、背景与网格配置。保存同步到其他宿主窗口,本地未保存预览受到保护。 - 真实动态背景。 机甲主题使用原视频静音循环;关闭动态、系统减少动态或媒体加载失败时,回退到静态背景。 - 创作入口。 MOKE AIGC 使用官方内置浏览器;资产控制台和项目看板使用随包本地服务。 - 对话工具归位。 用量与上下文、输出目录位于有消息对话的顶部右侧,绑定当前对话。 界面与窗口名称统一为 AIYOUDSH,Claude Code 功能模块、菜单及本增强拥有的遗留标签页已移除。官方应用包与系统应用入口保留原名。功能以原生插件和随包本地服务装配,保留参考源码的模块不等于默认启用。 Windows 版本使用独立官方基线和语义 CSS 映射适配原生界面与主题,并非将 Mac 包改名分发。功能范围、待连接的模型通道和验证边界见功能说明。 界面预览 | 主题与动效配置 · macOS | MOKE 内置浏览器 · macOS | | macOS 主题与动效配置 | macOS MOKE AIGC 原生内置浏览器 | | 各区域分别调节,修改先预览,保存后保留。 | 保留原生地址栏、前进后退、刷新和外部打开。 | macOS 中文增强安装器 以上为 v0.4.0 的 macOS 实机截图,展示两平台共用的功能设计;不是 Windows 宿主界面截图。欢迎页在未发送演示消息的状态下拍摄,历史会话通过搜索筛选隐藏。截图来源 Windows 中文增强安装器:CI 中由实际 WinForms 程序渲染 Windows 图为实际编译安装器在 GitHub Windows runner 中的准备界面,不是 Windows 宿主聊天截图。 产品能力与主题图解 AIYOUDSH 完整能力与主题图解:共享画布、统一素材、创作工具、媒体模型、Codex CLI 与项目管理 详细展示共享画布、统一素材库、22 个创作工具、媒体 API 智能配置、本地 Codex CLI、项目与对话管理,以及多主题配色、透明度、背景和画布外观联动。图中工作台与主题界面为能力示意,实际界面见上方截图。功能范围见功能说明,使用边界见审查与剩余事项。 安装 先正常打开一次受支持的官方 DeepSeek Harness,完成 profile 初始化,再完整解压对应平台增强包。 - Windows: 双击 AIYOUDSHInstaller.exe,点击“安装增强”。未自动找到官方应用时,选择包含 DeepSeek Harness.exe 和 resources/app.asar 的安装目录。不要仅移动安装器 EXE。 - macOS: 打开 AIYOUDSH 增强安装器.app,点击“安装增强”。 完成后退出并重新打开官方应用。卸载使用同一安装器的“卸载增强”;两平台也提供对应的安装/卸载脚本。 安装前自动建立备份。更新和卸载遇到用户后续修改时会保护现场并报告冲突;官方应用文件、已有会话、草稿与账号仍由宿主管理。安装、路径与恢复规则 源码构建 git clone https://github.com/yubowen123/AIYOUDSH.git cd AIYOUDSH npm run build npm test npm run verify Node.js 24 起,默认按当前平台构建 dist/addon/runtime/;也可显式选择 darwin-arm64、darwin-x64 或 win32-x64 目标。根构建使用随仓库依赖,无需先运行 npm install。macOS 打包使用 npm run package,Windows 使用 npm run package:windows。开发与验证指南 当前范围 AIYOUDSH 是官方应用的外挂增强,不是可独立启动的官方 fork。源码包含可编辑 JavaScript 恢复分区、新增扩展与本地服务,不宣称还原官方原始 TypeScript 工程或与 AIYOUcodex 全功能等价。 机甲为 4 秒背景视频循环,其他主题使用静态背景或明确标注的中性纹理回退;原版事件动效、声音、轮播与媒体上传页尚未接入。MOKE 的登录和跨重启页面状态由官方 Browser 与站点管理,主题仅作用于原生容器,不注入外站内部。主题清单 · 本轮验证边界 联系作者 / Contact 扫码添加作者微信,交流使用体验与项目合作。 来源与许可 基于 DeepSeek Harness 发布组件及 AIYOUcodex 适配逻辑,保留 DeepSeek 与第三方项目的署名和许可。任务看板、资产服务、字体、YAML、MOKE 标识和主题媒体有各自来源;代码许可不转授第三方角色、商标或媒体权利。许可与素材 · 第三方声明 AIYOUDSH 是官方 DeepSeek Harness 的可移除工作台与主题扩展。v0.8.3 新增共享画布、DSH 资产工作流、可配置媒体 API 和本地 Codex 命令行集成。v0.8.6 新增独立的对话卡片透明度,并修复保存成功后设置回读陈旧的问题。Windows x64、macOS Apple Silicon 和 Intel x64 安装包连同完整源码一并发布。新的画布/主题功能尚未完成 Windows 桌面验证。Intel 目标需要 macOS 13+ 和官方 0.2.1-rc.1 / ed75efe;Apple Silicon 和 Windows 保留 0.2.1-rc.2 / 332895e。源码包含可编辑的 JavaScript 重建分区与扩展,不是独立应用,也不是对原始 TypeScript 项目的还原。上方图库展示的是 macOS 截图;验证范围见发布说明。
预览分享卡片长什么样 ↓
让官方 DeepSeek Harness 拥有更完整的工作台、主题和创作入口。
相关插件 · UI / 主题
这是你的仓库?认领条目