🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

输入历史回溯 PerryLink/dsh-composer-history

DeepSeek Harnessv0.8.15
PerryLink6 天前有提交已提供中文文档扫描:未发现敏感能力

DeepSeek Harness 网页输入框的终端式历史记录:方向键优先从边缘翻历史,草稿与光标位置精确还原,历史存在浏览器本地,Ctrl+R 反向搜索,按工作区召回,还能感知滑动上下文(召回与搜索里包含压缩摘要…

42.6/100
综合分
19
GitHub 星标
589
npm 周下载
—/5
用户评分

数据截至 2026/10/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-composer-history
npm 源 · dsh-composer-history 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 6 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-composer-history @ 0.8.15
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 04:33:40

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

写入剪贴板(不计风险)
查看扫描证据(共 2 处,展示前 2 条)
  • 写入剪贴板
    lib/client.js:3441
    clipboard.writeText(exportBackupJson(storage)).then(() => transient?.show("backup JSON copied to clipboard"), (error) => transient?.show(`clipboard wr
  • 写入剪贴板
    src/client/index.ts:406
    void clipboard.writeText(exportBackupJson(storage)).then(
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-attachment@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-input-trigger@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-settings@deepseek-ai/schemastery@deepseek-ai/dsh-working-directory
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图

功能亮点

  • 方向键翻历史
  • 草稿与光标还原
  • Ctrl+R反向搜索

README

由 DeepSeek 最新模型翻译生成
⌨️ dsh-composer-history 发布标记:0.8.8(2026-10-04)。 - 1024 商店渠道:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-composer-history(会计入 deepseek1024.com 的安装排名)。 dshfind 给 DeepSeek Harness Web GUI 输入框加上终端风格的输入历史。 像在终端里一样按 ↑ —— 顺手保住你打了一半的草稿。 dsh-doctor DSH Market English · 简体中文 · Español · Português · हिन्दी dsh plugin --profile <name> add dsh-composer-history 📖 生态知识库 —— 实测数据,不是营销话术:插件开发指南 · 插件选型数据 · 维护标准。 安装与卸载 npm 包直接附带构建好的产物;从源码检出时必须先构建(pnpm run build)—— 客户端包检查遇到未构建的产物会拒绝启动。 - git 渠道(最新 main):dsh plugin --profile web add github:PerryLink/dsh-composer-history。
展开完整文档(README 剩余 1 节)
⌨️ dsh-composer-history

发布标记:0.8.8(2026-10-04)。
- 1024 商店渠道:先执行一次 npm i -g dsh1024,再执行 dsh1024 plugin --profile web add dsh-composer-history(会计入 deepseek1024.com 的安装排名)。

dshfind

给 DeepSeek Harness Web GUI 输入框加上终端风格的输入历史。

像在终端里一样按 ↑ —— 顺手保住你打了一半的草稿。

dsh-doctor
DSH Market

English · 简体中文 · Español · Português · हिन्दी

dsh plugin --profile <name> add dsh-composer-history

📖 生态知识库 —— 实测数据,不是营销话术:插件开发指南 · 插件选型数据 · 维护标准。

安装与卸载

npm 包直接附带构建好的产物;从源码检出时必须先构建(pnpm run build)—— 客户端包检查遇到未构建的产物会拒绝启动。

- git 渠道(最新 main):dsh plugin --profile web add github:PerryLink/dsh-composer-history。
- npm 渠道(已发布版本):dsh plugin --profile web add dsh-composer-history。
- tarball 渠道:在本仓库执行 pnpm pack,然后执行 dsh plugin --profile web add ./dsh-composer-history-<version>.tgz。
- 卸载:dsh plugin --profile web remove dsh-composer-history(或从配置档补丁里删掉对应行)。

⭐ 如果它帮到了你

这个插件是 DSH 插件家族的一员(95 个,全部 Apache-2.0)。如果你在用,给个 star —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。

English: part of a 95 plugin family for DeepSeek Harness. If it is useful, a star helps the next person find it — nothing is gated behind it.

dsh-composer-history 是什么?

给 DeepSeek Harness Web GUI 输入框用的终端式输入历史。

像在终端里一样按 ↑ —— 同时保住你打了一半的草稿。

dsh-composer-history 的工作流示意图:安装 → 打开面板 → 操作。

工作流概览:安装 → 打开面板 → 操作。下面的示例都用真实的命令接口。

兼容性

| 层面 | 状态 |
| Harness | DeepSeek Harness dsh-v0.2.1-rc.2(2026-10-18 验证):engines.dsh >=0.2.1-0 <0.3.0;P0 兼容路径有回归测试。 |
| Node | ^22.19.0 \|\| >=24.0.0 |
| 平台 | 仅 Web GUI(客户端插件;浏览器本地存储;不走网络,不含原生代码) |
| 模型 | 任意(不发模型请求 —— 纯 UI 行为) |

浏览器端跑在已发布的客户端包(dsh-client-ui-conversation、dsh-client-ui-input-trigger、dsh-client-ui-settings)和 cordis Context 上;它不再依赖已移除的 dsh-client-runtime 包,所以客户端层面也能和 0.1.2-rc.1 宿主对上。
拦截锚点落在 Web 输入框的 DOM 上:[data-input-scroll] 里的 contenteditable 表面 div[data-composer-input](0.1.2-alpha.5 / 0.1.2-rc.1 起提供的 Lexical 输入框),同时仍能匹配 [data-input-scroll] 里的旧版 textarea 输入框(harness 到 0.1.1-rc.2 为止的版本);其他位置的 textarea 直接放行。兼容工作流的 jsdom Web 行为冒烟测试,会针对打包后的 bundle 校验这层身份/文本/光标行为。
0.1.2-rc.1(2026-09-04 适配):会话信封保留其可忽略字段,仅用于存储日志的读取兼容 —— Session.append 仍然无法写入该字段,所以审计门禁行为不变。2026-09-06 针对 dsh-v0.1.7-alpha.1 master 检出验证(完整门禁链 + 配置档安装冒烟)。
0.1.5-rc.1(2026-09-10 适配):依赖锁定版本移到已发布的 0.1.5-rc.1 线;没有接缝变更影响本插件行为。
0.1.5-rc.2(2026-09-11 适配):依赖锁定版本移到已发布的 0.1.5-rc.2 线;没有接缝变更影响本插件行为。
0.1.7-alpha.1(适配于 2026-10-04):设置接缝在两端都被替换。宿主端不再通过已移除的 ctx.settings.register(ns, schema, { base }) 注册 composer-history 命名空间——在这一线上,插件的持久设置面就是它自己的实时 Config:每个可调项都声明为 .volatile(),配置档条目 id(composer-history,即 bundle 补丁的行 id)为表单命名,apply 认领生成的表单呈现(ctx.settings.configure({ auto: true }, ctx.fiber),由 effect 持有,因此重载能干净地重新注册)。浏览器端通过 ctx.configForms.get('composer-history') 读取同一条目,取代已移除的 ctx.settingsScope.bind({ namespace });快照/订阅的形状不变,因此每次提交变更后接线仍会重新安装。可编辑面保持不变,没有扩大:旧命名空间暴露的每个字段都是 volatile,也没有新字段变为可编辑。名为 composer-history 的现有 settings.yaml 段由宿主自身迁移到同 id 的配置档条目中。

你会得到什么

dsh-composer-history 把终端的输入历史放进 DeepSeek Harness Web GUI 的输入框:

1. 边缘优先的方向键召回 —— 单独按 ↑/↓ 先移动光标;只有光标位于首行/末行时才触发历史召回。首次召回会暂存 {draft, caret},再次到达最新条目(或按 Esc)时精确还原两者——绝不清除。
2. 持久化历史 —— 每条已发送消息都追加到有界的浏览器本地存储,因此召回能跨页面重载存活,也能跨会话使用。
3. 反向搜索 —— Ctrl+R(可配置)在合并的历史、片段和模板之上打开查询浮层。
4. 智能输入层 —— /save//load 片段、带 {{workspace}}/{{session}}/{{draft}} 变量的提示词模板,以及浏览器本地的复用洞察。
5. 滑动上下文感知 —— 压缩摘要以 [compacted] … 条目加入召回和搜索,每次压缩还会弹出临时通知,附带一键 /compact 填充。
6. 带版本的 JSON 备份 —— 把全部四个库(历史、片段、模板、洞察)导出/导入为一份带 schema 版本的文档;导出时可下载或复制,导入时可选择文件或粘贴。

纯 UI 行为:没有会话事件,不改智能体循环,不发模型请求。召回的文本只进入普通输入框草稿;只有你按下 Enter,它才会到达模型。

快速开始

dsh plugin --profile web add github:PerryLink/dsh-composer-history

1. install the bundle into your profile
dsh plugin --profile web add github:PerryLink/dsh-composer-history

or from npm (published releases)
dsh plugin --profile web add dsh-composer-history

2. restart and verify the row
dsh --profile web --dump-config | grep -A3 'id: composer-history'

示例

这些是插件的真实入口;安装一次,然后调用其中一个。

详细示例

命令

~~~sh
~~~text
snippet saved: ship-check

摘自 plugins/dsh-composer-history/README.md §Smart input layer(第 199-205 行);代码位于 src/client/index.ts:314-327

失败分支

输入

~~~text
/load nope

输出

~~~text
no snippet named nope (open Ctrl+R search to browse snippets)

摘自 plugins/dsh-composer-history/src/client/index.ts:330-333; plugins/dsh-composer-history/src/client/notice.ts:62-65

简短示例

- /load
- /compact

配置

所有可调项都是 Schemastery Config 字段(可从 cordis.yml 和条目的设置表单修改;配置档补丁是持久化的文档)。按 id 定向的覆盖会替换整行 —— 你需要用到的每个键都要重新写一遍。无效的枚举值会让整个 dsh 启动直接报错,设置表单的修改会先由宿主校验,通过后才持久化。

| 键 | 默认值 | 含义 |
| recallWithDraft | 'save' | 召回模式(save / gate):save 在召回前暂存非空草稿;gate 只在草稿为空时召回(Claude/Codex 风格的闸门) |
| restoreOnEscape | true | Esc 结束浏览时恢复暂存的草稿 |
| edgeMode | 'logical' | 边界检测模式(logical / visual):按 \n 行,或按实际测量的折行 |
| enableCtrlAlias | true | 让 Ctrl+↑/↓ 表现得和单独的方向键一样 |
| restoreCaret | true | 触底 / Esc 时同时恢复暂存的光标位置 |
| upKey | 'ArrowUp' | 向上召回所用的 KeyboardEvent.key;'' 表示禁用 |
| downKey | 'ArrowDown' | 走向更新条目 / 恢复所用的 KeyboardEvent.key;'' 表示禁用 |
| escapeKey | 'Escape' | 退出浏览所用的 KeyboardEvent.key;'' 表示禁用 |
| maxHistory | 500 | 最多召回的条目数(保留最新的);0 = 不限 |
| includeKinds | ['user'] | 允许进入历史的会话节点类型(加上 'steering' 可包含 steer 消息) |
| historyScope | 'session' | 历史范围(session / workspace):workspace 会在当前会话的用户消息之前,先拼上其他已列出会话的用户消息 |
| persistHistory | true | 把已发送的消息追加到浏览器本地存储 |
| maxPersisted | 200 | 最多持久化的条目数;0 = 不限 |
| enableSearch | true | 启用 Ctrl+R 反向搜索浮层 |
| searchKeys | ['Ctrl+R'] | 打开搜索的组合键规格(修饰键 Ctrl/Alt/Meta/Shift + 键名);规格格式错误会让浏览器 fiber 直接报错 |
| searchCaseSensitive | false | 搜索匹配是否区分字母大小写 |
| includeCompactionSummaries | true | 允许 [compacted] … 检查点摘要进入召回和搜索 |
| showCompactionNotice | true | 压缩检查点落地时显示一条临时通知 |
| compactCommandText | '/compact' | 通知里「Compact now」动作填入输入框的斜杠命令;'' 隐藏该动作 |
| enableSnippets | true | 启用片段库(/save、/load、搜索面板选取) |
| maxSnippets | 200 | 最多存储的片段数;0 = 不限 |
| enableTemplates | true | 启用提示词模板库(插入时填充变量) |
| enableInsights | true | 启用复用洞察提示(本地使用统计) |
| insightMinUses | 2 | 复用提示显示前的最少使用次数 |
| enableCompactionHighlight | true | 在搜索面板中为 [compacted] … 摘要加醒目标记 |

工具与界面

| 界面 | 类型 | 说明 |
| ArrowUp | 键位绑定 | 边缘优先的 ↑/↓ 回溯 —— 暂存 {draft, caret},触底或按 Esc 时精确还原两者 |
| Ctrl+R | 键位绑定 | 在合并后的历史、片段和模板上打开反向搜索浮层 |
| /save | 命令 | 把当前草稿保存为带名称和标签的片段 |
| /load | 命令 | 在光标处插入已保存的片段 |
| templates | UI | 历史、片段、模板和洞察的带版本 JSON 备份导出/导入(仅显式点击时触发) |
| composer-history | 设置表单 | 配置档条目自带的实时 Config 表单 —— 把解析后的配置(cordis.yml 基础 + 配置档覆盖)带入浏览器端 |

键位绑定

| 按键 | 状态 | 行为 |
| ↑ | IDLE,光标在首行 | 暂存 {draft, caret},填入最新条目,光标移到末尾(无历史 → 放行) |
| ↑ | BROWSING,光标在首行 | 更早的条目;停在最旧一条(拦截,不做修改) |
| ↑ | 光标不在首行 | 完全放行(浏览器移动光标) |
| ↓ | IDLE | 始终放行(普通光标移动) |
| ↓ | BROWSING,光标在末行 | 更新的条目;到最新一条 → 还原 savedDraft + savedCaret → IDLE |
| ↓ | 光标不在末行 | 完全放行 |
| Esc | BROWSING(restoreOnEscape: true) | 还原 savedDraft + savedCaret → IDLE,拦截 |
| Esc | 其他情况 | 放行(菜单/弹窗的 Esc 语义不受影响) |
| Ctrl+↑/↓ | enableCtrlAlias: true | 与单独按方向键相同 |
| searchKeys 组合键 | 输入框聚焦、plain 阶段、无菜单/选区/输入法 | 打开反向搜索;浏览结束,当前显示文本成为草稿 |
| Shift/Alt/Meta+方向键、输入法、选区 | 任意 | 始终放行 |

upKey/downKey/escapeKey/searchKeys 可重命名上述按键;修饰键策略(以及搜索组合键的精确修饰键匹配)保持不变。搜索浮层内:↑/↓ 移动匹配项选择(选中行会滚动到可见区域),Enter 填入,Esc 取消,点击选取,点击外部取消;每一行都会高亮匹配的子串。

反向搜索

- 打开:输入框聚焦且输入为 plain 时按 searchKeys 组合键(此处的 Ctrl+R 还会阻止浏览器刷新页面 —— 该按键只在输入框内被消费)。
- 过滤:在合并后的历史里做子串匹配,范围包括当前会话、已持久化的记录和工作区条目;是否区分大小写由 searchCaseSensitive 决定;每一行里命中的子串都会高亮。
- 选取:按 Enter 填入草稿,并把光标移到末尾,走的仍是普通召回那条唯一的 setDraft 写入路径。召回的文字只有在你之后按 Enter 时才会发给模型。
- 取消:按 Esc,或在面板外点一下;草稿保持不变。

智能输入层

在终端风格的历史之上,三个浏览器本地库把输入框变成可复用的输入界面。下面这些内容全部存在 localStorage 里(键为 dsh.composer-history.snippets.v1、.templates.v1、.insights.v1),从不访问网络,每个开关都是 Config 的一个字段。

片段(跨会话命令库)

/save ship-check --tag=release,ops
check the build, run the smoke suite, tag the release ← the rest of the draft is the snippet
/save ship-check → "snippet saved: ship-check"
/load ship-check → the snippet fills the composer
Ctrl+R → search panel lists snippets (green badge = name) alongside history

- /save <name> 会消耗这次 Enter,把草稿(去掉命令行本身)以 kebab-case 名称存下来,可带标签,然后清空输入框。没有可存的内容 → 弹出错误提示,命令不会发送。
- /load <name> 把片段插入光标处(整份草稿替换,光标移到末尾),并计一次使用。
- 作用域:保存时带工作区 cwd 的片段属于该工作区;不带 cwd 保存的片段是全局的。maxSnippets 限制库的大小;同名保存会覆盖。
- 插件从不发送消息:每次填入都落在普通草稿里,Enter 始终由你按。

带变量的提示词模板

模板是存下来的提示词文本,里面带 {{variable}} 占位符。搜索面板用紫色徽标列出它们;选中一个,就用当前会话填好变量并插入结果。内置变量:{{workspace}}(会话的 cwd)、{{session}}(会话 id)、{{draft}}(当前草稿)。模板引用了未知变量会直接报错,并列出缺失的变量——半填好的提示词比报错更糟。

整个库——历史、片段、模板和洞察——通过面板的 Export JSON / Import file 操作导出为一份带版本号的 JSON 文档,也能从这份文档导入;见下文 备份导出与导入。这是用户显式发起的操作;插件从不自己写文件。

复用洞察

每条新提交的用户消息(以及每次加载片段)都会留下一条浏览器本地的使用记录,以精确文本为键。你打字时,一旦草稿匹配到某个提示词、且该提示词至少在 insightMinUses(默认 2)个会话里用过,输入框下方就会显示一行小提示:used M× in N sessions · 在 N 个会话里用过 M 次。用 enableInsights 开关;统计里只有去重后的文本和计数。
压缩摘要高亮

Ctrl+R 会给 [compacted] … 摘要打上琥珀色徽标(历史记录不打徽标),片段绿色,模板紫色——面板的数据来源一眼可辨。用 enableCompactionHighlight 开关。

备份导出与导入

四个浏览器本地库都导出到同一份带版本号的 JSON 文档,也从这份文档导入。面板的 Export JSON / Copy JSON / Import file / Paste JSON 操作完全在浏览器里跑:导出时下载或复制到剪贴板,导入时选文件或粘贴文本——不上传任何东西,也不涉及宿主 RPC 或网络调用。

文档结构

{
"schemaVersion": 1,
"exportedAt": 1735689600000,
"data": {
"history": ["…"],
"snippets": [{ "name": "…", "text": "…", "tags": [], "scope": "global", "createdAt": 0, "updatedAt": 0, "useCount": 0, "lastUsedAt": 0 }],
"templates": [{ "name": "…", "text": "…", "description": "", "updatedAt": 0 }],
"insights": [{ "text": "…", "sessions": [], "uses": 0, "lastUsedAt": 0 }]
}
}

合并与冲突策略

- 历史记录是纯字符串,按文本完全一致去重;重复或空白的条目直接跳过,绝不覆盖。
- 片段和模板以 name 为键;洞察以 text 完全一致为键。同键冲突时时间戳新的胜出(片段/模板看 updatedAt,洞察看 lastUsedAt);导入的时间戳更旧或相同则跳过,新键追加。
- 导入遵守 maxPersisted 和 maxSnippets;模板和洞察按各自固定的协议上限封顶(各 500)。
- 结果提示会报告写入多少条、跳过多少条(更旧/重复)。

Schema 版本管理

schemaVersion 从 1 开始。导入时逐步迁移(一次升一个版本),这样将来的格式能就地升级旧文档。文档的 schemaVersion 比当前构建认识的更新,直接报错拒绝——绝不静默丢弃,也不部分合并;版本太旧、无法迁移的,同样拒绝。

滑动上下文

harness 核心给每个 dsh 会话一个滑动上下文窗口,和 Claude Code、Codex 出厂的工作流一样:对话接近模型上下文上限(或服务商报告溢出)时,harness 自动压缩——较早的轮次被摘要,藏在 compaction 检查点标记后面,标记在对话记录里始终可见,模型只保留摘要加最近的尾部,会话继续。/compact 按需触发同样的压缩,标记渲染成可展开的「Context compacted」行。

dsh-composer-history 把输入框接进这套工作流,窗口滑动再也不会弄丢你的输入历史:

- 压缩后仍能召回——被遮蔽的轮次留在 Chat 视图发布的最终对话里,所以 ↑ 依然能走遍检查点前后你发过的每条消息。
- 摘要进入历史 — 每个检查点的摘要文本会以 [compacted] … 条目的形式进入 ↑ 召回和 Ctrl+R 搜索(开关:includeCompactionSummaries),这样模型不再逐字看到的上下文,按一个键就能找回来。
- 压缩提示 — 页面打开时若有检查点落地,会弹出一条临时 snackbar 提示(就是 Claude Code 里「Auto-compacting conversation…」那一刻),带上摘要片段和一个一键 Fill /compact 操作(showCompactionNotice、compactCommandText);填入的内容落在普通草稿里,只有你按 Enter 才会发送。
- 搜索计数 — Ctrl+R 面板现在会显示实时的 N entries / N matches 状态行,过长的条目会被截断为两行。

压缩本身(阈值、摘要模型、/compact)由 harness 核心的压缩插件负责 —— 本插件只观察 Chat 视图的会话投影已经发布的检查点标记(uiConversation.binding(id).target('chat').legacy.nodes),因此无需改动任何智能体循环或模型请求即可工作。

权限与数据

- 权限:插件在其 workshop manifest 中只声明了 browser:local-storage,别的什么都没有。不联网,不起子进程,不订阅会话事件。
- 数据:四个浏览器本地 localStorage 键 —— dsh.composer-history.v1(已发送消息历史)、dsh.composer-history.snippets.v1(片段文本 + 标签 + 使用计数)、dsh.composer-history.templates.v1(模板文本)、dsh.composer-history.insights.v1(去重后的提示词文本 + 按会话的使用计数)。全部有上限,仅限同源,绝不上传;数据损坏时静默重置。
- 模型可见 ⟺ 你按 Enter:召回文本、片段加载、模板填充、/compact 填充,全都落在普通输入框草稿里。你不按 Enter,什么都不会到达模型。

安全边界

- 只管 UI,从不做强制。 插件只编辑输入框草稿;沙箱、审批、会话系统仍是强制执行的权威,任何命令或工具都不会被冒领或绕过。
- 除显式导出外,内容不离开浏览器。 历史、片段、模板、洞察都存在 localStorage;不上传,不发模型请求,不发起网络调用。带版本号的备份导出只在显式点击时写入本地下载或剪贴板。
- 出错就大声报。 非法枚举值会让整个 dsh 启动失败;格式错误的搜索组合键会让浏览器 fiber 失败 —— 配置错误绝不会静默降级。
- 一切有上限。 maxHistory、maxPersisted、maxSnippets 限制保留条目数;损坏或外来的数据静默重置。
- 透传零副作用。 插件只在 plain 输入阶段拦截,并让位于斜杠菜单、命令弹窗、输入法组合、文本选择和修饰键组合。

已知限制

- Composer DOM 形态。 拦截锚定在宿主私有的 DOM 上:[data-input-scroll] 内的 contenteditable div[data-composer-input](harness 0.1.2-alpha.5 / 0.1.2-rc.1 及之后版本);[data-input-scroll] 内的旧版 textarea composer(0.1.1-rc.2 及更早版本)仍然匹配。这个形态不是公开 API(上游提案 C3 记录:插件只能猜宿主 DOM),所以将来宿主 DOM 一变,拦截可能悄悄失效——compat 工作流的 jsdom 冒烟测试会针对打包产物重新校验这个形态。
- 逻辑行与视觉行。 默认的 logical 按 \n 计行(一条自动换行的长消息算一行);visual 用隐藏镜像测量真实换行,镜像复制 contenteditable 表面的计算盒(每次边界检查做 O(lines·log n) 二分查找,按草稿/宽度记忆化)。镜像测量需要真实布局引擎——纯 span 数学部分改为单元测试覆盖,Lexical composer 上的实测 span 只能尽力而为(默认仍是 logical)。
- 持久化历史按浏览器隔离。 存储放在单个源的 localStorage 里,从不在浏览器或机器之间同步。数据损坏时静默重置。
- 撤销栈包含召回事务。 每次填充/恢复都是输入机撤销日志里的一次 setDraft 事务;Ctrl+Z 会一步步退回召回操作。精度修复需要上游暴露编辑范围。
- 召回 /xxx 条目后按 Enter,走正常的命令认领/裁决路径(符合预期,Enter 从不被拦截)。
- 菜单/弹窗和非 plain 阶段始终优先;已提交的发送和会话切换都会重置为 IDLE。
- 引用 chip(U+FFFC 占位符)随召回/恢复的草稿文本一起带出。
- historyScope: 'workspace' 读取其他已列出会话的 Chat 目标;某个会话的 Chat 视图若在本页从未激活过,暂时不贡献任何内容。
- 搜索浮层是纯 DOM(不依赖 React);它渲染所有匹配项,上限为 maxHistory。
- 压缩感知是观察式的。 安装前(或会话切换前)落地的检查点从不触发提示;检查点的摘要事件落在已加载窗口之外时,不贡献 [compacted] … 条目(summary: null)。
- 提示里的「Compact now」操作只把配置的命令文本填进草稿——发送仍由你按 Enter。
- 片段、模板和洞察都只存在浏览器本地。 名称用 kebab-case(1..64 字符);标签上限 8 × 32 字符。模板变量从当前会话解析;{{draft}} 是选取时刻的草稿。

开发

pnpm install # node ^22.19 || >=24
pnpm run build # tsc build + tsdown bundle (lib/)
pnpm run typecheck # tsc --noEmit (src + tests)
pnpm test # vitest run
pnpm run test:watch # vitest watch
pnpm run test:coverage # vitest run --coverage
pnpm run check:readmes # README consistency gate
pnpm run verify:pack # pack-surface check

主题

贡献者

- @gengwg — 处理易失性启动配置(#11)。
- @yujethrozheng-crypto — 在 0.2.1-rc.2 中恢复输入框历史(#12);rc.2 的启动修复随 0.8.15 发布。
- @PerryLink — 创建者与维护者:边缘优先的箭头回溯、持久化历史、反向搜索、滑动上下文感知、片段库、提示词模板、复用洞察,以及 dsh.bundle / dshWorkshop 清单。

PerryLink DSH 插件家族

本项目属于 PerryLink 的 DeepSeek Harness 插件家族。下方名册默认折叠,让每个 README 的首屏都保持简短;展开即可查看每一行及其状态。

展开全部插件

| 插件 | 状态 |
| dsh-aqua-input-check | |
| dsh-archive-check | |
| dsh-auto-review | |
| dsh-autotier | |
| dsh-bid-ca-precheck | |
| dsh-bid-qual-check | |
| dsh-cert-mcp | |
| dsh-checkpoint-rewind | |
| dsh-click | |
| dsh-composer-history | |
| dsh-contract-stance | |
| dsh-customs-doc-check | |
| dsh-data-quality | |
| dsh-demurrage-ledger | |
| dsh-doublecheck | |
| dsh-drill-script-check | |
| dsh-eia-guide-check | |
| dsh-emergency-plan | |
| dsh-essay-rubric-check | |
| dsh-evidence-check | |
| dsh-export-ctl-check | |
| dsh-fast | |
| dsh-fmea-table-check | |
| dsh-forecast-penalty | |
| dsh-fund-research | |
| dsh-github | |
| dsh-gongwen-flow-check | |
| dsh-gongwen-word-check | |
| dsh-guard-plan-qc | |
| dsh-hazchem-check | |
| dsh-hazplan-check | |
| dsh-hidden-risk-map | |
| dsh-hs-classify | |
| dsh-icd-rule-check | |
| dsh-industry-research | |

| dsh-lawcite-adapter | |
| dsh-laya | |
| dsh-lc-doc-check | |
| dsh-learning-gap-check | |
| dsh-library | |
| dsh-local-ai | |
| dsh-lsp-actions | |
| dsh-mask | |
| dsh-mcp-panel | |
| dsh-medrec-qc | |
| dsh-memento | |
| dsh-nsfc-form-check | |
| dsh-nurse-record-check | |
| dsh-observe | |
| dsh-origin-rvc-check | |
| dsh-ota-review-check | |
| dsh-output-styles | |
| dsh-paper-doc-adapter | |
| dsh-permission-rules | |
| dsh-permit-report-check | |
| dsh-pipeline-check | |
| dsh-pleading-draft | |
| dsh-plugin-doctor | |
| dsh-plugin-guide | |
| dsh-plugin-kit | |
| dsh-plugin-upgrade | |
| dsh-policy-brief-draft | |
| dsh-power-loss-split | |
| dsh-power-ticket-check | |
| dsh-ppap-check | |
| dsh-protest-deadline | |
| dsh-railway-window | |
| dsh-repair-order-qc | |
| dsh-research-report | |
| dsh-review-reply-check | |
| dsh-rulefile-check | |
| dsh-safety-brief-check | |
| dsh-score | |
| dsh-session-sync | |
| dsh-site-log-check | |
| dsh-skill-pack-security | |
| dsh-soe-decision-check | |
| dsh-soilwater-check | |
| dsh-sop-sync-check | |
| dsh-spc-gbt-adapter | |
| dsh-talk | |
| dsh-tender-extract | |
| dsh-tender-matrix | |
| dsh-test-drive | |
| dsh-ticktick | |
| dsh-translate | |
| dsh-warranty-calc | |
| dsh-budget | 🧊 FROZEN — see the repo README |
| dsh-claude-move | 🧊 FROZEN — see the repo README |
| dsh-defend | 🧊 FROZEN — see the repo README |
| dsh-draw | 🧊 FROZEN — see the repo README |
| dsh-reach | 🧊 FROZEN — see the repo README |
| dsh-background-agents | 🚫 RETIRED — see the repo README |
| dsh-session-pin | 🚫 RETIRED — see the repo README |
| dsh-team-rooms | 🚫 RETIRED — see the repo README |

License

Apache License 2.0 © 2026 dsh-composer-history contributors
预览分享卡片长什么样 ↓PerryLink/dsh-composer-history
分享 · DeepSeek Harness Hub
PerryLink/dsh-composer-history

DeepSeek Harness 网页输入框的终端式历史记录:方向键优先从边缘翻历史,草稿与光标位置精确还原,历史存在浏览器本地,Ctrl+R 反向搜索,按工作区召回,还能感知滑动上下文(召回与搜索里包含压缩摘要…

回到顶部