memory-eternal 0.10.41 → 0.10.43

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "memory-eternal",
4
- "version": "0.10.41",
4
+ "version": "0.10.43",
5
5
  "description": "记忆核心(Memory Eternal):对话结束后自动沉淀知识卡到本地记忆库(~/.dsh/memory-vault),支持检索 / 召回 / 审核中心。",
6
6
  "author": {
7
7
  "name": "EternalNight996",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memory-eternal",
3
- "version": "0.10.41",
3
+ "version": "0.10.43",
4
4
  "description": "记忆核心(Memory Eternal):对话结束后自动沉淀知识卡到本地记忆库(~/.dsh/memory-vault),支持检索 / 召回 / 审核中心。",
5
5
  "author": {
6
6
  "name": "EternalNight996",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memory-eternal",
3
- "version": "0.10.41",
3
+ "version": "0.10.43",
4
4
  "description": "记忆核心(Memory Eternal):对话结束后自动沉淀知识卡到本地记忆库(~/.dsh/memory-vault),支持检索 / 召回 / 审核中心。",
5
5
  "author": {
6
6
  "name": "EternalNight996",
package/README.en.md CHANGED
@@ -361,14 +361,16 @@ curl http://127.0.0.1:7999/memory-eternal/api/web-info # is the standalone we
361
361
 
362
362
  | Version | Date | Highlights |
363
363
  |---|---|---|
364
- | **v0.10.41** | 2026-10-19 | **The knowledge graph initial view is zoomed out two steps**. The graph is canvas + sim.zoom with one wheel notch = x1.1, so "two steps" means x(1/1.1)^2 ≈ **0.826**: the initial fit() (first paint, after layout settles, and the Reset view button) now starts from the exact-fit scale and backs off those two notches, leaving room to drag and marquee-select around the edges; the wheel and the initial view **share the same ZOOM_STEP constant** so future step changes cannot drift apart; the existing clamps (0.35-1.8) stay, so a tiny graph is never shrunk out of sight. Adds tests/graph-initial-zoom.test.mjs (3 source guards, including the numeric factor). npm test now runs **392 checks** |
365
- | **v0.10.40** | 2026-10-19 | **Follow-up to #45 (release-blocking): an enumeration timeout is no longer treated as an empty port, plus the macOS traffic-light overlap (#46)**. ① The reporter measured Get-NetTCPConnection at **4.1s to 61.4s** on that machine (huge TCP table) while takeover allows only 2.5s, so it timed out, returned empty output, became null, was read as "port freed", and the new watchdog could not bind 7999 and drifted to 8001 — **the old web survived forever and the 0.10.38 fix could never run**. Fix: on Windows we now try **netstat -ano first** (1.8s there and it already reports the pid; 403ms on this machine, pid and command line included) with PowerShell only as a fallback; portFree became **tri-state** (free / occupied / **unknown**) where a timeout means unknown, which **aborts the takeover** with an explicit log instead of drifting; status separates "response timed out" from "no service"; probe paths no longer leak sockets. ② **#46**: the macOS window buttons are an Electron **native traffic light** (titleBarStyle:hiddenInset) that no z-index or portal can cover, so the plugin now **follows the host safe area** --dsh-frame-overlay-top (68px on macOS, 20px in native fullscreen), keeping the overlay top edge at 68px while the scrim still covers the screen, so the close button no longer sits on top of the plugin UI. npm test now runs **389 checks** |
364
+ | **v0.10.43** | 2026-10-19 | **UI experience, batch one: reading a card**. ① **Copy**: the reader gains "copy body" and "copy path", reusing the clipboard helper that has a manual fallback, with a "copied" confirmation for 1.5s (no more silent clicks); ② **Reading progress**: a 2px bar under the header advances as the body scrolls, and short cards read 100% immediately; ③ **j/k paging**: j goes to the next card and k to the previous one (following the current sorted list), while the arrow keys still scroll the body and typing in an input never triggers paging; ④ **Reading width**: narrow/medium/wide (720/900/1180px) cycling with the preference remembered; ⑤ keeps the 0.10.42 header fix. Adds tests/card-reader-ux.test.mjs (4 guards). npm test now runs **399 checks** |
365
+ | **v0.10.42** | 2026-10-19 | **Card headers no longer get squeezed by long titles (from user screenshots)**. The old layout used space-between while h3 had no min-width:0 (so a long title could not shrink) and the action group had no flex:0 0 auto / nowrap, so the buttons were squashed into vertical stacks ("collapse", "close"). Now h3 shrinks and **ellipsizes on one line** (hover shows the full title), the action group is flex:0 0 auto + nowrap (never squashed), and the header may wrap (on very narrow widths the whole group drops to a second row and stays clickable); both multi-button headers (reader and export graph) share the .me-head-actions class. Adds tests/card-head-actions.test.mjs (3 guards). npm test now runs **395 checks** |
366
366
 
367
367
  <details>
368
- <summary>Older release notes (v0.10.39 and earlier · 66 releases, click to expand)</summary>
368
+ <summary>Older release notes (v0.10.41 and earlier · 68 releases, click to expand)</summary>
369
369
 
370
370
  | Version | Date | Highlights |
371
371
  |---|---|---|
372
+ | **v0.10.41** | 2026-10-19 | **The knowledge graph initial view is zoomed out two steps**. The graph is canvas + sim.zoom with one wheel notch = x1.1, so "two steps" means x(1/1.1)^2 ≈ **0.826**: the initial fit() (first paint, after layout settles, and the Reset view button) now starts from the exact-fit scale and backs off those two notches, leaving room to drag and marquee-select around the edges; the wheel and the initial view **share the same ZOOM_STEP constant** so future step changes cannot drift apart; the existing clamps (0.35-1.8) stay, so a tiny graph is never shrunk out of sight. Adds tests/graph-initial-zoom.test.mjs (3 source guards, including the numeric factor). npm test now runs **392 checks** |
373
+ | **v0.10.40** | 2026-10-19 | **Follow-up to #45 (release-blocking): an enumeration timeout is no longer treated as an empty port, plus the macOS traffic-light overlap (#46)**. ① The reporter measured Get-NetTCPConnection at **4.1s to 61.4s** on that machine (huge TCP table) while takeover allows only 2.5s, so it timed out, returned empty output, became null, was read as "port freed", and the new watchdog could not bind 7999 and drifted to 8001 — **the old web survived forever and the 0.10.38 fix could never run**. Fix: on Windows we now try **netstat -ano first** (1.8s there and it already reports the pid; 403ms on this machine, pid and command line included) with PowerShell only as a fallback; portFree became **tri-state** (free / occupied / **unknown**) where a timeout means unknown, which **aborts the takeover** with an explicit log instead of drifting; status separates "response timed out" from "no service"; probe paths no longer leak sockets. ② **#46**: the macOS window buttons are an Electron **native traffic light** (titleBarStyle:hiddenInset) that no z-index or portal can cover, so the plugin now **follows the host safe area** --dsh-frame-overlay-top (68px on macOS, 20px in native fullscreen), keeping the overlay top edge at 68px while the scrim still covers the screen, so the close button no longer sits on top of the plugin UI. npm test now runs **389 checks** |
372
374
  | **v0.10.39** | 2026-10-17 | **Wiring self-healing: codex TOML parsed per section, single quotes and escaping supported, plus a read-only startup check (items ②/④ of #44)**. ① Fixed a real bug: setup / align parsed ~/.codex/config.toml **without scoping to [mcp_servers.memory]**, so they picked up the first command = of another server (on this machine it read MCP_DOCKER docker.exe), and only double quotes were understood while codex itself writes single quotes — so the entry was **neither readable nor fixable, yet setup still printed "updated"**. Reading and writing now share pure helpers (section scoping, both quote styles, unescaping), the writer verifies the text really changed, is idempotent (already-aligned entries are not counted as changes) and honestly reports section unparseable when it cannot edit. ② A new read-only startup check staleWiringCheck() logs a warn in the auto-capture log when MCP/hooks reference a **non-existent** node path or an entry that differs from the current version (dsh-memory setup fixes it) — nobody runs align daily, so silent failures must become visible. ③ Verified locally: all three agent wirings are now ✓ in align (codex previously kept reporting "node path differs"). npm test now runs **379 checks** |
373
375
  | **v0.10.38** | 2026-10-17 | **The claim is released once a takeover succeeds (fixing a 0.10.35 side effect), plus real-machine A/B numbers for #45**. In 0.10.35 the claim was never released on the path where the helper becomes the resident watchdog (that process never exits), so a restart within 60 seconds of a completed takeover was blocked as in-flight by itself (reproduced locally). bootWatchdog() is now immediately followed by releaseReplaceClaim(), making the mutual-exclusion window exactly "a takeover is in progress". **#45 verified on a real machine (same host, same batch of 20 /version-check calls)**: 0.10.36 gave 9 successes / **11 refusals**, TIME_WAIT 24 to **1976** (+1952, about 100 connections per request, i.e. the recursion depth) and a 2389 ms first frame; 0.10.37 gave **20/20 successes**, TIME_WAIT 1969 to **1971** (+2) and 18-34 ms. npm test now runs **376 checks** |
374
376
  | **v0.10.37** | 2026-10-17 | **Fixes #45 (a severe regression I introduced in 0.10.36: the self-probing recursion in /version-check, amplified by retries), #44 (hardcoded node paths / zombie-watchdog misjudgement) and #43 (the official route fields for follow-session)**. ① **#45**: selfPort() is this process own port, yet /version-check called probeServedVersion to **request /version-check from it** — handler to itself to handler, with depth bounded only by timeouts and a new connection per level, which saturated the listen backlog and produced **intermittent ECONNREFUSED (17–37ms)**, 4402 extra TIME_WAIT entries in 40 idle seconds and an empty served value; the 0.10.36 retry multiplied it by three. Self-probes now **answer locally** (probedSelf:true, no HTTP), /restart-self has the same gate, and /version-check accepts ?port= for other ports. ② **#44**: nodeBinary() now **verifies existence** before using a cached path and falls back to PATH when execPath vanished (brew upgrade removing the old directory), so long-lived watchdogs heal themselves; inspectResident gains portServing and decideResidentAction treats "the lock says a watchdog is alive but the port answers nobody" as restart (watchdog-port-dead) instead of delegate; status prints the actual node binary and whether it exists. ③ **#43**: sessionRouteFrom() is async and prefers the official fields, session.requestHeader().config then agent.options, with the old sniffing as a fallback. npm test now runs **375 checks** |
package/README.md CHANGED
@@ -393,14 +393,16 @@ curl http://127.0.0.1:7999/memory-eternal/api/web-info # 独立 web 是否活
393
393
 
394
394
  | 版本 | 日期 | 关键改动 |
395
395
  |---|---|---|
396
- | **v0.10.41** | 2026-10-19 | **知识图谱初始视图缩小两个度**。图谱是 canvas + sim.zoom,滚轮每格 ×1.1;按「两个度」= ×(1/1.1)² ≈ **0.826** 处理 —— 初始 fit()(首屏、布局稳定后、以及「重置视图」)现在都在「刚好铺满」的基础上再外扩两格,四周留出拖拽/框选余量;滚轮与初始视图**共用同一个 ZOOM_STEP 常量**,以后调步长不会两边漂;原有限幅(0.35–1.8)保留,小图不会被缩到看不见。新增 tests/graph-initial-zoom.test.mjs(3 项源码守卫,含系数数值)。npm test 共 **392 项** |
397
- | **v0.10.40** | 2026-10-19 | **#45 后续(阻塞级):枚举超时不再被当成「端口空闲」+ macOS 红绿灯遮挡(#46)**。① 报告者实测:Get-NetTCPConnection 在该机要 **4.1–61.4 秒**(TCP 表大),而 takeover 只给 2.5s → 超时 → 空输出 → null → 「端口已空出」→ 新看门狗绑不上 7999、漂到 8001,**旧 web 永远活着、0.10.38 的修复永远轮不到执行**。修法:Windows 改**先走 netstat -ano**(实测 1.8s 且直接给 pid,本机复测 **403ms** 拿到 pid+命令行),PowerShell 只作兜底;portFree 升级成**三态**(free / occupied / **unknown**),枚举超时=未知 → **中止接管**并写明确日志(不再漂移);status 把「响应超时」与「没有服务」分开报;探测路径不再漏 socket。② **#46**:macOS 桌面版的窗口按钮是 Electron **原生 traffic light**(titleBarStyle:hiddenInset),任何 z-index/portal 都盖不住 —— 插件改为**跟随宿主安全区** --dsh-frame-overlay-top(macOS 68px,原生全屏宿主降到 20px),浮层顶边恒 68px、遮罩仍铺满全屏,不再被「关闭」按钮压住。npm test 共 **389 项** |
396
+ | **v0.10.43** | 2026-10-19 | **界面体验(第一批 · 读卡)**。① **复制**:阅读器新增「📋 复制正文」「🔗 复制路径」,复用带兜底的剪贴板工具,1.5s 内显示「已复制」(不再点了没反应);② **阅读进度**:头部下沿 2px 细条随正文滚动推进,短卡直接 100%;③ **j/k 翻页**:阅读器内 j 下一张、k 上一张(基于当前排序后的列表),**方向键仍留给正文滚动**,输入框内不触发;④ **阅读宽度**:窄/中/宽三档(720/900/1180px)一键切换并记住偏好;⑤ 延续 0.10.42 的头部不挤压修复。新增 tests/card-reader-ux.test.mjs(4 项守卫)。npm test 共 **399 项** |
397
+ | **v0.10.42** | 2026-10-19 | **卡片头部不再被长标题挤压(用户截图反馈)**。旧布局是 space-between,而 h3 没有 min-width:0(长标题压不动),按钮组也没有 flex:0 0 auto / nowrap → 按钮被挤成竖排(「收/起」「关/闭」)。现在:h3 可收缩并**单行省略**(悬停显示完整标题)、按钮组 flex:0 0 auto + nowrap(永不被压扁)、头部允许换行(极窄时整组按钮掉到第二行,仍逐个可点);阅读器与导出图谱两个头部统一走 .me-head-actions。新增 tests/card-head-actions.test.mjs(3 项守卫)。npm test 共 **395 项** |
398
398
 
399
399
  <details>
400
- <summary>更早的更新日志(v0.10.39 及以前 · 共 66 版,点开查看)</summary>
400
+ <summary>更早的更新日志(v0.10.41 及以前 · 共 68 版,点开查看)</summary>
401
401
 
402
402
  | 版本 | 日期 | 关键改动 |
403
403
  |---|---|---|
404
+ | **v0.10.41** | 2026-10-19 | **知识图谱初始视图缩小两个度**。图谱是 canvas + sim.zoom,滚轮每格 ×1.1;按「两个度」= ×(1/1.1)² ≈ **0.826** 处理 —— 初始 fit()(首屏、布局稳定后、以及「重置视图」)现在都在「刚好铺满」的基础上再外扩两格,四周留出拖拽/框选余量;滚轮与初始视图**共用同一个 ZOOM_STEP 常量**,以后调步长不会两边漂;原有限幅(0.35–1.8)保留,小图不会被缩到看不见。新增 tests/graph-initial-zoom.test.mjs(3 项源码守卫,含系数数值)。npm test 共 **392 项** |
405
+ | **v0.10.40** | 2026-10-19 | **#45 后续(阻塞级):枚举超时不再被当成「端口空闲」+ macOS 红绿灯遮挡(#46)**。① 报告者实测:Get-NetTCPConnection 在该机要 **4.1–61.4 秒**(TCP 表大),而 takeover 只给 2.5s → 超时 → 空输出 → null → 「端口已空出」→ 新看门狗绑不上 7999、漂到 8001,**旧 web 永远活着、0.10.38 的修复永远轮不到执行**。修法:Windows 改**先走 netstat -ano**(实测 1.8s 且直接给 pid,本机复测 **403ms** 拿到 pid+命令行),PowerShell 只作兜底;portFree 升级成**三态**(free / occupied / **unknown**),枚举超时=未知 → **中止接管**并写明确日志(不再漂移);status 把「响应超时」与「没有服务」分开报;探测路径不再漏 socket。② **#46**:macOS 桌面版的窗口按钮是 Electron **原生 traffic light**(titleBarStyle:hiddenInset),任何 z-index/portal 都盖不住 —— 插件改为**跟随宿主安全区** --dsh-frame-overlay-top(macOS 68px,原生全屏宿主降到 20px),浮层顶边恒 68px、遮罩仍铺满全屏,不再被「关闭」按钮压住。npm test 共 **389 项** |
404
406
  | **v0.10.39** | 2026-10-17 | **接线自愈:codex 的 TOML 按段解析 + 单引号/转义兼容 + 启动期只读体检(#44 第②④条)**。① 修了一个真 bug:setup / align 解析 ~/.codex/config.toml 时**没有限定 [mcp_servers.memory] 段**,会抓到别的 server 的第一个 command =(本机实测读成了 MCP_DOCKER 的 docker.exe);而且只认双引号,而 codex 自己写出来是单引号 → **既读不到也改不掉,却照样打印「已更新」**。现在读写共用纯函数(按段 → 单/双引号 → 反转义),**改完校验真的变了**,幂等(已是目标形态不算改动),改不了就如实报 section unparseable。② 新增启动期**只读**体检 staleWiringCheck():MCP/hooks 里若写着**已不存在**的 node 路径、或条目与当前版本不一致,就在自动沉淀日志里留一条 warn(dsh-memory setup 可修)—— 没人会天天跑 align,静默失效要变成可见。③ 本机验证:align 三端接线全部 ✓(修前 codex 一直报「node 路径与当前不一致」)。npm test 共 **379 项** |
405
407
  | **v0.10.38** | 2026-10-17 | **接管成功即释放 claim(修 0.10.35 的副作用)+ #45 真机 A/B 验证数据**。0.10.35 的 claim 在「助手变成常驻看门狗」这条路径上永远不会被释放(那个进程不退出),于是接管完成后 60 秒内的下一次 restart 会被自己挡成 in-flight(本机实测踩到)。现在 bootWatchdog() 之后立刻 releaseReplaceClaim() —— 互斥窗口严格等于「接管进行中」。**#45 真机验证(同一台机、同一组 20 次 /version-check)**:0.10.36 → 9 成功 / **11 拒连**,TIME_WAIT 24→**1976**(+1952 ≈ 每请求 100 条连接 = 递归深度),首帧 2389ms;0.10.37 → **20/20 成功**,TIME_WAIT 1969→**1971**(+2),18–34ms。npm test 共 **376 项** |
406
408
  | **v0.10.37** | 2026-10-17 | **修 #45(我 0.10.36 引入的严重回归:/version-check 自我探测递归被重试放大)+ #44(node 路径硬编码 / 僵尸看门狗误判)+ #43(跟随会话的官方字段)**。① **#45**:selfPort() 就是本进程自己的端口,而 /version-check 会用 probeServedVersion **再向它发一条 /version-check** → 处理器 → 自己 → 处理器…… 深度只受超时约束、每层各开一条连接 → listen backlog 打满 → **间歇 ECONNREFUSED(17–37ms)**、TIME_WAIT 静置 40 秒涨 4402、served 反成空串;0.10.36 的「重试 3 次」把它**乘以 3**。现在自探一律**直接作答**(probedSelf:true,不发 HTTP),/restart-self 同一道闸门;/version-check 也支持 ?port= 问别的端口。② **#44**:nodeBinary() 缓存命中前**验存在性**,execPath 失效(brew 升级删掉旧目录)时回退 PATH —— 长命 watchdog 从此自愈;inspectResident 新增 portServing,decideResidentAction 遇「登记说 watchdog 活着、端口却没人应答」判 restart(watchdog-port-dead)而**不再 delegate**(那正是「沉淀静默停摆、日志只写 delegated」的现场);status 打印实际用的 node 与存在性。③ **#43**:sessionRouteFrom() 改为 async,按官方字段优先取 session.requestHeader().config → agent.options → 旧嗅探兜底。npm test 共 **375 项** |