@aalis/plugin-user-relation 0.4.1

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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/dist/actions.d.ts +13 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +705 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/commands.d.ts +46 -0
  7. package/dist/commands.d.ts.map +1 -0
  8. package/dist/commands.js +601 -0
  9. package/dist/commands.js.map +1 -0
  10. package/dist/consolidate-llm.d.ts +150 -0
  11. package/dist/consolidate-llm.d.ts.map +1 -0
  12. package/dist/consolidate-llm.js +373 -0
  13. package/dist/consolidate-llm.js.map +1 -0
  14. package/dist/extractor.d.ts +308 -0
  15. package/dist/extractor.d.ts.map +1 -0
  16. package/dist/extractor.js +1356 -0
  17. package/dist/extractor.js.map +1 -0
  18. package/dist/index.d.ts +33 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +626 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/middleware.d.ts +41 -0
  23. package/dist/middleware.d.ts.map +1 -0
  24. package/dist/middleware.js +281 -0
  25. package/dist/middleware.js.map +1 -0
  26. package/dist/rename-watcher.d.ts +16 -0
  27. package/dist/rename-watcher.d.ts.map +1 -0
  28. package/dist/rename-watcher.js +16 -0
  29. package/dist/rename-watcher.js.map +1 -0
  30. package/dist/service.d.ts +1108 -0
  31. package/dist/service.d.ts.map +1 -0
  32. package/dist/service.js +4462 -0
  33. package/dist/service.js.map +1 -0
  34. package/dist/store.d.ts +89 -0
  35. package/dist/store.d.ts.map +1 -0
  36. package/dist/store.js +207 -0
  37. package/dist/store.js.map +1 -0
  38. package/dist/tools.d.ts +48 -0
  39. package/dist/tools.d.ts.map +1 -0
  40. package/dist/tools.js +1630 -0
  41. package/dist/tools.js.map +1 -0
  42. package/dist/types.d.ts +432 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +94 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/utils.d.ts +419 -0
  47. package/dist/utils.d.ts.map +1 -0
  48. package/dist/utils.js +1630 -0
  49. package/dist/utils.js.map +1 -0
  50. package/package.json +57 -0
@@ -0,0 +1,601 @@
1
+ import { useCommandService } from '@aalis/plugin-commands-api';
2
+ import { sendPlatformMessage } from '@aalis/plugin-platform-api';
3
+ import { getKnownPlatformsLower, isPlaceholderSelfPersonId } from './extractor.js';
4
+ export function registerRelationCommands(ctx, service, options) {
5
+ const cmds = useCommandService(ctx);
6
+ // ---- show ----
7
+ cmds
8
+ .command('relation.show <kind:string> <id:text>', '查看关系图中某节点及其直连边')
9
+ .example('relation show person onebot:1234567')
10
+ .example('relation show entity 9f3a2b...')
11
+ .action(async (_argv, kindArg, idArg) => {
12
+ const kind = String(kindArg ?? '').toLowerCase();
13
+ const id = String(idArg ?? '').trim();
14
+ if (!id)
15
+ return '用法: relation show <person|event|entity> <id>';
16
+ const snap = await service.loadAll();
17
+ if (kind === 'person') {
18
+ if (!id.includes(':'))
19
+ return 'person id 应为 platform:userId';
20
+ const p = snap.persons.find(x => x.id === id);
21
+ if (!p)
22
+ return `未找到 person: ${id}`;
23
+ const nb = await service.getNeighborhood(id);
24
+ return formatPerson(p, nb.events, nb.entities, nb.edges);
25
+ }
26
+ if (kind === 'event') {
27
+ const e = snap.events.find(x => x.id === id);
28
+ if (!e)
29
+ return `未找到 event: ${id}`;
30
+ const edges = snap.edges.filter(ed => (ed.kind === 'person-event' && ed.toEventId === id) ||
31
+ (ed.kind === 'event-event' && (ed.fromEventId === id || ed.toEventId === id)));
32
+ return formatEvent(e, edges);
33
+ }
34
+ if (kind === 'entity') {
35
+ const ent = snap.entities.find(x => x.id === id);
36
+ if (!ent)
37
+ return `未找到 entity: ${id}`;
38
+ const edges = snap.edges.filter(ed => ed.kind === 'person-entity' && ed.toEntityId === id);
39
+ return formatEntity(ent, edges);
40
+ }
41
+ return `未知 kind: ${kind}(应为 person / event / entity)`;
42
+ });
43
+ // ---- orphans (list) ----
44
+ cmds.command('relation.orphans', '列出图中所有孤立点(不被任何边引用)').action(async () => {
45
+ const snap = await service.loadAll();
46
+ const { orphanPersons, orphanEvents, orphanEntities } = collectOrphans(snap);
47
+ if (orphanPersons.length + orphanEvents.length + orphanEntities.length === 0) {
48
+ return '✓ 无孤立点。';
49
+ }
50
+ const lines = ['# 孤立点'];
51
+ if (orphanPersons.length) {
52
+ lines.push(`## 人物 (${orphanPersons.length})`);
53
+ for (const p of orphanPersons)
54
+ lines.push(`- ${p.id} ${p.displayName ?? ''}`);
55
+ }
56
+ if (orphanEvents.length) {
57
+ lines.push(`## 事件 (${orphanEvents.length})`);
58
+ for (const e of orphanEvents)
59
+ lines.push(`- ${e.id} ${e.title}`);
60
+ }
61
+ if (orphanEntities.length) {
62
+ lines.push(`## 实体 (${orphanEntities.length})`);
63
+ for (const e of orphanEntities)
64
+ lines.push(`- ${e.id} [${e.entityKind}] ${e.name}`);
65
+ }
66
+ return lines.join('\n');
67
+ });
68
+ // ---- cleanup person/event/entity ----
69
+ cmds
70
+ .command('relation.cleanup.person <id:text>', '删除人物及其所有相关边', { visibility: 'restricted' })
71
+ .action(async (_argv, idArg) => {
72
+ const id = String(idArg ?? '').trim();
73
+ if (!id.includes(':'))
74
+ return 'person id 应为 platform:userId';
75
+ const [platform, userId] = id.split(':', 2);
76
+ const r = await service.deletePerson(platform, userId);
77
+ return `✓ 已删除 person ${id}(级联 ${r.deletedEdges} 条边)`;
78
+ });
79
+ // ---- forget-me:用户自助清理自己的节点 ----
80
+ // 注意:只能清掉「自己作为发言者」被记录的节点和直接挂在节点上的边;
81
+ // 别人在事件 title / evidence 里**提及**你的名字(纯字符串)无法清理——
82
+ // 因为这种情况下系统压根没把"你"识别为一个节点,没有 id 可定位。
83
+ cmds
84
+ .command('relation.forget-me', '清理我自己在关系图中的节点与直接关联(不清理别人对我的文本提及)')
85
+ .action(async (argv) => {
86
+ const { platform, userId } = argv.session;
87
+ if (!platform || !userId)
88
+ return '当前会话无法识别你的身份(缺少 platform / userId)';
89
+ const id = `${platform}:${userId}`;
90
+ const snap = await service.loadAll();
91
+ const exists = snap.persons.some(p => p.id === id);
92
+ if (!exists)
93
+ return `✓ 关系图中没有你的节点(${id}),无需清理。`;
94
+ const r = await service.deletePerson(platform, userId);
95
+ return `✓ 已删除你的节点 ${id}(级联 ${r.deletedEdges} 条边)。注意:别人在事件文本中提到你的字符串不会被清理。`;
96
+ });
97
+ cmds
98
+ .command('relation.cleanup.event <id:text>', '删除事件及其所有相关边', { visibility: 'restricted' })
99
+ .action(async (_argv, idArg) => {
100
+ const id = String(idArg ?? '').trim();
101
+ if (!id)
102
+ return '请提供 event id';
103
+ const r = await service.deleteEvent(id);
104
+ return `✓ 已删除 event ${id}(级联 ${r.deletedEdges} 条边)`;
105
+ });
106
+ cmds
107
+ .command('relation.cleanup.entity <id:text>', '删除实体及其所有相关边', { visibility: 'restricted' })
108
+ .action(async (_argv, idArg) => {
109
+ const id = String(idArg ?? '').trim();
110
+ if (!id)
111
+ return '请提供 entity id';
112
+ const r = await service.deleteEntity(id);
113
+ return `✓ 已删除 entity ${id}(级联 ${r.deletedEdges} 条边)`;
114
+ });
115
+ cmds.command('relation.cleanup.orphans', '一键清理所有孤立点', { visibility: 'restricted' }).action(async () => {
116
+ const snap = await service.loadAll();
117
+ const { orphanPersons, orphanEvents, orphanEntities } = collectOrphans(snap);
118
+ let deleted = 0;
119
+ for (const p of orphanPersons) {
120
+ await service.deletePerson(p.platform, p.userId);
121
+ deleted++;
122
+ }
123
+ for (const e of orphanEvents) {
124
+ await service.deleteEvent(e.id);
125
+ deleted++;
126
+ }
127
+ for (const e of orphanEntities) {
128
+ await service.deleteEntity(e.id);
129
+ deleted++;
130
+ }
131
+ return `✓ 已清理 ${deleted} 个孤立点(人物 ${orphanPersons.length} / 事件 ${orphanEvents.length} / 实体 ${orphanEntities.length})`;
132
+ });
133
+ // ---- cleanup fake-self ----
134
+ // 专门清理 LLM 误抽出的「伪 person」占位:platform 不在运行时白名单
135
+ // (`getPlatformNames(ctx)`) 中,或者 userId 命中通用占位词 `{self, me, bot, assistant}`。
136
+ // 以往的「aalis:aalis / aalis:self / onebot:aalis」都被该规则覆盖,且同时 persona-agnostic
137
+ // (改 persona 名为 Mia / 任意名字都不需要改代码)。依赖 extractor.isPlaceholderSelfPersonId
138
+ // 保证与写入守卫、consolidate 三处口径一致。
139
+ cmds
140
+ .command('relation.cleanup.fake-self', '清理 LLM 误抽的伪 person(platform 不在运行时白名单或 userId 为 self/me/bot/assistant)', {
141
+ visibility: 'restricted',
142
+ })
143
+ .option('dry-run', '--dry-run', { description: '只列出会被删的节点,不实际删除' })
144
+ .action(async (argv) => {
145
+ const snap = await service.loadAll();
146
+ const knownPlatforms = getKnownPlatformsLower(ctx);
147
+ const fakes = snap.persons.filter(p => isPlaceholderSelfPersonId(p.platform, p.userId, knownPlatforms));
148
+ if (fakes.length === 0)
149
+ return '✓ 未发现伪 person。';
150
+ const dry = argv.options['dry-run'] === true;
151
+ const lines = [
152
+ dry ? `[dry-run] 将删除 ${fakes.length} 个伪 person:` : `已删除 ${fakes.length} 个伪 person:`,
153
+ ];
154
+ let edgesTotal = 0;
155
+ for (const p of fakes) {
156
+ if (dry) {
157
+ const incident = snap.edges.filter(ed => (ed.kind === 'person-event' && ed.fromPersonId === p.id) ||
158
+ (ed.kind === 'person-entity' && ed.fromPersonId === p.id) ||
159
+ (ed.kind === 'person-person' && (ed.fromPersonId === p.id || ed.toPersonId === p.id)));
160
+ lines.push(`- ${p.id} ${p.displayName ?? ''} (级联 ${incident.length} 边)`);
161
+ edgesTotal += incident.length;
162
+ }
163
+ else {
164
+ const r = await service.deletePerson(p.platform, p.userId);
165
+ lines.push(`- ${p.id} ${p.displayName ?? ''} (级联删 ${r.deletedEdges} 边)`);
166
+ edgesTotal += r.deletedEdges;
167
+ }
168
+ }
169
+ lines.push(dry ? `[dry-run] 合计会级联删 ${edgesTotal} 边。去掉 --dry-run 实际执行。` : `合计级联删 ${edgesTotal} 边。`);
170
+ return lines.join('\n');
171
+ });
172
+ cmds
173
+ .command('relation.cleanup.all', '⚠ 危险:清空整个关系图(需要 --yes 确认)', {
174
+ visibility: 'restricted',
175
+ })
176
+ .option('yes', '--yes', { description: '确认执行' })
177
+ .action(async (argv) => {
178
+ if (argv.options.yes !== true) {
179
+ return '⚠ 该操作将删除所有人物 / 事件 / 实体 / 边。如确实需要,请追加 --yes。';
180
+ }
181
+ const snap = await service.loadAll();
182
+ let n = 0;
183
+ for (const p of snap.persons) {
184
+ await service.deletePerson(p.platform, p.userId);
185
+ n++;
186
+ }
187
+ for (const e of snap.events) {
188
+ await service.deleteEvent(e.id);
189
+ n++;
190
+ }
191
+ for (const e of snap.entities) {
192
+ await service.deleteEntity(e.id);
193
+ n++;
194
+ }
195
+ return `✓ 已清空关系图(删除 ${n} 个节点)`;
196
+ });
197
+ /**
198
+ * 长任务前的"立即反馈":fire-and-forget 推送一条 ack 给当前会话,
199
+ * 让用户知道命令已被接到、正在跑(consolidate/compress 在大图上可能跑数秒到数十秒)。
200
+ * - 失败静默(CLI 会话没有 platform adapter 会抛错,不影响主流程)
201
+ * - 不 await 完成,纯并发
202
+ */
203
+ function ackBackground(sessionId, platform, text) {
204
+ // internal 平台(scheduler / workflow 等系统触发)没有真实用户等待,跳过推送
205
+ if (platform === 'internal')
206
+ return;
207
+ void sendPlatformMessage(ctx, sessionId, text).catch(err => {
208
+ ctx.logger?.debug?.(`[user-relation] 立即反馈推送失败(可忽略):${err.message}`);
209
+ });
210
+ }
211
+ /**
212
+ * 进程内 per-command mutex:避免用户连按两次 /relation maintain 等长任务命令时
213
+ * 后台叠加两份相同写流程(PageRank / consolidate LLM 都很贵且会改图,并发跑会
214
+ * 互相覆盖统计、白白浪费 token)。第二次调用立即返回 ack 文本,不阻塞 commands
215
+ * 路由。锁的粒度是**命令名**,跨命令仍可并发(与原有行为一致)。
216
+ */
217
+ const runningCommands = new Map(); // commandName → startedAt epoch ms
218
+ function tryAcquireCommand(name) {
219
+ const startedAt = runningCommands.get(name);
220
+ if (startedAt !== undefined) {
221
+ return { ok: false, elapsedSec: Math.max(1, Math.round((Date.now() - startedAt) / 1000)) };
222
+ }
223
+ runningCommands.set(name, Date.now());
224
+ return { ok: true };
225
+ }
226
+ function releaseCommand(name) {
227
+ runningCommands.delete(name);
228
+ }
229
+ // ---- consolidate(整理:别名候选 / 自动 part-of / 旧账去重) ----
230
+ cmds
231
+ .command('relation.consolidate', '整理关系图:扫描别名候选、自动 part-of、规范化 PersonEventEdge', {
232
+ visibility: 'restricted',
233
+ })
234
+ .option('auto-link', '--auto-link', { description: '将高置信别名候选自动建为 is-alias-of 边' })
235
+ .option('no-llm', '--no-llm', { description: '跳过 consolidationModel 配置的 LLM 增强(A 核验 + B 摘要重写)' })
236
+ .action(async (argv) => {
237
+ const gate = tryAcquireCommand('relation.consolidate');
238
+ if (!gate.ok)
239
+ return `⏳ 上一次 /relation consolidate 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
240
+ try {
241
+ const autoLink = argv.options['auto-link'] === true;
242
+ const useLlm = argv.options['no-llm'] !== true && !!options?.consolidateLLM;
243
+ ackBackground(argv.session.sessionId, argv.session.platform, `⏳ 正在整理关系图(autoLink=${autoLink ? 'on' : 'off'},LLM=${useLlm ? 'on' : 'off'}),请稍候…`);
244
+ const r = await service.consolidate({
245
+ autoLink,
246
+ triggerSource: 'manual',
247
+ ctx,
248
+ ...(options?.consolidateSkipLowScorePairs !== undefined
249
+ ? { skipLowScorePairs: options.consolidateSkipLowScorePairs }
250
+ : {}),
251
+ ...(options?.consolidateLowScoreThreshold !== undefined
252
+ ? { lowScoreThreshold: options.consolidateLowScoreThreshold }
253
+ : {}),
254
+ ...(useLlm && options?.consolidateLLM
255
+ ? {
256
+ llm: {
257
+ ctx,
258
+ modelRef: options.consolidateLLM.modelRef,
259
+ disableThinking: options.consolidateLLM.disableThinking ?? true,
260
+ },
261
+ }
262
+ : {}),
263
+ });
264
+ const lines = [
265
+ '关系图整理完成:',
266
+ `- 别名候选:${r.aliasCandidates.length} 对(auto-link=${autoLink ? 'on' : 'off'},已建 ${r.aliasEdgesCreated} 条 is-alias-of 边)`,
267
+ `- 自动 part-of:新增 ${r.partOfEdgesCreated} 条 event-entity[part-of] 边`,
268
+ `- EventEntityEdge 去重:${r.eventEdgesNormalized} 组重整`,
269
+ `- 实体层级候选:${r.entityHierarchyCandidates} 对,新增 ${r.entityHierarchyEdgesCreated} 条 entity-entity[part-of] 边`,
270
+ `- 侧向父候选:${r.lateralParentCandidates} 簇,新建父实体 ${r.lateralParentsCreated} 个,新增 ${r.lateralEdgesCreated} 条侧向 part-of 边`,
271
+ ];
272
+ if (useLlm) {
273
+ lines.push(`- LLM 核验:通过 ${r.llmVerified ?? 0},否决 ${r.llmRejected ?? 0};摘要重写 ${r.summariesRewritten ?? 0} 条`);
274
+ }
275
+ if (r.aliasCandidates.length > 0) {
276
+ lines.push('', '别名候选(前 10 条):');
277
+ for (const c of r.aliasCandidates.slice(0, 10)) {
278
+ lines.push(` · [${c.aKind}] ${c.aId} ↔ [${c.bKind}] ${c.bId} — ${c.reason}`);
279
+ }
280
+ }
281
+ return lines.join('\n');
282
+ }
283
+ finally {
284
+ releaseCommand('relation.consolidate');
285
+ }
286
+ });
287
+ // ---- rewrite-weights(手动触发 eager 时间衰减回写) ----
288
+ cmds
289
+ .command('relation.rewrite-weights', '关系图:把 event/entity/edge 的 weight 字段物理回写为当前 effectiveWeight(时间衰减落地)', { visibility: 'restricted' })
290
+ .action(async (argv) => {
291
+ const gate = tryAcquireCommand('relation.rewrite-weights');
292
+ if (!gate.ok)
293
+ return `⏳ 上一次 /relation rewrite-weights 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
294
+ try {
295
+ const ev = options?.eviction;
296
+ const halfLifeDays = ev?.weightDecayHalfLifeDays ?? 180;
297
+ const floor = ev?.weightDecayFloor ?? 0.3;
298
+ if (halfLifeDays <= 0) {
299
+ return `weight 衰减未启用(halfLifeDays=${halfLifeDays}),无需回写。`;
300
+ }
301
+ ackBackground(argv.session.sessionId, argv.session.platform, `⏳ 正在按 halfLifeDays=${halfLifeDays}、floor=${floor} 回写 weight,请稍候…`);
302
+ const r = await service.rewriteWeights({ halfLifeDays, floor });
303
+ if (r.skipped) {
304
+ return 'weight 衰减未启用,已跳过。';
305
+ }
306
+ return [
307
+ '✓ weight 时间衰减回写完成:',
308
+ `- 事件:写回 ${r.events} 条`,
309
+ `- 实体:写回 ${r.entities} 条`,
310
+ `- 边: 写回 ${r.edges} 条`,
311
+ `(参数:halfLifeDays=${halfLifeDays}, floor=${floor})`,
312
+ ].join('\n');
313
+ }
314
+ finally {
315
+ releaseCommand('relation.rewrite-weights');
316
+ }
317
+ });
318
+ // ---- event-duplicates(dry-run:列出 event 重复合并候选,不实际合并) ----
319
+ cmds
320
+ .command('relation.event-duplicates', '关系图:扫描事件节点重复合并候选(dry-run,不修改图)。三段式:embedding/jaccard + 结构相似 + LLM 终判', { visibility: 'restricted' })
321
+ .action(async (argv) => {
322
+ const gate = tryAcquireCommand('relation.event-duplicates');
323
+ if (!gate.ok)
324
+ return `⏳ 上一次 /relation event-duplicates 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
325
+ try {
326
+ ackBackground(argv.session.sessionId, argv.session.platform, '⏳ 正在扫描 event 重复候选(同 sessionScope / 都 global),请稍候…');
327
+ const useLlm = !!options?.consolidateLLM;
328
+ const r = await service.findEventDuplicates({
329
+ ...(useLlm && options?.consolidateLLM
330
+ ? {
331
+ llm: {
332
+ ctx,
333
+ modelRef: options.consolidateLLM.modelRef,
334
+ disableThinking: options.consolidateLLM.disableThinking ?? true,
335
+ },
336
+ }
337
+ : {}),
338
+ });
339
+ const lines = [];
340
+ lines.push(`✓ event 重复扫描完成(embedding ${r.embeddingAvailable ? '可用' : '不可用,降级 jaccard'})`);
341
+ lines.push(`候选 ${r.candidates.length} 对,LLM 通过 ${r.llmVerified},LLM 否决 ${r.llmRejected},缓存命中 ${r.llmRejectCacheHits}`);
342
+ if (r.candidates.length > 0) {
343
+ lines.push('--- 候选明细(前 20 条)---');
344
+ for (const c of r.candidates.slice(0, 20)) {
345
+ const sims = c.fusedScore !== null
346
+ ? `fused=${c.fusedScore.toFixed(2)} (cos=${c.cosineScore?.toFixed(2)}, struct=${c.structuralScore.toFixed(2)})`
347
+ : `jac=${c.jaccardScore.toFixed(2)}, struct=${c.structuralScore.toFixed(2)}`;
348
+ const verdict = c.llmVerdict
349
+ ? `[${c.cacheHit ? '缓存' : c.llmVerdict.isSame ? '✓' : '✗'}] ${c.llmVerdict.reason}`
350
+ : '[未判]';
351
+ lines.push(` · [${c.sessionScope}] ${c.aTitle.slice(0, 18)} ↔ ${c.bTitle.slice(0, 18)} ${sims} ${verdict}`);
352
+ }
353
+ if (r.candidates.length > 20) {
354
+ lines.push(` …省略 ${r.candidates.length - 20} 条`);
355
+ }
356
+ }
357
+ return lines.join('\n');
358
+ }
359
+ finally {
360
+ releaseCommand('relation.event-duplicates');
361
+ }
362
+ });
363
+ // ---- compress(仅跳出一次容量淘汰 + 伤亡报告) ----
364
+ cmds
365
+ .command('relation.compress', '关系图压缩:手动触发容量淘汰(PageRank 低分 → 删 events/entities/edges)', {
366
+ visibility: 'restricted',
367
+ })
368
+ .action(async (argv) => {
369
+ const gate = tryAcquireCommand('relation.compress');
370
+ if (!gate.ok)
371
+ return `⏳ 上一次 /relation compress 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
372
+ try {
373
+ const ev = options?.eviction;
374
+ ackBackground(argv.session.sessionId, argv.session.platform, '⏳ 正在压缩关系图(孤儿清理 + PageRank 计算 + 容量淘汰),请稍候…');
375
+ const before = await service.loadAll();
376
+ let deletedPersons = 0;
377
+ let deletedEvents = 0;
378
+ let deletedEntities = 0;
379
+ let deletedEdges = 0;
380
+ if (ev && (ev.maxPersons > 0 || ev.maxEvents > 0 || ev.maxEntities > 0 || ev.maxEdges > 0)) {
381
+ // evictByQuota 内部已经先做 pruneOrphans,再做配额淘汰;不要在外面重复调
382
+ const r = await service.evictByQuota({
383
+ maxPersons: ev.maxPersons,
384
+ maxEvents: ev.maxEvents,
385
+ maxEntities: ev.maxEntities,
386
+ maxEdges: ev.maxEdges,
387
+ pagerankDamping: ev.pagerankDamping,
388
+ pagerankIterations: ev.pagerankIterations,
389
+ pagerankEpsilon: ev.pagerankEpsilon,
390
+ hysteresisPct: ev.hysteresisPct,
391
+ targetPct: ev.targetPct,
392
+ decay: {
393
+ halfLifeDays: ev.weightDecayHalfLifeDays ?? 180,
394
+ floor: ev.weightDecayFloor ?? 0.3,
395
+ },
396
+ communityAlgorithm: ev.communityAlgorithm,
397
+ });
398
+ deletedPersons = r.deletedPersons;
399
+ deletedEvents = r.deletedEvents;
400
+ deletedEntities = r.deletedEntities;
401
+ deletedEdges = r.deletedEdges;
402
+ }
403
+ else {
404
+ // 没配置配额:只清孤儿
405
+ const orphans = await service.pruneOrphans();
406
+ deletedPersons = orphans.deletedPersons;
407
+ deletedEvents = orphans.deletedEvents;
408
+ deletedEntities = orphans.deletedEntities;
409
+ }
410
+ const eventCap = ev?.maxEvents ?? 0;
411
+ const entityCap = ev?.maxEntities ?? 0;
412
+ const edgeCap = ev?.maxEdges ?? 0;
413
+ return [
414
+ '✓ 关系图压缩完成:',
415
+ `- 人物:${before.persons.length} → ${before.persons.length - deletedPersons}(删 ${deletedPersons} 个孤儿)`,
416
+ `- 事件:${before.events.length} → ${before.events.length - deletedEvents}(删 ${deletedEvents},阈 ${eventCap})`,
417
+ `- 实体:${before.entities.length} → ${before.entities.length - deletedEntities}(删 ${deletedEntities},阈 ${entityCap})`,
418
+ `- 边: ${before.edges.length} → ${before.edges.length - deletedEdges}(删 ${deletedEdges},阈 ${edgeCap})`,
419
+ ].join('\n');
420
+ }
421
+ finally {
422
+ releaseCommand('relation.compress');
423
+ }
424
+ });
425
+ // ---- maintain(整理 + 压缩 一步完成) ----
426
+ cmds
427
+ .command('relation.maintain', '关系图体检:先整理(别名 / part-of / 层级 / 侧向父),再压缩(容量淘汰),全过程报告', { visibility: 'restricted' })
428
+ .option('no-llm', '--no-llm', { description: '跳过 consolidate 阶段的 LLM 增强' })
429
+ .option('no-auto-link', '--no-auto-link', { description: '取消 consolidate 阶段的 autoLink' })
430
+ .action(async (argv) => {
431
+ const gate = tryAcquireCommand('relation.maintain');
432
+ if (!gate.ok)
433
+ return `⏳ 上一次 /relation maintain 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
434
+ try {
435
+ const ev = options?.eviction;
436
+ const useLlm = argv.options['no-llm'] !== true && !!options?.consolidateLLM;
437
+ const autoLink = argv.options['no-auto-link'] !== true && (options?.consolidateAutoLink ?? true);
438
+ ackBackground(argv.session.sessionId, argv.session.platform, `⏳ 正在体检关系图:先整理再压缩(autoLink=${autoLink ? 'on' : 'off'},LLM=${useLlm ? 'on' : 'off'}),请稍候…`);
439
+ // 顺序:先 consolidate(在原图上合并别名/层级/事件去重)→ 再 evict(在去重后的图上
440
+ // 跑 PageRank 淘汰),这样 PageRank 看到的入出度更完整、淘汰决策更稳,且每个阶段的
441
+ // 节点/边减量都可以独立精确计数(s0 → s1 为整理,s1 → s2 为压缩),不会再像之前
442
+ // "实体 87→87 但下一轮变 85→85" 那样把 consolidate 删的 alias 节点漏算到压缩行。
443
+ const s0 = await service.loadAll();
444
+ // step 1: consolidate
445
+ const cr = await service.consolidate({
446
+ autoLink,
447
+ triggerSource: 'manual',
448
+ ctx,
449
+ ...(options?.consolidateSkipLowScorePairs !== undefined
450
+ ? { skipLowScorePairs: options.consolidateSkipLowScorePairs }
451
+ : {}),
452
+ ...(options?.consolidateLowScoreThreshold !== undefined
453
+ ? { lowScoreThreshold: options.consolidateLowScoreThreshold }
454
+ : {}),
455
+ ...(useLlm && options?.consolidateLLM
456
+ ? {
457
+ llm: {
458
+ ctx,
459
+ modelRef: options.consolidateLLM.modelRef,
460
+ disableThinking: options.consolidateLLM.disableThinking ?? true,
461
+ },
462
+ }
463
+ : {}),
464
+ });
465
+ const s1 = await service.loadAll();
466
+ // step 2: compress
467
+ let evictionMode = 'orphans-only';
468
+ if (ev && (ev.maxPersons > 0 || ev.maxEvents > 0 || ev.maxEntities > 0 || ev.maxEdges > 0)) {
469
+ evictionMode = 'quota';
470
+ await service.evictByQuota({
471
+ maxPersons: ev.maxPersons,
472
+ maxEvents: ev.maxEvents,
473
+ maxEntities: ev.maxEntities,
474
+ maxEdges: ev.maxEdges,
475
+ pagerankDamping: ev.pagerankDamping,
476
+ pagerankIterations: ev.pagerankIterations,
477
+ pagerankEpsilon: ev.pagerankEpsilon,
478
+ hysteresisPct: ev.hysteresisPct,
479
+ targetPct: ev.targetPct,
480
+ decay: {
481
+ halfLifeDays: ev.weightDecayHalfLifeDays ?? 180,
482
+ floor: ev.weightDecayFloor ?? 0.3,
483
+ },
484
+ communityAlgorithm: ev.communityAlgorithm,
485
+ });
486
+ }
487
+ else {
488
+ await service.pruneOrphans();
489
+ }
490
+ const s2 = await service.loadAll();
491
+ // 报告:先整理后压缩,每行只反映本阶段的真实减量
492
+ const consolidateLine = `[1/2] 整理:人物 ${s0.persons.length}→${s1.persons.length},事件 ${s0.events.length}→${s1.events.length},` +
493
+ `实体 ${s0.entities.length}→${s1.entities.length},边 ${s0.edges.length}→${s1.edges.length};` +
494
+ `别名 ${cr.aliasCandidates.length} 候选/${cr.aliasEdgesCreated} 边,` +
495
+ `part-of 新增 ${cr.partOfEdgesCreated},事件边重整 ${cr.eventEdgesNormalized},` +
496
+ `层级 ${cr.entityHierarchyCandidates} 候选/${cr.entityHierarchyEdgesCreated} 边,` +
497
+ `侧向父 ${cr.lateralParentCandidates} 簇/新建 ${cr.lateralParentsCreated}/边 ${cr.lateralEdgesCreated}` +
498
+ (useLlm
499
+ ? `,LLM 通过 ${cr.llmVerified ?? 0} 否决 ${cr.llmRejected ?? 0} 摘要重写 ${cr.summariesRewritten ?? 0}`
500
+ : '');
501
+ const compressLine = evictionMode === 'quota'
502
+ ? `[2/2] 压缩:人物 ${s1.persons.length}→${s2.persons.length},事件 ${s1.events.length}→${s2.events.length},实体 ${s1.entities.length}→${s2.entities.length},边 ${s1.edges.length}→${s2.edges.length}`
503
+ : `[2/2] 压缩:仅清孤儿(未配置淘汰阈值)—人物 ${s1.persons.length}→${s2.persons.length},事件 ${s1.events.length}→${s2.events.length},实体 ${s1.entities.length}→${s2.entities.length},边 ${s1.edges.length}→${s2.edges.length}`;
504
+ return ['✓ 关系图体检完成:', consolidateLine, compressLine].join('\n');
505
+ }
506
+ finally {
507
+ releaseCommand('relation.maintain');
508
+ }
509
+ });
510
+ // ---- consolidation-status(查询最近一次 consolidate 运行情况) ----
511
+ cmds
512
+ .command('relation.consolidation-status', '查看最近一次关系图整理(consolidate)的运行时间、触发源与结果')
513
+ .action(async () => {
514
+ const info = service.getLastConsolidateInfo();
515
+ if (!info.lastRunAt) {
516
+ return ('⚠ 本次运行以来尚未执行过 consolidation。\n' +
517
+ '触发方式:/relation consolidate(手动)、/relation maintain(压缩后连着整理),或容量淘汰后自动触发。');
518
+ }
519
+ const time = new Date(info.lastRunAt).toLocaleString('zh-CN', { hour12: false });
520
+ const triggerLabel = info.trigger === 'manual' ? '手动' : info.trigger === 'eviction' ? '淘汰后自动' : 'API 调用';
521
+ return `✓ 最近一次 consolidation:${time}(触发方式:${triggerLabel})\n${info.summary ?? '(无详情)'}`;
522
+ });
523
+ }
524
+ // ───── helpers ─────
525
+ function collectOrphans(snap) {
526
+ const refPerson = new Set();
527
+ const refEvent = new Set();
528
+ const refEntity = new Set();
529
+ for (const e of snap.edges) {
530
+ if (e.kind === 'person-event') {
531
+ refPerson.add(e.fromPersonId);
532
+ refEvent.add(e.toEventId);
533
+ }
534
+ else if (e.kind === 'person-person') {
535
+ refPerson.add(e.fromPersonId);
536
+ refPerson.add(e.toPersonId);
537
+ }
538
+ else if (e.kind === 'person-entity') {
539
+ refPerson.add(e.fromPersonId);
540
+ refEntity.add(e.toEntityId);
541
+ }
542
+ else if (e.kind === 'event-event') {
543
+ refEvent.add(e.fromEventId);
544
+ refEvent.add(e.toEventId);
545
+ }
546
+ }
547
+ return {
548
+ orphanPersons: snap.persons.filter(p => !refPerson.has(p.id)),
549
+ orphanEvents: snap.events.filter(e => !refEvent.has(e.id)),
550
+ orphanEntities: snap.entities.filter(e => !refEntity.has(e.id)),
551
+ };
552
+ }
553
+ function formatPerson(p, events, entities, edges) {
554
+ const lines = [`# Person ${p.id}`, `displayName: ${p.displayName ?? '—'}`];
555
+ lines.push(`events (${events.length}):`);
556
+ for (const e of events.slice(0, 20))
557
+ lines.push(` - ${e.id} ${e.title}`);
558
+ lines.push(`entities (${entities.length}):`);
559
+ for (const e of entities.slice(0, 20))
560
+ lines.push(` - ${e.id} [${e.entityKind}] ${e.name}`);
561
+ lines.push(`edges (${edges.length}):`);
562
+ for (const e of edges.slice(0, 20))
563
+ lines.push(` - ${formatEdgeLine(e)}`);
564
+ return lines.join('\n');
565
+ }
566
+ function formatEvent(e, edges) {
567
+ const lines = [`# Event ${e.id}`, `title: ${e.title}`];
568
+ if (e.category)
569
+ lines.push(`category: ${e.category}`);
570
+ if (e.summary)
571
+ lines.push(`summary: ${e.summary}`);
572
+ lines.push(`edges (${edges.length}):`);
573
+ for (const ed of edges.slice(0, 30))
574
+ lines.push(` - ${formatEdgeLine(ed)}`);
575
+ return lines.join('\n');
576
+ }
577
+ function formatEntity(ent, edges) {
578
+ const lines = [`# Entity ${ent.id}`, `name: ${ent.name}`, `kind: ${ent.entityKind}`];
579
+ if (ent.aliases?.length)
580
+ lines.push(`aliases: ${ent.aliases.join(', ')}`);
581
+ if (ent.summary)
582
+ lines.push(`summary: ${ent.summary}`);
583
+ lines.push(`edges (${edges.length}):`);
584
+ for (const ed of edges.slice(0, 30))
585
+ lines.push(` - ${formatEdgeLine(ed)}`);
586
+ return lines.join('\n');
587
+ }
588
+ function formatEdgeLine(e) {
589
+ if (e.kind === 'person-event')
590
+ return `[${e.kind}] ${e.fromPersonId} → ${e.toEventId} (${e.role})`;
591
+ if (e.kind === 'person-person')
592
+ return `[${e.kind}] ${e.fromPersonId} → ${e.toPersonId} (${e.relationType})`;
593
+ if (e.kind === 'person-entity')
594
+ return `[${e.kind}] ${e.fromPersonId} → ${e.toEntityId} (${e.role})`;
595
+ if (e.kind === 'event-event')
596
+ return `[event-event] ${e.fromEventId} → ${e.toEventId} (${e.relationType})`;
597
+ if (e.kind === 'event-entity')
598
+ return `[event-entity] ${e.fromEventId} → ${e.toEntityId} (${e.relationType})`;
599
+ return `[entity-entity] ${e.fromEntityId} → ${e.toEntityId} (${e.relationType})`;
600
+ }
601
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}