@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 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
@@ -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
+ }