diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index fa96ae22..16cc0b95 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -1,10 +1,19 @@ import { Agent, ProviderTransport } from "@mariozechner/pi-agent"; import { getModel } from "@mariozechner/pi-ai"; import chalk from "chalk"; +import { readFileSync } from "fs"; +import { dirname, join } from "path"; +import { fileURLToPath } from "url"; import { SessionManager } from "./session-manager.js"; import { codingTools } from "./tools/index.js"; import { TuiRenderer } from "./tui-renderer.js"; +// Get version from package.json +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const packageJson = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8")); +const VERSION = packageJson.version; + interface Args { provider?: string; model?: string; @@ -105,8 +114,8 @@ Guidelines: Current directory: ${process.cwd()}`; -async function runInteractiveMode(agent: Agent, _sessionManager: SessionManager): Promise { - const renderer = new TuiRenderer(agent); +async function runInteractiveMode(agent: Agent, _sessionManager: SessionManager, version: string): Promise { + const renderer = new TuiRenderer(agent, version); // Initialize TUI await renderer.init(); @@ -238,7 +247,7 @@ export async function main(args: string[]) { const isInteractive = parsed.messages.length === 0; if (isInteractive) { - await runInteractiveMode(agent, sessionManager); + await runInteractiveMode(agent, sessionManager, VERSION); } else { await runSingleShotMode(agent, sessionManager, parsed.messages); } diff --git a/packages/coding-agent/src/tui-renderer.ts b/packages/coding-agent/src/tui-renderer.ts index f0aa20d2..993b2fe0 100644 --- a/packages/coding-agent/src/tui-renderer.ts +++ b/packages/coding-agent/src/tui-renderer.ts @@ -285,6 +285,7 @@ export class TuiRenderer { private editor: CustomEditor; private footer: FooterComponent; private agent: Agent; + private version: string; private isInitialized = false; private onInputCallback?: (text: string) => void; private loadingAnimation: Loader | null = null; @@ -300,8 +301,9 @@ export class TuiRenderer { // Track assistant message with tool calls that needs stats shown after tools complete private deferredStats: { usage: any; toolCallIds: Set } | null = null; - constructor(agent: Agent) { + constructor(agent: Agent, version: string) { this.agent = agent; + this.version = version; this.ui = new TUI(new ProcessTerminal()); this.chatContainer = new Container(); this.statusContainer = new Container(); @@ -333,7 +335,7 @@ export class TuiRenderer { if (this.isInitialized) return; // Add header with logo and instructions - const logo = chalk.cyan("==[ ") + chalk.bold.cyan("pi") + chalk.cyan(" ]=="); + const logo = chalk.bold.cyan("pi") + chalk.dim(` v${this.version}`); const instructions = chalk.dim( "esc" + chalk.gray(" to interrupt") +