/** * Simple file-backed memory under the agent workspace. */ const path = require('path'); const fs = require('fs'); const { ensureDir } = require('../lib/paths.js'); const { formatInject } = require('./memory-format.js'); const sandbox = require('./sandbox.js'); function memoryDir(origin) { return ensureDir(path.join(sandbox.defaultCwd(origin), '.agent-harness', 'memory')); } function writeNote(origin, name, text) { const dir = memoryDir(origin); const file = path.join(dir, sandbox.sanitizeId(name || 'note') + '.md'); fs.writeFileSync(file, String(text || '')); return file; } function listNotes(origin) { const dir = memoryDir(origin); let names = []; try { names = fs.readdirSync(dir); } catch (_) { return []; } return names.filter((n) => n.endsWith('.md')); } function readNote(origin, name) { const file = path.join(memoryDir(origin), sandbox.sanitizeId(name.replace(/\.md$/, '')) + '.md'); return fs.readFileSync(file, 'utf8'); } function search(origin, query) { const q = String(query || '').toLowerCase(); const hits = []; for (const n of listNotes(origin)) { let text = ''; try { text = readNote(origin, n); } catch (_) { continue; } if (!q || n.toLowerCase().includes(q) || text.toLowerCase().includes(q)) { hits.push({ name: n, snippet: text.slice(0, 400) }); } } return hits.slice(0, 20); } function injectBlock(origin, query) { try { return formatInject(search(origin, query), 5); } catch (_) { return ''; } } module.exports = { writeNote, listNotes, readNote, search, formatInject, injectBlock };