Files
lettabot/src/core/memory.ts
2026-02-23 16:35:23 -08:00

60 lines
1.7 KiB
TypeScript

/**
* Memory loader - reads .mdx files from src/memories/ and returns
* CreateBlock objects for the Letta Code SDK.
*/
import { readdirSync, readFileSync, existsSync } from 'node:fs';
import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import matter from 'gray-matter';
import { createLogger } from '../logger.js';
const log = createLogger('Memory');
const __dirname = dirname(fileURLToPath(import.meta.url));
// Try dist/memories first, fall back to src/memories
const MEMORIES_DIR = existsSync(join(__dirname, '..', 'memories'))
? join(__dirname, '..', 'memories')
: join(__dirname, '..', '..', 'src', 'memories');
export interface MemoryBlock {
label: string;
value: string;
description?: string;
limit?: number;
}
/**
* Load all .mdx files from the memories directory and parse them into
* memory blocks for the SDK's `memory` option.
*
* @param agentName - Name to substitute for {{AGENT_NAME}} in block values
*/
export function loadMemoryBlocks(agentName = 'LettaBot'): MemoryBlock[] {
if (!existsSync(MEMORIES_DIR)) {
log.warn(`No memories directory found at ${MEMORIES_DIR}`);
return [];
}
const files = readdirSync(MEMORIES_DIR).filter((f: string) => f.endsWith('.mdx'));
const blocks: MemoryBlock[] = [];
for (const file of files) {
const raw = readFileSync(join(MEMORIES_DIR, file), 'utf-8');
const { data, content } = matter(raw);
const label = data.label || file.replace('.mdx', '');
const block: MemoryBlock = {
label,
value: content.trim().replaceAll('{{AGENT_NAME}}', agentName),
};
if (data.description) block.description = data.description;
if (data.limit) block.limit = Number(data.limit);
blocks.push(block);
}
return blocks;
}