dsh-prime-memory 0.18.2 → 0.18.5

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.
Files changed (65) hide show
  1. package/CHANGELOG.en.md +14 -0
  2. package/CHANGELOG.ja.md +14 -0
  3. package/CHANGELOG.ko.md +14 -0
  4. package/CHANGELOG.md +42 -0
  5. package/README.en.md +4 -0
  6. package/README.ja.md +4 -0
  7. package/README.ko.md +4 -0
  8. package/README.md +4 -0
  9. package/cordis.patch.yml +6 -0
  10. package/dist/client.js +1333 -168
  11. package/dist/config.d.ts +37 -0
  12. package/dist/config.js +7 -0
  13. package/dist/contract.d.ts +155 -1
  14. package/dist/hooks/capture-recovery.d.ts +59 -0
  15. package/dist/hooks/capture-recovery.js +88 -0
  16. package/dist/hooks/capture.js +114 -1
  17. package/dist/hooks/recall-ack.d.ts +48 -0
  18. package/dist/hooks/recall-ack.js +79 -0
  19. package/dist/hooks/recall.d.ts +23 -1
  20. package/dist/hooks/recall.js +124 -8
  21. package/dist/index.d.ts +22 -0
  22. package/dist/index.js +18 -4
  23. package/dist/metadata-validators.d.ts +5 -0
  24. package/dist/metadata-validators.js +11 -1
  25. package/dist/pipeline/l1.d.ts +4 -0
  26. package/dist/pipeline/l1.js +9 -2
  27. package/dist/pipeline/reconcile.js +4 -0
  28. package/dist/pipeline/ruminate.d.ts +11 -1
  29. package/dist/pipeline/ruminate.js +18 -1
  30. package/dist/pipeline/runner.js +62 -0
  31. package/dist/prompts/boundary.d.ts +17 -0
  32. package/dist/prompts/boundary.js +20 -0
  33. package/dist/prompts/graph-projection.js +4 -1
  34. package/dist/prompts/l1-dedup.d.ts +3 -3
  35. package/dist/prompts/l1-dedup.js +9 -1
  36. package/dist/prompts/l1-extraction.d.ts +3 -3
  37. package/dist/prompts/l1-extraction.js +12 -0
  38. package/dist/prompts/persona.js +6 -0
  39. package/dist/prompts/scene.js +7 -1
  40. package/dist/room-review.d.ts +196 -0
  41. package/dist/room-review.js +281 -0
  42. package/dist/stats.d.ts +26 -2
  43. package/dist/stats.js +270 -13
  44. package/dist/store/l0.d.ts +4 -0
  45. package/dist/store/l0.js +8 -0
  46. package/dist/store/l1.d.ts +34 -0
  47. package/dist/store/l1.js +68 -1
  48. package/dist/store/recall-usage.d.ts +43 -0
  49. package/dist/store/recall-usage.js +149 -0
  50. package/dist/store/rooms-registry.d.ts +66 -0
  51. package/dist/store/rooms-registry.js +250 -0
  52. package/dist/store/sqlite.d.ts +16 -0
  53. package/dist/store/sqlite.js +57 -0
  54. package/dist/store/trace.d.ts +39 -0
  55. package/dist/store/trace.js +149 -0
  56. package/dist/tools/index.d.ts +4 -1
  57. package/dist/tools/index.js +249 -2
  58. package/dist/types.d.ts +4 -0
  59. package/dist/util/redact.d.ts +27 -0
  60. package/dist/util/redact.js +228 -0
  61. package/package.json +13 -12
  62. package/dist/hall-backfill.d.ts +0 -33
  63. package/dist/hall-backfill.js +0 -95
  64. package/dist/hall-migrate.d.ts +0 -32
  65. package/dist/hall-migrate.js +0 -88
package/CHANGELOG.en.md CHANGED
@@ -22,6 +22,20 @@ This file covers the **0.12.0** release notes and the current **unreleased** cha
22
22
  - **Silent first-write loss regression**: lock files are created before the write; when the target's parent directory did not exist yet, `open('wx')` failed with ENOENT and stores swallowed it as a warn. `rmwJson` now `ensureDir`s before acquiring the lock (included from the main line).
23
23
  - Also includes everything from the main line: file-layer hardening (atomic writes / read-side classification / version fail-closed / file locking / path safety — see [Unreleased] entries).
24
24
 
25
+ ## [0.18.4] — 2026-09-28
26
+
27
+ ### Added
28
+
29
+ - **Crash recovery (§A)**: a turn interrupted by a host crash was previously lost forever with the in-memory capture buffer (the resume cold-start floor discarded all history). On `agent/session-start(resume)` the plugin now reconciles against the host's persisted event log: with the max L0-persisted turn as watermark it recovers complete trailing turns (cap 2; crash-orphaned turns are closed by the host with `turn/end{reason:'interrupted'}` — 98 instances found on this machine). Idempotency = watermark + per-turn existence check; when host read services are unavailable it degrades stepwise (`sessionQuery.readSession` → `sessionPersistence.readFrom` → current behavior + one-time notice), always fail-open and never blocking session startup.
30
+ - **Payload redaction (§C, `capture.redactSecrets`, default on)**: the capture boundary replaces 8 classes of secrets (PEM keys / Authorization headers / Bearer & JWT / Cookies / vendor API key shapes / emails / ≥9-digit numbers with dates excluded / high-entropy IDs) with typed `[REDACTED:<KIND>]` placeholders — a single choke point covering L0 JSONL, L0 SQLite, distill input and manual `memory_add`/`memory_import`. Safe values (`example` / `$VAR` / `${{…}}`) are kept; placeholders preserve the category so keyword search still matches. Note: once enabled the original L0 text is changed (rebuild cannot recover it); `false` restores plaintext.
31
+ - **Distill prompt anti-injection (§B)**: all six distill prompt files (L1 extract ×3 / L1 dedup ×3 / L2 scene ×2 / L3 persona ×2 / graph projection / reconcile) now carry a "content boundary (anti-injection)" declaration plus data-delimiter notes — conversation text, existing memory pools and scene contents embedded in prompts are data, not instructions, so instruction-like text in conversations can no longer hijack distillation, dedup or adjudication. Decision vocabularies and output contracts are unchanged.
32
+
33
+ ### Improved
34
+
35
+ - **Injection acknowledgment (§D)**: recall injection no longer marks the dedupe store on return; it is now a two-phase "pending → log receipt" — the mark happens only when the host actually writes the injected message into the session log (`user/message` with the `plugin:memory` signature and stable id). Injections overwritten or cancelled no longer suppress memories (they can be re-injected next turn); after 5 minutes without a receipt the mark is applied anyway (guards against an ack-chain failure disabling dedupe), unconfirmed-expired entries are dropped.
36
+ - **Compaction-aware re-injection (§E)**: after `compaction/end` (no error), the session's next turn performs one targeted enhanced recall — dedupe suppression is skipped (compaction evicted prior injections from context), the persona section is re-delivered immediately, and the occupancy ledger resets; consumed on use. The existing compact/clear full reset remains as a fallback; both paths are idempotent.
37
+ - **Structured trace (§F, `trace.*`)**: recall and distill events are persisted as daily JSONL under `<dataDir>/trace/` (14-day retention by default; 5 MB per-day cap with a marker). Recall events carry a query fingerprint (metadata-only by default: length + sha256; `trace.captureContent` stores the text ≤200 chars), hit/injected ids, scores, latency and four outcomes; distill events carry runId, the six-value decision aggregation (same source as `l1_receipts`, cross-auditable), latency and success. New `dsh-memory/trace-tail` endpoint; the Log tab gains a three-source switch (system log / recall trace / distill trace).
38
+
25
39
  ## [0.18.2] — 2026-09-27
26
40
 
27
41
  ### Fixed
package/CHANGELOG.ja.md CHANGED
@@ -9,6 +9,20 @@
9
9
 
10
10
  本ファイルは **0.12.0** リリースノートと現在の**未リリース**変更の日本語版です。全履歴は [CHANGELOG.md](./CHANGELOG.md)(中文)を参照してください。
11
11
 
12
+ ## [0.18.4] — 2026-09-28
13
+
14
+ ### 追加
15
+
16
+ - **クラッシュ復元(§A)**:ホストがターン途中でクラッシュすると、それまで当該ターンの会話はメモリバッファとともに永久失われていました(resume 時のコールドスタート保護が全履歴を破棄するため)。現在は resume 時にホストの永続化イベントログと突き合わせます:L0 記録済み最大 turn をウォーターマークとして、その後の完全なターンを最大 2 件まで補収(クラッシュ孤児ターンはホストが `turn/end{reason:'interrupted'}` で閉じます——実機で 98 件確認)。冪等性 = ウォーターマーク + ターン単位の存在チェック。ホストの読み取りサービスが利用不可の場合は段階的に縮退(`sessionQuery.readSession` → `sessionPersistence.readFrom` → 従来動作 + 一回限りの通知)し、常に fail-open でセッション起動を阻塞しません。
17
+ - **ペイロード赤字化(§C、`capture.redactSecrets`、デフォルト有効)**:捕获書き込み境界で 8 種の秘密(PEM 秘密鍵 / Authorization ヘッダー / Bearer・JWT / Cookie / ベンダー API キー形式 / メールアドレス / 9 桁以上の数値(日付は除外)/ 高エントロピー ID)を `[REDACTED:<KIND>]` 型付きプレースホルダーに置換——L0 JSONL・L0 SQLite・蒸留入力・手動 `memory_add`/`memory_import` を単一点でカバー。安全値(`example` / `$VAR` / `${{…}}` 等)は対象外。プレースホルダーはカテゴリ意味を保持し検索可能。注意:有効化後は L0 原文が変わります(再構築でも原文は取得不可)。`false` で平文に戻せます。
18
+ - **蒸留プロンプト耐注入(§B)**:6 つの蒸留プロンプトファイル(L1 抽出 ×3 / L1 重複排除 ×3 / L2 シーン ×2 / L3 ペルソナ ×2 / グラフ投影 / 突き合わせ器)すべてに「内容境界(耐注入)」宣言とデータスロット界定を追加——会話原文・既存記憶プール・シーン全文等の埋め込み内容はデータであり指令ではない。判定語彙と出力契約は不変。
19
+
20
+ ### 改善
21
+
22
+ - **注入確認(§D)**:リコール注入は返却時に即マークしなくなりました。「pending → ログ受領」の二段式——ホストが注入メッセージを実際にセッションログへ書き込んだ(`plugin:memory` 署名と安定 id を持つ `user/message`)時点で `dedupe.mark` します。上書き・取消された注入は記憶を誤抑制しなくなり(次ターンで再注入可能)、5 分受領なしで通常マークに縮退(確認経路故障による重複排除無効化を防ぐ)、未確認の期限切れは破棄。
23
+ - **圧縮後の精密再注入(§E)**:`compaction/end`(error なし)の後、当該セッションの次ターンで一回の拡張リコールを実施——重複排除抑制をスキップ(圧縮が旧注入をコンテキストから追い出したため)、ペルソナを即時再注入、占有台帳をリセット。使用時に消費。既存の compact/clear 全量リセットはフォールバックとして保持し、両経路は冪等。
24
+ - **構造化トレース(§F、`trace.*`)**:リコールと蒸留のイベントを日次 JSONL に永続化(`<dataDir>/trace/`、既定保持 14 日、日次 5MB 上限で停止 + マーカー)。リコールイベントは query 指紋(既定は metadata-only:長さ + sha256、`trace.captureContent` で原文 ≤200 文字)、ヒット/注入 id、スコア、所要時間と 4 結果を記録。蒸留イベントは runId・6 値の決定集計(`l1_receipts` と同源で交差監査可能)・所要時間と成否。新エンドポイント `dsh-memory/trace-tail`、設定ページの「ログ」Tab に 3 データソース切替(システムログ / リコールトレース / 蒸留トレース)。
25
+
12
26
  ## [0.18.2] — 2026-09-27
13
27
 
14
28
  ### 修正
package/CHANGELOG.ko.md CHANGED
@@ -9,6 +9,20 @@
9
9
 
10
10
  이 파일은 **0.12.0** 릴리스 노트와 현재 **미출시** 변경 사항의 한국어판입니다. 전체 이력은 [CHANGELOG.md](./CHANGELOG.md)(中文)를 참조하세요.
11
11
 
12
+ ## [0.18.4] — 2026-09-28
13
+
14
+ ### 추가
15
+
16
+ - **크래시 복구(§A)**: 호스트가 턴 도중 크래시하면 해당 턴 대화는 메모리 버퍼와 함께 영구 유실되었습니다(resume 시 콜드스타트 보호가 전체 이력을 폐기). 이제 resume 시 호스트의 영속 이벤트 로그와 대조합니다: L0 기록 최대 turn을 워터마크로, 그 이후의 완전한 턴을 최대 2개까지 보수(크래시 고아 턴은 호스트가 `turn/end{reason:'interrupted'}`로 닫습니다 — 실기에서 98건 확인). 멱등성 = 워터마크 + 턴 단위 존재 검사. 호스트 읽기 서비스를 사용할 수 없으면 단계적 축소(`sessionQuery.readSession` → `sessionPersistence.readFrom` → 기존 동작 + 일회성 안내), 항상 fail-open으로 세션 시작을 막지 않습니다.
17
+ - **페이로드 마스킹(§C, `capture.redactSecrets`, 기본 활성)**: 캡처 쓰기 경계에서 8종의 시크릿(PEM 개인키 / Authorization 헤더 / Bearer·JWT / Cookie / 벤더 API 키 형태 / 이메일 / 9자리 이상 숫자(날짜 제외) / 고엔트로피 ID)을 `[REDACTED:<KIND>]` 타입 플레이스홀더로 치환 — L0 JSONL·L0 SQLite·증류 입력·수동 `memory_add`/`memory_import`를 단일 지점에서 커버. 안전값(`example` / `$VAR` / `${{…}}` 등)은 제외. 플레이스홀더는 카테고리 의미를 유지해 검색 가능. 주의: 활성화 후 L0 원문은 변경됩니다(재구축으로도 원문 복원 불가). `false`로 평문 복귀.
18
+ - **증류 프롬프트 내성 주입(§B)**: 6개 증류 프롬프트 파일(L1 추출 ×3 / L1 중복제거 ×3 / L2 씬 ×2 / L3 페르소나 ×2 / 그래프 투영 / 대조기) 모두에 "콘텐츠 경계(내성 주입)" 선언과 데이터 슬롯 경계를 추가 — 대화 원문·기존 기억 풀·씬 전문 등 임베디드 콘텐츠는 데이터이지 지시가 아닙니다. 판정 어휘와 출력 계약은 불변.
19
+
20
+ ### 개선
21
+
22
+ - **주입 확인(§D)**: 리콜 주입은 반환 즉시 마크하지 않습니다. "pending → 로그 수신" 2단 방식 — 호스트가 주입 메시지를 실제로 세션 로그에 기록했을 때(`plugin:memory` 서명과 안정 id를 가진 `user/message`) `dedupe.mark` 합니다. 덮어쓰기·취소된 주입은 더 이상 기억을 오억제하지 않고(다음 턴 재주입 가능), 5분 수신 없으면 일반 마크로 축소(확인 경로 장애로 인한 중복제거 무효화 방지), 미확인 만료는 폐기.
23
+ - **압축 후 정밀 재주입(§E)**: `compaction/end`(error 없음) 후 해당 세션의 다음 턴에 한 번의 확장 리콜 실행 — 중복제거 억제를 건너뛰고(압축이 기존 주입을 컨텍스트에서 축출), 페르소나 즉시 재주입, 점유 원장 리셋. 사용 시 소비. 기존 compact/clear 전량 리셋은 폴백으로 유지되며 양 경로는 멱등.
24
+ - **구조화 트레이스(§F, `trace.*`)**: 리콜과 증류 이벤트를 일별 JSONL로 영속화(`<dataDir>/trace/`, 기본 보존 14일, 일별 5MB 상한에서 정지 + 마커). 리콜 이벤트는 query 지문(기본 metadata-only: 길이 + sha256, `trace.captureContent` 시 원문 ≤200자), 히트/주입 id, 스코어, 소요시간과 4가지 결과를 기록. 증류 이벤트는 runId·6값 결정 집계(`l1_receipts`와 동원으로 교차 감사 가능)·소요시간과 성패. 신규 엔드포인트 `dsh-memory/trace-tail`, 설정 페이지 "로그" 탭에 3개 데이터 소스 전환(시스템 로그 / 리콜 트레이스 / 증류 트레이스).
25
+
12
26
  ## [0.18.2] — 2026-09-27
13
27
 
14
28
  ### 수정
package/CHANGELOG.md CHANGED
@@ -6,6 +6,48 @@
6
6
  > **UI 截图约定**:带界面变化的条目在 `assets/changelog/<版本号>/<两位编号>-<简述>.png`
7
7
  > 存真机截图,并在条目内以相对路径引用,读者可在更新日志里直接看到新版本 UI 的样子。
8
8
 
9
+ ## [0.18.5] — 2026-10-03(0.2.0 Hall·Room 功能下放)
10
+
11
+ ### 新增(自 0.2.0-beta.4–beta.25 下放;对应 main 6037ebc..847c3f7 链)
12
+
13
+ - **Hall·Room 分类管理**:两级制 Room slug(`major` / `major/minor`)注册表 sidecar
14
+ (`rooms-registry.json`,损坏只读降级)、`memory_room_admin` 工具与
15
+ `room-admin`/`room-register`/`rooms-export`(rooms|orphans|records) RPC 面、
16
+ merge/rename/retire/update 破坏性面(预览→备份→游标重写,含已退场行)、
17
+ 自生长 Room 一步收编(source=grown)、未注册 slug 退场自动补 retired 条目。
18
+ - **面板**:Hall 管理标签页(指针自制拖拽归类、全局 sticky 操作栏、子 room 仅显示 active)、
19
+ Room 独立标签页(存在/名称/条目管理、退场筛选 chips)、记忆页孤儿筛选与
20
+ 「导出孤儿」回迁。
21
+ - **标注器词表接入注册表**:候选标注与 tags 标注优先把记忆挂到注册表 Room。
22
+ - **老化权重展示 + 召回使用统计**:`agingWeightOf` 半衰期权重、卡片「老化 N%」chip、
23
+ `RecallUsageStore`(进 topN 才算 used;损坏只读降级)。
24
+ - **测试**:Hall·Room HTTP 面集成测试(25 用例)、rooms-registry/room-review/
25
+ room-merge/room-admin-endpoint/recall-usage 单测,endpoint 契约计数 43→46。
26
+ - **Hall/Room 名称搜索过滤 + Hall 分组默认折叠**(0.20.0-beta.26 同步):
27
+ Hall 页搜索框(slug/显示名/别名,匹配组自动展开)、hall 头折叠默认收起 +
28
+ 展开全部/收起全部 + localStorage 记忆;Room 页同款搜索框与退场筛选叠加。
29
+
30
+ ### 适配差异(相对 0.2.0 线)
31
+
32
+ - 不含 longtask 全族(main 上已净零)、ADR-0015 repo 软围栏/治理权重/场景重聚类
33
+ 队列(0.2.0 线专属);merge/rename 的「场景重算入队」随之省略(备份/重写/收别名
34
+ 语义不变)。
35
+ - `agent/session-start` 仍并入 `agent/created`(0.1.7-rc.2 宿主适配保留)。
36
+
37
+ ## [0.18.4] — 2026-09-28
38
+
39
+ ### 新增
40
+
41
+ - **崩溃恢复(§A)**:宿主在轮次中途崩溃时,该轮对话此前会随内存缓冲永久丢失(resume 的冷启动地板丢弃全部历史)。现在 resume 时从宿主持久化事件日志对账:以 L0 已落盘的最大 turn 为水位线,补收其后的完整轮次(上限 2 轮;崩溃孤儿轮由宿主补写 `turn/end{reason:'interrupted'}` 闭合,本机实测 98 处)。幂等 = 水位线 + 逐轮存在性检查;宿主读日志服务不可用时逐级降级(`sessionQuery.readSession` → `sessionPersistence.readFrom` → 维持现状 + 一次性提示),全程 fail-open 不阻塞会话启动。
42
+ - **载荷脱敏(§C,`capture.redactSecrets`,默认开启)**:捕获写入边界把 8 类密钥(PEM 私钥 / Authorization 头 / Bearer 与 JWT / Cookie / 厂商 API key 形态 / 邮箱 / ≥9 位长号(排除日期)/ 高熵 ID)替换为 `[REDACTED:<KIND>]` 类型化占位符——单点覆盖 L0 JSONL、L0 SQLite、蒸馏输入与手动 `memory_add`/`memory_import`(两条 L1 写入边界同词表)。安全值(`example` / `$VAR` / `${{…}}` 等)不脱;占位符保留类别语义、可被检索命中。注意:开启后 L0 原文自此改变(重建不可得原文),`false` 一键回明文。
43
+ - **蒸馏提示词防注入(§B)**:六处蒸馏 prompt(L1 抽取 ×3 / L1 去重 ×3 / L2 场景 ×2 / L3 画像 ×2 / 图谱投影 / 核对器)全部加入"内容边界(防注入)"总声明与数据插槽界定——对话原文、既有记忆池、场景全文等嵌入内容一律是数据不是指令,防止对话携带的指令性文字劫持蒸馏、去重与裁决。判定词表与输出契约零变化。
44
+
45
+ ### 改进
46
+
47
+ - **注入确认(§D)**:召回注入不再在返回瞬间标记去重,改为"pending → 日志回执"两段式——宿主把注入消息真实写入会话日志(`user/message` 带 `plugin:memory` 署名与稳定 id)时才 `dedupe.mark`。被覆盖/取消的注入不再误压制记忆(下轮可重注);5 分钟未回执降级为照常标记(防确认链路故障导致去重失效),未确认即弃。
48
+ - **压缩精确再注入(§E)**:`compaction/end`(无 error)后,该会话下一轮做一次定向增强召回——跳过去重压制(压缩已把旧注入逐出上下文)、画像立即重注入、占用账本归零;消费即清。原有 compact/clear 会话级全量重置保留为回退路径,双路径幂等。
49
+ - **结构化追踪(§F,`trace.*`)**:召回与蒸馏事件按天 JSONL 落盘(`<dataDir>/trace/`,保留期默认 14 天,单日 5MB 停写 + marker)。召回事件含 query 指纹(默认 metadata-only:长度 + sha256,`trace.captureContent` 才存原文 ≤200 字符)、命中/注入 id、分数、耗时与四种结局(injected/suppressed/timeout/off);蒸馏事件含 runId、六值决策聚合(与 `l1_receipts` 同源可交叉审计)、耗时与成败。新增 `dsh-memory/trace-tail` 端点;设置页"日志"Tab 新增 系统日志 / 召回追踪 / 蒸馏追踪 三数据源切换。
50
+
9
51
  ## [0.18.2] — 2026-09-27
10
52
 
11
53
  ### 修复
package/README.en.md CHANGED
@@ -283,6 +283,10 @@ the bundle layer appends and causes `duplicate loader entry id` startup failure)
283
283
  | `capture.enabled` | `true` | L0 capture |
284
284
  | `capture.stripCodeBlocks` | `true` | Strip code blocks from assistant messages |
285
285
  | `capture.maxMessageChars` | `4000` | Max characters per message |
286
+ | `capture.redactSecrets` | `true` | Payload redaction: 8 secret classes (PEM/Bearer/JWT/Cookie/vendor API keys/emails/long numbers/high-entropy IDs) become `[REDACTED:<KIND>]` placeholders at capture time — covers L0, distill input and manual writes; `false` restores plaintext (irreversible once enabled) |
287
+ | `trace.enabled` | `true` | Structured trace: recall/distill events as daily JSONL under `<dataDir>/trace/`; switch sources in the Log tab |
288
+ | `trace.retentionDays` | `14` | Trace retention in days (`0` = forever) |
289
+ | `trace.captureContent` | `false` | `true` stores recall query text (default: length + sha256 only) |
286
290
  | `extract.enabled` | `true` | L1 extraction |
287
291
  | `extract.minMessages` | `6` | Steady-state trigger threshold: run L1 extraction once a session accumulates N new messages. The effective threshold ramps up 1→2→4→…→N (first turn yields memories immediately, then batches to save calls) |
288
292
  | `extract.idleSeconds` | `300` | Idle flush: distill a session's pending slice after N seconds of silence (catches "user left before reaching the threshold"); `0` disables |
package/README.ja.md CHANGED
@@ -227,6 +227,10 @@ node bench/harness/retrieval-metrics.mjs <runDir> --flood 200,600
227
227
  | `capture.enabled` | `true` | L0 捕捉 |
228
228
  | `capture.stripCodeBlocks` | `true` | アシスタントメッセージからコードブロックを除去 |
229
229
  | `capture.maxMessageChars` | `4000` | 単メッセージ最大文字数 |
230
+ | `capture.redactSecrets` | `true` | ペイロード赤字化:捕获書き込み時に 8 種の秘密(PEM/Bearer/JWT/Cookie/ベンダー API キー/メール/長数字/高エントロピー ID)を `[REDACTED:<KIND>]` に置換——L0・蒸留入力・手動書き込みをカバー。`false` で平文に戻す(有効化後は原文不可逆) |
231
+ | `trace.enabled` | `true` | 構造化トレース:リコール/蒸留イベントを日次 JSONL で保存(`<dataDir>/trace/`)、設定ページの「ログ」Tab で切替表示 |
232
+ | `trace.retentionDays` | `14` | トレース保持日数(`0` = 無期限) |
233
+ | `trace.captureContent` | `false` | `true` でリコール query 原文を保存(既定は長さ + sha256 のみ) |
230
234
  | `extract.enabled` | `true` | L1 抽出 |
231
235
  | `extract.minMessages` | `6` | 定常トリガ閾値:単セッションが N 件新メッセージを溜めて L1 抽出を1回実行。立ち上がりは 1→2→4→…→N と倍増 |
232
236
  | `extract.idleSeconds` | `300` | アイドル兜底:セッションが N 秒無言で未蒸留スライスを落とす。`0` で無効 |
package/README.ko.md CHANGED
@@ -227,6 +227,10 @@ node bench/harness/retrieval-metrics.mjs <runDir> --flood 200,600
227
227
  | `capture.enabled` | `true` | L0 포착 |
228
228
  | `capture.stripCodeBlocks` | `true` | 어시스턴트 메시지에서 코드 블록 제거 |
229
229
  | `capture.maxMessageChars` | `4000` | 단메시지 최대 문자 수 |
230
+ | `capture.redactSecrets` | `true` | 페이로드 마스킹:캡처 쓰기 시 8종 시크릿(PEM/Bearer/JWT/Cookie/벤더 API 키/이메일/긴 숫자/고엔트로피 ID)을 `[REDACTED:<KIND>]`로 치환 — L0·증류 입력·수동 쓰기 커버. `false`로 평문 복귀(활성화 후 원문 비가역) |
231
+ | `trace.enabled` | `true` | 구조화 트레이스:리콜/증류 이벤트를 일별 JSONL로 저장(`<dataDir>/trace/`), 설정 페이지 "로그" 탭에서 전환 조회 |
232
+ | `trace.retentionDays` | `14` | 트레이스 보존 일수(`0` = 무기한) |
233
+ | `trace.captureContent` | `false` | `true` 시 리콜 query 원문 저장(기본은 길이 + sha256만) |
230
234
  | `extract.enabled` | `true` | L1 추출 |
231
235
  | `extract.minMessages` | `6` | 정상 트리거 임계값:단세션이 N건 새 메시지 누적 시 L1 추출 1회. 시작 단계는 1→2→4→…→N 배증 |
232
236
  | `extract.idleSeconds` | `300` | 유휴兜底:세션이 N초 무음이면 미증류 슬라이스 투하. `0` 비활성 |
package/README.md CHANGED
@@ -295,6 +295,10 @@ ONNX 量化 **CPU 推理**——无需 API Key,数据不出本机)。本地
295
295
  | `capture.enabled` | `true` | L0 捕获 |
296
296
  | `capture.stripCodeBlocks` | `true` | 助手消息剥离代码块 |
297
297
  | `capture.maxMessageChars` | `4000` | 单条消息最大字符数 |
298
+ | `capture.redactSecrets` | `true` | 载荷脱敏:捕获写入即把 8 类密钥(PEM/Bearer/JWT/Cookie/厂商 API key/邮箱/长号/高熵 ID)替换为 `[REDACTED:<KIND>]` 占位符,覆盖 L0、蒸馏输入与手动写入;`false` 回明文(开启后 L0 原文不再可逆) |
299
+ | `trace.enabled` | `true` | 结构化追踪:召回/蒸馏事件按天 JSONL(`<dataDir>/trace/`),设置页"日志"Tab 可切换查看 |
300
+ | `trace.retentionDays` | `14` | 追踪事件保留天数(`0` 永久) |
301
+ | `trace.captureContent` | `false` | `true` 才存召回 query 原文(默认只存长度 + sha256) |
298
302
  | `extract.enabled` | `true` | L1 抽取 |
299
303
  | `extract.minMessages` | `6` | 稳态触发阈值:单会话攒够 N 条新消息跑一次 L1 抽取。起步阶段生效阈值从 1 翻倍爬坡到此值(首轮即出记忆,随后自动攒批省调用) |
300
304
  | `extract.idleSeconds` | `300` | 闲置兜底:会话静默 N 秒后把未蒸馏切片落袋(接住"没攒够阈值用户就离开");`0` 关闭 |
package/cordis.patch.yml CHANGED
@@ -11,6 +11,12 @@
11
11
  # config: # 全部字段有默认值,按需覆盖:
12
12
  # family: auto # 新会话默认档:auto | chat | work
13
13
  # dataDir: '' # 默认 $DSH_HOME/memory
14
+ # capture:
15
+ # redactSecrets: true # §C 脱敏:8 类密钥→[REDACTED:KIND] 占位符(false 回明文)
16
+ # trace:
17
+ # enabled: true # §F 追踪:recall/distill 事件按天 JSONL
18
+ # retentionDays: 14 # 事件保留天数(0 = 永久)
19
+ # captureContent: false # true 才存 query 原文(默认只存 chars+sha)
14
20
  # llm:
15
21
  # provider: '' # 蒸馏模型路由(默认跟随当前默认模型)
16
22
  # model: ''