mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-17 05:00:16 +00:00
feat: add /session command to show session info and stats
- Shows session file path and ID - Displays message counts (user, assistant, total) - Shows token usage (input, output, cache read/write, total) - Displays total cost if available - Reuses same calculation logic as footer component
This commit is contained in:
parent
2509add9bf
commit
5ba2109da8
1 changed files with 73 additions and 1 deletions
|
|
@ -83,9 +83,14 @@ export class TuiRenderer {
|
||||||
description: "Export session to HTML file",
|
description: "Export session to HTML file",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const sessionCommand: SlashCommand = {
|
||||||
|
name: "session",
|
||||||
|
description: "Show session info and stats",
|
||||||
|
};
|
||||||
|
|
||||||
// Setup autocomplete for file paths and slash commands
|
// Setup autocomplete for file paths and slash commands
|
||||||
const autocompleteProvider = new CombinedAutocompleteProvider(
|
const autocompleteProvider = new CombinedAutocompleteProvider(
|
||||||
[thinkingCommand, modelCommand, exportCommand],
|
[thinkingCommand, modelCommand, exportCommand, sessionCommand],
|
||||||
process.cwd(),
|
process.cwd(),
|
||||||
);
|
);
|
||||||
this.editor.setAutocompleteProvider(autocompleteProvider);
|
this.editor.setAutocompleteProvider(autocompleteProvider);
|
||||||
|
|
@ -167,6 +172,13 @@ export class TuiRenderer {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for /session command
|
||||||
|
if (text === "/session") {
|
||||||
|
this.handleSessionCommand();
|
||||||
|
this.editor.setText("");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.onInputCallback) {
|
if (this.onInputCallback) {
|
||||||
this.onInputCallback(text);
|
this.onInputCallback(text);
|
||||||
}
|
}
|
||||||
|
|
@ -546,6 +558,66 @@ export class TuiRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private handleSessionCommand(): void {
|
||||||
|
// Get session info
|
||||||
|
const sessionFile = this.sessionManager.getSessionFile();
|
||||||
|
const state = this.agent.state;
|
||||||
|
|
||||||
|
// Count messages
|
||||||
|
const userMessages = state.messages.filter((m) => m.role === "user").length;
|
||||||
|
const assistantMessages = state.messages.filter((m) => m.role === "assistant").length;
|
||||||
|
const totalMessages = state.messages.length;
|
||||||
|
|
||||||
|
// Calculate cumulative usage from all assistant messages (same as footer)
|
||||||
|
let totalInput = 0;
|
||||||
|
let totalOutput = 0;
|
||||||
|
let totalCacheRead = 0;
|
||||||
|
let totalCacheWrite = 0;
|
||||||
|
let totalCost = 0;
|
||||||
|
|
||||||
|
for (const message of state.messages) {
|
||||||
|
if (message.role === "assistant") {
|
||||||
|
const assistantMsg = message as AssistantMessage;
|
||||||
|
totalInput += assistantMsg.usage.input;
|
||||||
|
totalOutput += assistantMsg.usage.output;
|
||||||
|
totalCacheRead += assistantMsg.usage.cacheRead;
|
||||||
|
totalCacheWrite += assistantMsg.usage.cacheWrite;
|
||||||
|
totalCost += assistantMsg.usage.cost.total;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalTokens = totalInput + totalOutput + totalCacheRead + totalCacheWrite;
|
||||||
|
|
||||||
|
// Build info text
|
||||||
|
let info = `${chalk.bold("Session Info")}\n\n`;
|
||||||
|
info += `${chalk.dim("File:")} ${sessionFile}\n`;
|
||||||
|
info += `${chalk.dim("ID:")} ${this.sessionManager.getSessionId()}\n\n`;
|
||||||
|
info += `${chalk.bold("Messages")}\n`;
|
||||||
|
info += `${chalk.dim("User:")} ${userMessages}\n`;
|
||||||
|
info += `${chalk.dim("Assistant:")} ${assistantMessages}\n`;
|
||||||
|
info += `${chalk.dim("Total:")} ${totalMessages}\n\n`;
|
||||||
|
info += `${chalk.bold("Tokens")}\n`;
|
||||||
|
info += `${chalk.dim("Input:")} ${totalInput.toLocaleString()}\n`;
|
||||||
|
info += `${chalk.dim("Output:")} ${totalOutput.toLocaleString()}\n`;
|
||||||
|
if (totalCacheRead > 0) {
|
||||||
|
info += `${chalk.dim("Cache Read:")} ${totalCacheRead.toLocaleString()}\n`;
|
||||||
|
}
|
||||||
|
if (totalCacheWrite > 0) {
|
||||||
|
info += `${chalk.dim("Cache Write:")} ${totalCacheWrite.toLocaleString()}\n`;
|
||||||
|
}
|
||||||
|
info += `${chalk.dim("Total:")} ${totalTokens.toLocaleString()}\n`;
|
||||||
|
|
||||||
|
if (totalCost > 0) {
|
||||||
|
info += `\n${chalk.bold("Cost")}\n`;
|
||||||
|
info += `${chalk.dim("Total:")} ${totalCost.toFixed(4)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show info in chat
|
||||||
|
this.chatContainer.addChild(new Spacer(1));
|
||||||
|
this.chatContainer.addChild(new Text(info, 1, 0));
|
||||||
|
this.ui.requestRender();
|
||||||
|
}
|
||||||
|
|
||||||
stop(): void {
|
stop(): void {
|
||||||
if (this.loadingAnimation) {
|
if (this.loadingAnimation) {
|
||||||
this.loadingAnimation.stop();
|
this.loadingAnimation.stop();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue