DSH Plugins Marketplace

DSH Plugins

Plugins

/

UI & Experience

/

dsh-feedback-combined

d

dsh-feedback-combined

Manifest valid

One-click thumbs up/down feedback UI that injects rating summaries into model context.

UI (client)hasBundlePatch

dsh-feedback-combined — DSH 反馈整合插件(单包双端)

一个包补齐 DSH(DeepSeek 桌面端)反馈闭环: 客户端侧一键 👍/👎 即时评分 UI + 宿主侧评分采集 → JSONL 落盘 → 请求前注入摘要 → 查询工具。 配套 feedback-adapter Skill 约束模型收到负反馈后的反思与调整行为。

DSH 官方反馈体系设计为「评分仅写日志、不进模型上下文」,用户点 👎 后模型在下一轮完全不知道被否决过。本插件补上这一环,且把 UI 与数据层整合为单包:用户只需安装一个插件。

仓库结构

  • 仓库根即主插件 dsh-feedback-combined(单包双端,推荐安装),可用 pnpm add github:zhuran305-web/dsh-feedback-combined 直接安装;
  • legacy/ 保留整合前的两个单端插件(dsh-feedback-bridge 仅宿主侧、dsh-simple-feedback-ui 仅客户端侧),仅供维护参考,无需安装;
  • 两个单端插件功能已完全并入主插件(详见各自 README)。

单包双端结构

本插件同时声明 DSH 的两套正交配置,一个包同时携带宿主半边与客户端半边:

半边加载机制功能
宿主侧(Node)dsh.bundle.patch(cordis.patch.yml)采集评分事件 → JSONL 落盘 → agent/pre-step 注入摘要 → 注册查询工具
客户端侧(web)dsh.client.inject(platform: web)slot shadow 遮蔽官方按钮,单击即时提交、长按官方弹窗、Deepy 联动

两半边无直接调用:客户端经官方 messageFeedback.put 提交评分,宿主侧经官方 session/event 事件通道采集,slot/事件空间正交。

宿主入口为 lib/index.js(exports "."),客户端产物为 lib/client.js(exports "./client")。 客户端 bundle 内嵌的 __ModuleLoader__.load 注册 id 必须等于包名,否则激活审计报 loaded without registering。

安装与启用

前置:DSH 已安装;profile 目录可写;profile 的 pnpm-workspace.yaml 含 nodeLinker: hoisted。

# 1. 安装插件包进 profile(路径含空格,必须加引号)
cd "C:/Users/chichen/.dsh/profiles/desktop"
pnpm add "file:D:/GongJu12345/airuanjian/zcode/dsh judge/dsh-feedback-combined"
# 2. 部署 feedback-adapter Skill
mkdir -p "C:/Users/chichen/.dsh/skills/feedback-adapter"
cp "D:/GongJu12345/airuanjian/zcode/dsh judge/dsh-feedback-combined/SKILL.md" \
   "C:/Users/chichen/.dsh/skills/feedback-adapter/SKILL.md"

然后在 profile package.json 的 dsh.profile.bundles 数组追加 "dsh-feedback-combined":

{
  "dsh": {
    "profile": {
      "bundles": ["...已有插件...", "dsh-feedback-combined"]
    }
  }
}

若此前安装过旧插件 dsh-feedback-bridge / dsh-simple-feedback-ui,必须先移除,否则双份挂载(重复采集 + 重复 slot 注册):

cd "C:/Users/chichen/.dsh/profiles/desktop"
pnpm remove dsh-feedback-bridge dsh-simple-feedback-ui

最后完全退出 DSH(含托盘)再启动。

源码更新后刷新(file: 依赖会被复制成普通目录、不是软链,改源码不会自动生效):

cd "C:/Users/chichen/.dsh/profiles/desktop" && pnpm install

或直接覆盖部署副本后核对哈希(本项目踩过"以为同步了其实没有"的坑):

$src="D:/GongJu12345/airuanjian/zcode/dsh judge/dsh-feedback-combined"
$dst="C:/Users/chichen/.dsh/profiles/desktop/node_modules/dsh-feedback-combined"
foreach($f in @("lib/index.js","lib/store.js","lib/client.js","SKILL.md")){
  if((Get-FileHash "$src/$f").Hash -ne (Get-FileHash "$dst/$f").Hash){"DIFF $f"}
}

改完 必须重启 DSH 进程;客户端 half 是 boot 插件,刷新页面不会重拉 bundle。 改 SKILL.md 后还要单独重新复制到 Skill 安装点(~/.dsh/skills/feedback-adapter/SKILL.md), 两处不一致会让模型对着旧插件名推理。

启用确认

重启后通过以下方式确认加载成功:

  • 宿主侧:日志出现 feedback-combined: activated, data file: ...;
  • 数据目录已建立(首次评分后):~/.dsh/data/dsh-feedback-combined/feedback.jsonl;
  • 客户端侧:点击 👍/👎 即时提交且 toast 出现;UI 无 Failed to load plugins 报错;
  • 历史数据自动迁移:旧 ~/.dsh/data/dsh-feedback-bridge/feedback.jsonl 存在且新文件不存在时,启动时自动复制(幂等)。

配置项

宿主侧(通过 DSH 设置界面或 cordis.patch.yml)

注意:不要给这些字段加 .volatile()。schemastery 3.18.5 的 .volatile() 会把 校验结果变成 { get(): T } 引用对象,而 cordis 的 resolveConfig 不会拆包, 插件拿到的就不是数字/布尔值——曾因此让 budget 变成 NaN,注入出无意义的 "[用户反馈] · …"。需要热更新语义时应显式调用 config.x.get()。

配置项默认说明
injectEnabledtrue关闭后完全不注入(采集与工具照常)
maxItems3注入摘要最多聚合几条负反馈(1–10)
maxCharsPerItem200单条摘要字符上限(40–400)
maxTotalChars600注入总字符上限(含固定前后缀,100–2000)
reconcileEnabledtrue对账兜底开关(messageFeedback.list() 不可用时可关)

客户端侧(内置默认值,不走 DSH 配置)

客户端 half 由 dsh-client-modules 作为 boot 插件加载,其 manifest 只读取 package.json 的 dsh.client(inject / external / immediately / platform), 不会把宿主侧 Config 的值传给浏览器,因此下列选项目前是内置默认值。

如需覆盖,在页面加载前设置全局对象(只覆盖同名键,其余保持默认):

window.__DSH_FEEDBACK_COMBINED_CONFIG__ = {
  toastEnabled: false,
  duplicateClickStrategy: "cancel", // "open-dialog" | "cancel"
};
配置项类型默认说明
toastEnabledbooleantrue关闭后仅图标状态变化作为确认
toastDurationMsnumber2000toast 显示时长(1500–3000ms)
toastPositiveTextstring"赞已记录"正向 toast 文案
toastNegativeTextstring"反馈已记录,AI 将改进"负向 toast 文案
longPressDialogEnabledbooleantrue关闭后长按无效,仅响应单击
duplicateClickStrategyenum"open-dialog"重复点击策略:open-dialog 或 cancel
deepyLinkbooleantrue是否联动 dsh-claude-style 的小鲸鱼

交互说明(客户端侧)

操作效果
单击 👍即时提交 positive 评分,图标高亮,toast 显示正向文案
单击 👎即时提交 negative 评分,图标高亮,toast 显示负向文案
长按 👍/👎唤起官方完整反馈弹窗(7 分类 + 备注 textarea)
再次点击相同评分按策略:唤起弹窗(默认)或取消评分

Deepy 联动:向 dsh-claude-style 的像素小鲸鱼合成 pointer 事件(happy → 连按 4 次挠痒笑;panic → 拖动慌乱循环)。鲸鱼不在场时静默跳过。

slot 契约记录

字段值
slot nameconversation.chat.assistant-actions
slot idfeedback
priority-1(官方为 0,lowest renders)
order10(与官方一致)
遮蔽范围仅按钮区域,不遮蔽弹窗

数据格式

数据文件:~/.dsh/data/dsh-feedback-combined/feedback.jsonl(append-only JSONL,永不改写已写入的行)。

文件首行为 # 注释,说明格式。每行一个 JSON 对象,四种行类型:

行类型字段说明
ratingts, kind, sessionId, messageId, rating, category?, note?, version, source, scope一次评分事件(👍/👎)
consumedts, kind, sessionId, messageId, rating, version?该反馈已注入一次(消费标记)
deletedts, kind, sessionId, messageId官方 delete 事件的 tombstone(撤回)
recordedts, kind, sessionId, note, rating?, scoperecord_feedback 工具写入的观察

字段说明:

  • rating:"positive"(👍)或 "negative"(👎)
  • version:随机 UUID,每次实质 put 更新;去重键 = sessionId + messageId + version
  • source:事件来源(session/event / feedback/committed / reconcile)
  • scope:采集时归属作用域

三种作用域:

作用域含义查询聚合范围
session该记录的 sessionId 本身仅当前会话
task该 sessionId 沿 parentSession 上溯到的根会话根会话及其全部子会话
global全部记录跨所有会话

消费语义: 带 version 的 consumed 只挡同版本评分(用户对同一消息再次 👎 会产生新 version,可再次注入);不带 version 的 consumed 永久挡住该 messageId(兼容旧语义)。

提供的工具(宿主侧,agent 作用域)

record_feedback

补记一条反馈观察到本地日志。当用户口头给出评价但没有点 👍/👎,或需记录复盘结论时调用。

参数类型必填说明
notestring是要补记的内容(≤500 字符)
ratingstring否positive 或 negative,仅观察时可省略
scopestring否session(默认)或 global

get_recent_feedback

查询历史评分与反馈记录,按时间倒序返回。

参数类型必填说明
scopestring否session(默认)/ task / global
limitinteger否返回条数,默认 5,上限 20
ratingstring否按评分过滤:positive 或 negative
includeNotesboolean否是否含备注原文,默认 false

联调验证

#验证项操作预期
V1双端挂载重启后检查宿主日志 feedback-combined: activated;UI 一键评分即时提交
V2负反馈闭环(核心)AI 回答 → 点 👎 → 下一轮(a) 注入 [用户反馈] ... 👎;(b) 加载 feedback-adapter;(c) 针对性调整非空洞道歉;(d) 同一 messageId 未重复注入
V3正反馈记录点 👍JSONL 有记录、get_recent_feedback 可查到、下一轮未注入正文
V4作用域session/task/global 调用工具三种作用域读写过滤正确
V5长度与污染连续 3 轮普通对话无负反馈轮次零注入;有注入时 ≤600 总 / ≤200 单条
V6鲁棒性反馈服务不可用 / JSONL 写失败对话正常进行、日志有 warn 但无阻断
V7长按弹窗长按 👍/👎官方完整弹窗(7 分类 + 备注)
V8数据迁移有旧 feedback.jsonl 时首次启动数据自动复制到新目录,历史可查

故障排查

症状排查方向
UI 报 Failed to load plugins / loaded without registeringclient.js 内嵌注册 id 是否等于包名(激活审计要求两者一致)→ 重新打包统一 id
插件加载失败profile package.json 是否被写坏 → 恢复备份;dsh.profile.bundles 是否含 "dsh-feedback-combined"
注入未出现① session/event 是否捕获到 feedback/message-put;② JSONL 是否写入成功(查日志 warn);③ consumed 是否误判;④ agent/pre-step 是否挂载(根 agent 判定)
重复注入consumed 行是否落盘(注入后立即写 consumed,若写失败会重复注入——查日志)
写入失败withFileLock 冲突视为暂时失败,下次事件重试;所有写操作 try/catch 静默降级,不阻断对话
Skill 未触发确认 ~/.dsh/skills/feedback-adapter/SKILL.md 已部署且 frontmatter name: feedback-adapter
依赖解析失败profile pnpm-workspace.yaml 是否含 nodeLinker: hoisted(peer 依赖由运行时宿主树提供)

已知限制

  • R4 consumed 时序窗口:pre-step 注入成功后立即落 consumed,若该 step 随后被 abort,注入内容丢失但已标消费。
  • R7 子 agent 不注入:注入只挂根 agent,子会话(subagent)回合不注入反馈摘要。
  • 长按唤起弹窗依赖访问 slot 内部记录,若 DSH 版本变更 slot 内部结构可能失效,失效时长按降级为无操作,一键评分不受影响。
  • 客户端 bundle 是预打包产物,修改 UI 逻辑需重新打包并保证内嵌 id 与包名一致。

feedback-adapter Skill

配套 Skill 位于 SKILL.md,定义模型收到负反馈后的反思与调整规范。安装时复制到 ~/.dsh/skills/feedback-adapter/SKILL.md。详见 SKILL.md。

Versions

Latest versionPublishedSize
0.1.5——

Comments

Loading…

Similar plugins

dsh-markdown-input

by long6177

a dsh‑plugin for enhancing users' Markdown input experience | 一个 用于增强用户 markdown 输入体验的 dsh-plugin

Tools & CapabilitiesUI & ExperienceManifest valid

★ 0

MIT

TypeScript

Oct 7, 2026

dsh plugin --profile web add dsh-markdown-input

by Han-1413141

UI butler for every plugin UI: official/plugin categories, per-widget toggles, drag move/resize, collision avoidance and one-click auto arrange.

UI & ExperienceDevelopment & InfrastructureTerminal & ClientsManifest valid

★ 4

MIT

JavaScript

Oct 2, 2026

dsh plugin --profile web add dsh-ui-hub

A sidebar assistant plugin for the Web interface, allows users to select any text, displays the model’s reasoning process and final answer in a floating panel.

UI & ExperienceManifest valid

★ 0

dsh plugin --profile web add dsh-sidehelper

Adds lightweight selected-text references to DSH assistant replies: selections stay outside the editor as removable draft contexts, remain marked beside the source, and render as hoverable annotations

UI & ExperienceManifest valid

★ 0

dsh plugin --profile web add dsh-add-to-chat

by hiJoeLee

在每条回复下方给出可点的下一步建议,点一下就作为你的消息发出去

UI & ExperienceDevelopment & InfrastructureManifest valid

★ 1

MIT

JavaScript

Oct 6, 2026

dsh plugin --profile web add dsh-suggest-actions

Annotate on selection, persist through refresh; send the notes with your message and the model answers each one.

UI & ExperienceManifest valid

★ 0

↓ 69/wk

dsh plugin --profile web add dsh-inline-comments