Interface: IStorageAdapter
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:217
Core storage adapter interface for AgentOS persistence.
Implementations of this interface provide the actual storage mechanism (SQL database, NoSQL, in-memory, etc.) while AgentOS remains storage-agnostic.
Design Principles:
- All methods are async for non-blocking I/O
- Returns null when entities don't exist (not throwing errors)
- Uses strong typing for compile-time safety
- Supports transaction-like batch operations
- Designed for multi-user scenarios (userId scoping)
Lifecycle:
- Instantiate adapter with configuration
- Call
initialize()to set up database/schema - Use CRUD operations during runtime
- Call
close()when shutting down (optional cleanup)
IStorageAdapter
Example
// Example implementation instantiation
const storage: IStorageAdapter = new SqlStorageAdapter({
type: 'better-sqlite3',
database: './agentos.db'
});
await storage.initialize();
// Create conversation
const conversation = await storage.createConversation({
id: 'conv-123',
userId: 'user-456',
createdAt: Date.now(),
lastActivity: Date.now()
});
// Store message
await storage.storeMessage({
id: 'msg-001',
conversationId: 'conv-123',
role: 'user',
content: 'Hello!',
timestamp: Date.now()
});
// Query messages
const messages = await storage.getMessages('conv-123', { limit: 10 });
Methods
close()
close():
Promise<void>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:260
Closes the storage adapter and releases resources.
This should:
- Close database connections
- Flush any pending writes
- Clean up temporary resources
Call during application shutdown for graceful cleanup.
Returns
Promise<void>
Resolves when cleanup is complete
Example
process.on('SIGTERM', async () => {
await storage.close();
process.exit(0);
});
createConversation()
createConversation(
conversation):Promise<IConversation>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:283
Creates a new conversation record.
Parameters
conversation
The conversation object to create
Returns
Promise<IConversation>
The created conversation (may include defaults)
Throws
If conversation with same ID already exists or validation fails
Example
const conversation = await storage.createConversation({
id: uuidv4(),
userId: 'user-123',
agentId: 'agent-coding',
createdAt: Date.now(),
lastActivity: Date.now(),
title: 'New coding project'
});
deleteConversation()
deleteConversation(
conversationId):Promise<boolean>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:339
Deletes a conversation and all its messages.
Warning: This is a destructive operation that cannot be undone. Consider implementing soft deletes in production.
Parameters
conversationId
string
The conversation to delete
Returns
Promise<boolean>
True if deleted, false if not found
Example
const deleted = await storage.deleteConversation('conv-123');
if (deleted) {
console.log('Conversation deleted successfully');
}
deleteMessage()
deleteMessage(
messageId):Promise<boolean>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:453
Deletes a specific message.
Note: This does NOT update the conversation's lastActivity timestamp.
Parameters
messageId
string
The message to delete
Returns
Promise<boolean>
True if deleted, false if not found
Example
const deleted = await storage.deleteMessage('msg-456');
deleteMessagesForConversation()
deleteMessagesForConversation(
conversationId):Promise<number>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:469
Deletes all messages in a conversation.
Warning: Destructive operation. Consider soft deletes in production.
Parameters
conversationId
string
The conversation whose messages to delete
Returns
Promise<number>
Number of messages deleted
Example
const deletedCount = await storage.deleteMessagesForConversation('conv-123');
console.log(`Deleted ${deletedCount} messages`);
getConversation()
getConversation(
conversationId):Promise<IConversation|null>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:299
Retrieves a conversation by its ID.
Parameters
conversationId
string
The unique conversation identifier
Returns
Promise<IConversation | null>
The conversation or null if not found
Example
const conv = await storage.getConversation('conv-123');
if (conv) {
console.log('Found:', conv.title);
}
getConversationTokenUsage()
getConversationTokenUsage(
conversationId):Promise<ITokenUsage>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:504
Calculates total token usage for a conversation.
Sums up all message usage statistics.
Parameters
conversationId
string
The conversation to analyze
Returns
Promise<ITokenUsage>
Aggregated token usage
Example
const usage = await storage.getConversationTokenUsage('conv-123');
console.log(`Total tokens: ${usage.totalTokens}`);
console.log(`Cost estimate: $${usage.totalTokens * 0.00001}`);
getMessage()
getMessage(
messageId):Promise<IConversationMessage|null>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:409
Retrieves a single message by its ID.
Parameters
messageId
string
The unique message identifier
Returns
Promise<IConversationMessage | null>
The message or null if not found
Example
const msg = await storage.getMessage('msg-456');
if (msg) {
console.log(`[${msg.role}]: ${msg.content}`);
}
getMessageCount()
getMessageCount(
conversationId):Promise<number>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:487
Counts total messages in a conversation.
Useful for pagination and UI indicators.
Parameters
conversationId
string
The conversation to count
Returns
Promise<number>
Total message count
Example
const count = await storage.getMessageCount('conv-123');
console.log(`This conversation has ${count} messages`);
getMessages()
getMessages(
conversationId,options?):Promise<IConversationMessage[]>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:438
Retrieves all messages for a conversation with optional filtering.
This is the primary method for loading conversation history.
Parameters
conversationId
string
The conversation to query
options?
Query options for filtering/pagination
Returns
Promise<IConversationMessage[]>
Array of messages matching criteria
Example
// Get all messages (oldest first)
const allMessages = await storage.getMessages('conv-123');
// Get last 50 messages (newest first)
const recent = await storage.getMessages('conv-123', {
limit: 50,
order: 'desc'
});
// Get only assistant responses from last hour
const assistantRecent = await storage.getMessages('conv-123', {
roles: ['assistant'],
since: Date.now() - 3600000
});
initialize()
initialize():
Promise<void>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:238
Initializes the storage adapter.
This should:
- Establish database connections
- Create necessary tables/schemas if they don't exist
- Run migrations if needed
- Validate configuration
Must be called before any other methods.
Returns
Promise<void>
Resolves when initialization is complete
Throws
If initialization fails (connection errors, invalid config, etc.)
Example
const storage = new SqlStorageAdapter(config);
await storage.initialize(); // Sets up database schema
listConversations()
listConversations(
userId,options?):Promise<IConversation[]>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:366
Lists all conversations for a specific user.
Results are typically ordered by lastActivity (most recent first).
Parameters
userId
string
The user whose conversations to retrieve
options?
Optional filtering/pagination
agentId?
string
Filter by specific agent
limit?
number
Maximum conversations to return
offset?
number
Number of conversations to skip
Returns
Promise<IConversation[]>
Array of conversations
Example
// Get user's 20 most recent conversations
const conversations = await storage.listConversations('user-123', {
limit: 20
});
// Get conversations for specific agent
const codingConvs = await storage.listConversations('user-123', {
agentId: 'agent-coding'
});
storeMessage()
storeMessage(
message):Promise<IConversationMessage>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:393
Stores a new message in a conversation.
Note: This also updates the parent conversation's lastActivity timestamp.
Parameters
message
The message to store
Returns
Promise<IConversationMessage>
The stored message
Throws
If conversation doesn't exist or validation fails
Example
await storage.storeMessage({
id: uuidv4(),
conversationId: 'conv-123',
role: 'user',
content: 'Explain async/await',
timestamp: Date.now()
});
updateConversation()
updateConversation(
conversationId,updates):Promise<IConversation>
Defined in: packages/agentos/src/core/storage/IStorageAdapter.ts:320
Updates an existing conversation's metadata.
Only provided fields will be updated. Omitted fields remain unchanged.
Parameters
conversationId
string
The conversation to update
updates
Partial<IConversation>
Fields to update
Returns
Promise<IConversation>
The updated conversation
Throws
If conversation doesn't exist
Example
// Update title and last activity
const updated = await storage.updateConversation('conv-123', {
title: 'Renamed conversation',
lastActivity: Date.now()
});