memo-grafter 0.1.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/.env.example +3 -0
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/USER_GUIDE.md +702 -0
- package/dist/MemoGrafter.d.ts +29 -0
- package/dist/MemoGrafter.d.ts.map +1 -0
- package/dist/MemoGrafter.js +106 -0
- package/dist/MemoGrafter.js.map +1 -0
- package/dist/MemoGrafterAgent.d.ts +18 -0
- package/dist/MemoGrafterAgent.d.ts.map +1 -0
- package/dist/MemoGrafterAgent.js +55 -0
- package/dist/MemoGrafterAgent.js.map +1 -0
- package/dist/adapters/OpenAIAdapter.d.ts +14 -0
- package/dist/adapters/OpenAIAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenAIAdapter.js +37 -0
- package/dist/adapters/OpenAIAdapter.js.map +1 -0
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/fleet/ConductorAgent.d.ts +15 -0
- package/dist/fleet/ConductorAgent.d.ts.map +1 -0
- package/dist/fleet/ConductorAgent.js +41 -0
- package/dist/fleet/ConductorAgent.js.map +1 -0
- package/dist/fleet/FleetStore.d.ts +12 -0
- package/dist/fleet/FleetStore.d.ts.map +1 -0
- package/dist/fleet/FleetStore.js +30 -0
- package/dist/fleet/FleetStore.js.map +1 -0
- package/dist/fleet/MemoGrafterFleet.d.ts +20 -0
- package/dist/fleet/MemoGrafterFleet.d.ts.map +1 -0
- package/dist/fleet/MemoGrafterFleet.js +49 -0
- package/dist/fleet/MemoGrafterFleet.js.map +1 -0
- package/dist/fleet/WorkerAgent.d.ts +30 -0
- package/dist/fleet/WorkerAgent.d.ts.map +1 -0
- package/dist/fleet/WorkerAgent.js +95 -0
- package/dist/fleet/WorkerAgent.js.map +1 -0
- package/dist/fleet/types.d.ts +38 -0
- package/dist/fleet/types.d.ts.map +1 -0
- package/dist/fleet/types.js +2 -0
- package/dist/fleet/types.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline/GrafterPipeline.d.ts +16 -0
- package/dist/pipeline/GrafterPipeline.d.ts.map +1 -0
- package/dist/pipeline/GrafterPipeline.js +58 -0
- package/dist/pipeline/GrafterPipeline.js.map +1 -0
- package/dist/pipeline/IngestPipeline.d.ts +19 -0
- package/dist/pipeline/IngestPipeline.d.ts.map +1 -0
- package/dist/pipeline/IngestPipeline.js +44 -0
- package/dist/pipeline/IngestPipeline.js.map +1 -0
- package/dist/pipeline/SegmentProcessor.d.ts +19 -0
- package/dist/pipeline/SegmentProcessor.d.ts.map +1 -0
- package/dist/pipeline/SegmentProcessor.js +92 -0
- package/dist/pipeline/SegmentProcessor.js.map +1 -0
- package/dist/pipeline/TopicDriftDetector.d.ts +22 -0
- package/dist/pipeline/TopicDriftDetector.d.ts.map +1 -0
- package/dist/pipeline/TopicDriftDetector.js +96 -0
- package/dist/pipeline/TopicDriftDetector.js.map +1 -0
- package/dist/queue/IngestQueue.d.ts +16 -0
- package/dist/queue/IngestQueue.d.ts.map +1 -0
- package/dist/queue/IngestQueue.js +103 -0
- package/dist/queue/IngestQueue.js.map +1 -0
- package/dist/store/GraphStore.d.ts +71 -0
- package/dist/store/GraphStore.d.ts.map +1 -0
- package/dist/store/GraphStore.js +577 -0
- package/dist/store/GraphStore.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/drift/cosineSimilarity.d.ts +2 -0
- package/dist/utils/drift/cosineSimilarity.d.ts.map +1 -0
- package/dist/utils/drift/cosineSimilarity.js +12 -0
- package/dist/utils/drift/cosineSimilarity.js.map +1 -0
- package/dist/utils/drift/vectorAvg.d.ts +2 -0
- package/dist/utils/drift/vectorAvg.d.ts.map +1 -0
- package/dist/utils/drift/vectorAvg.js +11 -0
- package/dist/utils/drift/vectorAvg.js.map +1 -0
- package/dist/utils/normalizeText.d.ts +2 -0
- package/dist/utils/normalizeText.d.ts.map +1 -0
- package/dist/utils/normalizeText.js +14 -0
- package/dist/utils/normalizeText.js.map +1 -0
- package/dist/utils/vectorLiteral.d.ts +3 -0
- package/dist/utils/vectorLiteral.d.ts.map +1 -0
- package/dist/utils/vectorLiteral.js +18 -0
- package/dist/utils/vectorLiteral.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Message, TopicEdge, TopicNode, TopicSegment } from "../types.js";
|
|
2
|
+
interface AbsorbOptions {
|
|
3
|
+
agentColor?: string | null;
|
|
4
|
+
fleetId?: string | null;
|
|
5
|
+
agentId?: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface FleetAgentRecord {
|
|
8
|
+
id: string;
|
|
9
|
+
fleetId: string;
|
|
10
|
+
sessionId: string;
|
|
11
|
+
agentColor: string;
|
|
12
|
+
createdAt: Date;
|
|
13
|
+
}
|
|
14
|
+
export declare class GraphStore {
|
|
15
|
+
private readonly sql;
|
|
16
|
+
constructor(connectionString: string);
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
saveMessages(sessionId: string, messages: Message[]): Promise<void>;
|
|
19
|
+
saveMessagesAt(sessionId: string, startIndex: number, messages: Message[]): Promise<void>;
|
|
20
|
+
saveSegment(segment: TopicSegment): Promise<TopicSegment>;
|
|
21
|
+
saveNode(node: TopicNode): Promise<void>;
|
|
22
|
+
saveEdge(edge: TopicEdge): Promise<void>;
|
|
23
|
+
clearSession(sessionId: string): Promise<void>;
|
|
24
|
+
clearSessionGraph(sessionId: string): Promise<void>;
|
|
25
|
+
getNodeBySegment(segmentId: string): Promise<TopicNode | null>;
|
|
26
|
+
getNodesBySession(sessionId: string): Promise<TopicNode[]>;
|
|
27
|
+
getSegmentsBySession(sessionId: string): Promise<TopicSegment[]>;
|
|
28
|
+
getTopKSimilar(nodeId: string, embedding: number[], sessionId: string, k: number): Promise<TopicNode[]>;
|
|
29
|
+
getSimilarNodes(embedding: number[], sessionId: string, options?: {
|
|
30
|
+
k?: number;
|
|
31
|
+
excludeNodeId?: string;
|
|
32
|
+
minSimilarity?: number;
|
|
33
|
+
}): Promise<TopicNode[]>;
|
|
34
|
+
getSimilarNodesAcrossFleet(fleetId: string, embedding: number[], options?: {
|
|
35
|
+
k?: number;
|
|
36
|
+
excludeNodeId?: string;
|
|
37
|
+
minSimilarity?: number;
|
|
38
|
+
agentColor?: string;
|
|
39
|
+
}): Promise<TopicNode[]>;
|
|
40
|
+
getNodesByColor(fleetId: string, agentColor: string): Promise<TopicNode[]>;
|
|
41
|
+
saveFleet(fleetId: string, name?: string): Promise<void>;
|
|
42
|
+
saveFleetAgent(agent: {
|
|
43
|
+
id: string;
|
|
44
|
+
fleetId: string;
|
|
45
|
+
sessionId: string;
|
|
46
|
+
agentColor: string;
|
|
47
|
+
}): Promise<void>;
|
|
48
|
+
getFleetAgents(fleetId: string): Promise<FleetAgentRecord[]>;
|
|
49
|
+
tagSessionNodes(sessionId: string, metadata: {
|
|
50
|
+
fleetId: string | null;
|
|
51
|
+
agentId: string | null;
|
|
52
|
+
agentColor: string | null;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
getPreviousNode(sessionId: string, topicOrder: number): Promise<TopicNode | null>;
|
|
55
|
+
nodeSimilarity(nodeAId: string, nodeBId: string): Promise<number>;
|
|
56
|
+
getNeighbours(nodeIds: string[], hopDepth: number, sessionId?: string): Promise<TopicNode[]>;
|
|
57
|
+
getBufferMessages(sessionId: string, start: number, end: number, maxChars?: number): Promise<Message[]>;
|
|
58
|
+
absorbNodes(nodes: TopicNode[], targetSessionId: string, options?: AbsorbOptions): Promise<TopicNode[]>;
|
|
59
|
+
rebuildEdgesForSession(sessionId: string, semanticTopK?: number, semanticThreshold?: number): Promise<void>;
|
|
60
|
+
close(): Promise<void>;
|
|
61
|
+
private migrateExistingNodeTable;
|
|
62
|
+
private createIndexes;
|
|
63
|
+
private cleanAssistantMessage;
|
|
64
|
+
private getNextMessageIndex;
|
|
65
|
+
private getNextTopicOrder;
|
|
66
|
+
private formatGraftedMemoryMessage;
|
|
67
|
+
private rowToNode;
|
|
68
|
+
private rowToSegment;
|
|
69
|
+
}
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=GraphStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphStore.d.ts","sourceRoot":"","sources":["../../src/store/GraphStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import postgres, {} from "postgres";
|
|
3
|
+
import { parseVector, toVectorLiteral } from "../utils/vectorLiteral.js";
|
|
4
|
+
export class GraphStore {
|
|
5
|
+
sql;
|
|
6
|
+
constructor(connectionString) {
|
|
7
|
+
this.sql = postgres(connectionString, {
|
|
8
|
+
max: 10,
|
|
9
|
+
idle_timeout: 30,
|
|
10
|
+
connect_timeout: 10,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
async initialize() {
|
|
14
|
+
await this.sql `CREATE EXTENSION IF NOT EXISTS vector`;
|
|
15
|
+
await this.sql `
|
|
16
|
+
CREATE TABLE IF NOT EXISTS mg_message_buffer (
|
|
17
|
+
session_id TEXT NOT NULL,
|
|
18
|
+
message_index INT NOT NULL,
|
|
19
|
+
role TEXT NOT NULL,
|
|
20
|
+
content TEXT NOT NULL,
|
|
21
|
+
PRIMARY KEY (session_id, message_index)
|
|
22
|
+
)
|
|
23
|
+
`;
|
|
24
|
+
await this.sql `
|
|
25
|
+
CREATE TABLE IF NOT EXISTS mg_segments (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
session_id TEXT NOT NULL,
|
|
28
|
+
start_index INT NOT NULL,
|
|
29
|
+
end_index INT NOT NULL,
|
|
30
|
+
topic_order INT NOT NULL,
|
|
31
|
+
drift_score FLOAT NOT NULL,
|
|
32
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
33
|
+
UNIQUE (session_id, start_index, end_index)
|
|
34
|
+
)
|
|
35
|
+
`;
|
|
36
|
+
await this.sql `
|
|
37
|
+
CREATE TABLE IF NOT EXISTS mg_topic_nodes (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
session_id TEXT NOT NULL,
|
|
40
|
+
segment_id TEXT NOT NULL REFERENCES mg_segments(id) ON DELETE CASCADE,
|
|
41
|
+
label TEXT,
|
|
42
|
+
summary TEXT,
|
|
43
|
+
embedding vector(1536),
|
|
44
|
+
message_range INT[],
|
|
45
|
+
topic_order INT NOT NULL DEFAULT 0,
|
|
46
|
+
drift_score FLOAT NOT NULL DEFAULT 0,
|
|
47
|
+
agent_color TEXT,
|
|
48
|
+
fleet_id TEXT,
|
|
49
|
+
agent_id TEXT,
|
|
50
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
51
|
+
UNIQUE (segment_id)
|
|
52
|
+
)
|
|
53
|
+
`;
|
|
54
|
+
await this.sql `
|
|
55
|
+
CREATE TABLE IF NOT EXISTS mg_topic_edges (
|
|
56
|
+
src_id TEXT NOT NULL,
|
|
57
|
+
dst_id TEXT NOT NULL,
|
|
58
|
+
weight FLOAT NOT NULL,
|
|
59
|
+
type TEXT NOT NULL,
|
|
60
|
+
PRIMARY KEY (src_id, dst_id)
|
|
61
|
+
)
|
|
62
|
+
`;
|
|
63
|
+
await this.sql `
|
|
64
|
+
CREATE TABLE IF NOT EXISTS mg_fleets (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
name TEXT,
|
|
67
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
68
|
+
)
|
|
69
|
+
`;
|
|
70
|
+
await this.sql `
|
|
71
|
+
CREATE TABLE IF NOT EXISTS mg_fleet_agents (
|
|
72
|
+
id TEXT PRIMARY KEY,
|
|
73
|
+
fleet_id TEXT NOT NULL REFERENCES mg_fleets(id) ON DELETE CASCADE,
|
|
74
|
+
session_id TEXT NOT NULL,
|
|
75
|
+
agent_color TEXT NOT NULL,
|
|
76
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
77
|
+
UNIQUE (fleet_id, agent_color)
|
|
78
|
+
)
|
|
79
|
+
`;
|
|
80
|
+
await this.migrateExistingNodeTable();
|
|
81
|
+
await this.createIndexes();
|
|
82
|
+
}
|
|
83
|
+
async saveMessages(sessionId, messages) {
|
|
84
|
+
await this.saveMessagesAt(sessionId, 0, messages);
|
|
85
|
+
}
|
|
86
|
+
async saveMessagesAt(sessionId, startIndex, messages) {
|
|
87
|
+
for (const [index, message] of messages.entries()) {
|
|
88
|
+
await this.sql `
|
|
89
|
+
INSERT INTO mg_message_buffer (session_id, message_index, role, content)
|
|
90
|
+
VALUES (${sessionId}, ${startIndex + index}, ${message.role}, ${message.content})
|
|
91
|
+
ON CONFLICT (session_id, message_index)
|
|
92
|
+
DO UPDATE SET role = EXCLUDED.role, content = EXCLUDED.content
|
|
93
|
+
`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async saveSegment(segment) {
|
|
97
|
+
const rows = await this.sql `
|
|
98
|
+
INSERT INTO mg_segments (id, session_id, start_index, end_index, topic_order, drift_score, created_at)
|
|
99
|
+
VALUES (
|
|
100
|
+
${segment.id},
|
|
101
|
+
${segment.sessionId},
|
|
102
|
+
${segment.startIndex},
|
|
103
|
+
${segment.endIndex},
|
|
104
|
+
${segment.topicOrder},
|
|
105
|
+
${segment.driftScore},
|
|
106
|
+
${segment.createdAt}
|
|
107
|
+
)
|
|
108
|
+
ON CONFLICT (session_id, start_index, end_index)
|
|
109
|
+
DO UPDATE SET
|
|
110
|
+
topic_order = EXCLUDED.topic_order,
|
|
111
|
+
drift_score = EXCLUDED.drift_score
|
|
112
|
+
RETURNING *
|
|
113
|
+
`;
|
|
114
|
+
return this.rowToSegment(rows[0]);
|
|
115
|
+
}
|
|
116
|
+
async saveNode(node) {
|
|
117
|
+
await this.sql `
|
|
118
|
+
INSERT INTO mg_topic_nodes (
|
|
119
|
+
id,
|
|
120
|
+
session_id,
|
|
121
|
+
segment_id,
|
|
122
|
+
label,
|
|
123
|
+
summary,
|
|
124
|
+
embedding,
|
|
125
|
+
message_range,
|
|
126
|
+
topic_order,
|
|
127
|
+
drift_score,
|
|
128
|
+
agent_color,
|
|
129
|
+
fleet_id,
|
|
130
|
+
agent_id,
|
|
131
|
+
created_at
|
|
132
|
+
)
|
|
133
|
+
VALUES (
|
|
134
|
+
${node.id},
|
|
135
|
+
${node.sessionId},
|
|
136
|
+
${node.segmentId},
|
|
137
|
+
${node.label},
|
|
138
|
+
${node.summary},
|
|
139
|
+
${toVectorLiteral(node.embedding)}::vector,
|
|
140
|
+
${node.messageRange},
|
|
141
|
+
${node.topicOrder},
|
|
142
|
+
${node.driftScore},
|
|
143
|
+
${node.agentColor},
|
|
144
|
+
${node.fleetId},
|
|
145
|
+
${node.agentId},
|
|
146
|
+
${node.createdAt}
|
|
147
|
+
)
|
|
148
|
+
ON CONFLICT (segment_id)
|
|
149
|
+
DO UPDATE SET
|
|
150
|
+
id = EXCLUDED.id,
|
|
151
|
+
session_id = EXCLUDED.session_id,
|
|
152
|
+
label = EXCLUDED.label,
|
|
153
|
+
summary = EXCLUDED.summary,
|
|
154
|
+
embedding = EXCLUDED.embedding,
|
|
155
|
+
message_range = EXCLUDED.message_range,
|
|
156
|
+
topic_order = EXCLUDED.topic_order,
|
|
157
|
+
drift_score = EXCLUDED.drift_score,
|
|
158
|
+
agent_color = EXCLUDED.agent_color,
|
|
159
|
+
fleet_id = EXCLUDED.fleet_id,
|
|
160
|
+
agent_id = EXCLUDED.agent_id,
|
|
161
|
+
created_at = EXCLUDED.created_at
|
|
162
|
+
`;
|
|
163
|
+
}
|
|
164
|
+
async saveEdge(edge) {
|
|
165
|
+
await this.sql `
|
|
166
|
+
INSERT INTO mg_topic_edges (src_id, dst_id, weight, type)
|
|
167
|
+
VALUES (${edge.srcId}, ${edge.dstId}, ${edge.weight}, ${edge.type})
|
|
168
|
+
ON CONFLICT (src_id, dst_id)
|
|
169
|
+
DO UPDATE SET weight = EXCLUDED.weight, type = EXCLUDED.type
|
|
170
|
+
`;
|
|
171
|
+
}
|
|
172
|
+
async clearSession(sessionId) {
|
|
173
|
+
const nodeRows = await this.sql `
|
|
174
|
+
SELECT id FROM mg_topic_nodes
|
|
175
|
+
WHERE session_id = ${sessionId}
|
|
176
|
+
`;
|
|
177
|
+
const nodeIds = nodeRows.map((row) => row.id);
|
|
178
|
+
if (nodeIds.length > 0) {
|
|
179
|
+
await this.sql `
|
|
180
|
+
DELETE FROM mg_topic_edges
|
|
181
|
+
WHERE src_id = ANY(${this.sql.array(nodeIds)})
|
|
182
|
+
OR dst_id = ANY(${this.sql.array(nodeIds)})
|
|
183
|
+
`;
|
|
184
|
+
}
|
|
185
|
+
await this.sql `
|
|
186
|
+
DELETE FROM mg_topic_nodes
|
|
187
|
+
WHERE session_id = ${sessionId}
|
|
188
|
+
`;
|
|
189
|
+
await this.sql `
|
|
190
|
+
DELETE FROM mg_segments
|
|
191
|
+
WHERE session_id = ${sessionId}
|
|
192
|
+
`;
|
|
193
|
+
}
|
|
194
|
+
async clearSessionGraph(sessionId) {
|
|
195
|
+
await this.clearSession(sessionId);
|
|
196
|
+
}
|
|
197
|
+
async getNodeBySegment(segmentId) {
|
|
198
|
+
const rows = await this.sql `
|
|
199
|
+
SELECT * FROM mg_topic_nodes
|
|
200
|
+
WHERE segment_id = ${segmentId}
|
|
201
|
+
LIMIT 1
|
|
202
|
+
`;
|
|
203
|
+
return rows[0] ? this.rowToNode(rows[0]) : null;
|
|
204
|
+
}
|
|
205
|
+
async getNodesBySession(sessionId) {
|
|
206
|
+
const rows = await this.sql `
|
|
207
|
+
SELECT * FROM mg_topic_nodes
|
|
208
|
+
WHERE session_id = ${sessionId}
|
|
209
|
+
ORDER BY topic_order ASC, created_at ASC
|
|
210
|
+
`;
|
|
211
|
+
return rows.map((row) => this.rowToNode(row));
|
|
212
|
+
}
|
|
213
|
+
async getSegmentsBySession(sessionId) {
|
|
214
|
+
const rows = await this.sql `
|
|
215
|
+
SELECT * FROM mg_segments
|
|
216
|
+
WHERE session_id = ${sessionId}
|
|
217
|
+
ORDER BY topic_order ASC, created_at ASC
|
|
218
|
+
`;
|
|
219
|
+
return rows.map((row) => this.rowToSegment(row));
|
|
220
|
+
}
|
|
221
|
+
async getTopKSimilar(nodeId, embedding, sessionId, k) {
|
|
222
|
+
return this.getSimilarNodes(embedding, sessionId, { k, excludeNodeId: nodeId });
|
|
223
|
+
}
|
|
224
|
+
async getSimilarNodes(embedding, sessionId, options = {}) {
|
|
225
|
+
const rows = await this.sql `
|
|
226
|
+
SELECT *, 1 - (embedding <=> ${toVectorLiteral(embedding)}::vector) AS similarity
|
|
227
|
+
FROM mg_topic_nodes
|
|
228
|
+
WHERE session_id = ${sessionId}
|
|
229
|
+
${options.excludeNodeId ? this.sql `AND id != ${options.excludeNodeId}` : this.sql ``}
|
|
230
|
+
${options.minSimilarity === undefined ? this.sql `` : this.sql `AND 1 - (embedding <=> ${toVectorLiteral(embedding)}::vector) >= ${options.minSimilarity}`}
|
|
231
|
+
ORDER BY embedding <=> ${toVectorLiteral(embedding)}::vector ASC
|
|
232
|
+
LIMIT ${options.k ?? 5}
|
|
233
|
+
`;
|
|
234
|
+
return rows.map((row) => this.rowToNode(row));
|
|
235
|
+
}
|
|
236
|
+
async getSimilarNodesAcrossFleet(fleetId, embedding, options = {}) {
|
|
237
|
+
const rows = await this.sql `
|
|
238
|
+
SELECT *, 1 - (embedding <=> ${toVectorLiteral(embedding)}::vector) AS similarity
|
|
239
|
+
FROM mg_topic_nodes
|
|
240
|
+
WHERE fleet_id = ${fleetId}
|
|
241
|
+
${options.agentColor ? this.sql `AND agent_color = ${options.agentColor}` : this.sql ``}
|
|
242
|
+
${options.excludeNodeId ? this.sql `AND id != ${options.excludeNodeId}` : this.sql ``}
|
|
243
|
+
${options.minSimilarity === undefined ? this.sql `` : this.sql `AND 1 - (embedding <=> ${toVectorLiteral(embedding)}::vector) >= ${options.minSimilarity}`}
|
|
244
|
+
ORDER BY embedding <=> ${toVectorLiteral(embedding)}::vector ASC
|
|
245
|
+
LIMIT ${options.k ?? 5}
|
|
246
|
+
`;
|
|
247
|
+
return rows.map((row) => this.rowToNode(row));
|
|
248
|
+
}
|
|
249
|
+
async getNodesByColor(fleetId, agentColor) {
|
|
250
|
+
const rows = await this.sql `
|
|
251
|
+
SELECT * FROM mg_topic_nodes
|
|
252
|
+
WHERE fleet_id = ${fleetId}
|
|
253
|
+
AND agent_color = ${agentColor}
|
|
254
|
+
ORDER BY topic_order ASC, created_at ASC
|
|
255
|
+
`;
|
|
256
|
+
return rows.map((row) => this.rowToNode(row));
|
|
257
|
+
}
|
|
258
|
+
async saveFleet(fleetId, name) {
|
|
259
|
+
await this.sql `
|
|
260
|
+
INSERT INTO mg_fleets (id, name)
|
|
261
|
+
VALUES (${fleetId}, ${name ?? null})
|
|
262
|
+
ON CONFLICT (id)
|
|
263
|
+
DO UPDATE SET name = COALESCE(EXCLUDED.name, mg_fleets.name)
|
|
264
|
+
`;
|
|
265
|
+
}
|
|
266
|
+
async saveFleetAgent(agent) {
|
|
267
|
+
await this.sql `
|
|
268
|
+
INSERT INTO mg_fleet_agents (id, fleet_id, session_id, agent_color)
|
|
269
|
+
VALUES (${agent.id}, ${agent.fleetId}, ${agent.sessionId}, ${agent.agentColor})
|
|
270
|
+
ON CONFLICT (fleet_id, agent_color)
|
|
271
|
+
DO UPDATE SET
|
|
272
|
+
id = EXCLUDED.id,
|
|
273
|
+
session_id = EXCLUDED.session_id
|
|
274
|
+
`;
|
|
275
|
+
}
|
|
276
|
+
async getFleetAgents(fleetId) {
|
|
277
|
+
const rows = await this.sql `
|
|
278
|
+
SELECT * FROM mg_fleet_agents
|
|
279
|
+
WHERE fleet_id = ${fleetId}
|
|
280
|
+
ORDER BY created_at ASC
|
|
281
|
+
`;
|
|
282
|
+
return rows.map((row) => ({
|
|
283
|
+
id: row.id,
|
|
284
|
+
fleetId: row.fleet_id,
|
|
285
|
+
sessionId: row.session_id,
|
|
286
|
+
agentColor: row.agent_color,
|
|
287
|
+
createdAt: row.created_at,
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
async tagSessionNodes(sessionId, metadata) {
|
|
291
|
+
await this.sql `
|
|
292
|
+
UPDATE mg_topic_nodes
|
|
293
|
+
SET
|
|
294
|
+
fleet_id = ${metadata.fleetId},
|
|
295
|
+
agent_id = ${metadata.agentId},
|
|
296
|
+
agent_color = ${metadata.agentColor}
|
|
297
|
+
WHERE session_id = ${sessionId}
|
|
298
|
+
`;
|
|
299
|
+
}
|
|
300
|
+
async getPreviousNode(sessionId, topicOrder) {
|
|
301
|
+
const rows = await this.sql `
|
|
302
|
+
SELECT *
|
|
303
|
+
FROM mg_topic_nodes
|
|
304
|
+
WHERE session_id = ${sessionId}
|
|
305
|
+
AND topic_order = ${topicOrder - 1}
|
|
306
|
+
LIMIT 1
|
|
307
|
+
`;
|
|
308
|
+
return rows[0] ? this.rowToNode(rows[0]) : null;
|
|
309
|
+
}
|
|
310
|
+
async nodeSimilarity(nodeAId, nodeBId) {
|
|
311
|
+
const rows = await this.sql `
|
|
312
|
+
SELECT 1 - (n1.embedding <=> n2.embedding) AS similarity
|
|
313
|
+
FROM mg_topic_nodes n1, mg_topic_nodes n2
|
|
314
|
+
WHERE n1.id = ${nodeAId}
|
|
315
|
+
AND n2.id = ${nodeBId}
|
|
316
|
+
`;
|
|
317
|
+
return rows[0]?.similarity ?? 0;
|
|
318
|
+
}
|
|
319
|
+
async getNeighbours(nodeIds, hopDepth, sessionId) {
|
|
320
|
+
const visited = new Set(nodeIds);
|
|
321
|
+
let frontier = [...nodeIds];
|
|
322
|
+
for (let hop = 0; hop < hopDepth; hop += 1) {
|
|
323
|
+
if (frontier.length === 0)
|
|
324
|
+
break;
|
|
325
|
+
const edges = await this.sql `
|
|
326
|
+
SELECT * FROM mg_topic_edges
|
|
327
|
+
WHERE src_id = ANY(${this.sql.array(frontier)})
|
|
328
|
+
OR dst_id = ANY(${this.sql.array(frontier)})
|
|
329
|
+
`;
|
|
330
|
+
const nextFrontier = [];
|
|
331
|
+
for (const edge of edges) {
|
|
332
|
+
const candidates = [edge.src_id, edge.dst_id];
|
|
333
|
+
for (const candidate of candidates) {
|
|
334
|
+
if (!visited.has(candidate)) {
|
|
335
|
+
visited.add(candidate);
|
|
336
|
+
nextFrontier.push(candidate);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
frontier = nextFrontier;
|
|
341
|
+
}
|
|
342
|
+
const ids = Array.from(visited);
|
|
343
|
+
if (ids.length === 0)
|
|
344
|
+
return [];
|
|
345
|
+
const rows = await this.sql `
|
|
346
|
+
SELECT * FROM mg_topic_nodes
|
|
347
|
+
WHERE id = ANY(${this.sql.array(ids)})
|
|
348
|
+
${sessionId ? this.sql `AND session_id = ${sessionId}` : this.sql ``}
|
|
349
|
+
ORDER BY topic_order ASC, created_at ASC
|
|
350
|
+
`;
|
|
351
|
+
return rows.map((row) => this.rowToNode(row));
|
|
352
|
+
}
|
|
353
|
+
async getBufferMessages(sessionId, start, end, maxChars = 600) {
|
|
354
|
+
const rows = await this.sql `
|
|
355
|
+
SELECT * FROM mg_message_buffer
|
|
356
|
+
WHERE session_id = ${sessionId}
|
|
357
|
+
AND message_index >= ${start}
|
|
358
|
+
AND message_index <= ${end}
|
|
359
|
+
ORDER BY message_index ASC
|
|
360
|
+
`;
|
|
361
|
+
return rows.map((row) => ({
|
|
362
|
+
role: row.role,
|
|
363
|
+
content: row.role === "assistant" ? this.cleanAssistantMessage(row.content, maxChars) : row.content,
|
|
364
|
+
}));
|
|
365
|
+
}
|
|
366
|
+
async absorbNodes(nodes, targetSessionId, options = {}) {
|
|
367
|
+
const copiedNodes = [];
|
|
368
|
+
const nextMessageIndex = await this.getNextMessageIndex(targetSessionId);
|
|
369
|
+
const nextTopicOrder = await this.getNextTopicOrder(targetSessionId);
|
|
370
|
+
for (const [index, node] of nodes.entries()) {
|
|
371
|
+
const messageIndex = nextMessageIndex + index;
|
|
372
|
+
await this.saveMessagesAt(targetSessionId, messageIndex, [{
|
|
373
|
+
role: "assistant",
|
|
374
|
+
content: this.formatGraftedMemoryMessage(node),
|
|
375
|
+
}]);
|
|
376
|
+
const segment = await this.saveSegment({
|
|
377
|
+
id: randomUUID(),
|
|
378
|
+
sessionId: targetSessionId,
|
|
379
|
+
startIndex: messageIndex,
|
|
380
|
+
endIndex: messageIndex,
|
|
381
|
+
topicOrder: nextTopicOrder + index,
|
|
382
|
+
driftScore: node.driftScore,
|
|
383
|
+
createdAt: new Date(),
|
|
384
|
+
});
|
|
385
|
+
const copy = {
|
|
386
|
+
...node,
|
|
387
|
+
id: randomUUID(),
|
|
388
|
+
sessionId: targetSessionId,
|
|
389
|
+
segmentId: segment.id,
|
|
390
|
+
messageRange: [segment.startIndex, segment.endIndex],
|
|
391
|
+
topicOrder: segment.topicOrder,
|
|
392
|
+
driftScore: segment.driftScore,
|
|
393
|
+
agentColor: options.agentColor ?? node.agentColor,
|
|
394
|
+
fleetId: options.fleetId ?? node.fleetId,
|
|
395
|
+
agentId: options.agentId ?? node.agentId,
|
|
396
|
+
createdAt: new Date(),
|
|
397
|
+
};
|
|
398
|
+
await this.saveNode(copy);
|
|
399
|
+
await this.saveEdge({
|
|
400
|
+
srcId: copy.id,
|
|
401
|
+
dstId: node.id,
|
|
402
|
+
weight: 1,
|
|
403
|
+
type: "grafted",
|
|
404
|
+
});
|
|
405
|
+
copiedNodes.push(copy);
|
|
406
|
+
}
|
|
407
|
+
return copiedNodes;
|
|
408
|
+
}
|
|
409
|
+
async rebuildEdgesForSession(sessionId, semanticTopK = 5, semanticThreshold = 0.6) {
|
|
410
|
+
const nodes = await this.getNodesBySession(sessionId);
|
|
411
|
+
const nodeIds = nodes.map((node) => node.id);
|
|
412
|
+
if (nodeIds.length > 0) {
|
|
413
|
+
await this.sql `
|
|
414
|
+
DELETE FROM mg_topic_edges
|
|
415
|
+
WHERE type != 'grafted'
|
|
416
|
+
AND (
|
|
417
|
+
src_id = ANY(${this.sql.array(nodeIds)})
|
|
418
|
+
OR dst_id = ANY(${this.sql.array(nodeIds)})
|
|
419
|
+
)
|
|
420
|
+
`;
|
|
421
|
+
}
|
|
422
|
+
for (let index = 1; index < nodes.length; index += 1) {
|
|
423
|
+
const current = nodes[index];
|
|
424
|
+
const previous = nodes[index - 1];
|
|
425
|
+
if (!current || !previous)
|
|
426
|
+
continue;
|
|
427
|
+
await this.saveEdge({
|
|
428
|
+
srcId: current.id,
|
|
429
|
+
dstId: previous.id,
|
|
430
|
+
weight: await this.nodeSimilarity(current.id, previous.id),
|
|
431
|
+
type: "temporal",
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
for (const node of nodes) {
|
|
435
|
+
const similarNodes = await this.getSimilarNodes(node.embedding, sessionId, {
|
|
436
|
+
k: semanticTopK,
|
|
437
|
+
excludeNodeId: node.id,
|
|
438
|
+
minSimilarity: semanticThreshold,
|
|
439
|
+
});
|
|
440
|
+
for (const similarNode of similarNodes) {
|
|
441
|
+
await this.saveEdge({
|
|
442
|
+
srcId: node.id,
|
|
443
|
+
dstId: similarNode.id,
|
|
444
|
+
weight: await this.nodeSimilarity(node.id, similarNode.id),
|
|
445
|
+
type: "semantic",
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async close() {
|
|
451
|
+
await this.sql.end();
|
|
452
|
+
}
|
|
453
|
+
async migrateExistingNodeTable() {
|
|
454
|
+
await this.sql `ALTER TABLE mg_segments DROP COLUMN IF EXISTS node_id`;
|
|
455
|
+
await this.sql `ALTER TABLE mg_topic_nodes ADD COLUMN IF NOT EXISTS segment_id TEXT`;
|
|
456
|
+
await this.sql `ALTER TABLE mg_topic_nodes ADD COLUMN IF NOT EXISTS topic_order INT NOT NULL DEFAULT 0`;
|
|
457
|
+
await this.sql `ALTER TABLE mg_topic_nodes ADD COLUMN IF NOT EXISTS drift_score FLOAT NOT NULL DEFAULT 0`;
|
|
458
|
+
await this.sql `ALTER TABLE mg_topic_nodes ADD COLUMN IF NOT EXISTS agent_color TEXT`;
|
|
459
|
+
await this.sql `ALTER TABLE mg_topic_nodes ADD COLUMN IF NOT EXISTS fleet_id TEXT`;
|
|
460
|
+
await this.sql `ALTER TABLE mg_topic_nodes ADD COLUMN IF NOT EXISTS agent_id TEXT`;
|
|
461
|
+
await this.sql `
|
|
462
|
+
UPDATE mg_topic_nodes n
|
|
463
|
+
SET
|
|
464
|
+
topic_order = s.topic_order,
|
|
465
|
+
drift_score = s.drift_score
|
|
466
|
+
FROM mg_segments s
|
|
467
|
+
WHERE s.id = n.segment_id
|
|
468
|
+
`;
|
|
469
|
+
await this.sql `
|
|
470
|
+
DO $$
|
|
471
|
+
BEGIN
|
|
472
|
+
IF NOT EXISTS (
|
|
473
|
+
SELECT 1
|
|
474
|
+
FROM pg_constraint
|
|
475
|
+
WHERE conname = 'mg_topic_nodes_segment_id_key'
|
|
476
|
+
) THEN
|
|
477
|
+
ALTER TABLE mg_topic_nodes
|
|
478
|
+
ADD CONSTRAINT mg_topic_nodes_segment_id_key UNIQUE (segment_id);
|
|
479
|
+
END IF;
|
|
480
|
+
END $$;
|
|
481
|
+
`;
|
|
482
|
+
}
|
|
483
|
+
async createIndexes() {
|
|
484
|
+
await this.sql `
|
|
485
|
+
CREATE INDEX IF NOT EXISTS mg_message_buffer_session_idx
|
|
486
|
+
ON mg_message_buffer(session_id, message_index)
|
|
487
|
+
`;
|
|
488
|
+
await this.sql `
|
|
489
|
+
CREATE INDEX IF NOT EXISTS mg_segments_session_idx
|
|
490
|
+
ON mg_segments(session_id, topic_order)
|
|
491
|
+
`;
|
|
492
|
+
await this.sql `
|
|
493
|
+
CREATE INDEX IF NOT EXISTS mg_nodes_session_idx
|
|
494
|
+
ON mg_topic_nodes(session_id, topic_order)
|
|
495
|
+
`;
|
|
496
|
+
await this.sql `
|
|
497
|
+
CREATE INDEX IF NOT EXISTS mg_nodes_fleet_idx
|
|
498
|
+
ON mg_topic_nodes(fleet_id, agent_color)
|
|
499
|
+
`;
|
|
500
|
+
await this.sql `
|
|
501
|
+
CREATE INDEX IF NOT EXISTS mg_fleet_agents_fleet_idx
|
|
502
|
+
ON mg_fleet_agents(fleet_id, agent_color)
|
|
503
|
+
`;
|
|
504
|
+
await this.sql `
|
|
505
|
+
CREATE INDEX IF NOT EXISTS mg_nodes_embedding_idx
|
|
506
|
+
ON mg_topic_nodes
|
|
507
|
+
USING ivfflat (embedding vector_cosine_ops)
|
|
508
|
+
WITH (lists = 100)
|
|
509
|
+
`;
|
|
510
|
+
}
|
|
511
|
+
cleanAssistantMessage(content, maxChars) {
|
|
512
|
+
const withoutCodeBlocks = content.replace(/```[\s\S]*?```/g, "[code omitted]");
|
|
513
|
+
if (withoutCodeBlocks.length <= maxChars)
|
|
514
|
+
return withoutCodeBlocks;
|
|
515
|
+
const truncated = withoutCodeBlocks.slice(0, maxChars);
|
|
516
|
+
const sentenceEnd = Math.max(truncated.lastIndexOf("."), truncated.lastIndexOf("!"), truncated.lastIndexOf("?"));
|
|
517
|
+
if (sentenceEnd >= Math.floor(maxChars * 0.5)) {
|
|
518
|
+
return `${truncated.slice(0, sentenceEnd + 1)} [truncated]`;
|
|
519
|
+
}
|
|
520
|
+
return `${truncated.trimEnd()} [truncated]`;
|
|
521
|
+
}
|
|
522
|
+
async getNextMessageIndex(sessionId) {
|
|
523
|
+
const rows = await this.sql `
|
|
524
|
+
SELECT COALESCE(MAX(message_index) + 1, 0) AS next_index
|
|
525
|
+
FROM mg_message_buffer
|
|
526
|
+
WHERE session_id = ${sessionId}
|
|
527
|
+
`;
|
|
528
|
+
return rows[0]?.next_index ?? 0;
|
|
529
|
+
}
|
|
530
|
+
async getNextTopicOrder(sessionId) {
|
|
531
|
+
const rows = await this.sql `
|
|
532
|
+
SELECT COALESCE(MAX(topic_order) + 1, 1) AS next_order
|
|
533
|
+
FROM mg_topic_nodes
|
|
534
|
+
WHERE session_id = ${sessionId}
|
|
535
|
+
`;
|
|
536
|
+
return rows[0]?.next_order ?? 1;
|
|
537
|
+
}
|
|
538
|
+
formatGraftedMemoryMessage(node) {
|
|
539
|
+
return [
|
|
540
|
+
`Grafted memory: ${node.label}`,
|
|
541
|
+
node.summary,
|
|
542
|
+
].filter(Boolean).join("\n");
|
|
543
|
+
}
|
|
544
|
+
rowToNode(row) {
|
|
545
|
+
const [start = 0, end = start] = row.message_range ?? [];
|
|
546
|
+
return {
|
|
547
|
+
id: row.id,
|
|
548
|
+
sessionId: row.session_id,
|
|
549
|
+
segmentId: row.segment_id,
|
|
550
|
+
label: row.label ?? "Untitled topic",
|
|
551
|
+
summary: row.summary ?? "",
|
|
552
|
+
embedding: parseVector(row.embedding),
|
|
553
|
+
messageRange: [start, end],
|
|
554
|
+
topicOrder: row.topic_order ?? 0,
|
|
555
|
+
driftScore: row.drift_score ?? 0,
|
|
556
|
+
agentColor: row.agent_color,
|
|
557
|
+
fleetId: row.fleet_id,
|
|
558
|
+
agentId: row.agent_id,
|
|
559
|
+
createdAt: row.created_at,
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
rowToSegment(row) {
|
|
563
|
+
if (!row) {
|
|
564
|
+
throw new Error("Expected segment row.");
|
|
565
|
+
}
|
|
566
|
+
return {
|
|
567
|
+
id: row.id,
|
|
568
|
+
sessionId: row.session_id,
|
|
569
|
+
startIndex: row.start_index,
|
|
570
|
+
endIndex: row.end_index,
|
|
571
|
+
topicOrder: row.topic_order,
|
|
572
|
+
driftScore: row.drift_score,
|
|
573
|
+
createdAt: row.created_at,
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=GraphStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphStore.js","sourceRoot":"","sources":["../../src/store/GraphStore.ts"],"names":[],"mappings":"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"}
|