@mindstudio-ai/remy 0.1.227 → 0.1.228
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/headless.js +44 -0
- package/dist/index.js +45 -1
- package/package.json +1 -1
package/dist/headless.js
CHANGED
|
@@ -6362,7 +6362,9 @@ var SESSION_FILE = ".remy-session.json";
|
|
|
6362
6362
|
var ARCHIVE_DIR = ".logs/sessions";
|
|
6363
6363
|
var ROTATE_THRESHOLD_BYTES = 32 * 1024 * 1024;
|
|
6364
6364
|
var RETAIN_TAIL_BYTES = 16 * 1024 * 1024;
|
|
6365
|
+
var ARCHIVE_RETENTION_BYTES = 64 * 1024 * 1024;
|
|
6365
6366
|
function loadSession(state) {
|
|
6367
|
+
pruneArchives();
|
|
6366
6368
|
try {
|
|
6367
6369
|
const raw = fs22.readFileSync(SESSION_FILE, "utf-8");
|
|
6368
6370
|
const data = JSON.parse(raw);
|
|
@@ -6450,8 +6452,50 @@ function archiveMessages(messages, label, models) {
|
|
|
6450
6452
|
}
|
|
6451
6453
|
fs22.writeFileSync(dest, JSON.stringify(payload), "utf-8");
|
|
6452
6454
|
log12.info("Session archived", { label, dest, messageCount: messages.length });
|
|
6455
|
+
pruneArchives();
|
|
6453
6456
|
return dest;
|
|
6454
6457
|
}
|
|
6458
|
+
function pruneArchives() {
|
|
6459
|
+
try {
|
|
6460
|
+
const entries = fs22.readdirSync(ARCHIVE_DIR).filter((name) => /^(cleared|rotated)-.*\.json$/.test(name));
|
|
6461
|
+
if (entries.length <= 1) {
|
|
6462
|
+
return;
|
|
6463
|
+
}
|
|
6464
|
+
const sortKey = (name) => name.replace(/^(cleared|rotated)-/, "");
|
|
6465
|
+
const archives = entries.map((name) => ({
|
|
6466
|
+
name,
|
|
6467
|
+
size: fs22.statSync(path11.join(ARCHIVE_DIR, name)).size
|
|
6468
|
+
})).sort((a, b) => sortKey(b.name).localeCompare(sortKey(a.name)));
|
|
6469
|
+
let kept = 0;
|
|
6470
|
+
let cut = archives.length;
|
|
6471
|
+
for (let i = 0; i < archives.length; i++) {
|
|
6472
|
+
if (i === 0 || kept + archives[i].size <= ARCHIVE_RETENTION_BYTES) {
|
|
6473
|
+
kept += archives[i].size;
|
|
6474
|
+
} else {
|
|
6475
|
+
cut = i;
|
|
6476
|
+
break;
|
|
6477
|
+
}
|
|
6478
|
+
}
|
|
6479
|
+
let removed = 0;
|
|
6480
|
+
let freed = 0;
|
|
6481
|
+
for (let i = cut; i < archives.length; i++) {
|
|
6482
|
+
try {
|
|
6483
|
+
fs22.unlinkSync(path11.join(ARCHIVE_DIR, archives[i].name));
|
|
6484
|
+
freed += archives[i].size;
|
|
6485
|
+
removed++;
|
|
6486
|
+
} catch {
|
|
6487
|
+
}
|
|
6488
|
+
}
|
|
6489
|
+
if (removed > 0) {
|
|
6490
|
+
log12.info("Session archives pruned", {
|
|
6491
|
+
removed,
|
|
6492
|
+
freedBytes: freed,
|
|
6493
|
+
keptBytes: kept
|
|
6494
|
+
});
|
|
6495
|
+
}
|
|
6496
|
+
} catch {
|
|
6497
|
+
}
|
|
6498
|
+
}
|
|
6455
6499
|
function rotate(state) {
|
|
6456
6500
|
const messages = state.messages;
|
|
6457
6501
|
if (messages.length === 0) {
|
package/dist/index.js
CHANGED
|
@@ -6717,6 +6717,7 @@ var init_toolResultCap = __esm({
|
|
|
6717
6717
|
import fs20 from "fs";
|
|
6718
6718
|
import path9 from "path";
|
|
6719
6719
|
function loadSession(state) {
|
|
6720
|
+
pruneArchives();
|
|
6720
6721
|
try {
|
|
6721
6722
|
const raw = fs20.readFileSync(SESSION_FILE, "utf-8");
|
|
6722
6723
|
const data = JSON.parse(raw);
|
|
@@ -6804,8 +6805,50 @@ function archiveMessages(messages, label, models) {
|
|
|
6804
6805
|
}
|
|
6805
6806
|
fs20.writeFileSync(dest, JSON.stringify(payload), "utf-8");
|
|
6806
6807
|
log9.info("Session archived", { label, dest, messageCount: messages.length });
|
|
6808
|
+
pruneArchives();
|
|
6807
6809
|
return dest;
|
|
6808
6810
|
}
|
|
6811
|
+
function pruneArchives() {
|
|
6812
|
+
try {
|
|
6813
|
+
const entries = fs20.readdirSync(ARCHIVE_DIR).filter((name) => /^(cleared|rotated)-.*\.json$/.test(name));
|
|
6814
|
+
if (entries.length <= 1) {
|
|
6815
|
+
return;
|
|
6816
|
+
}
|
|
6817
|
+
const sortKey = (name) => name.replace(/^(cleared|rotated)-/, "");
|
|
6818
|
+
const archives = entries.map((name) => ({
|
|
6819
|
+
name,
|
|
6820
|
+
size: fs20.statSync(path9.join(ARCHIVE_DIR, name)).size
|
|
6821
|
+
})).sort((a, b) => sortKey(b.name).localeCompare(sortKey(a.name)));
|
|
6822
|
+
let kept = 0;
|
|
6823
|
+
let cut = archives.length;
|
|
6824
|
+
for (let i = 0; i < archives.length; i++) {
|
|
6825
|
+
if (i === 0 || kept + archives[i].size <= ARCHIVE_RETENTION_BYTES) {
|
|
6826
|
+
kept += archives[i].size;
|
|
6827
|
+
} else {
|
|
6828
|
+
cut = i;
|
|
6829
|
+
break;
|
|
6830
|
+
}
|
|
6831
|
+
}
|
|
6832
|
+
let removed = 0;
|
|
6833
|
+
let freed = 0;
|
|
6834
|
+
for (let i = cut; i < archives.length; i++) {
|
|
6835
|
+
try {
|
|
6836
|
+
fs20.unlinkSync(path9.join(ARCHIVE_DIR, archives[i].name));
|
|
6837
|
+
freed += archives[i].size;
|
|
6838
|
+
removed++;
|
|
6839
|
+
} catch {
|
|
6840
|
+
}
|
|
6841
|
+
}
|
|
6842
|
+
if (removed > 0) {
|
|
6843
|
+
log9.info("Session archives pruned", {
|
|
6844
|
+
removed,
|
|
6845
|
+
freedBytes: freed,
|
|
6846
|
+
keptBytes: kept
|
|
6847
|
+
});
|
|
6848
|
+
}
|
|
6849
|
+
} catch {
|
|
6850
|
+
}
|
|
6851
|
+
}
|
|
6809
6852
|
function rotate(state) {
|
|
6810
6853
|
const messages = state.messages;
|
|
6811
6854
|
if (messages.length === 0) {
|
|
@@ -6865,7 +6908,7 @@ function clearSession(state) {
|
|
|
6865
6908
|
});
|
|
6866
6909
|
}
|
|
6867
6910
|
}
|
|
6868
|
-
var log9, SESSION_FILE, ARCHIVE_DIR, ROTATE_THRESHOLD_BYTES, RETAIN_TAIL_BYTES;
|
|
6911
|
+
var log9, SESSION_FILE, ARCHIVE_DIR, ROTATE_THRESHOLD_BYTES, RETAIN_TAIL_BYTES, ARCHIVE_RETENTION_BYTES;
|
|
6869
6912
|
var init_session = __esm({
|
|
6870
6913
|
"src/session.ts"() {
|
|
6871
6914
|
"use strict";
|
|
@@ -6878,6 +6921,7 @@ var init_session = __esm({
|
|
|
6878
6921
|
ARCHIVE_DIR = ".logs/sessions";
|
|
6879
6922
|
ROTATE_THRESHOLD_BYTES = 32 * 1024 * 1024;
|
|
6880
6923
|
RETAIN_TAIL_BYTES = 16 * 1024 * 1024;
|
|
6924
|
+
ARCHIVE_RETENTION_BYTES = 64 * 1024 * 1024;
|
|
6881
6925
|
}
|
|
6882
6926
|
});
|
|
6883
6927
|
|