DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-ai-session-title

d

dsh-ai-session-title

Identified★ 1

AI-generated session titles for DeepSeek Harness: one-click generate inside the session rename dialog.

AI 会话标题

为 DeepSeek Harness(DSH)的会话重命名对话框加一个 AI 生成按钮:读取真实对话内容(以及你已经输入的草稿),让当前会话所用的模型写一个短标题,填进输入框——你确认后按「重命名」,不满意就继续改。

English | 中文

npm license dsh node

要求:dsh ≥ 0.2.1-rc.3、Node ≥ 20。

效果

重命名对话框里的 AI 生成按钮

  • 打开任意会话自带的「重命名会话」对话框(侧栏 ··· → 重命名会话)。
  • 输入框内右侧、同一条边框里多一个星标按钮——不是新弹窗,就是原生那个框。
  • 点一下:读取该会话的对话记录,连同你已输入的草稿一起作为参考,生成标题并填回输入框。
  • 底部仍然是原生的「取消 / 重命名」;生成不会自己改名,必须你点确认。

安装

从 npm 安装(推荐)

dsh plugin --profile <你的 profile> add dsh-ai-session-title

然后重启 dsh web 并刷新页面。

自带 dsh 的桌面版请在 App 内 设置 → 插件 里安装,不要用命令行——App 运行期间不会让 CLI 改写它自己的 profile。

从本仓库安装

plugin_manager install_bundle  target = <本目录的绝对路径>

或者让 agent 用 plugin_manager 工具装。装完刷新 Web 界面。

从插件市场安装

市场读取的是 awesome-dsh-plugin 这份目录,而不是本仓库。目录收录之后,在 插件 → 发现 里搜索安装即可。

工作原理

一个包,两半:

半边文件作用
Hostindex.js注册全局命令 /ai-title。读会话事件日志、按下一次请求要用的路由(session.requestHeader().config,取不到时回退到最新一条助手消息)选模型,用 ctx.llm 以 purpose: 'session-title' 流式生成一条,清洗后返回。命令名后面的文本视为用户的草稿标题。
Clientclient.js监听原生对话框的会话名输入框,就地装饰一个星标按钮;点击后调用 ctx.remote.commands.execute(sessionId, '/ai-title <草稿>', []),把返回的标题用原生 input 事件写回该输入框。

两个实现细节值得说明:

  • 为什么装饰 DOM 而不是注册插槽:原生对话框把目标会话存在组件内部 state 里,通过 shell.overlay 渲染,内部没有暴露任何插槽,所以插件拿不到插入点,只能就地装饰它;会话 id 则通过输入框预填的标题在 Workspace Service 的会话列表里反查。
  • 为什么走命令:客户端到 host 的 RPC 接口是构建期生成的,第三方 bundle 无法新增方法,命令是唯一稳定的调用通道。代价是每次生成会在会话流里留下一条 command/run + command/done 记录——这也是生成过程中唯一的可见反馈。

配置项(可选)

在 profile 的 cordis.patch.yml 里给 ai-session-title 这一行加 config:

- id: ai-session-title
  name: dsh-ai-session-title
  config:
    maxOutputTokens: 1024
键含义
provider / model强制指定路由。要么都配、要么都不配;默认按下一次请求的路由,取不到再用最新一条助手消息的路由。
timeoutMs生成超时,默认 60000。
maxTitleChars标题字符上限,默认 30。
maxOutputTokens单次调用的输出预算,默认 1024。思考型模型如果先思考、把预算耗光才轮到你看到的标题,会报 max-tokens,把它调大即可。

兼容性

engines.dsh 声明为 ^0.2.1-rc.3。DSH 只按 engines.dsh 判断兼容性(没有该字段时才回退到 @deepseek-ai/dsh-* 的 peer 范围),插件市场的卡片上也会显示这个要求。

这个插件在运行时不导入任何 @deepseek-ai/* 包:host 半边只用 ctx.commands / ctx.llm,client 半边只用 ctx.remote 和 DOM API。好处是任何 profile 都不需要额外装依赖就能加载;代价是如果上游改了这些服务的签名或重命名对话框的结构,就需要跟着发新版本。

开发

npm test        # host 半边的冒烟测试,不需要 harness、也不需要模型

client 半边没有构建步骤:client.js 按原样被加载。改完刷新 Web 界面即可(profile 里是 link: 安装,不用重装)。

目录结构

cordis.patch.yml     把行 id `ai-session-title` 插入为本包
index.js             host 半边(命令 + 生成)
client.js            client 半边(就地装饰 + 远程调用)
test/host.smoke.mjs  host 半边冒烟测试(npm test)
locale/*.json        插件展示信息(标题 / 描述)
icon.svg             插件图标
screenshots.json     市场卡片用的截图声明
docs/screenshot.png  截图

常见问题

按钮没出现? 确认插件已启用、刷新过页面,且 dsh 版本满足 ^0.2.1-rc.3。

报「模型没有返回可用的标题」? 多数是思考型模型把输出预算全用在推理上,调大 maxOutputTokens。

报「无法确定要命名的会话」? 说明输入框里的标题在会话列表里匹配不到(例如同名的会话刚被改名)。先在侧栏打开该会话再试一次。

License

MIT,见 LICENSE。

Comments

Loading…