DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

FelixJiashengFu /

FelixJiashengFu/dsh-recent-deliverables

Verified

Claude-style recent deliverables panel for DeepSeek Harness (dsh)

★ 1 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@c9ae6983

Recent Deliverables(最近成品)

一个给 DeepSeek Harness Web 界面用的持久插件,在右上角开一个 Claude 风格的浮窗,列出你最近做出来的文件(PDF、HTML、Office、图片、文本…),点一下就能内嵌预览、用系统应用打开、或定位到文件夹。

  • 面板常驻右上角,可折叠成一枚小药丸(成品 · 12),状态记在浏览器本地。
  • 文件名、类型、大小、时间、来源工作区一目了然;按类型筛选、按天分组、可按文件名搜索。
  • 交付文件(agent 调用 present 声明过的)带「交付」徽章并显示当时的说明文案。
  • 预览是页面内的 80vw 大窗:PDF / HTML / 图片 / 文本直接看,Office 文件一键交给系统应用。
  • 浮窗可拖动:按住标题栏(折叠后按住药丸)拖到任意位置,位置记在浏览器本地;双击标题栏复位到右上角,窗口缩放/切换折叠时会自动收回可视范围。
  • 每行最左边的按钮是**「转发到 IM 助理」**:选一个已绑定的 IM 聊天,成品文件就会由 IM 助理发到那个聊天(微信 / 飞书 / Telegram / Discord …)。
  • 自动刷新:展开时 20 秒、折叠时 60 秒,窗口重新聚焦时也会刷新。

转发到 IM 助理

IM 助理(@michengai/dsh-im-connect)在 1.0.12 里撤掉了主动投递的 HTTP 接口 / im-send / Agent 工具,所以没有「直接推文件」的公开 API。本插件走的是它仍然支持的投递链路:

  1. 点行尾最左边的纸飞机按钮,面板会读 IM 助理自己的 GET /api/dsh-im-connect/channels,把已绑定的聊天列出来(muted / detached 的不列,因为 IM 引擎不会投递到它们)。
  2. 选一个聊天后,插件通过 Host 的 session.prompt Remote 往那个 IM 会话里排一条消息:要求助手只调用 present 宣布这个文件、不要改动文件。
  3. IM 引擎监听所有 Session 的 assistant/message,把该回合 present 的文件经宿主文件服务读出来、用渠道的 sendFile 发到聊天(绝对路径即使不在 IM 会话的工作区内也能读,这是 workspaceFiles 的既有行为,已在源码里确认)。聊天里会收到该文件 + 一句「已发送」之类的确认。

代价与前提:

  • 需要 IM 助理插件已安装、至少绑定过一个聊天(设置 → IM 助理 → 添加账号,并给它发一条消息)。
  • 每次转发会产生一个很小的模型回合(几秒,用的是该渠道账号配置的模型/权限),因此不是零成本、也不是纯静默。
  • Agent 侧的权限没有额外要求:present 是标准工具;文件读取走宿主服务,不需要沙盒写权限。
  • 预览大窗里仍然保留「在新标签页打开」,所以换掉行内按钮不会丢功能。

管理助理(账号)与聊天

账号 = 助理。每个账号在自己的详情页里独立配置工作区、模型、权限、命令权限;转发面板里列出的每一条是聊天,由某个账号承载。

  • 添加助理:侧栏底部「设置」→「IM 助理」→ 渠道行右侧「添加账号」→ 扫码(微信 / 企业微信 / QQ)或填应用凭据(飞书 / Lark / Slack / Telegram / Discord)。连接成功后,从你想收文件的那个聊天给助手发一条消息,该聊天才会出现在转发面板里。
  • 删除助理:设置 → IM 助理 → 点开该账号进入详情 → 页面底部「诊断连接 / 重新连接 / 移除接入」→ 点「移除接入」(红色按钮,二次确认)。只想暂停收发就关掉「接收」开关,配置保留。
  • 删除聊天:删账号不会自动清掉它名下的聊天绑定,所以旧聊天会留在转发面板并标成「助理已移除」。在转发面板里点这一条 → 再点一次「再点一次确认移除」,就会调用 IM 助理的 sessions/remove 解除绑定(DSH 会话记录本身不受影响);也可以在 IM 助理的渠道会话列表里删除该会话。
  • 为什么「删了还显示」:账号存在 ~/.dsh/dsh-im-connect/channels.json,聊天绑定存在同目录的 sessions.json,两份数据独立;删账号只清前者。
  • 转发前提:目标聊天背后的账号必须处于已连接状态。账号被移除或未连接时,面板会把该条标灰、标题划线并禁止转发。
  • 排查:~/.dsh/dsh-im-connect/gateway.log 有每个账号的启动 / 投递 / 模型错误。常见两类:
    • 凭据不足,无法启动渠道 → 该账号没有有效凭据,重新添加或补配置;
    • no adapter registered for provider "xxx" → 账号详情里的助手模型指向了宿主没有的供应商,换一个可用模型。

数据从哪里来

列表合并两个来源,按绝对路径去重,按修改时间从新到旧排列:

  1. 声明过的成品:读取 Session 日志里 deliverables/presented 事件(就是内置 present 工具写下的那条),带说明文案和来源会话标题。为了不阻塞首次打开,这部分在后台折叠;首屏先给文件扫描结果,折好后前端会自动补上。
  2. 最近产出的文件:对已知工作目录做有界、只读的广度优先扫描——已注册的 workspace、默认目录、最近 Session 的 cwd、以及 extraRoots。会跳过 node_modules、.git、dist、build 等依赖/构建目录,以及 .DS_Store、._* 这类系统垃圾文件。

为了不被「一次性生成的一堆中间图」挤出面板,声明过的成品保留固定席位(默认 12 个),其余名额由所有剩余条目按时间填满(包括更多已声明成品),最后再按时间排序;保留席位不是交付文件的显示上限。

自动收起、语言和卡通形象(1.2.0)

  • 展开后点击浮窗外,会自动收成胶囊,外部按钮、输入和链接仍正常响应。外部 iframe 也会触发收起;插件自己的预览和设置不会误收起。
  • 标题栏的 EN / 中 可一键切换界面语言;头像设置里还能选择 跟随 DSH / 中文 / English。此选择只影响成品浮窗。
  • 点击标题最左侧的图标,打开 外观与语言。可选内置卡通表情、输入自己的表情或文字,或选取本机卡通图片;展开和胶囊状态使用同一形象。
  • 图片支持 PNG、JPG、WebP、GIF,最大 2 MB。语言与形象保存在浏览器本机,不上传图片;刷新后仍保留。可随时恢复原始图标。

配置

在 profile 的 cordis.patch.yml 里改这个 bundle 的行即可(省略即用默认值):

键 默认 说明
maxItems 40 面板最多显示多少条(1–200)
declaredSlots 12 给「交付」文件保留的席位(0–200)
maxSessions 16 折叠多少个最近 Session 的日志找交付记录(0 表示只看文件扫描)
maxSessionAgeDays 60 只看最近多少天内活跃过的 Session(0 表示不限制)
scanDepth 5 目录扫描深度(0–20)
maxScanFiles 12000 扫描访问的文件/目录条目上限
cacheMs 15000 磁盘扫描结果的缓存时间
includePresent true 是否包含交付记录
includeFiles true 是否包含文件扫描
extraRoots [] 额外要扫描的绝对路径
ignoreRoots [] 不扫描的绝对路径(其子目录也跳过)
extensions 内置清单 覆盖文件扫描的扩展名清单,例如 [pdf, html, docx]

HTTP 接口

三个路由都注册在 Connection 的鉴权围栏内(ctx.connection.fetch.register),只有本页面的 owner 身份能调用:

  • GET /api/recent-deliverables.list → 合并后的列表、统计、能力位。
  • GET /api/recent-deliverables.file?path=<绝对路径> → 列出的文件字节(内嵌预览 / 新标签页)。
  • POST /api/recent-deliverables.open?path=<绝对路径>[&action=reveal] → 用桌面默认应用打开 / 在文件管理器中显示。

安全约束:

  • 读取和打开前先解析真实路径,再检查目录边界。扫描不会将指向工作区外的符号链接加入列表;.. 和符号链接不能绕过工作区限制。显式通过 present 声明并列出的工作区外成品仍可访问;列表记录当时的真实目标,修改符号链接不会自动授权新目标。
  • 生成的 HTML/SVG 以 Content-Security-Policy: sandbox … 返回:脚本可以跑(图表能显示),但文档处于不透明源,碰不到 Harness 页面。
  • 本插件从不写 Session 日志,也不写工作区;扫描全程只读。

目录

index.js            Host 半:路由、Session 折叠、文件扫描、系统打开
logic.js            纯函数:扩展名/类型、合并排序、配置归一化(可单测)
client.js           浏览器半:shell.overlay 浮窗 + 预览大窗(无构建步骤)
cordis.patch.yml    bundle 行
locale/{en,zh}.json 插件管理器里显示的标题/描述
icon.svg            原始图标
test/logic.test.mjs  纯函数单测:node test/logic.test.mjs
test/client.test.mjs 浏览器半的接线 + 转发助手单测:node test/client.test.mjs

已知限制

  • 文件扫描是启发式的「最近修改」,包含中间产物(例如生成报告时的配图)。要看「真正的成品」,点「交付」筛选;想让它更准,就多让 agent 用 present。
  • 预览依赖浏览器自带的 PDF/图片/文本查看器;Office 文档不内嵌渲染(交给系统应用)。
  • 浮窗固定在视口右上角,右侧栏打开时会盖住右侧栏顶部,可折叠成药丸避开。
  • 面板数据只在 Web GUI 有意义(Host 在无 connection 服务的组合里不会激活)。
  • 「转发到 IM 助理」依赖 IM 助理的既有投递链路,所以聊天里会多一条助手确认消息;如果希望完全静默地推送文件,需要 IM 助理重新提供主动投递接口。

npm 安装

安装包名:dsh-recent-deliverables。在 DSH 的“设置 → 插件 → 添加插件 → 安装第三方插件”中输入包名,安装后重启 DSH。

本地目录安装方法见 INSTALL.md。

License

MIT

—/ 5

No ratings yet

Verified DSH bundle

Commit c9ae6983cbf6

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout