dsh-recall-plugin 2.3.1 → 2.3.3
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/CHANGELOG.md +48 -0
- package/README.en.md +4 -4
- package/README.md +8 -9
- package/lib/client.js +1689 -1484
- package/lib/config.js +53 -96
- package/lib/diagnostics.js +27 -52
- package/lib/dump-parse.js +79 -61
- package/lib/errors.js +41 -55
- package/lib/index.js +345 -446
- package/lib/maintenance.js +204 -275
- package/lib/routes-core.js +89 -140
- package/lib/routes-manage.js +571 -624
- package/lib/scripts.posix.js +452 -638
- package/lib/scripts.pwsh.js +537 -778
- package/lib/session-info.js +42 -57
- package/lib/snapshots.js +400 -588
- package/lib/store.js +364 -563
- package/package.json +7 -3
package/lib/session-info.js
CHANGED
|
@@ -1,71 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* 会话标题/消息文本的「两段式」读取:纯函数(titleFromEvents /
|
|
5
|
-
* messageTextFromEvents)模块级导出供单测与工厂共用;live 快速查询
|
|
6
|
-
* (liveTitleFast / liveMessageTextFast)带 apply 级跨请求缓存(sessionTitles /
|
|
7
|
-
* messageTexts Map),由 createSessionInfo 工厂生产——无模块级可变状态(HMR 假设)。
|
|
8
|
-
*
|
|
9
|
-
* 冷会话标题/文本要 readSession 整日志解压(10 秒级),列表首屏只查 live/缓存
|
|
10
|
-
* (同步、瞬时),冷数据由 Client 拿到列表后异步调 titles/messages 端点补齐。
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
// 从事件序列里取最新一条 session/title(倒序,标题事件通常靠后)
|
|
14
|
-
export function titleFromEvents(events) {
|
|
15
|
-
if (!Array.isArray(events)) return null
|
|
1
|
+
function titleFromEvents(events) {
|
|
2
|
+
if (!Array.isArray(events)) return null;
|
|
16
3
|
for (let i = events.length - 1; i >= 0; i--) {
|
|
17
|
-
const e = events[i]
|
|
18
|
-
if (e && e.type ===
|
|
4
|
+
const e = events[i];
|
|
5
|
+
if (e && e.type === "session/title" && e.data && typeof e.data.title === "string" && e.data.title) return e.data.title;
|
|
19
6
|
}
|
|
20
|
-
return null
|
|
7
|
+
return null;
|
|
21
8
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
export function messageTextFromEvents(events, messageId) {
|
|
25
|
-
if (!Array.isArray(events) || !messageId) return null
|
|
9
|
+
function messageTextFromEvents(events, messageId) {
|
|
10
|
+
if (!Array.isArray(events) || !messageId) return null;
|
|
26
11
|
for (const e of events) {
|
|
27
|
-
if (e && e.type ===
|
|
28
|
-
const blocks = Array.isArray(e.data.content) ? e.data.content : []
|
|
29
|
-
const text = blocks
|
|
30
|
-
|
|
31
|
-
.map((b) => b.text)
|
|
32
|
-
.join('')
|
|
33
|
-
return text || null
|
|
12
|
+
if (e && e.type === "user/message" && e.data && String(e.data.id) === String(messageId)) {
|
|
13
|
+
const blocks = Array.isArray(e.data.content) ? e.data.content : [];
|
|
14
|
+
const text = blocks.filter((b) => b && b.type === "text" && typeof b.text === "string").map((b) => b.text).join("");
|
|
15
|
+
return text || null;
|
|
34
16
|
}
|
|
35
17
|
}
|
|
36
|
-
return null
|
|
18
|
+
return null;
|
|
37
19
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const sessionTitles = new Map()
|
|
42
|
-
// 消息文本缓存:null 也缓存(避免无文本消息每次刷新重复解压冷日志)
|
|
43
|
-
const messageTexts = new Map()
|
|
44
|
-
|
|
20
|
+
function createSessionInfo(ctx) {
|
|
21
|
+
const sessionTitles = /* @__PURE__ */ new Map();
|
|
22
|
+
const messageTexts = /* @__PURE__ */ new Map();
|
|
45
23
|
function liveMessageTextFast(sessionId, messageId) {
|
|
46
|
-
if (!sessionId || !messageId) return null
|
|
47
|
-
const key = String(sessionId) +
|
|
48
|
-
if (messageTexts.has(key)) return messageTexts.get(key)
|
|
49
|
-
let text = null
|
|
24
|
+
if (!sessionId || !messageId) return null;
|
|
25
|
+
const key = String(sessionId) + "\0" + String(messageId);
|
|
26
|
+
if (messageTexts.has(key)) return messageTexts.get(key);
|
|
27
|
+
let text = null;
|
|
50
28
|
try {
|
|
51
|
-
const live = ctx.sessions.get(sessionId)
|
|
52
|
-
if (live) text = messageTextFromEvents(live.events, messageId)
|
|
53
|
-
} catch (error) {
|
|
54
|
-
|
|
55
|
-
|
|
29
|
+
const live = ctx.sessions.get(sessionId);
|
|
30
|
+
if (live) text = messageTextFromEvents(live.events, messageId);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
text = null;
|
|
33
|
+
}
|
|
34
|
+
if (text !== null) messageTexts.set(key, text);
|
|
35
|
+
return text;
|
|
56
36
|
}
|
|
57
|
-
|
|
58
37
|
function liveTitleFast(sessionId) {
|
|
59
|
-
if (!sessionId) return null
|
|
60
|
-
if (sessionTitles.has(sessionId)) return sessionTitles.get(sessionId)
|
|
61
|
-
let t = null
|
|
38
|
+
if (!sessionId) return null;
|
|
39
|
+
if (sessionTitles.has(sessionId)) return sessionTitles.get(sessionId);
|
|
40
|
+
let t = null;
|
|
62
41
|
try {
|
|
63
|
-
const live = ctx.sessions.get(sessionId)
|
|
64
|
-
if (live) t = titleFromEvents(live.events)
|
|
65
|
-
} catch (error) {
|
|
66
|
-
|
|
67
|
-
|
|
42
|
+
const live = ctx.sessions.get(sessionId);
|
|
43
|
+
if (live) t = titleFromEvents(live.events);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
t = null;
|
|
46
|
+
}
|
|
47
|
+
if (t !== null) sessionTitles.set(sessionId, t);
|
|
48
|
+
return t;
|
|
68
49
|
}
|
|
69
|
-
|
|
70
|
-
return { sessionTitles, messageTexts, liveTitleFast, liveMessageTextFast }
|
|
50
|
+
return { sessionTitles, messageTexts, liveTitleFast, liveMessageTextFast };
|
|
71
51
|
}
|
|
52
|
+
export {
|
|
53
|
+
createSessionInfo,
|
|
54
|
+
messageTextFromEvents,
|
|
55
|
+
titleFromEvents
|
|
56
|
+
};
|