@openeryc/pi-coding-agent 0.75.8 → 0.75.10

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.
@@ -2006,14 +2006,18 @@ export class InteractiveMode {
2006
2006
  }
2007
2007
  if (text === "/goal" || text.startsWith("/goal ")) {
2008
2008
  this.handleGoalCommand(text);
2009
- this.editor.setText("");
2010
- return;
2009
+ // Don't return — let the normal submit flow run so the agent starts working
2011
2010
  }
2012
2011
  if (text === "/session") {
2013
2012
  this.handleSessionCommand();
2014
2013
  this.editor.setText("");
2015
2014
  return;
2016
2015
  }
2016
+ if (text === "/usage") {
2017
+ this.editor.setText("");
2018
+ await this.handleUsageCommand();
2019
+ return;
2020
+ }
2017
2021
  if (text === "/memory") {
2018
2022
  this.handleMemoryCommand();
2019
2023
  this.editor.setText("");
@@ -4375,6 +4379,46 @@ export class InteractiveMode {
4375
4379
  this.chatContainer.addChild(new Text(info, 1, 0));
4376
4380
  this.ui.requestRender();
4377
4381
  }
4382
+ async handleUsageCommand() {
4383
+ this.showStatus("Loading usage stats...");
4384
+ this.ui.requestRender();
4385
+ const stats = await this.session.getUsageStats();
4386
+ if (stats.sessions === 0) {
4387
+ this.chatContainer.addChild(new Spacer(1));
4388
+ this.chatContainer.addChild(new Text(theme.fg("dim", "No session data found."), 1, 0));
4389
+ this.ui.requestRender();
4390
+ return;
4391
+ }
4392
+ let info = `${theme.bold("Usage Across All Sessions")}\n\n`;
4393
+ info += `${theme.fg("dim", "Sessions:")} ${stats.sessions}\n`;
4394
+ info += `${theme.fg("dim", "Input:")} ${stats.input.toLocaleString()}\n`;
4395
+ info += `${theme.fg("dim", "Output:")} ${stats.output.toLocaleString()}\n`;
4396
+ if (stats.cacheRead > 0) {
4397
+ info += `${theme.fg("dim", "Cache Read:")} ${stats.cacheRead.toLocaleString()}\n`;
4398
+ }
4399
+ if (stats.cacheWrite > 0) {
4400
+ info += `${theme.fg("dim", "Cache Write:")} ${stats.cacheWrite.toLocaleString()}\n`;
4401
+ }
4402
+ const totalTokens = stats.input + stats.output + stats.cacheRead + stats.cacheWrite;
4403
+ info += `${theme.fg("dim", "Total Tokens:")} ${totalTokens.toLocaleString()}\n`;
4404
+ if (stats.cost > 0) {
4405
+ info += `${theme.fg("dim", "Cost:")} $${stats.cost.toFixed(4)}\n`;
4406
+ }
4407
+ // Show top sessions by cost
4408
+ const topN = Math.min(stats.bySession.length, 5);
4409
+ info += `\n${theme.bold(`Top ${topN} Sessions`)}\n`;
4410
+ for (let i = 0; i < topN; i++) {
4411
+ const s = stats.bySession[i];
4412
+ if (!s || s.cost <= 0)
4413
+ continue;
4414
+ const label = s.name ?? s.cwd ?? s.id.slice(0, 8);
4415
+ const shortLabel = label.length > 30 ? `${label.slice(0, 28)}...` : label;
4416
+ info += `${theme.fg("dim", `${shortLabel}:`)} $${s.cost.toFixed(4)}\n`;
4417
+ }
4418
+ this.chatContainer.addChild(new Spacer(1));
4419
+ this.chatContainer.addChild(new Text(info, 1, 0));
4420
+ this.ui.requestRender();
4421
+ }
4378
4422
  handleMemoryCommand() {
4379
4423
  const memory = this.session.resourceLoader.getMemory();
4380
4424
  const memoryPath = path.join(this.sessionManager.getCwd(), ".pi", "memory", "MEMORY.md");