feat: agent-hermes reads real token counts from session DB
CI / check (pull_request) Successful in 1m41s

- Add inputTokens/outputTokens to HermesSessionJson type
- Query input_tokens, output_tokens from sessions table in loadHermesSessionFromDb
- Update test fixture schema with token columns
- runPrompt now reports real token counts from Hermes state.db

Refs #76, #68
This commit is contained in:
2026-06-04 23:06:52 +00:00
parent 4283e6766b
commit d1c523c442
4 changed files with 15 additions and 5 deletions
@@ -140,7 +140,9 @@ function createTestDb(dbPath: string): TestDb {
db.exec(`CREATE TABLE sessions ( db.exec(`CREATE TABLE sessions (
id TEXT PRIMARY KEY, id TEXT PRIMARY KEY,
model TEXT NOT NULL, model TEXT NOT NULL,
started_at INTEGER NOT NULL started_at INTEGER NOT NULL,
input_tokens INTEGER DEFAULT 0,
output_tokens INTEGER DEFAULT 0
)`); )`);
db.exec(`CREATE TABLE messages ( db.exec(`CREATE TABLE messages (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
+2 -2
View File
@@ -127,8 +127,8 @@ export function createHermesAgent(resumeDisabled: boolean): () => Promise<void>
const usage: Usage = { const usage: Usage = {
turns, turns,
inputTokens: 0, inputTokens: session !== null ? session.inputTokens : 0,
outputTokens: 0, outputTokens: session !== null ? session.outputTokens : 0,
duration: Math.round(durationSec), duration: Math.round(durationSec),
}; };
+8 -2
View File
@@ -106,7 +106,7 @@ function parseSessionJson(raw: unknown): HermesSessionJson | null {
messages.push(msg); messages.push(msg);
} }
} }
return { session_id, model, session_start, messages }; return { session_id, model, session_start, messages, inputTokens: 0, outputTokens: 0 };
} }
export function getHermesDbPath(): string { export function getHermesDbPath(): string {
@@ -117,6 +117,8 @@ type DbSessionRow = {
id: string; id: string;
model: string; model: string;
started_at: number; started_at: number;
input_tokens: number;
output_tokens: number;
}; };
type DbMessageRow = { type DbMessageRow = {
@@ -156,7 +158,9 @@ export function loadHermesSessionFromDb(
try { try {
db = new DatabaseSync(resolvedPath, { readOnly: true }); db = new DatabaseSync(resolvedPath, { readOnly: true });
const session = db const session = db
.prepare("SELECT id, model, started_at FROM sessions WHERE id = ?") .prepare(
"SELECT id, model, started_at, input_tokens, output_tokens FROM sessions WHERE id = ?",
)
.get(sessionId) as DbSessionRow | null; .get(sessionId) as DbSessionRow | null;
if (session === null) { if (session === null) {
return null; return null;
@@ -181,6 +185,8 @@ export function loadHermesSessionFromDb(
model: session.model, model: session.model,
session_start: new Date(session.started_at * 1000).toISOString(), session_start: new Date(session.started_at * 1000).toISOString(),
messages, messages,
inputTokens: session.input_tokens ?? 0,
outputTokens: session.output_tokens ?? 0,
}; };
} catch { } catch {
return null; return null;
+2
View File
@@ -40,4 +40,6 @@ export type HermesSessionJson = {
model: string; model: string;
session_start: string; session_start: string;
messages: HermesSessionMessage[]; messages: HermesSessionMessage[];
inputTokens: number;
outputTokens: number;
}; };