@agenticc/storage-prisma 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/prisma-storage.d.ts +204 -0
- package/dist/prisma-storage.d.ts.map +1 -0
- package/dist/prisma-storage.js +530 -0
- package/dist/prisma-storage.js.map +1 -0
- package/package.json +83 -0
- package/prisma/schema.prisma +72 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 AI Agent Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# @ai-agent/storage-prisma
|
|
2
|
+
|
|
3
|
+
Production-ready Prisma storage adapter for the AI Agent framework. This package provides persistent SQL database storage for conversation sessions and messages, supporting PostgreSQL, MySQL, SQLite, and other databases supported by Prisma.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @ai-agent/storage-prisma @prisma/client
|
|
9
|
+
npm install -D prisma
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Database Setup
|
|
13
|
+
|
|
14
|
+
### 1. Copy the Prisma schema
|
|
15
|
+
|
|
16
|
+
Copy the provided `schema.prisma` file to your project:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
mkdir -p prisma
|
|
20
|
+
cp node_modules/@ai-agent/storage-prisma/prisma/schema.prisma prisma/
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. Configure your database
|
|
24
|
+
|
|
25
|
+
Edit `prisma/schema.prisma` to set your database provider:
|
|
26
|
+
|
|
27
|
+
```prisma
|
|
28
|
+
datasource db {
|
|
29
|
+
provider = "postgresql" // or "mysql", "sqlite", etc.
|
|
30
|
+
url = env("DATABASE_URL")
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 3. Set database URL
|
|
35
|
+
|
|
36
|
+
Create a `.env` file:
|
|
37
|
+
|
|
38
|
+
```env
|
|
39
|
+
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 4. Run migrations
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx prisma migrate dev --name init
|
|
46
|
+
npx prisma generate
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
### Basic Usage
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { Agent } from '@ai-agent/core';
|
|
55
|
+
import { PrismaStorage } from '@ai-agent/storage-prisma';
|
|
56
|
+
import { PrismaClient } from '@prisma/client';
|
|
57
|
+
|
|
58
|
+
// Initialize Prisma client
|
|
59
|
+
const prisma = new PrismaClient();
|
|
60
|
+
|
|
61
|
+
// Create storage adapter
|
|
62
|
+
const storage = new PrismaStorage(prisma);
|
|
63
|
+
|
|
64
|
+
// Create agent
|
|
65
|
+
const agent = new Agent(config);
|
|
66
|
+
|
|
67
|
+
// Create a new session
|
|
68
|
+
const sessionId = await storage.createSession({
|
|
69
|
+
metadata: { userId: '123' }
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Process a message
|
|
73
|
+
const userMessage = 'Hello, agent!';
|
|
74
|
+
await storage.saveUserMessage(sessionId, userMessage);
|
|
75
|
+
|
|
76
|
+
const response = await agent.chat(userMessage, {
|
|
77
|
+
sessionId,
|
|
78
|
+
history: await storage.getHistory(sessionId)
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Store the response
|
|
82
|
+
await storage.saveAssistantMessage(sessionId, response);
|
|
83
|
+
|
|
84
|
+
// Cleanup
|
|
85
|
+
await storage.disconnect();
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Session Management
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Create session with metadata
|
|
92
|
+
const sessionId = await storage.createSession({
|
|
93
|
+
metadata: {
|
|
94
|
+
userId: '123',
|
|
95
|
+
channel: 'web'
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Get session
|
|
100
|
+
const session = await storage.getSession(sessionId);
|
|
101
|
+
|
|
102
|
+
// Query sessions
|
|
103
|
+
const activeSessions = await storage.querySessions({
|
|
104
|
+
active: true,
|
|
105
|
+
limit: 10
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Update session metadata
|
|
109
|
+
await storage.updateSessionMetadata(sessionId, {
|
|
110
|
+
lastActivity: new Date()
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Close session
|
|
114
|
+
await storage.closeSession(sessionId);
|
|
115
|
+
|
|
116
|
+
// Delete session
|
|
117
|
+
await storage.deleteSession(sessionId);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Message Operations
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// Save messages
|
|
124
|
+
await storage.saveUserMessage(sessionId, 'Hello!', {
|
|
125
|
+
source: 'web'
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
await storage.saveSystemMessage(sessionId, 'Welcome to the chat!');
|
|
129
|
+
|
|
130
|
+
// Get conversation history
|
|
131
|
+
const history = await storage.getHistory(sessionId);
|
|
132
|
+
|
|
133
|
+
// Query messages with filters
|
|
134
|
+
const recentMessages = await storage.queryMessages({
|
|
135
|
+
sessionId,
|
|
136
|
+
role: 'user',
|
|
137
|
+
limit: 10,
|
|
138
|
+
order: 'desc'
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Get message count
|
|
142
|
+
const count = await storage.getMessageCount(sessionId);
|
|
143
|
+
|
|
144
|
+
// Delete messages
|
|
145
|
+
await storage.deleteMessage(messageId);
|
|
146
|
+
await storage.deleteSessionMessages(sessionId);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Tool Call Tracking
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
// Tool calls are automatically stored with assistant messages
|
|
153
|
+
const response = await agent.chat('Search for AI news', {
|
|
154
|
+
sessionId,
|
|
155
|
+
history: await storage.getHistory(sessionId)
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
await storage.saveAssistantMessage(sessionId, response);
|
|
159
|
+
|
|
160
|
+
// Query tool calls
|
|
161
|
+
const toolCalls = await storage.queryToolCalls({
|
|
162
|
+
sessionId,
|
|
163
|
+
toolName: 'search',
|
|
164
|
+
success: true
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Get tool calls for a message
|
|
168
|
+
const calls = await storage.getToolCallsForMessage(messageId);
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Pending Confirmations
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
// Save pending confirmation
|
|
175
|
+
await storage.savePendingConfirmation(sessionId, {
|
|
176
|
+
toolName: 'deleteFile',
|
|
177
|
+
arguments: { path: '/important.txt' },
|
|
178
|
+
userMessage: 'Delete the file',
|
|
179
|
+
timestamp: new Date()
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// Get pending confirmation
|
|
183
|
+
const pending = await storage.getPendingConfirmation(sessionId);
|
|
184
|
+
|
|
185
|
+
// Clear pending confirmation
|
|
186
|
+
await storage.clearPendingConfirmation(sessionId);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Features
|
|
190
|
+
|
|
191
|
+
- **Production-ready**: Persistent SQL database storage
|
|
192
|
+
- **Multi-database**: Supports PostgreSQL, MySQL, SQLite, SQL Server, MongoDB
|
|
193
|
+
- **Type-safe**: Full TypeScript support with Prisma
|
|
194
|
+
- **Efficient**: Optimized queries with proper indexing
|
|
195
|
+
- **Flexible**: Rich query API for messages and tool calls
|
|
196
|
+
- **Transactional**: ACID guarantees for data integrity
|
|
197
|
+
|
|
198
|
+
## Database Schema
|
|
199
|
+
|
|
200
|
+
The package includes a Prisma schema with the following models:
|
|
201
|
+
|
|
202
|
+
### Session
|
|
203
|
+
- `id` - Unique session identifier
|
|
204
|
+
- `createdAt` - Session creation timestamp
|
|
205
|
+
- `updatedAt` - Last update timestamp
|
|
206
|
+
- `active` - Whether session is active
|
|
207
|
+
- `metadata` - JSON metadata
|
|
208
|
+
- `messages` - Related messages
|
|
209
|
+
- `pendingConfirmation` - Optional pending confirmation
|
|
210
|
+
|
|
211
|
+
### Message
|
|
212
|
+
- `id` - Unique message identifier
|
|
213
|
+
- `sessionId` - Foreign key to session
|
|
214
|
+
- `role` - Message role (user/assistant/system)
|
|
215
|
+
- `content` - Message content
|
|
216
|
+
- `timestamp` - Message timestamp
|
|
217
|
+
- `responseType` - Response type for assistant messages
|
|
218
|
+
- `metadata` - JSON metadata
|
|
219
|
+
- `toolCalls` - Related tool calls
|
|
220
|
+
|
|
221
|
+
### ToolCall
|
|
222
|
+
- `id` - Unique tool call identifier
|
|
223
|
+
- `messageId` - Foreign key to message
|
|
224
|
+
- `toolName` - Name of the tool
|
|
225
|
+
- `arguments` - JSON arguments
|
|
226
|
+
- `result` - JSON result
|
|
227
|
+
- `timestamp` - Execution timestamp
|
|
228
|
+
|
|
229
|
+
### PendingConfirmation
|
|
230
|
+
- `id` - Unique identifier
|
|
231
|
+
- `sessionId` - Foreign key to session (unique)
|
|
232
|
+
- `toolName` - Tool requiring confirmation
|
|
233
|
+
- `arguments` - JSON arguments
|
|
234
|
+
- `userMessage` - Original user message
|
|
235
|
+
- `timestamp` - Creation timestamp
|
|
236
|
+
|
|
237
|
+
## API Reference
|
|
238
|
+
|
|
239
|
+
### PrismaStorage
|
|
240
|
+
|
|
241
|
+
#### Constructor
|
|
242
|
+
```typescript
|
|
243
|
+
new PrismaStorage(prismaClient: PrismaClient)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
#### Session Methods
|
|
247
|
+
- `createSession(options?)` - Create a new session
|
|
248
|
+
- `getSession(sessionId)` - Get session by ID
|
|
249
|
+
- `querySessions(options?)` - Query sessions with filters
|
|
250
|
+
- `updateSessionMetadata(sessionId, metadata)` - Update session metadata
|
|
251
|
+
- `closeSession(sessionId)` - Mark session as inactive
|
|
252
|
+
- `deleteSession(sessionId)` - Delete session and all messages
|
|
253
|
+
|
|
254
|
+
#### Message Methods
|
|
255
|
+
- `saveUserMessage(sessionId, content, metadata?)` - Save user message
|
|
256
|
+
- `saveAssistantMessage(sessionId, response, metadata?)` - Save assistant message
|
|
257
|
+
- `saveSystemMessage(sessionId, content)` - Save system message
|
|
258
|
+
- `getHistory(sessionId)` - Get conversation history
|
|
259
|
+
- `getMessage(messageId)` - Get message by ID
|
|
260
|
+
- `queryMessages(options?)` - Query messages with filters
|
|
261
|
+
- `getMessageCount(sessionId)` - Get message count
|
|
262
|
+
- `deleteMessage(messageId)` - Delete a message
|
|
263
|
+
- `deleteSessionMessages(sessionId)` - Delete all session messages
|
|
264
|
+
|
|
265
|
+
#### Tool Call Methods
|
|
266
|
+
- `queryToolCalls(options?)` - Query tool calls with filters
|
|
267
|
+
- `getToolCallsForMessage(messageId)` - Get tool calls for a message
|
|
268
|
+
|
|
269
|
+
#### Confirmation Methods
|
|
270
|
+
- `savePendingConfirmation(sessionId, confirmation)` - Save pending confirmation
|
|
271
|
+
- `getPendingConfirmation(sessionId)` - Get pending confirmation
|
|
272
|
+
- `clearPendingConfirmation(sessionId)` - Clear pending confirmation
|
|
273
|
+
|
|
274
|
+
#### Utility Methods
|
|
275
|
+
- `disconnect()` - Close database connection
|
|
276
|
+
|
|
277
|
+
## Migration from In-Memory Storage
|
|
278
|
+
|
|
279
|
+
If you're migrating from `@ai-agent/storage-memory`:
|
|
280
|
+
|
|
281
|
+
1. Install this package and set up your database
|
|
282
|
+
2. Replace `SessionManager` with `PrismaStorage`
|
|
283
|
+
3. Update method calls (API is similar but async)
|
|
284
|
+
4. Run database migrations
|
|
285
|
+
|
|
286
|
+
Example:
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
// Before (memory)
|
|
290
|
+
import { SessionManager } from '@ai-agent/storage-memory';
|
|
291
|
+
const storage = new SessionManager();
|
|
292
|
+
const sessionId = storage.createSession();
|
|
293
|
+
storage.addUserMessage(sessionId, 'Hello');
|
|
294
|
+
|
|
295
|
+
// After (Prisma)
|
|
296
|
+
import { PrismaStorage } from '@ai-agent/storage-prisma';
|
|
297
|
+
const storage = new PrismaStorage(prisma);
|
|
298
|
+
const sessionId = await storage.createSession();
|
|
299
|
+
await storage.saveUserMessage(sessionId, 'Hello');
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Performance Tips
|
|
303
|
+
|
|
304
|
+
1. **Connection Pooling**: Configure Prisma connection pool for your workload
|
|
305
|
+
2. **Indexes**: The schema includes optimized indexes for common queries
|
|
306
|
+
3. **Batch Operations**: Use transactions for multiple operations
|
|
307
|
+
4. **Pagination**: Use `limit` and `offset` for large result sets
|
|
308
|
+
5. **Cleanup**: Regularly delete old inactive sessions
|
|
309
|
+
|
|
310
|
+
## Troubleshooting
|
|
311
|
+
|
|
312
|
+
### Connection Issues
|
|
313
|
+
```typescript
|
|
314
|
+
// Check database connection
|
|
315
|
+
await prisma.$connect();
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Migration Errors
|
|
319
|
+
```bash
|
|
320
|
+
# Reset database (development only!)
|
|
321
|
+
npx prisma migrate reset
|
|
322
|
+
|
|
323
|
+
# Create new migration
|
|
324
|
+
npx prisma migrate dev --name your_migration_name
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Type Generation
|
|
328
|
+
```bash
|
|
329
|
+
# Regenerate Prisma client
|
|
330
|
+
npx prisma generate
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## License
|
|
334
|
+
|
|
335
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ai-agent/storage-prisma
|
|
3
|
+
*
|
|
4
|
+
* Prisma storage adapter for AI Agent framework.
|
|
5
|
+
* Provides persistent SQL database storage for production use.
|
|
6
|
+
*
|
|
7
|
+
* Supports PostgreSQL, MySQL, SQLite, SQL Server, and MongoDB.
|
|
8
|
+
*/
|
|
9
|
+
export { PrismaStorage, createPrismaStorage, type PrismaStorageConfig, type CreateSessionOptions, type SessionQueryOptions, type MessageQueryOptions, type ToolCallQueryOptions, type PendingConfirmation, } from './prisma-storage.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ai-agent/storage-prisma
|
|
3
|
+
*
|
|
4
|
+
* Prisma storage adapter for AI Agent framework.
|
|
5
|
+
* Provides persistent SQL database storage for production use.
|
|
6
|
+
*
|
|
7
|
+
* Supports PostgreSQL, MySQL, SQLite, SQL Server, and MongoDB.
|
|
8
|
+
*/
|
|
9
|
+
export { PrismaStorage, createPrismaStorage, } from './prisma-storage.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,aAAa,EACb,mBAAmB,GAOpB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma Storage Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides persistent SQL database storage for AI agent conversations.
|
|
5
|
+
* Supports PostgreSQL, MySQL, SQLite, and other Prisma-supported databases.
|
|
6
|
+
*
|
|
7
|
+
* _Requirements: 2.5, 10.3_
|
|
8
|
+
*/
|
|
9
|
+
import { PrismaClient } from '@prisma/client';
|
|
10
|
+
import type { AgentResponse, ToolCallRecord } from '@agenticc/core';
|
|
11
|
+
/**
|
|
12
|
+
* Message in conversation history
|
|
13
|
+
*/
|
|
14
|
+
export interface Message {
|
|
15
|
+
id: string;
|
|
16
|
+
role: 'user' | 'assistant' | 'system';
|
|
17
|
+
content: string;
|
|
18
|
+
timestamp: Date;
|
|
19
|
+
toolCalls?: ToolCallRecord[];
|
|
20
|
+
responseType?: string;
|
|
21
|
+
metadata?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Conversation session
|
|
25
|
+
*/
|
|
26
|
+
export interface Session {
|
|
27
|
+
id: string;
|
|
28
|
+
createdAt: Date;
|
|
29
|
+
updatedAt: Date;
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
active: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Pending confirmation for tool execution
|
|
35
|
+
*/
|
|
36
|
+
export interface PendingConfirmation {
|
|
37
|
+
toolName: string;
|
|
38
|
+
arguments: Record<string, unknown>;
|
|
39
|
+
userMessage: string;
|
|
40
|
+
timestamp: Date;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Options for creating a new session
|
|
44
|
+
*/
|
|
45
|
+
export interface CreateSessionOptions {
|
|
46
|
+
id?: string;
|
|
47
|
+
metadata?: Record<string, unknown>;
|
|
48
|
+
systemMessage?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Options for querying sessions
|
|
52
|
+
*/
|
|
53
|
+
export interface SessionQueryOptions {
|
|
54
|
+
active?: boolean;
|
|
55
|
+
createdAfter?: Date;
|
|
56
|
+
createdBefore?: Date;
|
|
57
|
+
limit?: number;
|
|
58
|
+
offset?: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Message query options
|
|
62
|
+
*/
|
|
63
|
+
export interface MessageQueryOptions {
|
|
64
|
+
sessionId?: string;
|
|
65
|
+
role?: 'user' | 'assistant' | 'system';
|
|
66
|
+
responseType?: string;
|
|
67
|
+
after?: Date;
|
|
68
|
+
before?: Date;
|
|
69
|
+
limit?: number;
|
|
70
|
+
offset?: number;
|
|
71
|
+
order?: 'asc' | 'desc';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Tool call query options
|
|
75
|
+
*/
|
|
76
|
+
export interface ToolCallQueryOptions {
|
|
77
|
+
sessionId?: string;
|
|
78
|
+
toolName?: string;
|
|
79
|
+
success?: boolean;
|
|
80
|
+
after?: Date;
|
|
81
|
+
before?: Date;
|
|
82
|
+
limit?: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Configuration for PrismaStorage
|
|
86
|
+
*/
|
|
87
|
+
export interface PrismaStorageConfig {
|
|
88
|
+
/** Prisma client instance */
|
|
89
|
+
prisma: PrismaClient;
|
|
90
|
+
/** Enable debug logging */
|
|
91
|
+
debug?: boolean;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Prisma Storage Adapter
|
|
95
|
+
*
|
|
96
|
+
* Provides persistent storage for agent conversations using Prisma ORM.
|
|
97
|
+
* Supports multiple SQL databases through Prisma's database adapters.
|
|
98
|
+
*/
|
|
99
|
+
export declare class PrismaStorage {
|
|
100
|
+
private prisma;
|
|
101
|
+
private debug;
|
|
102
|
+
constructor(prisma: PrismaClient, config?: Omit<PrismaStorageConfig, 'prisma'>);
|
|
103
|
+
/**
|
|
104
|
+
* Create a new session
|
|
105
|
+
*/
|
|
106
|
+
createSession(options?: CreateSessionOptions): Promise<string>;
|
|
107
|
+
/**
|
|
108
|
+
* Get a session by ID
|
|
109
|
+
*/
|
|
110
|
+
getSession(sessionId: string): Promise<Session | null>;
|
|
111
|
+
/**
|
|
112
|
+
* Query sessions with filters
|
|
113
|
+
*/
|
|
114
|
+
querySessions(options?: SessionQueryOptions): Promise<Session[]>;
|
|
115
|
+
/**
|
|
116
|
+
* Get conversation history for a session
|
|
117
|
+
*/
|
|
118
|
+
getHistory(sessionId: string): Promise<Message[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Save a user message
|
|
121
|
+
*/
|
|
122
|
+
saveUserMessage(sessionId: string, content: string, metadata?: Record<string, unknown>): Promise<string>;
|
|
123
|
+
/**
|
|
124
|
+
* Save an assistant message
|
|
125
|
+
*/
|
|
126
|
+
saveAssistantMessage(sessionId: string, response: AgentResponse, metadata?: Record<string, unknown>): Promise<string>;
|
|
127
|
+
/**
|
|
128
|
+
* Save a system message
|
|
129
|
+
*/
|
|
130
|
+
saveSystemMessage(sessionId: string, content: string): Promise<string>;
|
|
131
|
+
/**
|
|
132
|
+
* Save tool calls for a message
|
|
133
|
+
*/
|
|
134
|
+
private saveToolCalls;
|
|
135
|
+
/**
|
|
136
|
+
* Get a message by ID
|
|
137
|
+
*/
|
|
138
|
+
getMessage(messageId: string): Promise<Message | null>;
|
|
139
|
+
/**
|
|
140
|
+
* Query messages with filters
|
|
141
|
+
*/
|
|
142
|
+
queryMessages(options?: MessageQueryOptions): Promise<Message[]>;
|
|
143
|
+
/**
|
|
144
|
+
* Query tool calls with filters
|
|
145
|
+
*/
|
|
146
|
+
queryToolCalls(options?: ToolCallQueryOptions): Promise<Array<ToolCallRecord & {
|
|
147
|
+
id: string;
|
|
148
|
+
messageId: string;
|
|
149
|
+
timestamp: Date;
|
|
150
|
+
}>>;
|
|
151
|
+
/**
|
|
152
|
+
* Get tool calls for a specific message
|
|
153
|
+
*/
|
|
154
|
+
getToolCallsForMessage(messageId: string): Promise<ToolCallRecord[]>;
|
|
155
|
+
/**
|
|
156
|
+
* Get message count for a session
|
|
157
|
+
*/
|
|
158
|
+
getMessageCount(sessionId: string): Promise<number>;
|
|
159
|
+
/**
|
|
160
|
+
* Update session metadata
|
|
161
|
+
*/
|
|
162
|
+
updateSessionMetadata(sessionId: string, metadata: Record<string, unknown>): Promise<boolean>;
|
|
163
|
+
/**
|
|
164
|
+
* Close a session (mark as inactive)
|
|
165
|
+
*/
|
|
166
|
+
closeSession(sessionId: string): Promise<boolean>;
|
|
167
|
+
/**
|
|
168
|
+
* Delete a session and all its messages
|
|
169
|
+
*/
|
|
170
|
+
deleteSession(sessionId: string): Promise<boolean>;
|
|
171
|
+
/**
|
|
172
|
+
* Delete a message
|
|
173
|
+
*/
|
|
174
|
+
deleteMessage(messageId: string): Promise<boolean>;
|
|
175
|
+
/**
|
|
176
|
+
* Delete all messages in a session
|
|
177
|
+
*/
|
|
178
|
+
deleteSessionMessages(sessionId: string): Promise<number>;
|
|
179
|
+
/**
|
|
180
|
+
* Save pending confirmation
|
|
181
|
+
*/
|
|
182
|
+
savePendingConfirmation(sessionId: string, confirmation: PendingConfirmation): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* Get pending confirmation
|
|
185
|
+
*/
|
|
186
|
+
getPendingConfirmation(sessionId: string): Promise<PendingConfirmation | null>;
|
|
187
|
+
/**
|
|
188
|
+
* Clear pending confirmation
|
|
189
|
+
*/
|
|
190
|
+
clearPendingConfirmation(sessionId: string): Promise<boolean>;
|
|
191
|
+
/**
|
|
192
|
+
* Disconnect from database
|
|
193
|
+
*/
|
|
194
|
+
disconnect(): Promise<void>;
|
|
195
|
+
/**
|
|
196
|
+
* Log debug messages
|
|
197
|
+
*/
|
|
198
|
+
private log;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create a new PrismaStorage instance
|
|
202
|
+
*/
|
|
203
|
+
export declare function createPrismaStorage(prisma: PrismaClient, config?: Omit<PrismaStorageConfig, 'prisma'>): PrismaStorage;
|
|
204
|
+
//# sourceMappingURL=prisma-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-storage.d.ts","sourceRoot":"","sources":["../src/prisma-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma Storage Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides persistent SQL database storage for AI agent conversations.
|
|
5
|
+
* Supports PostgreSQL, MySQL, SQLite, and other Prisma-supported databases.
|
|
6
|
+
*
|
|
7
|
+
* _Requirements: 2.5, 10.3_
|
|
8
|
+
*/
|
|
9
|
+
function parseToolCallResult(json) {
|
|
10
|
+
if (json && typeof json === 'object' && 'success' in json && 'content' in json) {
|
|
11
|
+
const maybeResult = json;
|
|
12
|
+
if (typeof maybeResult.success === 'boolean' && typeof maybeResult.content === 'string') {
|
|
13
|
+
return {
|
|
14
|
+
success: maybeResult.success,
|
|
15
|
+
content: maybeResult.content,
|
|
16
|
+
data: maybeResult.data,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Prisma Storage Adapter
|
|
24
|
+
*
|
|
25
|
+
* Provides persistent storage for agent conversations using Prisma ORM.
|
|
26
|
+
* Supports multiple SQL databases through Prisma's database adapters.
|
|
27
|
+
*/
|
|
28
|
+
export class PrismaStorage {
|
|
29
|
+
prisma;
|
|
30
|
+
debug;
|
|
31
|
+
constructor(prisma, config) {
|
|
32
|
+
this.prisma = prisma;
|
|
33
|
+
this.debug = config?.debug ?? false;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a new session
|
|
37
|
+
*/
|
|
38
|
+
async createSession(options) {
|
|
39
|
+
const session = await this.prisma.session.create({
|
|
40
|
+
data: {
|
|
41
|
+
id: options?.id,
|
|
42
|
+
active: true,
|
|
43
|
+
metadata: options?.metadata,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
// Add system message if provided
|
|
47
|
+
if (options?.systemMessage) {
|
|
48
|
+
await this.saveSystemMessage(session.id, options.systemMessage);
|
|
49
|
+
}
|
|
50
|
+
this.log('Created session:', session.id);
|
|
51
|
+
return session.id;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get a session by ID
|
|
55
|
+
*/
|
|
56
|
+
async getSession(sessionId) {
|
|
57
|
+
const session = await this.prisma.session.findUnique({
|
|
58
|
+
where: { id: sessionId },
|
|
59
|
+
});
|
|
60
|
+
if (!session) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
id: session.id,
|
|
65
|
+
createdAt: session.createdAt,
|
|
66
|
+
updatedAt: session.updatedAt,
|
|
67
|
+
metadata: session.metadata,
|
|
68
|
+
active: session.active,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Query sessions with filters
|
|
73
|
+
*/
|
|
74
|
+
async querySessions(options) {
|
|
75
|
+
const where = {};
|
|
76
|
+
if (options?.active !== undefined) {
|
|
77
|
+
where.active = options.active;
|
|
78
|
+
}
|
|
79
|
+
if (options?.createdAfter) {
|
|
80
|
+
where.createdAt = { ...where.createdAt, gte: options.createdAfter };
|
|
81
|
+
}
|
|
82
|
+
if (options?.createdBefore) {
|
|
83
|
+
where.createdAt = { ...where.createdAt, lte: options.createdBefore };
|
|
84
|
+
}
|
|
85
|
+
const sessions = await this.prisma.session.findMany({
|
|
86
|
+
where,
|
|
87
|
+
orderBy: { createdAt: 'desc' },
|
|
88
|
+
skip: options?.offset,
|
|
89
|
+
take: options?.limit,
|
|
90
|
+
});
|
|
91
|
+
return sessions.map((s) => ({
|
|
92
|
+
id: s.id,
|
|
93
|
+
createdAt: s.createdAt,
|
|
94
|
+
updatedAt: s.updatedAt,
|
|
95
|
+
metadata: s.metadata,
|
|
96
|
+
active: s.active,
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get conversation history for a session
|
|
101
|
+
*/
|
|
102
|
+
async getHistory(sessionId) {
|
|
103
|
+
const messages = await this.prisma.message.findMany({
|
|
104
|
+
where: { sessionId },
|
|
105
|
+
include: {
|
|
106
|
+
toolCalls: true,
|
|
107
|
+
},
|
|
108
|
+
orderBy: { timestamp: 'asc' },
|
|
109
|
+
});
|
|
110
|
+
return messages.map((m) => ({
|
|
111
|
+
id: m.id,
|
|
112
|
+
role: m.role,
|
|
113
|
+
content: m.content,
|
|
114
|
+
timestamp: m.timestamp,
|
|
115
|
+
responseType: m.responseType ?? undefined,
|
|
116
|
+
metadata: m.metadata,
|
|
117
|
+
toolCalls: m.toolCalls.length > 0
|
|
118
|
+
? m.toolCalls.map((tc) => ({
|
|
119
|
+
toolName: tc.toolName,
|
|
120
|
+
arguments: tc.arguments,
|
|
121
|
+
result: parseToolCallResult(tc.result) ?? {
|
|
122
|
+
success: false,
|
|
123
|
+
content: 'Invalid tool call result format',
|
|
124
|
+
data: tc.result,
|
|
125
|
+
},
|
|
126
|
+
}))
|
|
127
|
+
: undefined,
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Save a user message
|
|
132
|
+
*/
|
|
133
|
+
async saveUserMessage(sessionId, content, metadata) {
|
|
134
|
+
const message = await this.prisma.message.create({
|
|
135
|
+
data: {
|
|
136
|
+
sessionId,
|
|
137
|
+
role: 'user',
|
|
138
|
+
content,
|
|
139
|
+
timestamp: new Date(),
|
|
140
|
+
metadata: metadata,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
// Update session timestamp
|
|
144
|
+
await this.prisma.session.update({
|
|
145
|
+
where: { id: sessionId },
|
|
146
|
+
data: { updatedAt: new Date() },
|
|
147
|
+
});
|
|
148
|
+
this.log('Saved user message:', message.id);
|
|
149
|
+
return message.id;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Save an assistant message
|
|
153
|
+
*/
|
|
154
|
+
async saveAssistantMessage(sessionId, response, metadata) {
|
|
155
|
+
const content = 'message' in response ? response.message : JSON.stringify(response);
|
|
156
|
+
const message = await this.prisma.message.create({
|
|
157
|
+
data: {
|
|
158
|
+
sessionId,
|
|
159
|
+
role: 'assistant',
|
|
160
|
+
content,
|
|
161
|
+
timestamp: new Date(),
|
|
162
|
+
responseType: response.type,
|
|
163
|
+
metadata: metadata,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
// Save tool calls if present
|
|
167
|
+
if (response.type === 'execute' && response.toolCalls) {
|
|
168
|
+
await this.saveToolCalls(message.id, response.toolCalls);
|
|
169
|
+
}
|
|
170
|
+
// Update session timestamp
|
|
171
|
+
await this.prisma.session.update({
|
|
172
|
+
where: { id: sessionId },
|
|
173
|
+
data: { updatedAt: new Date() },
|
|
174
|
+
});
|
|
175
|
+
this.log('Saved assistant message:', message.id);
|
|
176
|
+
return message.id;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Save a system message
|
|
180
|
+
*/
|
|
181
|
+
async saveSystemMessage(sessionId, content) {
|
|
182
|
+
const message = await this.prisma.message.create({
|
|
183
|
+
data: {
|
|
184
|
+
sessionId,
|
|
185
|
+
role: 'system',
|
|
186
|
+
content,
|
|
187
|
+
timestamp: new Date(),
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
// Update session timestamp
|
|
191
|
+
await this.prisma.session.update({
|
|
192
|
+
where: { id: sessionId },
|
|
193
|
+
data: { updatedAt: new Date() },
|
|
194
|
+
});
|
|
195
|
+
this.log('Saved system message:', message.id);
|
|
196
|
+
return message.id;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Save tool calls for a message
|
|
200
|
+
*/
|
|
201
|
+
async saveToolCalls(messageId, toolCalls) {
|
|
202
|
+
await this.prisma.toolCall.createMany({
|
|
203
|
+
data: toolCalls.map((tc) => ({
|
|
204
|
+
messageId,
|
|
205
|
+
toolName: tc.toolName,
|
|
206
|
+
arguments: tc.arguments,
|
|
207
|
+
result: tc.result,
|
|
208
|
+
timestamp: new Date(),
|
|
209
|
+
})),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get a message by ID
|
|
214
|
+
*/
|
|
215
|
+
async getMessage(messageId) {
|
|
216
|
+
const message = await this.prisma.message.findUnique({
|
|
217
|
+
where: { id: messageId },
|
|
218
|
+
include: { toolCalls: true },
|
|
219
|
+
});
|
|
220
|
+
if (!message) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
id: message.id,
|
|
225
|
+
role: message.role,
|
|
226
|
+
content: message.content,
|
|
227
|
+
timestamp: message.timestamp,
|
|
228
|
+
responseType: message.responseType ?? undefined,
|
|
229
|
+
metadata: message.metadata,
|
|
230
|
+
toolCalls: message.toolCalls.length > 0
|
|
231
|
+
? message.toolCalls.map((tc) => ({
|
|
232
|
+
toolName: tc.toolName,
|
|
233
|
+
arguments: tc.arguments,
|
|
234
|
+
result: parseToolCallResult(tc.result) ?? {
|
|
235
|
+
success: false,
|
|
236
|
+
content: 'Invalid tool call result format',
|
|
237
|
+
data: tc.result,
|
|
238
|
+
},
|
|
239
|
+
}))
|
|
240
|
+
: undefined,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Query messages with filters
|
|
245
|
+
*/
|
|
246
|
+
async queryMessages(options) {
|
|
247
|
+
const where = {};
|
|
248
|
+
if (options?.sessionId) {
|
|
249
|
+
where.sessionId = options.sessionId;
|
|
250
|
+
}
|
|
251
|
+
if (options?.role) {
|
|
252
|
+
where.role = options.role;
|
|
253
|
+
}
|
|
254
|
+
if (options?.responseType) {
|
|
255
|
+
where.responseType = options.responseType;
|
|
256
|
+
}
|
|
257
|
+
if (options?.after) {
|
|
258
|
+
where.timestamp = { ...where.timestamp, gte: options.after };
|
|
259
|
+
}
|
|
260
|
+
if (options?.before) {
|
|
261
|
+
where.timestamp = { ...where.timestamp, lte: options.before };
|
|
262
|
+
}
|
|
263
|
+
const messages = await this.prisma.message.findMany({
|
|
264
|
+
where,
|
|
265
|
+
include: { toolCalls: true },
|
|
266
|
+
orderBy: { timestamp: options?.order ?? 'asc' },
|
|
267
|
+
skip: options?.offset,
|
|
268
|
+
take: options?.limit,
|
|
269
|
+
});
|
|
270
|
+
return messages.map((m) => ({
|
|
271
|
+
id: m.id,
|
|
272
|
+
role: m.role,
|
|
273
|
+
content: m.content,
|
|
274
|
+
timestamp: m.timestamp,
|
|
275
|
+
responseType: m.responseType ?? undefined,
|
|
276
|
+
metadata: m.metadata,
|
|
277
|
+
toolCalls: m.toolCalls.length > 0
|
|
278
|
+
? m.toolCalls.map((tc) => ({
|
|
279
|
+
toolName: tc.toolName,
|
|
280
|
+
arguments: tc.arguments,
|
|
281
|
+
result: parseToolCallResult(tc.result) ?? {
|
|
282
|
+
success: false,
|
|
283
|
+
content: 'Invalid tool call result format',
|
|
284
|
+
data: tc.result,
|
|
285
|
+
},
|
|
286
|
+
}))
|
|
287
|
+
: undefined,
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Query tool calls with filters
|
|
292
|
+
*/
|
|
293
|
+
async queryToolCalls(options) {
|
|
294
|
+
const where = {};
|
|
295
|
+
if (options?.sessionId) {
|
|
296
|
+
where.message = { sessionId: options.sessionId };
|
|
297
|
+
}
|
|
298
|
+
if (options?.toolName) {
|
|
299
|
+
where.toolName = options.toolName;
|
|
300
|
+
}
|
|
301
|
+
if (options?.after) {
|
|
302
|
+
where.timestamp = { ...where.timestamp, gte: options.after };
|
|
303
|
+
}
|
|
304
|
+
if (options?.before) {
|
|
305
|
+
where.timestamp = { ...where.timestamp, lte: options.before };
|
|
306
|
+
}
|
|
307
|
+
const toolCalls = await this.prisma.toolCall.findMany({
|
|
308
|
+
where,
|
|
309
|
+
orderBy: { timestamp: 'desc' },
|
|
310
|
+
take: options?.limit,
|
|
311
|
+
});
|
|
312
|
+
let results = toolCalls.map((tc) => {
|
|
313
|
+
const parsedResult = parseToolCallResult(tc.result);
|
|
314
|
+
return {
|
|
315
|
+
id: tc.id,
|
|
316
|
+
messageId: tc.messageId,
|
|
317
|
+
toolName: tc.toolName,
|
|
318
|
+
arguments: tc.arguments,
|
|
319
|
+
result: parsedResult ?? {
|
|
320
|
+
success: false,
|
|
321
|
+
content: 'Invalid tool call result format',
|
|
322
|
+
data: tc.result,
|
|
323
|
+
},
|
|
324
|
+
timestamp: tc.timestamp,
|
|
325
|
+
};
|
|
326
|
+
});
|
|
327
|
+
// Filter by success if specified
|
|
328
|
+
if (options?.success !== undefined) {
|
|
329
|
+
results = results.filter((tc) => tc.result.success === options.success);
|
|
330
|
+
}
|
|
331
|
+
return results;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get tool calls for a specific message
|
|
335
|
+
*/
|
|
336
|
+
async getToolCallsForMessage(messageId) {
|
|
337
|
+
const toolCalls = await this.prisma.toolCall.findMany({
|
|
338
|
+
where: { messageId },
|
|
339
|
+
orderBy: { timestamp: 'asc' },
|
|
340
|
+
});
|
|
341
|
+
return toolCalls.map((tc) => ({
|
|
342
|
+
toolName: tc.toolName,
|
|
343
|
+
arguments: tc.arguments,
|
|
344
|
+
result: parseToolCallResult(tc.result) ?? {
|
|
345
|
+
success: false,
|
|
346
|
+
content: 'Invalid tool call result format',
|
|
347
|
+
data: tc.result,
|
|
348
|
+
},
|
|
349
|
+
}));
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get message count for a session
|
|
353
|
+
*/
|
|
354
|
+
async getMessageCount(sessionId) {
|
|
355
|
+
return await this.prisma.message.count({
|
|
356
|
+
where: { sessionId },
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Update session metadata
|
|
361
|
+
*/
|
|
362
|
+
async updateSessionMetadata(sessionId, metadata) {
|
|
363
|
+
try {
|
|
364
|
+
const session = await this.prisma.session.findUnique({
|
|
365
|
+
where: { id: sessionId },
|
|
366
|
+
});
|
|
367
|
+
if (!session) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
const existingMetadata = session.metadata ?? {};
|
|
371
|
+
await this.prisma.session.update({
|
|
372
|
+
where: { id: sessionId },
|
|
373
|
+
data: {
|
|
374
|
+
metadata: { ...existingMetadata, ...metadata },
|
|
375
|
+
updatedAt: new Date(),
|
|
376
|
+
},
|
|
377
|
+
});
|
|
378
|
+
return true;
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
this.log('Error updating session metadata:', error);
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Close a session (mark as inactive)
|
|
387
|
+
*/
|
|
388
|
+
async closeSession(sessionId) {
|
|
389
|
+
try {
|
|
390
|
+
await this.prisma.session.update({
|
|
391
|
+
where: { id: sessionId },
|
|
392
|
+
data: {
|
|
393
|
+
active: false,
|
|
394
|
+
updatedAt: new Date(),
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
this.log('Closed session:', sessionId);
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
this.log('Error closing session:', error);
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Delete a session and all its messages
|
|
407
|
+
*/
|
|
408
|
+
async deleteSession(sessionId) {
|
|
409
|
+
try {
|
|
410
|
+
await this.prisma.session.delete({
|
|
411
|
+
where: { id: sessionId },
|
|
412
|
+
});
|
|
413
|
+
this.log('Deleted session:', sessionId);
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
this.log('Error deleting session:', error);
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Delete a message
|
|
423
|
+
*/
|
|
424
|
+
async deleteMessage(messageId) {
|
|
425
|
+
try {
|
|
426
|
+
await this.prisma.message.delete({
|
|
427
|
+
where: { id: messageId },
|
|
428
|
+
});
|
|
429
|
+
this.log('Deleted message:', messageId);
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
this.log('Error deleting message:', error);
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Delete all messages in a session
|
|
439
|
+
*/
|
|
440
|
+
async deleteSessionMessages(sessionId) {
|
|
441
|
+
try {
|
|
442
|
+
const result = await this.prisma.message.deleteMany({
|
|
443
|
+
where: { sessionId },
|
|
444
|
+
});
|
|
445
|
+
this.log('Deleted messages for session:', sessionId, 'count:', result.count);
|
|
446
|
+
return result.count;
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
this.log('Error deleting session messages:', error);
|
|
450
|
+
return 0;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Save pending confirmation
|
|
455
|
+
*/
|
|
456
|
+
async savePendingConfirmation(sessionId, confirmation) {
|
|
457
|
+
await this.prisma.pendingConfirmation.upsert({
|
|
458
|
+
where: { sessionId },
|
|
459
|
+
create: {
|
|
460
|
+
sessionId,
|
|
461
|
+
toolName: confirmation.toolName,
|
|
462
|
+
arguments: confirmation.arguments,
|
|
463
|
+
userMessage: confirmation.userMessage,
|
|
464
|
+
timestamp: confirmation.timestamp,
|
|
465
|
+
},
|
|
466
|
+
update: {
|
|
467
|
+
toolName: confirmation.toolName,
|
|
468
|
+
arguments: confirmation.arguments,
|
|
469
|
+
userMessage: confirmation.userMessage,
|
|
470
|
+
timestamp: confirmation.timestamp,
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
this.log('Saved pending confirmation for session:', sessionId);
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Get pending confirmation
|
|
477
|
+
*/
|
|
478
|
+
async getPendingConfirmation(sessionId) {
|
|
479
|
+
const pending = await this.prisma.pendingConfirmation.findUnique({
|
|
480
|
+
where: { sessionId },
|
|
481
|
+
});
|
|
482
|
+
if (!pending) {
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
return {
|
|
486
|
+
toolName: pending.toolName,
|
|
487
|
+
arguments: pending.arguments,
|
|
488
|
+
userMessage: pending.userMessage,
|
|
489
|
+
timestamp: pending.timestamp,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Clear pending confirmation
|
|
494
|
+
*/
|
|
495
|
+
async clearPendingConfirmation(sessionId) {
|
|
496
|
+
try {
|
|
497
|
+
await this.prisma.pendingConfirmation.delete({
|
|
498
|
+
where: { sessionId },
|
|
499
|
+
});
|
|
500
|
+
this.log('Cleared pending confirmation for session:', sessionId);
|
|
501
|
+
return true;
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
// Not found is OK
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Disconnect from database
|
|
510
|
+
*/
|
|
511
|
+
async disconnect() {
|
|
512
|
+
await this.prisma.$disconnect();
|
|
513
|
+
this.log('Disconnected from database');
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Log debug messages
|
|
517
|
+
*/
|
|
518
|
+
log(...args) {
|
|
519
|
+
if (this.debug) {
|
|
520
|
+
console.log('[PrismaStorage]', ...args);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Create a new PrismaStorage instance
|
|
526
|
+
*/
|
|
527
|
+
export function createPrismaStorage(prisma, config) {
|
|
528
|
+
return new PrismaStorage(prisma, config);
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=prisma-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-storage.js","sourceRoot":"","sources":["../src/prisma-storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agenticc/storage-prisma",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Prisma storage adapter for @agenticc/core - production-ready SQL database storage",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public",
|
|
16
|
+
"registry": "https://registry.npmjs.org/"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"prisma",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"keywords": [
|
|
25
|
+
"ai",
|
|
26
|
+
"agent",
|
|
27
|
+
"storage",
|
|
28
|
+
"prisma",
|
|
29
|
+
"database",
|
|
30
|
+
"sql",
|
|
31
|
+
"postgresql",
|
|
32
|
+
"mysql",
|
|
33
|
+
"sqlite",
|
|
34
|
+
"session",
|
|
35
|
+
"conversation"
|
|
36
|
+
],
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/Chajian/agentic.git"
|
|
40
|
+
},
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/Chajian/agentic/issues"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/Chajian/agentic#readme",
|
|
45
|
+
"author": "Chajian <xylyjy@gmail.com>",
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"scripts": {
|
|
48
|
+
"prebuild": "prisma generate",
|
|
49
|
+
"build": "tsc && tsc-alias",
|
|
50
|
+
"clean": "rimraf dist",
|
|
51
|
+
"pretypecheck": "pnpm --filter @agenticc/core build && prisma generate",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"prelint": "pnpm --filter @agenticc/core build && prisma generate",
|
|
54
|
+
"lint": "eslint .",
|
|
55
|
+
"lint:fix": "eslint . --fix",
|
|
56
|
+
"format": "prettier --write src/**/*.ts",
|
|
57
|
+
"format:check": "prettier --check src/**/*.ts",
|
|
58
|
+
"test": "vitest --run --passWithNoTests",
|
|
59
|
+
"test:coverage": "vitest --run --coverage --passWithNoTests",
|
|
60
|
+
"test:watch": "vitest",
|
|
61
|
+
"prisma:generate": "prisma generate",
|
|
62
|
+
"prepublishOnly": "npm run clean && npm run prisma:generate && npm run build && npm run typecheck"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@prisma/client": "^6.1.0"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@agenticc/core": "workspace:*",
|
|
69
|
+
"@types/node": "^22.10.2",
|
|
70
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
71
|
+
"prisma": "^6.1.0",
|
|
72
|
+
"rimraf": "^6.0.1",
|
|
73
|
+
"tsc-alias": "^1.8.10",
|
|
74
|
+
"typescript": "^5.7.2",
|
|
75
|
+
"vitest": "^2.1.8"
|
|
76
|
+
},
|
|
77
|
+
"peerDependencies": {
|
|
78
|
+
"@agenticc/core": "^1.0.0"
|
|
79
|
+
},
|
|
80
|
+
"engines": {
|
|
81
|
+
"node": ">=18.0.0"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Prisma schema for @ai-agent/storage-prisma
|
|
2
|
+
// This schema provides persistent storage for AI agent conversations
|
|
3
|
+
|
|
4
|
+
generator client {
|
|
5
|
+
provider = "prisma-client-js"
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
datasource db {
|
|
9
|
+
provider = "postgresql" // Change to "mysql", "sqlite", etc. as needed
|
|
10
|
+
url = env("DATABASE_URL")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Conversation session
|
|
14
|
+
model Session {
|
|
15
|
+
id String @id @default(uuid())
|
|
16
|
+
createdAt DateTime @default(now())
|
|
17
|
+
updatedAt DateTime @updatedAt
|
|
18
|
+
active Boolean @default(true)
|
|
19
|
+
metadata Json?
|
|
20
|
+
|
|
21
|
+
messages Message[]
|
|
22
|
+
pendingConfirmation PendingConfirmation?
|
|
23
|
+
|
|
24
|
+
@@map("agent_sessions")
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Message in a conversation
|
|
28
|
+
model Message {
|
|
29
|
+
id String @id @default(uuid())
|
|
30
|
+
sessionId String
|
|
31
|
+
role String // 'user' | 'assistant' | 'system'
|
|
32
|
+
content String @db.Text
|
|
33
|
+
timestamp DateTime @default(now())
|
|
34
|
+
responseType String? // For assistant messages
|
|
35
|
+
metadata Json?
|
|
36
|
+
|
|
37
|
+
session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade)
|
|
38
|
+
toolCalls ToolCall[]
|
|
39
|
+
|
|
40
|
+
@@index([sessionId, timestamp])
|
|
41
|
+
@@map("agent_messages")
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Tool call record
|
|
45
|
+
model ToolCall {
|
|
46
|
+
id String @id @default(uuid())
|
|
47
|
+
messageId String
|
|
48
|
+
toolName String
|
|
49
|
+
arguments Json
|
|
50
|
+
result Json
|
|
51
|
+
timestamp DateTime @default(now())
|
|
52
|
+
|
|
53
|
+
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
|
|
54
|
+
|
|
55
|
+
@@index([messageId])
|
|
56
|
+
@@index([toolName, timestamp])
|
|
57
|
+
@@map("agent_tool_calls")
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Pending confirmation for tool execution
|
|
61
|
+
model PendingConfirmation {
|
|
62
|
+
id String @id @default(uuid())
|
|
63
|
+
sessionId String @unique
|
|
64
|
+
toolName String
|
|
65
|
+
arguments Json
|
|
66
|
+
userMessage String @db.Text
|
|
67
|
+
timestamp DateTime @default(now())
|
|
68
|
+
|
|
69
|
+
session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade)
|
|
70
|
+
|
|
71
|
+
@@map("agent_pending_confirmations")
|
|
72
|
+
}
|