dsh-codex-composer: Bringing Codex-style input feel to DSH Web GUI

前言

DSH 的 Web GUI 里,输入框就是工作台。长期调试同一类问题时,人会自然养成一套键盘习惯:↑ 招回上一句说过的话,Tab 把说过一半的 prompt 补完。原生 Web 界面默认不提供这两套手感,每次都要重敲或翻历史记录。

下面介绍的 dsh-codex-composer 就是做这件事的。它由 sakura-hly 维护,是一个客户端插件,为 DSH Web GUI 的输入框加上 prompt 历史召回、历史补全和「下一步建议」生成。

这是什么

一句话定位:给 DSH Web GUI 的输入框补上 Codex 风格的键盘操作,不改 app.asar,不注册全局快捷键,只接管主 composer 的焦点和按键。

作者:sakura-hly。许可证:MIT。当前版本:0.1.0,GitHub 星标为 0,属于刚发布的早期项目。

它解决的问题分三块:

  1. 找回说过的 prompt:↑/↓ 在历史里前后翻,不用翻聊天记录。
  2. 补全输入:草稿有文字且能匹配到历史时,Tab 直接补全。
  3. 生成下一步:草稿为空时按 Tab,调用模型给一条当前会话的后续建议。

核心功能

键盘行为

键 行为
↑ 光标在首行(或草稿为空)时,召回上一条 prompt
↓ 在召回历史中前进;走到底恢复召回前的草稿
Tab 草稿为空:生成下一步建议;有文字且有历史匹配:补全;有文字但无匹配:原生 Tab(焦点跳转)
Esc 取消召回或取消正在生成的建议,恢复召回前的草稿

需要留意的边界:

  • 只有不带修饰键的 Tab 会被接管,Shift+Tab 仍做焦点遍历。
  • /、@ 补全菜单打开时,方向键和 Tab 留给菜单,插件不抢。
  • 多行编辑、中文输入法、Shift+Enter 换行都不受影响。
  • 只处理主 composer(data-composer-input),队列编辑框和侧栏编辑器不接管。

历史记录

  • 按 Session 隔离,依据 data-conversation-session;每个会话一份历史。
  • 首次使用时从会话事件流的 user/message 里读出已有 prompt,老会话也能直接 ↑。
  • Enter 发送和点击发送按钮后追加记录,最多保留 100 条。
  • 持久化到浏览器 localStorage,key 为 dsh-codex-composer.history.v1:<sessionId>。清空该 key 即可重置对应会话历史。

上下文建议(Tab)

只在草稿为空时按 Tab 才会触发,流程如下:

  1. 输入框获得焦点时,客户端后台调用 GET /codex-composer/history(纯读,不调用模型);首次按 Tab 也会兜底拉一次。
  2. 宿主读取当前 Session 最近的 user/assistant 消息(最多 14 条、总量约 20k 字符),用当前会话实际使用的模型路由生成一条「下一步用户 prompt」。
  3. 生成期间输入框底部出现 正在生成下一步建议…,结果写入输入框,不会自动发送。
  4. 只请求一次,重复按 Tab 不会并发;输入、切换会话、按 Esc 或停用插件都会取消。

这条建议走的是宿主的 POST /codex-composer/suggest 路由,属于辅助模型调用:不 spawn agent、不写入会话事件、不进入对话历史,但会消耗对应 provider 的 token。

安全与隐私

  • prompt 历史只存在浏览器 localStorage,带 Session id,不上传第三方。
  • 上下文建议会把当前 Session 的消息发给会话正在使用的模型 provider;不发送凭据、环境变量或工作区文件内容。
  • 两个宿主路由都经过 DSH 的 origin fence 和 Web 登录态。

兼容性

  • 目标:DeepSeek Harness >= 0.2.1-rc.3,Web profile。
  • 依赖宿主已有的 conversation、sessions、llm、webServer 服务。
  • Node >= 20,peer 依赖 @deepseek-ai/dsh-llm ^0.2.1-rc.1。

安装与启用

标准 bundle 安装(需要能运行 dsh plugin add 的环境):

dsh plugin --profile desktop add /absolute/path/to/dsh-codex-composer

或手工装进 profile:

  1. 在 ~/.dsh/profiles/desktop/package.json 的 dependencies 里加 "dsh-codex-composer": "file:/absolute/path/to/dsh-codex-composer";
  2. 把 "dsh-codex-composer" 追加到 dsh.profile.bundles;
  3. 在 profile 目录执行 pnpm install;
  4. 重启 DSH(Host 需要重新扫描 client bundle)。

从 dsh.pub 安装(README 中标注为「发布后」可用):

npx dshpub add sakura-hly/dsh-codex-composer --ref <commit>

也可以在 Settings → Plugins → Discover 里搜索 dsh-codex-composer。

安装后在 Settings → Plugins 里能看到 codex-composer 条目。停用即完全移除键盘接管,不需要改文件。

卸载:从 profile 的 dsh.profile.bundles 和 dependencies 里移除 dsh-codex-composer,重新 pnpm install,再重启 DSH。

典型用法

装好之后不需要额外配置,直接在输入框里操作即可:

  1. 连续问了几轮之后,光标回到输入框首行按 ↑,上一条 prompt 回到输入框;按 Esc 退出召回。
  2. 打几个字后按 Tab,如果能匹配到历史 prompt 中前缀相同的内容,会补全;匹配不到就当普通 Tab 用,焦点跳到下一个可聚焦元素。
  3. 新建一个空输入框,按 Tab,触发上下文建议;结果出现在输入框里,再自行修改或发送。
  4. 重启 DSH 后按 ↑,历史仍在,因为已经持久化到 localStorage。

建议的回退方式:如果只是想试一下,装好之后在 Settings → Plugins 停用即可,输入框立刻回到原生行为。

适用场景与注意

适合这类人:

  • 在 DSH Web GUI 里长期做往返调试,prompt 重复度高,想省下重敲的时间。
  • 希望 ↑/↓ 的手感接近 Codex 那种纯键盘操作模式。

使用前请知悉:

  • 插件以当前 dsh 进程的权限运行,安装前应先读一遍源码与许可证(MIT)再决定是否使用。
  • 上下文建议是真实模型调用,走当前会话的 provider 路由,会按 provider 计费。每次 Tab 最多一次,低 reasoning effort。不想用就停用插件。
  • 历史只覆盖纯文本 prompt;带 @ 引用 chip 的草稿被召回时,以 chip 的文本投影出现。
  • 发送失败后宿主恢复草稿的场景,历史里可能已记下这条,属于可接受的重复。
  • 仓库星标为 0,可参考的外部使用反馈很少,功能边界以 README 为准。

结尾

这个插件的价值很具体:把输入前和输入中的重复手工操作交给键盘和模型,不碰会话历史,不碰 DOM。属于「装完即用、停用即走」的轻量工具。

目录页:https://www.skillhub.cn/plugins/sakura-hly/dsh-codex-composer
GitHub:https://github.com/sakura-hly/dsh-codex-composer

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

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

Xiaoye