family-ai-agent 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 (132) hide show
  1. package/.env.example +49 -0
  2. package/README.md +161 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +336 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/config/index.d.ts +37 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +68 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/models.d.ts +17 -0
  12. package/dist/config/models.d.ts.map +1 -0
  13. package/dist/config/models.js +128 -0
  14. package/dist/config/models.js.map +1 -0
  15. package/dist/core/agents/agent-factory.d.ts +31 -0
  16. package/dist/core/agents/agent-factory.d.ts.map +1 -0
  17. package/dist/core/agents/agent-factory.js +151 -0
  18. package/dist/core/agents/agent-factory.js.map +1 -0
  19. package/dist/core/agents/base-agent.d.ts +51 -0
  20. package/dist/core/agents/base-agent.d.ts.map +1 -0
  21. package/dist/core/agents/base-agent.js +245 -0
  22. package/dist/core/agents/base-agent.js.map +1 -0
  23. package/dist/core/agents/index.d.ts +8 -0
  24. package/dist/core/agents/index.d.ts.map +1 -0
  25. package/dist/core/agents/index.js +9 -0
  26. package/dist/core/agents/index.js.map +1 -0
  27. package/dist/core/agents/personalities/automation.d.ts +14 -0
  28. package/dist/core/agents/personalities/automation.d.ts.map +1 -0
  29. package/dist/core/agents/personalities/automation.js +146 -0
  30. package/dist/core/agents/personalities/automation.js.map +1 -0
  31. package/dist/core/agents/personalities/chat.d.ts +10 -0
  32. package/dist/core/agents/personalities/chat.d.ts.map +1 -0
  33. package/dist/core/agents/personalities/chat.js +132 -0
  34. package/dist/core/agents/personalities/chat.js.map +1 -0
  35. package/dist/core/agents/personalities/coding.d.ts +16 -0
  36. package/dist/core/agents/personalities/coding.d.ts.map +1 -0
  37. package/dist/core/agents/personalities/coding.js +166 -0
  38. package/dist/core/agents/personalities/coding.js.map +1 -0
  39. package/dist/core/agents/personalities/research.d.ts +13 -0
  40. package/dist/core/agents/personalities/research.d.ts.map +1 -0
  41. package/dist/core/agents/personalities/research.js +133 -0
  42. package/dist/core/agents/personalities/research.js.map +1 -0
  43. package/dist/core/agents/types.d.ts +102 -0
  44. package/dist/core/agents/types.d.ts.map +1 -0
  45. package/dist/core/agents/types.js +2 -0
  46. package/dist/core/agents/types.js.map +1 -0
  47. package/dist/core/orchestrator/graph.d.ts +118 -0
  48. package/dist/core/orchestrator/graph.d.ts.map +1 -0
  49. package/dist/core/orchestrator/graph.js +233 -0
  50. package/dist/core/orchestrator/graph.js.map +1 -0
  51. package/dist/database/client.d.ts +19 -0
  52. package/dist/database/client.d.ts.map +1 -0
  53. package/dist/database/client.js +95 -0
  54. package/dist/database/client.js.map +1 -0
  55. package/dist/index.d.ts +41 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +67 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/llm/openrouter-client.d.ts +45 -0
  60. package/dist/llm/openrouter-client.d.ts.map +1 -0
  61. package/dist/llm/openrouter-client.js +155 -0
  62. package/dist/llm/openrouter-client.js.map +1 -0
  63. package/dist/memory/conversation/index.d.ts +37 -0
  64. package/dist/memory/conversation/index.d.ts.map +1 -0
  65. package/dist/memory/conversation/index.js +196 -0
  66. package/dist/memory/conversation/index.js.map +1 -0
  67. package/dist/memory/index.d.ts +4 -0
  68. package/dist/memory/index.d.ts.map +1 -0
  69. package/dist/memory/index.js +5 -0
  70. package/dist/memory/index.js.map +1 -0
  71. package/dist/memory/knowledge-base/index.d.ts +51 -0
  72. package/dist/memory/knowledge-base/index.d.ts.map +1 -0
  73. package/dist/memory/knowledge-base/index.js +222 -0
  74. package/dist/memory/knowledge-base/index.js.map +1 -0
  75. package/dist/memory/longterm/vector-store.d.ts +44 -0
  76. package/dist/memory/longterm/vector-store.d.ts.map +1 -0
  77. package/dist/memory/longterm/vector-store.js +229 -0
  78. package/dist/memory/longterm/vector-store.js.map +1 -0
  79. package/dist/safety/audit-logger.d.ts +68 -0
  80. package/dist/safety/audit-logger.d.ts.map +1 -0
  81. package/dist/safety/audit-logger.js +215 -0
  82. package/dist/safety/audit-logger.js.map +1 -0
  83. package/dist/safety/guardrails/input-guardrail.d.ts +21 -0
  84. package/dist/safety/guardrails/input-guardrail.d.ts.map +1 -0
  85. package/dist/safety/guardrails/input-guardrail.js +145 -0
  86. package/dist/safety/guardrails/input-guardrail.js.map +1 -0
  87. package/dist/safety/guardrails/output-guardrail.d.ts +18 -0
  88. package/dist/safety/guardrails/output-guardrail.d.ts.map +1 -0
  89. package/dist/safety/guardrails/output-guardrail.js +125 -0
  90. package/dist/safety/guardrails/output-guardrail.js.map +1 -0
  91. package/dist/safety/index.d.ts +4 -0
  92. package/dist/safety/index.d.ts.map +1 -0
  93. package/dist/safety/index.js +5 -0
  94. package/dist/safety/index.js.map +1 -0
  95. package/dist/utils/errors.d.ts +36 -0
  96. package/dist/utils/errors.d.ts.map +1 -0
  97. package/dist/utils/errors.js +94 -0
  98. package/dist/utils/errors.js.map +1 -0
  99. package/dist/utils/logger.d.ts +8 -0
  100. package/dist/utils/logger.d.ts.map +1 -0
  101. package/dist/utils/logger.js +47 -0
  102. package/dist/utils/logger.js.map +1 -0
  103. package/docker/init-db.sql +149 -0
  104. package/docker/sandbox/Dockerfile.sandbox +29 -0
  105. package/docker-compose.yml +61 -0
  106. package/package.json +80 -0
  107. package/src/cli/index.ts +392 -0
  108. package/src/config/index.ts +85 -0
  109. package/src/config/models.ts +156 -0
  110. package/src/core/agents/agent-factory.ts +192 -0
  111. package/src/core/agents/base-agent.ts +333 -0
  112. package/src/core/agents/index.ts +27 -0
  113. package/src/core/agents/personalities/automation.ts +202 -0
  114. package/src/core/agents/personalities/chat.ts +159 -0
  115. package/src/core/agents/personalities/coding.ts +227 -0
  116. package/src/core/agents/personalities/research.ts +177 -0
  117. package/src/core/agents/types.ts +124 -0
  118. package/src/core/orchestrator/graph.ts +305 -0
  119. package/src/database/client.ts +109 -0
  120. package/src/index.ts +104 -0
  121. package/src/llm/openrouter-client.ts +218 -0
  122. package/src/memory/conversation/index.ts +313 -0
  123. package/src/memory/index.ts +23 -0
  124. package/src/memory/knowledge-base/index.ts +357 -0
  125. package/src/memory/longterm/vector-store.ts +364 -0
  126. package/src/safety/audit-logger.ts +357 -0
  127. package/src/safety/guardrails/input-guardrail.ts +191 -0
  128. package/src/safety/guardrails/output-guardrail.ts +160 -0
  129. package/src/safety/index.ts +21 -0
  130. package/src/utils/errors.ts +120 -0
  131. package/src/utils/logger.ts +74 -0
  132. package/tsconfig.json +37 -0
@@ -0,0 +1,222 @@
1
+ import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters';
2
+ import { query, transaction } from '../../database/client.js';
3
+ import { getOpenRouterClient } from '../../llm/openrouter-client.js';
4
+ import { createLogger, logMemoryOperation } from '../../utils/logger.js';
5
+ import { MemoryError } from '../../utils/errors.js';
6
+ const logger = createLogger('KnowledgeBase');
7
+ export class KnowledgeBase {
8
+ client = getOpenRouterClient();
9
+ textSplitter = new RecursiveCharacterTextSplitter({
10
+ chunkSize: 1000,
11
+ chunkOverlap: 200,
12
+ separators: ['\n\n', '\n', '. ', ' ', ''],
13
+ });
14
+ // Add a document to the knowledge base
15
+ async addDocument(content, filename, options = {}) {
16
+ try {
17
+ // Split content into chunks
18
+ const chunks = await this.textSplitter.splitText(content);
19
+ logger.debug('Document split into chunks', {
20
+ filename,
21
+ chunkCount: chunks.length,
22
+ });
23
+ // Generate embeddings for all chunks
24
+ const embeddings = await this.client.embed(chunks);
25
+ // Store document and chunks in transaction
26
+ const documentId = await transaction(async (client) => {
27
+ // Insert document
28
+ const docResult = await client.query(`INSERT INTO documents (user_id, filename, file_type, file_size, content, metadata)
29
+ VALUES ($1, $2, $3, $4, $5, $6)
30
+ RETURNING id`, [
31
+ options.userId ?? null,
32
+ filename,
33
+ options.fileType ?? null,
34
+ options.fileSize ?? null,
35
+ content,
36
+ JSON.stringify(options.metadata ?? {}),
37
+ ]);
38
+ const docId = docResult.rows[0]?.id;
39
+ if (!docId) {
40
+ throw new MemoryError('Failed to insert document');
41
+ }
42
+ // Insert chunks with embeddings
43
+ for (let i = 0; i < chunks.length; i++) {
44
+ const chunk = chunks[i];
45
+ const embedding = embeddings[i];
46
+ await client.query(`INSERT INTO document_chunks (document_id, chunk_index, content, embedding, metadata)
47
+ VALUES ($1, $2, $3, $4, $5)`, [
48
+ docId,
49
+ i,
50
+ chunk,
51
+ `[${embedding.join(',')}]`,
52
+ JSON.stringify({ chunkIndex: i, totalChunks: chunks.length }),
53
+ ]);
54
+ }
55
+ return docId;
56
+ });
57
+ logMemoryOperation('write', 'knowledge_base', {
58
+ documentId,
59
+ filename,
60
+ chunkCount: chunks.length,
61
+ });
62
+ return documentId;
63
+ }
64
+ catch (error) {
65
+ logger.error('Failed to add document', { error, filename });
66
+ throw new MemoryError(`Failed to add document: ${error instanceof Error ? error.message : 'Unknown error'}`);
67
+ }
68
+ }
69
+ // Search the knowledge base
70
+ async search(queryText, options = {}) {
71
+ const { userId, limit = 5, minSimilarity = 0.7 } = options;
72
+ try {
73
+ // Generate query embedding
74
+ const queryEmbedding = await this.client.embedQuery(queryText);
75
+ // Build query
76
+ let sql = `
77
+ SELECT
78
+ dc.id as chunk_id,
79
+ dc.document_id,
80
+ dc.content,
81
+ dc.metadata as chunk_metadata,
82
+ d.filename,
83
+ d.metadata as doc_metadata,
84
+ 1 - (dc.embedding <=> $1::vector) as similarity
85
+ FROM document_chunks dc
86
+ JOIN documents d ON d.id = dc.document_id
87
+ WHERE 1 - (dc.embedding <=> $1::vector) >= $2
88
+ `;
89
+ const params = [`[${queryEmbedding.join(',')}]`, minSimilarity];
90
+ let paramIndex = 3;
91
+ if (userId) {
92
+ sql += ` AND d.user_id = $${paramIndex}`;
93
+ params.push(userId);
94
+ paramIndex++;
95
+ }
96
+ sql += ` ORDER BY similarity DESC LIMIT $${paramIndex}`;
97
+ params.push(limit);
98
+ const result = await query(sql, params);
99
+ const searchResults = result.rows.map((row) => ({
100
+ chunkId: row.chunk_id,
101
+ documentId: row.document_id,
102
+ content: row.content,
103
+ similarity: row.similarity,
104
+ metadata: { ...row.doc_metadata, ...row.chunk_metadata },
105
+ filename: row.filename,
106
+ }));
107
+ logMemoryOperation('search', 'knowledge_base', {
108
+ queryLength: queryText.length,
109
+ resultsCount: searchResults.length,
110
+ });
111
+ return searchResults;
112
+ }
113
+ catch (error) {
114
+ logger.error('Failed to search knowledge base', { error });
115
+ throw new MemoryError(`Failed to search knowledge base: ${error instanceof Error ? error.message : 'Unknown error'}`);
116
+ }
117
+ }
118
+ // Get document by ID
119
+ async getDocument(id) {
120
+ try {
121
+ const result = await query(`SELECT id, user_id, filename, file_type, file_size, content, metadata, created_at
122
+ FROM documents WHERE id = $1`, [id]);
123
+ if (result.rows.length === 0) {
124
+ return null;
125
+ }
126
+ const row = result.rows[0];
127
+ return {
128
+ id: row.id,
129
+ userId: row.user_id ?? undefined,
130
+ filename: row.filename,
131
+ fileType: row.file_type ?? undefined,
132
+ fileSize: row.file_size ?? undefined,
133
+ content: row.content ?? undefined,
134
+ metadata: row.metadata,
135
+ createdAt: row.created_at,
136
+ };
137
+ }
138
+ catch (error) {
139
+ logger.error('Failed to get document', { error, id });
140
+ throw new MemoryError(`Failed to get document: ${error instanceof Error ? error.message : 'Unknown error'}`);
141
+ }
142
+ }
143
+ // List documents for a user
144
+ async listDocuments(userId, options = {}) {
145
+ const { limit = 20, offset = 0 } = options;
146
+ try {
147
+ const result = await query(`SELECT id, user_id, filename, file_type, file_size, metadata, created_at
148
+ FROM documents
149
+ WHERE user_id = $1
150
+ ORDER BY created_at DESC
151
+ LIMIT $2 OFFSET $3`, [userId, limit, offset]);
152
+ return result.rows.map((row) => ({
153
+ id: row.id,
154
+ userId: row.user_id ?? undefined,
155
+ filename: row.filename,
156
+ fileType: row.file_type ?? undefined,
157
+ fileSize: row.file_size ?? undefined,
158
+ metadata: row.metadata,
159
+ createdAt: row.created_at,
160
+ }));
161
+ }
162
+ catch (error) {
163
+ logger.error('Failed to list documents', { error });
164
+ throw new MemoryError(`Failed to list documents: ${error instanceof Error ? error.message : 'Unknown error'}`);
165
+ }
166
+ }
167
+ // Delete document and its chunks
168
+ async deleteDocument(id) {
169
+ try {
170
+ await query('DELETE FROM documents WHERE id = $1', [id]);
171
+ logMemoryOperation('write', 'knowledge_base', {
172
+ documentId: id,
173
+ action: 'delete',
174
+ });
175
+ }
176
+ catch (error) {
177
+ logger.error('Failed to delete document', { error, id });
178
+ throw new MemoryError(`Failed to delete document: ${error instanceof Error ? error.message : 'Unknown error'}`);
179
+ }
180
+ }
181
+ // Get chunks for a document
182
+ async getDocumentChunks(documentId) {
183
+ try {
184
+ const result = await query(`SELECT id, document_id, chunk_index, content, metadata
185
+ FROM document_chunks
186
+ WHERE document_id = $1
187
+ ORDER BY chunk_index ASC`, [documentId]);
188
+ return result.rows.map((row) => ({
189
+ id: row.id,
190
+ documentId: row.document_id,
191
+ chunkIndex: row.chunk_index,
192
+ content: row.content,
193
+ metadata: row.metadata,
194
+ }));
195
+ }
196
+ catch (error) {
197
+ logger.error('Failed to get document chunks', { error, documentId });
198
+ throw new MemoryError(`Failed to get document chunks: ${error instanceof Error ? error.message : 'Unknown error'}`);
199
+ }
200
+ }
201
+ // Get document count for user
202
+ async getDocumentCount(userId) {
203
+ try {
204
+ const result = await query('SELECT COUNT(*) as count FROM documents WHERE user_id = $1', [userId]);
205
+ return parseInt(result.rows[0]?.count ?? '0', 10);
206
+ }
207
+ catch (error) {
208
+ logger.error('Failed to get document count', { error });
209
+ throw new MemoryError(`Failed to get document count: ${error instanceof Error ? error.message : 'Unknown error'}`);
210
+ }
211
+ }
212
+ }
213
+ // Singleton instance
214
+ let kbInstance = null;
215
+ export function getKnowledgeBase() {
216
+ if (!kbInstance) {
217
+ kbInstance = new KnowledgeBase();
218
+ }
219
+ return kbInstance;
220
+ }
221
+ export default KnowledgeBase;
222
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/memory/knowledge-base/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { RetrievedMemory } from '../../core/agents/types.js';
2
+ export type MemoryType = 'semantic' | 'episodic' | 'procedural';
3
+ export interface MemoryEntry {
4
+ id: string;
5
+ userId?: string;
6
+ memoryType: MemoryType;
7
+ content: string;
8
+ importance: number;
9
+ metadata?: Record<string, unknown>;
10
+ createdAt: Date;
11
+ updatedAt: Date;
12
+ }
13
+ export interface SearchOptions {
14
+ userId?: string;
15
+ memoryType?: MemoryType;
16
+ limit?: number;
17
+ minSimilarity?: number;
18
+ }
19
+ export declare class VectorStore {
20
+ private client;
21
+ store(content: string, memoryType: MemoryType, options?: {
22
+ userId?: string;
23
+ importance?: number;
24
+ metadata?: Record<string, unknown>;
25
+ }): Promise<string>;
26
+ search(queryText: string, options?: SearchOptions): Promise<RetrievedMemory[]>;
27
+ get(id: string): Promise<MemoryEntry | null>;
28
+ update(id: string, content: string, options?: {
29
+ importance?: number;
30
+ metadata?: Record<string, unknown>;
31
+ }): Promise<void>;
32
+ delete(id: string): Promise<void>;
33
+ bulkStore(entries: Array<{
34
+ content: string;
35
+ memoryType: MemoryType;
36
+ userId?: string;
37
+ importance?: number;
38
+ metadata?: Record<string, unknown>;
39
+ }>): Promise<string[]>;
40
+ getRecent(userId: string, limit?: number): Promise<MemoryEntry[]>;
41
+ }
42
+ export declare function getVectorStore(): VectorStore;
43
+ export default VectorStore;
44
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../../src/memory/longterm/vector-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlE,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAyB;IAGjC,KAAK,CACT,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC/B,GACL,OAAO,CAAC,MAAM,CAAC;IA0CZ,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,eAAe,EAAE,CAAC;IAmFvB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAyC5C,MAAM,CACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAO,GACxE,OAAO,CAAC,IAAI,CAAC;IA6BV,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAajC,SAAS,CACb,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,UAAU,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,CAAC,GACD,OAAO,CAAC,MAAM,EAAE,CAAC;IAmDd,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAqC5E;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,229 @@
1
+ import { query, transaction } from '../../database/client.js';
2
+ import { getOpenRouterClient } from '../../llm/openrouter-client.js';
3
+ import { createLogger, logMemoryOperation } from '../../utils/logger.js';
4
+ import { MemoryError } from '../../utils/errors.js';
5
+ const logger = createLogger('VectorStore');
6
+ export class VectorStore {
7
+ client = getOpenRouterClient();
8
+ // Store a memory with embedding
9
+ async store(content, memoryType, options = {}) {
10
+ try {
11
+ // Generate embedding
12
+ const embedding = await this.client.embedQuery(content);
13
+ // Insert into database
14
+ const result = await query(`INSERT INTO long_term_memories
15
+ (user_id, memory_type, content, embedding, importance, metadata)
16
+ VALUES ($1, $2, $3, $4, $5, $6)
17
+ RETURNING id`, [
18
+ options.userId ?? null,
19
+ memoryType,
20
+ content,
21
+ `[${embedding.join(',')}]`,
22
+ options.importance ?? 0.5,
23
+ JSON.stringify(options.metadata ?? {}),
24
+ ]);
25
+ const memoryId = result.rows[0]?.id;
26
+ if (!memoryId) {
27
+ throw new MemoryError('Failed to store memory');
28
+ }
29
+ logMemoryOperation('write', 'long_term', {
30
+ memoryId,
31
+ memoryType,
32
+ contentLength: content.length,
33
+ });
34
+ return memoryId;
35
+ }
36
+ catch (error) {
37
+ logger.error('Failed to store memory', { error });
38
+ throw new MemoryError(`Failed to store memory: ${error instanceof Error ? error.message : 'Unknown error'}`);
39
+ }
40
+ }
41
+ // Search for similar memories
42
+ async search(queryText, options = {}) {
43
+ const { userId, memoryType, limit = 5, minSimilarity = 0.7, } = options;
44
+ try {
45
+ // Generate query embedding
46
+ const queryEmbedding = await this.client.embedQuery(queryText);
47
+ // Build the query with filters
48
+ let sql = `
49
+ SELECT
50
+ id,
51
+ memory_type,
52
+ content,
53
+ metadata,
54
+ 1 - (embedding <=> $1::vector) as similarity
55
+ FROM long_term_memories
56
+ WHERE 1 - (embedding <=> $1::vector) >= $2
57
+ `;
58
+ const params = [`[${queryEmbedding.join(',')}]`, minSimilarity];
59
+ let paramIndex = 3;
60
+ if (userId) {
61
+ sql += ` AND user_id = $${paramIndex}`;
62
+ params.push(userId);
63
+ paramIndex++;
64
+ }
65
+ if (memoryType) {
66
+ sql += ` AND memory_type = $${paramIndex}`;
67
+ params.push(memoryType);
68
+ paramIndex++;
69
+ }
70
+ sql += ` ORDER BY similarity DESC LIMIT $${paramIndex}`;
71
+ params.push(limit);
72
+ const result = await query(sql, params);
73
+ // Update access count for retrieved memories
74
+ if (result.rows.length > 0) {
75
+ const ids = result.rows.map((r) => r.id);
76
+ await query(`UPDATE long_term_memories
77
+ SET access_count = access_count + 1, last_accessed = NOW()
78
+ WHERE id = ANY($1)`, [ids]);
79
+ }
80
+ const memories = result.rows.map((row) => ({
81
+ id: row.id,
82
+ type: row.memory_type,
83
+ content: row.content,
84
+ relevanceScore: row.similarity,
85
+ metadata: row.metadata,
86
+ }));
87
+ logMemoryOperation('search', 'long_term', {
88
+ queryLength: queryText.length,
89
+ resultsCount: memories.length,
90
+ });
91
+ return memories;
92
+ }
93
+ catch (error) {
94
+ logger.error('Failed to search memories', { error });
95
+ throw new MemoryError(`Failed to search memories: ${error instanceof Error ? error.message : 'Unknown error'}`);
96
+ }
97
+ }
98
+ // Get memory by ID
99
+ async get(id) {
100
+ try {
101
+ const result = await query(`SELECT id, user_id, memory_type, content, importance, metadata, created_at, updated_at
102
+ FROM long_term_memories WHERE id = $1`, [id]);
103
+ if (result.rows.length === 0) {
104
+ return null;
105
+ }
106
+ const row = result.rows[0];
107
+ return {
108
+ id: row.id,
109
+ userId: row.user_id ?? undefined,
110
+ memoryType: row.memory_type,
111
+ content: row.content,
112
+ importance: row.importance,
113
+ metadata: row.metadata,
114
+ createdAt: row.created_at,
115
+ updatedAt: row.updated_at,
116
+ };
117
+ }
118
+ catch (error) {
119
+ logger.error('Failed to get memory', { error, id });
120
+ throw new MemoryError(`Failed to get memory: ${error instanceof Error ? error.message : 'Unknown error'}`);
121
+ }
122
+ }
123
+ // Update memory content
124
+ async update(id, content, options = {}) {
125
+ try {
126
+ // Re-generate embedding for new content
127
+ const embedding = await this.client.embedQuery(content);
128
+ await query(`UPDATE long_term_memories
129
+ SET content = $2, embedding = $3, importance = COALESCE($4, importance),
130
+ metadata = COALESCE($5, metadata), updated_at = NOW()
131
+ WHERE id = $1`, [
132
+ id,
133
+ content,
134
+ `[${embedding.join(',')}]`,
135
+ options.importance ?? null,
136
+ options.metadata ? JSON.stringify(options.metadata) : null,
137
+ ]);
138
+ logMemoryOperation('write', 'long_term', { memoryId: id, action: 'update' });
139
+ }
140
+ catch (error) {
141
+ logger.error('Failed to update memory', { error, id });
142
+ throw new MemoryError(`Failed to update memory: ${error instanceof Error ? error.message : 'Unknown error'}`);
143
+ }
144
+ }
145
+ // Delete memory
146
+ async delete(id) {
147
+ try {
148
+ await query('DELETE FROM long_term_memories WHERE id = $1', [id]);
149
+ logMemoryOperation('write', 'long_term', { memoryId: id, action: 'delete' });
150
+ }
151
+ catch (error) {
152
+ logger.error('Failed to delete memory', { error, id });
153
+ throw new MemoryError(`Failed to delete memory: ${error instanceof Error ? error.message : 'Unknown error'}`);
154
+ }
155
+ }
156
+ // Bulk store memories
157
+ async bulkStore(entries) {
158
+ try {
159
+ // Generate embeddings for all entries
160
+ const embeddings = await this.client.embed(entries.map((e) => e.content));
161
+ // Use transaction for bulk insert
162
+ const ids = await transaction(async (client) => {
163
+ const results = [];
164
+ for (let i = 0; i < entries.length; i++) {
165
+ const entry = entries[i];
166
+ const embedding = embeddings[i];
167
+ const result = await client.query(`INSERT INTO long_term_memories
168
+ (user_id, memory_type, content, embedding, importance, metadata)
169
+ VALUES ($1, $2, $3, $4, $5, $6)
170
+ RETURNING id`, [
171
+ entry.userId ?? null,
172
+ entry.memoryType,
173
+ entry.content,
174
+ `[${embedding.join(',')}]`,
175
+ entry.importance ?? 0.5,
176
+ JSON.stringify(entry.metadata ?? {}),
177
+ ]);
178
+ if (result.rows[0]) {
179
+ results.push(result.rows[0].id);
180
+ }
181
+ }
182
+ return results;
183
+ });
184
+ logMemoryOperation('write', 'long_term', {
185
+ action: 'bulk_store',
186
+ count: ids.length,
187
+ });
188
+ return ids;
189
+ }
190
+ catch (error) {
191
+ logger.error('Failed to bulk store memories', { error });
192
+ throw new MemoryError(`Failed to bulk store memories: ${error instanceof Error ? error.message : 'Unknown error'}`);
193
+ }
194
+ }
195
+ // Get recent memories for a user
196
+ async getRecent(userId, limit = 10) {
197
+ try {
198
+ const result = await query(`SELECT id, user_id, memory_type, content, importance, metadata, created_at, updated_at
199
+ FROM long_term_memories
200
+ WHERE user_id = $1
201
+ ORDER BY created_at DESC
202
+ LIMIT $2`, [userId, limit]);
203
+ return result.rows.map((row) => ({
204
+ id: row.id,
205
+ userId: row.user_id ?? undefined,
206
+ memoryType: row.memory_type,
207
+ content: row.content,
208
+ importance: row.importance,
209
+ metadata: row.metadata,
210
+ createdAt: row.created_at,
211
+ updatedAt: row.updated_at,
212
+ }));
213
+ }
214
+ catch (error) {
215
+ logger.error('Failed to get recent memories', { error });
216
+ throw new MemoryError(`Failed to get recent memories: ${error instanceof Error ? error.message : 'Unknown error'}`);
217
+ }
218
+ }
219
+ }
220
+ // Singleton instance
221
+ let storeInstance = null;
222
+ export function getVectorStore() {
223
+ if (!storeInstance) {
224
+ storeInstance = new VectorStore();
225
+ }
226
+ return storeInstance;
227
+ }
228
+ export default VectorStore;
229
+ //# sourceMappingURL=vector-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../../src/memory/longterm/vector-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export interface AuditLogEntry {
2
+ id: string;
3
+ userId?: string;
4
+ agentId?: string;
5
+ actionType: string;
6
+ actionDetails: Record<string, unknown>;
7
+ inputHash?: string;
8
+ outputHash?: string;
9
+ status: 'success' | 'failure' | 'blocked';
10
+ errorMessage?: string;
11
+ executionTimeMs?: number;
12
+ createdAt: Date;
13
+ }
14
+ export type AuditActionType = 'user_input' | 'agent_execution' | 'tool_call' | 'memory_access' | 'document_upload' | 'safety_block' | 'error' | 'handoff' | 'api_request';
15
+ export declare class AuditLogger {
16
+ private enabled;
17
+ constructor();
18
+ private hashContent;
19
+ log(actionType: AuditActionType, details: Record<string, unknown>, options?: {
20
+ userId?: string;
21
+ agentId?: string;
22
+ input?: string;
23
+ output?: string;
24
+ status?: 'success' | 'failure' | 'blocked';
25
+ error?: string;
26
+ executionTimeMs?: number;
27
+ }): Promise<string | null>;
28
+ logUserInput(input: string, options?: {
29
+ userId?: string;
30
+ metadata?: Record<string, unknown>;
31
+ }): Promise<string | null>;
32
+ logAgentExecution(agentId: string, input: string, output: string, executionTimeMs: number, options?: {
33
+ userId?: string;
34
+ success?: boolean;
35
+ error?: string;
36
+ }): Promise<string | null>;
37
+ logToolCall(toolName: string, input: unknown, output: unknown, options?: {
38
+ agentId?: string;
39
+ userId?: string;
40
+ success?: boolean;
41
+ error?: string;
42
+ executionTimeMs?: number;
43
+ }): Promise<string | null>;
44
+ logSafetyBlock(reason: string, details: Record<string, unknown>, options?: {
45
+ userId?: string;
46
+ input?: string;
47
+ }): Promise<string | null>;
48
+ query(filters?: {
49
+ userId?: string;
50
+ agentId?: string;
51
+ actionType?: AuditActionType;
52
+ status?: 'success' | 'failure' | 'blocked';
53
+ startDate?: Date;
54
+ endDate?: Date;
55
+ }, options?: {
56
+ limit?: number;
57
+ offset?: number;
58
+ }): Promise<AuditLogEntry[]>;
59
+ getStats(userId?: string, days?: number): Promise<{
60
+ totalRequests: number;
61
+ successRate: number;
62
+ avgExecutionTime: number;
63
+ blockedCount: number;
64
+ }>;
65
+ }
66
+ export declare function getAuditLogger(): AuditLogger;
67
+ export default AuditLogger;
68
+ //# sourceMappingURL=audit-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../../src/safety/audit-logger.ts"],"names":[],"mappings":"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"}