From 1d3bb13274ede07c5ba0b19ae41c821f566b9d80 Mon Sep 17 00:00:00 2001 From: Stephen Hellicar Date: Thu, 19 Feb 2026 01:55:30 +1100 Subject: [PATCH] Add messageId display and ANSI reset for log lines --- src/UsageTracker.ts | 16 ++++++++++++++++ src/index.ts | 7 +++++++ src/terminal.ts | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/UsageTracker.ts b/src/UsageTracker.ts index 9f4b96f..ccb7d78 100644 --- a/src/UsageTracker.ts +++ b/src/UsageTracker.ts @@ -8,6 +8,10 @@ export interface ContextUsage { readonly percent: number; } +export interface LastAssistantInfo { + readonly uuid: string; +} + interface AuditUsage { readonly input_tokens: number; readonly cache_creation_input_tokens: number; @@ -49,6 +53,7 @@ export class UsageTracker { private lastAssistantUsage: AuditUsage | undefined; private lastContextWindow = 0; private cumulativeCost = 0; + private _lastAssistantUuid: string | undefined; /** Load context usage from the tail of the audit file (sync, fast, 256KB). */ public loadContextFromAudit(auditFile: string, sessionId: string): void { @@ -76,6 +81,9 @@ export class UsageTracker { if (message?.usage) { this.lastAssistantUsage = message.usage; } + if (!this._lastAssistantUuid && typeof entry.uuid === 'string') { + this._lastAssistantUuid = entry.uuid; + } } // Once we have both, no need to continue @@ -123,6 +131,7 @@ export class UsageTracker { if (msg.type !== 'assistant') { return; } + this._lastAssistantUuid = msg.uuid; const { id, usage } = msg.message; if (!usage || this.processedMessageIds.has(id)) { return; @@ -147,6 +156,13 @@ export class UsageTracker { return this.cumulativeCost; } + public get lastAssistant(): LastAssistantInfo | undefined { + if (!this._lastAssistantUuid) { + return undefined; + } + return { uuid: this._lastAssistantUuid }; + } + public get context(): ContextUsage | undefined { if (!this.lastAssistantUsage) { return undefined; diff --git a/src/index.ts b/src/index.ts index 9a6672d..ea76b92 100644 --- a/src/index.ts +++ b/src/index.ts @@ -131,6 +131,9 @@ async function submit(override?: string): Promise { } break; case 'assistant': { + const ctx = usage.context; + const pctSuffix = ctx ? ` (${ctx.percent.toFixed(1)}%)` : ''; + logEvent(`\x1b[2mmessageId: ${msg.uuid}${pctSuffix}\x1b[0m`); for (const block of msg.message.content) { if (block.type === 'text') { logEvent(`assistant: ${block.text}`); @@ -363,6 +366,10 @@ async function start(): Promise { session.setSessionId(savedSession); term.info(`Resuming session: ${savedSession}`); usage.loadContextFromAudit(paths.auditFile, savedSession); + const lastAssistant = usage.lastAssistant; + if (lastAssistant) { + term.info(`\x1b[2mlast messageId: ${lastAssistant.uuid}\x1b[0m`); + } const ctx = usage.context; if (ctx) { term.info(formatContext(ctx)); diff --git a/src/terminal.ts b/src/terminal.ts index b0ae932..ea2cd2c 100644 --- a/src/terminal.ts +++ b/src/terminal.ts @@ -10,7 +10,7 @@ export class Terminal { } public logLine(message: string, ...args: any[]): void { - process.stdout.write('['); + process.stdout.write('\x1b[0m['); process.stdout.write(this.timestamp()); process.stdout.write('] '); process.stdout.write(message);