@xynehq/jaf 0.1.2
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/LICENSE +21 -0
- package/README.md +596 -0
- package/dist/a2a/agent-card.d.ts +28 -0
- package/dist/a2a/agent-card.d.ts.map +1 -0
- package/dist/a2a/agent-card.js +250 -0
- package/dist/a2a/agent-card.js.map +1 -0
- package/dist/a2a/agent.d.ts +38 -0
- package/dist/a2a/agent.d.ts.map +1 -0
- package/dist/a2a/agent.js +223 -0
- package/dist/a2a/agent.js.map +1 -0
- package/dist/a2a/client.d.ts +35 -0
- package/dist/a2a/client.d.ts.map +1 -0
- package/dist/a2a/client.js +337 -0
- package/dist/a2a/client.js.map +1 -0
- package/dist/a2a/examples/client-example.d.ts +104 -0
- package/dist/a2a/examples/client-example.d.ts.map +1 -0
- package/dist/a2a/examples/client-example.js +232 -0
- package/dist/a2a/examples/client-example.js.map +1 -0
- package/dist/a2a/examples/server-example.d.ts +9 -0
- package/dist/a2a/examples/server-example.d.ts.map +1 -0
- package/dist/a2a/examples/server-example.js +209 -0
- package/dist/a2a/examples/server-example.js.map +1 -0
- package/dist/a2a/examples/weather-agent.d.ts +8 -0
- package/dist/a2a/examples/weather-agent.d.ts.map +1 -0
- package/dist/a2a/examples/weather-agent.js +232 -0
- package/dist/a2a/examples/weather-agent.js.map +1 -0
- package/dist/a2a/executor.d.ts +43 -0
- package/dist/a2a/executor.d.ts.map +1 -0
- package/dist/a2a/executor.js +507 -0
- package/dist/a2a/executor.js.map +1 -0
- package/dist/a2a/index.d.ts +378 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +72 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/a2a/memory/cleanup.d.ts +58 -0
- package/dist/a2a/memory/cleanup.d.ts.map +1 -0
- package/dist/a2a/memory/cleanup.js +281 -0
- package/dist/a2a/memory/cleanup.js.map +1 -0
- package/dist/a2a/memory/factory.d.ts +38 -0
- package/dist/a2a/memory/factory.d.ts.map +1 -0
- package/dist/a2a/memory/factory.js +369 -0
- package/dist/a2a/memory/factory.js.map +1 -0
- package/dist/a2a/memory/index.d.ts +13 -0
- package/dist/a2a/memory/index.d.ts.map +1 -0
- package/dist/a2a/memory/index.js +16 -0
- package/dist/a2a/memory/index.js.map +1 -0
- package/dist/a2a/memory/providers/in-memory.d.ts +10 -0
- package/dist/a2a/memory/providers/in-memory.d.ts.map +1 -0
- package/dist/a2a/memory/providers/in-memory.js +539 -0
- package/dist/a2a/memory/providers/in-memory.js.map +1 -0
- package/dist/a2a/memory/providers/postgres.d.ts +10 -0
- package/dist/a2a/memory/providers/postgres.d.ts.map +1 -0
- package/dist/a2a/memory/providers/postgres.js +404 -0
- package/dist/a2a/memory/providers/postgres.js.map +1 -0
- package/dist/a2a/memory/providers/redis.d.ts +10 -0
- package/dist/a2a/memory/providers/redis.d.ts.map +1 -0
- package/dist/a2a/memory/providers/redis.js +435 -0
- package/dist/a2a/memory/providers/redis.js.map +1 -0
- package/dist/a2a/memory/serialization.d.ts +53 -0
- package/dist/a2a/memory/serialization.d.ts.map +1 -0
- package/dist/a2a/memory/serialization.js +233 -0
- package/dist/a2a/memory/serialization.js.map +1 -0
- package/dist/a2a/memory/types.d.ts +395 -0
- package/dist/a2a/memory/types.d.ts.map +1 -0
- package/dist/a2a/memory/types.js +85 -0
- package/dist/a2a/memory/types.js.map +1 -0
- package/dist/a2a/protocol.d.ts +38 -0
- package/dist/a2a/protocol.d.ts.map +1 -0
- package/dist/a2a/protocol.js +211 -0
- package/dist/a2a/protocol.js.map +1 -0
- package/dist/a2a/server.d.ts +343 -0
- package/dist/a2a/server.d.ts.map +1 -0
- package/dist/a2a/server.js +362 -0
- package/dist/a2a/server.js.map +1 -0
- package/dist/a2a/types.d.ts +730 -0
- package/dist/a2a/types.d.ts.map +1 -0
- package/dist/a2a/types.js +73 -0
- package/dist/a2a/types.js.map +1 -0
- package/dist/adk/agents/index.d.ts +48 -0
- package/dist/adk/agents/index.d.ts.map +1 -0
- package/dist/adk/agents/index.js +277 -0
- package/dist/adk/agents/index.js.map +1 -0
- package/dist/adk/artifacts/index.d.ts +62 -0
- package/dist/adk/artifacts/index.d.ts.map +1 -0
- package/dist/adk/artifacts/index.js +394 -0
- package/dist/adk/artifacts/index.js.map +1 -0
- package/dist/adk/config/llm-config.d.ts +75 -0
- package/dist/adk/config/llm-config.d.ts.map +1 -0
- package/dist/adk/config/llm-config.js +422 -0
- package/dist/adk/config/llm-config.js.map +1 -0
- package/dist/adk/content/index.d.ts +58 -0
- package/dist/adk/content/index.d.ts.map +1 -0
- package/dist/adk/content/index.js +220 -0
- package/dist/adk/content/index.js.map +1 -0
- package/dist/adk/examples/advanced-features.d.ts +22 -0
- package/dist/adk/examples/advanced-features.d.ts.map +1 -0
- package/dist/adk/examples/advanced-features.js +380 -0
- package/dist/adk/examples/advanced-features.js.map +1 -0
- package/dist/adk/examples/basic-agent.d.ts +28 -0
- package/dist/adk/examples/basic-agent.d.ts.map +1 -0
- package/dist/adk/examples/basic-agent.js +207 -0
- package/dist/adk/examples/basic-agent.js.map +1 -0
- package/dist/adk/examples/multi-agent.d.ts +24 -0
- package/dist/adk/examples/multi-agent.d.ts.map +1 -0
- package/dist/adk/examples/multi-agent.js +321 -0
- package/dist/adk/examples/multi-agent.js.map +1 -0
- package/dist/adk/examples/streaming-example.d.ts +9 -0
- package/dist/adk/examples/streaming-example.d.ts.map +1 -0
- package/dist/adk/examples/streaming-example.js +193 -0
- package/dist/adk/examples/streaming-example.js.map +1 -0
- package/dist/adk/index.d.ts +65 -0
- package/dist/adk/index.d.ts.map +1 -0
- package/dist/adk/index.js +251 -0
- package/dist/adk/index.js.map +1 -0
- package/dist/adk/models.d.ts +338 -0
- package/dist/adk/models.d.ts.map +1 -0
- package/dist/adk/models.js +466 -0
- package/dist/adk/models.js.map +1 -0
- package/dist/adk/providers/error-handler.d.ts +100 -0
- package/dist/adk/providers/error-handler.d.ts.map +1 -0
- package/dist/adk/providers/error-handler.js +289 -0
- package/dist/adk/providers/error-handler.js.map +1 -0
- package/dist/adk/providers/llm-service.d.ts +41 -0
- package/dist/adk/providers/llm-service.d.ts.map +1 -0
- package/dist/adk/providers/llm-service.js +520 -0
- package/dist/adk/providers/llm-service.js.map +1 -0
- package/dist/adk/providers/type-converters.d.ts +34 -0
- package/dist/adk/providers/type-converters.d.ts.map +1 -0
- package/dist/adk/providers/type-converters.js +436 -0
- package/dist/adk/providers/type-converters.js.map +1 -0
- package/dist/adk/runners/index.d.ts +33 -0
- package/dist/adk/runners/index.d.ts.map +1 -0
- package/dist/adk/runners/index.js +466 -0
- package/dist/adk/runners/index.js.map +1 -0
- package/dist/adk/schemas/index.d.ts +85 -0
- package/dist/adk/schemas/index.d.ts.map +1 -0
- package/dist/adk/schemas/index.js +363 -0
- package/dist/adk/schemas/index.js.map +1 -0
- package/dist/adk/sessions/examples/session-provider-usage.d.ts +10 -0
- package/dist/adk/sessions/examples/session-provider-usage.d.ts.map +1 -0
- package/dist/adk/sessions/examples/session-provider-usage.js +145 -0
- package/dist/adk/sessions/examples/session-provider-usage.js.map +1 -0
- package/dist/adk/sessions/index.d.ts +53 -0
- package/dist/adk/sessions/index.d.ts.map +1 -0
- package/dist/adk/sessions/index.js +451 -0
- package/dist/adk/sessions/index.js.map +1 -0
- package/dist/adk/sessions/postgres-provider.d.ts +22 -0
- package/dist/adk/sessions/postgres-provider.d.ts.map +1 -0
- package/dist/adk/sessions/postgres-provider.js +293 -0
- package/dist/adk/sessions/postgres-provider.js.map +1 -0
- package/dist/adk/sessions/redis-provider.d.ts +19 -0
- package/dist/adk/sessions/redis-provider.d.ts.map +1 -0
- package/dist/adk/sessions/redis-provider.js +237 -0
- package/dist/adk/sessions/redis-provider.js.map +1 -0
- package/dist/adk/streaming/index.d.ts +76 -0
- package/dist/adk/streaming/index.d.ts.map +1 -0
- package/dist/adk/streaming/index.js +419 -0
- package/dist/adk/streaming/index.js.map +1 -0
- package/dist/adk/tools/index.d.ts +27 -0
- package/dist/adk/tools/index.d.ts.map +1 -0
- package/dist/adk/tools/index.js +506 -0
- package/dist/adk/tools/index.js.map +1 -0
- package/dist/adk/types.d.ts +351 -0
- package/dist/adk/types.d.ts.map +1 -0
- package/dist/adk/types.js +107 -0
- package/dist/adk/types.js.map +1 -0
- package/dist/core/engine.d.ts +3 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +438 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +84 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/tool-results.d.ts +57 -0
- package/dist/core/tool-results.d.ts.map +1 -0
- package/dist/core/tool-results.js +133 -0
- package/dist/core/tool-results.js.map +1 -0
- package/dist/core/tracing.d.ts +32 -0
- package/dist/core/tracing.d.ts.map +1 -0
- package/dist/core/tracing.js +132 -0
- package/dist/core/tracing.js.map +1 -0
- package/dist/core/types.d.ts +165 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/demo/agents.d.ts +23 -0
- package/dist/demo/agents.d.ts.map +1 -0
- package/dist/demo/agents.js +69 -0
- package/dist/demo/agents.js.map +1 -0
- package/dist/demo/index.d.ts +2 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +250 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/mock-provider.d.ts +22 -0
- package/dist/demo/mock-provider.d.ts.map +1 -0
- package/dist/demo/mock-provider.js +138 -0
- package/dist/demo/mock-provider.js.map +1 -0
- package/dist/demo/tools.d.ts +14 -0
- package/dist/demo/tools.d.ts.map +1 -0
- package/dist/demo/tools.js +115 -0
- package/dist/demo/tools.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/factory.d.ts +22 -0
- package/dist/memory/factory.d.ts.map +1 -0
- package/dist/memory/factory.js +88 -0
- package/dist/memory/factory.js.map +1 -0
- package/dist/memory/providers/in-memory.d.ts +7 -0
- package/dist/memory/providers/in-memory.d.ts.map +1 -0
- package/dist/memory/providers/in-memory.js +287 -0
- package/dist/memory/providers/in-memory.js.map +1 -0
- package/dist/memory/providers/postgres.d.ts +15 -0
- package/dist/memory/providers/postgres.d.ts.map +1 -0
- package/dist/memory/providers/postgres.js +495 -0
- package/dist/memory/providers/postgres.js.map +1 -0
- package/dist/memory/providers/redis.d.ts +18 -0
- package/dist/memory/providers/redis.d.ts.map +1 -0
- package/dist/memory/providers/redis.js +354 -0
- package/dist/memory/providers/redis.js.map +1 -0
- package/dist/memory/types.d.ts +296 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +93 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/policies/handoff.d.ts +16 -0
- package/dist/policies/handoff.d.ts.map +1 -0
- package/dist/policies/handoff.js +20 -0
- package/dist/policies/handoff.js.map +1 -0
- package/dist/policies/validation.d.ts +14 -0
- package/dist/policies/validation.d.ts.map +1 -0
- package/dist/policies/validation.js +92 -0
- package/dist/policies/validation.js.map +1 -0
- package/dist/providers/mcp.d.ts +17 -0
- package/dist/providers/mcp.d.ts.map +1 -0
- package/dist/providers/mcp.js +111 -0
- package/dist/providers/mcp.js.map +1 -0
- package/dist/providers/model.d.ts +3 -0
- package/dist/providers/model.d.ts.map +1 -0
- package/dist/providers/model.js +113 -0
- package/dist/providers/model.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +66 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/server.d.ts +12 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +394 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +456 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +75 -0
- package/dist/server/types.js.map +1 -0
- package/dist/test-utils/db-setup.d.ts +34 -0
- package/dist/test-utils/db-setup.d.ts.map +1 -0
- package/dist/test-utils/db-setup.js +149 -0
- package/dist/test-utils/db-setup.js.map +1 -0
- package/dist/utils/logger.d.ts +63 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +199 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/safe-math.d.ts +31 -0
- package/dist/utils/safe-math.d.ts.map +1 -0
- package/dist/utils/safe-math.js +86 -0
- package/dist/utils/safe-math.js.map +1 -0
- package/dist/visualization/example.d.ts +9 -0
- package/dist/visualization/example.d.ts.map +1 -0
- package/dist/visualization/example.js +236 -0
- package/dist/visualization/example.js.map +1 -0
- package/dist/visualization/graphviz.d.ts +42 -0
- package/dist/visualization/graphviz.d.ts.map +1 -0
- package/dist/visualization/graphviz.js +403 -0
- package/dist/visualization/graphviz.js.map +1 -0
- package/dist/visualization/index.d.ts +10 -0
- package/dist/visualization/index.d.ts.map +1 -0
- package/dist/visualization/index.js +12 -0
- package/dist/visualization/index.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
import { createSuccess, createFailure, createMemoryConnectionError, createMemoryNotFoundError, createMemoryStorageError } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* PostgreSQL memory provider - fully persistent with advanced querying
|
|
4
|
+
* Best for production environments requiring complex queries and full persistence
|
|
5
|
+
*/
|
|
6
|
+
export async function createPostgresProvider(config, postgresClient) {
|
|
7
|
+
const fullConfig = {
|
|
8
|
+
...config,
|
|
9
|
+
type: 'postgres',
|
|
10
|
+
host: config.host ?? 'localhost',
|
|
11
|
+
port: config.port ?? 5432,
|
|
12
|
+
database: config.database ?? 'jaf_memory',
|
|
13
|
+
username: config.username ?? 'postgres',
|
|
14
|
+
ssl: config.ssl ?? false,
|
|
15
|
+
tableName: config.tableName ?? 'conversations',
|
|
16
|
+
maxConnections: config.maxConnections ?? 10
|
|
17
|
+
};
|
|
18
|
+
try {
|
|
19
|
+
// Test connection and create table if needed
|
|
20
|
+
await initializeSchema(postgresClient, fullConfig);
|
|
21
|
+
console.log(`[MEMORY:Postgres] Connected to PostgreSQL at ${fullConfig.host}:${fullConfig.port}/${fullConfig.database}`);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw createMemoryConnectionError('PostgreSQL', error);
|
|
25
|
+
}
|
|
26
|
+
const ensureConnected = () => {
|
|
27
|
+
if (!postgresClient) {
|
|
28
|
+
throw createMemoryConnectionError('PostgreSQL', new Error('PostgreSQL client not initialized'));
|
|
29
|
+
}
|
|
30
|
+
return postgresClient;
|
|
31
|
+
};
|
|
32
|
+
const storeMessages = async (conversationId, messages, metadata) => {
|
|
33
|
+
const client = ensureConnected();
|
|
34
|
+
try {
|
|
35
|
+
const now = new Date();
|
|
36
|
+
const conversationMetadata = {
|
|
37
|
+
totalMessages: messages.length,
|
|
38
|
+
traceId: metadata?.traceId,
|
|
39
|
+
...metadata
|
|
40
|
+
};
|
|
41
|
+
const sql = `
|
|
42
|
+
INSERT INTO ${fullConfig.tableName}
|
|
43
|
+
(conversation_id, user_id, messages, metadata, created_at, updated_at, last_activity)
|
|
44
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
45
|
+
ON CONFLICT (conversation_id)
|
|
46
|
+
DO UPDATE SET
|
|
47
|
+
messages = $3,
|
|
48
|
+
metadata = $4,
|
|
49
|
+
updated_at = $6,
|
|
50
|
+
last_activity = $7
|
|
51
|
+
`;
|
|
52
|
+
await client.query(sql, [
|
|
53
|
+
conversationId,
|
|
54
|
+
metadata?.userId || null,
|
|
55
|
+
JSON.stringify(messages),
|
|
56
|
+
JSON.stringify(conversationMetadata),
|
|
57
|
+
now,
|
|
58
|
+
now,
|
|
59
|
+
now
|
|
60
|
+
]);
|
|
61
|
+
console.log(`[MEMORY:Postgres] Stored ${messages.length} messages for conversation ${conversationId}`);
|
|
62
|
+
return createSuccess(undefined);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return createFailure(createMemoryStorageError('store messages', 'PostgreSQL', error));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const getConversation = async (conversationId) => {
|
|
69
|
+
const client = ensureConnected();
|
|
70
|
+
try {
|
|
71
|
+
console.log(`[MEMORY:Postgres] Getting conversation ${conversationId}`);
|
|
72
|
+
const sql = `
|
|
73
|
+
SELECT conversation_id, user_id, messages, metadata, created_at, updated_at, last_activity
|
|
74
|
+
FROM ${fullConfig.tableName}
|
|
75
|
+
WHERE conversation_id = $1
|
|
76
|
+
`;
|
|
77
|
+
console.log(`[MEMORY:Postgres] Executing SQL: ${sql}`);
|
|
78
|
+
console.log(`[MEMORY:Postgres] Parameters:`, [conversationId]);
|
|
79
|
+
const result = await client.query(sql, [conversationId]);
|
|
80
|
+
console.log(`[MEMORY:Postgres] Query result: ${result.rows.length} rows found`);
|
|
81
|
+
if (result.rows.length === 0) {
|
|
82
|
+
console.log(`[MEMORY:Postgres] No conversation found for ${conversationId}`);
|
|
83
|
+
return createSuccess(null);
|
|
84
|
+
}
|
|
85
|
+
const row = result.rows[0];
|
|
86
|
+
console.log(`[MEMORY:Postgres] Raw row data:`, {
|
|
87
|
+
conversation_id: row.conversation_id,
|
|
88
|
+
user_id: row.user_id,
|
|
89
|
+
messages_length: row.messages?.length || 0,
|
|
90
|
+
metadata_length: row.metadata?.length || 0,
|
|
91
|
+
created_at: row.created_at,
|
|
92
|
+
updated_at: row.updated_at,
|
|
93
|
+
last_activity: row.last_activity
|
|
94
|
+
});
|
|
95
|
+
// Update last activity
|
|
96
|
+
const updateSQL = `
|
|
97
|
+
UPDATE ${fullConfig.tableName}
|
|
98
|
+
SET last_activity = NOW()
|
|
99
|
+
WHERE conversation_id = $1
|
|
100
|
+
`;
|
|
101
|
+
await client.query(updateSQL, [conversationId]);
|
|
102
|
+
console.log(`[MEMORY:Postgres] Parsing messages JSON:`, row.messages);
|
|
103
|
+
console.log(`[MEMORY:Postgres] Messages type:`, typeof row.messages);
|
|
104
|
+
// Handle both string and object messages (PostgreSQL JSONB can return either)
|
|
105
|
+
let parsedMessages;
|
|
106
|
+
if (typeof row.messages === 'string') {
|
|
107
|
+
parsedMessages = JSON.parse(row.messages);
|
|
108
|
+
}
|
|
109
|
+
else if (Array.isArray(row.messages)) {
|
|
110
|
+
parsedMessages = row.messages;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
throw new Error('Invalid messages format: expected string or array');
|
|
114
|
+
}
|
|
115
|
+
console.log(`[MEMORY:Postgres] Parsed ${parsedMessages.length} messages`);
|
|
116
|
+
console.log(`[MEMORY:Postgres] Parsing metadata JSON:`, row.metadata);
|
|
117
|
+
console.log(`[MEMORY:Postgres] Metadata type:`, typeof row.metadata);
|
|
118
|
+
// Handle both string and object metadata (PostgreSQL JSONB can return either)
|
|
119
|
+
let parsedMetadata;
|
|
120
|
+
if (typeof row.metadata === 'string') {
|
|
121
|
+
parsedMetadata = JSON.parse(row.metadata || '{}');
|
|
122
|
+
}
|
|
123
|
+
else if (typeof row.metadata === 'object' && row.metadata !== null) {
|
|
124
|
+
parsedMetadata = row.metadata;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
parsedMetadata = {};
|
|
128
|
+
}
|
|
129
|
+
console.log(`[MEMORY:Postgres] Parsed metadata:`, parsedMetadata);
|
|
130
|
+
const conversation = {
|
|
131
|
+
conversationId: row.conversation_id,
|
|
132
|
+
userId: row.user_id,
|
|
133
|
+
messages: parsedMessages,
|
|
134
|
+
metadata: {
|
|
135
|
+
...parsedMetadata,
|
|
136
|
+
createdAt: new Date(row.created_at),
|
|
137
|
+
updatedAt: new Date(row.updated_at),
|
|
138
|
+
lastActivity: new Date(), // Use current time since we just updated it
|
|
139
|
+
totalMessages: parsedMessages.length
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
console.log(`[MEMORY:Postgres] Successfully created conversation object with ${conversation.messages.length} messages`);
|
|
143
|
+
console.log(`[MEMORY:Postgres] Retrieved conversation ${conversationId} with ${conversation.messages.length} messages`);
|
|
144
|
+
return createSuccess(conversation);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error(`[MEMORY:Postgres] Error in getConversation:`, error);
|
|
148
|
+
console.error(`[MEMORY:Postgres] Error stack:`, error.stack);
|
|
149
|
+
return createFailure(createMemoryStorageError('get conversation', 'PostgreSQL', error));
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const appendMessages = async (conversationId, messages, metadata) => {
|
|
153
|
+
const client = ensureConnected();
|
|
154
|
+
try {
|
|
155
|
+
// Get existing conversation
|
|
156
|
+
const existingResult = await getConversation(conversationId);
|
|
157
|
+
if (!existingResult.success) {
|
|
158
|
+
return existingResult;
|
|
159
|
+
}
|
|
160
|
+
if (!existingResult.data) {
|
|
161
|
+
return createFailure(createMemoryNotFoundError(conversationId, 'PostgreSQL'));
|
|
162
|
+
}
|
|
163
|
+
const existing = existingResult.data;
|
|
164
|
+
const updatedMessages = [...existing.messages, ...messages];
|
|
165
|
+
const now = new Date();
|
|
166
|
+
const updatedMetadata = {
|
|
167
|
+
...existing.metadata,
|
|
168
|
+
totalMessages: updatedMessages.length,
|
|
169
|
+
traceId: metadata?.traceId || existing.metadata?.traceId,
|
|
170
|
+
...metadata
|
|
171
|
+
};
|
|
172
|
+
const sql = `
|
|
173
|
+
UPDATE ${fullConfig.tableName}
|
|
174
|
+
SET messages = $1, metadata = $2, updated_at = $3, last_activity = $3
|
|
175
|
+
WHERE conversation_id = $4
|
|
176
|
+
`;
|
|
177
|
+
await client.query(sql, [
|
|
178
|
+
JSON.stringify(updatedMessages),
|
|
179
|
+
JSON.stringify(updatedMetadata),
|
|
180
|
+
now,
|
|
181
|
+
conversationId
|
|
182
|
+
]);
|
|
183
|
+
console.log(`[MEMORY:Postgres] Appended ${messages.length} messages to conversation ${conversationId} (total: ${updatedMessages.length})`);
|
|
184
|
+
return createSuccess(undefined);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return createFailure(createMemoryStorageError('append messages', 'PostgreSQL', error));
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const findConversations = async (query) => {
|
|
191
|
+
const client = ensureConnected();
|
|
192
|
+
try {
|
|
193
|
+
let sql = `
|
|
194
|
+
SELECT conversation_id, user_id, messages, metadata, created_at, updated_at, last_activity
|
|
195
|
+
FROM ${fullConfig.tableName}
|
|
196
|
+
WHERE 1=1
|
|
197
|
+
`;
|
|
198
|
+
const params = [];
|
|
199
|
+
let paramIndex = 1;
|
|
200
|
+
if (query.conversationId) {
|
|
201
|
+
sql += ` AND conversation_id = $${paramIndex}`;
|
|
202
|
+
params.push(query.conversationId);
|
|
203
|
+
paramIndex++;
|
|
204
|
+
}
|
|
205
|
+
if (query.userId) {
|
|
206
|
+
sql += ` AND user_id = $${paramIndex}`;
|
|
207
|
+
params.push(query.userId);
|
|
208
|
+
paramIndex++;
|
|
209
|
+
}
|
|
210
|
+
if (query.traceId) {
|
|
211
|
+
sql += ` AND metadata->>'traceId' = $${paramIndex}`;
|
|
212
|
+
params.push(query.traceId);
|
|
213
|
+
paramIndex++;
|
|
214
|
+
}
|
|
215
|
+
if (query.since) {
|
|
216
|
+
sql += ` AND created_at >= $${paramIndex}`;
|
|
217
|
+
params.push(query.since);
|
|
218
|
+
paramIndex++;
|
|
219
|
+
}
|
|
220
|
+
if (query.until) {
|
|
221
|
+
sql += ` AND created_at <= $${paramIndex}`;
|
|
222
|
+
params.push(query.until);
|
|
223
|
+
paramIndex++;
|
|
224
|
+
}
|
|
225
|
+
// Sort by last activity (most recent first)
|
|
226
|
+
sql += ` ORDER BY last_activity DESC`;
|
|
227
|
+
// Add pagination
|
|
228
|
+
if (query.limit) {
|
|
229
|
+
sql += ` LIMIT $${paramIndex}`;
|
|
230
|
+
params.push(query.limit);
|
|
231
|
+
paramIndex++;
|
|
232
|
+
}
|
|
233
|
+
if (query.offset) {
|
|
234
|
+
sql += ` OFFSET $${paramIndex}`;
|
|
235
|
+
params.push(query.offset);
|
|
236
|
+
paramIndex++;
|
|
237
|
+
}
|
|
238
|
+
const result = await client.query(sql, params);
|
|
239
|
+
const conversations = result.rows.map(row => {
|
|
240
|
+
// Handle both string and object messages (PostgreSQL JSONB can return either)
|
|
241
|
+
let parsedMessages;
|
|
242
|
+
if (typeof row.messages === 'string') {
|
|
243
|
+
parsedMessages = JSON.parse(row.messages);
|
|
244
|
+
}
|
|
245
|
+
else if (Array.isArray(row.messages)) {
|
|
246
|
+
parsedMessages = row.messages;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
throw new Error('Invalid messages format: expected string or array');
|
|
250
|
+
}
|
|
251
|
+
// Handle both string and object metadata (PostgreSQL JSONB can return either)
|
|
252
|
+
let parsedMetadata;
|
|
253
|
+
if (typeof row.metadata === 'string') {
|
|
254
|
+
parsedMetadata = JSON.parse(row.metadata || '{}');
|
|
255
|
+
}
|
|
256
|
+
else if (typeof row.metadata === 'object' && row.metadata !== null) {
|
|
257
|
+
parsedMetadata = row.metadata;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
parsedMetadata = {};
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
conversationId: row.conversation_id,
|
|
264
|
+
userId: row.user_id,
|
|
265
|
+
messages: parsedMessages,
|
|
266
|
+
metadata: {
|
|
267
|
+
...parsedMetadata,
|
|
268
|
+
createdAt: new Date(row.created_at),
|
|
269
|
+
updatedAt: new Date(row.updated_at),
|
|
270
|
+
lastActivity: new Date(row.last_activity),
|
|
271
|
+
totalMessages: parsedMessages.length
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
console.log(`[MEMORY:Postgres] Found ${conversations.length} conversations matching query`);
|
|
276
|
+
return createSuccess(conversations);
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
return createFailure(createMemoryStorageError('find conversations', 'PostgreSQL', error));
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
const getRecentMessages = async (conversationId, limit = 50) => {
|
|
283
|
+
const conversationResult = await getConversation(conversationId);
|
|
284
|
+
if (!conversationResult.success) {
|
|
285
|
+
return conversationResult;
|
|
286
|
+
}
|
|
287
|
+
if (!conversationResult.data) {
|
|
288
|
+
return createSuccess([]);
|
|
289
|
+
}
|
|
290
|
+
const messages = conversationResult.data.messages.slice(-limit);
|
|
291
|
+
console.log(`[MEMORY:Postgres] Retrieved ${messages.length} recent messages for conversation ${conversationId}`);
|
|
292
|
+
return createSuccess(messages);
|
|
293
|
+
};
|
|
294
|
+
const deleteConversation = async (conversationId) => {
|
|
295
|
+
const client = ensureConnected();
|
|
296
|
+
try {
|
|
297
|
+
const sql = `DELETE FROM ${fullConfig.tableName} WHERE conversation_id = $1`;
|
|
298
|
+
const result = await client.query(sql, [conversationId]);
|
|
299
|
+
const deleted = result.rowCount > 0;
|
|
300
|
+
console.log(`[MEMORY:Postgres] ${deleted ? 'Deleted' : 'Attempted to delete non-existent'} conversation ${conversationId}`);
|
|
301
|
+
return createSuccess(deleted);
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
return createFailure(createMemoryStorageError('delete conversation', 'PostgreSQL', error));
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
const clearUserConversations = async (userId) => {
|
|
308
|
+
const client = ensureConnected();
|
|
309
|
+
try {
|
|
310
|
+
const sql = `DELETE FROM ${fullConfig.tableName} WHERE user_id = $1`;
|
|
311
|
+
const result = await client.query(sql, [userId]);
|
|
312
|
+
const deletedCount = result.rowCount;
|
|
313
|
+
console.log(`[MEMORY:Postgres] Cleared ${deletedCount} conversations for user ${userId}`);
|
|
314
|
+
return createSuccess(deletedCount);
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
return createFailure(createMemoryStorageError('clear user conversations', 'PostgreSQL', error));
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
const getStats = async (userId) => {
|
|
321
|
+
const client = ensureConnected();
|
|
322
|
+
try {
|
|
323
|
+
let sql = `
|
|
324
|
+
SELECT
|
|
325
|
+
COUNT(*) as total_conversations,
|
|
326
|
+
MIN(created_at) as oldest_conversation,
|
|
327
|
+
MAX(created_at) as newest_conversation,
|
|
328
|
+
SUM((metadata->>'totalMessages')::int) as total_messages
|
|
329
|
+
FROM ${fullConfig.tableName}
|
|
330
|
+
`;
|
|
331
|
+
const params = [];
|
|
332
|
+
if (userId) {
|
|
333
|
+
sql += ' WHERE user_id = $1';
|
|
334
|
+
params.push(userId);
|
|
335
|
+
}
|
|
336
|
+
const result = await client.query(sql, params);
|
|
337
|
+
const row = result.rows[0];
|
|
338
|
+
return createSuccess({
|
|
339
|
+
totalConversations: parseInt(row.total_conversations) || 0,
|
|
340
|
+
totalMessages: parseInt(row.total_messages) || 0,
|
|
341
|
+
oldestConversation: row.oldest_conversation ? new Date(row.oldest_conversation) : undefined,
|
|
342
|
+
newestConversation: row.newest_conversation ? new Date(row.newest_conversation) : undefined
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
return createFailure(createMemoryStorageError('get stats', 'PostgreSQL', error));
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
const healthCheck = async () => {
|
|
350
|
+
const start = Date.now();
|
|
351
|
+
try {
|
|
352
|
+
const client = ensureConnected();
|
|
353
|
+
// Test basic connectivity
|
|
354
|
+
await client.query('SELECT 1');
|
|
355
|
+
// Test table operations
|
|
356
|
+
const testId = `health-check-${Date.now()}`;
|
|
357
|
+
const storeResult = await storeMessages(testId, [{ role: 'user', content: 'health check' }]);
|
|
358
|
+
if (!storeResult.success) {
|
|
359
|
+
return createSuccess({
|
|
360
|
+
healthy: false,
|
|
361
|
+
latencyMs: Date.now() - start,
|
|
362
|
+
error: storeResult.error.message
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
const getResult = await getConversation(testId);
|
|
366
|
+
if (!getResult.success) {
|
|
367
|
+
return createSuccess({
|
|
368
|
+
healthy: false,
|
|
369
|
+
latencyMs: Date.now() - start,
|
|
370
|
+
error: getResult.error.message
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
const deleteResult = await deleteConversation(testId);
|
|
374
|
+
if (!deleteResult.success) {
|
|
375
|
+
return createSuccess({
|
|
376
|
+
healthy: false,
|
|
377
|
+
latencyMs: Date.now() - start,
|
|
378
|
+
error: deleteResult.error.message
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
const latencyMs = Date.now() - start;
|
|
382
|
+
return createSuccess({ healthy: true, latencyMs });
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
return createSuccess({
|
|
386
|
+
healthy: false,
|
|
387
|
+
latencyMs: Date.now() - start,
|
|
388
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
const close = async () => {
|
|
393
|
+
try {
|
|
394
|
+
if (postgresClient) {
|
|
395
|
+
console.log('[MEMORY:Postgres] Closing PostgreSQL connection');
|
|
396
|
+
await postgresClient.end();
|
|
397
|
+
}
|
|
398
|
+
return createSuccess(undefined);
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
return createFailure(createMemoryStorageError('close connection', 'PostgreSQL', error));
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
const cleanupOldConversations = async (olderThanDays) => {
|
|
405
|
+
const client = ensureConnected();
|
|
406
|
+
try {
|
|
407
|
+
const sql = `
|
|
408
|
+
DELETE FROM ${fullConfig.tableName}
|
|
409
|
+
WHERE last_activity < NOW() - INTERVAL '${olderThanDays} days'
|
|
410
|
+
`;
|
|
411
|
+
const result = await client.query(sql);
|
|
412
|
+
const deletedCount = result.rowCount;
|
|
413
|
+
console.log(`[MEMORY:Postgres] Cleaned up ${deletedCount} conversations older than ${olderThanDays} days`);
|
|
414
|
+
return createSuccess(deletedCount);
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
return createFailure(createMemoryStorageError('cleanup old conversations', 'PostgreSQL', error));
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
const getAnalytics = async (userId) => {
|
|
421
|
+
const client = ensureConnected();
|
|
422
|
+
try {
|
|
423
|
+
let whereClause = '';
|
|
424
|
+
const params = [];
|
|
425
|
+
if (userId) {
|
|
426
|
+
whereClause = 'WHERE user_id = $1';
|
|
427
|
+
params.push(userId);
|
|
428
|
+
}
|
|
429
|
+
const sql = `
|
|
430
|
+
SELECT
|
|
431
|
+
AVG((metadata->>'totalMessages')::int) as avg_messages,
|
|
432
|
+
COUNT(CASE WHEN created_at >= NOW() - INTERVAL '7 days' THEN 1 END) as last_week,
|
|
433
|
+
COUNT(CASE WHEN created_at >= NOW() - INTERVAL '30 days' THEN 1 END) as last_month,
|
|
434
|
+
EXTRACT(hour FROM last_activity) as activity_hour,
|
|
435
|
+
TO_CHAR(last_activity, 'Day') as activity_day
|
|
436
|
+
FROM ${fullConfig.tableName}
|
|
437
|
+
${whereClause}
|
|
438
|
+
GROUP BY EXTRACT(hour FROM last_activity), TO_CHAR(last_activity, 'Day')
|
|
439
|
+
ORDER BY COUNT(*) DESC
|
|
440
|
+
LIMIT 1
|
|
441
|
+
`;
|
|
442
|
+
const result = await client.query(sql, params);
|
|
443
|
+
const row = result.rows[0] || {};
|
|
444
|
+
return createSuccess({
|
|
445
|
+
averageMessagesPerConversation: parseFloat(row.avg_messages) || 0,
|
|
446
|
+
conversationsLastWeek: parseInt(row.last_week) || 0,
|
|
447
|
+
conversationsLastMonth: parseInt(row.last_month) || 0,
|
|
448
|
+
mostActiveHour: parseInt(row.activity_hour) || 0,
|
|
449
|
+
mostActiveDay: (row.activity_day || '').trim()
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
return createFailure(createMemoryStorageError('get analytics', 'PostgreSQL', error));
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
return {
|
|
457
|
+
storeMessages,
|
|
458
|
+
getConversation,
|
|
459
|
+
appendMessages,
|
|
460
|
+
findConversations,
|
|
461
|
+
getRecentMessages,
|
|
462
|
+
deleteConversation,
|
|
463
|
+
clearUserConversations,
|
|
464
|
+
getStats,
|
|
465
|
+
healthCheck,
|
|
466
|
+
close
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
async function initializeSchema(client, config) {
|
|
470
|
+
const createTableSQL = `
|
|
471
|
+
CREATE TABLE IF NOT EXISTS ${config.tableName} (
|
|
472
|
+
conversation_id VARCHAR(255) PRIMARY KEY,
|
|
473
|
+
user_id VARCHAR(255),
|
|
474
|
+
messages JSONB NOT NULL,
|
|
475
|
+
metadata JSONB,
|
|
476
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
477
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
478
|
+
last_activity TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
479
|
+
);
|
|
480
|
+
|
|
481
|
+
CREATE INDEX IF NOT EXISTS idx_${config.tableName}_user_id
|
|
482
|
+
ON ${config.tableName} (user_id);
|
|
483
|
+
CREATE INDEX IF NOT EXISTS idx_${config.tableName}_created_at
|
|
484
|
+
ON ${config.tableName} (created_at);
|
|
485
|
+
CREATE INDEX IF NOT EXISTS idx_${config.tableName}_last_activity
|
|
486
|
+
ON ${config.tableName} (last_activity);
|
|
487
|
+
CREATE INDEX IF NOT EXISTS idx_${config.tableName}_metadata_gin
|
|
488
|
+
ON ${config.tableName} USING GIN (metadata);
|
|
489
|
+
CREATE INDEX IF NOT EXISTS idx_${config.tableName}_trace_id
|
|
490
|
+
ON ${config.tableName} ((metadata->>'traceId'));
|
|
491
|
+
`;
|
|
492
|
+
await client.query(createTableSQL);
|
|
493
|
+
console.log(`[MEMORY:Postgres] Schema initialized for table ${config.tableName}`);
|
|
494
|
+
}
|
|
495
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../src/memory/providers/postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MemoryProvider, RedisConfig } from '../types';
|
|
2
|
+
interface RedisClient {
|
|
3
|
+
get(key: string): Promise<string | null>;
|
|
4
|
+
set(key: string, value: string, ...args: any[]): Promise<any>;
|
|
5
|
+
del(key: string): Promise<number>;
|
|
6
|
+
keys(pattern: string): Promise<string[]>;
|
|
7
|
+
exists(key: string): Promise<number>;
|
|
8
|
+
expire(key: string, seconds: number): Promise<number>;
|
|
9
|
+
ping(): Promise<string>;
|
|
10
|
+
quit(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Redis memory provider - persistent across server restarts
|
|
14
|
+
* Best for production environments with shared state
|
|
15
|
+
*/
|
|
16
|
+
export declare function createRedisProvider(config: RedisConfig, redisClient: RedisClient): Promise<MemoryProvider>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/memory/providers/redis.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EAGd,WAAW,EAOZ,MAAM,UAAU,CAAC;AAGlB,UAAU,WAAW;IACnB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAqahH"}
|