dsh-sessions-manager 3.6.0 → 3.6.2
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.en.md +4 -4
- package/README.md +4 -4
- package/lib/client.js +100 -28
- package/lib/client.js.map +2 -2
- package/lib/index.js +323 -169
- package/lib/index.js.map +2 -2
- package/package.json +1 -1
- package/src/client/index.jsx +104 -28
- package/src/client/logic.js +29 -0
- package/src/index.js +409 -190
- package/src/session-meta-cache.js +18 -0
- package/src/title-persist-index.js +13 -3
|
@@ -58,6 +58,24 @@ export function isPersistableFingerprint(fingerprint) {
|
|
|
58
58
|
return typeof fingerprint === 'string' && fingerprint !== '' && !fingerprint.startsWith(REVISION_PREFIX)
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
// 跨进程(重启后)仍可用的持久指纹,供 title-persist-index 使用(issue #8)。
|
|
62
|
+
//
|
|
63
|
+
// - legacy 世代:fingerprintOf 产出 (mtimeMs:size) 文件指纹,本身可持久化;
|
|
64
|
+
// - handle 世代(0.1.3+):fingerprintOf 产出 rev: 指纹,被 isPersistableFingerprint
|
|
65
|
+
// 正确拒绝(revision 是实例内 opaque token)。但这样持久索引在该世代**从不
|
|
66
|
+
// 写入**——issue #8 实测:249MB / 87 日志的库每次重启都重新全量解码约 90s。
|
|
67
|
+
// 退而求其次用官方 list()/stat() 每次带回的 sizeBytes("sz:<n>"):
|
|
68
|
+
// 日志任何追加/截断都会改变 size,size 不变而标题变化在真实场景里基本
|
|
69
|
+
// 不存在;最坏代价是显示一条陈旧标题,绝不产生错误数据。
|
|
70
|
+
// cwd/createdAt 不受此影响:回填时始终以最新 list header 为权威(见 index.js)。
|
|
71
|
+
// - 拿不到任何可用观测量时返回 null(调用方按未命中/不落盘处理)。
|
|
72
|
+
export function persistFingerprintOf(stat) {
|
|
73
|
+
const fp = fingerprintOf(stat)
|
|
74
|
+
if (fp && isPersistableFingerprint(fp)) return fp
|
|
75
|
+
if (stat && Number.isFinite(stat.sizeBytes) && stat.sizeBytes >= 0) return `sz:${stat.sizeBytes}`
|
|
76
|
+
return null
|
|
77
|
+
}
|
|
78
|
+
|
|
61
79
|
// 缓存条目是否仍然新鲜(纯函数)。
|
|
62
80
|
// stat 传 { revision } 或 { mtimeMs, size };两类指纹不能互相匹配。
|
|
63
81
|
export function isFresh(entry, stat, now, ttlMs = DEFAULT_TTL_MS) {
|
|
@@ -6,9 +6,12 @@
|
|
|
6
6
|
// 一次索引读 + 指纹比对,指纹没变的会话零解码。
|
|
7
7
|
//
|
|
8
8
|
// 结构仿 trash 的原子写索引:{ schemaVersion, entries: { [sessionId]: entry } }
|
|
9
|
-
// entry = { title, cwd, createdAt, fingerprint, updatedAt }
|
|
9
|
+
// entry = { title, cwd, createdAt, fingerprint, updatedAt, resolved? }
|
|
10
10
|
// fingerprint 即 session-meta-cache.js 的 fingerprintOf(stat) 产出
|
|
11
11
|
// ("<mtimeMs>:<size>"),比对一致即可信任条目内容。
|
|
12
|
+
// resolved(schema v2,v3.6.2 #1):标记「投影确实成功过」。title 为 null 的
|
|
13
|
+
// 条目只有带这个标记才可信——没标记的 null 标题条目是 v3.6.1 之前「投影失败
|
|
14
|
+
// 被当结果缓存」的污染源,读取时必须丢弃并重新预热。
|
|
12
15
|
//
|
|
13
16
|
// 写入时机由调用方决定(列表构建收尾批量回写、purge 时清理),本模块只
|
|
14
17
|
// 提供:读取缓存、合并写入(串行化 + 原子替换)、按 id 删除。任何文件
|
|
@@ -20,7 +23,7 @@
|
|
|
20
23
|
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises'
|
|
21
24
|
import { dirname, join } from 'node:path'
|
|
22
25
|
|
|
23
|
-
export const TITLE_INDEX_SCHEMA_VERSION =
|
|
26
|
+
export const TITLE_INDEX_SCHEMA_VERSION = 2
|
|
24
27
|
|
|
25
28
|
const MAX_ENTRIES = 20000
|
|
26
29
|
|
|
@@ -37,9 +40,16 @@ export function normalizeEntry(raw) {
|
|
|
37
40
|
const createdAt = typeof raw.createdAt === 'number' ? raw.createdAt : null
|
|
38
41
|
const fingerprint = typeof raw.fingerprint === 'string' && raw.fingerprint ? raw.fingerprint : null
|
|
39
42
|
const updatedAt = typeof raw.updatedAt === 'number' ? raw.updatedAt : 0
|
|
43
|
+
const resolved = raw.resolved === true || raw.resolved === 1
|
|
40
44
|
if (!fingerprint || fingerprint.startsWith('rev:')) return null
|
|
41
45
|
if (!title && !cwd) return null
|
|
42
|
-
|
|
46
|
+
// v3.6.2 #1:null 标题只有「投影确实成功过」(会话真的没有标题事件)才可信。
|
|
47
|
+
// 无 resolved 标记的 null 标题条目 = v3.6.1 的失败污染源(或 v1 旧数据),
|
|
48
|
+
// 一律丢弃 → 下次按未命中重新预热,索引自愈。
|
|
49
|
+
if (!title && !resolved) return null
|
|
50
|
+
const entry = { title, cwd, createdAt, fingerprint, updatedAt }
|
|
51
|
+
if (resolved) entry.resolved = 1
|
|
52
|
+
return entry
|
|
43
53
|
}
|
|
44
54
|
|
|
45
55
|
export function normalizeTitleIndex(raw) {
|