deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:OctKwong30/dsh-upload-file
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
让 DeepSeek Harness Web GUI 支持把任意文件上传进对话,两种入口:composer 输入框的附件按钮(SVG 回形针图标,多选),以及直接把 OS 文件拖进 composer 区域。选中的文件先由浏览器上传到宿主进程持久化存储,并以胶囊 chip 显示在 composer 上方的「待发送文件」条(与 shell 图片上传的「待发送图片」条同一体验):文件名 + 大小 + 移除按钮,发送时自动把干净的 markdown 链接(📎 [名称(大小)](http://…/dsh-upload/raw/<id>),绝对 URL 内含 sha256 id)并入消息文本;发送后会话里的用户消息渲染成文件卡片(图标 + 文件名 + 大小 + 打开,含文件链接的消息为卡片行 + 剩余文本气泡,纯文本消息按复刻的官方气泡渲染,插件渲染崩溃时自动回退官方渲染器);模型通过 read_uploaded_file 工具读取文件内容(文本直接返回,二进制返回元数据与下载地址)。
文件字节不会进入对话日志——进入对话的只有引用文本,与官方 describe-image 插件的图片上传采用同一套思路。
conversation.input.left 槽位,SVG 回形针图标,与 shell 工具按钮同款胶囊样式),支持一次多选文件上传;上传中图标切换为旋转进度弧。conversation.input.dock 槽位的 FileDock,role="group" aria-label="待发送文件"),每个 chip 含回形针图标 + 文件名 + 大小 + 移除按钮;草稿保持干净(仅一个不可见占位符用于让“仅发文件”时发送按钮可用,发送钩子会在提交时剥离)。conversation.sendSession(与 describe-image 同款、幂等、可卸载、发送失败自动恢复待发条),发送时把待发送文件的链接并入消息文本;无待发文件时原样穿透,不拦截任何其他发送。conversation.chat.node(key=user / steering,priority -1)接管用户消息渲染——消息含本插件文件链接时渲染成卡片行(role="group" aria-label="待发送文件",图标 + 文件名 + 大小 + 打开链接,纯链接消息不渲染气泡,类图片附件);否则完整复刻官方用户气泡(图片画廊 + MessageText + 时钟 + 复制按钮,官方 CSS 令牌逐条对齐)。渲染崩溃时 slots 会退役本 entry 并自动回退到官方渲染器。POST /dsh-upload/attach 接收 base64 JSON,校验大小后按内容寻址(sha256:<hex>)落盘到 ~/.dsh/uploads/,返回 [file attachment …] 注释与 markdown 链接。GET /dsh-upload/raw/<id> 以附件形式下载/预览已上传文件(跨重启可用,侧车元数据 + 摘要校验)。read_uploaded_file:接受裸 id / JSON 注释(含 [file attachment {…}] 子串提取)/ markdown 链接 / 原始 URL 路径四种引用形式,文本文件返回解码内容(上限内),二进制文件返回元数据 + 下载 URL。dsh-upload-file(Settings → 插件配置):maxFileBytes(默认 20 MiB)、maxTextReadBytes(默认 256 KiB)、uploadsDir(默认空 = ~/.dsh/uploads)。__ModuleLoader__ 静态包),无需构建,安装即可加载。dsh plugin --profile web add github:OctKwong30/dsh-upload-file
# 重启 web GUI:dsh web(或按你的启动方式重启)
dsh plugin add 把参数转发到 profile 目录的 pnpm 执行:github: 前缀由 pnpm 直接从 GitHub 拉取仓库(同样支持 git+https://github.com/OctKwong30/dsh-upload-file.git 或 OctKwong30/dsh-upload-file 简写);安装后因包声明了 dsh.bundle.patch,会自动加入 dsh.profile.bundles 层。
升级到新版本:
dsh plugin --profile web update dsh-upload-file
# 再重启 web GUI
# 在仓库父目录执行(把 <parent-dir> 换成你放置仓库的实际目录)
cd <parent-dir>
dsh plugin --profile web add ./dsh-upload-file
# 重启 web GUI:dsh web
./dsh-upload-file 这类相对路径会以你调用 dsh 的目录为锚点解析(等价 pnpm link),改完 lib/*.js 后重启 dsh web 即生效,适合边改边验;确认后推送到 GitHub,其他人即可用方式一安装。
# 用绝对路径指向 lib/index.js 的覆盖层(仅开发用,路径按你的仓库位置调整)
cat > upload-overlay.yml <<EOF
- insert:
- id: dsh-upload-file
name: <parent-dir>/dsh-upload-file/lib/index.js
EOF
dsh web --patch ./upload-overlay.yml
注意:此方式绕过包解析,只加载宿主半部(
/dsh-upload路由 +read_uploaded_file工具)。浏览器半部依赖package.json的dsh.client声明注入,附件按钮、待发送文件条、拖放上传与会话内文件卡片不会出现。需要完整功能时请用方式一/二安装。
把以下内容追加到 ~/.dsh/profiles/web/cordis.patch.yml,并确保 dsh-upload-file 已作为依赖安装到该 profile:
- insert:
- id: dsh-upload-file
name: dsh-upload-file
📎 [report.pdf(12.1 KiB)](http://127.0.0.1:3080/dsh-upload/raw/sha256:abc…)
sha256:abc… 后调用 read_uploaded_file 读取(参数可传裸 id、链接或 URL)。浏览器半部 lib/client.js 宿主半部 lib/index.js
+---------------------------+ +----------------------------------+
| 📎 附件按钮 + 拖放 inlay | base64 | POST /dsh-upload/attach |
| (input.left / input.dock)| ───────▶ | → 校验/落盘 ~/.dsh/uploads/ |
| 上传 → 待发送文件条(rail) | | → 返回 note + markdown |
| 发送钩子: sendSession 包装 | | GET /dsh-upload/raw/<id> 下载 |
| → 链接并入消息文本 | | read_uploaded_file 模型工具 |
| 会话内卡片: chat.node 接管 | | |
| (key=user/steering, -1) | | |
| 含链接→卡片;否则复刻官方 | | |
+---------------------------+ +----------------------------------+
浏览器半部内置 zh / en 迷你词典,随 GUI 语言设置切换:附件按钮提示、拖放提示、待发送文件条、错误提示(超限/读取失败/网络错误),以及文件卡片复刻官方气泡所需的全部文案(复制、时钟、图片画廊等)。
与官方插件体系的关系(参考文档):
apply(ctx) + inject 插件形态。defineTool 工具定义。dsh.bundle.patch 组合包机制与 dsh plugin --profile <name> add。@linxin666/dsh-tool-describe-image(attach 路由 + sendSession 发送钩子)与 @linxin666/dsh-client-ui-aionui-panel(conversation.input.dock 槽位 + conversation.input.for(actx) 写草稿 + 拖放 inlay 的 document 监听模式)。Settings → 插件配置 → dsh-upload-file:
| 字段 | 默认 | 说明 |
|---|---|---|
| maxFileBytes | 20971520 | 单文件字节上限 |
| maxTextReadBytes | 262144 | read_uploaded_file 文本预览上限 |
| uploadsDir | (空) | 上传根目录;空 = ~/.dsh/uploads |
sha256:[0-9a-f]{64},杜绝任意路径读取。conversation.input.dock 槽位),shell 的图片条渲染在输入卡内部;位置略有差异但交互一致。~/.dsh/uploads/(内容寻址,无害)。CHAT_CSS 中的 .dsh-uf-* 规则;渲染逻辑崩溃时 slots 会自动回退到官方渲染器,不会白屏。卡片仅识别本插件生成的绝对 URL 链接(/dsh-upload/raw/sha256:…),旧格式(相对路径 / JSON 注释)消息按普通文本渲染。dsh.bundle.patch)的构建方式。MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。