dsh-memento 0.5.13 → 0.5.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README-zh.md CHANGED
@@ -11,6 +11,7 @@
11
11
  [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-memento)
12
12
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
13
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-memento.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
+ [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-top-rated.svg)](https://dsh.market/)
14
15
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
15
16
  [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-memento/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-memento/actions)
16
17
  [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-memento?label=version)](https://github.com/PerryLink/dsh-memento/releases)
@@ -27,7 +28,7 @@
27
28
 
28
29
  | Surface | Status |
29
30
  |---|---|
30
- | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2`(2026-09-18 复核):仍无插件事件注册面——`KNOWN_SESSION_EVENT_TYPES` 不含 `memory/*`,且 `Session.append` 第三参只承载 surface 类型的 `SurfaceIntent`,故审计门保持自适应、行为不变(现在会在进程内告警一次,并在 `/memory audit` 输出里明示缺口)。peer 区间保留 `0.1.2-rc.1`、`0.1.5-alpha.1`、`0.1.6-0` 三条线。类型证据来自三个面:本机 checkout 的已构建类型、`node_modules` 里钉住的已发布线、以及 DOM 库下的浏览器半侧。 |
31
+ | Harness | DeepSeek Harness `dsh-v0.1.7-alpha.1`(2026-09-22 适配):`0.1.7` 线把整条设置注册面(`installSettingsSection` / `SettingsProvider.installSection` / `SettingsNamespace` / `SettingsScope`)换成 live config 表单——表单的 namespace 就是 profile entry id(`memento`),可编辑字段就是标了 `.volatile()` 的那些,被接受的编辑**提交进运行中的插件**而不是重挂它。浏览器半经 `ctx.configForms.get(entryId)` 读同一份表单(`ctx.settingsScope` 服务已删)。两侧都保留了 `installSection` / `settingsScope` 分支,peer 区间仍声明支持 `0.1.2-rc.1`、`0.1.5-alpha.1`、`0.1.6-0` 三条线;新增的 `>=0.1.7-0 <0.2.0` 这一段是修 bug——旧范围按 semver 预发布规则把目标宿主本身排除在外。仍无插件事件注册面——`KNOWN_SESSION_EVENT_TYPES` 不含 `memory/*`,且 `Session.append` 第三参只承载 surface 类型的 `SurfaceIntent`,故审计门保持自适应、行为不变(会在进程内告警一次,并在 `/memory audit` 输出里明示缺口)。类型证据来自三个面:本机 checkout 的已构建类型、`node_modules` 里钉住的已发布线、以及 DOM 库下的浏览器半侧。 |
31
32
  | Node | `^22.19.0 || >=24.0.0` |
32
33
  | Platforms | Windows / macOS / Linux(纯 host;无原生代码、无网络) |
33
34
  | Model | 任意 |
@@ -67,7 +68,7 @@ dsh --profile web --dump-config | grep -A3 'id: memento'
67
68
 
68
69
  所有可调项均为 Schemastery `Config` 字段(可在 cordis.yml 中修改)。非法值在加载期响亮失败。在 `memento` 行下覆盖。
69
70
 
70
- **设置面板。** DSH 设置服务挂载时,下表除 `enabled` 外的全部字段可在 DSH 设置侧栏的插件一级项 **`dsh-memento`**(与通用设置、插件等并列)中编辑;修改写入设置用户层(`settings.yaml`),无需改文件。几乎全部即时生效(写策略、语言、预算、各上限、提案、面板;`dbPath` / `auditRetentionDays` 经重开 store 生效;`retrieval.vector` 经重装检索器生效)——只有 `snapshotOrder` 需要 DSH 重载。设置服务缺失时一切回退组合配置,与从前完全一致。悬浮窗按钮可在同一页面隐藏(`panel.enabled`)。
71
+ **设置面板。** `0.1.7` 线上插件自己的 `Config` **就是**它的设置页:表单的 namespace 是 profile entry id(`memento`,即本 bundle 那一行的 `id:`),可编辑字段恰好是插件标了 `.volatile()` 的那些(下表除 `enabled` 外的每个键),被接受的编辑合并进 profile 的插件行并提交进运行中的插件——无需改文件、无需重启。几乎全部即时生效(写策略、语言、预算、各上限、提案、面板;`dbPath` / `auditRetentionDays` 经重开 store 生效;`retrieval.vector` 经重装检索器生效);插件在加载期注册的面(`snapshotOrder`、工具描述文案)在重载后跟随,页面为这些字段标了记号。数值下限同时写在 schema 里,越界编辑在**写入路径**即被拒绝,不会留下一个用不了的配置。旧线(`0.1.2-rc.1`、`0.1.5-alpha.1`、`0.1.6-0`)上同一张卡片编辑 `dsh-memento` 设置 namespace,行为与从前一致;设置服务完全缺失时一切回退组合配置。悬浮窗按钮可在同一页面隐藏(`panel.enabled`)。
71
72
 
72
73
  | Key | Default | Meaning |
73
74
  |---|---|---|
@@ -105,7 +106,7 @@ dsh --profile web --dump-config | grep -A3 'id: memento'
105
106
  | `memory_recall` | tool | 有界的记忆匹配 + 近期会话历史匹配 |
106
107
  | `/memory` | command | `list` · `query` · `add` · `remove` · `consolidate` · `proposals` · `budgets` · `audit` · `export` · `import <path>` · `adapters` |
107
108
  | web panel | client drawer | 只读:浏览条目、搜索、预算条、审计尾部;悬浮入口按钮可隐藏(`panel.enabled`) |
108
- | settings section | DSH 设置侧栏 → `dsh-memento` | 免改文件编辑除 `enabled` 外的全部配置字段;即时/重载生效时机在页面内标注 |
109
+ | settings section | DSH 设置侧栏 → `dsh-memento` | 免改文件编辑除 `enabled` 外的全部配置字段(`0.1.7` 线上 namespace = `memento` profile entry,之前是 `dsh-memento` 设置 namespace);即时/重载生效时机在页面内标注 |
109
110
 
110
111
  ## MCP server
111
112
 
@@ -244,56 +245,56 @@ npm run verify:artifacts # artifact presence + syntax + import
244
245
 
245
246
  ## PerryLink DSH Plugin Family
246
247
 
247
- 这是 [PerryLink](https://github.com/PerryLink) 维护的 [40 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果它能帮到你,其他的也会:
248
+ This project is one of the **45 DeepSeek Harness plugins** maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
248
249
 
249
250
  | Plugin | One-liner |
250
251
  |---|---|
251
- | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | 审批链上的第二模型自动审查,默认失败关闭 | |
252
- | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 带 Web UI 侧栏、消息与中断的持久后台子代理 | |
253
- | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | DeepSeek Harness 的成本治理:预算、碳排与延迟一屏呈现。 | |
254
- | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind 等价:快照、会话 fork、一次性恢复 | |
255
- | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 把 Claude Code 会话、记忆、技能与 CLAUDE.md 迁入 DSH | |
256
- | **[dsh-click](https://github.com/PerryLink/dsh-click)** | 跨平台原生桌面控制(DeepSeek Harness),Windows 优先。 | |
257
- | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Web 输入框的终端式历史:方向键、Ctrl+R 搜索 | |
258
- | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 数据集质量检查与引文核查(本插件可选消费的数字核查桥) | |
259
- | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | DeepSeek Harness 的提示注入、越狱与密钥泄露防护。 | |
260
- | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | 工程纪律守卫:需求质询、测试门禁、对手评审 | |
261
- | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | DeepSeek Harness 的统一静态图像生成路由。 | |
262
- | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | DeepSeek Harness 只读性能诊断。 | |
263
- | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | 面向中国公募基金的确定性研究报告 | |
264
- | **[dsh-github](https://github.com/PerryLink/dsh-github)** | 面向 DSH 的 GitHub PR/issues 集成,每次写入经审批门控 | |
265
- | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | 行业研究编排,经本插件的 `ctx.researchReport.assemble` 封存交付物 | |
266
- | **[dsh-library](https://github.com/PerryLink/dsh-library)** | DeepSeek Harness 的本地文档知识库。 | |
267
- | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | DeepSeek Harness 的本地模型(Ollama)接入。 | |
268
- | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | 通过语言服务器的 LSP 诊断、格式化、补全、代码操作与重命名 | |
269
- | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII 脱敏中间件:模型边界匿名化、展示层还原 | |
270
- | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | 只读 MCP 运行时面板:/mcp 命令 + 带状态、工具与错误的 Settings 标签页 | |
271
- | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | DeepSeek Harness 的 OpenTelemetry 与 Langfuse 可观测导出器。 | |
272
- | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles 等价的运行时风格切换 | |
273
- | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code 风格声明式 allow/deny/ask 权限规则,带审计 | |
274
- | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | 个人指令注入器:顶栏开关(框架版) |
275
- | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | 作为按需代理技能的插件开发知识库 | |
276
- | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
277
- | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 多渠道审批/提问桥接:微信/Telegram/飞书,会话控制台 |
278
- | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | 可验证研究报告引擎:内容寻址证据账本与封存版本 | |
279
- | **[dsh-score](https://github.com/PerryLink/dsh-score)** | DeepSeek Harness 插件的多维质量评分。 | |
280
- | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 在 Web 侧栏置顶会话,带持久排序 | |
281
- | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | DeepSeek Harness 的跨设备会话同步——会话存储的专用 git 镜像。 | |
282
- | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | 安全审计技能包:密钥扫描、依赖与供应链审查 | |
283
- | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | DeepSeek Harness 的语音优先会话闭环:对它说,听它答。 | |
284
- | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness 插件的隔离试装冒烟。 | |
285
- | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/滴答清单任务桥接:会话头面板 + 11 个工具 |
286
- | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness 的厂商参数翻译与确定性 JSON 修复。 | |
287
- | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | 微信 ↔ DSH 桥接(Tencent iLink 机器人):文本/图片/文件/语音,聊天内审批卡片 |
252
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
288
253
  | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
254
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
255
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
289
256
  | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
290
257
  | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
291
- | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
258
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
259
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | |
260
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
261
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
262
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) | |
263
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
264
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
265
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
266
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics for DeepSeek Harness. | |
267
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
268
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
269
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
270
+ | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | Laya typed decisions (`noul`/`choice`/`score`) as a first-class Cordis service and model-visible tools | |
271
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
272
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
273
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
274
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
275
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
276
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | |
277
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
278
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
279
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
292
280
  | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
281
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
282
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
293
283
  | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
294
- | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
284
+ | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | One-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card | |
295
285
  | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
286
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | |
287
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
288
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
289
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
290
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
291
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
292
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
296
293
  | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
294
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
295
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools | |
296
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
297
+
297
298
 
298
299
  ## License
299
300
 
package/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  # dsh-memento
4
4
  - **1024 store channel**: `npm i -g dsh1024` once, then `dsh1024 plugin --profile web add dsh-memento` (counts toward the [deepseek1024.com](https://deepseek1024.com) install ranking).
5
5
  [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-memento)
6
+ [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PerryLink/dsh-memento/badge)](https://api.securityscorecards.dev/projects/github.com/PerryLink/dsh-memento)
6
7
 
7
8
  **Bounded, layered, approval-gated, auditable cross-session memory for DeepSeek Harness.**
8
9
 
@@ -11,6 +12,7 @@
11
12
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
12
13
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
13
14
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-memento.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
15
+ [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-top-rated.svg)](https://dsh.market/)
14
16
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
15
17
  [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-memento/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-memento/actions)
16
18
  [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-memento?label=version)](https://github.com/PerryLink/dsh-memento/releases)
@@ -27,7 +29,7 @@
27
29
 
28
30
  | Surface | Status |
29
31
  |---|---|
30
- | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.2` (re-checked 2026-09-18): still no plugin event-registration surface — `KNOWN_SESSION_EVENT_TYPES` does not carry `memory/*`, and `Session.append`'s third argument only carries a `SurfaceIntent` for surface-eligible types, so the audit gate stays adaptive and skips as before (it now says so once per process and in `/memory audit`). Peer range keeps the `0.1.2-rc.1`, `0.1.5-alpha.1` and `0.1.6-0` lines. Type evidence comes from three faces: the local checkout's built types, the pinned published line in `node_modules`, and the browser half under a DOM lib. |
32
+ | Harness | DeepSeek Harness `dsh-v0.1.7-alpha.1` (adapted 2026-09-22): the `0.1.7` line replaced the whole settings registration surface (`installSettingsSection` / `SettingsProvider.installSection` / `SettingsNamespace` / `SettingsScope`) with live Config forms, so both halves follow the new contract — a form's namespace is the profile entry id (`memento`), its editable fields are the `.volatile()` ones, and an accepted edit is committed into the running plugin instead of remounting it. The browser half reads that form through `ctx.configForms.get(entryId)` (the `ctx.settingsScope` service is gone). Both halves keep their `installSection` / `settingsScope` branches for the `0.1.2-rc.1`, `0.1.5-alpha.1` and `0.1.6-0` lines the peer range still advertises, and the new `>=0.1.7-0 <0.2.0` clause is what makes the target host itself installable (the old range excluded it by semver's prerelease rule). Still no plugin event-registration surface — `KNOWN_SESSION_EVENT_TYPES` does not carry `memory/*`, and `Session.append`'s third argument only carries a `SurfaceIntent` for surface-eligible types, so the audit gate stays adaptive and skips as before (it says so once per process and in `/memory audit`). Type evidence comes from three faces: the local checkout's built types, the pinned published line in `node_modules`, and the browser half under a DOM lib. |
31
33
  | Node | `^22.19.0 || >=24.0.0` |
32
34
  | Platforms | Windows / macOS / Linux (pure host; no native code, no network) |
33
35
  | Model | Any |
@@ -67,7 +69,7 @@ dsh --profile web --dump-config | grep -A3 'id: memento'
67
69
 
68
70
  All tunables are Schemastery `Config` fields (changeable from cordis.yml). Invalid values fail loudly at load. Override under the `memento` row.
69
71
 
70
- **Settings panel.** When the DSH settings service is mounted, every field below (except `enabled`) is editable from the plugin's own **`dsh-memento` entry in the DSH settings sidebar** (a top-level section, like General or Plugins); edits land in the settings user layer (`settings.yaml`) and need no file editing. Nearly everything applies live (write policies, language, budgets, limits, proposals, panel, `dbPath` / `auditRetentionDays` via a store reopen, `retrieval.vector` via a retriever swap) — only `snapshotOrder` needs a DSH reload. Without the settings service everything falls back to the composed cordis config, exactly as before. The floating panel button can be hidden from the same page (`panel.enabled`).
72
+ **Settings panel.** On the `0.1.7` line the plugin's own `Config` **is** its settings page: the form's namespace is the profile entry id (`memento` — the `id:` of this bundle's row), the editable fields are exactly the ones the plugin declares `.volatile()` (every key below except `enabled`), and an accepted edit is merged into the profile's plugin row and committed into the running plugin — no file editing, no restart. Nearly everything applies live (write policies, language, budgets, limits, proposals, panel, `dbPath` / `auditRetentionDays` via a store reopen, `retrieval.vector` via a retriever swap); what a plugin registers at load time (`snapshotOrder`, tool descriptions) is re-read on reload, and the page marks those fields. Numeric bounds are declared in the schema as well, so an out-of-range edit is refused at write time instead of leaving an unusable config behind. On the older lines (`0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.6-0`) the same card edits the `dsh-memento` settings namespace exactly as before; with no settings service at all, everything falls back to the composed cordis config. The floating panel button can be hidden from the same page (`panel.enabled`).
71
73
 
72
74
  | Key | Default | Meaning |
73
75
  |---|---|---|
@@ -105,7 +107,7 @@ All tunables are Schemastery `Config` fields (changeable from cordis.yml). Inval
105
107
  | `memory_recall` | tool | Bounded memory matches plus recent session-history matches |
106
108
  | `/memory` | command | `list` · `query` · `add` · `remove` · `consolidate` · `proposals` · `budgets` · `audit` · `export` · `import <path>` · `adapters` |
107
109
  | web panel | client drawer | Read-only: browse entries, search, budget bars, audit tail; the floating entry button can be hidden (`panel.enabled`) |
108
- | settings section | DSH settings sidebar → `dsh-memento` | Edit every config field (except `enabled`) without touching files; live vs reload-required timing is marked on the page |
110
+ | settings section | DSH settings sidebar → `dsh-memento` | Edit every config field except `enabled` without touching files (namespace = the `memento` profile entry on the `0.1.7` line, the `dsh-memento` settings namespace before it); live vs reload-required timing is marked on the page |
109
111
 
110
112
  ## MCP server
111
113
 
@@ -244,13 +246,16 @@ npm run verify:artifacts # artifact presence + syntax + import
244
246
 
245
247
  ## PerryLink DSH Plugin Family
246
248
 
247
- This project is one of the [40 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
249
+ This project is one of the **45 DeepSeek Harness plugins** maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
248
250
 
249
251
  | Plugin | One-liner |
250
252
  |---|---|
251
253
  | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
254
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
252
255
  | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
253
256
  | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
257
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
258
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
254
259
  | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
255
260
  | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | |
256
261
  | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
@@ -263,37 +268,34 @@ This project is one of the [40 DeepSeek Harness plugins](https://github.com/Perr
263
268
  | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
264
269
  | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
265
270
  | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
271
+ | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | Laya typed decisions (`noul`/`choice`/`score`) as a first-class Cordis service and model-visible tools | |
266
272
  | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
267
273
  | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
268
274
  | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
269
275
  | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
270
276
  | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
277
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | |
271
278
  | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
272
279
  | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
273
280
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
274
- | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Personal directive injector with top-bar toggle (framework edition) |
275
- | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
281
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
276
282
  | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
277
- | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console |
283
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
284
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
285
+ | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | One-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card | |
286
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
287
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | |
278
288
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
279
289
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
280
290
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
281
291
  | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
282
292
  | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
283
293
  | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
294
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
284
295
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
285
- | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools |
296
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools | |
286
297
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
287
- | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot): text/image/file/voice, approvals in chat |
288
- | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
289
- | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
290
- | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
291
- | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
292
- | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
293
- | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
294
- | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
295
- | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
296
- | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
298
+
297
299
 
298
300
  ### Install from the DSH Desktop Market
299
301
 
package/client/client.js CHANGED
@@ -9,9 +9,11 @@
9
9
  // /api/memento/* JSON 路由(只走公开 API)。写与审批在 DSH 内置审批 UI 完成,
10
10
  // 面板不产生任何模型可见内容、不做任何审批决策。
11
11
  // 面板文案随 Config.language(en/zh)切换,语言来自 entries 路由响应。
12
- // 设置页经 ctx.settingsScope 读/写用户层(settings.yaml),暂存—保存语义
13
- // 与宿主内置卡片一致;factory 的 require 由宿主模块系统提供(react 为平台
14
- // 内置模块)。
12
+ // 设置页按宿主线取设置句柄:0.1.7-alpha 起是 ctx.configForms.get(entryId)
13
+ // (namespace = profile entry id),旧线是 ctx.settingsScope.bind({namespace});
14
+ // 两者都不写进 inject(另一条线的服务在对面宿主上永不到场,会把 fiber 永久挂起,
15
+ // 面板一起消失),缺席时卡片降级为只读。暂存—保存语义与宿主内置卡片一致;
16
+ // factory 的 require 由宿主模块系统提供(react 为平台内置模块)。
15
17
 
16
18
  ;(function () {
17
19
  'use strict'
@@ -382,6 +384,63 @@ function escapeHtml(value) {
382
384
  }
383
385
 
384
386
  // ── 宿主设置页(settings.section 一级项,id = dsh-memento)──────────────
387
+
388
+ /**
389
+ * 设置 namespace 的两个名字(与 index.mjs 的 SETTINGS_ENTRY_ID /
390
+ * SETTINGS_NAMESPACE 同值)。
391
+ *
392
+ * 字面量在这里重写一遍而不是从 index.mjs 取:客户端打包面不允许跨插件取
393
+ * value(宿主客户端构建的纯度门),宿主半的测试直接读 cordis.patch.yml
394
+ * 断言 entry id,两侧由那一处断言钉住。
395
+ */
396
+ const SETTINGS_ENTRY_ID = 'memento'
397
+ const LEGACY_SETTINGS_NAMESPACE = 'dsh-memento'
398
+
399
+ /**
400
+ * 设置句柄缺席时的只读替身:卡片照旧显示,只是显示为只读(与旧线
401
+ * 「namespace 未注册」时的形态一致)。
402
+ * @type {{getSnapshot: () => any, subscribe: (fn: () => void) => () => void, set: (field: string, value: unknown) => Promise<boolean>}}
403
+ */
404
+ const UNAVAILABLE_SCOPE = {
405
+ getSnapshot: () => ({ status: 'unavailable', value: undefined, base: undefined, user: undefined, writable: false }),
406
+ subscribe: () => () => {},
407
+ set: async () => false,
408
+ }
409
+
410
+ /**
411
+ * 取宿主服务(先走 ctx.get,缺席回退属性面)。
412
+ * @param {any} ctx - 客户端上下文。
413
+ * @param {string} name - 服务名。
414
+ * @returns {any} 服务面或 undefined。
415
+ */
416
+ function serviceOf(ctx, name) {
417
+ if (typeof ctx.get === 'function') return ctx.get(name)
418
+ return ctx[name]
419
+ }
420
+
421
+ /**
422
+ * 解析设置句柄。两条宿主线各自只有一个在场:
423
+ * - 0.1.7-alpha 起:`ctx.configForms.get(entryId)`(ConfigForm:
424
+ * `{getSnapshot, subscribe, set, unset, mutate}`,namespace = profile entry id);
425
+ * - 旧线(0.1.2-rc.1 / 0.1.5-alpha.1 / 0.1.6-0):`ctx.settingsScope.bind({namespace})`。
426
+ *
427
+ * 两者都**不写进 inject**:对面那条线的服务在另一侧宿主上永不到场,写进去会让
428
+ * fiber 永久 PENDING——整个客户端插件(含只读面板)都不会挂载。缺席即降级为只读。
429
+ * @param {any} ctx - 客户端上下文。
430
+ * @returns {any} 设置句柄。
431
+ */
432
+ function resolveSettingsScope(ctx) {
433
+ const configForms = serviceOf(ctx, 'configForms')
434
+ if (configForms !== undefined && configForms !== null && typeof configForms.get === 'function') {
435
+ return configForms.get(SETTINGS_ENTRY_ID)
436
+ }
437
+ const settingsScope = serviceOf(ctx, 'settingsScope')
438
+ if (settingsScope !== undefined && settingsScope !== null && typeof settingsScope.bind === 'function') {
439
+ return settingsScope.bind({ namespace: LEGACY_SETTINGS_NAMESPACE })
440
+ }
441
+ return UNAVAILABLE_SCOPE
442
+ }
443
+
385
444
  /** 卡片文案(en 源文 / zh 译文;语言跟随 namespace value.language,保存后即时切换)。 */
386
445
  /** @type {Record<string, Record<string, string>>} */
387
446
  const CARD_STRINGS = {
@@ -650,10 +709,15 @@ function escapeHtml(value) {
650
709
  /**
651
710
  * 暂存表单(学宿主 CardForm:staged → save 才写;revision 栅防并发覆盖)。
652
711
  * 顶层聚合:同顶层字段的多个子字段草稿一次 scope.set(top, 合并值)。
712
+ *
713
+ * 两条宿主线的句柄形状在本类用到的那一面上一致(`getSnapshot` 返回
714
+ * `{status, value, user, base, writable}`、`subscribe`、`set(field, value)`):
715
+ * 旧线是 settingsScope,0.1.7 线是 ConfigForm。`set` 走**路径寻址写入**
716
+ * (顶层聚合值按顶层字段整体写),因此不会像整体替换那样静默删掉已存字段。
653
717
  */
654
718
  class CardForm {
655
719
  /**
656
- * @param {any} scope - 宿主 settingsScope 句柄。
720
+ * @param {any} scope - 宿主设置句柄(settingsScope 或 ConfigForm)。
657
721
  * @param {(tops: Map<string, object>) => void} onLanded - 落盘成功回调(panel 显隐同步用)。
658
722
  */
659
723
  constructor(scope, onLanded) {
@@ -922,9 +986,9 @@ function escapeHtml(value) {
922
986
  )
923
987
  }
924
988
 
925
- /** 控制器:scope → 暂存表单 → 设置页快照。保存落盘后同步本页悬浮按钮显隐。 */
989
+ /** 控制器:设置句柄 → 暂存表单 → 设置页快照。保存落盘后同步本页悬浮按钮显隐。 */
926
990
  class MementoCardController {
927
- /** @param {any} scope - 宿主 settingsScope 句柄(namespace = dsh-memento)。 */
991
+ /** @param {any} scope - 宿主设置句柄(0.1.7 线 = ConfigForm(entryId);旧线 = settingsScope)。 */
928
992
  constructor(scope) {
929
993
  this.scope = scope
930
994
  this.form = new CardForm(scope, (tops) => {
@@ -956,7 +1020,10 @@ function escapeHtml(value) {
956
1020
 
957
1021
  /**
958
1022
  * 客户端插件挂载:面板 + 设置页一级项。
959
- * @param {any} ctx - 宿主客户端上下文(slots/settingsScope)。
1023
+ *
1024
+ * 设置页**恒注册**(不按 namespace 是否在场门控):在线为可编辑卡片,离线为只读
1025
+ * 卡片——与旧线 namespace 未注册时的形态一致,卡片不会整块消失。
1026
+ * @param {any} ctx - 宿主客户端上下文(slots + configForms 或 settingsScope)。
960
1027
  * @returns {void}
961
1028
  */
962
1029
  function apply(ctx) {
@@ -968,7 +1035,7 @@ function escapeHtml(value) {
968
1035
  tag.textContent = CARD_CSS
969
1036
  document.head.appendChild(tag)
970
1037
  }
971
- const controller = new MementoCardController(ctx.settingsScope.bind({ namespace: 'dsh-memento' }))
1038
+ const controller = new MementoCardController(resolveSettingsScope(ctx))
972
1039
  ctx.effect(() => ctx.slots.inject('settings.section', () => ctx.slots.register({
973
1040
  name: 'settings.section',
974
1041
  id: 'dsh-memento',
@@ -980,7 +1047,9 @@ function escapeHtml(value) {
980
1047
 
981
1048
  return {
982
1049
  name: 'memento-client',
983
- inject: ['slots', 'settingsScope'],
1050
+ // 只要 slots:设置句柄两条线各只有一个在场,写进 inject 会让对面宿主的 fiber
1051
+ // 永久 PENDING(面板也挂不上)。解析走 resolveSettingsScope 的可选读取。
1052
+ inject: ['slots'],
984
1053
  apply,
985
1054
  }
986
1055
  },