dsh-memu-memory 1.2.0 → 1.2.1

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.md CHANGED
@@ -23,14 +23,14 @@
23
23
 
24
24
  ---
25
25
 
26
- `dsh-memu-memory` is built for long-form RP and companion chats. It gives a DSH conversation a memory that behaves like memory instead of a log: three retention layers that fade, a first-turn anchor plus at most one per-turn recall, provenance that cannot be quietly upgraded from "I inferred it" to "they said it", contradictions that wait for a decision instead of both being read as true, and an optional relationship graph with evidence. Speakers, characters, worlds and story branches form hard boundaries, and what a character is allowed to know stays separate from what actually happened.
26
+ `dsh-memu-memory` is built for long-form RP and companion chats. It gives a DSH conversation a memory that behaves like memory instead of a log: three retention layers that fade, a first-turn anchor plus at most one per-turn recall, provenance that cannot be quietly upgraded from "I inferred it" to "they said it", contradictions that wait for a decision instead of both being read as true, near-identical facts collapse to one entry and one recall seat, and an optional relationship graph with evidence. Speakers, characters, worlds and story branches form hard boundaries, and what a character is allowed to know stays separate from what actually happened.
27
27
 
28
28
  It is **local-first by default**. The default `agent` backend stores full text in JSON indexes and recalls lexically — no Python, no embedding service, no API key. The `api` backend switches recall to the optional, pinned MemU engine (vector search). MemU is a plugin for people who want it, not a requirement for the plugin to start.
29
29
 
30
30
  > [!WARNING]
31
31
  > **Early-stage software.** This plugin is still early and may contain unforeseen errors, bugs or breaking changes. Back up your data, and please [report an issue](https://github.com/Tkingxiao/dsh-memu-memory/issues) or send a pull request — feedback helps the project improve.
32
32
 
33
- > **Status:** 1.1.2. The first public release was 1.0.0. The manual now lives in [`docs/`](docs/), with [`AGENTS.md`](AGENTS.md) as a short index. Back up `~/.dsh/dsh-memu-memory` before upgrades, and read [Compatibility & limits](#compatibility--limits) before storing data you cannot re-create.
33
+ > **Status:** 1.2.1. The first public release was 1.0.0. The manual now lives in [`docs/`](docs/), with [`AGENTS.md`](AGENTS.md) as a short index. Back up `~/.dsh/dsh-memu-memory` before upgrades, and read [Compatibility & limits](#compatibility--limits) before storing data you cannot re-create.
34
34
 
35
35
  ## Screenshots
36
36
 
@@ -99,6 +99,8 @@ For scale, the whole 4-hour session tree measured here consumed 132M input and 1
99
99
 
100
100
  The sidebar has exactly **one** entry: **MemU WebUI**. The memory wall and all settings live in the same navigation, with deep links such as `#/settings/memories`, `#/settings/folders` and `#/settings/stats`. The interface follows the browser locale (Chinese or English).
101
101
 
102
+ **Private / global groups with multi-select.** The "Memories" page splits into **Private** and **Global** blocks (private first, default). The private block supports **multi-select**: bulk archive, restore and permanent delete (two-step confirm) — one failed row never eats the rest. Every row on the Global memory page has a "View" action that jumps straight to that entry on the wall.
103
+
102
104
  **In-place work.** Clicking a memory card opens a right-side drawer with the full text and the fields that decide how it behaves — title, content, tags, disclosure, confidence, open loop — plus save, archive, restore and "open in the browser" for heavier work. Archived memories can be deleted in the same drawer; the first click only arms it and the second confirms. Global memories are read-only in the drawer and link to their own page. Filters and scroll position stay where they were. Cards that carry images use the first usable attachment as a cover, and the drawer opens the full gallery; `secret` and `never_say` entries never receive a pixel URL, so they show a label instead.
103
105
 
104
106
  **Graph and list together.** The **Relations** tab renders the graph canvas and the adjacency list side by side (stacked on narrow screens), with the focus selector above them and link/entity/relationship tools below. There is no mode switch to forget.
@@ -107,13 +109,13 @@ The locally bundled D3 force layout preserves positions and the camera across ba
107
109
 
108
110
  | Page | What it is for |
109
111
  |---|---|
110
- | Memories | Cross-library wall, source/status/library/preview, in-place drawer, Relations tab |
112
+ | Memories | Private/global grouped wall, source/status/library/preview, in-place drawer, multi-select bulk ops, Relations tab |
111
113
  | Engine & connection | Optional MemU engine install/switch, embedding endpoint, backups and restore |
112
114
  | Memory settings | Injection mode, token budgets, topK, relevance threshold, retention, automation |
113
115
  | Folders | Folder-level private/global ceiling, expandable conversations and their own switches |
114
116
  | Libraries | Create, rename, archive, restore, explicitly delete libraries |
115
117
  | Memory browser | Full-text editing, attachments, review queue, graph and bounded canvas, JSON/ZIP import/export |
116
- | Global memory | Domain-scoped global memories, evidence, review queue and the separate curator |
118
+ | Global memory | Domain-scoped global memories, evidence, review queue and the separate curator; every row can jump to the wall |
117
119
  | Prompts | General / RP / Coding / Mixed variants, overrides and per-key reset; new conversations start on RP and can pick a domain in the first-run prompt |
118
120
  | Stats | Daily activity, hit distribution, health, never-recalled shortlist, 7-day write/read ratio |
119
121
 
@@ -349,6 +351,8 @@ The suite includes one real-engine integration case that is skipped unless `DSH_
349
351
 
350
352
  ## Changelog
351
353
 
354
+ **1.2.1 (2026-10-31)**: fact-level dedup (write-side gate + recall-side cluster folding); consolidation now works in PTC (run_code) sessions; sidebar consolidation-failure alerts (cross-session, clearable, jump-to-library); the "currently in vector store" count follows real additions and deletions; private/global groups and multi-select bulk ops on the memory wall; one-click view from the global page; graph delete cascades with orphan-entity cleanup; remote consolidation counts only what actually landed.
355
+
352
356
  **1.1.3 (2026-10-30)**: managed local vectors are usable end to end (runtime/model download, switch-and-rebuild, progress with per-item failures); activity log with a Logs page; consolidation results move under the sidebar button; archive/restore and list refresh drop from seconds to milliseconds; a date written in the text is picked up when the field is empty; default topK 5/5; fixes the blank settings/WebUI panel (React #310).
353
357
 
354
358
  **1.1.2 (2026-10-29)**: anchor and recall delivery in agent-preset conversations; startup catch-up consolidation; panel TDZ crash fix.
package/README.zh.md CHANGED
@@ -23,14 +23,14 @@
23
23
 
24
24
  ---
25
25
 
26
- `dsh-memu-memory` 面向长篇 RP 与陪伴对话,给 DSH 一份「像记忆」的记忆,而不是一本日志:三种留存层会淡;首轮有锚点,之后每个用户回合最多召回一次;来源不能被悄悄从「我推断」升级成「对方说过」;互相矛盾的记忆会挂起等待裁决,而不是两条都被当成真的;关系可以是一条带证据的边。说话人、角色、世界线与剧情分支构成硬边界,角色「知道什么」与实际发生过什么分开保存。
26
+ `dsh-memu-memory` 面向长篇 RP 与陪伴对话,给 DSH 一份「像记忆」的记忆,而不是一本日志:三种留存层会淡;首轮有锚点,之后每个用户回合最多召回一次;来源不能被悄悄从「我推断」升级成「对方说过」;互相矛盾的记忆会挂起等待裁决,而不是两条都被当成真的;几乎相同的事实只入一条、召回时同簇只占一席;关系可以是一条带证据的边。说话人、角色、世界线与剧情分支构成硬边界,角色「知道什么」与实际发生过什么分开保存。
27
27
 
28
28
  默认**本地优先**。`agent` 后端把完整正文放在 JSON 索引里、用词法检索——不需要 Python、embedding 服务或 API key。`api` 后端才把检索交给可选的、锁定版本的 MemU 引擎(向量)。MemU 是「想要就用」的后端,不是插件能否启动的前提。
29
29
 
30
30
  > [!WARNING]
31
31
  > **早期版本提示。** 本插件仍处于早期阶段,可能存在无法预见的错误、bug 或不兼容变更。请先备份数据;欢迎[提交 Issue](https://github.com/Tkingxiao/dsh-memu-memory/issues) 或 PR 帮助改进。
32
32
 
33
- > **状态:** 1.1.0。首个公开发布版本为 1.0.0。细节文档已迁到 [`docs/`](docs/),[`AGENTS.md`](AGENTS.md) 只做索引。升级前请备份 `~/.dsh/dsh-memu-memory`;如果要存无法重建的数据,请先读[兼容性与边界](#兼容性与边界)。
33
+ > **状态:** 1.2.1。首个公开发布版本为 1.0.0。细节文档已迁到 [`docs/`](docs/),[`AGENTS.md`](AGENTS.md) 只做索引。升级前请备份 `~/.dsh/dsh-memu-memory`;如果要存无法重建的数据,请先读[兼容性与边界](#兼容性与边界)。
34
34
 
35
35
  ## 界面
36
36
 
@@ -99,21 +99,23 @@
99
99
 
100
100
  侧边栏只留**一个**入口:**MemU WebUI**。记忆墙与全部设置在同一套导航内,支持深链,如 `#/settings/memories`、`#/settings/folders`、`#/settings/stats`。
101
101
 
102
+ **私有 / 全局分组与多选。** 「MemU 记忆」页按 **私有 / 全局** 分块(默认私有),私有块支持**多选**:批量归档、恢复、彻底删除(两段确认),一条失败不影响其余成果。「全局记忆」页每条记忆带「查看此记忆」,点击直达 MemU 记忆页对应条目。
103
+
102
104
  **原地操作。** 点记忆卡片会从右侧滑出详情抽屉:完整正文,以及决定它行为的字段——标题、正文、标签、说出口径、置信度、未了之事——外加保存、归档、恢复,以及需要重编辑时的「在记忆浏览中打开」。已归档的记忆可以直接在抽屉里删除:第一次点击只是准备,第二次才真正删除。全局记忆在抽屉里只读,并给出跳转。筛选条件与滚动位置保持不动。带图片的卡片会把第一张可用附件作为封面,抽屉里展开完整图片组;`secret` 与 `never_say` 条目不会拿到像素 URL,只显示标签占位。
103
105
 
104
106
  **关系图与邻接列表一起看。** 「关系」页签把关系画布与邻接列表并排显示(窄屏上下堆叠),焦点选择在上方,建边/实体/关系状态工具在下方;没有需要记得切换的模式。
105
107
 
106
- 图谱使用本地打包的 D3 力导向布局,后台数据刷新保留节点位置与视角。支持拖拽节点、空白处平移、滚轮/双指缩放、适应全图与关联高亮;标签自动避让,设置中可调整斥力、连线距离,以及关闭标签或动态布局。图谱布局只表达已记录的关联,不会推断或写入新的关系。
108
+ 图谱使用本地打包的 D3 力导向布局,后台数据刷新保留节点位置与视角。支持拖拽节点、空白处平移、滚轮/双指缩放、适应全图与关联高亮;标签自动避让,设置中可调整斥力、连线距离,以及关闭标签或动态布局。图谱布局只表达已记录的关联,不会推断或写入新的关系。实体可以直接在图谱里删除(仍被引用时会明确拒绝);永久删除一条记忆会连带清理指向它的边与孤立实体,孤立节点有启动扫描自动回收。
107
109
 
108
110
  | 页面 | 用途 |
109
111
  |---|---|
110
- | MemU 记忆 | 跨库记忆墙、来源/状态/库名/预览、原地详情、关系统一视图 |
112
+ | MemU 记忆 | 私有/全局分组记忆墙、来源/状态/库名/预览、原地详情、多选批量操作、关系统一视图 |
111
113
  | 引擎与连接 | 可选 MemU 引擎的安装与切换、embedding 配置、备份恢复 |
112
114
  | 记忆设置 | 注入模式、token 预算、topK、相关度下限、留存与自动化 |
113
115
  | 文件夹 | 文件夹级私有/全局上限,展开对话修改各自选择 |
114
116
  | 记忆库 | 新建、改名、归档、恢复、显式删除 |
115
117
  | 记忆浏览 | 全文编辑、附件、复核池、有界图谱、JSON/ZIP 导入导出 |
116
- | 全局记忆 | 分域全局记忆、证据、复核队列与独立 curator |
118
+ | 全局记忆 | 分域全局记忆、证据、复核队列与独立 curator,每条可跳转到记忆墙查看 |
117
119
  | 提示词 | 通用 / RP / Coding / Mixed 变体,覆盖与单项恢复;新会话默认 RP,并可在首次弹窗里直接选领域 |
118
120
  | 统计 | 每日活跃、命中分布、库健康度、最久没被想起的 5 条、7 天写读比 |
119
121
 
@@ -340,6 +342,8 @@ node --import ./tests/loader-register.mjs scripts/preview.mjs --port 7789
340
342
 
341
343
  ## 更新日志
342
344
 
345
+ **1.2.1(2026-10-31)**:事实级去重(写入近似门 + 召回按簇折叠);PTC(run_code)会话整理可用;侧边栏整理失败提醒(跨会话、可清除、可跳转);「当前已入向量库」计数跟随真实增减;记忆墙私有/全局分组与多选批量操作;全局记忆一键查看;关系图删除级联与孤儿回收;整理写入计数说真话。
346
+
343
347
  **1.1.3(2026-10-30)**:受管本地向量可用(运行时/模型下载、切换重建、进度与失败明细);活动日志与「日志」页;整理结果落到侧边栏按钮下方;归档/还原与列表刷新提速到毫秒级;日期漏填时从正文兜底;默认 topK 5/5;修复设置/WebUI 白屏。
344
348
 
345
349
  **1.1.2(2026-10-29)**:人格预设会话的锚点与召回送达;启动补扫空闲整理;面板 TDZ 崩溃修复。
@@ -75,9 +75,9 @@ npm run check # node --check + i18n 键对齐 + package.j
75
75
 
76
76
  ### 5.3 新增一个 RPC 方法
77
77
 
78
- <!-- rpc-method-count: 83 -->
78
+ <!-- rpc-method-count: 86 -->
79
79
 
80
- 1. `lib/rpc.js` 的 `switch` 加 case(共 83 个方法,按功能分组,别乱插)。
80
+ 1. `lib/rpc.js` 的 `switch` 加 case(共 86 个方法,按功能分组,别乱插)。
81
81
  2. 返回**形状稳定**:客户端 `call()` 直接解构,列表类给 `{items, total}` 而不是裸数组。
82
82
  3. `revisionOnly` 分支只回 `{revision, stamp}`、**不要求 sessionId**(三端轮询,设置页与独立页没会话)、**不塞业务数据**(每 2.5 秒一次);顺带 `noteMemoryBeat()`,`memu_status` 靠它分「没写」与「没人轮询」。
83
83
  4. 写成功后 `bumpMemoryRevision()`/`notifyMemoryWrite()`(§7);能让 `state.json` 或索引落盘的写,`state.js` 自动记写事件供 `memu_status` 展示。
@@ -22,6 +22,14 @@ execFile(process.execPath, ["--check", "lib/x.js"], { cwd, env });
22
22
 
23
23
  **源码是 CRLF**:任何补丁都按「读 → `split("\r\n").join("\n")` → 断言 `from` 命中 **1 次** → 替换 → 写回还原 `\r\n`」。命中 0 或 >1 次先停下看,不要盲写。(`tests/webui.test.mjs` 是 LF,别套 CRLF。)
24
24
 
25
+ ### 9.1.1 链路回放巡检
26
+
27
+ ```bash
28
+ npm run replay
29
+ ```
30
+
31
+ `scripts/replay.mjs`:不走测试框架,按生产代码路径端到端重放七条链路(事实级去重工具层、PTC 整理成功/失败、整理提醒与日志页数据、侧边栏提醒块真实渲染、向量计数账本+戳、MemU 记忆页分组/多选/查看跳转)。只有 MemU 引擎子进程换成内存桩,其余全是真实模块;退出码 0 = 全部检查点通过。改动整理/去重/向量计数/提醒任一链路后跑一次,比单测更接近「用户点下去会发生什么」。
32
+
25
33
  ### 9.2 本地 link 到 DSH profile
26
34
 
27
35
  `~/.dsh/profiles/<profile>/package.json` 里 `"dsh-memu-memory": "link:D:/Code/dsh-plugin/dsh-memu-memory"` 并加入 `dsh.profile.bundles`。是符号链接 → 改源码即刻生效(无 bundle 缓存)。`lstat` 验证是否 symlink(§3.10)。
@@ -205,8 +205,9 @@ S8 展示回写 client.js 面板 + useMemoryBeat 心跳 + rpc.js allowed + tool
205
205
  - **新回合被评估为「不值得整理」。** `assessConsolidationValue` 只拒绝两种:`lastSleepSeq` 之后没有任何人类消息;或只有一条纯应答(「谢谢」「好的」「ok」,无工具调用)。其余都会进 fork,由整理提示词决定写不写——**写 0 条是合法结果**,不是故障。
206
206
  - **整理失败一直退避。** 看 binding 的 `lastSleepError` / `sleepRetryAt` / `sleepAttempts`。会话被删会得到 `session "…" not found`,现在会标 `sessionGone: true` 并停止重试(以前会每小时重来)。
207
207
  - **fork 失败被当成成功。** 旧版只等 `whenIdle()`;turn error 也会 resolve,于是 `lastSleepSeq` 被推进。现在 fork 必须继承父 `provider` / `model`(活跃会话取最近一轮 `requestHeader().config`,关闭会话取最后一条 `request/header` 的 `data.header.config`);没有路由就拒绝创建,报 `cannot inherit the parent model/provider`。`whenIdle` 后还要检查 `turn/end.data.reason.kind === 'completed'`,`error` / `aborted` / 没有 `turn/end` 都返回 `ok:false`,不推进游标,由 `runSleepPass` 记 `lastSleepError`、`sleepRetryAt`、`sleepAttempts` 退避重试。
208
+ - **PTC 会话(`run_code` 预设)曾被一刀切拒绝(2026-10-31 已修)。** 旧 probe 看到 header 工具表里没有 `memu_private_remember/update` 就判 `worker-tools-ptc-only` 不建 fork——但 PTC 模式下 header 本来就只有 `run_code`,其余工具走 run_code 程序里的 SDK 绑定,header 名单不承载"能不能写"。现在的口径:PTC 不构成否证(probe 返回 `source: 'ptc-header'`),fork 创建后把读写四件(`memu_private_remember/update/recall/list`)挂进 worker 自己的 agent ctx scope(注册表按 scope 链取可见面,只对这个一次性 worker 可见,整理结束即卸载);任务书写明 `await tools.memu_private_remember({...})` 的调用形态。宿主不暴露 agent ctx(记录上没有 `ctx.tools`)时挂载失败只 warn,worker 会按任务书如实回执 `tools-unavailable`,空闲扫描照常退避。证据看活动日志"整理已开始"行的 `detail.probe` 与 `detail.workerToolsAttached`。
208
209
 
209
- **守卫**:`tests/cycle.test.mjs`(空闲阈值、启动补偿、`sessionGone` 只标记一次、寒暄不 fork、失败 fork 必须退避)+ `tests/consolidation-value.test.mjs`(评估边界:插件通知不算人类消息、纯应答跳过、「我不吃香菜」这种五个字的偏好必须留下、`lastSleepSeq` 之后的尾巴才算)+ `tests/consolidation-fork.test.mjs`(继承父模型、失败 turn 不推进 `lastSleepSeq`)。手工核对:`state.json` 里 `lastSleepAt` / `lastSleepSeq` / `sessionGone` / `sleepAttempts` / `lastSleepError` / `sleepRetryAt` 六个字段。
210
+ **守卫**:`tests/cycle.test.mjs`(空闲阈值、启动补偿、`sessionGone` 只标记一次、寒暄不 fork、失败 fork 必须退避)+ `tests/consolidation-value.test.mjs`(评估边界:插件通知不算人类消息、纯应答跳过、「我不吃香菜」这种五个字的偏好必须留下、`lastSleepSeq` 之后的尾巴才算)+ `tests/consolidation-fork.test.mjs`(继承父模型、失败 turn 不推进 `lastSleepSeq`、PTC 会话照常 fork 且只挂读写四件、非 PTC 名单缺写工具仍然拒绝)。手工核对:`state.json` 里 `lastSleepAt` / `lastSleepSeq` / `sessionGone` / `sleepAttempts` / `lastSleepError` / `sleepRetryAt` 六个字段。
210
211
 
211
212
  ### 3.19 人格预设(agent preset)的会话里完全没有记忆(S1 绑定 → S4 注入)
212
213
 
@@ -281,7 +282,7 @@ S8 展示回写 client.js 面板 + useMemoryBeat 心跳 + rpc.js allowed + tool
281
282
 
282
283
  ### 2.1 模块地图
283
284
 
284
- <!-- rpc-method-count: 83 -->
285
+ <!-- rpc-method-count: 86 -->
285
286
 
286
287
  | 文件 | 职责 / 什么时候碰它 |
287
288
  |---|---|
@@ -295,7 +296,7 @@ S8 展示回写 client.js 面板 + useMemoryBeat 心跳 + rpc.js allowed + tool
295
296
  | `lib/private.js` | 私有整理:当前对话、历史 fork、notice 消息 |
296
297
  | `lib/curator.js` / `lib/cycle.js` | 全局 curator 与 `pending_review`;空闲整理 pass(过期/降级/晋升/自动整理) |
297
298
  | `lib/mood.js` / `lib/budget.js` / `lib/snippet.js` | 情绪价与峰值;token 换算(中文≈1 字符/token、英文≈3.4,任何 token 都走它);注入片段裁剪 |
298
- | `lib/rpc.js` / `lib/client.js` / `lib/webui.js` + `lib/webui/standalone.js` | `/dsh-memu-memory` 的 80 个方法(旧路由别名同一鉴权);九页设置 + 侧边栏 `MemoryTab` + `useMemoryBeat`;独立壳挂载同一 SettingsPage,不复制实现 |
299
+ | `lib/rpc.js` / `lib/client.js` / `lib/webui.js` + `lib/webui/standalone.js` | `/dsh-memu-memory` 的 86 个方法(旧路由别名同一鉴权);九页设置 + 侧边栏 `MemoryTab` + `useMemoryBeat`;独立壳挂载同一 SettingsPage,不复制实现 |
299
300
  | `lib/graph.js` / `lib/context.js` / `lib/media.js` | 关系边与实体;说话人/频道/角色/世界线/知情边界;附件采集、缩略图、受保护路由、ZIP |
300
301
  | `lib/prompts.js` + `lib/prompts/` | 提示词加载/覆盖/恢复/domain 变体解析 |
301
302
  | `lib/engine.js` / `lib/memu.js` / `lib/memu-config.js` | Python 引擎安装探测切换回滚;MemU CLI 适配(**所有 CLI 字符串只在这里**);`~/.memu/config.env` 的 embedding |
@@ -161,13 +161,30 @@ export function logStats() {
161
161
  return { total: entries.length, bytes, counts, file: activityFile(), capped: MAX_ENTRIES, maxBytes: MAX_FILE_BYTES }
162
162
  }
163
163
 
164
- /** 清空日志(显式操作;不是自动裁剪)。 */
165
- export function clearEvents() {
166
- cache = []
167
- try { rewrite([]) } catch (error) {
164
+ /**
165
+ * 清空日志。无参 = 全部清掉(显式操作,不是自动裁剪);带过滤 = 只删匹配行
166
+ * (整理失败提醒的"清除失败记录"用:{ kind: 'consolidate', ok: false })。
167
+ * 返回删除条数。永不抛错。
168
+ */
169
+ export function clearEvents(filter = null) {
170
+ const entries = load()
171
+ const matches = (entry) => {
172
+ if (!filter) return true
173
+ if (filter.kind && entry.kind !== filter.kind) return false
174
+ if (typeof filter.ok === 'boolean' && entry.ok !== filter.ok) return false
175
+ return true
176
+ }
177
+ const kept = filter ? entries.filter(entry => !matches(entry)) : []
178
+ let removed = entries.length - kept.length
179
+ try {
180
+ rewrite(kept)
181
+ cache = kept
182
+ } catch (error) {
183
+ // 落盘失败就不动缓存:文件是权威,下次读盘仍是原样,别让内存和磁盘各说各话。
184
+ removed = 0
168
185
  try { warn('activity log could not be cleared: ' + (error?.message || error)) } catch {}
169
186
  }
170
- return { ok: true }
187
+ return { ok: true, removed }
171
188
  }
172
189
 
173
190
  /** 导出为可直接贴进 issue 的 JSONL 文本。 */
@@ -54,7 +54,7 @@ export const RUNTIME_STATE = Object.freeze([
54
54
  { layer: 'temporary-map', file: 'lib/inbound.js:13', name: 'calls', keyedBy: 'sessionId', clearedBy: 'tool/result or turn/end' },
55
55
  { layer: 'temporary-map', file: 'lib/inbound.js:14', name: 'sessions', keyedBy: 'sessionId', clearedBy: 'session/disposed (releaseInboundSession)' },
56
56
  { layer: 'temporary-map', file: 'lib/media.js:19', name: 'captures', keyedBy: 'sessionId', clearedBy: 'capture settle' },
57
- { layer: 'temporary-map', file: 'lib/private.js:267', name: 'inFlight', keyedBy: 'sessionId', clearedBy: 'consolidation settle' },
57
+ { layer: 'temporary-map', file: 'lib/private.js:347', name: 'inFlight', keyedBy: 'sessionId', clearedBy: 'consolidation settle' },
58
58
  { layer: 'temporary-map', file: 'lib/curator.js:13', name: 'jobs', keyedBy: 'job id', clearedBy: 'curation settle' },
59
59
  { layer: 'cache', file: 'lib/state.js:967', name: 'indexCache', keyedBy: 'libraryId', clearedBy: 'next load / external write' },
60
60
  { layer: 'cache', file: 'lib/paths.js:52', name: 'readFailures', keyedBy: 'absolute file', clearedBy: 'a later successful read' },