前言¶
在 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 可固定生成追问的模型,默认跟会话当前模型。
典型用法¶
- 按上一节完成安装并重启 DSH,保持
config.enabled为true(默认)。 - 正常与 Agent 对话,等一轮结束;顶部隐形触发带 hover 一下,应看到三张(或你配置的
maxQuestions张)追问卡片垂下。 - 点其中一张,该文本会作为你的下一条 prompt 发出,整批卡片被收走。
- 若会话里出现
ask_user_question,同一根绳上会挂对应卡片,可在卡面作答。
想先不看 DSH 只看 UI,可打开 README 中的 Live demo 链接,在独立 harness 里体验 hover、点选、收起等动作。
实现要点(便于排错)¶
- 宿主侧(
lib/index.js、lib/remote.js):tendedero/suggestRemote 方法读取最近 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。