agentcrumbs
Version:
Debug mode for any agent.
46 lines • 1.43 kB
JavaScript
import fs from "node:fs";
import path from "node:path";
import os from "node:os";
import { createHash } from "node:crypto";
const CURSOR_FILE = path.join(os.homedir(), ".agentcrumbs", ".cursors.json");
const MAX_CURSORS = 50;
const CURSOR_TTL = 60 * 60 * 1000; // 1 hour
function readCursors() {
try {
return JSON.parse(fs.readFileSync(CURSOR_FILE, "utf-8"));
}
catch {
return {};
}
}
function writeCursors(cursors) {
const dir = path.dirname(CURSOR_FILE);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
fs.writeFileSync(CURSOR_FILE, JSON.stringify(cursors));
}
function generateId(ts, offset) {
const hash = createHash("sha256").update(`${ts}:${offset}`).digest("hex");
return hash.slice(0, 8);
}
function pruneOld(cursors) {
const now = Date.now();
const entries = Object.entries(cursors)
.filter(([, v]) => now - v.createdAt < CURSOR_TTL)
.sort((a, b) => b[1].createdAt - a[1].createdAt)
.slice(0, MAX_CURSORS);
return Object.fromEntries(entries);
}
export function saveCursor(ts, offset) {
const id = generateId(ts, offset);
const cursors = pruneOld(readCursors());
cursors[id] = { ts, offset, createdAt: Date.now() };
writeCursors(cursors);
return id;
}
export function resolveCursor(id) {
const cursors = readCursors();
return cursors[id];
}
//# sourceMappingURL=cursor.js.map