/** * dsh-prompt-prefill —— 浏览器半 * * 交互契约: * - **Agent 回答结束时**(running: true → false),若输入框为空,就在输入框内以 * **浅灰色幽灵文本**预填充一条「用户接下来最可能想发」的提示词。此时它**不是** * 草稿:发送按钮不可用,也不会被提交。只打开或翻看会话不会触发生成 * (与 Claude Code 的 prompt suggestions 一致,避免白白调用模型)。 * - 输入框为空且获得焦点时按 **Tab** 或 **→**,把这条幽灵文本写入草稿 * (一次可撤销的编辑)。 * - 开始输入文字、或按 Escape,幽灵文本立即隐藏。 * - 输入框为空且获得焦点时按 **↑**,把这个会话里上一次发送的内容填入草稿 * (只填入、不发送;文字取自会话历史,图片附件不恢复)。 * * 为什么是「浮层」而不是真的写进输入框: * 本版 Harness 没有内联建议(inline suggestion)API——我在发行版 `app.asar` 里 * 检索过 `ghostText` / `setSuggestion` / `inlineSuggestion` 均无命中,只有 Button 的 * `variant: "ghost"` 样式。参考项目 dsh-prompt-for-me 的 README 也写明:新版客户端 * 用内联 ghost text,较旧客户端退化为「不修改草稿的轻量预览」。因此这里采用后者的 * 思路,并把预览做成与输入框像素对齐的灰色文本,视觉上等价于内联幽灵文本。 * * 之所以能做到像素对齐:幽灵文本只在**草稿为空**时出现,此时插入点必然在内容区 * 左上角,所以只要把浮层的字体、内边距、行高与输入框的计算样式保持一致, * 再按输入框的包围盒定位即可。 * * 关于输入框形态:DSH 桌面端 0.2.0-rc.2 的 composer 输入框是 Lexical 驱动的 * `contentEditable` 容器(`