Skip to main content

Memory

The Memory module provides flexible storage capabilities for different data formats including JSON, Todo items, and Markdown content. It enables agents to persist and retrieve structured data, task lists, and documentation across sessions.

Quick Start Guide

Basic Memory Operations

import codebolt from '@codebolt/codeboltjs';

async function quickStart() {
// Save JSON data
const jsonResult = await codebolt.memory.json.save({
type: 'user-preference',
theme: 'dark',
language: 'en'
});
console.log('Saved JSON:', jsonResult.memoryId);

// Save a todo
const todoResult = await codebolt.memory.todo.save({
title: 'Complete documentation',
description: 'Write API docs',
status: 'pending',
priority: 'high'
});
console.log('Saved Todo:', todoResult.memoryId);

// Save markdown
const mdResult = await codebolt.memory.markdown.save(
'# Project Notes\n\nImportant information here.',
{ category: 'notes', project: 'api-docs' }
);
console.log('Saved Markdown:', mdResult.memoryId);
}

JSON Memory

Save JSON Data

const result = await codebolt.memory.json.save({
userId: '123',
preferences: {
notifications: true,
theme: 'dark'
},
lastLogin: new Date().toISOString()
});

console.log('Memory ID:', result.memoryId);

Update JSON Data

await codebolt.memory.json.update(memoryId, {
userId: '123',
preferences: {
notifications: false,
theme: 'light'
}
});

List JSON Entries

const result = await codebolt.memory.json.list({
userId: '123'
});

console.log('Found entries:', result.items.length);

Delete JSON Entry

await codebolt.memory.json.delete(memoryId);

Todo Memory

Save Todo Item

const todo = await codebolt.memory.todo.save(
{
title: 'Implement authentication',
description: 'Add JWT-based auth',
status: 'in-progress',
priority: 'high',
dueDate: '2026-02-01',
tags: ['security', 'backend']
},
{
project: 'api-development',
assignee: 'dev-team'
}
);

Update Todo Item

await codebolt.memory.todo.update(todoId, {
title: 'Implement authentication',
status: 'completed',
completedAt: new Date().toISOString()
});

List Todos with Filters

// Get all high-priority todos
const highPriority = await codebolt.memory.todo.list({
priority: 'high',
status: 'pending'
});

// Get todos for a specific project
const projectTodos = await codebolt.memory.todo.list({
'metadata.project': 'api-development'
});

Markdown Memory

Save Markdown Content

const markdown = `
# API Documentation

## Overview
This API provides...

## Endpoints
- GET /api/users
- POST /api/users
`;

const result = await codebolt.memory.markdown.save(markdown, {
category: 'documentation',
version: '1.0',
author: 'dev-team'
});

Update Markdown Content

const updatedMarkdown = `
# API Documentation (Updated)

## Overview
This API provides enhanced features...
`;

await codebolt.memory.markdown.update(
memoryId,
updatedMarkdown,
{ version: '1.1' }
);

List Markdown Entries

const docs = await codebolt.memory.markdown.list({
category: 'documentation'
});

for (const doc of docs.items) {
console.log(`- ${doc.metadata.version}: ${doc.markdown.substring(0, 50)}...`);
}

Common Workflows

Workflow 1: Project Configuration Storage

async function saveProjectConfig(projectId, config) {
return await codebolt.memory.json.save({
projectId,
config,
updatedAt: new Date().toISOString()
});
}

async function loadProjectConfig(projectId) {
const results = await codebolt.memory.json.list({ projectId });
return results.items[0]?.json.config || null;
}

async function updateProjectConfig(projectId, updates) {
const results = await codebolt.memory.json.list({ projectId });
if (results.items.length > 0) {
const existing = results.items[0];
await codebolt.memory.json.update(existing.memoryId, {
projectId,
config: { ...existing.json.config, ...updates },
updatedAt: new Date().toISOString()
});
}
}

Workflow 2: Task Management System

class TaskManager {
async createTask(title, description, priority = 'medium') {
return await codebolt.memory.todo.save({
title,
description,
status: 'pending',
priority,
createdAt: new Date().toISOString()
});
}

async completeTask(taskId) {
return await codebolt.memory.todo.update(taskId, {
status: 'completed',
completedAt: new Date().toISOString()
});
}

async getPendingTasks() {
const result = await codebolt.memory.todo.list({ status: 'pending' });
return result.items;
}

async getTasksByPriority(priority) {
const result = await codebolt.memory.todo.list({ priority });
return result.items;
}

async deleteCompletedTasks() {
const completed = await codebolt.memory.todo.list({ status: 'completed' });

for (const task of completed.items) {
await codebolt.memory.todo.delete(task.memoryId);
}

return completed.items.length;
}
}

// Usage
const taskManager = new TaskManager();
await taskManager.createTask('Write tests', 'Unit tests for auth module', 'high');
const pending = await taskManager.getPendingTasks();

Workflow 3: Documentation Management

class DocumentationManager {
async saveDoc(title, content, metadata = {}) {
const markdown = `# ${title}\n\n${content}`;
return await codebolt.memory.markdown.save(markdown, {
title,
...metadata,
createdAt: new Date().toISOString()
});
}

async updateDoc(memoryId, content, metadata = {}) {
return await codebolt.memory.markdown.update(memoryId, content, {
...metadata,
updatedAt: new Date().toISOString()
});
}

async searchDocs(query) {
const allDocs = await codebolt.memory.markdown.list({});

return allDocs.items.filter(doc =>
doc.markdown.toLowerCase().includes(query.toLowerCase())
);
}

async getDocsByCategory(category) {
return await codebolt.memory.markdown.list({ category });
}

async exportDocs(category) {
const docs = await this.getDocsByCategory(category);

return docs.items.map(doc => ({
title: doc.metadata.title,
content: doc.markdown,
metadata: doc.metadata
}));
}
}

Workflow 4: Session State Management

async function saveSessionState(sessionId, state) {
// Check if session exists
const existing = await codebolt.memory.json.list({ sessionId });

if (existing.items.length > 0) {
// Update existing session
await codebolt.memory.json.update(existing.items[0].memoryId, {
sessionId,
state,
lastUpdated: Date.now()
});
} else {
// Create new session
await codebolt.memory.json.save({
sessionId,
state,
createdAt: Date.now(),
lastUpdated: Date.now()
});
}
}

async function loadSessionState(sessionId) {
const result = await codebolt.memory.json.list({ sessionId });
return result.items[0]?.json.state || null;
}

async function clearOldSessions(maxAgeMs = 24 * 60 * 60 * 1000) {
const allSessions = await codebolt.memory.json.list({});
const now = Date.now();
let cleared = 0;

for (const session of allSessions.items) {
if (now - session.json.lastUpdated > maxAgeMs) {
await codebolt.memory.json.delete(session.memoryId);
cleared++;
}
}

return cleared;
}

Best Practices

1. Use Appropriate Format

// Good: Use JSON for structured data
await codebolt.memory.json.save({
userId: '123',
settings: { theme: 'dark' }
});

// Good: Use Todo for task items
await codebolt.memory.todo.save({
title: 'Task',
status: 'pending'
});

// Good: Use Markdown for documentation
await codebolt.memory.markdown.save('# Documentation\n\nContent here');

// Bad: Using wrong format
await codebolt.memory.json.save('# This should be markdown');

2. Include Metadata

// Good: Rich metadata for filtering
await codebolt.memory.json.save(data, {
category: 'user-data',
version: '1.0',
createdBy: 'agent-id',
project: 'my-project'
});

// Bad: No metadata
await codebolt.memory.json.save(data);

3. Handle Errors

// Good: Proper error handling
try {
const result = await codebolt.memory.json.save(data);
if (!result.success) {
console.error('Save failed:', result.error);
}
} catch (error) {
console.error('Error saving:', error);
}

// Bad: No error handling
const result = await codebolt.memory.json.save(data);

4. Clean Up Old Data

// Good: Regular cleanup
async function cleanupOldMemories() {
const cutoffDate = Date.now() - (30 * 24 * 60 * 60 * 1000); // 30 days

const oldItems = await codebolt.memory.json.list({
createdAt: { $lt: cutoffDate }
});

for (const item of oldItems.items) {
await codebolt.memory.json.delete(item.memoryId);
}
}

// Bad: Never cleaning up
// Memory grows indefinitely

5. Use Filters Effectively

// Good: Specific filters
const result = await codebolt.memory.json.list({
category: 'user-preferences',
userId: '123'
});

// Bad: Loading everything then filtering
const all = await codebolt.memory.json.list({});
const filtered = all.items.filter(item => item.json.userId === '123');

Performance Considerations

  1. Batch Operations: Group multiple saves/updates when possible
  2. Filtering: Use filters in list operations instead of loading all data
  3. Pagination: Implement pagination for large result sets
  4. Caching: Cache frequently accessed memory items
  5. Cleanup: Regularly delete unused memory entries

Security Considerations

  1. Data Validation: Validate all data before saving
  2. Access Control: Implement proper authorization checks
  3. Sensitive Data: Encrypt sensitive information before storing
  4. Audit Logging: Log all memory operations
  5. Data Retention: Implement data retention policies

Common Pitfalls

Pitfall 1: Not Checking Success

// Problem: Assuming operation succeeded
const result = await codebolt.memory.json.save(data);
console.log(result.memoryId); // Could be undefined!

// Solution: Check success
const result = await codebolt.memory.json.save(data);
if (result.success) {
console.log(result.memoryId);
} else {
console.error('Save failed:', result.error);
}

Pitfall 2: Memory Leaks

// Problem: Never deleting old data
await codebolt.memory.json.save(data); // Repeated many times

// Solution: Implement cleanup
async function saveWithCleanup(data) {
await codebolt.memory.json.save(data);
await cleanupOldEntries();
}

Pitfall 3: Inefficient Queries

// Problem: Loading all data
const all = await codebolt.memory.json.list({});
const found = all.items.find(item => item.json.id === targetId);

// Solution: Use filters
const result = await codebolt.memory.json.list({ id: targetId });
const found = result.items[0];

Integration Examples

With Agent Module

async function agentWithMemory(agentId, task) {
// Save task to memory
const taskMemory = await codebolt.memory.todo.save({
title: task,
status: 'in-progress',
agentId
});

// Execute agent
const result = await codebolt.agent.startAgent(agentId, task);

// Update task status
await codebolt.memory.todo.update(taskMemory.memoryId, {
status: result.success ? 'completed' : 'failed',
result: result.result
});

return result;
}

With Action Plan Module

async function actionPlanWithMemory(planId) {
// Save plan state
const planState = await codebolt.memory.json.save({
planId,
status: 'running',
startTime: Date.now()
});

// Execute plan
const details = await codebolt.actionPlan.getPlanDetail(planId);

for (const task of details.tasks) {
await codebolt.actionPlan.startTaskStep(planId, task.id);

// Update progress
await codebolt.memory.json.update(planState.memoryId, {
planId,
status: 'running',
completedTasks: details.tasks.indexOf(task) + 1,
totalTasks: details.tasks.length
});
}

// Mark complete
await codebolt.memory.json.update(planState.memoryId, {
planId,
status: 'completed',
endTime: Date.now()
});
}