deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
把 DeepSeek Harness (DSH) 的 Web 界面改造成一个 复古情怀 + 现代 macOS(Big Sur / Sonoma)质感 的桌面系统。它不替换官方界面,而是通过 DSH 官方 shell.overlay 槽位,在官方对话之上叠加一整块桌面:
一句话:把 DSH 装进一台「Mac」——文件、终端、文档、浏览器、知识库、便签、番茄钟、截图、AI 生图、AI 看图,都在同一个窗口系统里完成,同时官方对话能力一个不丢。
| 类别 | 能力 |
|---|---|
| 桌面 | 左右分栏 + 毛玻璃、多窗口、Aero Snap 边缘吸附、Spotlight 搜索(⌘K)、迷你日历、天气、深色模式、开机蓝鲸动画 |
| 文件 | 隔离的 desktop/ 目录、回收站、便签(位置持久化)、拖拽上传、右键菜单(复制路径 / 设为壁纸 / 用 AI) |
| 应用 | 终端(Win powershell/cmd + POSIX PTY)、多标签浏览器、文档办公(docx/pdf/pptx + 富文本)、知识库、计算器、番茄钟 |
| AI | 原生对话、用 AI 看图(modlens)、截图→自动看图→发给 AI、@知识库引用、AI 生图(DashScope 通义万相)、进度条 + Token 组件 |
# 安装(发布到 GitHub 后)
dsh plugin --profile web add github:你的用户名/dsh-macos-desktop
# 或本地开发(改代码重启即生效)
dsh plugin --profile web add link:../dsh-macos-desktop
dsh web # 重启后打开 http://127.0.0.1:3080,Ctrl/Cmd+Shift+R 硬刷新
详细安装方式、环境变量、验证步骤、安全边界见下文各节。
是:一个符合 DSH 插件规范的 npm 包(dsh.bundle + dsh.client),宿主半侧跑在 DSH Node 进程里提供文件/终端/文档的 HTTP 面,浏览器半侧画出一整块复古桌面。
不是:不修改 DSH 框架源码;不引入 playwright/puppeteer/原生模块/构建步骤;不另起炉灶重写对话(对话复用官方 session 流)。
| 依赖 | 版本 | 说明 |
|---|---|---|
| Node.js | ≥ 22.19.0(本仓库在 v24.19.0 上验证过语法) | DSH 0.1.x 要求 Node 22+ |
| npm | ≥ 9 | 随 Node 附带 |
| pnpm | 任意较新版本 | dsh plugin 实际是转发给 pnpm |
安装 DSH 并启动 Web(首次会自动初始化 web profile):
# 全局安装 DSH 启动器(如已安装可跳过)
npm install -g @deepseek-ai/dsh
# 启动 Web 界面(默认 http://127.0.0.1:3080)
dsh web
# 换端口启动
dsh web --port 8080
说明:
dsh web是dsh --profile web的别名。启动器自己的 flag 要写在最前面;--port属于 web 应用,写在web之后。
dsh plugin 子命令为准)dsh plugin --profile <name> <pnpm 参数> 会在 profile 目录里把后面的参数原样转发给 pnpm,因此子命令就是 pnpm 的子命令。下面用绝对路径 <插件目录> 代指本仓库目录,例如 C:\Users\you\dsh-macos-desktop。
dsh plugin --profile web add "C:\Users\you\dsh-macos-desktop"
等价于在 profile 里执行 pnpm add <绝对路径>。file: 安装是复制不是链接,之后改代码不会生效,需要 remove 再 add,或干脆重启 DSH。
# 先在本仓库目录打包(可选,直接 add 目录也行)
npm pack
# 安装 tgz(相对路径会被锚定到你执行命令的目录)
dsh plugin --profile web add ./dsh-macos-desktop-0.1.0.tgz
dsh plugin --profile web add github:你的用户名/dsh-macos-desktop
# 或
dsh plugin --profile web add "git+https://github.com/你的用户名/dsh-macos-desktop.git"
git 托管的插件如果带
prepare构建脚本,pnpm 默认会拦截,按 pnpm 打印的提示在 profile 目录的pnpm-workspace.yaml里加入allowBuilds再重跑。本插件无构建步骤,直接可用。
dsh plugin --profile web add link:../dsh-macos-desktop
link: 是软链接,改代码后重启 DSH 即生效(适合调试)。但注意 link 安装不经过 files 字段裁剪。
# 更新
dsh plugin --profile web update dsh-macos-desktop
# 查看已装依赖
dsh plugin --profile web list
# 卸载
dsh plugin --profile web remove dsh-macos-desktop
卸载后再重启 + 硬刷新,官方界面原样恢复。
package.json 关键字段{
"name": "dsh-macos-desktop", // 包名 = 插件 ID = 客户端 bundle id,三处必须一致
"type": "module", // 宿主半侧是 ESM(lib/index.js 用 named export)
"main": "lib/index.js", // 宿主半侧入口
"exports": {
".": { "default": "./lib/index.js" },
"./client": { "default": "./lib/client.js" }, // 浏览器半侧入口(client-modules 从这里读)
"./cordis.patch.yml": "./cordis.patch.yml", // bundle patch 导出
"./package.json": "./package.json"
},
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" }, // 声明这是 bundle,patch 参与宿主组合层
"client": { "platform": "web" } // 声明这是 web 客户端插件,进 __DSH_BOOT__
}
}
关于字段的一点校正:DSH 0.1.x 的
dsh.client没有id字段——插件 ID 就是包名,客户端 bundle 的id也等于包名。字段只有platform(必填,"web")和可选的inject(跨包模块依赖边)、immediately。不要写"client": { "id": "..." },那样既无效还容易和真实包名不一致。
cordis.patch.yml# 把本包作为一个宿主平面 row 插入组合:
- insert:
- id: dsh-macos-desktop # row id,与包名一致
name: 'dsh-macos-desktop' # 解析到本包(宿主半侧 lib/index.js)
dsh-base、dsh-web-app 之后、profile 自己的 cordis.patch.yml 之前叠加。client-modules 的节点半侧会扫描带 dsh.client 声明的 row,把 /plugins/dsh-macos-desktop/client.js 注入 window.__DSH_BOOT__。id 就是包名,模块表按这个 id 解析 /plugins/<id>/client.js。lib/index.js 的注入export const name = 'dsh-macos-desktop'
export const inject = ['webServer', 'fs', 'subprocess', 'workspaceRegistry'] // 硬依赖(宿主平面服务)
export function apply(ctx) { /* 注册 HTTP 路由 + 终端 + 文档 + 统计 */ }
webServer / fs / subprocess 都是 dsh-base + dsh-web-app 提供的宿主平面服务;sandboxPolicy / tokenMeter / sessions / sessionQuery 用 ctx.get() 可选读取,缺了也能启动(对应功能降级)。shell(bash executor)不再依赖:mkdir/rename/delete 改用跨平台的 node:fs,因为 Windows 上没有 bash,POSIX 的 mkdir -p/mv/rm -rf 走不通。
本插件没有密钥。它复用 DSH 自己的模型与凭据体系(对话走 DSH 官方 session.prompt),所以不需要也不接受任何私钥环境变量。文档、终端、文件都只在授权 workspace 内操作(见 §9 安全边界)。
| 变量 | 作用 | 取值/默认 |
|---|---|---|
DSH_HOME |
DSH 数据根目录 | 默认 ~/.dsh |
DSH_PERMISSION_MODE |
权限预设(文件/终端操作权限) | workspace-write(默认)/ danger-full-access |
DSH_TOOLS_MODE |
工具呈现模式 | native / code / both,默认 native |
DEEPSEEK_API_KEY |
DeepSeek 模型 API 密钥 | 通过凭据 seam 解析,也可写入 $DSH_HOME/.credentials.yaml 或受信环境层 |
DSH_WEB_SEARCH_PROVIDER |
Web 搜索提供方 | 如 deepseek |
DSH_WEB_FETCH_PROVIDER |
Web 抓取提供方 | 按部署 |
DSH_WEB_URL |
本会话 Web GUI 地址 | 由 DSH 自动注入 |
DASHSCOPE_API_KEY |
「AI 生图」用,阿里云百炼(DashScope)密钥(可选,优先读环境变量) | 用户自备;设置后重启 dsh web |
DashScope Key 安全存放(不暴露给 AI):Key 存工作区之外的密钥文件
$DSH_HOME\secrets\dashscope.key(默认C:\Users\<你>\.dsh\secrets\dashscope.key),宿主进程启动/调用时读取,AI 会话受沙箱限制读不到、也不会被打印或回显。配置步骤(任选其一):① 环境变量set DASHSCOPE_API_KEY=sk-xxx后重启;② 密钥文件:mkdir "$env:USERPROFILE\.dsh\secrets"; Set-Content "$env:USERPROFILE\.dsh\secrets\dashscope.key" "sk-xxx"后重启。生图时自动读取,界面只显示「未配置」提示、不显示 Key。
关于默认模型:DSH 0.1.x 没有
DSH_MODEL环境变量。默认模型在设置里(agent-default-model),会话模型在 Web 界面右上角模型选择器里选。密钥用DEEPSEEK_API_KEY(或其它 provider 对应变量),不要写死在代码或 patch 里。
「用 AI 看图」依赖
modlensCLI:npm i -g @liustack/modlens(未装时该功能会给出安装提示,不影响其它功能)。Windows 下已修复「未安装」误报:调用改用node <modlens>/dist/main.js -i <图片>(不依赖modlens.cmd/PATH),找不到时才报安装提示;引擎未配置(Gemini key / Antigravity)会引导跑npx @liustack/modlens doctor。
# 1) 确认已安装
dsh plugin --profile web list
# 2) 确认组合进了配置树(应能看到 dsh-macos-desktop 这一 row)
dsh --profile web --dump-config
# 3) 重启 + 硬刷新
dsh web
# 浏览器打开 http://127.0.0.1:3080 后按 Ctrl/Cmd + Shift + R 硬刷新
预期:硬刷新后先看到深色开机画面(蓝鲸 + 进度条)→ 弹"开机统计"框 → 进入桌面(顶部菜单栏、底部 Dock、桌面文件图标)。Dock 点「AI 助手」开对话,点「文件」开文件管理器,「终端」「浏览器」「文档」「知识库」同理。菜单栏 "DSH ▸ 显示原始界面" 切回官方 UI,左上角会出现 "DSH 桌面" 按钮切回来。
# 结构自检(package.json + cordis.patch.yml + 入口文件)
node verify-structure.cjs .
# 宿主半侧冒烟(import + apply() 注册 33 条路由不抛错)
node smoke-host.cjs
| 现象 | 原因 | 解法 |
|---|---|---|
file: 安装改代码不生效 |
file: 是复制不是链接 | remove 再 add,或改用 link:,或重启 |
Cannot find package dsh-macos-desktop |
相对路径装到了 profile 目录里 | 用绝对路径,或让相对路径以 .//../ 开头(会被锚定到当前目录) |
| patch 没生效 | patch 路径写了相对路径 | dsh.bundle.patch 用 ./cordis.patch.yml 这种包内相对路径;profile 内引用用绝对路径 |
service "xxx" is not declared |
宿主/客户端用了 ctx.xxx 却没在 inject 声明 |
声明 inject,或用 ctx.get('xxx') 可选读取 |
| 客户端 bundle 加载但页面报错 | 客户端用了 JSX/TS/import | 客户端用 React.createElement + 纯 JS,只从平台模块表 require('react') |
| 插件 ID 不一致 | 包名 / bundle id / window.__ModuleLoader__.load({id}) 三处不一致 |
三处都写 dsh-macos-desktop |
| git 插件装不上 | pnpm 拦截了 prepare 构建 |
按提示在 profile 的 pnpm-workspace.yaml 加 allowBuilds |
| 文档功能报"依赖未安装" | doc 库懒加载失败 | 确认 dsh plugin --profile web list 里有 docx/mammoth/pdf-lib/pdf-parse |
无。 本插件文档处理全用纯 JS 库,不需要 LibreOffice、不需要系统字体、不需要原生模块。
| 库 | 版本 | 用途 | 理由 |
|---|---|---|---|
docx |
^8.0.0 | 新建/生成 .docx |
纯 JS 生成 Word(OOXML),无原生依赖 |
mammoth |
^1.6.0 | 读取 .docx → 文本/HTML |
稳定、纯 JS,专注提取内容 |
pdf-lib |
^1.17.1 | 新建 .pdf |
零依赖纯 JS,save() 出字节流 |
pdf-parse |
^1.1.1 | 提取 .pdf 文本 |
轻量;代码里直接 import 'pdf-parse/lib/pdf-parse.js' 跳过其 CLI 守卫 |
pptxgenjs |
^3.12.0 | 新建/生成 .pptx |
纯 JS 生成 PowerPoint(OOXML),无原生依赖 |
预览策略(省依赖):
.pdf 预览走浏览器原生渲染:宿主把文件以 application/pdf 原样返回,桌面用 <iframe> 展示(不需要任何 PDF 渲染库)。.docx 预览走 mammoth 提取文本后展示。.pptx 生成走 pptxgenjs(标题页 + 每段一页),预览暂无内建渲染器(走「用外部程序打开」)。<img>。await import(...)),某个库没装上也不会拖垮插件启动。withinRoot(workspaceRoot, path) 校验。workspaceRoot 优先取 workspaceRegistry.list()[0].path(dsh-workspace 的持久化权威工作区,迁移改名后也正确),取不到才回退到 sandboxPolicy.workspaceRoot(它默认是 process.cwd(),即 DSH 启动目录,可能指向主目录而非真正工作区)。越界路径直接 400 拒绝访问(Windows 下比较时不区分大小写)。fs 服务(fs.readText / fs.writeText / fs.listDir / fs.readBytes)。node:fs(mkdir({recursive}) / rename / rm({recursive,force})),在 withinRoot 校验通过之后才执行——这样 Windows 上也无需 bash 即可完成文件管理。delete 现在改为「移到回收站」(workspace/.trash/,带 .meta.json 记录原路径),可还原/清空;仅「清空回收站」才真正 rm。node:fs,同样在 withinRoot 校验通过之后才落盘,因为 fs 服务只有文本写、没有字节写。/api/desktop 列出 workspace 内 desktop/ 文件夹的内容(该目录不存在时自动创建),绝不列出 workspace 根目录或任何真实系统目录(主目录 / AppData / NTUSER.DAT 等)。「此电脑」入口也只以 workspace 根目录为边界(withinRoot + 前端根目录钳制双重限制)。cwd 在 workspace 内;POSIX 走 subprocess.spawnTerminal(/bin/bash --noprofile --norc -i),Windows 走 subprocess.spawn 起的持久 powershell.exe/cmd.exe(受限模式下均经 sandbox.confine 包装)。withinRoot 校验的 workspace 内路径;知识库「任意本地目录」实际受沙箱限制为 workspace 内任意目录(workspace 外会被拒绝,这是安全边界,不是 bug)。一句话:绝不触碰 workspace 之外的路径。
「浏览器」应用是纯 iframe,不做服务端抓取(不引入 playwright/puppeteer)。
X-Frame-Options: DENY/SAMEORIGIN 或 CSP frame-ancestors 禁止被嵌入,iframe 会白屏或报错。本应用检测到加载失败会给出友好提示页:「该站点禁止被嵌入,可尝试在外部打开」,并提供"在外部打开"按钮。https://example.com、维基百科、MDN、GitHub 的 embed 页、各大站点公开的 embed 页面等;常见禁止嵌入:google.com、facebook、银行等。sandbox 设为 allow-scripts allow-same-origin allow-forms allow-popups,没有放开 allow-top-navigation 等危险项;frame-src 无需额外配置(同源 iframe 不受 DSH 自身 CSP 限制,因为内容是用户输入的第三方 URL)。http://127.0.0.1,嵌入 https:// 站点没问题;反过来在 https:// 页面嵌 http:// 会被浏览器拦截(本插件不涉及)。「AI 助手」窗口完全复用 DSH 官方会话能力,不另造轮子:
ctx.sessions(官方 SessionRuntime,它内部已持有官方 mux 事件流)拿到实时推送:session.getSnapshot() + session.subscribe() 直接读组装好的对话快照,回复/工具调用逐块实时流出,不再轮询。session.prompt / session.cancel / session.rename;会话列表走 sessions.list;新建走 sessions.create;搜索走 sessions.search。tool-result 节点(默认收起,可展开看参数/结果),token 用量来自 assistant 节点的 usage 累加。connection.api.sessions.selectModel 写入当前会话。在输入框里用 @知识库名 问题 发送,插件会:把知识库目录做关键词检索(文件名 + 文本内容 grep,不搞向量检索),取前 6 条片段拼接成 【知识库相关内容】+【用户问题】 一起 session.prompt 注入上下文。这是检索-注入(RAG 的朴素版),不是向量召回;@知识库名 来自「知识库」应用里自建的库。
#0a84ff、柔和渐变壁纸(内置 + 用户照片)、细腻双层阴影、系统字体(SF Pro/Segoe UI)、窗口红黄绿「交通灯」按钮、Dock squircle 图标带高光。body{--dsw-alias-*:...!important} 覆盖 DSH 主题 token(背景/文字/边框/品牌/状态色全套),color-scheme:light,右侧真正变浅色 macOS 风,功能(对话/工具轨迹/token/权限/模式切换)全保留。*分栏选择器改用结构选择器 `:has(> [data-shell-overlay])**(降级保留.pI_x6G_frame`),不再依赖会随 DSH 构建变化的哈希类名。desktop/ 文件夹内容(隔离目录,绝不显示真实系统目录);3 秒轮询 + 右上角「↻」手动刷新按钮,系统里放进/删除/重命名文件即时反映;每个文件浏览窗口独立维护 cwd + 乱序响应丢弃守卫,点不同文件夹/此电脑不会串目录;右键菜单(新建/排列/刷新 + 文件:打开/用 AI/重命名/删除/设为壁纸,文件窗口与桌面图标均可用)。workspace/.trash/),可还原/清空;宿主持久化映射元数据。@ 弹出知识库选择列表,点选插入 @库名;保留手动输入 @库名 方式兼容。cur 派生自 id 消除竞态),并修复「留空目录会错误建到 workspace 根」的宿主 bug(现在自动建到桌面子目录)。mammoth.convertToHtml 渲染可读 HTML(标题/列表/表格保留),不再是纯文本。.docx 用 run 的 bold/italics/size、.pdf 用 Helvetica Bold/Oblique + fontSize 内联排版、.pptx 用 pptxgenjs 生成(标题页 + 每段一页),.txt 纯文本丢格式(正常)。格式选择器新增「PPT (.pptx)」。modlens 输出结构化 JSON(OCR/版面/语义)→ 弹窗展示 + 「发给 AI 助手」。需 npm i -g @liustack/modlens。调用方式已修复:不再依赖 PATH 里的 modlens.cmd(Windows 下找不到导致误报「未安装」),改为 createRequire 精确解析 @liustack/modlens/dist/main.js 后用 node <main.js> -i <图片> --timeout 180000 调用,并正确解包 JSON.result;失败提示会引导你跑 npx @liustack/modlens doctor 检查视觉引擎(Gemini key / Antigravity agy)是否配好。wanx-v1 文生图(异步任务轮询),需 DASHSCOPE_API_KEY。sessions 服务的 mux 快照取数(订阅当前会话 snapshot,累加 assistant 节点 usage 得 token、统计 runningCalls/tool-result 得进度),不再依赖自定义 ChatApp 窗口——原生对话常驻右侧后这两个小组件依然实时更新;进度条窗口只在「开机完成后且任务进行中」出现,不再在加载界面弹出。loadDesktop 每次拿到目录列表后先算签名(type:path 拼接),内容未变就不 setState——避免每 3 秒整棵桌面子树重渲染,加载更顺、CPU 更低;文件增删/改名仍即时反映(签名变了才刷新)。z-index:2147483000,DOM 顺序可能把宠物埋到桌面下;本插件加 [data-whale-girl]{z-index:2147483600!important} 让宠物永远浮在最上层,无论拖到哪都可见、可点。/api/search),回车/点击直接打开,Esc 关闭。body.dsm-dark 覆盖 --dsw-alias-* + color-scheme:dark)。transition + dsm-minimized,关闭仍即时隐藏)。/api/upload,raw body 二进制 + dir/name 查询参数,仍走 withinRoot 校验)。desktop/screenshots/),并自动「用 AI 看图」(modlens 描述 + 「发给 AI 助手」)。纯前端 DOM→canvas 实现,无新依赖。dsh-subprocess-local 的 spawnTerminal 在 win32 上直接抛 terminal inspection is unsupported on platform win32,因此本插件在 Windows 改用 subprocess.spawn 的管道终端(无真 PTY),不做 ANSI 渲染、无真前景进程组;② 管道模式下 Ctrl+C 无法中断正在运行的命令(0x03 会被忽略,这是 Windows 管道终端的固有限制);③ Windows PowerShell 5.1(powershell.exe)非 ASCII 输出默认走 OEM 代码页,可能乱码,pwsh 7 默认 UTF-8 无此问题。要完整终端体验仍建议在 Linux/macOS 上使用。body{--dsw-alias-*:…!important}(DSH 主题 token 写在 body 内联,author-important 才能压过);分栏选择器已改为结构选择器 *:has(> [data-shell-overlay]) + .pI_x6G_frame 双保险,升级 DSH 后哈希变化也能命中——功能不受影响,只影响样式。body,左右共享同一张),左桌面 overlay 透明、右官方界面的内部容器(侧边栏/聊天区列)的 ::before 伪元素加 backdrop-filter: blur 半透明磨砂——不给 frame/列本身加 backdrop-filter(会建立 containing block 破坏左侧 overlay 的 fixed 定位、并困住设置弹窗),改在列的 ::before 上做真模糊。官方设置弹窗保持全屏居中、z-index 高于桌面 overlay,不被 Dock/菜单栏/窗口遮挡、可正常点击。lib/client.js 的 PRICES),不是实时计价;/user/balance 接口需要 DEEPSEEK_API_KEY 且主机能访问 api.deepseek.com,否则自动降级为手动初始余额。reasoningEffort id,不同 provider 可能不同。onError(跨域子页内的导航不会触发父页事件,属浏览器安全限制)。鲸鱼动画;更多弹窗;ima 联动;拖拽上传;目录实时刷新;xterm.js 完整终端渲染;壁纸轮播;斜杠快捷指令;现代 macOS 弹跳 Dock 动画;pptx 预览渲染器(当前生成后可「外部打开」,内嵌预览后续补)。
# 30 秒装好
dsh plugin --profile web add "C:\你的路径\dsh-macos-desktop"
dsh plugin --profile web list # 应看到 dsh-macos-desktop
# 30 秒看效果
dsh web # 重启
# 打开 http://127.0.0.1:3080 → Ctrl/Cmd+Shift+R 硬刷新
# → 开机鲸鱼 + 进度条 → 进入复古桌面:
# 左侧 = 桌面,右侧 = DSH 原生对话界面(macOS 风),底部 Dock + 顶部菜单栏横跨全屏
验证清单:
.pdf 出 iframe 预览 + 「在新窗口打开」;双击 .docx 出可读 HTML(标题/表格),不再是纯文本。把 SVG/PNG/JPG/WebP 图片放进 workspace 的 desktop/wallpapers/ 文件夹(插件首次启动会自动创建该目录,文件名随意)。然后任选其一:
壁纸读取走插件自带的 /dsh-macos-desktop/file 文件服务,不需要额外配置。
dsh-macos-desktop/
├── package.json # dsh.bundle + dsh.client 声明、文档依赖
├── cordis.patch.yml # 宿主组合 patch(插入本包 row)
├── lib/
│ ├── index.js # 宿主半侧:文件/终端/文档/统计/搜索/回收站/富文本文档
│ └── client.js # 浏览器半侧:整个复古桌面(React + 内联 CSS)
├── verify-structure.cjs # 结构自检脚本(可选)
├── smoke-host.cjs # 宿主半侧冒烟脚本(可选)
└── README.md
/api/vision 用 subprocess 跑 modlens <图片>,前端右键图片 →「用 AI 看图」。需 npm i -g @liustack/modlens。/api/gen-image 直连 DashScope wanx-v1 文生图(异步任务 + 轮询),前端「AI 生图」app(提示词/比例/风格/参考图)。需 DASHSCOPE_API_KEY(阿里云百炼)。wanx-v1 是「文生图」,参考图以「modlens 视觉描述增强 prompt」的方式生效(非真图生图);要真·图生图需另接 DashScope 图生图模型,可后续迭代。token 覆盖**实现主题/半透明磨砂,证实了本插件「body token !important 覆盖」是社区通用做法;其中 dsh-bg-image 做了「侧边栏/聊天区半透明磨砂」。分栏布局的position:fixed` overlay 是本插件的特有复杂度,社区无直接同款,故用「结构选择器 + 列级 ::before 磨砂」的稳健方案。dsh-office 的独立仓库。功能最接近的是 dsh-cowork:提供 doc_read / doc_write 系列工具,覆盖 xlsx / pdf / docx / pptx / ipynb 的读写。docx/mammoth/pdf-lib/pdf-parse),dsh-cowork 若作为独立工具注册,会在对话里与自建文档能力重复(两套 docx/pdf 处理入口)。pptxgenjs 生成 .pptx(格式选择器新增「PPT (.pptx)」),桌面只保留一个文档入口,不出现两套重复入口。若你更想要 dsh-cowork 在对话里的 xlsx/ipynb 工具(本插件没有),可另装它作为对话工具(与本插件文件管理器不冲突,因为它走对话工具面、不是 UI 面)。.pptx。body{--dsw-alias-*:…!important} 主题覆盖 + 列级 ::before 磨砂,dsh-genui 渲染出来的组件会自动继承 DSH 主题 token,跟随本插件的浅色 macOS 风。无需在本插件里重写 dsh-genui 的组件,只保证主题 token 覆盖兼容即可。本环境(沙箱)无权限执行 dsh plugin add(PowerShell 执行策略 + 沙箱拦截外部写/网络),以下命令请在你本机手动执行。
本轮新增
pptxgenjs依赖(link: 安装不自动拉新依赖):请先在本仓库目录跑一次npm install(装进插件自己的node_modules),或dsh plugin --profile web update dsh-macos-desktop,再重启dsh web。否则「文档办公 → 新建 PPT」会因缺pptxgenjs报「依赖未安装」。
dsh-vision-toolkit(视觉工具,可选,与本插件「用 AI 看图」互补):
dsh plugin --profile web add github:Anionex/dsh-vision-toolkit
# 或
dsh plugin --profile web add "@dsh-external/dsh-vision-toolkit"
仓库:https://github.com/Anionex/dsh-vision-toolkit —— 装完重启 dsh web,它作为独立工具注册(图片问答/长截图 OCR),与本插件无冲突(不同功能面)。
dsh-genui(对话里渲染图表/表格/组件):
dsh plugin --profile web add github:omdsh-dev/dsh-genui
仓库:https://github.com/omdsh-dev/dsh-genui —— 装完重启 dsh web 即生效(纯前端渲染插件)。它挂在右侧官方对话流里渲染图表/表格,与本插件右侧「官方界面 CSS 化」协同、互不替换,视觉继承本插件的 macOS 主题 token。若 pnpm 提示拦截 prepare 构建,按提示在 profile 的 pnpm-workspace.yaml 加入 allowBuilds 再重跑(见 §2.3)。
dsh-cowork(Office 文档读写工具,xlsx/pdf/docx/pptx/ipynb,可选):
dsh plugin --profile web add github:Jesse-njx/dsh-cowork
仓库:https://github.com/Jesse-njx/dsh-cowork —— 装完重启 dsh web,以「对话工具」形式注册(不是 UI 入口),与本插件「文档办公」app 的 docx/pdf 能力有部分重叠。默认不必装:本插件已用 pptxgenjs 补齐 pptx 生成,docx/pdf 读写 + 富文本也已自带;只有当你还需要对话里的 xlsx/ipynb 工具时才装它,桌面不会因此多出一套文档入口(它走工具面,本插件走 UI 面,互不打架)。
dsh-plugin-add:GitHub 上未找到名为 dsh-plugin-add 的独立仓库;它大概率指「插件市场/一键安装」类工具。可选用以下之一替代:
# WhaleHub 插件市场(发现/搜索/一键安装)
dsh plugin --profile web add github:vvlife/whalehub-dsh
# 或 插件管理面板
dsh plugin --profile web add github:Noob-stupid/dsh-plugin-hub
若你手头有确切的 dsh-plugin-add 仓库地址,把命令里的 github:作者/仓库 换成该地址即可。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。