diff --git a/package-lock.json b/package-lock.json index ae46e507..88ebbbfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3195,11 +3195,11 @@ }, "packages/agent": { "name": "@mariozechner/pi-agent", - "version": "0.7.25", + "version": "0.7.26", "license": "MIT", "dependencies": { - "@mariozechner/pi-ai": "^0.7.24", - "@mariozechner/pi-tui": "^0.7.24" + "@mariozechner/pi-ai": "^0.7.25", + "@mariozechner/pi-tui": "^0.7.25" }, "devDependencies": { "@types/node": "^24.3.0", @@ -3225,7 +3225,7 @@ }, "packages/ai": { "name": "@mariozechner/pi-ai", - "version": "0.7.25", + "version": "0.7.26", "license": "MIT", "dependencies": { "@anthropic-ai/sdk": "^0.61.0", @@ -3272,11 +3272,11 @@ }, "packages/coding-agent": { "name": "@mariozechner/pi-coding-agent", - "version": "0.7.25", + "version": "0.7.26", "license": "MIT", "dependencies": { - "@mariozechner/pi-agent": "^0.7.24", - "@mariozechner/pi-ai": "^0.7.24", + "@mariozechner/pi-agent": "^0.7.25", + "@mariozechner/pi-ai": "^0.7.25", "chalk": "^5.5.0", "diff": "^8.0.2", "glob": "^11.0.3" @@ -3319,10 +3319,10 @@ }, "packages/pods": { "name": "@mariozechner/pi", - "version": "0.7.25", + "version": "0.7.26", "license": "MIT", "dependencies": { - "@mariozechner/pi-agent": "^0.7.24", + "@mariozechner/pi-agent": "^0.7.25", "chalk": "^5.5.0" }, "bin": { @@ -3345,7 +3345,7 @@ }, "packages/proxy": { "name": "@mariozechner/pi-proxy", - "version": "0.7.25", + "version": "0.7.26", "dependencies": { "@hono/node-server": "^1.14.0", "hono": "^4.6.16" @@ -3361,7 +3361,7 @@ }, "packages/tui": { "name": "@mariozechner/pi-tui", - "version": "0.7.25", + "version": "0.7.26", "license": "MIT", "dependencies": { "@types/mime-types": "^2.1.4", @@ -3400,12 +3400,12 @@ }, "packages/web-ui": { "name": "@mariozechner/pi-web-ui", - "version": "0.7.25", + "version": "0.7.26", "license": "MIT", "dependencies": { "@lmstudio/sdk": "^1.5.0", - "@mariozechner/pi-ai": "^0.7.24", - "@mariozechner/pi-tui": "^0.7.24", + "@mariozechner/pi-ai": "^0.7.25", + "@mariozechner/pi-tui": "^0.7.25", "docx-preview": "^0.3.7", "jszip": "^3.10.1", "lucide": "^0.544.0", diff --git a/packages/agent/package.json b/packages/agent/package.json index e9bdd79f..986d4a6c 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-agent", - "version": "0.7.25", + "version": "0.7.26", "description": "General-purpose agent with transport abstraction, state management, and attachment support", "type": "module", "main": "./dist/index.js", @@ -18,8 +18,8 @@ "prepublishOnly": "npm run clean && npm run build" }, "dependencies": { - "@mariozechner/pi-ai": "^0.7.25", - "@mariozechner/pi-tui": "^0.7.25" + "@mariozechner/pi-ai": "^0.7.26", + "@mariozechner/pi-tui": "^0.7.26" }, "keywords": [ "ai", diff --git a/packages/ai/package.json b/packages/ai/package.json index 949987bb..43d5e2fd 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-ai", - "version": "0.7.25", + "version": "0.7.26", "description": "Unified LLM API with automatic model discovery and provider configuration", "type": "module", "main": "./dist/index.js", diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 9e810109..88edd444 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,14 +2,18 @@ ## [Unreleased] +## [0.7.26] - 2025-11-20 + ### Added +- **Tool Output Expansion**: Press `Ctrl+O` to toggle between collapsed and expanded tool output display. Expands all tool call outputs (bash, read, write, etc.) to show full content instead of truncated previews. ([#31](https://github.com/badlogic/pi-mono/issues/31)) - **Custom Headers**: Added support for custom HTTP headers in `models.json` configuration. Headers can be specified at both provider and model level, with model-level headers overriding provider-level ones. This enables bypassing Cloudflare bot detection and other proxy requirements. ([#39](https://github.com/badlogic/pi-mono/issues/39)) ### Fixed - **Chutes AI Provider**: Fixed 400 errors when using Chutes AI provider. Added compatibility fixes for `store` field exclusion, `max_tokens` parameter usage, and system prompt role handling. ([#42](https://github.com/badlogic/pi-mono/pull/42) by [@butelo](https://github.com/butelo)) - **Mistral/Chutes Syntax Error**: Fixed syntax error in merged PR that used `iif` instead of `if`. +- **Anthropic OAuth Bug**: Fixed bug where `process.env.ANTHROPIC_API_KEY = undefined` set the env var to string "undefined" instead of deleting it. Now uses `delete` operator. ## [0.7.25] - 2025-11-20 diff --git a/packages/coding-agent/README.md b/packages/coding-agent/README.md index fa826998..890ea43e 100644 --- a/packages/coding-agent/README.md +++ b/packages/coding-agent/README.md @@ -396,6 +396,7 @@ Paste multiple lines of text (e.g., code snippets, logs) and they'll be automati - **Tab**: Path completion - **Shift+Tab**: Cycle thinking level (for reasoning-capable models) - **Ctrl+P**: Cycle models (use `--models` to scope) +- **Ctrl+O**: Toggle tool output expansion (collapsed ↔ full output) - **Enter**: Send message - **Shift+Enter**: Insert new line (multi-line input) - **Backspace**: Delete character backwards diff --git a/packages/coding-agent/package.json b/packages/coding-agent/package.json index 63940974..b0b7aa63 100644 --- a/packages/coding-agent/package.json +++ b/packages/coding-agent/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-coding-agent", - "version": "0.7.25", + "version": "0.7.26", "description": "Coding agent CLI with read, bash, edit, write tools and session management", "type": "module", "bin": { @@ -21,8 +21,8 @@ "prepublishOnly": "npm run clean && npm run build" }, "dependencies": { - "@mariozechner/pi-agent": "^0.7.25", - "@mariozechner/pi-ai": "^0.7.25", + "@mariozechner/pi-agent": "^0.7.26", + "@mariozechner/pi-ai": "^0.7.26", "chalk": "^5.5.0", "diff": "^8.0.2", "glob": "^11.0.3" diff --git a/packages/coding-agent/src/tui/custom-editor.ts b/packages/coding-agent/src/tui/custom-editor.ts index 1b1e84cd..49e41703 100644 --- a/packages/coding-agent/src/tui/custom-editor.ts +++ b/packages/coding-agent/src/tui/custom-editor.ts @@ -8,8 +8,15 @@ export class CustomEditor extends Editor { public onCtrlC?: () => void; public onShiftTab?: () => void; public onCtrlP?: () => void; + public onCtrlO?: () => void; handleInput(data: string): void { + // Intercept Ctrl+O for tool output expansion + if (data === "\x0f" && this.onCtrlO) { + this.onCtrlO(); + return; + } + // Intercept Ctrl+P for model cycling if (data === "\x10" && this.onCtrlP) { this.onCtrlP(); diff --git a/packages/coding-agent/src/tui/tool-execution.ts b/packages/coding-agent/src/tui/tool-execution.ts index c2248b7b..7c224baa 100644 --- a/packages/coding-agent/src/tui/tool-execution.ts +++ b/packages/coding-agent/src/tui/tool-execution.ts @@ -127,6 +127,7 @@ export class ToolExecutionComponent extends Container { private contentText: Text; private toolName: string; private args: any; + private expanded = false; private result?: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }>; isError: boolean; @@ -158,6 +159,11 @@ export class ToolExecutionComponent extends Container { this.updateDisplay(); } + setExpanded(expanded: boolean): void { + this.expanded = expanded; + this.updateDisplay(); + } + private updateDisplay(): void { const bgColor = this.result ? this.result.isError @@ -201,7 +207,7 @@ export class ToolExecutionComponent extends Container { const output = this.getTextOutput().trim(); if (output) { const lines = output.split("\n"); - const maxLines = 5; + const maxLines = this.expanded ? lines.length : 5; const displayLines = lines.slice(0, maxLines); const remaining = lines.length - maxLines; @@ -218,7 +224,7 @@ export class ToolExecutionComponent extends Container { if (this.result) { const output = this.getTextOutput(); const lines = output.split("\n"); - const maxLines = 10; + const maxLines = this.expanded ? lines.length : 10; const displayLines = lines.slice(0, maxLines); const remaining = lines.length - maxLines; @@ -240,7 +246,7 @@ export class ToolExecutionComponent extends Container { // Show first 10 lines of content if available if (fileContent) { - const maxLines = 10; + const maxLines = this.expanded ? lines.length : 10; const displayLines = lines.slice(0, maxLines); const remaining = lines.length - maxLines; diff --git a/packages/coding-agent/src/tui/tui-renderer.ts b/packages/coding-agent/src/tui/tui-renderer.ts index e2e1b8df..c160d978 100644 --- a/packages/coding-agent/src/tui/tui-renderer.ts +++ b/packages/coding-agent/src/tui/tui-renderer.ts @@ -77,6 +77,9 @@ export class TuiRenderer { // Model scope for quick cycling private scopedModels: Model[] = []; + // Tool output expansion state + private toolOutputExpanded = false; + constructor( agent: Agent, sessionManager: SessionManager, @@ -183,6 +186,9 @@ export class TuiRenderer { chalk.dim("ctrl+p") + chalk.gray(" to cycle models") + "\n" + + chalk.dim("ctrl+o") + + chalk.gray(" to expand tools") + + "\n" + chalk.dim("/") + chalk.gray(" for commands") + "\n" + @@ -248,6 +254,10 @@ export class TuiRenderer { this.cycleModel(); }; + this.editor.onCtrlO = () => { + this.toggleToolOutputExpansion(); + }; + // Handle editor submission this.editor.onSubmit = async (text: string) => { text = text.trim(); @@ -723,6 +733,19 @@ export class TuiRenderer { this.ui.requestRender(); } + private toggleToolOutputExpansion(): void { + this.toolOutputExpanded = !this.toolOutputExpanded; + + // Update all tool execution components + for (const child of this.chatContainer.children) { + if (child instanceof ToolExecutionComponent) { + child.setExpanded(this.toolOutputExpanded); + } + } + + this.ui.requestRender(); + } + clearEditor(): void { this.editor.setText(""); this.ui.requestRender(); diff --git a/packages/pods/package.json b/packages/pods/package.json index dfcabb76..116cb5fa 100644 --- a/packages/pods/package.json +++ b/packages/pods/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi", - "version": "0.7.25", + "version": "0.7.26", "description": "CLI tool for managing vLLM deployments on GPU pods", "type": "module", "bin": { @@ -34,7 +34,7 @@ "node": ">=20.0.0" }, "dependencies": { - "@mariozechner/pi-agent": "^0.7.25", + "@mariozechner/pi-agent": "^0.7.26", "chalk": "^5.5.0" }, "devDependencies": {} diff --git a/packages/proxy/package.json b/packages/proxy/package.json index fe196657..6caa40a5 100644 --- a/packages/proxy/package.json +++ b/packages/proxy/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-proxy", - "version": "0.7.25", + "version": "0.7.26", "type": "module", "description": "CORS and authentication proxy for pi-ai", "main": "dist/index.js", diff --git a/packages/tui/package.json b/packages/tui/package.json index 9e12a326..15e5a544 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-tui", - "version": "0.7.25", + "version": "0.7.26", "description": "Terminal User Interface library with differential rendering for efficient text-based applications", "type": "module", "main": "dist/index.js", diff --git a/packages/web-ui/package.json b/packages/web-ui/package.json index 4db4e6f1..862c195a 100644 --- a/packages/web-ui/package.json +++ b/packages/web-ui/package.json @@ -1,6 +1,6 @@ { "name": "@mariozechner/pi-web-ui", - "version": "0.7.25", + "version": "0.7.26", "description": "Reusable web UI components for AI chat interfaces powered by @mariozechner/pi-ai", "type": "module", "main": "dist/index.js", @@ -18,8 +18,8 @@ }, "dependencies": { "@lmstudio/sdk": "^1.5.0", - "@mariozechner/pi-ai": "^0.7.25", - "@mariozechner/pi-tui": "^0.7.25", + "@mariozechner/pi-ai": "^0.7.26", + "@mariozechner/pi-tui": "^0.7.26", "docx-preview": "^0.3.7", "jszip": "^3.10.1", "lucide": "^0.544.0",