agentcrumbs
Version:
Debug mode for any agent.
53 lines • 1.92 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.saveCursor = saveCursor;
exports.resolveCursor = resolveCursor;
const node_fs_1 = __importDefault(require("node:fs"));
const node_path_1 = __importDefault(require("node:path"));
const node_os_1 = __importDefault(require("node:os"));
const node_crypto_1 = require("node:crypto");
const CURSOR_FILE = node_path_1.default.join(node_os_1.default.homedir(), ".agentcrumbs", ".cursors.json");
const MAX_CURSORS = 50;
const CURSOR_TTL = 60 * 60 * 1000; // 1 hour
function readCursors() {
try {
return JSON.parse(node_fs_1.default.readFileSync(CURSOR_FILE, "utf-8"));
}
catch {
return {};
}
}
function writeCursors(cursors) {
const dir = node_path_1.default.dirname(CURSOR_FILE);
if (!node_fs_1.default.existsSync(dir)) {
node_fs_1.default.mkdirSync(dir, { recursive: true });
}
node_fs_1.default.writeFileSync(CURSOR_FILE, JSON.stringify(cursors));
}
function generateId(ts, offset) {
const hash = (0, node_crypto_1.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);
}
function saveCursor(ts, offset) {
const id = generateId(ts, offset);
const cursors = pruneOld(readCursors());
cursors[id] = { ts, offset, createdAt: Date.now() };
writeCursors(cursors);
return id;
}
function resolveCursor(id) {
const cursors = readCursors();
return cursors[id];
}
//# sourceMappingURL=cursor.js.map