@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.
Files changed (46) hide show
  1. package/.env.example +4 -0
  2. package/LICENSE +15 -0
  3. package/README.md +731 -0
  4. package/dist/index.d.ts +36 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +506 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/schemas/validation.d.ts +81 -0
  9. package/dist/schemas/validation.d.ts.map +1 -0
  10. package/dist/schemas/validation.js +27 -0
  11. package/dist/schemas/validation.js.map +1 -0
  12. package/dist/scripts/bootstrap_persona.d.ts +20 -0
  13. package/dist/scripts/bootstrap_persona.d.ts.map +1 -0
  14. package/dist/scripts/bootstrap_persona.js +150 -0
  15. package/dist/scripts/bootstrap_persona.js.map +1 -0
  16. package/dist/scripts/bootstrap_tools.d.ts +2 -0
  17. package/dist/scripts/bootstrap_tools.d.ts.map +1 -0
  18. package/dist/scripts/bootstrap_tools.js +67 -0
  19. package/dist/scripts/bootstrap_tools.js.map +1 -0
  20. package/dist/scripts/setup-db.d.ts +28 -0
  21. package/dist/scripts/setup-db.d.ts.map +1 -0
  22. package/dist/scripts/setup-db.js +539 -0
  23. package/dist/scripts/setup-db.js.map +1 -0
  24. package/dist/scripts/sleep_cycle.d.ts +32 -0
  25. package/dist/scripts/sleep_cycle.d.ts.map +1 -0
  26. package/dist/scripts/sleep_cycle.js +452 -0
  27. package/dist/scripts/sleep_cycle.js.map +1 -0
  28. package/dist/services/db.d.ts +28 -0
  29. package/dist/services/db.d.ts.map +1 -0
  30. package/dist/services/db.js +93 -0
  31. package/dist/services/db.js.map +1 -0
  32. package/dist/services/memoryService.d.ts +75 -0
  33. package/dist/services/memoryService.d.ts.map +1 -0
  34. package/dist/services/memoryService.js +391 -0
  35. package/dist/services/memoryService.js.map +1 -0
  36. package/dist/test-db.d.ts +8 -0
  37. package/dist/test-db.d.ts.map +1 -0
  38. package/dist/test-db.js +94 -0
  39. package/dist/test-db.js.map +1 -0
  40. package/dist/test-memory.d.ts +2 -0
  41. package/dist/test-memory.d.ts.map +1 -0
  42. package/dist/test-memory.js +79 -0
  43. package/dist/test-memory.js.map +1 -0
  44. package/openclaw.plugin.json +37 -0
  45. package/package.json +49 -0
  46. 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,8 @@
1
+ /**
2
+ * Quick smoke test — verifies the plugin can connect to PostgreSQL
3
+ * and run a vector search end-to-end.
4
+ *
5
+ * Usage: npm run build && node dist/test-db.js
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=test-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-db.d.ts","sourceRoot":"","sources":["../test-db.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-memory.d.ts","sourceRoot":"","sources":["../test-memory.ts"],"names":[],"mappings":""}