64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
/**
|
|
* 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 };
|