memory-eternal 0.10.43 → 0.10.45
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/README.en.md +5 -3
- package/README.md +5 -3
- package/lib/api.js +5 -3
- package/lib/client.js +28 -23
- package/lib/vault.js +9 -6
- package/package.json +2 -2
- package/web/app.js +30 -25
|
@@ -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.
|
|
4
|
+
"version": "0.10.45",
|
|
5
5
|
"description": "记忆核心(Memory Eternal):对话结束后自动沉淀知识卡到本地记忆库(~/.dsh/memory-vault),支持检索 / 召回 / 审核中心。",
|
|
6
6
|
"author": {
|
|
7
7
|
"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.
|
|
365
|
-
| **v0.10.
|
|
364
|
+
| **v0.10.45** | 2026-10-19 | **Fixes the disappearing "restart resident instance" button and the dialog layout / scrollbar anomalies (from user screenshots)**. ① **The button is persistent**: it used to live inside the warning block that only renders when something is wrong, so once versions matched the whole block vanished and the button could not be found (issue #28 complained about the same). The action row now renders independently: it is the repair entry point when something is off, and stays available when everything is fine, with a note that a restart is usually unnecessary but can be forced if the instance looks stuck. ② **Scrollbar anomalies**: the reader can have up to eight header buttons while 0.10.42 made the action group nowrap, so it overflowed horizontally inside a max-width:760px dialog; each button still never shrinks or wraps, but the **group itself may wrap** onto a second row without deforming. ③ **Layout**: .me-dialog and .me-dialog-body use border-box and hide horizontal scrolling in the body (the reader width:100% plus padding no longer breaks out of the container), diagnostic/feedback pre blocks use word-break for long paths, and large-title modals ellipsize their h2. Adds tests/ui-overflow.test.mjs (4 guards). npm test now runs **406 checks** |
|
|
365
|
+
| **v0.10.44** | 2026-10-19 | **UI experience, batch two: click a tag to filter, plus search hit snippets**. ① **Tag filtering**: tag chips in the list and the reader are now clickable and filter immediately (combining with search, kind and status); the toolbar shows a removable "tag x" chip. The server-side /cards?tag= uses an exact SQL match on the quoted complete tag inside the JSON array (instr), so **ab is never matched by a**, and both the countCards and sort=title branches apply it. ② **Search hit snippets**: when the match is in the body, the list shows a short excerpt around the keyword with highlighting (whitespace collapsed, ellipses at both ends), so it is obvious why a card matched. ③ Adds src/client/snippet.js (pure, unit-testable in Node) and tests/tag-filter.test.mjs (3 checks). npm test now runs **402 checks** |
|
|
366
366
|
|
|
367
367
|
<details>
|
|
368
|
-
<summary>Older release notes (v0.10.
|
|
368
|
+
<summary>Older release notes (v0.10.43 and earlier · 70 releases, click to expand)</summary>
|
|
369
369
|
|
|
370
370
|
| Version | Date | Highlights |
|
|
371
371
|
|---|---|---|
|
|
372
|
+
| **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** |
|
|
373
|
+
| **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** |
|
|
372
374
|
| **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
375
|
| **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** |
|
|
374
376
|
| **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** |
|
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.
|
|
397
|
-
| **v0.10.
|
|
396
|
+
| **v0.10.45** | 2026-10-19 | **修复「重启常驻实例」按钮消失 + 对话框排版/滚动条异常(用户截图反馈)**。① **按钮常驻**:它原来被包在「有异常才渲染」的警告块里 —— 版本一对齐整块消失,用户再也找不到(#28 也抱怨过)。现在操作行**独立渲染**:异常时是修复入口,一切正常时也保留按钮并说明「通常无需重启,卡住时可强制重启」。② **滚动条异常**:阅读器最多 8 个头部按钮,而 0.10.42 给按钮组设的是 nowrap → 在 max-width:760px 的对话框里**横向溢出**;现在按钮自身仍不缩不换行、但**按钮组整体允许换行**(掉到第二行也不变形)。③ **排版**:.me-dialog / .me-dialog-body 改 border-box 并隐藏正文横向滚动(阅读器的 width:100% + padding 不再撑破容器);诊断/反馈的 <pre> 长路径加 word-break(远程 agent 的路径没有断点,以前必横向滚);大标题 modal 的 h2 加省略号。新增 tests/ui-overflow.test.mjs(4 项守卫)。npm test 共 **406 项** |
|
|
397
|
+
| **v0.10.44** | 2026-10-19 | **界面体验(第二批):标签点击即筛选 + 搜索命中片段**。① **标签筛选**:列表/阅读器里的标签芯片现在可点,点了立即按该标签筛(与搜索 / 类型 / 状态**可叠加**);工具栏出现可清除的「🏷 标签 ✕」。服务端 /cards?tag= 走 SQL 精确匹配 —— 按「JSON 数组里带引号的完整标签」用 instr 匹配,**不会把 ab 命中成 a**;countCards 与 sort=title 两条分支同步生效。② **搜索命中片段**:命中正文时,列表多显示一段**关键词附近的片段并高亮**(折叠空白、两端省略),一眼看出「为什么命中」。③ 新增 src/client/snippet.js(纯函数,Node 可单测)+ tests/tag-filter.test.mjs(3 项)。npm test 共 **402 项** |
|
|
398
398
|
|
|
399
399
|
<details>
|
|
400
|
-
<summary>更早的更新日志(v0.10.
|
|
400
|
+
<summary>更早的更新日志(v0.10.43 及以前 · 共 70 版,点开查看)</summary>
|
|
401
401
|
|
|
402
402
|
| 版本 | 日期 | 关键改动 |
|
|
403
403
|
|---|---|---|
|
|
404
|
+
| **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 项** |
|
|
405
|
+
| **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 项** |
|
|
404
406
|
| **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
407
|
| **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 项** |
|
|
406
408
|
| **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 项** |
|
package/lib/api.js
CHANGED
|
@@ -236,17 +236,19 @@ export function createApi(deps = {}) {
|
|
|
236
236
|
: status === 'deleted' ? 'deleted'
|
|
237
237
|
: 'approved'
|
|
238
238
|
const unknownStatus = !KNOWN_STATUS.includes(status)
|
|
239
|
+
// issue #46 后的界面改进:标签筛选(点芯片即筛)。与搜索可叠加。
|
|
240
|
+
const tag = (query.get('tag') || '').trim()
|
|
239
241
|
if (q.trim()) {
|
|
240
242
|
// 检索是相关性排序:先把命中集合取齐,再在内存里分页(保证 total 与顺序一致)
|
|
241
243
|
const hits = await search(vaultRoot, q, { limit: 500 })
|
|
242
244
|
const hitPaths = new Set(hits.map((h) => h.path))
|
|
243
|
-
let cards = (await listCards(vaultRoot, { status: want, kind, agent })).filter((c) => hitPaths.has(c.path))
|
|
245
|
+
let cards = (await listCards(vaultRoot, { status: want, kind, agent, tag })).filter((c) => hitPaths.has(c.path))
|
|
244
246
|
const total = cards.length
|
|
245
247
|
json(res, 200, { ok: true, cards: cards.slice(offset, offset + limit), total, offset, limit, appliedStatus, requestedStatus: status, unknownStatus })
|
|
246
248
|
return
|
|
247
249
|
}
|
|
248
|
-
const total = await countCards(vaultRoot, { status: want, kind, agent })
|
|
249
|
-
const cards = await listCards(vaultRoot, { status: want, kind, agent, limit, offset, sort })
|
|
250
|
+
const total = await countCards(vaultRoot, { status: want, kind, agent, tag })
|
|
251
|
+
const cards = await listCards(vaultRoot, { status: want, kind, agent, tag, limit, offset, sort })
|
|
250
252
|
json(res, 200, { ok: true, cards, total, offset, limit, appliedStatus, requestedStatus: status, unknownStatus })
|
|
251
253
|
return
|
|
252
254
|
}
|