@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
package/dist/store.js ADDED
@@ -0,0 +1,207 @@
1
+ export const RELATION_NAMESPACE = 'user-relation';
2
+ const PERSON_PREFIX = 'person:';
3
+ const EVENT_PREFIX = 'event:';
4
+ const ENTITY_PREFIX = 'entity:';
5
+ const EDGE_PREFIX = 'edge:';
6
+ const MERGE_REJECT_PREFIX = 'merge-reject:';
7
+ /** key 编码 / 解码 */
8
+ export function personKey(platform, userId) {
9
+ return `${PERSON_PREFIX}${platform}:${userId}`;
10
+ }
11
+ export function eventKey(eventId) {
12
+ return `${EVENT_PREFIX}${eventId}`;
13
+ }
14
+ function entityKey(entityId) {
15
+ return `${ENTITY_PREFIX}${entityId}`;
16
+ }
17
+ export function edgeKey(edgeId) {
18
+ return `${EDGE_PREFIX}${edgeId}`;
19
+ }
20
+ /**
21
+ * mergeReject 持久化缓存的 key:把两端 id 排序,得到对称稳定键。
22
+ * 用于 consolidate LLM 否决合并的去重缓存——下次 maintain 时若双方"真新关系"指标未变即可跳过 LLM。
23
+ *
24
+ * **失效信号(2026-05 改造)**:采用 `evidence.length` 作为"是否有新关系/新提及"的稳定信号。
25
+ * 旧版用 `lastReinforcedAt`,但该字段会被 evictByQuota → rewriteWeights 的衰减回写批量刷新,
26
+ * 导致缓存全量失效、连续 maintain 重复调 LLM。evidence.length 仅在节点真新增 evidence 时增长,
27
+ * 与衰减回写解耦,是更稳定的"分别没有新关系产生"指标。
28
+ * 旧字段 aReinforcedAt/bReinforcedAt 保留作为兼容信息,但**不再参与判断**。
29
+ */
30
+ function mergeRejectKey(aId, bId) {
31
+ const [x, y] = aId < bId ? [aId, bId] : [bId, aId];
32
+ return `${MERGE_REJECT_PREFIX}${x}|${y}`;
33
+ }
34
+ /** Memory 后端不支持 metadata 时使用的 NoOp 实现 —— 抛错而非静默吞掉,避免数据丢失被忽略 */
35
+ class UnsupportedMemoryError extends Error {
36
+ constructor() {
37
+ super('RelationStore 要求当前 memory 服务支持 "metadata" 能力 (saveMetadata/getMetadata/listMetadata/deleteMetadata)。' +
38
+ '请启用 plugin-memory-sqlite / plugin-memory-mongodb 或其他实现 metadata 能力的 memory 插件。');
39
+ this.name = 'UnsupportedMemoryError';
40
+ }
41
+ }
42
+ function assertMetadataSupport(memory) {
43
+ if (!memory.saveMetadata || !memory.getMetadata || !memory.listMetadata || !memory.deleteMetadata) {
44
+ throw new UnsupportedMemoryError();
45
+ }
46
+ }
47
+ export class RelationStore {
48
+ memory;
49
+ constructor(memory) {
50
+ this.memory = memory;
51
+ assertMetadataSupport(memory);
52
+ }
53
+ // ----- Person -----
54
+ async getPerson(platform, userId) {
55
+ const data = await this.memory.getMetadata(RELATION_NAMESPACE, personKey(platform, userId));
56
+ return data;
57
+ }
58
+ async upsertPerson(node) {
59
+ await this.memory.saveMetadata(RELATION_NAMESPACE, personKey(node.platform, node.userId), node);
60
+ }
61
+ async deletePerson(platform, userId) {
62
+ await this.memory.deleteMetadata(RELATION_NAMESPACE, personKey(platform, userId));
63
+ }
64
+ // ----- Event -----
65
+ async getEvent(eventId) {
66
+ const data = await this.memory.getMetadata(RELATION_NAMESPACE, eventKey(eventId));
67
+ return data;
68
+ }
69
+ async upsertEvent(node) {
70
+ await this.memory.saveMetadata(RELATION_NAMESPACE, eventKey(node.id), node);
71
+ }
72
+ async deleteEvent(eventId) {
73
+ await this.memory.deleteMetadata(RELATION_NAMESPACE, eventKey(eventId));
74
+ }
75
+ // ----- Entity -----
76
+ async getEntity(entityId) {
77
+ const data = await this.memory.getMetadata(RELATION_NAMESPACE, entityKey(entityId));
78
+ return data;
79
+ }
80
+ async upsertEntity(node) {
81
+ await this.memory.saveMetadata(RELATION_NAMESPACE, entityKey(node.id), node);
82
+ }
83
+ async deleteEntity(entityId) {
84
+ await this.memory.deleteMetadata(RELATION_NAMESPACE, entityKey(entityId));
85
+ }
86
+ // ----- Edge -----
87
+ async getEdge(edgeId) {
88
+ const data = await this.memory.getMetadata(RELATION_NAMESPACE, edgeKey(edgeId));
89
+ return data;
90
+ }
91
+ async upsertEdge(edge) {
92
+ await this.memory.saveMetadata(RELATION_NAMESPACE, edgeKey(edge.id), edge);
93
+ }
94
+ async deleteEdge(edgeId) {
95
+ await this.memory.deleteMetadata(RELATION_NAMESPACE, edgeKey(edgeId));
96
+ }
97
+ // ----- MergeReject 缓存(consolidate LLM 否决合并的持久化去重) -----
98
+ async getMergeReject(aId, bId) {
99
+ const data = await this.memory.getMetadata(RELATION_NAMESPACE, mergeRejectKey(aId, bId));
100
+ return data;
101
+ }
102
+ async saveMergeReject(record) {
103
+ await this.memory.saveMetadata(RELATION_NAMESPACE, mergeRejectKey(record.aId, record.bId), record);
104
+ }
105
+ async deleteMergeReject(aId, bId) {
106
+ await this.memory.deleteMetadata(RELATION_NAMESPACE, mergeRejectKey(aId, bId));
107
+ }
108
+ /** 列出全部 MergeReject 记录(webui / debug 用,体量预计 < 候选数)。 */
109
+ async listMergeRejects() {
110
+ const entries = await this.memory.listMetadata(RELATION_NAMESPACE);
111
+ const out = [];
112
+ for (const { key, data } of entries) {
113
+ if (key.startsWith(MERGE_REJECT_PREFIX))
114
+ out.push(data);
115
+ }
116
+ return out;
117
+ }
118
+ /** 当某个节点被合并/删除时,清理所有涉及它的 MergeReject 缓存(旧 id 不再有效)。 */
119
+ async deleteMergeRejectsByNode(nodeId) {
120
+ const entries = await this.memory.listMetadata(RELATION_NAMESPACE);
121
+ let deleted = 0;
122
+ for (const { key, data } of entries) {
123
+ if (!key.startsWith(MERGE_REJECT_PREFIX))
124
+ continue;
125
+ const r = data;
126
+ if (r.aId === nodeId || r.bId === nodeId) {
127
+ await this.memory.deleteMetadata(RELATION_NAMESPACE, key);
128
+ deleted++;
129
+ }
130
+ }
131
+ return deleted;
132
+ }
133
+ // ----- 全量加载(webui / 注入用) -----
134
+ async loadAll() {
135
+ const entries = await this.memory.listMetadata(RELATION_NAMESPACE);
136
+ const persons = [];
137
+ const events = [];
138
+ const entities = [];
139
+ const edges = [];
140
+ for (const { key, data } of entries) {
141
+ if (key.startsWith(PERSON_PREFIX))
142
+ persons.push(data);
143
+ else if (key.startsWith(EVENT_PREFIX))
144
+ events.push(data);
145
+ else if (key.startsWith(ENTITY_PREFIX))
146
+ entities.push(data);
147
+ else if (key.startsWith(EDGE_PREFIX))
148
+ edges.push(data);
149
+ // 其他 key 静默忽略,便于未来加扩展类型而不破坏老版
150
+ }
151
+ return { persons, events, entities, edges };
152
+ }
153
+ /** 级联删除人物:移除该人物所有相关边,然后删除人物本身 */
154
+ async deletePersonCascade(platform, userId) {
155
+ const id = `${platform}:${userId}`;
156
+ const snapshot = await this.loadAll();
157
+ let deletedEdges = 0;
158
+ for (const edge of snapshot.edges) {
159
+ const involved = (edge.kind === 'person-event' && edge.fromPersonId === id) ||
160
+ (edge.kind === 'person-entity' && edge.fromPersonId === id) ||
161
+ (edge.kind === 'person-person' && (edge.fromPersonId === id || edge.toPersonId === id));
162
+ if (involved) {
163
+ await this.deleteEdge(edge.id);
164
+ deletedEdges++;
165
+ }
166
+ }
167
+ await this.deletePerson(platform, userId);
168
+ // 顺手清掉这个人的 mergeReject 缓存(pair metadata 会变孤儿)
169
+ await this.deleteMergeRejectsByNode(id);
170
+ return { deletedEdges };
171
+ }
172
+ /** 级联删除事件:移除所有指向该事件的边,然后删除事件本身 */
173
+ async deleteEventCascade(eventId) {
174
+ const snapshot = await this.loadAll();
175
+ let deletedEdges = 0;
176
+ for (const edge of snapshot.edges) {
177
+ const involved = (edge.kind === 'person-event' && edge.toEventId === eventId) ||
178
+ (edge.kind === 'event-event' && (edge.fromEventId === eventId || edge.toEventId === eventId)) ||
179
+ (edge.kind === 'event-entity' && edge.fromEventId === eventId);
180
+ if (involved) {
181
+ await this.deleteEdge(edge.id);
182
+ deletedEdges++;
183
+ }
184
+ }
185
+ await this.deleteEvent(eventId);
186
+ await this.deleteMergeRejectsByNode(eventId);
187
+ return { deletedEdges };
188
+ }
189
+ /** 级联删除实体:移除所有指向该实体的 person-entity / event-entity / entity-entity 边 */
190
+ async deleteEntityCascade(entityId) {
191
+ const snapshot = await this.loadAll();
192
+ let deletedEdges = 0;
193
+ for (const edge of snapshot.edges) {
194
+ const involved = (edge.kind === 'person-entity' && edge.toEntityId === entityId) ||
195
+ (edge.kind === 'event-entity' && edge.toEntityId === entityId) ||
196
+ (edge.kind === 'entity-entity' && (edge.fromEntityId === entityId || edge.toEntityId === entityId));
197
+ if (involved) {
198
+ await this.deleteEdge(edge.id);
199
+ deletedEdges++;
200
+ }
201
+ }
202
+ await this.deleteEntity(entityId);
203
+ await this.deleteMergeRejectsByNode(entityId);
204
+ return { deletedEdges };
205
+ }
206
+ }
207
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Agent 工具:让 LLM 在 reasoning 中主动深挖关系图。
3
+ *
4
+ * 设计原则(单写者 + 与 profile 对称):
5
+ * - 关系图的「新建 / 强化 / 删除」由 extractor 单线程被动归纳,agent **不能** 直接写或删。
6
+ * - agent 暴露的工具全部 **只读**;纠错走 `/relation cleanup` slash 命令。
7
+ *
8
+ * 这套工具覆盖 6 类边、3 类节点的检索/分析需求:
9
+ * resolve_node —— 由关键词跨类解析节点 ID
10
+ * expand_node —— 以任意节点为中心 BFS 子图(可限定 session_scope)
11
+ * find_path —— 任意节点 ↔ 任意节点 最短路径
12
+ * score —— 双节点联系分数(Katz + AA)
13
+ * recommend_persons —— 给 person 推荐 top-K “想认识”的人(一步达成,避免多次 score)
14
+ * gossip —— 某会话最近的“瓜”(事件热度榜)
15
+ * shared —— 两节点共同邻居(共同兴趣/事件/朋友)
16
+ * search_persons —— 按 platform/关键词列人
17
+ * search_entities —— 按 kind/关键词列实体
18
+ * search_events —— 按关键词/天数列事件(可限定 session_scope)
19
+ * list_edges —— 多条件过滤边
20
+ * timeline —— 节点时间线(可限定 session_scope)
21
+ *
22
+ * 所有 depth/breadth/limit 参数会被 hardMax 截断,防止 Agent 一次拉满爆 token。
23
+ */
24
+ import type { Context } from '@aalis/core';
25
+ import type { RelationService } from './service.js';
26
+ interface ToolsConfig {
27
+ enabled: boolean;
28
+ /** 工具分组名(默认 'user-relation') */
29
+ group: string;
30
+ /** Agent 调用时的默认 depth(expand_node) */
31
+ defaultMaxDepth: number;
32
+ /** Agent 调用时的默认 breadth(expand_node) */
33
+ defaultMaxBreadth: number;
34
+ /** 硬上限 depth;超过会被截断 */
35
+ hardMaxDepth: number;
36
+ /** 硬上限 breadth */
37
+ hardMaxBreadth: number;
38
+ /** search_events / search_persons / search_entities 默认 limit */
39
+ searchEventsDefaultLimit: number;
40
+ searchEventsHardMaxLimit: number;
41
+ /** find_path 默认/硬上限最大深度 */
42
+ findPathDefaultMaxDepth: number;
43
+ findPathHardMaxDepth: number;
44
+ debug: boolean;
45
+ }
46
+ export declare function registerRelationTools(ctx: Context, service: RelationService, cfg: ToolsConfig): void;
47
+ export {};
48
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAcpD,UAAU,WAAW;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,wBAAwB,EAAE,MAAM,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAy7CpG"}