agentcrumbs
Version:
Debug mode for any agent.
101 lines • 3.83 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sessions = sessions;
const node_fs_1 = __importDefault(require("node:fs"));
const app_store_js_1 = require("../app-store.js");
const SESSION_FILE = "/tmp/agentcrumbs.session";
async function sessions(args) {
const appCtx = (0, app_store_js_1.parseAppFlags)(args);
const allCrumbs = (0, app_store_js_1.readAllCrumbs)(appCtx);
// Find all sessions from crumbs
const sessionMap = new Map();
for (const crumb of allCrumbs) {
if (!crumb.sid)
continue;
const existing = sessionMap.get(crumb.sid);
if (!existing) {
sessionMap.set(crumb.sid, {
name: crumb.type === "session:start" ? crumb.msg : "unknown",
app: crumb.app,
startedAt: crumb.ts,
endedAt: crumb.type === "session:end" ? crumb.ts : undefined,
count: 1,
});
}
else {
existing.count++;
if (crumb.type === "session:start")
existing.name = crumb.msg;
if (crumb.type === "session:end")
existing.endedAt = crumb.ts;
// Update earliest/latest timestamps
if (crumb.ts < existing.startedAt)
existing.startedAt = crumb.ts;
if (!existing.endedAt || crumb.ts > existing.endedAt) {
if (crumb.type !== "session:end") {
// don't update endedAt for non-end crumbs
}
else {
existing.endedAt = crumb.ts;
}
}
}
}
// Check for active CLI session
let activeSessionId;
try {
const content = node_fs_1.default.readFileSync(SESSION_FILE, "utf-8").trim();
if (content) {
try {
const parsed = JSON.parse(content);
activeSessionId = parsed.id;
}
catch {
activeSessionId = content;
}
}
}
catch {
// no active session
}
if (sessionMap.size === 0) {
process.stderr.write("No sessions found.\n");
return;
}
const showApp = appCtx.allApps;
// Print header
if (showApp) {
process.stdout.write(`${"ID".padEnd(10)} ${"App".padEnd(20)} ${"Name".padEnd(25)} ${"Duration".padEnd(12)} ${"Crumbs".padEnd(8)} Status\n`);
process.stdout.write("-".repeat(90) + "\n");
}
else {
process.stdout.write(`${"ID".padEnd(10)} ${"Name".padEnd(25)} ${"Duration".padEnd(12)} ${"Crumbs".padEnd(8)} Status\n`);
process.stdout.write("-".repeat(70) + "\n");
}
for (const [id, info] of sessionMap) {
const isActive = id === activeSessionId;
const duration = info.endedAt
? formatDuration(new Date(info.endedAt).getTime() - new Date(info.startedAt).getTime())
: isActive
? "-"
: "?";
const status = isActive ? "active" : info.endedAt ? "stopped" : "?";
if (showApp) {
process.stdout.write(`${id.padEnd(10)} ${(info.app ?? "unknown").padEnd(20)} ${info.name.padEnd(25)} ${duration.padEnd(12)} ${String(info.count).padEnd(8)} ${status}\n`);
}
else {
process.stdout.write(`${id.padEnd(10)} ${info.name.padEnd(25)} ${duration.padEnd(12)} ${String(info.count).padEnd(8)} ${status}\n`);
}
}
}
function formatDuration(ms) {
if (ms < 1000)
return `${ms}ms`;
if (ms < 60000)
return `${(ms / 1000).toFixed(1)}s`;
return `${(ms / 60000).toFixed(1)}m`;
}
//# sourceMappingURL=sessions.js.map