{"_id":"@agenticc/storage-prisma","name":"@agenticc/storage-prisma","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@agenticc/storage-prisma","version":"1.0.0","type":"module","description":"Prisma storage adapter for @agenticc/core - production-ready SQL database storage","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"keywords":["ai","agent","storage","prisma","database","sql","postgresql","mysql","sqlite","session","conversation"],"repository":{"type":"git","url":"git+https://github.com/Chajian/agentic.git"},"bugs":{"url":"https://github.com/Chajian/agentic/issues"},"homepage":"https://github.com/Chajian/agentic#readme","author":{"name":"Chajian","email":"xylyjy@gmail.com"},"license":"MIT","scripts":{"prebuild":"prisma generate","build":"tsc && tsc-alias","clean":"rimraf dist","pretypecheck":"pnpm --filter @agenticc/core build && prisma generate","typecheck":"tsc --noEmit","prelint":"pnpm --filter @agenticc/core build && prisma generate","lint":"eslint .","lint:fix":"eslint . --fix","format":"prettier --write src/**/*.ts","format:check":"prettier --check src/**/*.ts","test":"vitest --run --passWithNoTests","test:coverage":"vitest --run --coverage --passWithNoTests","test:watch":"vitest","prisma:generate":"prisma generate","prepublishOnly":"npm run clean && npm run prisma:generate && npm run build && npm run typecheck"},"dependencies":{"@prisma/client":"^6.1.0"},"devDependencies":{"@agenticc/core":"workspace:*","@types/node":"^22.10.2","@vitest/coverage-v8":"^2.1.9","prisma":"^6.1.0","rimraf":"^6.0.1","tsc-alias":"^1.8.10","typescript":"^5.7.2","vitest":"^2.1.8"},"peerDependencies":{"@agenticc/core":"^1.0.0"},"engines":{"node":">=18.0.0"},"_id":"@agenticc/storage-prisma@1.0.0","gitHead":"ab8fefb69c75842eb16951352bb597fc90a42481","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-B7dFZD8/wEic0IUAqYM3CfCAQo+wm7Mf2YHCTamZh+euzO6iKznyfclmNr6TRwjx72R7qXrFotvMU84n9O86pg==","shasum":"1f66282b49b6a6f8aea104e05b12508e31277ba9","tarball":"https://registry.npmjs.org/@agenticc/storage-prisma/-/storage-prisma-1.0.0.tgz","fileCount":12,"unpackedSize":54993,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGNOnc6hBBM3/prOKhsc6F6tcaRz1aUc8V03X+qIbbWMAiAHgzVvoYnBAhZzquRQb8RTlEyENK+r2gG2QOPCwqOIAw=="}]},"_npmUser":{"name":"xylyjy","email":"xylyjy@gmail.com"},"directories":{},"maintainers":[{"name":"xylyjy","email":"xylyjy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/storage-prisma_1.0.0_1770686765899_0.039725199283032975"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-10T01:26:05.729Z","1.0.0":"2026-02-10T01:26:06.051Z","modified":"2026-02-10T01:26:06.345Z"},"maintainers":[{"name":"xylyjy","email":"xylyjy@gmail.com"}],"description":"Prisma storage adapter for @agenticc/core - production-ready SQL database storage","homepage":"https://github.com/Chajian/agentic#readme","keywords":["ai","agent","storage","prisma","database","sql","postgresql","mysql","sqlite","session","conversation"],"repository":{"type":"git","url":"git+https://github.com/Chajian/agentic.git"},"author":{"name":"Chajian","email":"xylyjy@gmail.com"},"bugs":{"url":"https://github.com/Chajian/agentic/issues"},"license":"MIT","readme":"# @ai-agent/storage-prisma\r\n\r\nProduction-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.\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @ai-agent/storage-prisma @prisma/client\r\nnpm install -D prisma\r\n```\r\n\r\n## Database Setup\r\n\r\n### 1. Copy the Prisma schema\r\n\r\nCopy the provided `schema.prisma` file to your project:\r\n\r\n```bash\r\nmkdir -p prisma\r\ncp node_modules/@ai-agent/storage-prisma/prisma/schema.prisma prisma/\r\n```\r\n\r\n### 2. Configure your database\r\n\r\nEdit `prisma/schema.prisma` to set your database provider:\r\n\r\n```prisma\r\ndatasource db {\r\n  provider = \"postgresql\"  // or \"mysql\", \"sqlite\", etc.\r\n  url      = env(\"DATABASE_URL\")\r\n}\r\n```\r\n\r\n### 3. Set database URL\r\n\r\nCreate a `.env` file:\r\n\r\n```env\r\nDATABASE_URL=\"postgresql://user:password@localhost:5432/mydb\"\r\n```\r\n\r\n### 4. Run migrations\r\n\r\n```bash\r\nnpx prisma migrate dev --name init\r\nnpx prisma generate\r\n```\r\n\r\n## Usage\r\n\r\n### Basic Usage\r\n\r\n```typescript\r\nimport { Agent } from '@ai-agent/core';\r\nimport { PrismaStorage } from '@ai-agent/storage-prisma';\r\nimport { PrismaClient } from '@prisma/client';\r\n\r\n// Initialize Prisma client\r\nconst prisma = new PrismaClient();\r\n\r\n// Create storage adapter\r\nconst storage = new PrismaStorage(prisma);\r\n\r\n// Create agent\r\nconst agent = new Agent(config);\r\n\r\n// Create a new session\r\nconst sessionId = await storage.createSession({\r\n  metadata: { userId: '123' }\r\n});\r\n\r\n// Process a message\r\nconst userMessage = 'Hello, agent!';\r\nawait storage.saveUserMessage(sessionId, userMessage);\r\n\r\nconst response = await agent.chat(userMessage, {\r\n  sessionId,\r\n  history: await storage.getHistory(sessionId)\r\n});\r\n\r\n// Store the response\r\nawait storage.saveAssistantMessage(sessionId, response);\r\n\r\n// Cleanup\r\nawait storage.disconnect();\r\n```\r\n\r\n### Session Management\r\n\r\n```typescript\r\n// Create session with metadata\r\nconst sessionId = await storage.createSession({\r\n  metadata: { \r\n    userId: '123',\r\n    channel: 'web'\r\n  }\r\n});\r\n\r\n// Get session\r\nconst session = await storage.getSession(sessionId);\r\n\r\n// Query sessions\r\nconst activeSessions = await storage.querySessions({\r\n  active: true,\r\n  limit: 10\r\n});\r\n\r\n// Update session metadata\r\nawait storage.updateSessionMetadata(sessionId, {\r\n  lastActivity: new Date()\r\n});\r\n\r\n// Close session\r\nawait storage.closeSession(sessionId);\r\n\r\n// Delete session\r\nawait storage.deleteSession(sessionId);\r\n```\r\n\r\n### Message Operations\r\n\r\n```typescript\r\n// Save messages\r\nawait storage.saveUserMessage(sessionId, 'Hello!', {\r\n  source: 'web'\r\n});\r\n\r\nawait storage.saveSystemMessage(sessionId, 'Welcome to the chat!');\r\n\r\n// Get conversation history\r\nconst history = await storage.getHistory(sessionId);\r\n\r\n// Query messages with filters\r\nconst recentMessages = await storage.queryMessages({\r\n  sessionId,\r\n  role: 'user',\r\n  limit: 10,\r\n  order: 'desc'\r\n});\r\n\r\n// Get message count\r\nconst count = await storage.getMessageCount(sessionId);\r\n\r\n// Delete messages\r\nawait storage.deleteMessage(messageId);\r\nawait storage.deleteSessionMessages(sessionId);\r\n```\r\n\r\n### Tool Call Tracking\r\n\r\n```typescript\r\n// Tool calls are automatically stored with assistant messages\r\nconst response = await agent.chat('Search for AI news', {\r\n  sessionId,\r\n  history: await storage.getHistory(sessionId)\r\n});\r\n\r\nawait storage.saveAssistantMessage(sessionId, response);\r\n\r\n// Query tool calls\r\nconst toolCalls = await storage.queryToolCalls({\r\n  sessionId,\r\n  toolName: 'search',\r\n  success: true\r\n});\r\n\r\n// Get tool calls for a message\r\nconst calls = await storage.getToolCallsForMessage(messageId);\r\n```\r\n\r\n### Pending Confirmations\r\n\r\n```typescript\r\n// Save pending confirmation\r\nawait storage.savePendingConfirmation(sessionId, {\r\n  toolName: 'deleteFile',\r\n  arguments: { path: '/important.txt' },\r\n  userMessage: 'Delete the file',\r\n  timestamp: new Date()\r\n});\r\n\r\n// Get pending confirmation\r\nconst pending = await storage.getPendingConfirmation(sessionId);\r\n\r\n// Clear pending confirmation\r\nawait storage.clearPendingConfirmation(sessionId);\r\n```\r\n\r\n## Features\r\n\r\n- **Production-ready**: Persistent SQL database storage\r\n- **Multi-database**: Supports PostgreSQL, MySQL, SQLite, SQL Server, MongoDB\r\n- **Type-safe**: Full TypeScript support with Prisma\r\n- **Efficient**: Optimized queries with proper indexing\r\n- **Flexible**: Rich query API for messages and tool calls\r\n- **Transactional**: ACID guarantees for data integrity\r\n\r\n## Database Schema\r\n\r\nThe package includes a Prisma schema with the following models:\r\n\r\n### Session\r\n- `id` - Unique session identifier\r\n- `createdAt` - Session creation timestamp\r\n- `updatedAt` - Last update timestamp\r\n- `active` - Whether session is active\r\n- `metadata` - JSON metadata\r\n- `messages` - Related messages\r\n- `pendingConfirmation` - Optional pending confirmation\r\n\r\n### Message\r\n- `id` - Unique message identifier\r\n- `sessionId` - Foreign key to session\r\n- `role` - Message role (user/assistant/system)\r\n- `content` - Message content\r\n- `timestamp` - Message timestamp\r\n- `responseType` - Response type for assistant messages\r\n- `metadata` - JSON metadata\r\n- `toolCalls` - Related tool calls\r\n\r\n### ToolCall\r\n- `id` - Unique tool call identifier\r\n- `messageId` - Foreign key to message\r\n- `toolName` - Name of the tool\r\n- `arguments` - JSON arguments\r\n- `result` - JSON result\r\n- `timestamp` - Execution timestamp\r\n\r\n### PendingConfirmation\r\n- `id` - Unique identifier\r\n- `sessionId` - Foreign key to session (unique)\r\n- `toolName` - Tool requiring confirmation\r\n- `arguments` - JSON arguments\r\n- `userMessage` - Original user message\r\n- `timestamp` - Creation timestamp\r\n\r\n## API Reference\r\n\r\n### PrismaStorage\r\n\r\n#### Constructor\r\n```typescript\r\nnew PrismaStorage(prismaClient: PrismaClient)\r\n```\r\n\r\n#### Session Methods\r\n- `createSession(options?)` - Create a new session\r\n- `getSession(sessionId)` - Get session by ID\r\n- `querySessions(options?)` - Query sessions with filters\r\n- `updateSessionMetadata(sessionId, metadata)` - Update session metadata\r\n- `closeSession(sessionId)` - Mark session as inactive\r\n- `deleteSession(sessionId)` - Delete session and all messages\r\n\r\n#### Message Methods\r\n- `saveUserMessage(sessionId, content, metadata?)` - Save user message\r\n- `saveAssistantMessage(sessionId, response, metadata?)` - Save assistant message\r\n- `saveSystemMessage(sessionId, content)` - Save system message\r\n- `getHistory(sessionId)` - Get conversation history\r\n- `getMessage(messageId)` - Get message by ID\r\n- `queryMessages(options?)` - Query messages with filters\r\n- `getMessageCount(sessionId)` - Get message count\r\n- `deleteMessage(messageId)` - Delete a message\r\n- `deleteSessionMessages(sessionId)` - Delete all session messages\r\n\r\n#### Tool Call Methods\r\n- `queryToolCalls(options?)` - Query tool calls with filters\r\n- `getToolCallsForMessage(messageId)` - Get tool calls for a message\r\n\r\n#### Confirmation Methods\r\n- `savePendingConfirmation(sessionId, confirmation)` - Save pending confirmation\r\n- `getPendingConfirmation(sessionId)` - Get pending confirmation\r\n- `clearPendingConfirmation(sessionId)` - Clear pending confirmation\r\n\r\n#### Utility Methods\r\n- `disconnect()` - Close database connection\r\n\r\n## Migration from In-Memory Storage\r\n\r\nIf you're migrating from `@ai-agent/storage-memory`:\r\n\r\n1. Install this package and set up your database\r\n2. Replace `SessionManager` with `PrismaStorage`\r\n3. Update method calls (API is similar but async)\r\n4. Run database migrations\r\n\r\nExample:\r\n\r\n```typescript\r\n// Before (memory)\r\nimport { SessionManager } from '@ai-agent/storage-memory';\r\nconst storage = new SessionManager();\r\nconst sessionId = storage.createSession();\r\nstorage.addUserMessage(sessionId, 'Hello');\r\n\r\n// After (Prisma)\r\nimport { PrismaStorage } from '@ai-agent/storage-prisma';\r\nconst storage = new PrismaStorage(prisma);\r\nconst sessionId = await storage.createSession();\r\nawait storage.saveUserMessage(sessionId, 'Hello');\r\n```\r\n\r\n## Performance Tips\r\n\r\n1. **Connection Pooling**: Configure Prisma connection pool for your workload\r\n2. **Indexes**: The schema includes optimized indexes for common queries\r\n3. **Batch Operations**: Use transactions for multiple operations\r\n4. **Pagination**: Use `limit` and `offset` for large result sets\r\n5. **Cleanup**: Regularly delete old inactive sessions\r\n\r\n## Troubleshooting\r\n\r\n### Connection Issues\r\n```typescript\r\n// Check database connection\r\nawait prisma.$connect();\r\n```\r\n\r\n### Migration Errors\r\n```bash\r\n# Reset database (development only!)\r\nnpx prisma migrate reset\r\n\r\n# Create new migration\r\nnpx prisma migrate dev --name your_migration_name\r\n```\r\n\r\n### Type Generation\r\n```bash\r\n# Regenerate Prisma client\r\nnpx prisma generate\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","_rev":"1-c828ce6973516c095558caf921d4628a"}