FloatCard(dsh-tendedero):把追问挂在窗口上方的晾衣绳上

前言

在 DSH 里做完一轮对话后,常见做法是自己在输入框里想「接下来还能问什么」,或者依赖宿主自带的追问列表。列表往往在主工作区里,和当前会话的视觉焦点不在同一层,容易忽略。

FloatCard 把后续追问做成窗口顶部的晾衣绳卡片:鼠标移到顶栏一带绳子垂下来,点一张卡片就把该问题作为下一条消息发出。交互灵感来自 alejandrobujan/tendedero,由 lark980-web 维护,npm 包名为 dsh-tendedero,在 DSH 插件目录中归类为「趣味换装」。

这是什么

DSH 前端插件:每轮对话结束后,向当前会话模型请求若干条短追问,每条一张浮动卡片,用衣夹挂在窗口上方的一条线上。Agent 的 ask_user_question 卡片也走同一条线;可在卡片上作答,活题再交回编辑器。

仓库:https://github.com/lark980-web/FloatCard
目录页:https://www.skillhub.cn/plugins/lark980-web/FloatCard
许可证:MIT(与原版 tendedero 应用无隶属关系,在 DSH 上重实现其顶栏交互)。

未上架 npm 前,README 注明需自行把依赖写进 profile;上架后可从 DSH Plugins 页安装。

核心功能

下面行为均来自项目 README 与 package.json 说明。

  • 每轮结束后,插件用会话当前模型生成最多若干条短追问,一题一卡,各占一个衣夹。
  • 点击卡片:将该问作为你的下一条消息发送;整批卡片向右收走,被点中的那张优先。
  • 指针停在窗口顶部一条带内(全宽约 48px 深,含标题栏与两角):晾衣绳垂下;移开则收起。深度常量在 lib/client.js 顶部的 TRIGGER_DEPTH,可按需改源码。
  • 与 Agent ask_user_question 共用同一根绳;未答完的可在卡上答,进行中的题交回 composer。
  • 批次在刷新或重新进入会话后约 6 分钟内可恢复;会话再次开始工作、出现真实提问、点 × 或超时后清除。
  • 跟随明/暗主题,尊重 prefers-reduced-motion。

在线演示(mock 宿主上的真实客户端包):https://lark980-web.github.io/FloatCard/

安装与启用

官方方式是在 profile 的 package.json 里加入依赖并启用 bundle,再在 profile 目录执行 pnpm install。首次安装后需重启 DSH(bundle 会为宿主增加 Remote 行)。

// ~/.dsh/profiles/<profile>/package.json
{
  "dependencies": { "dsh-tendedero": "^0.4.2" },
  "dsh": { "profile": { "bundles": ["…", "dsh-tendedero"] } }
}

将 … 换成你 profile 里已有的 bundle 列表,保留 dsh-tendedero 这一项。资料中未给出 dsh plugin add github:… 形式的安装命令,勿凭仓库名自行拼接。

配置

可在 profile 的 cordis.patch.yml 里覆盖插件配置:

- id: dsh-tendedero
  name: dsh-tendedero
  config:
    enabled: true        # master switch
    maxQuestions: 3      # cards per batch (1-5)
    provider: null       # pin the generation model; defaults to the session's model
    model: null
    timeoutMs: 45000

maxQuestions 控制每批卡片数量(1–5);provider / model 可固定生成追问的模型,默认跟会话当前模型。

典型用法

  1. 按上一节完成安装并重启 DSH,保持 config.enabled 为 true(默认)。
  2. 正常与 Agent 对话,等一轮结束;顶部隐形触发带 hover 一下,应看到三张(或你配置的 maxQuestions 张)追问卡片垂下。
  3. 点其中一张,该文本会作为你的下一条 prompt 发出,整批卡片被收走。
  4. 若会话里出现 ask_user_question,同一根绳上会挂对应卡片,可在卡面作答。

想先不看 DSH 只看 UI,可打开 README 中的 Live demo 链接,在独立 harness 里体验 hover、点选、收起等动作。

实现要点(便于排错)

  • 宿主侧(lib/index.js、lib/remote.js):tendedero/suggest Remote 方法读取最近 user/assistant 消息,经共享 ctx.llm 生成追问。
  • 客户端(lib/client.js):懒加载 CJS 模块 bundle,无构建步骤、无运行时依赖;监视 userQuestions / inbox 投影与 sessionStatus,用原生 DOM/CSS 画绳与卡,点选经 session/prompt 送出。
  • 动态挂载的 Remote 命名空间需用 ctx.get() 读取(Cordis 对 inject 里未声明的 key 只允许属性读)。

开发时用 index.html 作独立 harness,对齐宿主 Cordis inject 与 Remote 的 {ok,value} 封装;README 称曾用 ego-browser 跑过 31 条状态断言(hover 召回、关闭、重载恢复、运行中清扫、重连等)。

适用场景与注意

适合谁: 希望在对话窗口顶部用轻量 UI 接住「接下来问什么」、又不想每次自己敲追问的 DSH 用户;能接受偏趣味、偏换装的交互,而不是朴素列表。

权限与安全: 插件在当前 DSH 进程权限下运行,会调用会话 LLM 生成追问并改写前端展示。安装前请自行查看 源码仓库 与 MIT 许可证;社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。

版本: 资料中安装示例为 dsh-tendedero ^0.4.2;仓库 package.json 当前版本为 0.4.3。npm 发布 README 注明 credentials 待办,若以 git/path 依赖安装,以你锁定的包版本为准。


FloatCard 把「下一轮可以问什么」从隐形联想变成顶栏晾衣绳上的可点卡片,和 DSH「一切皆插件」的思路一致:交互换一层皮,追问生成仍走会话模型与现有 Remote。更多说明见目录页 SkillHub · FloatCard 与 GitHub lark980-web/FloatCard。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye