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

输入历史召回 liguanyu/dsh_PromptRecall

DeepSeek Harness
liguanyu37 天前有提交已提供中文文档扫描:含敏感能力

仿 Codex 的 DSH Web GUI 输入历史插件:在会话输入框按 ↑/↓ 浏览历史…

30.1/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

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

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add liguanyu/dsh_PromptRecall
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 37 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-prompt-recall(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

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

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

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 12 处,展示前 12 条)
  • 读取本地文件
    lib/index.js:36
    return await readFile(this.filePath, 'utf8')
  • 写入本地文件
    lib/index.js:46
    await mkdir(dirname(this.filePath), { recursive: true })
  • 写入本地文件
    lib/index.js:47
    await writeFile(tmp, text, 'utf8')
  • 写入本地文件
    lib/index.js:48
    await rename(tmp, this.filePath)
  • 删除本地文件
    lib/index.js:50
    try { await rm(tmp, { force: true }) } catch (cleanupErr) { }
  • 读取本地文件
    lib/index.js:63
    readFile(this.lockPath, 'utf8'),
  • 读取本地文件
    lib/index.js:64
    stat(this.lockPath),
  • 删除本地文件
    lib/index.js:78
    try { await rm(this.lockPath, { force: true }) } catch (err) { }
  • 读取本地文件
    lib/index.js:84
    const raw = await readFile(this.lockPath, 'utf8')
  • 删除本地文件
    lib/index.js:85
    if (raw === token) await rm(this.lockPath, { force: true })
  • 写入本地文件
    lib/index.js:90
    await mkdir(dirname(this.filePath), { recursive: true })
  • 写入本地文件
    lib/index.js:95
    await writeFile(this.lockPath, token, { encoding: 'utf8', flag: 'wx' })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • Esc清除并进入历史
  • 跨会话跨重启持久保留
展开完整介绍(100 字)↓

仿 Codex 的 DSH Web GUI 输入历史插件:在会话输入框按 ↑/↓ 浏览历史提示词,按 Esc 清空当前输入框并进入历史,历史跨会话、跨重启保留,只存纯文本,按键接管安全,不会误伤草稿。

README

由 DeepSeek 最新模型翻译生成
dsh_PromptRecall 仿 Codex 的 DSH Web GUI 输入历史插件:在会话输入框按 ↑/↓ 浏览历史 prompt,历史跨会话、跨重启持久保留。 特性 / Features - ↑ 召回历史,↓ 向新移动:空输入框按 ↑ 从最新条目开始逆序浏览,↓ 向新移动,越过最新项后清空输入框并退出浏览。 - 当前对话优先:回到一个对话时,先召回该对话自己的历史,继续按 ↑ 才进入其他对话的历史。 - 跨会话、跨重启持久:用户级 JSONL 全局历史,稳定单调 ID,刷新页面或重启后仍可召回。 - 安全的按键路由:非空草稿、多行正文中间、有选区、弹窗打开时,方向键一律交还编辑器,绝不误伤草稿。 - 浏览时不弹触发菜单:历史浏览期间主动收起 / 命令、skill、@ 引用候选面板,面板不会抢走 ↑/↓;一旦编辑草稿,浏览让位、面板立即恢复正常。 - Esc 草稿保险:清空未发送的非空草稿时把它存入历史(仅文本),按 ↑ 可找回。 - 位置指示:输入框上方 pill 显示当前位置(如 ↑ 2/38);pill 上的 × 两次点击可清空全部历史。 - 仅存文本 + 自动裁剪:只持久化纯文本;相邻完全相同的条目折叠;文件超限时删除最旧整行并保留最新。
展开完整文档(README 剩余 1 节)
dsh_PromptRecall

仿 Codex 的 DSH Web GUI 输入历史插件:在会话输入框按 ↑/↓ 浏览历史 prompt,历史跨会话、跨重启持久保留。

特性 / Features

- ↑ 召回历史,↓ 向新移动:空输入框按 ↑ 从最新条目开始逆序浏览,↓ 向新移动,越过最新项后清空输入框并退出浏览。
- 当前对话优先:回到一个对话时,先召回该对话自己的历史,继续按 ↑ 才进入其他对话的历史。
- 跨会话、跨重启持久:用户级 JSONL 全局历史,稳定单调 ID,刷新页面或重启后仍可召回。
- 安全的按键路由:非空草稿、多行正文中间、有选区、弹窗打开时,方向键一律交还编辑器,绝不误伤草稿。
- 浏览时不弹触发菜单:历史浏览期间主动收起 / 命令、skill、@ 引用候选面板,面板不会抢走 ↑/↓;一旦编辑草稿,浏览让位、面板立即恢复正常。
- Esc 草稿保险:清空未发送的非空草稿时把它存入历史(仅文本),按 ↑ 可找回。
- 位置指示:输入框上方 pill 显示当前位置(如 ↑ 2/38);pill 上的 × 两次点击可清空全部历史。
- 仅存文本 + 自动裁剪:只持久化纯文本;相邻完全相同的条目折叠;文件超限时删除最旧整行并保留最新。

设计 / Design

历史分两层:持久层(跨会话 JSONL 文件,只存文本)与局部层(当前会话的召回列表,含 Esc 暂存草稿)。

进入或切回一个会话时冻结快照:快照只含其他会话的记录,本会话的记录播种进局部层,因此统一索引的顺序是 [其他会话记录 | 本会话记录]。

示例:会话 A 依次输入 a、b、c,切到会话 B 输入 e、f,再切回 A 后按 ↑ 的顺序是 c → b → a → f → e(当前对话优先,全局兜底)。

每条记录带稳定单调 ID,裁剪只删最旧整行、不重编号;本会话新提交只出现在局部层,因此每条恰好出现一次;局部层相邻且完全相同的条目(文本+会话+附件签名)折叠,持久层保留重复记录。
示例:会话 A 提交 a、b、c;会话 B 提交 e、f;回到 A 后,↑ 依次召回 c → b → a → f → e(当前会话优先,全局历史兜底)。

每条记录都带一个稳定单调 ID;裁剪只删除最旧的完整记录,绝不重新编号。当前会话里的新提交只出现在本地层,所以每条记录都恰好出现一次。本地层里相邻的相同条目(文本 + 会话 + 附件签名)会折叠,持久层则保留重复项。

键位与交互逻辑 / Keybindings & interaction logic

| 按键 | 行为 |
| ↑(空草稿) | 进入历史浏览,从最新条目开始 |
| ↑ / ↓(浏览中) | 向旧 / 向新移动;最旧处不回绕 |
| ↓(最新项再按) | 清空输入框并退出浏览 |
| ↑/↓(非空草稿、正文中间、有选区、弹窗打开) | 交还编辑器,只移动光标/候选 |
| ↑/↓(浏览中,召回文本以 /、@ 开头) | 触发菜单被抑制:继续回溯历史,不弹候选面板 |
| Esc(非空草稿) | 清空草稿并存入历史(↑ 可找回);刚召回的条目已在历史里,不再重复记录 |
| Esc(浏览中) | 退出浏览;草稿为空时不做任何事 |

鼠标操作(非键盘)/ Mouse actions (not keyboard):
| 操作 | 行为 |
| 点击 pill 上的 × 两次(3 秒内) | 第一次点击变"确认?",第二次清空全部历史(含持久文件) |

接管判定:按键目标必须是会话输入框;只有"语义空"草稿(文本、附件、mention 全空)按 ↑ 才进入浏览;浏览中一旦用户改动文本或附件,立即退出接管并作废在途请求;弹窗或命令菜单消费过的按键自动让位。优先级上历史浏览高于触发菜单:浏览期间 / 命令、skill、@ 引用菜单被主动收起(避免刚召回的 /...、@... 弹面板抢走 ↑/↓),用户一编辑草稿即解除抑制、菜单恢复原有行为。

| Key | Behavior |
| ↑ (empty draft) | Start browsing history from the newest entry |
| ↑ / ↓ (browsing) | Move older / newer; no wrap at the oldest end |
| ↓ (past the newest) | Clear the composer and exit browsing |
| ↑/↓ (non-empty draft, mid-text, selection, popup open) | Handed back to the editor: move the caret / candidates only |
| ↑/↓ (browsing, recalled text starts with / or @) | Trigger menus are suppressed: history keeps the arrow keys and no candidate panel appears |
| Esc (non-empty draft) | Clear the draft and store it in history (recoverable with ↑); a just-recalled entry is already in history and is not recorded twice |
| Esc (browsing) | Exit browsing; no-op when the draft is empty |

| Action | Behavior |
| Click the pill's × twice (within 3 s) | The first click arms "confirm?", the second clears all history (including the persistent file) |

Takeover rules: the key target must be the conversation composer; browsing starts with ↑ only on a semantically empty draft (no text, attachments, or mentions); any user edit to the text or attachments while browsing immediately releases the takeover and invalidates in-flight requests; keys already consumed by a popup or command menu are always left alone. On priority, history browsing outranks the trigger menus: while browsing, the / command, skill, and @ reference menus are actively dismissed (so a recalled /... or @... cannot pop a panel and steal ↑/↓), and editing the draft releases that suppression and restores normal menu behavior.

数据与隐私 / Data & privacy

历史写入 DSH 主目录下的 prompt-history.jsonl(即 $DSH_HOME/prompt-history.jsonl;未设置 DSH_HOME 时默认 ~/.dsh/prompt-history.jsonl),每行一条 JSON 记录;只保存纯文本,不保存图片、mention 绑定或其他附件内容。

容量限制:持久文件约 10 MB(超限删除最旧整行,永远保留最新一条);当前会话的局部召回列表上限 200 条 / 256 KB(从最旧淘汰)。pill 上的 × 可随时清空全部历史。

安装

前置条件:已安装 pnpm 的 DSH 环境(dsh plugin 内部转发给 pnpm)。

从 GitHub 安装:

dsh plugin --profile web add github:liguanyu/dsh_PromptRecall

本地安装:

git clone https://github.com/liguanyu/dsh_PromptRecall
cd dsh_PromptRecall
pnpm install # link 安装沿仓库真实路径解析依赖,需先在仓库内安装
dsh plugin --profile web add .

本地安装使用 pnpm 的 link: 协议(改代码后重启即生效,无需重装);由于 Node 会解析链接的真实路径,请先 pnpm install 一次,让仓库内具备运行时依赖。github: 安装无需此步骤(依赖随包装入 profile 树)。

安装后重启 DSH Web(dsh web)即可生效;插件成为 web 组合中的一行,随启动自动加载,无需任何手动 define/run 步骤。

历史数据写入 $DSH_HOME/prompt-history.jsonl(默认 ~/.dsh/prompt-history.jsonl);目录不存在时会在首次写入时自动创建,无需手动准备。

开发

目录结构:

- lib/index.js — Host 半:promptRecall Remote 服务(JSONL 存储 + inbox 提交捕获)
- lib/store-core.js — 纯存储核心(两层历史/折叠/裁剪,零依赖可单测)
- lib/typert.host.js — 手写的 typert 宿主面(网关校验与派发)
- lib/client.js — Client 半:按键路由、历史状态机、位置 pill
- cordis.patch.yml — bundle patch:把插件行插入 web 组合
- test/store-core.test.mjs — 存储核心单测(node --test)
- test/typert-contract.test.mjs — TYPERT 契约单测:schema/codec 的 create() 工厂与两面一致性

- lib/index.js — Host half: the promptRecall Remote service (JSONL storage + inbox submission capture)
- lib/store-core.js — Pure storage core (two-layer history / folding / trimming, dependency-free and unit-testable)
- lib/typert.host.js — Hand-written typert host face (gateway validation and dispatch)
- lib/client.js — Client half: key routing, history state machine, position pill
- cordis.patch.yml — Bundle patch: inserts the plugin row into the web composition
- test/store-core.test.mjs — Storage core unit tests (node --test)
- test/typert-contract.test.mjs — TYPERT contract tests: the create() factories on schemas/codecs and both-face agreement

DSH 兼容性:本插件的 TYPERT 清单面向 DSH ≥ 0.1.7 的惰性工厂契约——TYPERT.schemas 的每个条目与每个 strict codec(参数与 result)都必须提供 create(),由注册表缓存、网关在边界处调用 codec.create().parse()。
升级 DSH 后若启动报 … has no create() factory,就是该契约发生了漂移,改完请跑 node --test (test/typert-contract.test.mjs 会先失败)。

DSH 兼容性:本插件的 TYPERT 清单面向 DSH ≥ 0.1.7 的惰性工厂契约——TYPERT.schemas 的每个条目与每个 strict codec(参数与 result)都必须提供 create(),由注册表缓存、网关在边界处调用 codec.create().parse()。
升级 DSH 后若启动报 … has no create() factory,就是该契约发生了漂移,改完请跑 node --test (test/typert-contract.test.mjs 会先失败)。

运行测试 / Run tests:

node --test
预览分享卡片长什么样 ↓liguanyu/dsh_PromptRecall
分享 · DeepSeek Harness Hub
liguanyu/dsh_PromptRecall

仿 Codex 的 DSH Web GUI 输入历史插件:在会话输入框按 ↑/↓ 浏览历史…

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部