@zaofan/dsh-qqbot 1.4.6 → 1.5.0
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 +158 -535
- package/README_EN.md +6 -0
- package/client/qqbot-settings.js +152 -5
- package/dist/channel-tools.d.ts.map +1 -1
- package/dist/channel-tools.js +106 -1
- package/dist/channel-tools.js.map +1 -1
- package/dist/features/agg-score.d.ts +73 -0
- package/dist/features/agg-score.d.ts.map +1 -0
- package/dist/features/agg-score.js +63 -0
- package/dist/features/agg-score.js.map +1 -0
- package/dist/features/attitude.d.ts +132 -0
- package/dist/features/attitude.d.ts.map +1 -0
- package/dist/features/attitude.js +318 -0
- package/dist/features/attitude.js.map +1 -0
- package/dist/features/bot-reply-memo.d.ts +8 -0
- package/dist/features/bot-reply-memo.d.ts.map +1 -0
- package/dist/features/bot-reply-memo.js +34 -0
- package/dist/features/bot-reply-memo.js.map +1 -0
- package/dist/features/emo-samples.d.ts +27 -0
- package/dist/features/emo-samples.d.ts.map +1 -0
- package/dist/features/emo-samples.js +116 -0
- package/dist/features/emo-samples.js.map +1 -0
- package/dist/features/four-source.d.ts +114 -0
- package/dist/features/four-source.d.ts.map +1 -0
- package/dist/features/four-source.js +260 -0
- package/dist/features/four-source.js.map +1 -0
- package/dist/features/image-url-ledger.d.ts +2 -0
- package/dist/features/image-url-ledger.d.ts.map +1 -1
- package/dist/features/image-url-ledger.js +23 -0
- package/dist/features/image-url-ledger.js.map +1 -1
- package/dist/features/intimacy-ledger.d.ts +31 -0
- package/dist/features/intimacy-ledger.d.ts.map +1 -0
- package/dist/features/intimacy-ledger.js +113 -0
- package/dist/features/intimacy-ledger.js.map +1 -0
- package/dist/features/local-signals.d.ts +130 -0
- package/dist/features/local-signals.d.ts.map +1 -0
- package/dist/features/local-signals.js +445 -0
- package/dist/features/local-signals.js.map +1 -0
- package/dist/features/people-memo.d.ts +52 -0
- package/dist/features/people-memo.d.ts.map +1 -0
- package/dist/features/people-memo.js +239 -0
- package/dist/features/people-memo.js.map +1 -0
- package/dist/features/quote-cache.d.ts +19 -0
- package/dist/features/quote-cache.d.ts.map +1 -0
- package/dist/features/quote-cache.js +67 -0
- package/dist/features/quote-cache.js.map +1 -0
- package/dist/features/self-disclosure.d.ts +28 -0
- package/dist/features/self-disclosure.d.ts.map +1 -0
- package/dist/features/self-disclosure.js +60 -0
- package/dist/features/self-disclosure.js.map +1 -0
- package/dist/features/tendency-samples.d.ts +22 -0
- package/dist/features/tendency-samples.d.ts.map +1 -0
- package/dist/features/tendency-samples.js +194 -0
- package/dist/features/tendency-samples.js.map +1 -0
- package/dist/features/thinking-log.d.ts +22 -0
- package/dist/features/thinking-log.d.ts.map +1 -0
- package/dist/features/thinking-log.js +70 -0
- package/dist/features/thinking-log.js.map +1 -0
- package/dist/features/xlsx.d.ts +28 -0
- package/dist/features/xlsx.d.ts.map +1 -0
- package/dist/features/xlsx.js +159 -0
- package/dist/features/xlsx.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +25 -3
- package/dist/session/session-manager.js.map +1 -1
- package/dist/transport/events.d.ts +12 -0
- package/dist/transport/events.d.ts.map +1 -1
- package/dist/transport/events.js +15 -2
- package/dist/transport/events.js.map +1 -1
- package/dist/transport/inbound.d.ts.map +1 -1
- package/dist/transport/inbound.js +344 -20
- package/dist/transport/inbound.js.map +1 -1
- package/dist/transport/outbound-buffer.d.ts.map +1 -1
- package/dist/transport/outbound-buffer.js +8 -0
- package/dist/transport/outbound-buffer.js.map +1 -1
- package/dist/transport/outbound.d.ts +12 -0
- package/dist/transport/outbound.d.ts.map +1 -1
- package/dist/transport/outbound.js +170 -5
- package/dist/transport/outbound.js.map +1 -1
- package/docs/USER-GUIDE.md +429 -0
- package/package.json +2 -1
- package/settings-host.js +154 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* people-memo.ts — 「群友小传」(文字版好感度本体, 2026-09-13 主人定)
|
|
3
|
+
*
|
|
4
|
+
* 设计要点(详见 参考文档/dsh-qqbot-好感度系统设计_20260913.md §4.3):
|
|
5
|
+
* · 一人一个本地 Markdown: `{dataRoot}/.qqbot/people/<uid>.md`(人可读、可手改、可删)
|
|
6
|
+
* · 八栏: 身份 / 本事 / 经历 / 成就 / 喜好与雷区 / 价值观 / 与该 AI 的关系 / 对该 AI 的期望
|
|
7
|
+
* · **只写旁人也复述得出来的事实** + 一句"她当时怎么接的"; 不写评价、不猜测
|
|
8
|
+
* · 原文留档: 摘要之上不动, 摘要改味了能对回来
|
|
9
|
+
* · 写入节流: 同一人**一天最多一条**(她顺手记, 不是台账)
|
|
10
|
+
* · 遗忘: 不删原文; 30 天没有新事件就沉底归档(归档不影响行为, 可按名字翻出)
|
|
11
|
+
* · 删除入口: 一句"别记人家" → 删整段 + 回执
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
/** 归档阈值(天): 小传最后修改超过这么久 → 沉底(仍在文件里, 只是不再优先召回) */
|
|
16
|
+
export const MEMO_ARCHIVE_DAYS = 30;
|
|
17
|
+
export function peopleDirOf(dataRoot) {
|
|
18
|
+
return join(dataRoot, '.qqbot', 'people');
|
|
19
|
+
}
|
|
20
|
+
/** 文件名安全化(uid 一般是 hex, 但仍防穿越) */
|
|
21
|
+
function safeKey(key) {
|
|
22
|
+
return String(key || '').replace(/[^0-9A-Za-z_-]/g, '').slice(0, 64) || 'unknown';
|
|
23
|
+
}
|
|
24
|
+
export function memoPathOf(dataRoot, key) {
|
|
25
|
+
return join(peopleDirOf(dataRoot), `${safeKey(key)}.md`);
|
|
26
|
+
}
|
|
27
|
+
export function readMemo(dataRoot, key) {
|
|
28
|
+
const p = memoPathOf(dataRoot, key);
|
|
29
|
+
try {
|
|
30
|
+
return existsSync(p) ? readFileSync(p, 'utf8') : undefined;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** 列出全部小传(按最后修改时间新→旧) */
|
|
37
|
+
export function listMemos(dataRoot) {
|
|
38
|
+
const dir = peopleDirOf(dataRoot);
|
|
39
|
+
try {
|
|
40
|
+
return readdirSync(dir)
|
|
41
|
+
.filter((f) => f.endsWith('.md'))
|
|
42
|
+
.map((f) => {
|
|
43
|
+
const p = join(dir, f);
|
|
44
|
+
const st = statSync(p);
|
|
45
|
+
return {
|
|
46
|
+
key: f.replace(/\.md$/, ''),
|
|
47
|
+
path: p,
|
|
48
|
+
bytes: st.size,
|
|
49
|
+
mtime: st.mtimeMs,
|
|
50
|
+
archived: Date.now() - st.mtimeMs > MEMO_ARCHIVE_DAYS * 86400_000,
|
|
51
|
+
};
|
|
52
|
+
})
|
|
53
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** 每人每天最多记几条(2026-09-14 主人:"只记一条怎么记得完" → 由 1 条放宽到 3 条) */
|
|
60
|
+
const MAX_PER_DAY = 3;
|
|
61
|
+
/** 今天的写入计数(内存;重启清零 → 最坏一天多记几条,观察期可接受) */
|
|
62
|
+
const writeCount = new Map();
|
|
63
|
+
/** 今天已经记了几条(含栏位条目) */
|
|
64
|
+
export function countWroteToday(key, now = Date.now()) {
|
|
65
|
+
const day = new Date(now).toDateString();
|
|
66
|
+
const hit = writeCount.get(key);
|
|
67
|
+
return hit && hit.day === day ? hit.n : 0;
|
|
68
|
+
}
|
|
69
|
+
/** 兼容旧签名:今天是否已经记过(旧版按文件 mtime 判断,一天一条) */
|
|
70
|
+
export function wroteToday(_dataRoot, key, now = Date.now()) {
|
|
71
|
+
return countWroteToday(key, now) > 0;
|
|
72
|
+
}
|
|
73
|
+
function bumpWriteCount(key, now = Date.now()) {
|
|
74
|
+
const day = new Date(now).toDateString();
|
|
75
|
+
const hit = writeCount.get(key);
|
|
76
|
+
writeCount.set(key, hit && hit.day === day ? { day, n: hit.n + 1 } : { day, n: 1 });
|
|
77
|
+
}
|
|
78
|
+
/** 八栏映射:`line` 以栏名开头("喜好:最近在玩 XX")→ 归到该栏;否则进「## 记事」 */
|
|
79
|
+
const SECTIONS = [
|
|
80
|
+
{ title: '身份', aliases: ['身份', '是谁', '基本信息'] },
|
|
81
|
+
{ title: '本事', aliases: ['本事', '擅长', '技能'] },
|
|
82
|
+
{ title: '经历', aliases: ['经历', '做过'] },
|
|
83
|
+
{ title: '成就', aliases: ['成就', '成绩'] },
|
|
84
|
+
{ title: '喜好与雷区', aliases: ['喜好与雷区', '喜好', '雷区', '喜欢', '讨厌', '口味'] },
|
|
85
|
+
{ title: '价值观', aliases: ['价值观', '信念', '观念'] },
|
|
86
|
+
{ title: '与她的关系', aliases: ['与她的关系', '关系', '跟她的关系'] },
|
|
87
|
+
{ title: '对鲸鱼娘的期望', aliases: ['对鲸鱼娘的期望', '期望', '要求'] },
|
|
88
|
+
];
|
|
89
|
+
/** 拆栏目前缀:"喜好:最近在玩 XX" → { section:'喜好与雷区', body:'最近在玩 XX' } */
|
|
90
|
+
function splitSection(line) {
|
|
91
|
+
const m = /^([^::]{1,12})[::]\s*(.+)$/.exec(line.trim());
|
|
92
|
+
if (m) {
|
|
93
|
+
const head = m[1].trim();
|
|
94
|
+
const hit = SECTIONS.find((s) => s.aliases.includes(head));
|
|
95
|
+
if (hit)
|
|
96
|
+
return { section: hit.title, body: m[2].trim() };
|
|
97
|
+
}
|
|
98
|
+
return { body: line.trim() };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 追加一条。两种落法:
|
|
102
|
+
* · 带栏目前缀("喜好:…")→ 归到八栏(该栏已有一行 → 行尾用";"并进去,保持"每栏一行"的摘要形态)
|
|
103
|
+
* · 不带前缀 → 进「## 记事」区(带日期,现状不变)
|
|
104
|
+
* 节流:**同一人一天最多 3 条**(2026-09-14 放宽;原为 1 条,"只记一条怎么记得完")。
|
|
105
|
+
*/
|
|
106
|
+
export function appendMemoLine(dataRoot, key, line, opts = {}) {
|
|
107
|
+
const text = String(line || '').trim().slice(0, 300);
|
|
108
|
+
if (!text)
|
|
109
|
+
return { ok: false, msg: '内容是空的' };
|
|
110
|
+
const n = countWroteToday(key);
|
|
111
|
+
if (!opts.force && n >= MAX_PER_DAY) {
|
|
112
|
+
return { ok: false, msg: `这个人今天已经记过 ${n} 条了(一天最多 ${MAX_PER_DAY} 条, 明天再说)` };
|
|
113
|
+
}
|
|
114
|
+
const dir = peopleDirOf(dataRoot);
|
|
115
|
+
const p = memoPathOf(dataRoot, key);
|
|
116
|
+
const today = new Date();
|
|
117
|
+
const stamp = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
|
|
118
|
+
const { section, body } = splitSection(text);
|
|
119
|
+
try {
|
|
120
|
+
mkdirSync(dir, { recursive: true });
|
|
121
|
+
let cur = existsSync(p) ? readFileSync(p, 'utf8') : undefined;
|
|
122
|
+
const created = cur === undefined;
|
|
123
|
+
if (cur === undefined) {
|
|
124
|
+
cur = `# ${opts.name || key}\n\n> 小传(八栏:身份/本事/经历/成就/喜好与雷区/价值观/与该 AI 的关系/对该 AI 的期望)\n> 只写旁人也复述得出来的事实 + AI 当时怎么接的;不写评价与猜测。原文留档不动。\n\n## 记事\n`;
|
|
125
|
+
}
|
|
126
|
+
if (section) {
|
|
127
|
+
// ① 归栏:该栏已有 → 行尾并进去;没有 → 插到「## 记事」之前(八栏在上、记事在下)
|
|
128
|
+
const prefix = `- ${section}:`;
|
|
129
|
+
const lines = cur.split('\n');
|
|
130
|
+
const idx = lines.findIndex((l) => l.startsWith(prefix));
|
|
131
|
+
if (idx >= 0) {
|
|
132
|
+
// 行尾原有的句号/分号先去干净再并 —— 否则会出现"。;"这种双标点(实测踩到)
|
|
133
|
+
lines[idx] = `${lines[idx].replace(/[\s。;;,,、]+$/, '')};${body}`;
|
|
134
|
+
writeFileSync(p, lines.join('\n'), 'utf8');
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
const insert = `- ${section}:${body}`;
|
|
138
|
+
const anchor = cur.indexOf('\n## 记事');
|
|
139
|
+
if (anchor > 0)
|
|
140
|
+
writeFileSync(p, `${cur.slice(0, anchor)}\n${insert}${cur.slice(anchor)}`, 'utf8');
|
|
141
|
+
else
|
|
142
|
+
writeFileSync(p, `${cur.replace(/\s*$/, '')}\n${insert}\n`, 'utf8');
|
|
143
|
+
}
|
|
144
|
+
bumpWriteCount(key);
|
|
145
|
+
return { ok: true, msg: (created ? '已新建小传,' : '') + `已记进「${section}」栏` };
|
|
146
|
+
}
|
|
147
|
+
// ② 无栏目 → 记事区(带日期),插到「## 原始自述」之前
|
|
148
|
+
const bullet = `- ${stamp} ${text}`;
|
|
149
|
+
const idx2 = cur.indexOf('\n## 原始自述');
|
|
150
|
+
if (idx2 > 0)
|
|
151
|
+
writeFileSync(p, `${cur.slice(0, idx2)}\n${bullet}${cur.slice(idx2)}`, 'utf8');
|
|
152
|
+
else
|
|
153
|
+
writeFileSync(p, `${cur.replace(/\s*$/, '')}\n${bullet}\n`, 'utf8');
|
|
154
|
+
bumpWriteCount(key);
|
|
155
|
+
return { ok: true, msg: created ? '已新建小传并记下这条' : '已记下' };
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
return { ok: false, msg: `写入失败: ${e instanceof Error ? e.message : String(e)}` };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 取该小传里最适合注入的 1~2 行: 有嵌入器就按"与当前消息最相关"排, 没有就取最近两条。
|
|
163
|
+
* 若整份小传已归档(30 天没更新) → 不注入(沉底)。
|
|
164
|
+
*/
|
|
165
|
+
export async function recallLines(dataRoot, key, query, embed, topN = 2) {
|
|
166
|
+
const text = readMemo(dataRoot, key);
|
|
167
|
+
if (!text)
|
|
168
|
+
return { lines: [], archived: false };
|
|
169
|
+
let archived = false;
|
|
170
|
+
try {
|
|
171
|
+
archived = Date.now() - statSync(memoPathOf(dataRoot, key)).mtimeMs > MEMO_ARCHIVE_DAYS * 86400_000;
|
|
172
|
+
}
|
|
173
|
+
catch { /* 读不到当未归档 */ }
|
|
174
|
+
const lines = text
|
|
175
|
+
.split('\n')
|
|
176
|
+
.map((l) => l.trim())
|
|
177
|
+
.filter((l) => l.startsWith('- ') && !/^>\s/.test(l) && !/^-\s*\d+\./.test(l));
|
|
178
|
+
if (lines.length === 0)
|
|
179
|
+
return { lines: [], archived };
|
|
180
|
+
if (archived)
|
|
181
|
+
return { lines: [], archived }; // 沉底: 不参与注入(可按名字显式翻出)
|
|
182
|
+
if (lines.length <= topN || !embed || !embed.available())
|
|
183
|
+
return { lines: lines.slice(-topN), archived };
|
|
184
|
+
try {
|
|
185
|
+
const qv = await embed.embedQuery(String(query || '').slice(0, 200));
|
|
186
|
+
const vv = await embed.embedPassages(lines.map((l) => l.replace(/^-\s*/, '')));
|
|
187
|
+
if (!qv || !vv)
|
|
188
|
+
return { lines: lines.slice(-topN), archived };
|
|
189
|
+
const dot = (a, b) => {
|
|
190
|
+
let s = 0;
|
|
191
|
+
const n = Math.min(a.length, b.length);
|
|
192
|
+
for (let i = 0; i < n; i += 1)
|
|
193
|
+
s += a[i] * b[i];
|
|
194
|
+
return s;
|
|
195
|
+
};
|
|
196
|
+
const scored = lines.map((l, i) => ({ l, s: dot(qv, vv[i] ?? []) }));
|
|
197
|
+
scored.sort((a, b) => b.s - a.s);
|
|
198
|
+
return { lines: scored.slice(0, topN).map((x) => x.l), archived };
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return { lines: lines.slice(-topN), archived };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** 删掉整段小传(群里一句"别记人家" → 立刻执行 + 回执) */
|
|
205
|
+
export function deleteMemo(dataRoot, key) {
|
|
206
|
+
try {
|
|
207
|
+
const p = memoPathOf(dataRoot, key);
|
|
208
|
+
if (!existsSync(p))
|
|
209
|
+
return { ok: true, msg: '本来就没有记过这个人' };
|
|
210
|
+
rmSync(p);
|
|
211
|
+
return { ok: true, msg: '已删掉' };
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
return { ok: false, msg: `删除失败: ${e instanceof Error ? e.message : String(e)}` };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// ─────────── 运行时上下文贡献(2026-09-13 主人定:与 auto-memory 同款姿势) ───────────
|
|
218
|
+
// dsh 的 systemPrompt.context() 是"每次组装都求值"的动态贡献, 挂在历史尾部(user-role 快照),
|
|
219
|
+
// 而 **system prompt 本体保持字节级稳定 → 前缀缓存不被打穿**。这里只放"本轮要注入的那一行",
|
|
220
|
+
// 由 inbound 算好后暂存,短 TTL(90s) 内被读取一次即用,过期自动丢弃,避免污染后续轮次。
|
|
221
|
+
let pendingMemoText = '';
|
|
222
|
+
let pendingMemoAt = 0;
|
|
223
|
+
const PENDING_TTL_MS = 90_000;
|
|
224
|
+
/** inbound 算好小传注入行后调用(90 秒内有效) */
|
|
225
|
+
export function setPendingMemo(text) {
|
|
226
|
+
pendingMemoText = String(text || '').slice(0, 600);
|
|
227
|
+
pendingMemoAt = Date.now();
|
|
228
|
+
}
|
|
229
|
+
/** 供 systemPrompt.context 的 text 提供者调用:过期/为空则返回 ''(不贡献内容) */
|
|
230
|
+
export function takePendingMemoText() {
|
|
231
|
+
if (!pendingMemoText)
|
|
232
|
+
return '';
|
|
233
|
+
if (Date.now() - pendingMemoAt > PENDING_TTL_MS) {
|
|
234
|
+
pendingMemoText = '';
|
|
235
|
+
return '';
|
|
236
|
+
}
|
|
237
|
+
return pendingMemoText;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=people-memo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"people-memo.js","sourceRoot":"","sources":["../../src/features/people-memo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5G,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,iDAAiD;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,iCAAiC;AACjC,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW;IACtD,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,GAAW;IACpD,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,GAAG,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvB,OAAO;gBACL,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3B,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,EAAE,CAAC,IAAI;gBACd,KAAK,EAAE,EAAE,CAAC,OAAO;gBACjB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,iBAAiB,GAAG,SAAS;aAClE,CAAC;QACJ,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,yCAAyC;AACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsC,CAAC;AAEjE,sBAAsB;AACtB,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,GAAW,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACzE,OAAO,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,GAAW,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACnD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,uDAAuD;AACvD,MAAM,QAAQ,GAAgD;IAC5D,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;IAC9C,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;IAC5C,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IACtC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IACtC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;IACpE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;IAC9C,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;IACrD,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;CACvD,CAAC;AAEF,+DAA+D;AAC/D,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,CAAC,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,GAAW,EACX,IAAY,EACZ,OAA2C,EAAE;IAE7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC9C,MAAM,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,YAAY,WAAW,WAAW,EAAE,CAAC;IAC9E,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACpI,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC;QAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI,GAAG,gHAAgH,CAAC;QAC9I,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,gDAAgD;YAChD,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,CAAC;YAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YACzD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACb,2CAA2C;gBAC3C,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBAClE,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtC,IAAI,MAAM,GAAG,CAAC;oBAAE,aAAa,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;;oBAC9F,aAAa,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3E,CAAC;YACD,cAAc,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,OAAO,IAAI,EAAE,CAAC;QAC3E,CAAC;QAED,iCAAiC;QACjC,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,IAAI,GAAG,CAAC;YAAE,aAAa,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;;YACxF,aAAa,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC;QACzE,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,GAAW,EACX,KAAa,EACb,KAAmJ,EACnJ,IAAI,GAAG,CAAC;IAER,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACtG,CAAC;IAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI;SACf,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IACvD,IAAI,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,sBAAsB;IACpE,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IACzG,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,CAAW,EAAE,CAAW,EAAU,EAAE;YAC/C,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YAClD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;AACH,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW;IACtD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,CAAC;QACV,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACnF,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,sEAAsE;AACtE,4DAA4D;AAC5D,uDAAuD;AACvD,IAAI,eAAe,GAAG,EAAE,CAAC;AACzB,IAAI,aAAa,GAAG,CAAC,CAAC;AACtB,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,kCAAkC;AAClC,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,eAAe,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,cAAc,EAAE,CAAC;QAAC,eAAe,GAAG,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IACrF,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** 每个会话保留的条数(主人定: 最多 10 条) */
|
|
2
|
+
export declare const QUOTE_CACHE_MAX = 10;
|
|
3
|
+
export interface QuoteEntry {
|
|
4
|
+
/** 编号(全局自增, 引用块里会标出来, 如 `引用#12`) */
|
|
5
|
+
id: number;
|
|
6
|
+
/** 被引用的完整原文 */
|
|
7
|
+
text: string;
|
|
8
|
+
/** 引用者昵称(有就给) */
|
|
9
|
+
sender?: string;
|
|
10
|
+
/** 入站时间戳(ms) */
|
|
11
|
+
at: number;
|
|
12
|
+
}
|
|
13
|
+
/** 存一条引用原文, 返回它的编号(超上限丢最旧) */
|
|
14
|
+
export declare function pushQuote(dataRoot: string, key: string, text: string, sender?: string): QuoteEntry;
|
|
15
|
+
/** 某会话的引用列表(新→旧) */
|
|
16
|
+
export declare function listQuotes(dataRoot: string, key: string): QuoteEntry[];
|
|
17
|
+
/** 按编号取; 不传 id = 最新一条; 传了但不在本会话 = undefined */
|
|
18
|
+
export declare function getQuote(dataRoot: string, key: string, id?: number): QuoteEntry | undefined;
|
|
19
|
+
//# sourceMappingURL=quote-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-cache.d.ts","sourceRoot":"","sources":["../../src/features/quote-cache.ts"],"names":[],"mappings":"AAcA,8BAA8B;AAC9B,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAmCD,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAQlG;AAED,oBAAoB;AACpB,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAGtE;AAED,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAK3F"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* quote-cache.ts — 引用消息原文缓存(省 token 用)
|
|
3
|
+
*
|
|
4
|
+
* 背景(2026-09-13 主人定): 引用消息会把**被引用的原文**整段塞进上下文, 引用一长就很吃 token。
|
|
5
|
+
* 现在入站只给**前 N 字**(inbound 里 QUOTE_KEEP, 默认 60), 完整原文落到本地缓存
|
|
6
|
+
* (**每个会话最多 10 条**, 超出丢最旧), AI 需要时用 `quote_view` 工具取(默认最新一条)。
|
|
7
|
+
*
|
|
8
|
+
* 存储: `{dataRoot}/.qqbot/quote-cache.json`
|
|
9
|
+
* `{ seq: 自增编号, map: { "group:<gid>" | "c2c:<openid>": [{id,text,sender,at}, …] } }`
|
|
10
|
+
* 编号全局自增(人也能在文件里直接看/对号), 每个会话各自留最近 10 条。
|
|
11
|
+
*/
|
|
12
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { dirname, join } from 'node:path';
|
|
14
|
+
/** 每个会话保留的条数(主人定: 最多 10 条) */
|
|
15
|
+
export const QUOTE_CACHE_MAX = 10;
|
|
16
|
+
const cache = new Map();
|
|
17
|
+
function fileOf(dataRoot) {
|
|
18
|
+
return join(dataRoot, '.qqbot', 'quote-cache.json');
|
|
19
|
+
}
|
|
20
|
+
function load(dataRoot) {
|
|
21
|
+
const hit = cache.get(dataRoot);
|
|
22
|
+
if (hit)
|
|
23
|
+
return hit;
|
|
24
|
+
let data = { seq: 0, map: {} };
|
|
25
|
+
try {
|
|
26
|
+
const raw = JSON.parse(readFileSync(fileOf(dataRoot), 'utf8'));
|
|
27
|
+
if (raw && typeof raw === 'object' && raw.map && typeof raw.map === 'object') {
|
|
28
|
+
data = { seq: Number(raw.seq) || 0, map: raw.map };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch { /* 首次/损坏 → 空缓存 */ }
|
|
32
|
+
cache.set(dataRoot, data);
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
function save(dataRoot, data) {
|
|
36
|
+
try {
|
|
37
|
+
const p = fileOf(dataRoot);
|
|
38
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
39
|
+
writeFileSync(p, JSON.stringify(data), 'utf8');
|
|
40
|
+
}
|
|
41
|
+
catch { /* 缓存写失败不影响主链 */ }
|
|
42
|
+
}
|
|
43
|
+
/** 存一条引用原文, 返回它的编号(超上限丢最旧) */
|
|
44
|
+
export function pushQuote(dataRoot, key, text, sender) {
|
|
45
|
+
const data = load(dataRoot);
|
|
46
|
+
const entry = { id: (data.seq += 1), text: String(text || ''), sender, at: Date.now() };
|
|
47
|
+
const list = Array.isArray(data.map[key]) ? data.map[key] : [];
|
|
48
|
+
list.push(entry);
|
|
49
|
+
data.map[key] = list.slice(-QUOTE_CACHE_MAX);
|
|
50
|
+
save(dataRoot, data);
|
|
51
|
+
return entry;
|
|
52
|
+
}
|
|
53
|
+
/** 某会话的引用列表(新→旧) */
|
|
54
|
+
export function listQuotes(dataRoot, key) {
|
|
55
|
+
const list = load(dataRoot).map[key];
|
|
56
|
+
return Array.isArray(list) ? [...list].reverse() : [];
|
|
57
|
+
}
|
|
58
|
+
/** 按编号取; 不传 id = 最新一条; 传了但不在本会话 = undefined */
|
|
59
|
+
export function getQuote(dataRoot, key, id) {
|
|
60
|
+
const list = load(dataRoot).map[key];
|
|
61
|
+
if (!Array.isArray(list) || list.length === 0)
|
|
62
|
+
return undefined;
|
|
63
|
+
if (typeof id === 'number' && Number.isFinite(id))
|
|
64
|
+
return list.find((x) => x.id === id);
|
|
65
|
+
return list[list.length - 1];
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=quote-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-cache.js","sourceRoot":"","sources":["../../src/features/quote-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* self-disclosure.ts — 「群友自述」检测(2026-09-14 主人定:按关键词命中)
|
|
3
|
+
*
|
|
4
|
+
* 用途:给小传补上**主动留意**那一步 —— 群里有人说了**关于他自己的事实**(身份/喜好/经历),
|
|
5
|
+
* 就给她一条**临时**提醒(零常驻开销),她才知道该动笔。
|
|
6
|
+
*
|
|
7
|
+
* 为什么用关键词、不让 AI 自己判断:主人 9-13 定过"用法不写进守则,常驻注入每轮都占 token",
|
|
8
|
+
* 而"是不是在说他自己的事"这件事,几个高置信句式就能抓住:
|
|
9
|
+
* · **误报代价极小** —— 最多她多记一条没用的(能删,且一天只有 3 条额度);
|
|
10
|
+
* · **漏报也无害** —— 下次他再说还会触发。
|
|
11
|
+
* 所以宁可保守,只抓高置信的;拿不准的一律不提醒。
|
|
12
|
+
*/
|
|
13
|
+
export interface SelfDisclosureHit {
|
|
14
|
+
/** 命中的句式(写进提醒文案,便于她自己复核) */
|
|
15
|
+
matched: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 判断一段话是不是"他在说自己的事"。命中返回 {matched},否则 undefined。
|
|
19
|
+
* 门槛刻意保守:太短太长不看、疑问句不看、命中排除词不看。
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectSelfDisclosure(text: string): SelfDisclosureHit | undefined;
|
|
22
|
+
/** 注入给她看的提醒(一行,别写成命令式 —— 是"可以",不是"必须") */
|
|
23
|
+
export declare function selfDisclosureHint(hit: SelfDisclosureHit, senderName: string): string;
|
|
24
|
+
/** 今天已经提醒过几次 */
|
|
25
|
+
export declare function hintCountToday(key: string, now?: number): number;
|
|
26
|
+
/** 记一次提醒(返回 false 表示今天额度已满、这次不该提醒) */
|
|
27
|
+
export declare function bumpHint(key: string, now?: number): boolean;
|
|
28
|
+
//# sourceMappingURL=self-disclosure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-disclosure.d.ts","sourceRoot":"","sources":["../../src/features/self-disclosure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAOhF;AAED,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGrF;AAQD,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAIpE;AAED,sCAAsC;AACtC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,OAAO,CAO/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** 高置信自述句式:主语是"我" + 关于自己的动词/判断 */
|
|
2
|
+
const PATTERNS = [
|
|
3
|
+
{ label: '我是/叫/来自', re: /我(是|叫|来自|住在)/ },
|
|
4
|
+
{ label: '我玩/做/干', re: /我(玩|做|干|搞)(过|了|的|着)?/ },
|
|
5
|
+
{ label: '我喜欢/爱/讨厌', re: /我(喜欢|爱|讨厌|迷|不吃|只看)/ },
|
|
6
|
+
// ⚠️ 允许"我 + 少量字 + 有/会/能":实测最典型的是「我**哔哩哔哩**有十万粉丝」这种中间插平台/地名的说法
|
|
7
|
+
{ label: '我有/会/能', re: /我[^,。!?\s]{0,6}(有|会|能)(过|了|的)?/ },
|
|
8
|
+
{ label: '我最近/上次/以前/平时', re: /我(最近|上次|以前|平时|一直|现在)/ },
|
|
9
|
+
{ label: '我的…是/叫', re: /我的[^,。!?]{1,10}(是|叫)/ },
|
|
10
|
+
];
|
|
11
|
+
/** 排除:不是"关于他自己的事实" */
|
|
12
|
+
const EXCLUDES = [
|
|
13
|
+
/我(该|要不要|是不是|能不能|可以|得|想)/, // 提问 / 征求意见
|
|
14
|
+
/我(刚|刚才|上面|下面|这个|那个|这|那)/, // 指代当下(临场的东西)
|
|
15
|
+
/我(看到|听说|觉得|以为|猜|怀疑|感觉)/, // 观点 / 转述,不是关于自己的事实
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* 判断一段话是不是"他在说自己的事"。命中返回 {matched},否则 undefined。
|
|
19
|
+
* 门槛刻意保守:太短太长不看、疑问句不看、命中排除词不看。
|
|
20
|
+
*/
|
|
21
|
+
export function detectSelfDisclosure(text) {
|
|
22
|
+
const t = String(text || '').trim();
|
|
23
|
+
if (t.length < 8 || t.length > 400)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (/[??]\s*$/.test(t))
|
|
26
|
+
return undefined;
|
|
27
|
+
for (const ex of EXCLUDES)
|
|
28
|
+
if (ex.test(t))
|
|
29
|
+
return undefined;
|
|
30
|
+
for (const p of PATTERNS)
|
|
31
|
+
if (p.re.test(t))
|
|
32
|
+
return { matched: p.label };
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
/** 注入给她看的提醒(一行,别写成命令式 —— 是"可以",不是"必须") */
|
|
36
|
+
export function selfDisclosureHint(hit, senderName) {
|
|
37
|
+
const who = String(senderName || '').trim() || '对方';
|
|
38
|
+
return `【小传提醒】${who}这段话像是在说他**自己**的事(命中"${hit.matched}")。如果那确实算"旁人也复述得出的客观事实"(身份/喜好/经历),可以顺手用 people_memo 记一条;不是事实、或者只是随口一提,就别记。`;
|
|
39
|
+
}
|
|
40
|
+
// ── 提醒节流(内存;防止她天天被同一个人同一件事叨扰) ──
|
|
41
|
+
/** 每人每天最多提醒几次(够用又不唠叨) */
|
|
42
|
+
const MAX_HINT_PER_DAY = 2;
|
|
43
|
+
const hintCount = new Map();
|
|
44
|
+
/** 今天已经提醒过几次 */
|
|
45
|
+
export function hintCountToday(key, now = Date.now()) {
|
|
46
|
+
const day = new Date(now).toDateString();
|
|
47
|
+
const hit = hintCount.get(key);
|
|
48
|
+
return hit && hit.day === day ? hit.n : 0;
|
|
49
|
+
}
|
|
50
|
+
/** 记一次提醒(返回 false 表示今天额度已满、这次不该提醒) */
|
|
51
|
+
export function bumpHint(key, now = Date.now()) {
|
|
52
|
+
const day = new Date(now).toDateString();
|
|
53
|
+
const hit = hintCount.get(key);
|
|
54
|
+
const n = hit && hit.day === day ? hit.n : 0;
|
|
55
|
+
if (n >= MAX_HINT_PER_DAY)
|
|
56
|
+
return false;
|
|
57
|
+
hintCount.set(key, { day, n: n + 1 });
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=self-disclosure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-disclosure.js","sourceRoot":"","sources":["../../src/features/self-disclosure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tendency-samples.ts — 倾向例句库(亲近 / 拒绝 / 任务,中英双语)
|
|
3
|
+
*
|
|
4
|
+
* 用途:本地小模型(bge-small-zh)只做相似度 —— 把「大模型的思考文本」与这三组例句比,
|
|
5
|
+
* 判她心里对眼前这件事是**亲近**(想为对方多做点)、**拒绝**(这事不做 / 守线 / 回绝)
|
|
6
|
+
* 还是**任务**(流程与职责判断)。
|
|
7
|
+
* ⚠️ 语言必须对得上:中文思考配 zh 例库,英文配 en 例库;跨语言不比(中文模型嵌不了英文)。
|
|
8
|
+
* ⚠️ 只是**弱信号**:观察期只记录,不参与行为;绝不用它冷落人。
|
|
9
|
+
*
|
|
10
|
+
* 档位定名史(免得后人改回去):
|
|
11
|
+
* · 2026-09-13 初版叫「疏离」,例句偏"说话简洁/克制" → 把"没叫我我静默"整片误判成疏离;
|
|
12
|
+
* · 2026-09-13 晚校准:疏离只留"对人的冷淡",静默类挪进「任务」(主人:"静默确实是任务,我设计的");
|
|
13
|
+
* · 2026-09-14 主人定案:第三档改名「**拒绝**」—— 它装的不是"对人冷淡",
|
|
14
|
+
* 而是"**对内容/请求说不、同时守着礼貌与分寸**"(实测样本:9-12 拒绝"萝莉向"请求那几轮)。
|
|
15
|
+
*/
|
|
16
|
+
export type TendencyLabel = '亲近' | '拒绝' | '任务';
|
|
17
|
+
export declare const TENDENCY_SAMPLES: Record<TendencyLabel, {
|
|
18
|
+
zh: readonly string[];
|
|
19
|
+
en: readonly string[];
|
|
20
|
+
}>;
|
|
21
|
+
export declare const TENDENCY_LABELS: readonly TendencyLabel[];
|
|
22
|
+
//# sourceMappingURL=tendency-samples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tendency-samples.d.ts","sourceRoot":"","sources":["../../src/features/tendency-samples.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE;IAAE,EAAE,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CA+LpG,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAAuB,CAAC"}
|