@christopherlittle51/postclaw 1.0.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 +4 -0
- package/LICENSE +15 -0
- package/README.md +731 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +506 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/validation.d.ts +81 -0
- package/dist/schemas/validation.d.ts.map +1 -0
- package/dist/schemas/validation.js +27 -0
- package/dist/schemas/validation.js.map +1 -0
- package/dist/scripts/bootstrap_persona.d.ts +20 -0
- package/dist/scripts/bootstrap_persona.d.ts.map +1 -0
- package/dist/scripts/bootstrap_persona.js +150 -0
- package/dist/scripts/bootstrap_persona.js.map +1 -0
- package/dist/scripts/bootstrap_tools.d.ts +2 -0
- package/dist/scripts/bootstrap_tools.d.ts.map +1 -0
- package/dist/scripts/bootstrap_tools.js +67 -0
- package/dist/scripts/bootstrap_tools.js.map +1 -0
- package/dist/scripts/setup-db.d.ts +28 -0
- package/dist/scripts/setup-db.d.ts.map +1 -0
- package/dist/scripts/setup-db.js +539 -0
- package/dist/scripts/setup-db.js.map +1 -0
- package/dist/scripts/sleep_cycle.d.ts +32 -0
- package/dist/scripts/sleep_cycle.d.ts.map +1 -0
- package/dist/scripts/sleep_cycle.js +452 -0
- package/dist/scripts/sleep_cycle.js.map +1 -0
- package/dist/services/db.d.ts +28 -0
- package/dist/services/db.d.ts.map +1 -0
- package/dist/services/db.js +93 -0
- package/dist/services/db.js.map +1 -0
- package/dist/services/memoryService.d.ts +75 -0
- package/dist/services/memoryService.d.ts.map +1 -0
- package/dist/services/memoryService.js +391 -0
- package/dist/services/memoryService.js.map +1 -0
- package/dist/test-db.d.ts +8 -0
- package/dist/test-db.d.ts.map +1 -0
- package/dist/test-db.js +94 -0
- package/dist/test-db.js.map +1 -0
- package/dist/test-memory.d.ts +2 -0
- package/dist/test-memory.d.ts.map +1 -0
- package/dist/test-memory.js +79 -0
- package/dist/test-memory.js.map +1 -0
- package/openclaw.plugin.json +37 -0
- package/package.json +49 -0
- package/schemas/db.sql +371 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure the given agentId exists in the agents table.
|
|
3
|
+
* Uses an in-memory cache so we only hit the DB once per agent per process lifetime.
|
|
4
|
+
*/
|
|
5
|
+
export declare function ensureAgent(agentId: string): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Semantic search + graph traversal against memory_semantic + entity_edges.
|
|
8
|
+
* Returns formatted context string or null if no results found.
|
|
9
|
+
*/
|
|
10
|
+
export declare function searchPostgres(agentId: string, userText: string): Promise<string | null>;
|
|
11
|
+
/**
|
|
12
|
+
* Log an episodic memory event to memory_episodic.
|
|
13
|
+
*/
|
|
14
|
+
export declare function logEpisodicMemory(agentId: string, text: string, embedding: number[], eventType?: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Log a single tool call execution to memory_episodic.
|
|
17
|
+
*/
|
|
18
|
+
export declare function logEpisodicToolCall(agentId: string, toolCallId: string, toolName: string, toolArgs: string, embedding: number[]): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Fetch persona rules (core + situational) from agent_persona.
|
|
21
|
+
*/
|
|
22
|
+
export declare function fetchPersonaContext(agentId: string, embedding: number[] | null): Promise<string | null>;
|
|
23
|
+
/** OpenAI-compatible tool definition (function calling format). */
|
|
24
|
+
export interface ChatCompletionTool {
|
|
25
|
+
type: "function";
|
|
26
|
+
function: {
|
|
27
|
+
name: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
parameters?: Record<string, unknown>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetch dynamic tools from context_environment based on embedding similarity.
|
|
34
|
+
*/
|
|
35
|
+
export declare function fetchDynamicTools(agentId: string, embedding: number[]): Promise<ChatCompletionTool[]>;
|
|
36
|
+
export interface MemoryOptions {
|
|
37
|
+
category?: string;
|
|
38
|
+
source_uri?: string;
|
|
39
|
+
volatility?: "low" | "medium" | "high";
|
|
40
|
+
is_pointer?: boolean;
|
|
41
|
+
token_count?: number;
|
|
42
|
+
confidence?: number;
|
|
43
|
+
tier?: "volatile" | "session" | "daily" | "stable" | "permanent";
|
|
44
|
+
usefulness_score?: number;
|
|
45
|
+
expires_at?: Date | null;
|
|
46
|
+
metadata?: Record<string, any>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Store a new semantic memory fact. Deduplicates via content_hash.
|
|
50
|
+
*/
|
|
51
|
+
export declare function storeMemory(agentId: string, content: string, scope?: "private" | "shared" | "global", options?: MemoryOptions): Promise<{
|
|
52
|
+
id: string | null;
|
|
53
|
+
status: string;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* Supersede an old memory with a corrected/updated fact.
|
|
57
|
+
* Archives the old memory and creates a new one with a causal link.
|
|
58
|
+
*/
|
|
59
|
+
export declare function updateMemory(agentId: string, oldMemoryId: string, newFact: string, options?: MemoryOptions): Promise<{
|
|
60
|
+
newId: string | null;
|
|
61
|
+
status: string;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Create a directed edge between two memories in the knowledge graph.
|
|
65
|
+
*/
|
|
66
|
+
export declare function linkMemories(agentId: string, sourceId: string, targetId: string, relationship: string): Promise<{
|
|
67
|
+
status: string;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* Store or update a tool definition in context_environment.
|
|
71
|
+
*/
|
|
72
|
+
export declare function storeTool(agentId: string, toolName: string, toolJson: string, scope?: "private" | "shared" | "global"): Promise<{
|
|
73
|
+
status: string;
|
|
74
|
+
}>;
|
|
75
|
+
//# sourceMappingURL=memoryService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryService.d.ts","sourceRoot":"","sources":["../../services/memoryService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureAgent = ensureAgent;
|
|
4
|
+
exports.searchPostgres = searchPostgres;
|
|
5
|
+
exports.logEpisodicMemory = logEpisodicMemory;
|
|
6
|
+
exports.logEpisodicToolCall = logEpisodicToolCall;
|
|
7
|
+
exports.fetchPersonaContext = fetchPersonaContext;
|
|
8
|
+
exports.fetchDynamicTools = fetchDynamicTools;
|
|
9
|
+
exports.storeMemory = storeMemory;
|
|
10
|
+
exports.updateMemory = updateMemory;
|
|
11
|
+
exports.linkMemories = linkMemories;
|
|
12
|
+
exports.storeTool = storeTool;
|
|
13
|
+
const db_js_1 = require("./db.js");
|
|
14
|
+
const zod_1 = require("zod");
|
|
15
|
+
const validation_js_1 = require("../schemas/validation.js");
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// LAZY AGENT AUTO-REGISTRATION
|
|
18
|
+
// =============================================================================
|
|
19
|
+
const registeredAgents = new Set();
|
|
20
|
+
/**
|
|
21
|
+
* Ensure the given agentId exists in the agents table.
|
|
22
|
+
* Uses an in-memory cache so we only hit the DB once per agent per process lifetime.
|
|
23
|
+
*/
|
|
24
|
+
async function ensureAgent(agentId) {
|
|
25
|
+
if (!agentId || registeredAgents.has(agentId))
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
await (0, db_js_1.getSql)() `INSERT INTO agents (id, name) VALUES (${agentId}, ${agentId}) ON CONFLICT DO NOTHING`;
|
|
29
|
+
registeredAgents.add(agentId);
|
|
30
|
+
console.log(`[AGENTS] Registered agent: ${agentId}`);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error(`[AGENTS] Failed to register agent ${agentId}:`, err);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// SEMANTIC SEARCH + GRAPH TRAVERSAL
|
|
38
|
+
// =============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Semantic search + graph traversal against memory_semantic + entity_edges.
|
|
41
|
+
* Returns formatted context string or null if no results found.
|
|
42
|
+
*/
|
|
43
|
+
async function searchPostgres(agentId, userText) {
|
|
44
|
+
let contextString = null;
|
|
45
|
+
try {
|
|
46
|
+
const embedding = await (0, db_js_1.getEmbedding)(userText);
|
|
47
|
+
await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
48
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
49
|
+
const results = await tx `
|
|
50
|
+
WITH semantic_matches AS (
|
|
51
|
+
SELECT id, content, 1 - (embedding <=> ${JSON.stringify(embedding)}) AS similarity
|
|
52
|
+
FROM memory_semantic
|
|
53
|
+
WHERE agent_id = ${agentId} AND is_archived = false
|
|
54
|
+
ORDER BY similarity DESC
|
|
55
|
+
LIMIT 7
|
|
56
|
+
),
|
|
57
|
+
linked_matches AS (
|
|
58
|
+
SELECT m.id, m.content, 0.8 AS similarity, e.relationship_type, sm.id AS source_match_id
|
|
59
|
+
FROM entity_edges e
|
|
60
|
+
JOIN memory_semantic m ON (e.target_memory_id = m.id OR e.source_memory_id = m.id)
|
|
61
|
+
JOIN semantic_matches sm ON (e.source_memory_id = sm.id OR e.target_memory_id = sm.id)
|
|
62
|
+
WHERE e.agent_id = ${agentId} AND m.id != sm.id AND m.is_archived = false
|
|
63
|
+
),
|
|
64
|
+
final_matches AS (
|
|
65
|
+
SELECT id, content, similarity, NULL as relationship_type FROM semantic_matches
|
|
66
|
+
UNION ALL
|
|
67
|
+
SELECT id, content, similarity, relationship_type FROM linked_matches
|
|
68
|
+
ORDER BY similarity DESC
|
|
69
|
+
LIMIT 15
|
|
70
|
+
)
|
|
71
|
+
SELECT * FROM final_matches;
|
|
72
|
+
`;
|
|
73
|
+
console.log(`[SEARCH] Query returned ${results.length} row(s) for agent=${agentId}`);
|
|
74
|
+
if (results.length > 0) {
|
|
75
|
+
contextString = results
|
|
76
|
+
.map((r) => {
|
|
77
|
+
const pct = (r.similarity * 100).toFixed(1) + "%";
|
|
78
|
+
const label = r.relationship_type
|
|
79
|
+
? `Linked: ${r.relationship_type}, ${pct}`
|
|
80
|
+
: pct;
|
|
81
|
+
return `[ID: ${r.id}] (${label}) - ${r.content}`;
|
|
82
|
+
})
|
|
83
|
+
.join("\n");
|
|
84
|
+
// Update tracking columns
|
|
85
|
+
const extractedIds = results.map((r) => r.id);
|
|
86
|
+
await tx `
|
|
87
|
+
UPDATE memory_semantic
|
|
88
|
+
SET access_count = access_count + 1,
|
|
89
|
+
last_accessed_at = CURRENT_TIMESTAMP
|
|
90
|
+
WHERE id IN ${(0, db_js_1.getSql)()(extractedIds)}
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
console.error("[SEARCH] Postgres search error:", err);
|
|
97
|
+
}
|
|
98
|
+
return contextString;
|
|
99
|
+
}
|
|
100
|
+
// =============================================================================
|
|
101
|
+
// EPISODIC MEMORY
|
|
102
|
+
// =============================================================================
|
|
103
|
+
/**
|
|
104
|
+
* Log an episodic memory event to memory_episodic.
|
|
105
|
+
*/
|
|
106
|
+
async function logEpisodicMemory(agentId, text, embedding, eventType = "user_prompt") {
|
|
107
|
+
try {
|
|
108
|
+
// Guard against undefined values that crash the postgres driver
|
|
109
|
+
if (!agentId) {
|
|
110
|
+
console.error(`[EPISODIC] Skipping: agentId is ${agentId}`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const modelName = db_js_1.EMBEDDING_MODEL || "text-embedding-nomic-embed-text-v2-moe";
|
|
114
|
+
await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
115
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
116
|
+
await tx `
|
|
117
|
+
INSERT INTO memory_episodic (
|
|
118
|
+
agent_id, session_id, event_summary, event_type, embedding, embedding_model
|
|
119
|
+
) VALUES (
|
|
120
|
+
${agentId}, 'active-session', ${text}, ${eventType},
|
|
121
|
+
${JSON.stringify(embedding)}, ${modelName}
|
|
122
|
+
)
|
|
123
|
+
`;
|
|
124
|
+
});
|
|
125
|
+
console.log(`[EPISODIC] Logged event (${eventType})`);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.error("[EPISODIC] Failed to log:", err);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Log a single tool call execution to memory_episodic.
|
|
133
|
+
*/
|
|
134
|
+
async function logEpisodicToolCall(agentId, toolCallId, toolName, toolArgs, embedding) {
|
|
135
|
+
const summary = `Agent executed tool: ${toolName} with arguments: ${toolArgs}`;
|
|
136
|
+
try {
|
|
137
|
+
if (!agentId) {
|
|
138
|
+
console.error(`[EPISODIC] Skipping tool call log: agentId is ${agentId}`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const modelName = db_js_1.EMBEDDING_MODEL || "text-embedding-nomic-embed-text-v2-moe";
|
|
142
|
+
await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
143
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
144
|
+
await tx `
|
|
145
|
+
INSERT INTO memory_episodic (
|
|
146
|
+
agent_id, session_id, event_summary, event_type, embedding, embedding_model, metadata
|
|
147
|
+
) VALUES (
|
|
148
|
+
${agentId}, 'active-session', ${summary}, 'tool_execution',
|
|
149
|
+
${JSON.stringify(embedding)}, ${modelName},
|
|
150
|
+
${JSON.stringify({ tool_call_id: toolCallId, tool_name: toolName })}
|
|
151
|
+
)
|
|
152
|
+
`;
|
|
153
|
+
});
|
|
154
|
+
console.log(`[EPISODIC] 🛠️ Logged tool execution (${toolName})`);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
console.error("[EPISODIC] Failed to log tool call:", err);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// =============================================================================
|
|
161
|
+
// PERSONA CONTEXT
|
|
162
|
+
// =============================================================================
|
|
163
|
+
/**
|
|
164
|
+
* Fetch persona rules (core + situational) from agent_persona.
|
|
165
|
+
*/
|
|
166
|
+
async function fetchPersonaContext(agentId, embedding) {
|
|
167
|
+
let personaContext = null;
|
|
168
|
+
try {
|
|
169
|
+
await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
170
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
171
|
+
let results;
|
|
172
|
+
if (embedding) {
|
|
173
|
+
// Full fetch: core + situational (similarity-ranked)
|
|
174
|
+
results = await tx `
|
|
175
|
+
WITH core_persona AS (
|
|
176
|
+
SELECT category, content, 1.0 AS relevance_score
|
|
177
|
+
FROM agent_persona
|
|
178
|
+
WHERE is_always_active = true
|
|
179
|
+
),
|
|
180
|
+
situational_persona AS (
|
|
181
|
+
SELECT category, content, 1 - (embedding <=> ${JSON.stringify(embedding)}) AS relevance_score
|
|
182
|
+
FROM agent_persona
|
|
183
|
+
WHERE is_always_active = false
|
|
184
|
+
ORDER BY embedding <=> ${JSON.stringify(embedding)}
|
|
185
|
+
LIMIT 3
|
|
186
|
+
)
|
|
187
|
+
SELECT * FROM core_persona
|
|
188
|
+
UNION ALL
|
|
189
|
+
SELECT * FROM situational_persona
|
|
190
|
+
ORDER BY relevance_score DESC;
|
|
191
|
+
`;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// No embedding available (e.g. first prompt) — only core rules
|
|
195
|
+
results = await tx `
|
|
196
|
+
SELECT category, content, 1.0 AS relevance_score
|
|
197
|
+
FROM agent_persona
|
|
198
|
+
WHERE is_always_active = true
|
|
199
|
+
ORDER BY category;
|
|
200
|
+
`;
|
|
201
|
+
}
|
|
202
|
+
if (results.length > 0) {
|
|
203
|
+
personaContext = results
|
|
204
|
+
.map((r) => `* **[${r.category}]**: ${r.content}`)
|
|
205
|
+
.join("\n");
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
console.error("[PERSONA] Fetch failed:", err);
|
|
211
|
+
}
|
|
212
|
+
return personaContext;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Fetch dynamic tools from context_environment based on embedding similarity.
|
|
216
|
+
*/
|
|
217
|
+
async function fetchDynamicTools(agentId, embedding) {
|
|
218
|
+
let dynamicTools = [];
|
|
219
|
+
try {
|
|
220
|
+
await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
221
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
222
|
+
const results = await tx `
|
|
223
|
+
SELECT tool_name, context_data, 1 - (embedding <=> ${JSON.stringify(embedding)}) AS similarity
|
|
224
|
+
FROM context_environment
|
|
225
|
+
WHERE 1 - (embedding <=> ${JSON.stringify(embedding)}) > 0.35
|
|
226
|
+
ORDER BY similarity DESC
|
|
227
|
+
LIMIT 3;
|
|
228
|
+
`;
|
|
229
|
+
if (results.length > 0) {
|
|
230
|
+
dynamicTools = results.map((r) => JSON.parse(r.context_data));
|
|
231
|
+
console.log(`[TOOLS] 🔧 Loaded ${dynamicTools.length} dynamic tool(s): ${dynamicTools.map(t => t.function.name).join(", ")}`);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
console.error("[TOOLS] Failed to fetch dynamic tools:", err);
|
|
237
|
+
}
|
|
238
|
+
return dynamicTools;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Store a new semantic memory fact. Deduplicates via content_hash.
|
|
242
|
+
*/
|
|
243
|
+
async function storeMemory(agentId, content, scope = "private", options = {}) {
|
|
244
|
+
try {
|
|
245
|
+
const validated = validation_js_1.StoreMemoryInputSchema.parse({ content, scope, options: Object.keys(options).length > 0 ? options : undefined });
|
|
246
|
+
const embedding = await (0, db_js_1.getEmbedding)(validated.content);
|
|
247
|
+
const contentHash = (0, db_js_1.hashContent)(validated.content);
|
|
248
|
+
const result = await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
249
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
250
|
+
const rows = await tx `
|
|
251
|
+
INSERT INTO memory_semantic (
|
|
252
|
+
agent_id, access_scope, content, content_hash, embedding, embedding_model,
|
|
253
|
+
category, source_uri, volatility, is_pointer, token_count, confidence, tier, usefulness_score, expires_at, metadata
|
|
254
|
+
) VALUES (
|
|
255
|
+
${agentId}, ${scope}, ${content}, ${contentHash},
|
|
256
|
+
${JSON.stringify(embedding)}, ${db_js_1.EMBEDDING_MODEL},
|
|
257
|
+
${validated.options?.category || null}, ${validated.options?.source_uri || null}, ${validated.options?.volatility || 'low'}, ${validated.options?.is_pointer || false},
|
|
258
|
+
${validated.options?.token_count || 0}, ${validated.options?.confidence || 0.5}, ${validated.options?.tier || 'daily'}, ${validated.options?.usefulness_score || 0.0},
|
|
259
|
+
${validated.options?.expires_at || null}, ${validated.options?.metadata ? JSON.stringify(validated.options.metadata) : '{}'}
|
|
260
|
+
)
|
|
261
|
+
ON CONFLICT (agent_id, content_hash) DO NOTHING
|
|
262
|
+
RETURNING id;
|
|
263
|
+
`;
|
|
264
|
+
return rows;
|
|
265
|
+
});
|
|
266
|
+
if (result.length > 0) {
|
|
267
|
+
console.log(`[MEMORY] Stored new fact: "${content.substring(0, 60)}..."`);
|
|
268
|
+
return { id: result[0].id, status: "stored" };
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
console.log(`[MEMORY] Duplicate — fact already exists.`);
|
|
272
|
+
return { id: null, status: "duplicate" };
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
if (err instanceof zod_1.z.ZodError) {
|
|
277
|
+
console.error("[MEMORY] Validation failed:", err.errors);
|
|
278
|
+
return { id: null, status: "error: validation failed" };
|
|
279
|
+
}
|
|
280
|
+
console.error("[MEMORY] Failed to store:", err);
|
|
281
|
+
return { id: null, status: `error: ${err}` };
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// =============================================================================
|
|
285
|
+
// MEMORY UPDATE (replaces db-memory-update skill)
|
|
286
|
+
// =============================================================================
|
|
287
|
+
/**
|
|
288
|
+
* Supersede an old memory with a corrected/updated fact.
|
|
289
|
+
* Archives the old memory and creates a new one with a causal link.
|
|
290
|
+
*/
|
|
291
|
+
async function updateMemory(agentId, oldMemoryId, newFact, options = {}) {
|
|
292
|
+
try {
|
|
293
|
+
const validated = validation_js_1.UpdateMemoryInputSchema.parse({ oldMemoryId, newFact, options: Object.keys(options).length > 0 ? options : undefined });
|
|
294
|
+
const embedding = await (0, db_js_1.getEmbedding)(validated.newFact);
|
|
295
|
+
const contentHash = (0, db_js_1.hashContent)(validated.newFact);
|
|
296
|
+
const result = await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
297
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
298
|
+
// Insert the new truth
|
|
299
|
+
const newMem = await tx `
|
|
300
|
+
INSERT INTO memory_semantic (
|
|
301
|
+
agent_id, access_scope, content, content_hash, embedding, embedding_model,
|
|
302
|
+
category, source_uri, volatility, is_pointer, token_count, confidence, tier, usefulness_score, expires_at, metadata
|
|
303
|
+
) VALUES (
|
|
304
|
+
${agentId}, 'global', ${validated.newFact}, ${contentHash},
|
|
305
|
+
${JSON.stringify(embedding)}, ${db_js_1.EMBEDDING_MODEL},
|
|
306
|
+
${validated.options?.category || null}, ${validated.options?.source_uri || null}, ${validated.options?.volatility || 'low'}, ${validated.options?.is_pointer || false},
|
|
307
|
+
${validated.options?.token_count || 0}, ${validated.options?.confidence || 0.5}, ${validated.options?.tier || 'daily'}, ${validated.options?.usefulness_score || 0.0},
|
|
308
|
+
${validated.options?.expires_at || null}, ${validated.options?.metadata ? JSON.stringify(validated.options.metadata) : '{}'}
|
|
309
|
+
)
|
|
310
|
+
RETURNING id;
|
|
311
|
+
`;
|
|
312
|
+
const newId = newMem[0].id;
|
|
313
|
+
// Deprecate the old memory
|
|
314
|
+
await tx `
|
|
315
|
+
UPDATE memory_semantic
|
|
316
|
+
SET is_archived = true, superseded_by = ${newId}
|
|
317
|
+
WHERE id = ${validated.oldMemoryId} AND agent_id = ${agentId};
|
|
318
|
+
`;
|
|
319
|
+
return newId;
|
|
320
|
+
});
|
|
321
|
+
console.log(`[MEMORY] Updated. Old (${oldMemoryId.substring(0, 8)}) deprecated, new truth: ${result.substring(0, 8)}`);
|
|
322
|
+
return { newId: result, status: "updated" };
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
if (err instanceof zod_1.z.ZodError) {
|
|
326
|
+
console.error("[MEMORY] Validation failed:", err.errors);
|
|
327
|
+
return { newId: null, status: "error: validation failed" };
|
|
328
|
+
}
|
|
329
|
+
console.error("[MEMORY] Failed to update:", err);
|
|
330
|
+
return { newId: null, status: `error: ${err}` };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// =============================================================================
|
|
334
|
+
// MEMORY LINK (replaces db-memory-link skill)
|
|
335
|
+
// =============================================================================
|
|
336
|
+
/**
|
|
337
|
+
* Create a directed edge between two memories in the knowledge graph.
|
|
338
|
+
*/
|
|
339
|
+
async function linkMemories(agentId, sourceId, targetId, relationship) {
|
|
340
|
+
try {
|
|
341
|
+
await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
342
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
343
|
+
await tx `
|
|
344
|
+
INSERT INTO entity_edges (agent_id, source_memory_id, target_memory_id, relationship_type, weight)
|
|
345
|
+
VALUES (${agentId}, ${sourceId}, ${targetId}, ${relationship}, 1.0)
|
|
346
|
+
ON CONFLICT (source_memory_id, target_memory_id, relationship_type) DO NOTHING;
|
|
347
|
+
`;
|
|
348
|
+
});
|
|
349
|
+
console.log(`[GRAPH] Linked ${sourceId.substring(0, 8)} → ${targetId.substring(0, 8)} as "${relationship}"`);
|
|
350
|
+
return { status: "linked" };
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
console.error("[GRAPH] Failed to link:", err);
|
|
354
|
+
return { status: `error: ${err}` };
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// =============================================================================
|
|
358
|
+
// TOOL STORE (replaces db-tool-store skill)
|
|
359
|
+
// =============================================================================
|
|
360
|
+
/**
|
|
361
|
+
* Store or update a tool definition in context_environment.
|
|
362
|
+
*/
|
|
363
|
+
async function storeTool(agentId, toolName, toolJson, scope = "private") {
|
|
364
|
+
try {
|
|
365
|
+
const toolObj = JSON.parse(toolJson);
|
|
366
|
+
const description = toolObj.function?.description || toolObj.description || "";
|
|
367
|
+
const embedText = `${toolName}: ${description}`;
|
|
368
|
+
const embedding = await (0, db_js_1.getEmbedding)(embedText);
|
|
369
|
+
await (0, db_js_1.getSql)().begin(async (tx) => {
|
|
370
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
371
|
+
await tx `
|
|
372
|
+
INSERT INTO context_environment (
|
|
373
|
+
agent_id, access_scope, tool_name, context_data, embedding
|
|
374
|
+
) VALUES (
|
|
375
|
+
${agentId}, ${scope}, ${toolName}, ${toolJson}, ${JSON.stringify(embedding)}
|
|
376
|
+
)
|
|
377
|
+
ON CONFLICT (agent_id, tool_name) DO UPDATE SET
|
|
378
|
+
context_data = EXCLUDED.context_data,
|
|
379
|
+
embedding = EXCLUDED.embedding,
|
|
380
|
+
access_scope = EXCLUDED.access_scope;
|
|
381
|
+
`;
|
|
382
|
+
});
|
|
383
|
+
console.log(`[TOOLS] Stored/updated tool schema: ${toolName}`);
|
|
384
|
+
return { status: "stored" };
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
console.error("[TOOLS] Failed to store tool:", err);
|
|
388
|
+
return { status: `error: ${err}` };
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=memoryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryService.js","sourceRoot":"","sources":["../../services/memoryService.ts"],"names":[],"mappings":";;AAcA,kCASC;AAUD,wCA8DC;AASD,8CA6BC;AAKD,kDAgCC;AASD,kDAkDC;AAmBD,8CAyBC;AAoBD,kCA8CC;AAUD,oCAkDC;AASD,oCAsBC;AASD,8BAiCC;AAxdD,mCAA6E;AAC7E,6BAAwB;AACxB,4DAA2F;AAE3F,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE3C;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO;IACtD,IAAI,CAAC;QACH,MAAM,IAAA,cAAM,GAAE,CAAA,yCAAyC,OAAO,KAAK,OAAO,0BAA0B,CAAC;QACrG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,oCAAoC;AACpC,gFAAgF;AAEhF;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,QAAgB;IACpE,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAA,oBAAY,EAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACrC,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAA;;mDAEqB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;6BAE/C,OAAO;;;;;;;;;+BASL,OAAO;;;;;;;;;;OAU/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,MAAM,qBAAqB,OAAO,EAAE,CAAC,CAAC;YAErF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,aAAa,GAAG,OAAO;qBACpB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;oBACd,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBAClD,MAAM,KAAK,GAAG,CAAC,CAAC,iBAAiB;wBAC/B,CAAC,CAAC,WAAW,CAAC,CAAC,iBAAiB,KAAK,GAAG,EAAE;wBAC1C,CAAC,CAAC,GAAG,CAAC;oBACR,OAAO,QAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;gBACnD,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,0BAA0B;gBAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM,EAAE,CAAA;;;;wBAIQ,IAAA,cAAM,GAAE,CAAC,YAAY,CAAC;SACrC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,OAAe,EACrD,IAAY,EACZ,SAAmB,EACnB,YAAoB,aAAa;IAEjC,IAAI,CAAC;QACH,gEAAgE;QAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,uBAAe,IAAI,wCAAwC,CAAC;QAE9E,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACrC,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,MAAM,EAAE,CAAA;;;;YAIF,OAAO,uBAAuB,IAAI,KAAK,SAAS;YAChD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,SAAS;;OAE5C,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,GAAG,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CAAC,OAAe,EACvD,UAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,SAAmB;IAEnB,MAAM,OAAO,GAAG,wBAAwB,QAAQ,oBAAoB,QAAQ,EAAE,CAAC;IAE/E,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iDAAiD,OAAO,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,uBAAe,IAAI,wCAAwC,CAAC;QAE9E,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACrC,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,MAAM,EAAE,CAAA;;;;YAIF,OAAO,uBAAuB,OAAO;YACrC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,SAAS;YACvC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;;OAEtE,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,0CAA0C,QAAQ,GAAG,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;GAEG;AACI,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,SAA0B;IACnF,IAAI,cAAc,GAAkB,IAAI,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACrC,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,IAAI,OAAO,CAAC;YAEZ,IAAI,SAAS,EAAE,CAAC;gBACd,qDAAqD;gBACrD,OAAO,GAAG,MAAM,EAAE,CAAA;;;;;;;2DAOiC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;qCAG/C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;;;;;SAOrD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,OAAO,GAAG,MAAM,EAAE,CAAA;;;;;SAKjB,CAAC;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,cAAc,GAAG,OAAO;qBACrB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;qBACtD,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAgBD;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,SAAmB;IAC1E,IAAI,YAAY,GAAyB,EAAE,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACrC,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAA;6DAC+B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;mCAEnD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;OAGrD,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAuB,CAAC,CAAC;gBACzF,OAAO,CAAC,GAAG,CAAC,qBAAqB,YAAY,CAAC,MAAM,qBAAqB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChI,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAiBD;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,OAAe,EAC/C,OAAe,EACf,QAAyC,SAAS,EAClD,UAAyB,EAAE;IAE3B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,sCAAsB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAEnI,MAAM,SAAS,GAAG,MAAM,IAAA,oBAAY,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,IAAA,mBAAW,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACpD,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;;;;;YAKf,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,WAAW;YAC7C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,uBAAe;YAC7C,SAAS,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,KAAK,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,KAAK;YACnK,SAAS,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,GAAG,KAAK,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,OAAO,EAAE,gBAAgB,IAAI,GAAG;YAClK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;;;;OAI9H,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;YAC1E,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YACzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,YAAY,OAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAG,GAAW,CAAC,MAAM,CAAC,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,kDAAkD;AAClD,gFAAgF;AAEhF;;;GAGG;AACI,KAAK,UAAU,YAAY,CAAC,OAAe,EAChD,WAAmB,EACnB,OAAe,EACf,UAAyB,EAAE;IAE3B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,uCAAuB,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAE1I,MAAM,SAAS,GAAG,MAAM,IAAA,oBAAY,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,IAAA,mBAAW,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACpD,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,uBAAuB;YACvB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA;;;;;YAKjB,OAAO,eAAe,SAAS,CAAC,OAAO,KAAK,WAAW;YACvD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,uBAAe;YAC7C,SAAS,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,KAAK,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,KAAK;YACnK,SAAS,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,KAAK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,GAAG,KAAK,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,OAAO,EAAE,gBAAgB,IAAI,GAAG;YAClK,SAAS,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;;;OAG9H,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE3B,2BAA2B;YAC3B,MAAM,EAAE,CAAA;;kDAEoC,KAAK;qBAClC,SAAS,CAAC,WAAW,mBAAmB,OAAO;OAC7D,CAAC;YAEF,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,0BAA0B,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,4BAA4B,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACvH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,YAAY,OAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAG,GAAW,CAAC,MAAM,CAAC,CAAC;YAClE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;IAClD,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,8CAA8C;AAC9C,gFAAgF;AAEhF;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,OAAe,EAChD,QAAgB,EAChB,QAAgB,EAChB,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACrC,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,MAAM,EAAE,CAAA;;kBAEI,OAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK,YAAY;;OAE7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,YAAY,GAAG,CAAC,CAAC;QAC7G,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAEhF;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,OAAe,EAC7C,QAAgB,EAChB,QAAgB,EAChB,QAAyC,SAAS;IAElD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC/E,MAAM,SAAS,GAAG,GAAG,QAAQ,KAAK,WAAW,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,IAAA,oBAAY,EAAC,SAAS,CAAC,CAAC;QAEhD,MAAM,IAAA,cAAM,GAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACrC,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YAEtE,MAAM,EAAE,CAAA;;;;YAIF,OAAO,KAAK,KAAK,KAAK,QAAQ,KAAK,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;;;;OAM9E,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QACpD,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-db.d.ts","sourceRoot":"","sources":["../test-db.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/test-db.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Quick smoke test — verifies the plugin can connect to PostgreSQL
|
|
4
|
+
* and run a vector search end-to-end.
|
|
5
|
+
*
|
|
6
|
+
* Usage: npm run build && node dist/test-db.js
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const db_js_1 = require("./services/db.js");
|
|
10
|
+
const memoryService_js_1 = require("./services/memoryService.js");
|
|
11
|
+
async function main() {
|
|
12
|
+
console.log("=== Database Connection Test ===\n");
|
|
13
|
+
console.log(` Target: ${db_js_1.POSTCLAW_DB_URL}`);
|
|
14
|
+
(0, db_js_1.setEmbeddingConfig)("http://127.0.0.1:1234", "text-embedding-nomic-embed-text-v2-moe");
|
|
15
|
+
const TEST_AGENT_ID = "test-agent";
|
|
16
|
+
console.log(` Agent: ${TEST_AGENT_ID}\n`);
|
|
17
|
+
// ------------------------------------------------------------------
|
|
18
|
+
// 1. Basic connectivity check
|
|
19
|
+
// ------------------------------------------------------------------
|
|
20
|
+
console.log("[TEST 1] SELECT 1 health check...");
|
|
21
|
+
try {
|
|
22
|
+
const rows = await (0, db_js_1.getSql)() `SELECT 1 AS ok`;
|
|
23
|
+
if (rows[0]?.ok === 1) {
|
|
24
|
+
console.log(" ✅ Connection OK\n");
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
throw new Error("Unexpected result from SELECT 1");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error(" ❌ Connection FAILED:", err);
|
|
32
|
+
await (0, db_js_1.getSql)().end();
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// ------------------------------------------------------------------
|
|
36
|
+
// 2. Table existence check
|
|
37
|
+
// ------------------------------------------------------------------
|
|
38
|
+
console.log("[TEST 2] Checking required tables exist...");
|
|
39
|
+
try {
|
|
40
|
+
const tables = await (0, db_js_1.getSql)() `
|
|
41
|
+
SELECT table_name
|
|
42
|
+
FROM information_schema.tables
|
|
43
|
+
WHERE table_schema = 'public'
|
|
44
|
+
AND table_name IN ('memory_semantic', 'entity_edges', 'memory_episodic', 'agent_persona', 'context_environment')
|
|
45
|
+
ORDER BY table_name;
|
|
46
|
+
`;
|
|
47
|
+
const found = tables.map((t) => t.table_name);
|
|
48
|
+
console.log(` Found tables: ${found.join(", ")}`);
|
|
49
|
+
const required = ["memory_semantic", "entity_edges"];
|
|
50
|
+
const missing = required.filter((t) => !found.includes(t));
|
|
51
|
+
if (missing.length > 0) {
|
|
52
|
+
console.error(` ❌ Missing required tables: ${missing.join(", ")}`);
|
|
53
|
+
await (0, db_js_1.getSql)().end();
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
console.log(" ✅ All required tables present\n");
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
console.error(" ❌ Table check FAILED:", err);
|
|
60
|
+
await (0, db_js_1.getSql)().end();
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
// ------------------------------------------------------------------
|
|
64
|
+
// 3. End-to-end vector search
|
|
65
|
+
// ------------------------------------------------------------------
|
|
66
|
+
console.log("[TEST 3] Running searchPostgres('test query')...");
|
|
67
|
+
try {
|
|
68
|
+
const result = await (0, memoryService_js_1.searchPostgres)(TEST_AGENT_ID, "test query");
|
|
69
|
+
if (result) {
|
|
70
|
+
console.log(` ✅ Got ${result.split("\n").length} result(s):`);
|
|
71
|
+
// Print first 3 lines max for brevity
|
|
72
|
+
result.split("\n").slice(0, 3).forEach((line) => console.log(` ${line}`));
|
|
73
|
+
if (result.split("\n").length > 3)
|
|
74
|
+
console.log(" ...");
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(" ⚠️ No results returned (table may be empty — this is OK for a fresh DB)");
|
|
78
|
+
}
|
|
79
|
+
console.log();
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(" ❌ Search FAILED:", err);
|
|
83
|
+
await (0, db_js_1.getSql)().end();
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
// ------------------------------------------------------------------
|
|
87
|
+
// Done
|
|
88
|
+
// ------------------------------------------------------------------
|
|
89
|
+
console.log("=== All tests passed ===");
|
|
90
|
+
await (0, db_js_1.getSql)().end();
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
main();
|
|
94
|
+
//# sourceMappingURL=test-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-db.js","sourceRoot":"","sources":["../test-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-memory.d.ts","sourceRoot":"","sources":["../test-memory.ts"],"names":[],"mappings":""}
|