Files
gnome-jarvis/vendor/agent-harness/agent/memory.js
T
2026-09-11 13:41:22 -04:00

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 };